// ==UserScript== // @name Gplex Extended - Fixed and extended version of the legendary Gplex Old Google script // @namespace http://tampermonkey.net/ // @version 6.5.7 // @description 1997-2024 Old Google Frontend, now with Gmail, Google Maps, Google Calendar, Google News, Google Translate, Google Docs, Google Sheets, Google Slides, Google Forms, Google Drive, Google Photos and Google Keep // @author Ziptino9098, lightbeam24 // @match *://www.google.com/search* // @match *://www.google.com/ // @match *://www.google.com/?* // @match *://www.google.com/#* // @match *://www.google.com/webhp* // @match *://www.google.com/imghp* // @match *://www.google.com/videohp* // @match *://www.google.com/shopping* // @match *://www.google.com/advanced_search* // @match *://www.google.com/preferences* // @match *://mail.google.com/mail/* // @match *://www.google.com/maps* // @match *://maps.google.com/* // @match *://calendar.google.com/calendar/* // @match *://news.google.com/* // @match *://translate.google.com/* // @match *://docs.google.com/document/* // @match *://docs.google.com/spreadsheets/* // @match *://docs.google.com/presentation/* // @match *://docs.google.com/forms/* // @match *://docs.google.com/drawings/* // @match *://drive.google.com/* // @match *://photos.google.com/* // @match *://accounts.google.com/v3/signin/* // @match *://accounts.google.com/signin/* // @match *://accounts.google.com/ServiceLogin* // @match *://accounts.google.com/AccountChooser* // @match *://accounts.google.com/InteractiveLogin* // @match *://accounts.google.com/lifecycle/steps/signup/* // @match *://accounts.google.com/signup* // @match *://accounts.google.com/SignUp* // @match *://myaccount.google.com/* // @match *://keep.google.com/* // @match *://www.google.com/gplex // @match *://*.google.com/* // @match *://www.google.com/Gplex // @exclude *://*/*!!!* // @exclude *://www.google.com/advanced // @exclude *://www.google.com/sorry // @exclude *://www.google.com/sorry/* // @exclude *://www.google.com/recaptcha/* // @exclude *://ogs.google.com/* // @exclude *://apis.google.com/* // @exclude *://clients*.google.com/* // @exclude *://notifications.google.com/* // @exclude *://contacts.google.com/widget/* // @exclude *://accounts.google.com/RotateCookiesPage* // @exclude *://accounts.google.com/o/oauth2/* // @exclude *://accounts.google.com/gsi/* // @exclude *://accounts.google.com/_/* // @exclude *://play.google.com/log* // @exclude *://www.google.com/recaptcha // @exclude *://www.google.com/finance // @exclude *://*/*&gplex=false // @exclude *://*/*?gplex=false // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_registerMenuCommand // @grant unsafeWindow // @grant GM_xmlhttpRequest // @connect clients5.google.com // @connect translate.googleapis.com // @connect drive.google.com // @connect drive.usercontent.google.com // @require https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.min.js // @license MIT // @run-at document-start // @downloadURL https://raw.githubusercontent.com/Ziptino9098/Gplex-Fixed/main/main.user.js // @updateURL https://raw.githubusercontent.com/Ziptino9098/Gplex-Fixed/main/main.user.js // ==/UserScript== // ---- Gplex Trusted Types ---- // (6.2.1) Pages that require Trusted Types (Chrome enforces them on Gmail, Drive, Docs, Calendar, // Keep, Photos, News, Translate and the account pages) refuse HTML handed over as plain text. // Everything Gplex writes as HTML goes through ugfTT: TrustedHTML where the browser has Trusted // Types, the text unchanged where it doesn't. const ugfTTPolicy = (function() { try { if (typeof window !== "undefined" && window.trustedTypes && window.trustedTypes.createPolicy) { return window.trustedTypes.createPolicy("gplex-tt", { createHTML: function(s) { return s; } }); } } catch (e) {} return null; })(); function ugfTT(s) { if (!ugfTTPolicy) { return s; } try { if (window.trustedTypes.isHTML && window.trustedTypes.isHTML(s)) { return s; } return ugfTTPolicy.createHTML(s === null || s === undefined ? "" : String(s)); } catch (e) { return s; } } // ---- end Gplex Trusted Types ---- // (6.5.5) Signing out forgets the account Gplex kept for pages that don't show one (function() { try { document.addEventListener("click", function(ev) { const a = ev.target && ev.target.closest ? ev.target.closest('a[href*="accounts.google.com/Logout"], a[href*="/accounts/Logout"]') : null; if (a && typeof GM_deleteValue === "function") { ["UGF_USERNAME", "UGF_EMAIL", "UGF_PFP"].forEach(function(k) { try { GM_deleteValue(k); } catch (e) {} }); } }, true); } catch (e) {} })(); // ---- (5.2.5) The very first thing, before the page is drawn ------------------------ // Gplex starts at document-start so that, on the Docs/Sheets/Slides editors, the page // can be veiled (white, with the Gmail spinner) before any of Google's present-day // layout is painted. Everything else waits, as before, until the page's exists. (function ugfEarlyVeil() { try { if (window.location.host !== "docs.google.com" || window.top !== window.self) { return; } const p = window.location.pathname || ""; const m = p.match(/^\/(document|spreadsheets|presentation|drawings)(\/u\/\d+)?\/(d\/[\w-]{20,}|create\b)/); if (!m || /\/(pub|pubhtml|preview|mobilebasic|htmlview|htmlembed|htmlpresent|export|copy|template|gviz|embed|present)\b/.test(p)) { return; } const key = { document: "UGF_DOCS_ON", spreadsheets: "UGF_SHEETS_ON", presentation: "UGF_SLIDES_ON", drawings: "UGF_DRAWINGS_ON" }[m[1]]; if (String((typeof GM_getValue === "function" ? GM_getValue(key, null) : null) || "true") === "false") { return; } const st = document.createElement("style"); st.id = "ugf-early-veil"; // (a white sheet over the page, not the page hidden: the editor must be able to take // the keyboard while it starts, or Slides never gets it back) st.textContent = "html { background: #fff !important; } html::before { content: ''; position: fixed; inset: 0; background: #fff; z-index: 2147483645; pointer-events: auto; }" + " html::after { content: ''; position: fixed; left: 50%; top: 50%; width: 28px; height: 28px; margin: -17px 0 0 -17px; border: 3px solid #e8eaed;" + " border-top-color: #9aa0a6; border-radius: 50%; animation: ugfEarlySpin .8s linear infinite; z-index: 2147483647; box-sizing: content-box; }" + " html:has(#ugf-docs-loading)::after { display: none; } @keyframes ugfEarlySpin { to { transform: rotate(360deg); } }"; const put = function() { const at = document.head || document.documentElement; if (!at) { return false; } at.appendChild(st); return true; }; if (!put()) { // nothing of the page exists yet: put it in the moment there is somewhere to const wait = new MutationObserver(function() { if (put()) { wait.disconnect(); } }); wait.observe(document, { childList: true, subtree: true }); } // never left up by mistake setTimeout(function() { const s = document.getElementById("ugf-early-veil"); if (s) { s.remove(); } }, 10000); } catch (e) {} })(); // (5.5) Drive: Google's own Drive is kept out of sight from the start, until Gplex's is up (function ugfDriveEarlyVeil() { try { if ((window.location.host !== "drive.google.com" && window.location.host !== "photos.google.com") || window.top !== window.self) { return; } if (window.location.host === "photos.google.com") { const pp = (window.location.pathname || "/").replace(/^\/u\/\d+/, "") || "/"; if (!/^\/($|photos\/?$|albums\/?$|album\/|photo\/|search\/|archive\/?$|trash(\/[\w-]+)?\/?$|sharing\/?$)/.test(pp) || String((typeof GM_getValue === "function" ? GM_getValue("UGF_PHOTOS_ON", null) : null) || "true") === "false") { return; } } const p = window.location.host === "photos.google.com" ? "/drive/home" : (window.location.pathname || "/").replace(/^\/drive\/u\/\d+/, "/drive"); if (!/^\/($|drive\/?$|drive\/(my-drive|home|folders\/[\w-]+|shared-with-me|recent|starred|trash|search|computers|shared-drives|spam|quota)\/?$|file(\/u\/\d+)?\/d\/[\w-]+\/(view|edit))/.test(p)) { return; } if (window.location.host === "drive.google.com" && String((typeof GM_getValue === "function" ? GM_getValue("UGF_DRIVE_ON", null) : null) || "true") === "false") { return; } const st = document.createElement("style"); st.id = "ugf-dv-veil"; st.textContent = "html { background: #fff !important; } body > *:not(#ugf-drive):not(#ugf-photos) { visibility: hidden !important; }"; const put = function() { const at = document.head || document.documentElement; if (!at) { return false; } at.appendChild(st); return true; }; if (!put()) { const wait = new MutationObserver(function() { if (put()) { wait.disconnect(); } }); wait.observe(document, { childList: true, subtree: true }); } setTimeout(function() { st.remove(); }, 10000); } catch (e) {} })(); // ---- Gplex error page ---- // (6.1.2) Google's error page ("404. That's an error.", with the broken robot) on any // Google host, in the period's look: the robot page with the logo of the day from 2010 // on, and the blue "Error" bar page Google served before it. Only the look changes. let ugfErrSeen = false; function ugfIsErrorPage() { // (6.2) Gplex's own settings page lives on a Google 404 (www.google.com/gplex): never an error page if (window.location.host === "www.google.com" && /^\/gplex\/?$/i.test(window.location.pathname || "")) { return false; } // Google's error pages all carry the same title: "Error 404 (Not Found)!!1" (and once // seen it stays seen: the pre-2010 look retitles the page "404 Not Found") if (!ugfErrSeen && /^Error \d{3} \([^)]*\)!!1$/.test(document.title || "")) { ugfErrSeen = true; } return ugfErrSeen; } (function ugfErrorPage() { try { if (!/(^|\.)google\.com$/.test(window.location.host || "") || /[?&]gplex=false\b/.test(window.location.search || "")) { return; } const A = {"logo10": "data:image/png;base64,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", "logo13": "data:image/gif;base64,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", "fav1999": "data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "fav2009": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbUFHBwcFQAAABoAAAAaAAAAFgAAAA8AAAAWBAAAGwIAABoAAAAXAAAAGQAAABkAAAAaAAAAGg0NDRiOjo4JJiYmDwAAABQAAAATAAAADQwCAR1YFRB4nCsqua0yLMSbLCyxYxoYfBgFAiwDAQAUAAAAEgAAABMAAAAUBwcHEhQUFA0AAAAOAAAACxMEARayLy/F7T9C/640K7FuJR1pZiMgYpczMZqeLSzBIAcFPQEBABAAAAANAAAADgAAAA4XFxcJAAAACgAAAABbKSNY/1ZO/3MdHY8AAAAAAAAAAAAAAAAAAAAAjzc2lHwdG7oDAAAVAAAACAAAAAoAAAAKFxcXBgAAAAcAAAAAVj43Tfx6df87BQFmAQIAAgAAAAQAAAAEAAAAAI0vJomvLCftCwEAHQAAAAQAAAAHAAAABxEREQQAAAAEAAAAAwYEAAi4bVm0uT8/4UwOC1wnBgMlFAQAEF4YGmnwQ0X8niQfxQEAAAgAAAADAAAABAAAAAQzMzMCHh4eAh8fHwMAAAAAKSglBJVbWGfQX16qxktJsLItKNTqP0X/5DxE8VklJTsAAAAAHx8fAh8fHwIfHx8C7+/vBO3t7QTt7e0E7e3tBOrr6wIAAAAAAAAAALWHgkH+VFD/xjI226J1dDYAAAAA7e7uBO3t7QTt7e0E7e3tBP///wn///8K////Cv///wv///8Eybi3HHw1LHeySkjC/nd2/34iIZ1rbGkJ8fHxCv///wr///8K////Cv///wr///8R////E////xP///8P9OTiHtFGSNHPKS//15KSeP7k4Evgb3DOXh4cjouJiCD9/f4R////E////xP///8T////Gf///xv///8b////Dvu3rnbrNCn/o1NTk9/r6wn///8C/9fXaqskJf9kTUxX7e/vGP///xr///8b////G////yH///8k////JP///xb/0MyT00JA/5Byblv7//8d////Fv7Ix3XUNjH/hFhVee/z8x3///8j////JP///yT///8o////Lf///yz///8j//DmZNphWv+Oa2ll4urpJPHy8iLwcWDF0zEn+7edm1f///8m////LP///yz///8s////MP///zX///80////M////y77u7KoxlhZyrV/f3XSc3Oy7z83/7w5NtymioZg5OHgOf///zP///80////Nf///yv///89////Ov///zr///84////M//T0m/3oaGk/bS0uv24ubPujouw2oqIoO3j40r///83////PP///zP///8K////Mf///z7///89////Pf///z3///80////Mf///zH///8x////Mf///zX///88////Pv///zf///8SAAAAAAAAAAAAAAAAI8AAACBAAAAAAAAAEAgAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "fav2010": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==", "fav2012": "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAAAAAAAAAA9IVCSvSFQuf0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULk9IVCSvSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQuf0hUL/9IVC//SFQv/0hUL/9Y1O//rIq//+7+f//eXX//vUvf/7z7X/96Fu//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vYwv/97OH/9ZRZ//SFQv/0hUL/9IhG//zbx//3om7/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97uX/+buW//SFQv/0hUL/9IVC//SFQv/5upT/+9O6//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+b6b//zezP/0iEf/9IVC//SFQv/1klf//ezh//vPtP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/3qXr/+siq//m8lv/5wqD//vTu//3t4//1klb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0h0b//vbx//zi0//1j1H/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2nmn/+bmS/////v/4sIX/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5uJH///v5//eoef/1jU//+82y//afav/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vXw//vOs//0hUL/9IVC//ekcf/96+D/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//728v/4sIX/9IVC//SFQv/4s4n///v4//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6yKn/+byX//SFQv/0hkT//eTV//vWv//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IZE//m6lP/5u5b//OHQ///+/f/6y6//96d3//SFQv/0hUL/9IVC//SFQv/0hULm9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSfSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAASCwAAEgsAAAAAAAAAAAAA9IVCAPSFQif0hUKt9IVC8vSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvL0hUKt9IVCJ/SFQgD0hUIo9IVC7/SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULv9IVCKPSFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVC8fSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvP0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YtL//i2jv/828f//vLr///7+P///Pv//vTu//3n2v/6zbH/96Nw//SFQ//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ekcv/+8+z////////////+9fD/+9K5//m9mf/4to7/+buV//vSuf/++PT//OPT//aYYP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2l13///r3/////////fv/+b2Z//SIRv/0hUL/9IVC//SFQv/0hUL/9IVC//WNT//84M///vXv//aZYf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vPtP////////////i0i//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//WQUv///Pr//OPU//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//eTV///////+9O7/9IVD//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//3m2P//////9ppi//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/718H///////3s4f/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vDn///////4soj/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//erff////////38//WTWP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//iziv////////////iwhf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rMsP///////eXW//WSVv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/4sYb///z7/////////Pv/9ZFV//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ixhv/+8Of//vn1//rMsP/4rH//9plh//WQUv/1j1L/+s2x//////////////////m9mf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SGQ//2nmn/+buW//vNsv/82sb//e3j/////////////////////v/5wZ//9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/83Mj////////////++fb/+K+C//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9ZRZ/////////////vTt//aaYv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/1lFr////////////6xqf/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ehbf/70bj//end//3o2////v3///////3l1//0iEb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5wqD////////////96t7/96Z2//WOUP/2nWf//NvH//zcyP/1i0z/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/96l6/////////////vLr//WPUf/0hUL/9IVC//SFQv/0h0b//end//3k1f/0iUn/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/8387////////////4sYf/9IVC//SFQv/0hUL/9IVC//SFQv/6w6L///////nBn//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC///69////////vj1//SIR//0hUL/9IVC//SFQv/0hUL/9IVC//m+mv///////e3j//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL///r3///////8387/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+syw///////++fb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/95NX///////vUvP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97OH///////7y6//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//i2jv///////N/O//SFQv/0hUL/9IVC//SFQv/0hUL/96Nx////////////+s2x//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IdF//zh0P//+/j/9ZJW//SFQv/0hUL/9IVC//SKSv/96t7///////738v/1k1f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YxN//vUvf/96+D/96Z0//WNT//3om///ebY/////////Pv/+LKI//WVW//0h0X/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//agbP/7zbL//enc//749P////////////////////////////3r4P/3p3f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8/SFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVCJ/SFQu/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC7/SFQif0hUIA9IVCJfSFQq30hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8fSFQq30hUIl9IVCAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB", "fav2015": "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD9/f2W/f392P39/fn9/f35/f391/39/ZT+/v4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Cf39/Zn///////////////////////////////////////////39/ZX///8IAAAAAAAAAAAAAAAA/v7+Cf39/cH/////+v35/7TZp/92ul3/WKs6/1iqOv9yuFn/rNWd//j79v///////f39v////wgAAAAAAAAAAP39/Zn/////7PXp/3G3WP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP+Or1j//vDo///////9/f2VAAAAAP///zD/////+vz5/3G3V/9TqDT/WKo6/6LQkf/U6cz/1urO/6rUm/+Zo0r/8IZB//adZ////v7///////7+/i79/f2Y/////4nWzf9Lqkj/Vqo4/9Xqzv///////////////////////ebY//SHRv/0hUL//NjD///////9/f2U/f392v////8sxPH/Ebzt/43RsP/////////////////////////////////4roL/9IVC//i1jf///////f391/39/fr/////Cr37/wW8+/+16/7/////////////////9IVC//SFQv/0hUL/9IVC//SFQv/3pnX///////39/fn9/f36/////wu++/8FvPv/tuz+//////////////////SFQv/0hUL/9IVC//SFQv/0hUL/96p7///////9/f35/f392/////81yfz/CrL5/2uk9v///////////////////////////////////////////////////////f392P39/Zn/////ks/7/zdS7P84Rur/0NT6///////////////////////9/f////////////////////////39/Zb+/v4y//////n5/v9WYu3/NUPq/ztJ6/+VnPT/z9L6/9HU+v+WnfT/Ul7t/+Hj/P////////////////////8wAAAAAP39/Z3/////6Or9/1hj7v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9sdvD////////////9/f2YAAAAAAAAAAD///8K/f39w//////5+f7/paz2/11p7v88Suv/Okfq/1pm7v+iqfX/+fn+///////9/f3B/v7+CQAAAAAAAAAAAAAAAP///wr9/f2d///////////////////////////////////////////9/f2Z/v7+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f2Z/f392/39/fr9/f36/f392v39/Zj///8wAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/g3+/v5X/f39mf39/cj9/f3q/f39+f39/fn9/f3q/f39yP39/Zn+/v5W////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f2c/f399f/////////////////////////////////////////////////////9/f31/f39mv7+/iMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gn9/f2K/f39+////////////////////////////////////////////////////////////////////////////f39+v39/Yf///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4k/f390v////////////////////////////////////////////////////////////////////////////////////////////////39/dD///8iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////MP39/er//////////////////////////+r05v+v16H/gsBs/2WxSf9Wqjj/Vqk3/2OwRv99vWX/pdKV/97u2P////////////////////////////39/ej+/v4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f3q/////////////////////+v15/+Pxnv/VKk2/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/36+Z//d7tf///////////////////////39/ej///8iAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/f390//////////////////////E4bn/XKw+/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1apN/+x0pv///////////////////////39/dD///8IAAAAAAAAAAAAAAAAAAAAAP39/Yv/////////////////////sdij/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/YKU1/8qOPv/5wZ////////////////////////39/YcAAAAAAAAAAAAAAAD+/v4l/f39+////////////////8Lgt/9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9utlT/n86N/7faqv+426v/pdKV/3u8ZP9UqDX/U6g0/3egN//jiUH/9IVC//SFQv/82MP//////////////////f39+v7+/iMAAAAAAAAAAP39/Z3////////////////q9Ob/W6w+/1OoNP9TqDT/U6g0/1OoNP9nskz/zOXC/////////////////////////////////+Dv2v+osWP/8YVC//SFQv/0hUL/9IVC//WQVP/++fb//////////////////f39mgAAAAD+/v4O/f399v///////////////4LHj/9TqDT/U6g0/1OoNP9TqDT/dblc//L58P/////////////////////////////////////////////8+v/3p3f/9IVC//SFQv/0hUL/9IVC//rIqf/////////////////9/f31////DP7+/ln////////////////f9v7/Cbz2/zOwhv9TqDT/U6g0/2KwRv/v9+z///////////////////////////////////////////////////////738//1kFT/9IVC//SFQv/0hUL/9plg///////////////////////+/v5W/f39nP///////////////4jf/f8FvPv/Bbz7/yG1s/9QqDz/vN2w//////////////////////////////////////////////////////////////////rHqP/0hUL/9IVC//SFQv/0hUL//vDn//////////////////39/Zn9/f3L////////////////R878/wW8+/8FvPv/Bbz7/y7C5P/7/fr//////////////////////////////////////////////////////////////////ere//SFQv/0hUL/9IVC//SFQv/718H//////////////////f39yP39/ez///////////////8cwvv/Bbz7/wW8+/8FvPv/WNL8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rIqv/////////////////9/f3q/f39+v///////////////we9+/8FvPv/Bbz7/wW8+/993P3///////////////////////////////////////SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+cGf//////////////////39/fn9/f36////////////////B737/wW8+/8FvPv/Bbz7/33c/f//////////////////////////////////////9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6xaX//////////////////f39+f39/e3///////////////8cwvv/Bbz7/wW8+/8FvPv/WdP8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vVv//////////////////9/f3q/f39y////////////////0bN/P8FvPv/Bbz7/wW8+/8hrvn/+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/cj9/f2c////////////////ht/9/wW8+/8FvPv/FZP1/zRJ6/+zuPf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39mf7+/lr////////////////d9v7/B7n7/yB38f81Q+r/NUPq/0hV7P/u8P3////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v5X////D/39/ff///////////////9tkPT/NUPq/zVD6v81Q+r/NUPq/2Fs7//y8v7////////////////////////////////////////////09f7//////////////////////////////////////////////////f399f7+/g0AAAAA/f39n////////////////+Tm/P89Suv/NUPq/zVD6v81Q+r/NUPq/1Bc7f/IzPn/////////////////////////////////x8v5/0xY7P+MlPP////////////////////////////////////////////9/f2cAAAAAAAAAAD+/v4n/f39/P///////////////7W69/81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9ZZe7/k5v0/6609/+vtff/lJv0/1pm7v81Q+r/NUPq/zVD6v+GjvL//v7//////////////////////////////f39+/7+/iQAAAAAAAAAAAAAAAD9/f2N/////////////////////6Cn9f81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v+BivL////////////////////////////9/f2KAAAAAAAAAAAAAAAAAAAAAP7+/gv9/f3V/////////////////////7W69/8+S+v/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/P0zr/7q/+P///////////////////////f390v7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3r/////////////////////+Xn/P94gfH/NkTq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NkTq/3Z/8f/l5/z///////////////////////39/er+/v4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f3r///////////////////////////k5vz/nqX1/2p08P9IVez/OEbq/zdF6v9GU+z/aHLv/5qh9f/i5Pz////////////////////////////9/f3q////MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3V/////////////////////////////////////////////////////////////////////////////////////////////////f390v7+/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr9/f2N/f39/P///////////////////////////////////////////////////////////////////////////f39+/39/Yv+/v4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4n/f39n/39/ff//////////////////////////////////////////////////////f399v39/Z3+/v4lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/lr9/f2c/f39y/39/e39/f36/f39+v39/ez9/f3L/f39nP7+/ln+/v4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/"}; let L = null; try { L = typeof GM_getValue === "function" ? GM_getValue("UGF_LAYOUT", null) : null; } catch (e) {} if (L === null || L === undefined) { try { L = window.localStorage.getItem("UGF_LAYOUT"); } catch (e) {} } L = String(L || "2015"); // the blue bar page up to early 2010; the robot page from 2010 (the logo of May 2010 // until the flat one of late 2013, then the logo of September 2015, which is the page // Google still serves) const old = /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|2009|2009L|retro)$/.test(L); const logo = ["2010", "2010N", "2011", "2012", "2013", "2013L"].indexOf(L) > -1 ? A.logo10 : ["2014", "2015", "2015L"].indexOf(L) > -1 ? A.logo13 : null; const fav = /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|retro)$/.test(L) ? A.fav1999 : L === "2009" ? A.fav2009 : ["2009L", "2010", "2010N", "2011", "2012"].indexOf(L) > -1 ? A.fav2010 : ["2013", "2013L", "2014", "2015", "2015L"].indexOf(L) > -1 ? A.fav2012 : A.fav2015; const el = function(tag, attrs, kids) { const e = document.createElement(tag); Object.keys(attrs || {}).forEach(function(k) { e.setAttribute(k, attrs[k]); }); (kids || []).forEach(function(k) { if (k !== null && k !== undefined) { e.appendChild(typeof k === "string" ? document.createTextNode(k) : k); } }); return e; }; let done = false; const setFav = function() { const head = document.head || document.documentElement; document.querySelectorAll("link[rel~='icon']:not(.ugf-err-fav)").forEach(function(l) { l.remove(); }); if (!document.querySelector("link.ugf-err-fav")) { head.appendChild(el("link", { rel: "icon", class: "ugf-err-fav", href: fav })); } }; // the page Google served before the robot: "Google" in the coloured Times letters of // its own error pages, the blue bar reading "Error", and the message under it const rebuild = function() { const m = (document.title || "").match(/^Error (\d{3}) \(([^)]*)\)!!1$/); if (!m || !document.body || document.getElementById("ugf-err-old")) { return; } const code = m[1]; const reason = m[2]; // the message: Google's own words, without "That's an error." and "That's all we know." const ps = document.body.querySelectorAll("p"); const msg = []; if (code === "404") { msg.push("The requested URL ", el("code", {}, [window.location.pathname || "/"]), " was not found on this server."); } else if (ps.length > 1) { [].forEach.call(ps[1].childNodes, function(n) { if (n.nodeName !== "INS") { msg.push(n.cloneNode(true)); } }); } const letters = [["G", "#0039b6"], ["o", "#c41200"], ["o", "#f3c518"], ["g", "#0039b6"], ["l", "#30a72f"], ["e", "#c41200"]].map(function(x) { return el("font", { face: "times", color: x[1], size: "10" }, [x[0]]); }); letters.push("  "); const top = el("table", { border: "0", cellpadding: "2", cellspacing: "0", width: "100%" }, [ el("tbody", {}, [ el("tr", {}, [el("td", { rowspan: "3", width: "1%", nowrap: "" }, [el("b", {}, letters)]), el("td", {}, [" "])]), el("tr", {}, [el("td", { bgcolor: "#3366cc" }, [el("font", { face: "arial,sans-serif", color: "#ffffff" }, [el("b", {}, ["Error"])])])]), el("tr", {}, [el("td", {}, [" "])]) ]) ]); const quote = el("blockquote", {}, [el("h1", {}, [reason])].concat(msg, [el("p")])); const foot = el("table", { width: "100%", cellpadding: "0", cellspacing: "0" }, [ el("tbody", {}, [el("tr", {}, [el("td", { bgcolor: "#3366cc" }, [el("div", { style: "height: 4px" })])])]) ]); const page = el("div", { id: "ugf-err-old" }, [top, quote, foot]); // Google's own sheet goes (it styles every element), and its content stays in the page, hidden document.querySelectorAll("style:not(#ugf-err-css)").forEach(function(s) { s.remove(); }); [].forEach.call(document.body.children, function(c) { c.setAttribute("data-ugf-err-hide", ""); }); document.body.insertBefore(page, document.body.firstChild); document.title = code + " " + reason; }; const css = function() { const R = "html[gplex-err]"; if (old) { return R + ", " + R + " body { background: #fff !important; color: #000 !important; margin: 8px !important; padding: 0 !important; max-width: none !important; min-height: 0 !important; }" + R + " body { font-family: arial, sans-serif !important; }" + R + ":not([gplex-err-built]) body { visibility: hidden !important; }" + R + " [data-ugf-err-hide] { display: none !important; }" + R + " #ugf-err-old { font: 16px arial, sans-serif; color: #000; }" + R + " #ugf-err-old table { border-collapse: separate; }" + R + " #ugf-err-old blockquote { margin: 16px 40px; }" + R + " #ugf-err-old h1 { font: bold 32px arial, sans-serif; margin: 21px 0; }" + R + " #ugf-err-old code { font: 13px monospace; }" + R + " #ugf-err-old p { margin: 16px 0; }"; } // the robot page is Google's own; only the logo is the period's (and Firefox's hi-dpi // border-image of today's logo is taken off) return R + " #logo { background: url(" + logo + ") no-repeat 0 0 / 150px auto !important; border-image: none !important; -moz-border-image: none !important; width: 150px !important; height: 55px !important; }"; }; const go = function() { if (done || !ugfIsErrorPage()) { return done; } done = true; const html = document.documentElement; // (no Gplex theme of the site is meant for this page) ["ugf-early-veil", "ugf-dv-veil"].forEach(function(id) { const v = document.getElementById(id); if (v) { v.remove(); } }); setFav(); if (!old && !logo) { return true; } html.setAttribute("gplex-err", L); const st = el("style", { id: "ugf-err-css" }, [css()]); (document.head || html).appendChild(st); if (old) { const build = function() { try { rebuild(); } catch (e) {} html.setAttribute("gplex-err-built", ""); }; if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", build); } else { build(); } } return true; }; if (!go()) { // at document-start the title isn't there yet: it comes before anything is drawn const wait = new MutationObserver(function() { if (go() || document.body) { wait.disconnect(); } }); wait.observe(document, { childList: true, subtree: true }); document.addEventListener("DOMContentLoaded", go); } } catch (e) {} })(); // ---- end Gplex error page ---- // ---- Gplex Gmail about page ---- // (6.2) Gmail's "about" page (google.com/gmail/about, today workspace.google.com/gmail) as each // period had it: the 2013-2015 carousel page, "Welcome to Gmail" of late 2015, the Material page // of 2016-2018, "Get more done with Gmail" of 2019 and the 2020-2022 page. Pictures are Google's // own: the 2019 and 2022 ones still on Google's image servers, the older ones from the Wayback // Machine's copies of the pages. Before 2014 signed-out Gmail went straight to Gmail's sign-in // page, so on those layouts this page goes there. (function ugfGmailAbout() { try { if (window.location.host !== "workspace.google.com" || window.top !== window.self || !/^\/(intl\/[^/]+\/)?gmail\/?$/.test(window.location.pathname || "") || /[?&]gplex=false\b/.test(window.location.search || "")) { return; } const gv = function(k, d) { try { const v = typeof GM_getValue === "function" ? GM_getValue(k, null) : null; return v === null || v === undefined ? d : String(v); } catch (e) { return d; } }; if (gv("UGF_GMAIL_ON", "true") === "false") { return; } const L = gv("UGF_LAYOUT", "2015"); const page = ["2014", "2015", "2015L"].indexOf(L) > -1 ? "a14" : L === "2015N" ? "a15" : ["2016", "2016C", "2016L", "2018", "2018M"].indexOf(L) > -1 ? "a16" : L === "2019" ? "a19" : L === "2022" ? "a22" : null; if (!page) { // straight to Gmail's sign-in (mail.google.com itself sends a browser with no Google // sign-in here, so going there would come straight back), and never twice in a row let last = 0; try { last = parseInt(window.sessionStorage.getItem("ugf-gma-went") || "0", 10) || 0; window.sessionStorage.setItem("ugf-gma-went", String(Date.now())); } catch (e) {} if (Date.now() - last > 15000) { window.location.replace("https://accounts.google.com/ServiceLogin?service=mail&continue=" + encodeURIComponent("https://mail.google.com/mail/")); } return; } const A = {"google13": "data:image/png;base64,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", "google15": "data:image/png;base64,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", "gm16": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAbFBMVEX////gSj+qODDgSj/o5tiwr6ThVEniZ1zn08XOzMCqODDmtajl49bY18nkjoLdST7Lyr2/VUuvoJblopXWRzzFxLjT0cW6aV/mv7LjhXjPRDq0fXPCQDfMS0Hg3tHe3M60sqfl49W7ua6vkYfYzKRYAAAAA3RSTlMA19csuNBxAAAAaElEQVR4Xp3IRw7CMBQFwJj3m51e6f3+dyTYoGSJmOVkP3Bq9GHq5gAkT5ELDjGA6h0VcAox9oCaKeptSEE9IILhyN+gnQDnJy9Bpm3H6yj9yOvwJdG0RNFcaHa9pXBoCoruj7DJ/vACm58E7AMvk10AAAAASUVORK5CYII=", "m2018": "data:image/png;base64,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", "m2020": "data:image/png;base64,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", "fav2013": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABgFBMVEXi2trf3Nfc4+TkmJLmpZ7i6+vhenX2YV3/v3/igHzkp57jtK///wAAAAD+/v7X1dfKNzTa2drJaWXT1NXr6OjMSETOU0/Kysu1tbbSurl/f3+1ODO6Gxfi5eW5ZGHUnZnP1dbk5uWrIh3i4+Tu+vvY19jU1NPZ2dnQ1tbb5er/AACwKiXMQT7Oy8vRzM24XVm4lpHGKCXJcm/IiYR///+6R0OqqqrOYV7GmZXStrTTycfMyMnS4+XO/Pz/f3/yenXup6Pvt7Li2tm2Yl24eXO4qaa0tLjRqabWubnxlZHxzMzp1dR/f/+5bmm/v7+7vLqq///MmZnSl5PLqKTf3+Pa4+XS4+bR/P/nX1vxjIf/qqrtwb3h2dnm6ubo9/i/Pz+5WlayZFy5enS+gHu3gXq/jIizr6+4yMy8ycrBIRzPXFrNYl7PbWjRfXjegH3Cg37bjIrSkI3Co53eo57AoZ7aoZ3NqabJurTawrzQwL7GxL/Uz8/azMzYzs/d3ejb2+KE+Q+SAAAAgHRSTlPgK1ip1KGr/wT+Ol0BAAaM+3D48A/9/vZB/gL+/ITV9dUv/kwqDTRRtHQB/vwH0/r89vr6Av4D+0ZqLlBMFgP/7+9R1/76P/0P+w2YAv0E+AMHbFRJkKws//sDnTBqdATJ/TDN/DxAQfv/wtC8oaf/wJZcn8T0YrIqfvR3g7gXJFf7xQQAAAJQSURBVHjajZMHU9tAEIXPBtJvpZPvJGyRYCHJEnLFFRwb24TeIfSW3nvvyV/PSuAEPAzJG2nvRu+bt3szOkL/IUKp58HpHngeAoG5gxUA6OHiCzej7YR0etnmgdJwtOHctnl6uVwGIPXVc109dToLYC9CGjgH7pfQNK3PvewaoWSucL7R2q1TepgIi9TGNrco3Xs3s9V4bROiDMli5k3Iop59NGx5hVLj0ouGPCQ/NYmmyEKk1BYJ0ekyXMGMHRiFKpmRfV1bJ9GKrgpZqBe7E5RewIzZWUrD3YpAW9dvXCVRJVkqiZQsGs/nDqg3veLR/d1nWxgvSnoyAJ6I8YKaErLabI3557/c3EZbVvqzyUOgT0xpuawQQlaaH6ufV7dVtMXCUmQhmbwWAGq/G4/eFynsk281K/5w2VxkY0TRB9qAtK5puTs4l6pUsJZeRV334AQQ/hF/PDGuiuBslZxGpO/hL8eBQUnKRJZyagq75yfiG0xi1omEQcakjKZNjAu18NWVJMaYNdyREBDaVFRzcXsagMpocdft8d1aeMy62dkCjW+SXyU2VjP2YLgTYAYHH5OY45hGAh4cA1x/BoP/BMNBxDSdNcPpTHAMg9sG8DXGTF9/ZtAQ+MCsULr9L3PL8v9aTu8qet/tfZLJ98n9klX9ZSQCVROO41xHhd5mB/R7JjHf5/NTkXgmjopE8MUaiGiFbOGTQYDhFy3QkdNekXENTihs1h71ntQkPpMPe2vhTbw4sbOvJmBCrFgchSJADDU/H/uron8DyX/c7rP1G+NCeLHqDWQRAAAAAElFTkSuQmCC", "fav2020": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEBElEQVR4nO2UTWhcVRTH/+fe++Yjsc0HaoiGRFNjIQsbqTOlxfoxGqqQFhddCS1x5dCF3ZUiLiyIFLNQd4qRuBAXkkUoCJrmw6QkliFZmKSLKK2CEEwbtE0ybz7eu+e4mMmQTF7SThp3+cGD4d25/3Pu/3/uA/bYo4yZ5ua6ufb20G7ryvcIyTXUlb9Xaz9+bn2y7ZfWlgHX0Fw6m05NHnjq7G4Vz11VZ/kxnbK+mbOjZiA7GGpbWyMAmGpsrMpGndFqpeNZZmgiCABmfLFK6mLnrVv3dlL4n6uo2aecy1pLkggQC1AE8NOSMhn7Kp2CqwAgGzXtChR3mcEAPBFYEYQ0km0Njwz+2xnrqLT44rFjHWbg2UETliRbwPcAy4B1AVIU9yKmHShGQCxVVCYgADIsCGsdF6HhpUSs+0GLLyVi3Tpkh3XOxP28QGSjLhEAjSoAMACgbVaIImDSm8RyzAgT1WuFvqXX4kfukb14YGg6MJKbrx+uqRF9WROSzIW9QdOsIFC+RcmByefewd3qRjg2F3giKwJfBBFNyVpRg4sBkSx2xjpqRQ1GNCX9YoRBGLK4zVH059uk1MB3L32ieru+xe9NL8LxMyiM4EYEgGsZRqm4YWyIZCkR6zaMYaNU3LUcsLsw7YYsUvkGvHv3OC6sxgsNAcB+f4Xv1Lai742v0Tn1GY7P9EKJhVVmk1CucEvqFaHvdiIWAwCl6JwU14LQEDCAb9yD+NJtRwYGdcjij7UGAECzB6sd/HD0ffz1+CGcmriEmtWFQEErAgIQ1uocAOQ5+NTAmuXV6Fk9hJ9yTXCI4VDhtpUcKNkkDGNz+PWZLvxdfxBvXfsALfgNBGwqsN2JgYLlUQWk8g34ePl53PT3I0J23WoBFbTZ8bO4U9uKvjd7eabhyJDmvGeo/KJujSGCIfEmTM3Q+eWj/Kfdt674RgIbAAqRiFOl3nvhq49CfuY0RBYiasu/l4goBYgsRPNy+szJlg89McrB1k5tq0giaORVXT0+f8VlSXjMI1GtEOQFAYhqBY95xGVJRCanrjSmvfD9Wr7/kYo0jU7Np9O6K+NzjyLw+kgMERSBMz73pNO6q2l0av5BdTffs21ovn49A+DCYuJwyiH1eUSpJwDAZ17whc83jEz3V6IHVODAehpGpvtdlkSe7XieZdxlSeyk+I4bAAqRrPjVJ1b86IlKLC+nogjKeXpsLPsw+4GiA8KBg/2/Ilao1IDSxgPtOI2KIUVASHulBlZy7g2x3oQOVUOZyLonDPUQc8JMSoU0NjxhA/F5wsmt3ACKM5C69Ojyy59KF/K5V8RyFLb42dQapDC70wbC7M36OXp7/TutdSbH2bHZMz8u71R3jz12lf8Awsq45S8ZTqIAAAAASUVORK5CYII="}; const SIGNIN = "https://accounts.google.com/ServiceLogin?service=mail&continue=" + encodeURIComponent("https://mail.google.com/mail/"); const SIGNUP = "https://accounts.google.com/signup?service=mail&continue=" + encodeURIComponent("https://mail.google.com/mail/"); const WORK = "https://workspace.google.com/"; const HELP = "https://support.google.com/mail/"; const PLAY = "https://play.google.com/store/apps/details?id=com.google.android.gm"; const APPSTORE = "https://apps.apple.com/app/gmail-email-by-google/id422689480"; // the Wayback Machine's copy of a picture of the period's page const W = function(ts, url) { return "https://web.archive.org/web/" + ts + "im_/" + url; }; const LH = function(id, w) { return "https://lh3.googleusercontent.com/" + id + "=w" + w; }; const h = function(tag, attrs) { const el = document.createElement(tag); Object.keys(attrs || {}).forEach(function(k) { el.setAttribute(k, attrs[k]); }); for (let i = 2; i < arguments.length; i++) { const c = arguments[i]; if (c === null || c === undefined || c === false) { continue; } if (Array.isArray(c)) { c.forEach(function(x) { if (x) { el.appendChild(typeof x === "string" ? document.createTextNode(x) : x); } }); } else { el.appendChild(typeof c === "string" ? document.createTextNode(c) : c); } } return el; }; const a = function(href, text, cls) { return h("a", cls ? { href: href, class: cls } : { href: href }, text); }; const img = function(src, cls, alt) { const o = { src: src, alt: alt || "", referrerpolicy: "no-referrer", loading: "lazy" }; if (cls) { o.class = cls; } const el = h("img", o); // (the Wayback Machine sometimes can't hand a picture over: then no broken frame) el.addEventListener("error", function() { el.style.visibility = "hidden"; }); return el; }; // ---- the pages const css = []; let title = "Gmail - Free Storage and Email from Google"; // the red M of 2013-2020 (the multicolour one from late 2020 on the 2022 page) let fav = A.fav2013; let font = ""; let build = null; if (page === "a14" || page === "a15") { // 2013-2015 (the "maia" pages): the grey header, the Gmail row, the carousel font = "Open+Sans:300,400,600,700"; const T = page === "a14" ? "20131205190825" : "20151115082847"; const IMG = page === "a14" ? "http://www.google.com/mail/help/images/" : "https://www.google.com/intl/en/mail/help/images/"; title = page === "a14" ? "Gmail - Email from Google" : "Gmail - Free Storage and Email from Google"; const slides = page === "a14" ? [W(T, IMG + "about-carousel-1.jpg"), W(T, IMG + "about-carousel-2.jpg"), W(T, IMG + "about-carousel-3.jpg")] : [W(T, IMG + "about-carousel-1.png"), W(T, IMG + "about-carousel-2.png"), W(T, IMG + "about-carousel-3.jpg")]; const words = ["The ease & simplicity of Gmail, available across devices", "Gmail's inbox helps you stay organized by sorting your mail by type", "Video chat with a friend, ping a colleague, or give someone a ring - all without leaving your inbox"]; css.push(":host { all: initial; display: block; font: 13px/1.54 Arial, sans-serif; color: #222; background: #fff; }", "* { box-sizing: border-box; } a { color: #15c; text-decoration: none; } a:hover { text-decoration: underline; }", ".aux { width: 978px; max-width: calc(100% - 40px); margin: 0 auto; }", ".hd { height: 72px; background: linear-gradient(#fafafa, #f5f5f5); border-bottom: 1px solid #ebebeb; }", ".hd .aux { display: flex; align-items: center; justify-content: space-between; height: 72px; }", ".hd img { display: block; width: 116px; height: 41px; }", ".util a { margin-left: 16px; }", // (the flat Material blue of 2014-2015, no gloss) ".btn { display: inline-block; height: 32px; padding: 0 12px; border: 1px solid #4285f4; border-radius: 2px; background: #4285f4; color: #fff !important; font: bold 13px/30px Arial, sans-serif; text-decoration: none !important; }", ".btn:hover { background: #3b78e7; border-color: #3b78e7; box-shadow: 0 1px 1px rgba(0,0,0,.1); }", ".btn:active { background: #3367d6; border-color: #3367d6; box-shadow: none; }", ".nav { height: 45px; border-bottom: 1px solid #ebebeb; }", ".nav ul { list-style: none; margin: 0; padding: 0; display: flex; height: 44px; align-items: center; }", ".nav li { margin-right: 20px; font-size: 14px; } .nav li a { color: #444; } .nav li.on { font-weight: bold; color: #222; display: flex; align-items: center; }", ".nav li.on img { width: 16px; height: 16px; margin-right: 5px; }", ".hero { position: relative; height: 500px; overflow: hidden; background: #333; }", ".slide { position: absolute; inset: 0; background: #333 center / cover no-repeat; opacity: 0; transition: opacity .8s; }", ".slide.on { opacity: 1; }", ".slide .aux { height: 100%; display: flex; align-items: center; }", ".slide .c { width: 41%; }", ".slide h1 { font: 300 32px/50px 'Open Sans', Arial, sans-serif; color: #fff; margin: 0 0 20px; }", ".dots { position: absolute; left: 0; right: 0; bottom: 14px; text-align: center; }", ".dots a { display: inline-block; width: 9px; height: 9px; margin: 0 5px; border-radius: 50%; background: rgba(255,255,255,.4); cursor: pointer; }", ".dots a.on { background: #fff; }", "h3 { font: 300 32px/1.2 'Open Sans', Arial, sans-serif; color: #222; margin: 70px 0 30px; }", "h4 { font: bold 13px Arial, sans-serif; margin: 22px 0 4px; }", ".cols { display: flex; gap: 40px; } .c7 { flex: 7; } .c5 { flex: 5; }", ".mob { display: flex; align-items: center; margin: 0 0 18px; } .mob img { width: 97px; height: 97px; margin-right: 22px; } .mob p { margin: 0; max-width: 200px; }", ".more { margin: 22px 0 0; }", ".welcome { text-align: center; } .items { display: grid; grid-template-columns: 1fr 1fr; gap: 40px 60px; margin: 0 0 30px; }", ".item { display: flex; align-items: center; } .item img { width: 184px; height: 184px; flex: none; margin-right: 24px; }", ".item h4 { margin-top: 0; }", ".ft { margin-top: 80px; background: #f5f5f5; }", ".ft .bar { height: 3px; width: 116px; margin: 0 0 0 auto; background: linear-gradient(90deg, #4285f4 25%, #ea4335 25% 50%, #fbbc05 50% 75%, #34a853 75%); }", ".ft .links { padding: 30px 0 26px; } .ft .links a { margin-right: 10px; }", ".ft .g { border-top: 1px solid #e5e5e5; padding: 14px 0; font-size: 11px; } .ft .g a { margin-right: 12px; }"); build = function() { const hero = h("div", { class: "hero" }, slides.map(function(src, i) { return h("div", { class: "slide" + (i === 0 ? " on" : ""), style: "background-image: url(\"" + src + "\")" }, h("div", { class: "aux" }, h("div", { class: "c" }, h("h1", {}, words[i]), a(SIGNUP, "Create an account", "btn")))); }), h("div", { class: "dots" }, slides.map(function(s, i) { return h("a", { class: i === 0 ? "on" : "", "data-i": String(i) }); }))); let cur = 0; const show = function(n) { cur = n; hero.querySelectorAll(".slide").forEach(function(s, i) { s.classList.toggle("on", i === n); }); hero.querySelectorAll(".dots a").forEach(function(d, i) { d.classList.toggle("on", i === n); }); }; hero.querySelectorAll(".dots a").forEach(function(d, i) { d.addEventListener("click", function() { show(i); }); }); setInterval(function() { show((cur + 1) % slides.length); }, 7000); const top = [h("div", { class: "hd" }, h("div", { class: "aux" }, a("https://www.google.com/", img(page === "a14" ? A.google13 : A.google15, "", "Google")), h("div", { class: "util" }, a(SIGNIN, "Sign in"), a(SIGNUP, "Create an account", "btn")))), h("div", { class: "nav" }, h("div", { class: "aux" }, h("ul", {}, h("li", { class: "on" }, img(A.gm16), "Gmail"), h("li", {}, a(HELP, "Features")), h("li", {}, a(PLAY, "For mobile")), h("li", {}, a(WORK, "For work")), h("li", {}, a(HELP, "Help"))))), hero]; let body; if (page === "a14") { const mob = function(src, t) { return h("div", { class: "mob" }, img(W(T, IMG + src)), h("p", {}, t)); }; body = h("div", { class: "aux" }, h("div", { class: "cols" }, h("div", { class: "c7" }, h("h3", {}, "New features"), h("h4", {}, "Meet the new inbox"), h("p", {}, "New customizable tabs put you back in control so that you can see what's new at a glance and decide which emails you want to read and when. ", a(HELP, "More about the new inbox")), h("h4", {}, "Talk across devices"), h("p", {}, "Hangouts bring conversations to life with photos, emoji, and even group video calls for free. Connect with friends across computers, Android and Apple devices. ", a(HELP, "More about Hangouts")), h("h4", {}, "Lots of free storage"), h("p", {}, "With 15GB of free storage across Gmail, Google Drive and Google+ Photos, you won't need to delete emails to save space. ", a(HELP, "More about storage")), h("p", { class: "more" }, a(HELP, "See more features"))), h("div", { class: "c5" }, h("h3", {}, "Mobile"), mob("about-mobile-notifications.png", "Real-time notifications so you don't miss important emails."), mob("about-mobile-anywhere.png", "The best of Gmail available wherever you are, from any device."), mob("about-mobile-search.png", "Search across your entire inbox with predictions as you type."), h("p", { class: "more" }, a(PLAY, "See more about Gmail for mobile")))), h("div", { class: "cols" }, h("div", { class: "c7" }, h("h3", {}, "Gmail for work"), h("p", {}, "Get custom email @your_company.com including calendar, docs, video meetings, and more with access from your phone or tablet. ", a(WORK, "More about Gmail for work"))), h("div", { class: "c5" }, h("h3", {}, "Need help?"), h("p", {}, "Have a question about Gmail? Visit the ", a(HELP, "help center"), " for FAQs and suggestions.")))); } else { const item = function(src, t, p, more) { return h("div", { class: "item" }, img(src), h("div", {}, h("h4", {}, t), h("p", {}, p, " ", more))); }; body = h("div", { class: "aux" }, h("h3", { class: "welcome" }, "Welcome to Gmail"), h("div", { class: "items" }, item(W(T, "https://www.google.com/mail/help/images/circle-experience.png"), "Experience Gmail on any device", "The best of Gmail is available wherever you are, from any device.", a(PLAY, "More about Gmail for mobile")), item(W(T, IMG + "circle-hangout-video.png"), "Talk across devices", "Hangouts bring conversations to life with photos, emoji, and even group video calls for free. Connect with friends across computers, Android and Apple devices.", a(HELP, "More about Hangouts")), item(W(T, IMG + "circle-inbox-b.png"), "Meet the new inbox", "New customizable tabs put you back in control so that you can see what's new at a glance and decide which emails you want to read and when.", a(HELP, "More about the new inbox")), item(W(T, IMG + "circle-storage.png"), "Lots of free storage", "With 15GB of free storage across Gmail, Google Drive and Google Photos, you won't need to delete emails to save space.", a(HELP, "More about Storage")), item(W(T, IMG + "work-feature-1.png"), "Gmail for work", "Get custom email @your_company.com including calendar, docs, video meetings, and more with access from your phone or tablet.", a(WORK, "More about Gmail for work")), item(W(T, IMG + "circle-help.png"), "Need help?", h("span", {}, "Have a question about Gmail? Visit the ", a(HELP, "help center"), " for FAQs and suggestions."), null))); } const foot = h("div", { class: "ft" }, h("div", { class: "aux" }, h("div", { class: "bar" }), h("div", { class: "links" }, a(PLAY, "For mobile"), a(WORK, "For work"), a(HELP, "Help"), a("https://policies.google.com/", "Our policy"))), h("div", { class: "g" }, h("div", { class: "aux" }, a("https://www.google.com/", "Google"), a("https://about.google/", "About Google"), page === "a14" ? a("https://policies.google.com/", "Privacy & Terms") : [a("https://policies.google.com/privacy", "Privacy"), a("https://policies.google.com/terms", "Terms")]))); return top.concat([body, foot]); }; } else if (page === "a16") { // 2016-2018: the Material page (Roboto, the red "Create an account", big pictures) font = "Roboto:300,400,500"; const T = "20161014230653"; const I = function(f) { return W(T, "https://www.google.com/gmail/about/images/" + f); }; css.push(":host { all: initial; display: block; font: 16px/1.6 Roboto, Arial, sans-serif; color: #333; background: #fff; }", "* { box-sizing: border-box; } a { text-decoration: none; }", ".nav { position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; height: 64px; padding: 0 0 0 24px; background: #fff; box-shadow: 0 1px 4px rgba(0,0,0,.12); }", ".nav img { display: block; height: 30px; width: auto; }", ".nav .r { display: flex; height: 64px; align-items: center; }", ".nav .r a { font: 500 14px/16px Roboto, Arial, sans-serif; color: #757575; text-transform: uppercase; padding: 24px 32px; }", ".nav .r a.cr { background: #dd5347; color: #fff; padding: 24px 48px; }", ".hero { position: relative; background: #555 50% / cover no-repeat; } .hero::before { content: ''; display: block; padding-bottom: 63.333%; }", ".hero .c { position: absolute; left: 9%; top: 22%; width: 33%; }", ".hero h1 { font: 100 48px/62px Roboto, Arial, sans-serif; color: #fff; margin: 0 0 40px; }", ".rbtn { display: inline-block; background: #dd5347; color: #fff !important; font: 500 14px/16px Roboto, Arial, sans-serif; padding: 24px 48px; text-transform: uppercase; white-space: nowrap; }", "section { padding: 120px 0 0; text-align: center; }", "h2 { font: 100 40px/48px Roboto, Arial, sans-serif; color: #333; margin: 0 0 30px; }", "p { font-weight: 300; margin: 0 auto; max-width: 380px; color: #4a4a4a; }", ".wide { width: 1070px; max-width: calc(100% - 40px); margin: 60px auto 0; display: block; }", ".badges { margin: 30px 0 0; } .badges img { height: 40px; margin: 0 4px; }", ".grey { background: #f5f5f5; width: 1070px; max-width: calc(100% - 40px); margin: 120px auto 0; padding: 0; display: flex; align-items: center; text-align: left; }", ".grey .t { flex: 1; padding: 60px 60px 60px 150px; } .grey .t p { margin: 0; }", ".grey .i { flex: 1; padding: 50px 40px 50px 0; } .grey .i img { width: 100%; display: block; }", ".frame { width: 800px; max-width: calc(100% - 40px); margin: 50px auto 0; padding: 7px; background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.25); } .frame img { width: 100%; display: block; }", ".act, .work { text-align: center; }", ".act { background: #f5f5f5; width: 1070px; max-width: calc(100% - 40px); margin: 120px auto 0; padding: 70px 0 0; }", ".act img { width: 700px; max-width: 90%; display: block; margin: 40px auto 0; }", ".comp { display: flex; align-items: center; width: 1070px; max-width: calc(100% - 40px); margin: 0 auto; text-align: left; }", ".comp img { width: 62%; } .comp .t { padding: 0 0 0 40px; } .comp p { margin: 0; }", ".work { background: #f7f7f7; width: 1070px; max-width: calc(100% - 40px); margin: 120px auto 0; padding: 80px 20px 90px; }", ".work p { max-width: 400px; } .work b { font-weight: 400; color: #4285f4; }", ".lm { display: block; margin: 36px 0 26px; color: #d14836; font: 500 13px Roboto, Arial, sans-serif; letter-spacing: .5px; }", ".work .rbtn { padding: 14px 64px; font-size: 13px; }", ".ft { width: 1070px; max-width: calc(100% - 40px); margin: 0 auto; background: #f7f7f7; text-align: left; }", ".ft .bar { height: 2px; width: 116px; margin: 0 100px 0 auto; background: linear-gradient(90deg, #4285f4 25%, #ea4335 25% 50%, #fbbc05 50% 75%, #34a853 75%); }", ".ft .l { padding: 30px 100px; border-top: 1px solid #e8e8e8; } .ft .l a { color: #15c; margin-right: 10px; font-size: 14px; }", ".ft .g { background: #f2f2f2; padding: 14px 100px; } .ft .g a { color: #15c; margin-right: 10px; font-size: 11px; }"); build = function() { return [h("div", { class: "nav" }, a("https://www.google.com/gmail/about/", img(A.m2018, "", "Gmail")), h("div", { class: "r" }, a(WORK, "For Work"), a(SIGNIN, "Sign In"), a(SIGNUP, "Create an account", "cr"))), h("div", { class: "hero", style: "background-image: url(\"" + I("home-hero_2x.jpg") + "\")" }, h("div", { class: "c" }, h("h1", {}, "The ease & simplicity of Gmail, available across devices"), a(SIGNUP, "Create an account", "rbtn"))), h("section", {}, h("h2", {}, "Meet your new inbox"), h("p", {}, "New customizable tabs put you back in control so that you can see what’s new at a glance and decide which emails you want to read and when."), img(I("inboxtabs_2x.jpg"), "wide", "New inbox")), h("section", {}, h("h2", {}, "Experience Gmail on any device"), h("p", {}, "The ease & simplicity of Gmail, wherever you are"), h("div", { class: "badges" }, a(PLAY, img(I("playstore.png"), "", "Get it on Google Play")), a(APPSTORE, img(I("appstore.png"), "", "Download on the App Store"))), img(I("any-device.jpg"), "wide", "All your devices")), h("div", { class: "grey" }, h("div", { class: "t" }, h("h2", {}, "View attachments", h("br"), "instantly"), h("p", {}, "View files without leaving Gmail. You can even save attachments directly to your Drive to organize and share them in a single, safe place.")), h("div", { class: "i" }, img(I("attachments-tablet_2x.png"), "", "View attachments instantly"))), h("section", {}, h("h2", {}, "Custom themes"), h("p", {}, "The number of themes has increased from 35 to...infinity. Select your own image to use as a custom theme, or choose from a selection of photos."), h("div", { class: "frame" }, img(I("themes1.jpg"), "", "Custom themes"))), h("div", { class: "act" }, h("h2", {}, "Take action right", h("br"), "from the inbox"), h("p", {}, "Track packages, review products, RSVP for events, and more without opening any emails."), img(I("action-4_2x.png"), "", "Take action right from the inbox")), h("section", {}, h("div", { class: "comp" }, img(I("bettercompose_2x.jpg"), "", "A better compose"), h("div", { class: "t" }, h("h2", {}, "A better compose"), h("p", {}, "Compose new messages while keeping an eye on your inbox. Gmail’s compose is fast, easy to use, and packed with features.")))), h("div", { class: "work" }, h("h2", {}, "Get custom email & more", h("br"), "with Gmail for work"), h("p", {}, "Use the Gmail you love - for business. Get custom email ", h("b", {}, "@yourcompany.com"), " including calendar, docs, video meetings, and more with access from your phone or tablet."), a(WORK, "Learn more ›", "lm"), a(WORK, "Get started", "rbtn")), h("div", { class: "ft" }, h("div", { class: "bar" }), h("div", { class: "l" }, a("https://policies.google.com/", "Our policy"), a(HELP, "Help"), a(WORK, "For work")), h("div", { class: "g" }, a("https://www.google.com/", "Google"), a("https://about.google/", "About Google"), a("https://policies.google.com/privacy", "Privacy"), a("https://policies.google.com/terms", "Terms")))]; }; } else if (page === "a19") { // 2019: "Get more done with Gmail" (Google Sans, the blue button) font = "Google+Sans:400,500|Roboto:400,500"; css.push(":host { all: initial; display: block; font: 16px/1.5 Roboto, Arial, sans-serif; color: #202124; background: #fff; }", "* { box-sizing: border-box; } a { text-decoration: none; }", ".nav { position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; height: 64px; padding: 0 16px 0 24px; background: #fff; box-shadow: 0 1px 2px rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15); }", ".nav img { display: block; height: 30px; width: auto; }", ".nav .r a { font: 400 16px 'Google Sans', Roboto, Arial, sans-serif; color: #5f6368; margin: 0 16px; }", ".bbtn { display: inline-block; background: #1a73e8; color: #fff !important; font: 500 17px/48px 'Google Sans', Roboto, Arial, sans-serif; padding: 0 24px; border-radius: 4px; }", ".nav .r a.bbtn { color: #fff; margin: 0 0 0 16px; font-size: 16px; line-height: 44px; }", ".hero { background: #f8f9fa; padding: 120px 0 90px; } .in { width: 1180px; max-width: calc(100% - 48px); margin: 0 auto; }", ".hero .in { display: flex; align-items: center; gap: 40px; } .hero .t { flex: 1; } .hero .i { flex: 1; text-align: center; } .hero .i img { width: 100%; max-width: 560px; }", "h1 { font: 400 56px/64px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 24px; letter-spacing: -.5px; }", ".hero p { font-size: 18px; line-height: 28px; color: #5f6368; margin: 0 0 40px; max-width: 470px; }", "h2 { font: 400 44px/52px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 16px; }", ".dev { text-align: center; padding: 100px 0 0; } .dev p { color: #5f6368; margin: 0 0 30px; } .dev .b img { height: 40px; margin: 0 6px; } .dev .big { display: block; width: 1000px; max-width: 100%; margin: 50px auto 0; }", ".cards { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; padding: 100px 0 0; }", ".card { background: #f1f3f4; border-radius: 8px; padding: 48px 0 0 48px; overflow: hidden; min-height: 420px; display: flex; flex-direction: column; }", ".card h3 { font: 400 36px/44px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 48px 16px 0; } .card p { color: #5f6368; margin: 0 48px 30px 0; }", ".card img { display: block; width: 100%; margin-top: auto; }", ".go { text-align: center; padding: 110px 0 100px; } .go img { width: 64px; height: 64px; display: block; margin: 0 auto 18px; }", ".ft { border-top: 1px solid #dadce0; padding: 24px 0; font-size: 14px; } .ft a { color: #5f6368; margin-right: 24px; }"); build = function() { const card = function(t, p, id) { return h("div", { class: "card" }, h("h3", {}, t), h("p", {}, p), img(LH(id, 790), "", t)); }; return [h("div", { class: "nav" }, a("https://www.google.com/gmail/about/", img(A.m2018, "", "Gmail")), h("div", { class: "r" }, a(WORK, "For Work"), a(SIGNIN, "Sign in"), a(SIGNUP, "Create an account", "bbtn"))), h("div", { class: "hero" }, h("div", { class: "in" }, h("div", { class: "t" }, h("h1", {}, "Get more done with Gmail"), h("p", {}, "Now more secure, smarter and easier to use—helping you save time and do more with your inbox."), a(SIGNUP, "Create an account", "bbtn")), h("div", { class: "i" }, img(LH("qIbkEqS8l67IApLtveAc5GG8a192K-_4D9xi4f_qDK1aOFiyYUcjPyeBH-vEDnZK7-cIvvuhi0sEuFi_cEeOBU8_NYjHhko3NQ6kpQ", 1180), "", "Gmail")))), h("div", { class: "in" }, h("div", { class: "dev" }, h("h2", {}, "Experience Gmail on any device"), h("p", {}, "The ease & simplicity of Gmail, wherever you are."), h("div", { class: "b" }, a(PLAY, img(LH("6kdr7g-ziKhTh0iWIXncqJh6Zd8Z-dkntyVV10lni6ZyBC8Q7uzQeY4Xv7EIAH6b0EQkUD6cUrHC8-GCLma-ZJrdNp16cciXoP_N", 512), "", "Google Play")), a(APPSTORE, img(LH("OBvpNtOKZRZjGFYGsmUrME8yMIjkk1BNQX89gt_lMN2afWCZDvE4SdZhPGXI72vDo-wWqML-8NDy2vU2zY2c6oOktAXZbcwU9ByMBw", 512), "", "App Store"))), img(LH("iL1Xp_9Muwf_6y0vevWU57mVtQPxFBBneZOpaKAqNnZCK1eplyapqRqLZ-Et4MqhharYZ_6u7J81RrYqSoxkB8IYOCr7vJztmFkFbw", 1400), "big", "Gmail on any device")), h("div", { class: "cards" }, card("Stay organized instantly", "See what’s new at a glance, and decide what you want to read and respond to.", "zG9tmtU51B7DAJxWqj5dSc32bZty6C5mo48vp1Tozqucoo379R5Gz_RDrIfxTy5wF_BZ5n-5M85S9mF_DICltakJI__JDuMhhzStsw"), card("Never drop the ball", "Get nudges that remind you to follow up and respond to messages, so that nothing slips through the cracks.", "wlf842vsNrbW70WRloE0LzJVOJfoL4lYMbqOEebLudfLr91bLou7Sb6Hu7f5C_uP9femGOjfLdns4B9q5rdzVBHx9NIGvOayPqbvRQ"), card("Take action right from the inbox", "View attachments, RSVP to events, snooze messages and more without opening any emails.", "eMssnzi4IyoZt6HzMXY08zo331ZHTIkoQxxQHE01r_tdFIRFYDkud-XAXGDZ5xqzzreeOLNoLALdIBkAh5K2Zc_sIe3UXQKs7eH7pQ"), card("Avoid suspicious emails", "Gmail blocks 99.9% of dangerous emails before they reach you. If we think something seems phish-y, you’ll get a warning.", "ZHgljkXzHMWWG85lNChWkL0ENd93Ia0C4xGx0xA0kMT5CufJXvomTqMgo-vxaAVVFTzkqjDU1kCwg93JdMDdmcojVZdL-JPs_LlmSEk")), h("div", { class: "go" }, img(LH("77FaGP4LKMII9u0429XIC1nf7_IuHKhS-I_-9Ak_Q66P6G87k4JL7I1VCAyg4aIdX8NWpYupmdkcQAB1YpL4kb8qPEBM1CN0-iI5", 128), "", "Gmail"), h("h2", {}, "Get started with Gmail"), h("br"), a(SIGNUP, "Create an account", "bbtn"))), h("div", { class: "ft" }, h("div", { class: "in" }, a("https://policies.google.com/privacy", "Privacy"), a("https://policies.google.com/terms", "Terms"), a("https://about.google/", "About Google"), a("https://about.google/products/", "Google Products"), a("https://policies.google.com/", "Our policy"), a(HELP, "Help")))]; }; } else { // 2020-2022: "Secure, smart, and easy to use email" font = "Google+Sans:400,500|Roboto:400,500"; title = "Gmail: Free, Private & Secure Email | Google Workspace"; fav = A.fav2020; css.push(":host { all: initial; display: block; font: 16px/1.5 Roboto, Arial, sans-serif; color: #202124; background: #fff; }", "* { box-sizing: border-box; } a { text-decoration: none; color: #1a73e8; }", ".nav { position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; height: 64px; padding: 0 24px; background: #fff; border-bottom: 1px solid #dadce0; }", ".nav .lg { display: flex; align-items: center; font: 400 22px 'Google Sans', Roboto, Arial, sans-serif; color: #5f6368; } .nav .lg img { height: 24px; width: auto; margin-right: 8px; }", ".nav .r a { font: 500 14px 'Google Sans', Roboto, Arial, sans-serif; color: #1a73e8; margin: 0 12px; }", ".bbtn { display: inline-block; background: #1a73e8; color: #fff !important; font: 500 14px/36px 'Google Sans', Roboto, Arial, sans-serif; padding: 0 24px; border-radius: 4px; }", ".obtn { display: inline-block; color: #1a73e8; font: 500 14px/36px 'Google Sans', Roboto, Arial, sans-serif; padding: 0 24px; border-radius: 4px; }", ".nav .r a.bbtn { color: #fff; margin-right: 0; }", ".in { width: 1180px; max-width: calc(100% - 48px); margin: 0 auto; }", ".row { display: flex; align-items: center; gap: 60px; padding: 90px 0 0; } .row .t { flex: 0 0 38%; } .row .i { flex: 1; } .row .i img { width: 100%; display: block; }", "h1 { font: 400 56px/64px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 24px; } .row p.s { color: #5f6368; font-size: 18px; line-height: 28px; margin: 0 0 32px; }", "h2 { font: 400 36px/44px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 32px; }", ".tab { border-left: 2px solid #dadce0; padding: 0 0 0 24px; margin: 0 0 24px; } .tab.on { border-color: #1a73e8; }", ".tab h4 { font: 400 20px/28px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 6px; } .tab.on h4 { color: #1a73e8; } .tab p { margin: 0; color: #5f6368; font-size: 14px; }", ".three { display: grid; grid-template-columns: repeat(3, 1fr); gap: 48px; background: #f8f9fa; padding: 64px 48px; margin: 90px 0 0; }", ".three h4 { font: 400 20px/28px 'Google Sans', Roboto, Arial, sans-serif; margin: 0 0 8px; } .three p { margin: 0; color: #5f6368; font-size: 14px; }", ".ws { padding: 80px 0 0; } .ws p { max-width: 900px; color: #5f6368; }", ".faq { display: flex; gap: 60px; background: #f8f9fa; padding: 64px 48px; margin: 80px 0 0; } .faq .l { flex: 0 0 30%; } .faq .q { flex: 1; }", ".faq details { border-bottom: 1px solid #dadce0; padding: 16px 0; } .faq summary { cursor: pointer; font: 500 16px 'Google Sans', Roboto, Arial, sans-serif; } .faq details p { color: #5f6368; font-size: 14px; }", ".end { padding: 80px 0; } .end img { height: 40px; } .end h2 { margin: 16px 0 24px; }", ".ft { background: #f8f9fa; padding: 24px 0; font-size: 14px; } .ft a { color: #5f6368; margin-right: 24px; }"); build = function() { const tab = function(on, t, p) { return h("div", { class: "tab" + (on ? " on" : "") }, h("h4", {}, t), h("p", {}, p)); }; const q = function(t, p) { return h("details", {}, h("summary", {}, t), h("p", {}, p)); }; return [h("div", { class: "nav" }, h("a", { class: "lg", href: "https://www.google.com/gmail/about/" }, img(A.m2020, "", ""), "Gmail"), h("div", { class: "r" }, a(WORK, "For work"), a(SIGNIN, "Sign in"), a(SIGNUP, "Create an account", "bbtn"))), h("div", { class: "in" }, h("div", { class: "row" }, h("div", { class: "t" }, h("h1", {}, "Secure, smart, and easy to use email"), h("p", { class: "s" }, "Get more done with Gmail. Now integrated with Google Chat, Google Meet, and more, all in one place."), a(SIGNUP, "Create an account", "bbtn"), a(WORK, "For work", "obtn")), h("div", { class: "i" }, img(LH("A0azUqR4LXtIZAhqh7yPEihFjaPGeTZj0n1fLRWGtPkPlpoYCSu42R_dUp4OQEocrAnLq1r2_JC8pdwhgtQlTYQcMd8sLW1FDmgI9lCB", 1440), "", "Gmail inbox"))), h("div", { class: "row" }, h("div", { class: "t" }, h("h2", {}, "Email that's secure, private, and puts you in control."), tab(true, "We never use your Gmail content for any ads purposes", "Gmail uses industry-leading encryption for all messages you receive and send. We never use your Gmail content to personalize ads."), tab(false, "Gmail keeps over a billion people safe every day", "Gmail blocks 99.9% of spam, malware, and dangerous links from ever reaching your inbox."), tab(false, "The most advanced phishing protections available", "When a suspicious email arrives that could be legitimate, Gmail lets you know, keeping you in control."), tab(false, "Best-in-class controls over emails you send", "Confidential Mode lets you set expirations and require recipients to verify by text. You can also remove options to forward, copy, download, and print.")), h("div", { class: "i" }, img(LH("FU-s_R5k9ZDky6RTNWsdrN8xa9Jp7C2mwd_Kj9NHQe6Cw_EipUIFLjv0L7fGBh7KloVVACyAI7AIaXMC_bPGKVkX6aebI-4f-UurLRbk", 1440), "", ""))), h("div", { class: "row" }, h("div", { class: "i" }, img(LH("CrwbMhADZXW8toGdUQnyQn3L5vocK-6lZRQQD2AmAcLkxD7m7zI4GMLLjmxfiQ4JvLCjZNk6AwjpZD3rnJA6Eu5GHA7r2D-CBnzbjdIj", 1440), "", "")), h("div", { class: "t" }, h("h2", {}, "Get more done with Gmail"), tab(true, "Stay connected and get organized", "Start a Chat, jump into a video call with Meet, or collaborate in a Doc, all right from Gmail."), tab(false, "Never forget to reply", "Gentle nudges help you stay on top of everything."))), h("div", { class: "three" }, h("div", {}, h("h4", {}, "Works with other tools"), h("p", {}, "Gmail works great with desktop clients like Microsoft Outlook, Apple Mail and Mozilla Thunderbird, including contact and event sync.")), h("div", {}, h("h4", {}, "Stay productive, even offline"), h("p", {}, "Gmail offline lets you read, reply, delete, and search your Gmail messages when you’re not connected to the internet.")), h("div", {}, h("h4", {}, "Experience Gmail on any device"), h("p", {}, "Enjoy the ease and simplicity of Gmail, wherever you are."))), h("div", { class: "ws" }, h("h2", {}, "Gmail is now part of Google Workspace"), h("p", {}, "Collaborate faster, from any device, anytime, all in one place."), h("p", {}, "Google Workspace is a set of productivity and collaboration tools that helps individuals, teams, and businesses stay on top of everything. It is a flexible, innovative solution that includes all your favorite apps like Gmail, Calendar, Drive, Docs, Meet, and more."), a(WORK, "Learn more")), h("div", { class: "faq" }, h("div", { class: "l" }, h("h2", {}, "Find the answers you need"), h("p", {}, "Browse tips and step-by-step guides made for both new users and power users."), a(HELP, "Help Center", "obtn")), h("div", { class: "q" }, q("How does Gmail keep my email communications secure and private?", "Gmail has always had strong security as a foundation. We work hard to protect you from spam, phishing, and malware, before they reach your inbox."), q("Do you use my email for ads?", "No. While you may see ads in your no-cost Gmail account, your emails are private. Google does not scan or process Gmail content for advertising purposes."), q("What if I want to use Gmail for work or my business?", "Gmail is part of Google Workspace where you can choose from different plans. In addition to what you love about Gmail, you get a custom email address (@yourcompany.com), unlimited group email addresses, 99.9% guaranteed uptime, twice the storage of personal Gmail, zero ads, 24/7 support, Google Workspace Sync for Microsoft Outlook, and more."))), h("div", { class: "end" }, img(A.m2020, "", "Gmail"), h("h2", {}, "Show the world how it's done.", h("br"), "Get started with a more powerful Gmail."), a(SIGNUP, "Create an account", "bbtn"), a(WORK, "For work", "obtn"))), h("div", { class: "ft" }, h("div", { class: "in" }, a("https://policies.google.com/privacy", "Privacy"), a("https://policies.google.com/terms", "Terms"), a("https://about.google/", "About Google"), a("https://about.google/products/", "Products"), a(HELP, "Help")))]; }; } // ---- put it up: today's page kept out of sight from the start, the period's in its place const veil = document.createElement("style"); veil.id = "ugf-gma-veil"; veil.textContent = "html, body { background: #fff !important; overflow: auto !important; height: auto !important; } body > *:not(#ugf-gma) { display: none !important; } body { margin: 0 !important; }"; const putVeil = function() { const at = document.head || document.documentElement; if (!at) { return false; } at.appendChild(veil); return true; }; if (!putVeil()) { const w = new MutationObserver(function() { if (putVeil()) { w.disconnect(); } }); w.observe(document, { childList: true, subtree: true }); } const setHead = function() { if (document.title !== title) { document.title = title; } const head = document.head; if (!head) { return; } head.querySelectorAll("link[rel~='icon']:not(.ugf-gma-fav)").forEach(function(l) { l.remove(); }); if (!head.querySelector("link.ugf-gma-fav")) { head.appendChild(h("link", { rel: "icon", class: "ugf-gma-fav", href: fav })); } if (font && !head.querySelector("link.ugf-gma-font")) { head.appendChild(h("link", { rel: "stylesheet", class: "ugf-gma-font", href: "https://fonts.googleapis.com/css?family=" + font })); } }; const start = function() { if (!document.body || document.getElementById("ugf-gma")) { return; } const host = h("div", { id: "ugf-gma" }); const root = host.attachShadow({ mode: "open" }); root.appendChild(h("style", {}, css.join("\n"))); build().forEach(function(n) { root.appendChild(n); }); document.body.appendChild(host); setHead(); // today's page keeps changing its head (title, icon): the period's put back each time new MutationObserver(setHead).observe(document.head, { childList: true, subtree: true, characterData: true }); }; if (document.body) { start(); } else { const wb = new MutationObserver(function() { if (document.body) { wb.disconnect(); start(); } }); wb.observe(document.documentElement || document, { childList: true, subtree: true }); } // (and if today's page replaces the whole body, it goes back) setInterval(function() { if (document.body && !document.getElementById("ugf-gma")) { start(); } if (!document.getElementById("ugf-gma-veil")) { putVeil(); } }, 1000); } catch (e) { try { console.log("[Gplex] Gmail about page: " + (e && e.message)); } catch (e2) {} } })(); // ---- end Gplex Gmail about page ---- // ---- Gplex sign-in page ---- // (5.8) Google's sign-in page in the period's clothes. Only the look changes: the email // and password boxes, the buttons and everything they do are Google's own page, left in // place and restyled. Gplex never reads, moves or submits what is typed, and the security // messages Google shows (unusual activity, unsafe browser, CAPTCHA) stay on the page. (function ugfSignInTheme() { try { if (window.location.host !== "accounts.google.com" || window.top !== window.self) { return; } const p = window.location.pathname || ""; if (!/^\/(v3\/signin\/|signin\/|ServiceLogin|AccountChooser|InteractiveLogin|lifecycle\/steps\/signup\/|signup(\/|$)|SignUp)/.test(p)) { return; } const gv = function(k, d) { try { const v = typeof GM_getValue === "function" ? GM_getValue(k, null) : null; return v === null || v === undefined ? d : String(v); } catch (e) { return d; } }; if (gv("UGF_SIGNIN_ON", "true") === "false") { return; } const L = gv("UGF_LAYOUT", "2015"); // the sign-in page of each period // sg07 to early 2011: the blue box, "Sign in with your Google Account" // sg11 late 2011-2013: the grey box under the grey header, red SIGN UP // sg13 2014-2018: "One account. All of Google.", the card with the round photo // sg19 2019 on: the Material card of 2019-2023 const era = ["2019", "2022"].indexOf(L) > -1 ? "sg19" : ["2014", "2015", "2015L", "2015N", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(L) > -1 ? "sg13" : ["2012", "2013", "2013L"].indexOf(L) > -1 ? "sg11" : "sg07"; // the new logo (and the new app icons under the card) from September 2015 // (6.1) the sign-up pages too const SIGNUP = /^\/(lifecycle\/steps\/signup\/|signup(\/|$)|SignUp)/.test(p); // (6.2) signing in to Gmail: up to 2013 that was Gmail's own page, "Welcome to Gmail" const GMAIL = !SIGNUP && (era === "sg07" || era === "sg11") && (/[?&]service=mail(&|$)/.test(window.location.search || "") || /[?&]continue=https?(%3A|:)(%2F|\/){2}mail\.google\.com/i.test(window.location.search || "")); // (6.2.1) From 2014 a signed-out visit to Gmail showed Gmail's own page (google.com/gmail/about) // rather than a bare sign-in box. Gmail's automatic hand-over here carries "passive=" (a click on // "Sign in" never does), so that one visit goes on to the period's Gmail page instead. if (!SIGNUP && (era === "sg13" || era === "sg19") && gv("UGF_GMAIL_ON", "true") !== "false" && /[?&]passive=/.test(window.location.search || "") && /[?&]service=mail(&|$)/.test(window.location.search || "") && /mail\.google\.com/.test(decodeURIComponent(window.location.search || ""))) { let last = 0; try { last = parseInt(gv("UGF_GM_ABOUT_AT", "0"), 10) || 0; GM_setValue("UGF_GM_ABOUT_AT", String(Date.now())); } catch (e) {} // (never twice in a row: a second hand-over within the minute stays on the sign-in box) if (Date.now() - last > 60000) { window.location.replace("https://workspace.google.com/gmail/"); return; } } // (6.1.2) the logo of May 2010 on the 2010 layouts; 2009 and Late 2009 keep the old one const logo2010 = ["2010", "2010N"].indexOf(L) > -1; const newLogo = ["2015N", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(L) > -1; const yearOf = function() { const m = L.match(/(\d{4})/); let y = m ? parseInt(m[1], 10) : 2010; if (L === "2007") { y = 2008; } return String(Math.max(2005, y)); }; const A = {"avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAAAAAB3tzPbAAACOUlEQVR4Ae3aCQrrIBRG4e5/Tz+CBAlIkIAECUjoSt48z/GZeAvnrMCvc6/38XzxAAAAYC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAAAAAAAAAAAAAAAAPsagz4V4rq/FmCLTj/k4vYqgCN5/TKfjlcAJKff5pJ5QPH6Y77YBiz6a4thQJ30D03VKmB3+qfcbhOwO+l+waP/+VsEBgDV6USumgNMOtVkDbDoZIstQNHpiimA1+m8JUBSQ8kO4HBqyB1mAElNJTMAr6a8FcCmxjYjgKjGohGAU2POBmBXc7sJwKrmVhOAqOaiCUBQc8EEQO0JwPMB4ADASwhAe3yR8VPiP3/M8XOaPzQd/lLyp56xSuvnUGK0yHC313idCw6umNov+bhm5aK7fdWAZQ/WbdoXnlg5Y+mvfe2SxVdWj20FAAAAAAAAAAAAwFQAAJSS0hwmfVMIc0qlmAfsOQWvP+RDyrtNQM1L0D8WllxNAWqOXifzMVcbgG3xaswv22jAFp3a6zFteYw8fQ9DM6Amr275VG8GlFmdm8uNgDzpgqZ8EyB7XZTPNwDKpAubysWAOuvi5nolYHW6PLdeBjiCbikc1wCK0025cgUg68Zyf0DUrcXegKibi30Bq25v7QnYNKCtH+BwGpA7ugFmDWnuBSgaVOkECBpU6AOoGlbtAlg1rLULIGhYoQvAaViuC0AD6wE4Xh1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA194CuqC6onikxXwAAAAASUVORK5CYII=", "gTrans": "data:image/gif;base64,R0lGODlhPQAZAPcAAAAAAP///+ju+urv+s6hotaqq8eho6SFh9yztcymqMqvs8Orr+nN0s21ubKgo+fQ1uPN09TBx8zCyene5sa9xOTb5Ojg6eTf6N3a5Onp8uLj7N/i7MXS9sPM5ePn8+ru+efr9jxcqWiEzrvF3gBF2ABBzAE+wgE5sgJE0wI9vQRJ3wZCwgpK0wcuhAk6oww/rw1DuBdPxxM+nRtV0yJi7y1u/R1GniFLpjNiyEN9/EN89TJbsytNlkd66DxmwEZ120Bmt1iG6kVkq1uB01h8y1BusVV1unGb9WyS5nKY6XiW15Cw9XWItIugz5yw3qzB77DC68LU+6u62rPC4sXU9qi10cPS8sTR7bbB28rV7eTr+uft+uvw++jt+CBTvzV09zBq4jx16UuI/kZyzURtxFF/4F6R9FyF3GKM5GmU73Gg/mSI1H6l9oat/ISq94yy/Iym3Ka75rvJ5s/e+8nX8sbT7LO+1dbg9dPd8d7l893k8uLp9+ft+X6r/LDK+73S+crb+9jk+tDa7eDp+t7n99ri8ePr+muk/ZG6/ZrA/MXa+93o+ufu+ejt9WGc93uw/dPj++Ts+OXs9ebp6+nu8Zeqs7zMy83h3rbIxbjKx7THw7DDvqm9t7zbzI2vmZnFpX+wi5Pan33WiGDHalmvYn3Zh4HZiYvckxB8GBJ8GYXbjApzEBR/GRZ+GxmDHhyKIens6ebn4+zw0L29t/DrnerozOvp2O/PF9jVw9zDScm/jtbMnqukhOvjudDJps+mA+O7BeO3BbWUB8GdDtu1HuC8Ktq4Mb6kN9C5VremXMy7c6aaaujZluDXr6mOJYt7RLajYZN3HMYbA74aA60XA6oZBZsYBr8iDMIqFbUrF9Y0HtA8KLc3Js1NO6YjErU/MexVQpI2K7dJPLpPQddeUJhFO+92afCDdvWXi8VjW8xsY55XUa5kXfGOhcl8dqVmYc+Be+GOiOufm8qOi+GZlrV8eqh3deunpfCsqeyppuywruirqvC+vfDAwN7Y2P///yH5BAEAAP8ALAAAAAA9ABkAAAj/AAUIHEiwoMGDCBMqPMhlgMOHECNKnEixYkUuBQcs3MixI0GNHz2KHGkQ5ECTc5YgORPkiB9DJDl2KkWKlKSDJgVq1NJnTBM5deIMUUEDzpaYCiWFelUJYU4BAwY5EqKnIBQXTI4iTbiUk9OMj25ULUhIytaFp1xt+kpQURgmHRnsu8fAIKxetHo1KmgI0Jw5UTjwSatp4AR9+R5ALYjIi52NGc65KzBvG7kLA2kh87XLWDFcAxMhSaKDBhEnfFS1KiwAnzoC8LTBe6rmRYeFXc69G4hA2jgQAmg50yBwErFh/gQkIrNHwBMURgSaaoVJAL9xGwSas9agYI4TIxby/+tGgSC5agoa3VpGkNkvaJHEwBWo48RtU6kyCTC3e4K8dAdgUJAOJjSxEDrcSECQPNjYUwswvBBkSzDOCFJDEQO98QIWApSCiiUZgPNOAe4k4MFiBB1BAhAFzcHGEX0E0UE72SxAED/b2NNLMOwNRMkt0ehBAwx3CNQHD3l0+GGI4RB3UkFUqJBCHATdcQUVX7jABz3X2ENQP9w4EAswznTh4y3PCBAHDDj84ccY4QkgCir6gVNNBCF9hEQJMVjBlxgyeFABNt5gJhA64WSXizC+DCSLMLMIlEUTZoARpwCmsGKJAPRM842hAnyQUSRDmMDCEjAJtMgXLRQiAALeiMQDgQX6iFOeALEcI0wzsNSSS4QEtcHCGkcxMsoqoFzSRTrUYBPPPvRAkJFATuxwwgw9pJEEGkZUEolA/tTDjjvzCDiQJLoko4wuoA3khxtowFDCD4RI8oknnnQikAHrlPNOA0/lJAgWUkxRByFnCQCJGURMgQceRJQgwkYBJ5zQFoeEUFAYNlA8rcUHBfIFhsHy4HGeIBekBRgpPDEQJD9UcfKTKRtEhw8rhGFGGmeYNbNONR90hRJlnKHEFB1VHDTIOQUEADs=", "gFlat": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAATCAQAAAB12ObuAAAB2klEQVR4Ac3QBW6baRiF0WNX+cPMzDG1KVOYmRmssd/9b2KE3zDj2cCjeyWZWUs2fDKj2Z/Val2oG/cLZj37bFKvcZvC1l+IrXv2C0pqRiQq1uX+/lCXuk8SNKcM5OUloFnH7wy90Cz5Kgz6eZP2bXlybBAw7NKOS08qgE5fbAghbMul0KBzJx5d6AFuhGY/560zL5Czo24Ug2p6wazwGe2qhtHpyXJaRKdvDIA9T5qgLrT4qQ51RUCXcCPnxDGAI6HXmmvAG2EghdadpweWNMGDMOKnSkIBwJUwIqSQ18J7F6ryYFyYTqFrFxYc+6QJYEtYAlBQFcI7r4S3APaFGeEGwLTwybLwBlTUtKTQpWeZDMmwUNNDUhR6jAoHAHZUNXgUWgGTwqTMjnBiz5VeUmhJKPiRz8KDQaSQbhyqGwF5NxZRSet57wjQqiAsANZV0aGqasCPLKoKe8oKXjvypAOZLc/eKTj2Xi4dtK5gy5YMQKe6O93IXAnv9Br2KGz5akm7JG9A0ZKSgn6JTjMmtUo0GFLQAci8suGzJTWPuvQrKJjXgLxpBVMyf1mLO8vyoN+TDf+QZaEdwGcH/iEbwgyg2YOyf0iLS+HCphN1X/yDcsYVvLGg1f/Bt27VTEW2KqxCAAAAAElFTkSuQmCC", "strip14": "data:image/png;base64,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", "strip15": "data:image/png;base64,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", "nav09": "data:image/png;base64,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", "logo10": "data:image/png;base64,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", "logo13": "data:image/png;base64,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", "logo15": "data:image/png;base64,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", "check": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAtklEQVQ4y2P4//8/A7Ux1Q0cxoaCADIbCUgCMTvVXAoE5kA8CYidyXYpGrAH4iVAHIXiCwoMDQTimUBcBsRMlBrKCsTpUANzkC0j11BuIK6EGlgKsoAkQ4FgChD7AzELVI8YEDdDDawDYk6YQaQY6gg1oAqILYC4D8oHGcyLbBAphoJAKtQgGO4EYiHk2CLHUJAXm6AG9gCxNHoSIMdQEJCFGqiALaGSayjMxQwUGzq0S6nhZygA2ojsbh6J67kAAAAASUVORK5CYII=", "fav1999": "data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "fav2009": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbUFHBwcFQAAABoAAAAaAAAAFgAAAA8AAAAWBAAAGwIAABoAAAAXAAAAGQAAABkAAAAaAAAAGg0NDRiOjo4JJiYmDwAAABQAAAATAAAADQwCAR1YFRB4nCsqua0yLMSbLCyxYxoYfBgFAiwDAQAUAAAAEgAAABMAAAAUBwcHEhQUFA0AAAAOAAAACxMEARayLy/F7T9C/640K7FuJR1pZiMgYpczMZqeLSzBIAcFPQEBABAAAAANAAAADgAAAA4XFxcJAAAACgAAAABbKSNY/1ZO/3MdHY8AAAAAAAAAAAAAAAAAAAAAjzc2lHwdG7oDAAAVAAAACAAAAAoAAAAKFxcXBgAAAAcAAAAAVj43Tfx6df87BQFmAQIAAgAAAAQAAAAEAAAAAI0vJomvLCftCwEAHQAAAAQAAAAHAAAABxEREQQAAAAEAAAAAwYEAAi4bVm0uT8/4UwOC1wnBgMlFAQAEF4YGmnwQ0X8niQfxQEAAAgAAAADAAAABAAAAAQzMzMCHh4eAh8fHwMAAAAAKSglBJVbWGfQX16qxktJsLItKNTqP0X/5DxE8VklJTsAAAAAHx8fAh8fHwIfHx8C7+/vBO3t7QTt7e0E7e3tBOrr6wIAAAAAAAAAALWHgkH+VFD/xjI226J1dDYAAAAA7e7uBO3t7QTt7e0E7e3tBP///wn///8K////Cv///wv///8Eybi3HHw1LHeySkjC/nd2/34iIZ1rbGkJ8fHxCv///wr///8K////Cv///wr///8R////E////xP///8P9OTiHtFGSNHPKS//15KSeP7k4Evgb3DOXh4cjouJiCD9/f4R////E////xP///8T////Gf///xv///8b////Dvu3rnbrNCn/o1NTk9/r6wn///8C/9fXaqskJf9kTUxX7e/vGP///xr///8b////G////yH///8k////JP///xb/0MyT00JA/5Byblv7//8d////Fv7Ix3XUNjH/hFhVee/z8x3///8j////JP///yT///8o////Lf///yz///8j//DmZNphWv+Oa2ll4urpJPHy8iLwcWDF0zEn+7edm1f///8m////LP///yz///8s////MP///zX///80////M////y77u7KoxlhZyrV/f3XSc3Oy7z83/7w5NtymioZg5OHgOf///zP///80////Nf///yv///89////Ov///zr///84////M//T0m/3oaGk/bS0uv24ubPujouw2oqIoO3j40r///83////PP///zP///8K////Mf///z7///89////Pf///z3///80////Mf///zH///8x////Mf///zX///88////Pv///zf///8SAAAAAAAAAAAAAAAAI8AAACBAAAAAAAAAEAgAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "fav2010": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==", "fav2012": "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAAAAAAAAAA9IVCSvSFQuf0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULk9IVCSvSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQuf0hUL/9IVC//SFQv/0hUL/9Y1O//rIq//+7+f//eXX//vUvf/7z7X/96Fu//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vYwv/97OH/9ZRZ//SFQv/0hUL/9IhG//zbx//3om7/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97uX/+buW//SFQv/0hUL/9IVC//SFQv/5upT/+9O6//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+b6b//zezP/0iEf/9IVC//SFQv/1klf//ezh//vPtP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/3qXr/+siq//m8lv/5wqD//vTu//3t4//1klb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0h0b//vbx//zi0//1j1H/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2nmn/+bmS/////v/4sIX/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5uJH///v5//eoef/1jU//+82y//afav/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vXw//vOs//0hUL/9IVC//ekcf/96+D/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//728v/4sIX/9IVC//SFQv/4s4n///v4//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6yKn/+byX//SFQv/0hkT//eTV//vWv//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IZE//m6lP/5u5b//OHQ///+/f/6y6//96d3//SFQv/0hUL/9IVC//SFQv/0hULm9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSfSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAASCwAAEgsAAAAAAAAAAAAA9IVCAPSFQif0hUKt9IVC8vSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvL0hUKt9IVCJ/SFQgD0hUIo9IVC7/SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULv9IVCKPSFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVC8fSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvP0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YtL//i2jv/828f//vLr///7+P///Pv//vTu//3n2v/6zbH/96Nw//SFQ//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ekcv/+8+z////////////+9fD/+9K5//m9mf/4to7/+buV//vSuf/++PT//OPT//aYYP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2l13///r3/////////fv/+b2Z//SIRv/0hUL/9IVC//SFQv/0hUL/9IVC//WNT//84M///vXv//aZYf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vPtP////////////i0i//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//WQUv///Pr//OPU//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//eTV///////+9O7/9IVD//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//3m2P//////9ppi//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/718H///////3s4f/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vDn///////4soj/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//erff////////38//WTWP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//iziv////////////iwhf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rMsP///////eXW//WSVv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/4sYb///z7/////////Pv/9ZFV//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ixhv/+8Of//vn1//rMsP/4rH//9plh//WQUv/1j1L/+s2x//////////////////m9mf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SGQ//2nmn/+buW//vNsv/82sb//e3j/////////////////////v/5wZ//9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/83Mj////////////++fb/+K+C//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9ZRZ/////////////vTt//aaYv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/1lFr////////////6xqf/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ehbf/70bj//end//3o2////v3///////3l1//0iEb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5wqD////////////96t7/96Z2//WOUP/2nWf//NvH//zcyP/1i0z/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/96l6/////////////vLr//WPUf/0hUL/9IVC//SFQv/0h0b//end//3k1f/0iUn/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/8387////////////4sYf/9IVC//SFQv/0hUL/9IVC//SFQv/6w6L///////nBn//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC///69////////vj1//SIR//0hUL/9IVC//SFQv/0hUL/9IVC//m+mv///////e3j//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL///r3///////8387/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+syw///////++fb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/95NX///////vUvP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97OH///////7y6//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//i2jv///////N/O//SFQv/0hUL/9IVC//SFQv/0hUL/96Nx////////////+s2x//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IdF//zh0P//+/j/9ZJW//SFQv/0hUL/9IVC//SKSv/96t7///////738v/1k1f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YxN//vUvf/96+D/96Z0//WNT//3om///ebY/////////Pv/+LKI//WVW//0h0X/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//agbP/7zbL//enc//749P////////////////////////////3r4P/3p3f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8/SFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVCJ/SFQu/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC7/SFQif0hUIA9IVCJfSFQq30hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8fSFQq30hUIl9IVCAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB", "fav2015": "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD9/f2W/f392P39/fn9/f35/f391/39/ZT+/v4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Cf39/Zn///////////////////////////////////////////39/ZX///8IAAAAAAAAAAAAAAAA/v7+Cf39/cH/////+v35/7TZp/92ul3/WKs6/1iqOv9yuFn/rNWd//j79v///////f39v////wgAAAAAAAAAAP39/Zn/////7PXp/3G3WP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP+Or1j//vDo///////9/f2VAAAAAP///zD/////+vz5/3G3V/9TqDT/WKo6/6LQkf/U6cz/1urO/6rUm/+Zo0r/8IZB//adZ////v7///////7+/i79/f2Y/////4nWzf9Lqkj/Vqo4/9Xqzv///////////////////////ebY//SHRv/0hUL//NjD///////9/f2U/f392v////8sxPH/Ebzt/43RsP/////////////////////////////////4roL/9IVC//i1jf///////f391/39/fr/////Cr37/wW8+/+16/7/////////////////9IVC//SFQv/0hUL/9IVC//SFQv/3pnX///////39/fn9/f36/////wu++/8FvPv/tuz+//////////////////SFQv/0hUL/9IVC//SFQv/0hUL/96p7///////9/f35/f392/////81yfz/CrL5/2uk9v///////////////////////////////////////////////////////f392P39/Zn/////ks/7/zdS7P84Rur/0NT6///////////////////////9/f////////////////////////39/Zb+/v4y//////n5/v9WYu3/NUPq/ztJ6/+VnPT/z9L6/9HU+v+WnfT/Ul7t/+Hj/P////////////////////8wAAAAAP39/Z3/////6Or9/1hj7v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9sdvD////////////9/f2YAAAAAAAAAAD///8K/f39w//////5+f7/paz2/11p7v88Suv/Okfq/1pm7v+iqfX/+fn+///////9/f3B/v7+CQAAAAAAAAAAAAAAAP///wr9/f2d///////////////////////////////////////////9/f2Z/v7+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f2Z/f392/39/fr9/f36/f392v39/Zj///8wAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/g3+/v5X/f39mf39/cj9/f3q/f39+f39/fn9/f3q/f39yP39/Zn+/v5W////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f2c/f399f/////////////////////////////////////////////////////9/f31/f39mv7+/iMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gn9/f2K/f39+////////////////////////////////////////////////////////////////////////////f39+v39/Yf///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4k/f390v////////////////////////////////////////////////////////////////////////////////////////////////39/dD///8iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////MP39/er//////////////////////////+r05v+v16H/gsBs/2WxSf9Wqjj/Vqk3/2OwRv99vWX/pdKV/97u2P////////////////////////////39/ej+/v4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f3q/////////////////////+v15/+Pxnv/VKk2/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/36+Z//d7tf///////////////////////39/ej///8iAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/f390//////////////////////E4bn/XKw+/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1apN/+x0pv///////////////////////39/dD///8IAAAAAAAAAAAAAAAAAAAAAP39/Yv/////////////////////sdij/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/YKU1/8qOPv/5wZ////////////////////////39/YcAAAAAAAAAAAAAAAD+/v4l/f39+////////////////8Lgt/9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9utlT/n86N/7faqv+426v/pdKV/3u8ZP9UqDX/U6g0/3egN//jiUH/9IVC//SFQv/82MP//////////////////f39+v7+/iMAAAAAAAAAAP39/Z3////////////////q9Ob/W6w+/1OoNP9TqDT/U6g0/1OoNP9nskz/zOXC/////////////////////////////////+Dv2v+osWP/8YVC//SFQv/0hUL/9IVC//WQVP/++fb//////////////////f39mgAAAAD+/v4O/f399v///////////////4LHj/9TqDT/U6g0/1OoNP9TqDT/dblc//L58P/////////////////////////////////////////////8+v/3p3f/9IVC//SFQv/0hUL/9IVC//rIqf/////////////////9/f31////DP7+/ln////////////////f9v7/Cbz2/zOwhv9TqDT/U6g0/2KwRv/v9+z///////////////////////////////////////////////////////738//1kFT/9IVC//SFQv/0hUL/9plg///////////////////////+/v5W/f39nP///////////////4jf/f8FvPv/Bbz7/yG1s/9QqDz/vN2w//////////////////////////////////////////////////////////////////rHqP/0hUL/9IVC//SFQv/0hUL//vDn//////////////////39/Zn9/f3L////////////////R878/wW8+/8FvPv/Bbz7/y7C5P/7/fr//////////////////////////////////////////////////////////////////ere//SFQv/0hUL/9IVC//SFQv/718H//////////////////f39yP39/ez///////////////8cwvv/Bbz7/wW8+/8FvPv/WNL8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rIqv/////////////////9/f3q/f39+v///////////////we9+/8FvPv/Bbz7/wW8+/993P3///////////////////////////////////////SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+cGf//////////////////39/fn9/f36////////////////B737/wW8+/8FvPv/Bbz7/33c/f//////////////////////////////////////9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6xaX//////////////////f39+f39/e3///////////////8cwvv/Bbz7/wW8+/8FvPv/WdP8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vVv//////////////////9/f3q/f39y////////////////0bN/P8FvPv/Bbz7/wW8+/8hrvn/+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/cj9/f2c////////////////ht/9/wW8+/8FvPv/FZP1/zRJ6/+zuPf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39mf7+/lr////////////////d9v7/B7n7/yB38f81Q+r/NUPq/0hV7P/u8P3////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v5X////D/39/ff///////////////9tkPT/NUPq/zVD6v81Q+r/NUPq/2Fs7//y8v7////////////////////////////////////////////09f7//////////////////////////////////////////////////f399f7+/g0AAAAA/f39n////////////////+Tm/P89Suv/NUPq/zVD6v81Q+r/NUPq/1Bc7f/IzPn/////////////////////////////////x8v5/0xY7P+MlPP////////////////////////////////////////////9/f2cAAAAAAAAAAD+/v4n/f39/P///////////////7W69/81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9ZZe7/k5v0/6609/+vtff/lJv0/1pm7v81Q+r/NUPq/zVD6v+GjvL//v7//////////////////////////////f39+/7+/iQAAAAAAAAAAAAAAAD9/f2N/////////////////////6Cn9f81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v+BivL////////////////////////////9/f2KAAAAAAAAAAAAAAAAAAAAAP7+/gv9/f3V/////////////////////7W69/8+S+v/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/P0zr/7q/+P///////////////////////f390v7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3r/////////////////////+Xn/P94gfH/NkTq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NkTq/3Z/8f/l5/z///////////////////////39/er+/v4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f3r///////////////////////////k5vz/nqX1/2p08P9IVez/OEbq/zdF6v9GU+z/aHLv/5qh9f/i5Pz////////////////////////////9/f3q////MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3V/////////////////////////////////////////////////////////////////////////////////////////////////f390v7+/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr9/f2N/f39/P///////////////////////////////////////////////////////////////////////////f39+/39/Yv+/v4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4n/f39n/39/ff//////////////////////////////////////////////////////f399v39/Z3+/v4lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/lr9/f2c/f39y/39/e39/f36/f39+v39/ez9/f3L/f39nP7+/ln+/v4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/", "gmLogo05": "data:image/gif;base64,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", "gmLogo06": "data:image/gif;base64,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", "gmLogo07": "data:image/gif;base64,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", "gmLogo2": "data:image/gif;base64,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", "gmTalk": "data:image/gif;base64,R0lGODlhMgAoANUAAGKc//n9/9Ph/7XO/4+8/+/2/8XX/4Sw/9/s/6XG/3qo/73W/87e/97n/+bv//////f3/63I/5q+/421/2yk/9bm/7fU/8Tc/+/x/57D/63N/4Wz/3Kl/5S5/2mf/9Dj/5S+/3us/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAAAyACgAAAb/wIdwSCwKA8ikcclsOiGOCmNKnSIKAad2G2gsvguDQFApMy6XrwCzbRcFkcSi4oAUIXgMQjCILBxuWw4JIH9ZTAUFCFcFDQMSFgWBTBcTCYBtGFICWBUSHRWTRRYhC4eBGAxzeAkhBqJCCyEXsEMVFhcYAQMcC6IfpbVECF8IDxEUtG4YGxmnwg+3FggBHRzGbRYHmNBCEAwWCwUOHB12WgUbGt1FxAsfARoeAlsMB6HsQxBpfw4UEs+WWCDAJp8tAwYqQJigQJKTR+cMPnDHAEIGD/iaDMgQkR0UcBc+YDAwYZouJhs7CisgYIqABnXwKPqAhpoRCxMKQvsw4MKi/ysBHxT4oEFcEQYh6K0ckIBOGSxNHDDlJnSCs1oQElxq4DOoEQgLMlC1wCHjJA0EoizA5kaDhlPpNjgMxGBDBWJs3TjIoFRIBQ4SVD6RkKAAGsFbFiToeIFCB6pOKmxgQKxBrQZijypQcMFrkQUHGgj4U8tBhLxCEEhQ0MEAAsSxJjRQBVlvhNpCGEg4cCCDBgOW30wos/Zy5iYIDBAKkbNIAQl/FjDw7MTC4jZZD8zddUaCg9G4nTjo8MFNtatCLACwEM9CqgtztxTIEIH6UQ4MhizwEPgBhgEMpMJAfFFlIIFOWmBwAAFZQCCPBHMVwEAFGDTQAIFEBDASCJcE0msKNR9s4EEEgjlQRyIBdWEAUxlMF4gBHETAQAcUHJAfE0kkUUdqHSSQEIZOGOCBBwcwZ1QgbmWhWnmwLGCJBQrBIhmJDwwwQC1KQFPBBBIsIkFfEgUyCAEadLBBcGFOUoEGEsRoX5qILLJEEAA7", "gmMob06": "data:image/gif;base64,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", "gmMob07": "data:image/gif;base64,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", "gmSpam": "data:image/gif;base64,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", "gmCell": "data:image/gif;base64,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", "gmStorage": "data:image/gif;base64,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", "gmGrey": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAAtCAMAAACanCAeAAAAaVBMVEUAAADt7e3s7Ozz8/P29vaorbWjp6/ExsjFxsm3ubyzuMGusbijparg5fHExcfj6PSEh46eoqr4+PjN0t319fXh4+amqrLGy9bGx8ru7u7w8PDo6Ojr6+ucnqPAwcTKy81+gYfq6ur5+fmcovXVAAAAAXRSTlMAQObYZgAAATFJREFUeF7s0McRwDAIBEBKOEA5OfRfpEdyD7zYEpa2zMBtxgGc6ac8r97H8RhwMV6T9dyj1CDymnEioRbs/bSamHNtJSKdI3zswTEKACEMBMDgHSshkEabFf3/N/2FaXbmf07mPsPC+RUQehiSq4Cww5CNBeSyQ8dEAMAgEMA6URPvXyeHAkaWREIy+T8X2PKRLx/58pEvH/nykS8f+fKRLx/58uU3O3RMAwAAwgCMcJD5V4wKwtNKaPoFuctHvnzky0e+fPnLDh2lAAhCURS8Nyi0l+CPItT+19kufD9nljDLKbC254N88smfxSlQpu7qFKi3Wv+cAEcfUoQTIEJSO5/Xm2H87dKxDQAgCEVBGor/gtGOzv3HNBpnoOJmuPBpFyukXaZJsbBvJHiZBvnaH3elQWP8rP+8AAAAAElFTkSuQmCC", "gmFeat": "data:image/png;base64,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", "gmTrans": "data:image/gif;base64,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", "gmGoogle41": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAApCAYAAADkig0OAAAYeElEQVRYw+1ZaZhU5ZV+v+/eulXV1RsNdEPTAi2IuKAiKsYF0YgQRQ2aEI1OjJpoVFwSjcZlBqPGjI5LxnHXREWig0aNihuikUU0iKKsNk0v9FK91F53v/db5ge3SNl2Q+tgMhP9nqeeB6q7v+W857znnPcQfIl19t1+xHXMCoeRUEgaPESlvuiGOhOAxDfrM+s7755UGg6XHi9UOo9JMtzlXGb9PFrijdzstu/3bk4slN2eD0DsjvPIYH7p3N8Zo0xfm57OY7ZhYJLryhG+j1IpZVihkOGwzEYjvCMaFS1h6nwoPHNlb9OK1asX/ehrDfL0v0wLJ43saemezAkirOxfVjf0EBrS0N3aCWt15hn/Hv1qAFkABgD+lQN6wX3O/kkrdHV7nPwg2eNprmm0EZZYLpzuBgW6zjlRoVRUS6XmMEGHTA1Fw9GKISFUVgGaypqIb7yY79ly/4cLp7cGHvh1BFcFEKm5cfR3rYP8J6VK4X6Sh3xXXsFeNRYD6AFg7a4IVfv78uKHZDjn8X/bHFeuamt2NT/fvZQlX3k8+eHVHwtmegB8ACwAiABQysZ+vxajzj6xJ7P/eemeIbWV1do4RSn/heUeeO4eJ2/5vZ9++67ud3/Wu7s88f/REgDc8NhS4mo6OAeISkE0+AAcAN7uArNfQM+526xN2fK/G1vp0fGmnEVyS27oWj739eBwI/AmPwCmEHFUb302pbc+u6Vi3FnP01GX39pj1s1SQgp82x1CJH6i2j0vAMgBsL9mkSoACFJCPSkBKSUkAQiFLPxsdx5GP0uxskYX0VcbW3F0fEvWFF2PXtG1fO4bAc93A0gCyAeguoF3eUVgZ3JNf9ycWH7Y2RqannAzCRCvs5133X5J8qP5CQDK1zWfCikhZeDKcodH73bH3hGhF/yXiCQs8UxnLz2ws1GHor98W/eaq1YHIGYC0OQgvNEB4CtaNKNQcyvr/s3lRtvibUF0ul9fQAEp5A5gyVfEUTsitNcUtybzdFrXNheK17QivuKcVwGkvwCYO9Z+57QpiiLeZt23n2y0Lf40SPzZgKq/llUvlwUwtwP6VRlBBYDTbnEOTJv0knRCwsmZAsnnnwSgByC4XxSEjU+M9gC8DiASfOUUFVFfy8WD6BQSgJS7OXP2ATRtKVcaLrR8yoMqE1t61t/xcZArnf9F0mZBrpVfZI/c/EsmEsM9gpv+GAFIFg23Z2z3o4kPPrHuy7Q+csOPhnJfP0k4+uFEurVCApJGOx2PbOhKOq/tc/qy9i/bUs29ywtJSYiERLZ7K2FMwvMAQxfImRWaY4ZCsvfubO9HtwtOXAixnXalkJCDkADsO3+piLx9rLS8o4QnhjNV1V0uNjdlUkuPeuK5rv7sqp44369J6ORU2wI824PCuz4RzDaDapT9L5xFDrZFce6br8qe9Hlo7b7IWblplGXYCcaFDHOlPhyOlNQOrUDv93/wUQbuI7Nef/OxFt3cpbJirr1oZET2XMuT685y85mcofsNjAk3rPKxFeXqqRVlpSirLs3m35z83OrN1q3HX9awbVfAzv13fQ/dCv0wa2CG4BjT2SUrS2LCjUTAtcp6+IYkloOSvMuI5zqNmpr8z1xy/YsAHCb5droVQXG0M3vccwMRqdzP5EfNP/d60uWW63ZLT1TGiDambEgF9o9FEy2nnbLg7s0bf3PP5qZcsS3UvMmnO45a7lgCknFId9umov7oK6fI/J3X7Utauh9la7d8q0nPPbwwnXzqP7a2tQOQM6oqKy8eXnPK5ETuqvKqIQcPj0UfePvAb81d7HT95NI1G9sGcjh//cUnKG7TH/zk1mFrN9q/mnNLz6tdGc6Ch5NHLy4/5OSDzd8Mq83vVRaNnX/M3nzmmofqzj/kwo53+svz593LqOnK67e04MpMUv+Q6a0vg5muDNXOIFr1nIqhIURLKPSs06V3rb+Pu7rjJZasyGy6uzmo7AlYGFI4kIIAggxoWfuBG4ehpWeh/LhxZoOevm3+tvb/fjmeyAMg908cf8SsvH7z0KphY4ao6pVXlddOtcY5cx9t6kwUbKFUHXjDRa5PD/NsAea4ENnlT1tdSxt2pxw1IJi/u25SOJ5e4q3dsu9bucRV0z/4ZMGqdC4ZnG022056USr14bihkXU1aTY7AhLSGKkf7dFpfpl8bU1GN/pGqr9h3rEqa3nJ722senqJef7sX3ctMxxpBinEAGC+9IHbElLVpftVuLNjUVauhFBeHbFP2mdc9J3nVji9xXtecC/Xsq58Yus2clm6s+33254ddUO+8aGN+abHNulb7nmtbNTR3dnc0G9bpkJsi8YIS3R2v33sw07i/Z6i9o6pp1bt56vu96QAZMoH4ngFW7xPi1Ui+8H5laQj/apc13TMe9meG498/+M/btGtfFDP6K8k04171JT+dW8Tp6lMhmXSHl0XDpU9nuxdVqhRqGWJeuYDnAsQAkB6bvBD8VWCad13fZXWnf+TbOqs3ZhMvfTdNRveDB6XCirrfPDJXLq1ZfGmqPPbTE8WwnYQzcvJP5VV9wMoK+5tzbUX1Spe21My31GyeVP+Tz++u/vjwBipoG0yAJgA8r993tzU0KNele8wpXRsqGBVs/dzHpx1aGh4cTuXssRt3Wnlh6m43tb56tRHAttkgz2TnUtPfDCqdv7Bs10QgDJ137NGz3ztxOAco8B0bAfdyu09TH+tTWfqTrqte2pnT2LjzNXr/hykvXRwXh5A7qoNW1clKHulK55Fc94C7+YXXFAzfBKAMABCfY+MZH6B1wlANeXvQbUynr6WJjITjLYE3tRzbwaXzwSgFqtQAoCzwEjck6asyc7bkJKjPEe/80D96NkAogVNOiLitxKWGmEnU1i+3l8Z7Jnrp7iTAPxjb8n/WXfoe17OASRHhLMD/m0OOTvYk554ozspkafz0gkBbnU3MCfJA8PqQeS5AExYq29VKc+CAESh8Ok+5yvhytKgLZTb25a/FUT9FoM3zztQ7c39mPVksNVzPmBC+sHdrSKmlB2nHDeSmGKfrYaLra5rrhfGK52OGwKgASCU+SLMmdiesEGgloyoGuwU5suu5L/+tI52Z38iUlnkdMf50DC2BR49UFUtX+zJ6FaJeNrxOATj4AKot8JnASgFoNofnz6Ger3fh6fDztns006/K9hzoLZLAvBsoi7wHQEwDiEkRkfYaUHkq4kcnaMbUC1DgEjbDqLN7XNH0bHswjZNc97mTABCgvmhsWWjT64vRA0ACCECdWEAQaA7cyZ0izLDRoKKrsAWO85KXXjWEamZs57yN+TWxfNOeFPYuP0JdJ95eb79+ldy+eYC5aoUftLzle10CwoaqZ+wI5F/RUtL5E5AwqzkWQO2L7xu5uuBsXaWs4UZ5S/yvLyWM6kISEQc5ZCp0eiIv9p2XmGJY8H0Euk78F3OdIsVNOedpQ6ZZeStkZI4gokIBKAxse+/HK2MeXIFz6WyZGqISnAGCBIb/jfh7vNtZijkv+UwnAbJITiPqNGa4QBCgR2lEHKn6hBJ5Q+VJoNwfEhJBAD20DFTSn4weuwZsjN/kbWyce9uy1z1nm9ccl2uY3Wecx7YzCrK1aBS+l2C8+2USylkaMQ+wUW+Mt1VJHNTRNYAsz1AQqlUFGUwObvZcxuEIuNCbEdeMFROIOHRADTpZfYGswHmQYEM1QzVIjsBYMd66A1nm1BI43Y6BISLkr1rZB0AzbVliWUGIyW1YrRWWqf11b93RFiIbiOEQHIOcMd181uNgX63743Ez88Iy3S+Xhg2BJcYxmntksMOOmW2rS3Krmm9bmNn/K/3GvE5U1o2zpvXsW15nvMcgASA3iBN2YU0pSrEXS9Y+AeEEBBKIHjV5Mq9zqzNNj6d/DJgHXN1XlUUIBSSIESC+RKmIdAd5ySZTIX1d/YxQ4nUnsJUIZhESJDofiUlw19HZpeMcEVjm7G2bv9PpSf34ELAFZISV4kBUKWVqdqOiISiSGXCSKU6MOhO9/3DUo/dfXakEVJO4j7gWYSEhSgBoEjufup7ynQlpECQspHVh9w4peOdn3QWoq54n5AWcgAJ7jmgPN1itL+eGGxh2RVPaSV5N0wEgeQSZZyMfiGVXriUy7cf7ujKZhlTi3TyAhX3q7ypiky+DRGF5ASEUghopWV7/nR2tvHphsEOXvf7cUqLlcjZPlOvSib4GC0MUl4m3XAEjhAStslh6Z6gYTYfwMs2YwY1JYhCoUrQceHo2EHSvKQEPVICnpCwJBe66rnwQByLGKp0oWgUqgaMHk4Ke9JdULmkGlJEAsyV8CzweAY6AEJF98vcG/ozAQ2gClWrZpwD4M0gN/ufSSNaZJTwfXDXBHWWPSm5Y32ulx+AK5Z0J6wZfihR5qGWSIJyTuvvamqLB1HoFTqyohQyIOtQK/7GJwrMTdz3IKUAKAVT9/1hSfWUqoB6d7r2Py+h2aZ/enur9b3O5q7O7ubmt+JNjYu3Neu5VEJOzGbkxM42NtE1O1vzSw/5EEAkIbDRdgQ4E1AJwViqTRoszSsErpQStpDIw8+sE3YvAOlYYouj+xA+QygM1A+XhwR70l3qnyHiQ0q4uoRuysTrmxAHIHreOO5tTUm/6pkGpO/BETXHjp+z8qxAo96x75m3mdT3Qhf6lgmNbH4sufaaJUE1/DdAZR/KLfr/ucs+5paQW12bA1Ki0qN73rnv+KkBeIX2x+lT/ff/lvh719hjZp/4iGeG7iaEgmohMBYbM+ywB+e1LT70xkEUFn7zsyOeAfByUHGGAdBh0977hanXH0iIgJ01QFlTs+SuCkAkJVtJPApJAJUQ1HnqUTURraTH8XYJqAolyoREljH0UndtE2NZACyeEsv2INylRIbVMEF1OZsyd1rJiGeWW6ldje0UFaXckDCTEl0WVm/ugQ7A9402j6UWXaCVnLLA1cuOo1qUGNHJtx90Xsuo6ljr78vKK+JlQ+sP6EzRa5IJdoQmPrwpsWrO80V9oz/AuBuQnyWjrCqWqTY/vYwQRCnB8aTspwCWBGD6X2R8Jr3kKwtUYrVw14b0GZSQhEf2unDMjIXHBN44IBVu+MPwgr95Qd+UANBNQ+XMszlckwHSh2QeL9DGgx3xFRlVrMlbHEIC5R4d/euxo48tLvMHvDBR6nXOkRIM62C8VJApD76kq1G36OtGwgf3OaIRUXHFyeE5faNpACNMNFMSRhrijW14IUg1HgDR9d513akPTp0b4htuhtOxydcTViIz9AojPPUdv3Ti5ng++pfGrXyW4n5wY2LVnEWBEJAKChU5UFT2XW3SfiknhZG3OUAJRpj0yD8fPOmMXdm/33lo1/u/ykZCjZdL32bMMSF8AUWlYVSc8OD4mY8fVmhadzHY9oJHWABs0AinFCB0+7iIEFKYusg/dqS9bSXuTSmXIeswEAEc5cUuiSg0tjOa33TskROEISd3Mh8dirH0j7axqsiDxfpuer2eFLl83Ae4xIF1/rkXzI7VBffvd3lvjposde/gVCuwxcST//kuPu4TFdzLN+V6Vp50R3LFwTPdpitnOo3zZ8eb25dsayPVHe0CVi7f27N8zuKAHtP91h4Sf9Nw+5k/fW/N5o6eqP9o0vSRdzhAKA41ojc9O2Xyd74IqAXPFW1vzHojqrXdxB0TvqnDdxgkIjVyyOxn9jv9tZmDAPWzGysEhGK71CXl9vxc9LwzPm18PR5z7otbPlIeR8wgByzde78bAJQMFFGhbj6/y3Ai7cT69AmWvq1IzmMA5Kl35Bo6PfXKXDuX6XYG6ns1t5xJbx9RRcv6y89yRb2imvk7klu42pnEO+e/ggcDuuyrY7Pgu4TR9ty61Ia7VzE/Eu1uZ8imBSS08qGTflG/U3FEVTlUClACxCigkb6/I5Y5mX9PKP6GDt1D2nJBPJQeaZc+tmraMZfOGbtHWX92adj/oJq1e02cUKjoix8p9JYnPqjc82TqOeGjOWMQgoIoWkyJ1Z1Wf+h5scoR49cltr7uDEYaHLLPZdMdE0dz14DwTVDR9b6XePn94NEcgPyTnnlnWklsuOdhihDAcEs55F/qaipKy8Nr3s/mdlBW84xvV81TR/yut03/8Ubk318geq9Zz/x2AMlgv4Jx5GPv+ptmHhjqDGX4UcyUkfIoGzdvTvjwU6eXN/z+NbursKe3dPTBJJ16Kr3ZOLahGc/8aDFu7jG367NFc9z+xoEeALfqgF/u77raNEoBqqpquGrKkdV7Td+QbniquT9A6WlVM6Bbs5BkABMgtVFaOWmPhpLT66T97RjwVsZdqZv2uDL1L5pHpxuuqGY+R8jjoWEmZpwwpPq7F06YUHvR+PHV80aNrb90xB7HXBQefrmVsad/An3Fi3ldx+cy83aUo8MOW3CmL/e+ScjYSBougRaLIVoWQnk531YRzS8gLPXcyocP2zBQCT31Z617tm7lD+hJ8wT4OQjuQyUN9xibL7oTQE9RkUIBxOZX1syt88KX1yAyqYaGUFampUSFtoRGQj3UEWO8jDstoetsLck+/Gsr+SddCiugNr2fgoEAiNwwQzloWrW8rLYCs6qqUVk+goKWhZuIpsWp71V7Obcu1cU+Xt6AR3+0CKuLhPBBTZnGzFhY7SjHrWK+Mk4Ja4iWqghpwgvxjls2P73fHZ+RCB+cWIO2nlfRbtfDkQQgBBVKiA6NGBBYJ9zIDbinc23wFvWk0rJRx5Pymyo87YwyooQqFRXlVEFEUQFC4HMBm/kyrVkLH/FTty42jcKEyiMD0HCkYq8LJtCKky7lcthsIUurSSgKNRJFOKahJEZFSZSt11SxlRIRpwoM5qNECDnSMsn4dMo/wM5lBVhvIxGprfDb17P88uVO16sbgoLB6+tEpZRWnhOtPG4U0abU0dD+lUIdrlDoFvimdrhrFzrZVR95boHS8v2I+H1BDQOInX0wGX/EKEyuHUbGDB+CISFNWHkLHWvasOFXf0ZTYHQ7cA5nIDDn/jY/OWeQ47J5HJXL8JG5tB3zTHMU9/kQkBBCsTKUVIRBiIQq2+7Y+uykG4N9BW4eVYI1uRps8cpgyzJIKJCQ0CCRlyn0slSR4C+DaU/svFjl4aMQOqFUqAdoXC1TIKWgIpOn/kdrYa18wTKbCtOjglo0UE4kQc6MRUecUBcZceJ0SUYfJVC+lyQlw0Cj5ZKEooQqlCrSgxQ5SJaS0o0TmdlMvPaNXmrpFqt9UW9RBWwFl7b7MRoJiqFIMOkIFxVHPPj4RUqJNwjBgwTOEg721Yr2lH32HFB5Ofsu48zejHJZays/XM9YvcJLL5NufC287rhvtmYks0uU8unn+6g7Xi0pR6Q0AsYkwnLj1e2vHX1/UbWrBvdQ+6FyP3hT8R2UglMGNtGK6gDWpwh1CzYlgzCIVmToiBKpLlFiEyqAijDgcck6TWa0WJLbhX61AEDhUD/4Nyu6sNzJmUrwaKVIYhPB3/IvMaclRW8pVqNE0X6fu8+5dxkh3ScPxJPK+S0NNnh+4z25Ty563M2sN4reVWAIdfgRL//SkxOuoJEyEEUDlVbSa75iWr7l+eY+jDSgYrUTDNQ+d5dFNv7M/dVdHMADL3ADjla506twp1fpo5MWjC76gMoHI5D3ObMA/G4bvfZxikGthI7fZUzl/NZPbYjsstt7V3z3qcKQuSiiC8YkiVUnz685+vk21zvgNoQQ8jmGhUfMPg4tz3cNQpzZFQZ8sH+gDnZAEnz8Is9BH5Fa4p9kzbgmfUhPml6cTXO4+d7m9KoznguATO5E3+Y9K057eMRx7+9t+7UXQjB4Trg2YDfjSwL6hRfdDV4v/5nABIB4L07MpgXMHANFpi0Q2nO7GFYIADal2ccJIUIyBipzThA09O91dxXfrM+tdJLVSqgQXIKolcMCeh0MbQqtdEzezhBAOD7LLtuwq+nI/5UI/adeGslv80wHgksIZdg+tcc8+q1BjvdQUlZ2MHM9qpD4W3rroubP9KPfAPqPWUS0vACWN7hjQkqikMqTb9n7pIWH70r+PHJex7h0L7mN8GyH333vnUVjr78boOQb+PqfqNV+++0LTWPEvUSNECVaitIKxRpakXogTHOLcm1LNmxacv0OCXTWtcmafJ6f0tLE/sPKJJPIPnJZruHepqCIyu3mqv0bQL+kXcLDpi78HhNjrxWo2BehGLSSKKKlKmIl6FJUkYSU3HdRZpl8pKlbFvy2hfbWf13gJFbpAZC5IPfKbwD9xy8KIKxEqqvK9/r5dKnWT5OkarygsSoJLUIo4QQ8S2E0wW9Z5XQu+MDpXZ4LRAQ9kOTY37sD+AbQXdunWJKM9JHgivtzL8iXdpGK9A+58DdrcHbqK0mSPqB+WWlyt67/AUiUByHuYYLHAAAAAElFTkSuQmCC", "gmCabinet": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAMAAADyHTlpAAACE1BMVEX///8Aez8AjTsAjTsAhDkEgkAAez8Aez8Aez+ZzGYAlDqTymMAlDoBmjlStFF5wVxzv1p6wlwSg0cKf0MgpEIZokATnz8Pnj0InDthvVRYtlIopkSCxF5rvFhlvFuMx2FFslFCr0w7rUo2qEswqkklpkYAez8AjTsIhEKOzXB7xmNrvFhhvVRYtlJCr0wAjTsAhDkEgkAAez+MzWxcu1F7xWd1xGB6wlxzv1plvFuU0HG63oZStFFKtFNLtEi23YQ7rUo2qEsopkQgpEI5nD4ymTsTnz8qkk8InDsAlDqFyWuGxmGGy2kAYigAWiclpkZuwlyDumoAcyuc03UqqEif1Hii03aMx2FAokOu2oB4wWIZokDC4YsPnj0ZmzsvklNYsFGCxF4BmjkgjklVrk8BkjQchTJAsE9rv2BRtksAajMAaylKrUqSyWMAUyRauVjG440fjDMsn0Y1mkCq2H0gaTUypEkgnj0qlDhxw10Aeyk3nk0AjTQZh0pFslF8vWcAbSVSrU0Ph0QfgUAAbTYIlTY6nkBNiE3O5pIwqkmd0XRrt1uZzGZKkUs3mECTymMuljq+4IkAcjcAcTJBolMjl0QHcShQpV4cjT15wVyl1nsokU2Sy2oAWi4tekMAhjVlsFg6l1cUfi46n086o0QkhzdSrFgSg0cbk0MOlzhbp1MbezMwcz8pczoAVyUzbkAATCZJ4iKRAAAAKXRSTlMAESJEREREd4iImbu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u8zd7rx73q8AAAMaSURBVHhefdJjlyRZEAbg4W7PNsaeNdMo23a1bdvW2DbW9k/ciJtbieo+89apb895IyLP3UNyqLLywwtHDx95/4Oz52pqPvr4k08/O//5iZOnTp+prq6qem8fQYq8Pd6Y6ra9sDMsy7k9Y7w/cCOYC7VG2+M9PYlE4kuN3htvRGq3Mw6Oc7t5QkNA4woV9qu0EeVrUzplabEODTkmJ6F6YxB8XS6UMNJUqjvVdv361FTbA5fP19w897K+ttbpNJnSadoRN9DubluDIoGiVOmd+Vuza4KO2mxAFfks1hmLxV5hKKB//ft714q+1W633wSJ4ztlNc0wv+VbumtF0FOGudmGnS7f12/UIKVpq5EyDEORPX2+a/9g/sQAtaTKKcuylMtFjm8Gj5fBabXpJG2hrX0GauY4EyG+OTD15HwKxuN8Qg+olOO4JKnUSxOUAl3uK+pb3W5PEiAZq0inqVS6vG1o9Yx5aIQoGxSJlJTmt4uCqLXyPN8CDmCpk0or4xUqHFSpn/cPIWwAqEjstBCZXyqKehrw+yloRFiaboH5KPueFgVJ2/UG5ser4XA4EoncX4JMYwamBwa+39oSRVFrrasL1gWDocXFjo6O3yBX+vv71yDfYARR0tFgLhjKheDZt7ZGo+349HsS5PVDRKC6BUIQd5KiKNwSotwOizIstwCl0jsqhbZBcCWoSgfLmM3PoVWj0WjUAwzz82PID5DV1TzLsKzZfPeRJGu0vT3uQZdMW3plNSYHSnfTqKyj8Xh8AxwNsy+NXMYfxomSG27K6ClcPEgrmZ+Y+DubzWYymVEnkcNXR3dSPMbaVSgUNgubGCdKoIZW+IR+cHg2+USMg8Xh5mGIdyf9n5UgGc6B9IbLaQAZcQyBKM0ovZERPRUSQiDPqI5ADodjZjMGKggBB8zVoLImhg+X0wVE6Ixw5wIioWbVqZAvP0sUpJmSUxt3b4V3NsMpJxsgj/+IoRVe5K9oiCvPHwZ6UZLkJ2NejWmdTT9lL8u/aPSrmCTLDzPZXTMir69rtKL3u7el84s9Wt49fuwtqdhL0H/gL6HCGA+RUQAAAABJRU5ErkJggg==", "gmNosign": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAMAAADyHTlpAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRF1zco++nn+dPL20Qy6mVJ8XZWwggG8o114U86ziQb2FVR5ltCyxsU55yb7aun8qOU7GxQ5YqG5Hlv8rqz8bOr6pOJ73FS3Wpl9JyGxhEN98O40i0hzjY0vwAA9Hxa////UlnSSQAAACB0Uk5T/////////////////////////////////////////wBcXBvtAAACTElEQVR42nTVWbaDIAwA0CBWmbRaZ3HY/y4fiaBiX/lq9Z4QQkDYo8Hmd95XVZrqT96y+B3c/yT5tr1evZOp1kKIoflBEQaqNVrOdfsPZeNG49V7KpByGNiTJtsWaBVR4E1ML/lFwbZ3ekpHt7Ft2rZ7kSRqy4ve5Himxt7aSyubQNkl86jI70At83S8Zs/jqicKqZRSHfS+pP792D2FQaUxJdH8JqvqacVBF6RJgCTTdHzkgPMbM5WO4r4fkGSqH7ZDaaZlB/ai0Y/v6pBad3EKnOjEYO4xXu9CzV5qEduO5NTBWOHEFRZuDh0VW0Y0U7BVOPFGD2cvBa/vlmPQTEJKw4eZveSRHTBolnla+qeNlxxutsag2QqpxgTPk9Ec0m3+56QFBZWgaVznovGtd7M1BTVEhS73mwWi1n5OmhEVbiFxJRsA33veKgzqEuhTXEm/x9ZSQ3lrnVwnt1I8xIJH10PrpTEDNgxOv1oFLUke917rJVmFcoUaGNe4Zh3fOqWX07QsJI1hsKdIgRf7wx6S6oRBXRO64mhacvKwAZI0tsAD45JFqtjTXnLlls5WC5qq82UvaWVxHO6BC6yO5Y8chiDlwsOVAQLPpatPxx6UpOEmXBl7Y52VOGx94uSSU3ldb6V0ORiqj+FDXXS1sm7bEWaWm+J+aaIFE0pJ6zlCTsCzIr6KG2kFt5c7oZ3arwteuYbk1kxZCJkZ17hmYf98Nkrr3rk99gt0v8HI4sfHqFgyg4TOjDXZUvz8brk0arVQluui6sfu/QkwAFSikM1V6imqAAAAAElFTkSuQmCC", "gmPhone": "data:image/gif;base64,R0lGODlhKgAqANU/AAxcqq3F0wRy2t3bzIG150OX5wNt0oOu0TV3r3OcuQJFcweF+gNpzAVktQJjwjpyneTh0QV76uDezwZIeghJfYK880KHyw1NhYLB/KHL9AaC9WOq7qG1vUOR21CItkGM1BRSkXKWrQ5OhxJRjQR24QpZnwlLfwFfuwV45QhitOfk1XSp2ujl1w1kuAJmx+Lf0Onm2BBPigxMg+/1/G+RqFuXzQRHdweH/gtMggZ/7+bj0wtLgSFknARqwBJ31////yH5BAEAAD8ALAAAAAAqACoAAAb/wJ9wKMTcjseFUqlpanLQXGSKKsyI2Owvg0Qumc6olIraaM8/4zHXa7jf8JQ81RBEUFW0Vp2bKP6AgTaDhDYGeAV6WWoNgY6FkCWIiliMjn+QgxObE5J5lEMYSo2ChZynnZOgRaOlNqicFLKeiatprQqmqLK8FJIktauiC42EsL0UJsq/waDDDcaxyMrUzLZpTdCv0rzUJjvgJSTA1xjZ2xPT1ODgMuLktuYaDdzJyjs47TIyF+/NlPLopev2Dd++fRcS+isHRSBBfDgQJpwoTsA/RRgaDrRnUOIFESBFlBBg8VoFKCkeRuSXMCTIGCNL2jqZI6U9HCtbuozBM+ZF/z0VpqS8t0PiTp48AZDsYFIoUaMvkfIcodQA05lOv0EVITXGiK8ADFg1iSeFVpYfuSL9yjbs2Jll202MOpXtCBBur66qEBeqVLt38YrVC6rCOAEijP5lC6IxCAaDTY4jIYDBnBQtMnvIzDmzWAMMCFMyTLK0aQESWBz4zJqB6w/XCJyezYIFB8itXTOAbUv27NJWEyDI7dqFC96rfPtYEaB5gBoHnDevIT2ABePIQREQGwCGdxgsEgRQoUMHBAgJILxYL0GCBQfZKW038L22CvHlz6Nf/6L9AA7wxSZWbSyoYGAIAeh3XgLsSTDAfw5YIKABCDxgoYU8VHjhAxluyHjhCRL25lp5+aGXoHrrJeDfg/+BGNuICkKAIH8pOshiiyEmZ9wBMc7YYAI3PviAiyK64IAHISQZwgNIKknDAwnQICUNPABAZHIGGOnAllx2ecKXYIbpQo6gZOACa2jqpmZxxjHgQg3X/LCCA8bVaWedXXppwRVnBAEAOw==", "gmApps": "data:image/png;base64,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", "gmFav": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABgFBMVEXippje3NLe3eHgt6jdqKXfcWXgoY7k09Xy3tDeh3brlnvfzb7Lyb3/f1XufmL2dlbatm3Uyb8AAADn5dba19X+/v34+e/TNirvaE7MKibm28v/f3/0dVfX1sri4eHGGRXYRjblWUWyAQPDCw63t7jrk4nLIxy8MTPZk5HjSTboqZbmhXDvybrryLjx9+y6urrap5L608/u7eDVhnPcmovwxrf0+/O1FhbANjbWVEXTeGnc5dPpUzr//3+1tbW5yszddWTWmInYtKXzspv0uqn/1Kro8N33/PT4+fHXaFvXZ1jGiHLZoZLZybTY2Nb8gmbmuKji3t7t6Nq6LC7RWU/LfXXLiITatrbMzMTL1dbleWTiiIX1s5bvs532uLjnva7tyrjvyLfj49/k5OTx7uLx7eLs9+h/AACRAAC+IB++NzG2bUi4aGi/d2+5i4u2kZGurq61r6y/v7+ysrK1v8C22tq60tTBHRzAIRzUKirSS0PeUT7abUjabW3Ta2vBcmBZUk1dAAAAgHRSTlMY1CJg8niUR6l4/3TsBrjbBxgA/UsC+/39/f0C/f5C+/7+9f7S6v7WB/v70Zf9c+z+Cfj9/M6P/NX//P76AqbP03j6/f0G/FnN0/8id/4v/sNBidbSIP8HLYb/xgp0C5sOukEKcLO6Agf//wf/IAsHm7EMndQH0LxzBvn/BwfVHZkiIqcAAAI9SURBVHjajZNpV9pAFIYngIpLNwZmMzETrKmJDUVQlKXQAgVqcW3rvi/d933vX++dIGL7ofqcnDMf7nPfmzs5QZEzQGcLsUHgpmLwXx4PxkBAmxd+Xl5ZGVfcAdDoMa+ff/0xeo4RsaFgV+9W//Vjdna6m83bQG8z2PWlqyeA0GRVn69gsTepWFhY8IQQnucJz7VstvEKjV6c15le2ULbm7u72+PjVx4RgnGK1JLfTNP8jNDqmM6AS1omFokcNhoNjLHI12ZzHOrD0z0oOqYDTO+rhmORJQLtAoyJrG2a8ExHQWBMKQU20p2pH0I9hb00NW3Ozanha0rwRzCdFeZFOJCBiPIMtylMmJoanm4Jlu5LBcfdQw2clpxSm9NnHUFPJtctwHGYW81RgJtyIv00bh4LrJKfTVsFy5KSZVXdNte7gyM83noHZjEX52f7so60JPXrPIcTT9rCLVZgrsB5IzkjqZSScjtbwSRzryM4lgur43w5J/32mTLcZqIjWCAILOB+BmABLtNYWz0iiYenhO9+AhaGkcxKF9cMLXUq4a5FZVIJhiEI9rz+DME1TBIvTwSnJQgDQjAhS2GSgrMzQgkTKl/VfQW+Nmzxuy08cCgFwcBtUkSRQEq4rwRqK0GcCH596SAY4vE4CIENy1RCp/+onqjXAxGVwH9F0ZxWzS2XDUMz2gy8LxbfFItvQ8svQqE59G5NK5VKV09zo8WH0idtLYAiHwOLi0N/0bMfVcfifnTu4Fz/5n85O+EPU6OLo3WxZJYAAAAASUVORK5CYII="}; const R = "html[gplex-sg]"; const ROOT = R + " body > div:has(#yDmH0d)"; const CARD = R + " div:has(> #yDmH0d)"; const MAIN = R + " #yDmH0d main"; const INPUT = 'input:is([type="text"],[type="email"],[type="password"],[type="tel"],[type="number"]):not([aria-hidden="true"]):not([tabindex="-1"])'; const FIELD = "div:has(> " + INPUT + ")"; // the button that goes ahead: "Next", and the filled one on steps without it ("I agree") const NEXT = ':is([id$="Next"] button, button.VfPpkd-LgbsSe-OWXEXe-k8QpJ)'; const css = []; const add = function(sel, body) { css.push(sel + " { " + body + " }"); }; // ---- common to every period: Google's frame taken apart into plain blocks add(R + ", " + R + " body", "background: #fff !important;"); add(R + " body", "display: flex !important; flex-direction: column !important; min-height: 100vh !important; margin: 0 !important;"); add(R + " body > *", "order: 3;"); add(R + " #ugf-sg-top", "order: 1;"); add(R + " #ugf-sg-banner", "order: 2;"); add(R + " #ugf-sg-below", "order: 4;"); add(R + " #ugf-sg-foot", "order: 5; margin-top: auto;"); add(ROOT + ", " + ROOT + " > div", "min-height: 0 !important; height: auto !important; display: block !important; padding: 0 !important; margin: 0 !important; background: transparent !important; width: auto !important;"); add(MAIN + ", " + MAIN + " > div, " + MAIN + " > div > div", "display: block !important; width: auto !important; max-width: none !important; min-width: 0 !important; padding: 0 !important; margin: 0 !important; flex: none !important;"); add(CARD + " > div:has([role='progressbar'])", "display: none !important;"); add(ROOT + " > div:empty", "display: none !important;"); add(MAIN + " img[src*='googleg'], " + MAIN + " c-wiz:has(img[src*='googleg'])", "display: none !important;"); add(CARD + " " + FIELD + " ~ div", "display: none !important;"); add(CARD + " " + FIELD + " > input ~ div", "display: none !important;"); add(CARD + " " + INPUT, "position: static !important; box-sizing: border-box !important; width: 100% !important; margin: 0 !important; outline: none !important; box-shadow: none !important; background: #fff !important; color: #222 !important; padding: 0 8px !important; letter-spacing: normal !important;"); add(CARD + " " + FIELD + ", " + CARD + " " + FIELD + " *:not(input)", "height: auto !important; min-height: 0 !important; background: transparent !important; box-shadow: none !important;"); add(CARD + " [id$='Next']", "margin: 0 !important; height: auto !important; min-width: 0 !important;"); add(CARD + " button div[class*='VfPpkd-'], " + CARD + " button::before, " + CARD + " button::after, " + CARD + " [class*='VfPpkd-J1Ukfc'], " + CARD + " [class*='VfPpkd-Jh9lGc'], " + CARD + " [class*='VfPpkd-RLmnJb']", "display: none !important;"); // (the card keeps being the frame its own absolutely placed pieces hang from) add(CARD + ", " + CARD + " button", "position: relative !important;"); // the row the buttons sit in: every layer of it flush with the box, whatever // offsets today's row carries (Firefox kept one of them and pushed Next right) add(CARD + " main > div:has(" + NEXT + "), " + CARD + " main > div:has(" + NEXT + ") div:has(" + NEXT + "), " + CARD + " [id$='Next'], " + CARD + " [id$='Next'] > div", "margin-left: 0 !important; margin-right: 0 !important; padding-left: 0 !important; padding-right: 0 !important; left: auto !important; right: auto !important; transform: none !important; inset-inline: auto !important; box-sizing: border-box !important;"); add(CARD + " div:has(> " + FIELD + "), " + CARD + " div:has(> div > " + FIELD + ")", "height: auto !important; min-height: 0 !important;"); // links and text buttons (Forgot email?, Create account, Try another way...) add(CARD + " button:not(:is(" + NEXT + ")), " + CARD + " a", "all: unset; cursor: pointer; color: " + (era === "sg17" || era === "sg19" ? "#1a73e8" : era === "sg13" ? "#427fed" : "#15c") + " !important; font: inherit !important; font-size: 13px !important; " + (era === "sg07" ? "text-decoration: underline !important;" : "")); add(CARD + " button:not(:is(" + NEXT + ")) span", "font: inherit !important; color: inherit !important; letter-spacing: normal !important;"); add(CARD + " [aria-live] div, " + CARD + " [aria-live] span", "color: #dd4b39 !important; font-size: 13px !important;"); // Before 2019 nothing on the page was rounded: the highlight on an account in the // chooser, the rows, the chips and the state layers under them are all square // (the round photo of 2014-2016 and the pictures themselves excepted) if (era !== "sg19") { // (:where keeps this weaker than the period's own buttons and boxes, which have their own corners) add(CARD + " :where(*:not(img):not(#ugf-sg-boxhead)), " + CARD + " :where(*:not(img):not(#ugf-sg-boxhead))::before, " + CARD + " :where(*:not(img):not(#ugf-sg-boxhead))::after", "border-radius: 0 !important;"); add(CARD + " li > div:hover, " + CARD + " li > div:focus, " + CARD + " li > div:focus-within, " + CARD + " [role='link']:hover, " + CARD + " [role='link']:focus", "background-color: " + (era === "sg07" ? "#d5ddf3" : era === "sg17" ? "#f1f3f4" : "#e8e8e8") + " !important; outline: none !important;"); } // The checkboxes (Show password and the like): today's is a blue filled box on a // round highlight. Before 2019 it is the period's own: the plain browser box to // 2011, then Kennedy's - a white 13px square with a grey edge and Google's grey // checkmark (ssl.gstatic.com/ui/v1/menu/checkmark.png) hanging over its corner. if (era !== "sg19") { const CB = CARD + " div:has(> input[type='checkbox'])"; add(CB, "position: relative !important; display: inline-block !important; flex: none !important; width: 15px !important; height: 15px !important; min-width: 0 !important; padding: 0 !important; margin: 0 7px 0 0 !important; background: transparent !important; box-shadow: none !important; vertical-align: middle !important; overflow: visible !important;"); add(CB + " > :not(input):not([ugf-sg-cbtext]), " + CB + "::before", "display: none !important;"); add(CARD + " div:has(> div > input[type='checkbox']), " + CARD + " div:has(> div > div > input[type='checkbox'])", "padding: 0 !important; margin: 0 !important; background: transparent !important; box-shadow: none !important; min-width: 0 !important; min-height: 0 !important; width: auto !important; height: auto !important; display: flex !important; align-items: center !important;"); add(CARD + " div:has(> div > input[type='checkbox'])::before, " + CARD + " div:has(> div > input[type='checkbox'])::after", "display: none !important;"); if (era === "sg07") { add(CB + " input[type='checkbox']", "appearance: auto !important; -moz-appearance: checkbox !important; position: static !important; width: 13px !important; height: 13px !important; margin: 0 !important; opacity: 1 !important;"); } else { add(CB + " input[type='checkbox']", "appearance: none !important; -moz-appearance: none !important; -webkit-appearance: none !important; position: absolute !important; left: 0 !important; top: 0 !important; width: 15px !important; height: 15px !important; margin: 0 !important; padding: 0 !important; opacity: 1 !important; box-sizing: border-box !important; border: 1px solid #c6c6c6 !important; border-radius: 1px !important; background: #fff !important; cursor: pointer !important; z-index: 1 !important; outline: none !important;"); add(CB + " input[type='checkbox']:hover", "border-color: #b2b2b2 !important; box-shadow: inset 0 1px 1px rgba(0,0,0,.1) !important;"); add(CB + " input[type='checkbox']:focus", "border-color: #4d90fe !important;"); add(CB + ":has(> input:checked)::after", "content: '' !important; display: block !important; position: absolute !important; left: -4px !important; top: -2px !important; width: 21px !important; height: 21px !important; background: url(" + A.check + ") no-repeat !important; pointer-events: none !important; z-index: 2 !important;"); } // the box and its words on one line, flush left: the row is found by the script // (the first holder of the box that also holds words) and marked, so this does not // depend on how deep today's page nests them const RW = CARD + " [ugf-sg-cbrow][ugf-sg-cbrow]"; add(RW, "display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: flex-start !important; gap: 0 !important; margin: 6px 0 !important; padding: 0 !important; min-height: 0 !important; height: auto !important; width: auto !important; text-align: left !important;"); add(RW + " > [ugf-sg-cbbox][ugf-sg-cbbox]", "display: flex !important; align-items: center !important; flex: none !important; margin: 0 !important; padding: 0 !important; width: auto !important; height: auto !important; min-width: 0 !important; min-height: 0 !important;"); // every holder between the row and the box sits flat (today's carry -9px margins for // the round highlight, which slid the box over the first letter); the gap goes on the words add(RW + " > [ugf-sg-cbbox][ugf-sg-cbbox] div, " + RW + " > [ugf-sg-cbbox][ugf-sg-cbbox] span", "position: static !important; margin: 0 !important; padding: 0 !important; left: auto !important; right: auto !important; transform: none !important;"); add(RW + " > [ugf-sg-cbbox][ugf-sg-cbbox] div:has(> input[type='checkbox'])", "position: relative !important; width: 15px !important; height: 15px !important; flex: none !important;"); // (when the words share the box's own holder, the box itself is the row's first // piece: it goes back into the line instead of floating over the first letter) add(RW + " > input[ugf-sg-cbbox][ugf-sg-cbbox]", "position: relative !important; left: 0 !important; top: 0 !important; flex: none !important; margin: 0 !important; width: " + (era === "sg07" ? "13px" : "15px") + " !important; height: " + (era === "sg07" ? "13px" : "15px") + " !important;"); add(RW + " > [ugf-sg-cbtext][ugf-sg-cbtext]", "display: block !important; flex: 1 1 auto !important; margin: 0 0 0 7px !important; padding: 0 !important; min-height: 0 !important; height: auto !important; text-align: left !important; line-height: 15px !important;"); add(RW + " > [ugf-sg-cbtext][ugf-sg-cbtext] *", "margin: 0 !important; padding: 0 !important; text-align: left !important; line-height: 15px !important; min-height: 0 !important; height: auto !important;"); // and its words in the page's plain type, not today's medium weight add(CARD + " :where(div:has(> div > input[type='checkbox']), div:has(> div > div > input[type='checkbox'])) :where(div, span, label):not(:has(input))", "font: 13px Arial, sans-serif !important; color: " + (era === "sg07" ? "#000" : "#404040") + " !important; letter-spacing: normal !important;"); } // ---- (6.1.1) Google's colour palette swapped for the period's, so every box, choice, // switch and pop-up Google draws from it (on sign-in and every sign-up step) takes the // period's colours instead of today's { const T = { sg07: { surf: "#fff", primary: "#00c", cont: "#e5ecf9", onCont: "#000", text: "#000", text2: "#666", outline: "#999", outline2: "#ccc", variant: "#f0f0f0" }, sg11: { surf: "#fff", primary: "#4d90fe", cont: "#eee", onCont: "#222", text: "#222", text2: "#666", outline: "#d9d9d9", outline2: "#e5e5e5", variant: "#f1f1f1" }, sg13: { surf: "#fff", primary: "#4d90fe", cont: "#eee", onCont: "#404040", text: "#404040", text2: "#777", outline: "#d9d9d9", outline2: "#e5e5e5", variant: "#f7f7f7" }, sg19: { surf: "#fff", primary: "#1a73e8", cont: "#e8f0fe", onCont: "#1967d2", text: "#202124", text2: "#5f6368", outline: "#dadce0", outline2: "#dadce0", variant: "#f1f3f4" } }; const t = T[era] || T.sg19; const v = { "background": t.surf, "surface": t.surf, "surface-bright": t.surf, "surface-dim": t.variant, "surface-container-lowest": t.surf, "surface-container-low": t.surf, "surface-container": t.surf, "surface-container-high": t.surf, "surface-container-highest": t.variant, "surface-variant": t.variant, "on-background": t.text, "on-surface": t.text, "on-surface-variant": t.text2, "primary": t.primary, "on-primary": "#fff", "inverse-primary": t.primary, "surface-tint": t.surf, "primary-container": t.cont, "on-primary-container": t.onCont, "secondary": t.primary, "on-secondary": "#fff", "secondary-container": t.cont, "on-secondary-container": t.onCont, "outline": t.outline, "outline-variant": t.outline2 }; add(R + " body, " + R + " body *", Object.keys(v).map(function(k) { return "--gm3-sys-color-" + k + ": " + v[k] + " !important;"; }).join(" ")); // Google's pop-ups (Confirm settings? and the like), in the period's frame const DLG = R + " :is([role='dialog'], [role='alertdialog'])"; const kennedy = era === "sg11" || era === "sg13"; add(DLG, era === "sg07" ? "background: #fff !important; border: 1px solid #36c !important; border-radius: 0 !important; box-shadow: 2px 2px 4px rgba(0,0,0,.3) !important;" : kennedy ? "background: #fff !important; border: 1px solid rgba(0,0,0,.333) !important; border-radius: " + (era === "sg13" ? "2px" : "0") + " !important; box-shadow: 0 4px 16px rgba(0,0,0,.2) !important;" : "background: #fff !important; border: 0 !important; border-radius: 8px !important; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15) !important;"); add(DLG + " *:not(button):not(img):not(svg):not(path)", "background-color: transparent !important; border-radius: 0 !important;"); add(DLG + " *:not(i):not([class*='material'])", era === "sg19" ? "font-family: Roboto, Arial, sans-serif !important; color: " + t.text2 + " !important;" : "font-family: Arial, sans-serif !important; color: " + t.text + " !important; letter-spacing: normal !important;"); add(DLG + " :is(h1, h2, [role='heading'])", era === "sg19" ? "font: 400 22px 'Google Sans', Roboto, Arial, sans-serif !important; color: #202124 !important;" : "font: " + (era === "sg07" ? "bold 16px" : "normal 16px") + " Arial, sans-serif !important; color: " + t.text + " !important;"); add(DLG + " p, " + DLG + " div:not(:has(*))", era === "sg19" ? "font-size: 14px !important; line-height: 20px !important;" : "font-size: 13px !important; line-height: 1.4 !important;"); add(DLG + " :has(> button + button), " + DLG + " :has(> div > button + div > button)", "gap: " + (era === "sg19" ? "8px" : "16px") + " !important;"); // their buttons: the period's grey ones, the last (the one that goes ahead) in the period's blue const DB = DLG + " button"; add(DB + " > div, " + DB + "::before, " + DB + "::after", "display: none !important;"); add(DB + " span", "font: inherit !important; color: inherit !important; letter-spacing: normal !important; text-transform: inherit !important;"); if (era === "sg07") { add(DB, "all: unset; box-sizing: border-box !important; display: inline-block !important; margin: 0 0 0 8px !important; padding: 2px 10px !important; background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; font: 13px Arial, sans-serif !important; color: #000 !important; cursor: pointer !important;"); } else if (kennedy) { add(DB, "all: unset; box-sizing: border-box !important; display: inline-block !important; margin: 0 0 0 16px !important; height: 29px !important; line-height: 27px !important; min-width: 72px !important; padding: 0 12px !important; text-align: center !important; background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; border-radius: 2px !important; font: bold 11px Arial, sans-serif !important; color: #444 !important; cursor: pointer !important;"); add(DB + ":hover", "border-color: #c6c6c6 !important; color: #222 !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); add(DB + ":last-of-type", "background: linear-gradient(#4d90fe, #4787ed) !important; border-color: #3079ed !important; color: #fff !important;"); add(DB + ":last-of-type:hover", "background: linear-gradient(#4d90fe, #357ae8) !important; border-color: #2f5bb7 !important; color: #fff !important;"); } else { add(DB, "all: unset; box-sizing: border-box !important; display: inline-block !important; margin: 0 0 0 8px !important; height: 36px !important; line-height: 36px !important; padding: 0 8px !important; border-radius: 4px !important; font: 500 14px 'Google Sans', Roboto, Arial, sans-serif !important; color: #1a73e8 !important; cursor: pointer !important;"); add(DB + ":hover", "background: rgba(26,115,232,.04) !important;"); } // the words on the card (the Privacy and Terms step and the like) in the period's type if (era !== "sg19") { add(CARD + " *:not(i):not([class*='material']):not(input)", "font-family: Arial, sans-serif !important; letter-spacing: normal !important;"); add(CARD + " :is(h1, h2, h3):not(#headingText):not(#headingText *)", "font: bold " + (era === "sg07" ? "13px" : "16px") + " Arial, sans-serif !important; color: " + t.text + " !important;"); add(CARD + " p, " + CARD + " li", "color: " + t.text + " !important;"); } } // ---- per period const decorations = {}; // (the page enforces Trusted Types, so these are built as nodes, never as HTML text) const h = function(tag, attrs) { const el = document.createElement(tag); Object.keys(attrs || {}).forEach(function(k) { el.setAttribute(k, attrs[k]); }); for (let i = 2; i < arguments.length; i++) { const c = arguments[i]; if (c !== null && c !== undefined) { el.appendChild(typeof c === "string" ? document.createTextNode(c) : c); } } return el; }; const link = function(href, text) { return h("a", { href: href }, text); }; if (era === "sg07") { add(R + " body", "font: 13px Arial, sans-serif !important; color: #000 !important;"); add(R + " #ugf-sg-top", "display: flex; align-items: flex-end; gap: 8px; padding: 12px 16px 10px; border-bottom: 1px solid #c9d7f1; margin-bottom: 30px;"); add(R + " #ugf-sg-top img", logo2010 ? "width: 114px; height: auto;" : "width: 110px; height: auto;"); add(R + " #ugf-sg-top b", "font: bold 20px Arial, sans-serif; color: #000; margin-bottom: 4px;"); add(CARD, "box-sizing: border-box !important; width: 330px !important; min-height: 0 !important; margin: 0 auto !important; padding: 12px 20px 14px !important; background: #e8eefa !important; border: 1px solid #c3d9ff !important; border-radius: 0 !important; box-shadow: none !important;"); add(R + " #ugf-sg-boxhead", "text-align: center; font: 13px Arial, sans-serif; margin: 0 0 12px;"); add(R + " #ugf-sg-boxhead img", "vertical-align: middle; margin-right: 2px;"); add(R + " #ugf-sg-boxhead b", "font-size: 16px; vertical-align: middle;"); add(CARD + " #headingText, " + CARD + " #headingText *", "font: bold 13px Arial, sans-serif !important; color: #000 !important; margin: 0 !important; text-align: left !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: 13px Arial, sans-serif !important; color: #000 !important; margin: 2px 0 8px !important;"); add(CARD + ":has(#identifierId) main > div:has(#headingText)", "display: none !important;"); add(CARD + " " + FIELD, "display: flex !important; align-items: center !important; gap: 6px !important;"); add(CARD + " " + FIELD + "::before", "flex: 0 0 64px; text-align: right; font: 13px Arial, sans-serif; color: #000;"); add(CARD + " div:has(> #identifierId)::before", "content: 'Email:';"); add(CARD + " div:has(> input[type='password']:not([aria-hidden='true']):not([tabindex='-1']))::before", "content: 'Password:';"); add(CARD + " " + INPUT, "height: 24px !important; font: 13px Arial, sans-serif !important; border: 1px solid !important; border-color: #7c7c7c #c3c3c3 #ddd !important; border-radius: 0 !important;"); add(CARD + " main > div:has(" + NEXT + "), " + CARD + " main > div:has(" + NEXT + ") > div, " + CARD + " main > div:has(" + NEXT + ") > div > div", "display: block !important; text-align: center !important; width: auto !important;"); add(CARD + " [id$='Next']", "display: block !important; margin: 10px 0 8px !important; text-align: center !important;"); add(CARD + " " + NEXT, "all: unset; box-sizing: border-box !important; display: inline-block !important; height: auto !important; padding: 2px 10px !important; background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; border-radius: 2px !important; font: 13px Arial, sans-serif !important; color: #000 !important; cursor: pointer !important;"); add(CARD + " " + NEXT + " span", "font: inherit !important; color: inherit !important; letter-spacing: normal !important;"); add(CARD + " main > div:last-child", "margin-top: 8px !important;"); add(R + " #ugf-sg-boxfoot", "margin: 12px 0 0; text-align: center; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-below", "box-sizing: border-box; width: 330px; margin: 14px auto 0; padding: 10px 12px; background: #e8eefa; border: 1px solid #c3d9ff; text-align: center; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-foot", "text-align: center; font: 13px Arial, sans-serif; color: #666; padding: 24px 0 18px;"); add(R + " #ugf-sg-foot a, " + R + " #ugf-sg-below a, " + R + " #ugf-sg-boxfoot a", "color: #00c;"); decorations.top = function() { return [h("img", { src: logo2010 ? A.logo10 : A.nav09, alt: "Google" }), h("b", {}, "Accounts")]; }; decorations.boxhead = function() { return ["Sign in with your", h("br"), (logo2010 ? h("img", { src: A.logo10, alt: "Google", width: "61", height: "22", style: "vertical-align: -4px; margin-right: 2px" }) : h("img", { src: A.gTrans, alt: "Google", width: "61", height: "25" })), h("b", {}, "Account")]; }; decorations.boxfoot = function() { return [link("https://accounts.google.com/signin/recovery", "I cannot access my account")]; }; decorations.below = function() { return ["Don't have a Google Account?", h("br"), h("a", { href: "https://accounts.google.com/signup" }, h("b", {}, "Create an account now"))]; }; decorations.foot = function() { return ["\u00a9" + yearOf() + " Google - ", link("https://www.google.com/", "Google Home"), " - ", link("https://policies.google.com/terms", "Terms of Service"), " - ", link("https://policies.google.com/privacy", "Privacy Policy"), " - ", link("https://support.google.com/accounts", "Help")]; }; } else if (era === "sg11") { add(R + " body", "font: 13px Arial, sans-serif !important; color: #222 !important;"); add(R + " #ugf-sg-top", "height: 71px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5; margin-bottom: 40px;"); add(R + " #ugf-sg-top .in", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto; display: flex; align-items: center; justify-content: space-between; height: 71px;"); add(R + " #ugf-sg-top img", "width: 116px; height: auto;"); add(R + " #ugf-sg-top a.up", "display: inline-flex; align-items: center; box-sizing: border-box; height: 29px; padding: 0 12px; background: linear-gradient(#dd4b39, #d14836); border: 1px solid #b0281a; border-radius: 2px; color: #fff; font: bold 11px Arial, sans-serif; text-decoration: none; text-transform: uppercase;"); add(CARD, "box-sizing: content-box !important; width: 300px !important; min-height: 0 !important; margin: 0 auto !important; padding: 20px 25px 15px !important; background: #f1f1f1 !important; border: 1px solid #e5e5e5 !important; border-radius: 0 !important; box-shadow: none !important;"); add(R + " #ugf-sg-boxhead", "display: flex; justify-content: space-between; align-items: center; margin: 0 0 1.2em; font: 16px Arial, sans-serif; color: #222;"); add(CARD + " #headingText, " + CARD + " #headingText *", "font: bold 13px Arial, sans-serif !important; color: #222 !important; margin: 0 !important; text-align: left !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: 13px Arial, sans-serif !important; color: #666 !important; margin: 2px 0 10px !important;"); add(CARD + ":has(#identifierId) main > div:has(#headingText)", "display: none !important;"); add(CARD + " " + FIELD + "::before", "display: block; font: bold 13px Arial, sans-serif; color: #222; margin: 0 0 .5em;"); add(CARD + " div:has(> #identifierId)::before", "content: 'Email';"); add(CARD + " div:has(> input[type='password']:not([aria-hidden='true']):not([tabindex='-1']))::before", "content: 'Password';"); add(CARD + " " + FIELD, "display: block !important; margin: 0 0 .5em !important;"); add(CARD + " " + INPUT, "height: 32px !important; font: 15px Arial, sans-serif !important; border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; border-radius: 1px !important;"); add(CARD + " " + INPUT + ":focus", "border-color: #4d90fe !important; box-shadow: inset 0 1px 2px rgba(0,0,0,.3) !important;"); add(CARD + " main > div:has(" + NEXT + "), " + CARD + " main > div:has(" + NEXT + ") > div, " + CARD + " main > div:has(" + NEXT + ") > div > div", "display: block !important; text-align: center !important; width: auto !important;"); add(CARD + " [id$='Next']", "display: block !important; margin: 12px 0 10px !important; text-align: center !important;"); add(CARD + " " + NEXT, "all: unset; box-sizing: border-box !important; display: inline-block !important; height: 32px !important; line-height: 30px !important; min-width: 54px !important; padding: 0 12px !important; text-align: center !important; background: linear-gradient(#4d90fe, #4787ed) !important; border: 1px solid #3079ed !important; border-radius: 2px !important; font: bold 13px Arial, sans-serif !important; color: #fff !important; cursor: pointer !important;"); add(CARD + " " + NEXT + ":hover", "background: linear-gradient(#4d90fe, #357ae8) !important; border-color: #2f5bb7 !important;"); add(CARD + " " + NEXT + " span", "font: inherit !important; color: inherit !important; letter-spacing: normal !important;"); add(R + " #ugf-sg-boxfoot", "margin: 1.2em 0 0; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-boxfoot a, " + R + " #ugf-sg-foot a", "color: #15c; text-decoration: none;"); add(R + " #ugf-sg-foot", "height: 35px; border-top: 1px solid #ebebeb; font: 13px Arial, sans-serif; color: #666; margin-top: 40px;"); add(R + " #ugf-sg-foot .in", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto; line-height: 35px;"); add(R + " #ugf-sg-foot a", "margin-left: 1em;"); decorations.top = function() { return [h("div", { class: "in" }, h("img", { src: A.logo10, alt: "Google" }), h("a", { class: "up", href: "https://accounts.google.com/signup" }, "Sign up"))]; }; decorations.boxhead = function() { return [h("span", {}, "Sign in"), h("img", { src: A.gFlat, alt: "Google", width: "52", height: "19" })]; }; decorations.boxfoot = function() { return [link("https://accounts.google.com/signin/recovery", "Can't access your account?")]; }; decorations.foot = function() { return [h("div", { class: "in" }, "\u00a9 " + yearOf() + " Google", link("https://policies.google.com/terms", "Terms of Service"), link("https://policies.google.com/privacy", "Privacy Policy"), link("https://support.google.com/accounts", "Help"))]; }; } else if (era === "sg13") { add(R + " body", "font: 13px Arial, sans-serif !important; color: #404040 !important;"); // the logo centred at the head of the page, over the heading and the card add(R + " #ugf-sg-top", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto; padding: 17px 0 0; height: 54px; text-align: center;"); add(R + " #ugf-sg-top img", newLogo ? "width: 112px; height: auto; margin-top: 4px;" : "width: 116px; height: auto;"); add(R + " #ugf-sg-banner", "text-align: center; margin: 12px 0 15px;"); add(R + " #ugf-sg-banner h1", "font: 38px/1.2 'Open Sans', Arial, sans-serif; color: #555; margin: 0 0 15px; font-weight: normal;"); add(R + " #ugf-sg-banner h2", "font: 18px 'Open Sans', Arial, sans-serif; color: #555; margin: 0; font-weight: normal;"); add(CARD, "box-sizing: content-box !important; width: 304px !important; min-height: 0 !important; margin: 0 auto 25px !important; padding: 20px 25px 30px !important; background: #f7f7f7 !important; border: 0 !important; border-radius: 2px !important; box-shadow: 0 2px 2px rgba(0,0,0,.3) !important;"); add(R + " #ugf-sg-boxhead", "width: 96px; height: 96px; margin: 0 auto 10px; border-radius: 50%; background: url(" + A.avatar + ") center / 96px 96px no-repeat;"); add(CARD + ":not(:has(#identifierId)) #ugf-sg-boxhead", "display: none;"); add(CARD + " #headingText, " + CARD + " #headingText *", "font: 16px Arial, sans-serif !important; color: #404040 !important; margin: 0 0 4px !important; text-align: center !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: 14px Arial, sans-serif !important; color: #666 !important; margin: 0 0 12px !important; text-align: center !important;"); add(CARD + ":has(#identifierId) main > div:has(#headingText)", "display: none !important;"); add(CARD + " " + FIELD, "display: block !important; margin: 0 0 10px !important;"); add(CARD + " " + INPUT, "height: 44px !important; font: 16px Arial, sans-serif !important; border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; border-radius: 1px !important;"); add(CARD + " " + INPUT + ":focus", "border-color: #4d90fe !important;"); add(CARD + " main > div:has(" + NEXT + ")", "display: flex !important; flex-direction: column !important; align-items: center !important; gap: 12px !important;"); add(CARD + " main > div:has(" + NEXT + ") div:has(" + NEXT + ")", "display: block !important; width: 100% !important; text-align: center !important;"); add(CARD + " main > div:has(" + NEXT + ") div:has(" + NEXT + "), " + CARD + " [id$='Next'] > div", "display: flex !important; justify-content: center !important; width: 100% !important;"); add(CARD + " [id$='Next']", "display: block !important; width: 100% !important; margin: 4px auto 0 !important;"); add(CARD + " " + NEXT, "all: unset; box-sizing: border-box !important; display: block !important; width: 100% !important; height: 36px !important; line-height: 34px !important; text-align: center !important; background: #4d90fe !important; border: 1px solid #3079ed !important; border-radius: 3px !important; font: bold 14px Arial, sans-serif !important; color: #fff !important; cursor: pointer !important;"); add(CARD + " " + NEXT + ":hover", "background: #357ae8 !important; border-color: #2f5bb7 !important;"); add(CARD + " " + NEXT + " span", "font: inherit !important; color: inherit !important; letter-spacing: normal !important;"); add(R + " #ugf-sg-boxfoot", "text-align: right; margin: 14px 0 0; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-boxfoot a, " + R + " #ugf-sg-below a, " + R + " #ugf-sg-foot a", "color: #427fed; text-decoration: none;"); add(R + " #ugf-sg-below", "text-align: center; font: 13px Arial, sans-serif; color: #404040; margin: 0 0 30px;"); add(R + " #ugf-sg-below .one", "margin: 26px 0 12px; font-size: 16px; color: #555;"); add(R + " #ugf-sg-below img", "width: 230px; height: auto;"); add(R + " #ugf-sg-foot", "border-top: 1px solid #e5e5e5; font: 13px Arial, sans-serif; color: #666; padding: 14px 0; background: #f1f1f1;"); add(R + " #ugf-sg-foot .in", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto;"); add(R + " #ugf-sg-foot a", "margin-right: 1.5em; color: #666;"); decorations.top = function() { return [h("img", { src: newLogo ? A.logo15 : A.logo13, alt: "Google" })]; }; decorations.banner = function() { return [h("h1", {}, "One account. All of Google."), h("h2")]; }; decorations.boxhead = function() { return []; }; decorations.boxfoot = function() { return [link("https://accounts.google.com/signin/recovery", "Need help?")]; }; decorations.below = function() { return [link("https://accounts.google.com/signup", "Create account"), h("div", { class: "one" }, "One Google Account for everything Google"), h("img", { src: newLogo ? A.strip15 : A.strip14, alt: "" })]; }; decorations.foot = function() { return [h("div", { class: "in" }, link("https://www.google.com/", "Google"), link("https://policies.google.com/privacy", "Privacy"), link("https://policies.google.com/terms", "Terms"), link("https://support.google.com/accounts", "Help"))]; }; } else { // 2017 on: the card Google still draws, with the period's logo, type and buttons const font = era === "sg17" ? "Roboto, Arial, sans-serif" : "'Google Sans', Roboto, Arial, sans-serif"; add(R + " body", "font-family: " + font + " !important;"); add(ROOT, "display: flex !important; flex-direction: column !important; align-items: center !important; padding-top: 10vh !important;"); add(CARD, "box-sizing: border-box !important; width: 450px !important; max-width: 100% !important; min-height: 500px !important; margin: 0 auto !important; padding: 48px 40px 36px !important; background: #fff !important; border: 1px solid #dadce0 !important; border-radius: 8px !important; box-shadow: none !important;"); add(R + " #ugf-sg-boxhead", "text-align: center; margin: 0 0 8px; line-height: 0;"); add(R + " #ugf-sg-boxhead img", "width: 75px; height: auto;"); add(CARD + " #headingText, " + CARD + " #headingText *", "font: 400 24px/1.33 " + font + " !important; color: #202124 !important; text-align: center !important; margin: 8px 0 0 !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: 400 16px/1.5 " + font + " !important; color: #202124 !important; text-align: center !important; margin: 8px 0 24px !important;"); add(CARD + " main > div:has(#headingText)", "text-align: center !important;"); // (the box's holders keep today's fixed 56px, so any margin here pushed the box // down over "Forgot email?": the box sits flush in them instead) add(CARD + " " + FIELD, "display: block !important; margin: 0 !important;"); add(CARD + " " + INPUT, "height: 56px !important; font: 16px " + font + " !important; border: 1px solid #dadce0 !important; border-radius: 4px !important; padding: 13px 15px !important;"); add(CARD + " " + INPUT + ":focus", "border: 2px solid #1a73e8 !important; padding: 12px 14px !important;"); add(CARD + " main > div:has(" + NEXT + ")", "display: flex !important; flex-direction: row-reverse !important; justify-content: space-between !important; align-items: center !important; margin-top: 32px !important;"); add(CARD + " main > div:has(" + NEXT + ") > div", "display: flex !important; flex-direction: row-reverse !important; justify-content: space-between !important; align-items: center !important; width: 100% !important;"); add(CARD + " " + NEXT, "all: unset; box-sizing: border-box !important; display: inline-block !important; height: 36px !important; line-height: 36px !important; padding: 0 24px !important; background: #1a73e8 !important; border-radius: 4px !important; font: 500 14px " + font + " !important; color: #fff !important; cursor: pointer !important; letter-spacing: " + (era === "sg17" ? ".25px" : "normal") + " !important; text-transform: " + (era === "sg17" ? "uppercase" : "none") + " !important;"); add(CARD + " " + NEXT + ":hover", "background: #1b66c9 !important; box-shadow: 0 1px 2px rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15) !important;"); add(CARD + " " + NEXT + " span", "font: inherit !important; color: inherit !important; letter-spacing: inherit !important;"); add(CARD + " button:not(:is(" + NEXT + "))", "font-weight: 500 !important; font-size: 14px !important;" + (era === "sg17" ? " text-transform: none !important;" : "")); add(ROOT + " div:has(> c-wiz > footer), " + R + " footer", "box-sizing: border-box !important; width: 450px !important; max-width: 100% !important; margin: 0 auto !important; padding: 0 !important; font-family: " + font + " !important;"); add(R + " footer", "display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 8px 0 !important;"); add(R + " footer, " + R + " footer *", "border-radius: 0 !important;"); decorations.boxhead = function() { return [h("img", { src: A.logo15, alt: "Google" })]; }; } // ---- (6.1) the sign-up pages: "Create an Account" and "Create your Google Account" as // each period showed them, around Google's own steps (name, birthday, address, password // ...), which stay Google's and work exactly as normal. What is typed is never read. if (SIGNUP) { const side = function() { return [h("h3", {}, "One account is all you need"), h("p", {}, "A single username and password gets you into everything Google."), era === "sg13" ? h("img", { src: newLogo ? A.strip15 : A.strip14, alt: "" }) : null, h("h3", {}, "Take it all with you"), h("p", {}, "Switch between devices, and pick up wherever you left off.")].filter(Boolean); }; const signIn = "https://accounts.google.com/ServiceLogin"; // the round choices ("Create your own Gmail address" and the like): the browser's // own to 2011, Kennedy's grey ring from late 2011, 2019's blue from then on if (era !== "sg19") { const RB = CARD + " div:has(> input[type='radio'])"; add(RB, "position: relative !important; display: inline-block !important; flex: none !important; width: 16px !important; height: 16px !important; min-width: 0 !important; padding: 0 !important; margin: 0 8px 0 0 !important; background: transparent !important; box-shadow: none !important; vertical-align: middle !important;"); add(RB + " > :not(input), " + RB + "::before, " + RB + "::after", "display: none !important;"); add(RB + " > input[type='radio']", era === "sg07" ? "appearance: auto !important; -moz-appearance: radio !important; position: absolute !important; inset: 0 !important; width: 13px !important; height: 13px !important; margin: auto !important; opacity: 1 !important;" : "appearance: none !important; -moz-appearance: none !important; -webkit-appearance: none !important; position: absolute !important; inset: 0 !important; width: 15px !important; height: 15px !important; margin: auto !important; opacity: 1 !important; box-sizing: border-box !important; border: 1px solid #c6c6c6 !important; border-radius: 50% !important; background: #fff !important; cursor: pointer !important;"); if (era !== "sg07") { add(RB + " > input[type='radio']:checked", "background: radial-gradient(circle, #444 0 3.5px, #fff 4px) !important;"); add(RB + " > input[type='radio']:focus", "border-color: #4d90fe !important; outline: none !important;"); } } // a step with other buttons beside the one that goes ahead (Privacy and Terms: More // options, Cancel, I agree): the row in a line, the period's button its own width const ROW = CARD + " main > div:has(" + NEXT + "):has(button:not(:is(" + NEXT + ")))"; add(ROW + ", " + ROW + " div:has(" + NEXT + ")", "display: flex !important; flex-direction: row !important; flex-wrap: wrap !important; align-items: center !important; justify-content: space-between !important; gap: 12px !important; width: 100% !important;"); add(ROW + " " + NEXT, "width: auto !important; display: inline-block !important; padding: 0 16px !important;"); add(ROW + " button:not(:is(" + NEXT + "))", "white-space: nowrap !important;"); // the words of each box, written beside or above it as the period did add(CARD + " [data-ugf-label]::before", "content: attr(data-ugf-label);"); add(CARD + " select, " + CARD + " [role='combobox']", "letter-spacing: normal !important;"); if (era === "sg07") { add(R + " #ugf-sg-banner", "width: 640px; max-width: calc(100% - 32px); margin: 0 auto 14px; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-banner h1", "font: bold 16px Arial, sans-serif; margin: 0 0 6px;"); add(R + " #ugf-sg-banner a", "color: #00c;"); add(CARD, "width: 640px !important; max-width: calc(100% - 32px) !important; padding: 0 0 14px !important; background: #fff !important; border: 0 !important; border-top: 1px solid #36c !important;"); add(R + " #ugf-sg-boxhead", "text-align: left; background: #e5ecf9; font: bold 13px Arial, sans-serif; padding: 3px 5px; margin: 0 0 12px;"); add(CARD + " main", "padding: 0 12px !important;"); add(CARD + " #headingText", "display: none !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: bold 13px Arial, sans-serif !important; margin: 0 0 10px !important;"); add(CARD + " " + FIELD + "::before", "flex: 0 0 170px !important;"); add(CARD + " " + INPUT, "width: 240px !important; flex: none !important;"); add(CARD + " select", "font: 13px Arial, sans-serif !important; height: auto !important; border: 1px solid #7c7c7c !important; background: #fff !important; appearance: auto !important; -moz-appearance: menulist !important; padding: 1px !important; border-radius: 0 !important;"); add(CARD + " main > div:has(" + NEXT + "), " + CARD + " [id$='Next']", "text-align: left !important;"); decorations.banner = function() { return [h("h1", {}, "Create an Account"), "Your Google Account gives you access to Gmail and other Google services. If you already have a Google Account, you can ", link(signIn, "sign in here"), "."]; }; decorations.boxhead = function() { return ["Required information for Google account"]; }; decorations.boxfoot = function() { return []; }; decorations.below = function() { return []; }; add(R + " #ugf-sg-below", "display: none;"); } else if (era === "sg11" || era === "sg13") { // the heading over two columns: what one account gets you, and the form const k13 = era === "sg13"; add(R + " #ugf-sg-banner", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto 20px; text-align: left;"); add(R + " #ugf-sg-banner h1", k13 ? "font: 24px 'Open Sans', Arial, sans-serif; color: #555; font-weight: normal; margin: 0;" : "font: normal 25px Arial, sans-serif; color: #222; margin: 0;"); add(R + " #ugf-sg-banner h2", "display: none;"); add(R + " body div:has(> #ugf-sg-side):has(> #ugf-sg-side)", "display: flex !important; flex-direction: row !important; justify-content: space-between !important; align-items: flex-start !important; width: 980px !important; max-width: calc(100% - 40px) !important; margin: 0 auto !important;"); add(R + " #ugf-sg-side", "flex: 0 1 520px; font: 13px Arial, sans-serif; color: " + (k13 ? "#555" : "#222") + ";"); add(R + " #ugf-sg-side h3", k13 ? "font: 18px 'Open Sans', Arial, sans-serif; color: #555; font-weight: normal; margin: 0 0 8px;" : "font: bold 16px Arial, sans-serif; color: #222; margin: 0 0 6px;"); add(R + " #ugf-sg-side p", "margin: 0 0 12px; line-height: 1.5;"); add(R + " #ugf-sg-side img", "display: block; width: 230px; height: auto; margin: 0 0 30px;"); add(CARD, "width: 340px !important; margin: 0 !important; flex: none !important;" + (k13 ? " padding: 20px 25px 25px !important;" : "")); add(CARD + " #headingText", "display: none !important;"); add(CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "font: bold 13px Arial, sans-serif !important; color: " + (k13 ? "#404040" : "#222") + " !important; text-align: left !important; margin: 0 0 10px !important;"); add(R + " #ugf-sg-boxhead", "display: none !important;"); if (!k13) { add(CARD + " " + FIELD + "::before", "display: block; font: bold 13px Arial, sans-serif; color: #222; margin: 0 0 .5em;"); } add(CARD + " select, " + CARD + " [role='combobox']", "box-sizing: border-box !important; height: " + (k13 ? "40px" : "29px") + " !important; font: 13px Arial, sans-serif !important; border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; border-radius: 1px !important; background-color: #fff !important; color: #222 !important; padding: 0 8px !important;"); add(R + " #ugf-sg-top a.up", k13 ? "background: #4d90fe; border-color: #3079ed;" : ""); decorations.top = function() { return [h("div", { class: "in" }, h("img", { src: k13 ? (newLogo ? A.logo15 : A.logo13) : A.logo10, alt: "Google" }), h("a", { class: "up", href: signIn }, "Sign in"))]; }; if (k13) { add(R + " #ugf-sg-top", "height: 71px; background: #fff; border-bottom: 1px solid #e5e5e5; margin-bottom: 30px; padding: 0; width: auto; text-align: left;"); add(R + " #ugf-sg-top .in", "width: 980px; max-width: calc(100% - 40px); margin: 0 auto; display: flex; align-items: center; justify-content: space-between; height: 71px;"); add(R + " #ugf-sg-top a.up", "display: inline-flex; align-items: center; box-sizing: border-box; height: 29px; padding: 0 12px; border: 1px solid #3079ed; border-radius: 2px; color: #fff; font: bold 11px Arial, sans-serif; text-decoration: none;"); } decorations.banner = function() { return [h("h1", {}, "Create your Google Account")]; }; decorations.boxhead = function() { return []; }; decorations.boxfoot = function() { return []; }; decorations.below = function() { return []; }; decorations.side = side; add(R + " #ugf-sg-below", "display: none;"); } else { // 2019 on: the wide card, the form on the left and Google's picture on the right add(CARD, "width: 748px !important; min-height: 0 !important; padding: 48px 40px 36px !important;"); add(CARD + " main", "width: calc(100% - 300px) !important; min-width: 0 !important;"); add(CARD + " #headingText, " + CARD + " #headingText *, " + CARD + " #headingSubtext, " + CARD + " #headingSubtext *", "text-align: left !important;"); add(CARD + " main > div:has(#headingText)", "text-align: left !important;"); add(R + " #ugf-sg-boxhead", "text-align: left !important;"); add(R + " #ugf-sg-art", "position: absolute; right: 40px; top: 50%; transform: translateY(-50%); width: 244px; text-align: center; font: 400 16px 'Google Sans', Roboto, Arial, sans-serif; color: #202124; line-height: 1.5;"); add(R + " #ugf-sg-art img", "width: 244px; height: 244px; display: block; margin: 0 0 16px;"); add(CARD + " select, " + CARD + " [role='combobox']", "border-radius: 4px !important;"); decorations.art = function() { const step = /birthday|basic/i.test(window.location.pathname) ? "personal" : "account"; return [h("img", { src: "https://ssl.gstatic.com/accounts/signup/glif/" + step + ".svg", alt: "" }), h("div", {}, "One account. All of Google working for you.")]; }; } } if (era === "sg07" || era === "sg11" || era === "sg13") { add(ROOT + " div:has(> c-wiz > footer), " + ROOT + " footer", "display: none !important;"); // the way to a new account was outside the box then (Create an account now, SIGN UP, // Create account under the card), each a plain link to Google's sign-up page // (on sign-in only: the sign-up steps' own buttons beside it, like "More options" and // "Cancel" on Privacy and Terms, stay) if (!SIGNUP) { add(CARD + " main > div:has(" + NEXT + ") button:not(:is(" + NEXT + "))", "display: none !important;"); // and its empty holder too, or it still takes room beside Next and pushes it off centre add(CARD + " main > div:has(" + NEXT + ") :is(div:has(" + NEXT + ")) > div:not(:has(" + NEXT + ")):not([id$='Next'])", "display: none !important;"); } } // ---- (6.2) Gmail's own sign-in page, 2005-2013: "Welcome to Gmail" and "A Google // approach to email." beside the sign-in box, as mail.google.com showed them when signed // out (from the pages themselves, Wayback Machine captures of each period). The box is // Google's own sign-in, restyled as the period's; nothing typed in it is ever read. if (GMAIL) { const gp = L === "2006" ? "g06" : L === "2007" ? "g07" : L === "2009" ? "g09" : L === "2009L" ? "g09l" : (L === "2010" || L === "2010N") ? "g10" : L === "2012" ? "g11" : (L === "2013" || L === "2013L") ? "g12" : "g05"; const kenn = gp === "g11" || gp === "g12"; const SIGNUP_URL = "https://accounts.google.com/signup?service=mail&continue=" + encodeURIComponent("https://mail.google.com/mail/"); const ABOUT = "https://www.google.com/gmail/about/"; const HELP = "https://support.google.com/mail/"; const WORK = "https://workspace.google.com/"; const TERMS = "https://policies.google.com/terms"; const PRIVACY = "https://policies.google.com/privacy"; // the storage counter, run as Gmail ran it: the period's own table of dates and sizes, // read at the period's date (moving on from there while the page is open) const CPT = { g05: [[1114930800000, 2150], [1117609200000, 2250], [1120201200000, 2350]], g06: [[1136102400000, 2680], [1149145200000, 2730], [1167638400000, 2800]], g07: [[1167638400000, 2800], [1175414400000, 2835], [1207033200000, 2980], [1238569200000, 3125], [1270105200000, 3270]], g09: [[1199433600000, 6283], [1224486000000, 7254], [2144908800000, 10996]], g12: [[1224486000000, 7254], [1335290400000, 7704], [1335376800000, 10240], [2144908800000, 13531]] }; const CP = CPT[gp] || CPT[kenn ? "g12" : "g09"]; const T0 = { g05: 1118800000000, g06: 1160611200000, g07: 1187049600000, g09: 1239926400000, g09l: 1260662400000, g10: 1284508800000, g11: 1323907200000, g12: 1350172800000 }[gp]; const born = Date.now(); const quota = function() { const now = T0 + (Date.now() - born); let i = 0; while (i < CP.length && now >= CP[i][0]) { i++; } let v; if (i === 0) { v = CP[0][1]; } else if (i === CP.length) { v = CP[i - 1][1]; } else { v = (now - CP[i - 1][0]) / (CP[i][0] - CP[i - 1][0]) * (CP[i][1] - CP[i - 1][1]) + CP[i - 1][1]; } const s = String(v); const dot = s.indexOf("."); return dot < 0 ? s + ".000000" : (s + "000000").substring(0, dot + 7); }; const qspan = function() { return h("span", { id: "ugf-gm-quota" }, quota()); }; setInterval(function() { const q = document.getElementById("ugf-gm-quota"); if (q) { q.textContent = quota(); } }, 1000); // the words of each period const intro = gp === "g05" ? "Gmail is an experiment in a new kind of webmail, built on the idea that you should never have to delete mail and you should always be able to find the message you want. The key features are: " : gp === "g06" ? "Gmail is a new kind of webmail, built on the idea that email can be more intuitive, efficient and useful. And maybe even fun. So give it a try—sign up with your mobile phone or ask someone you know with Gmail to invite you. And why not? After all, Gmail has:" : (gp === "g07" || gp === "g09") ? "Gmail is a new kind of webmail, built on the idea that email can be more intuitive, efficient, and useful. And maybe even fun. After all, Gmail has:" : "Gmail is built on the idea that email can be more intuitive, efficient, and useful. And maybe even fun. After all, Gmail has:"; const feat = function(icon, title, words) { return h("div", { class: "f" }, h("div", { class: "i" }, icon), h("div", { class: "t" }, h("b", {}, title), h("br"), ...words)); }; const img = function(src, cls) { return h("img", cls ? { src: src, alt: "", class: cls } : { src: src, alt: "" }); }; const sprite = function(y) { return h("span", { class: "sp", style: "background-position: 0 " + y + "px" }); }; const features = function() { if (gp === "g05") { return [h("ul", { class: "b" }, h("li", {}, h("b", {}, "Search, don't sort."), h("br"), "Use Google search to ", h("b", {}, "find the exact message"), " you want, no matter when it was sent or received."), h("li", {}, h("b", {}, "Don't throw anything away."), h("br"), "Over ", qspan(), " megabytes (and counting) of free storage so you'll never need to delete another message."), h("li", {}, h("b", {}, "Keep it all in context."), h("br"), "Each message is grouped with all its replies and displayed as a conversation."), h("li", {}, h("b", {}, "No pop-up ads. No untargeted banners."), h("br"), "You see only ", link(ABOUT, "relevant text ads"), " and links to related web pages of interest."))]; } if (gp === "g06" || gp === "g07") { return [feat(null, "Fast search", ["Use Google search to ", h("b", {}, "find the exact message"), " you want, no matter when it was sent or received."]), feat(null, "Lots of space", ["Over ", qspan(), " megabytes (and counting) of free storage so you'll never need to delete another message."]), feat(img(A.gmTalk), "Chat right inside Gmail", ["It's just one click to chat with the people you already email. You can even save your chats in your Gmail account. ", link(HELP, "Learn more")]), feat(img(gp === "g06" ? A.gmMob06 : A.gmMob07), "Mobile access", ["Read Gmail on your mobile phone by pointing your phone's web browser to ", h("b", {}, gp === "g06" ? "http://gmail.com" : "http://gmail.com/app"), ". ", link(ABOUT, "Learn more")]), gp === "g07" ? h("p", { class: "apps" }, "Get Gmail for your business, school, or organization with ", link(WORK, "Google Apps"), ".") : null].filter(Boolean); } if (gp === "g09") { return [feat(img(A.gmSpam), "Less spam", ["Keep unwanted messages out of your inbox with Google's innovative technology."]), feat(img(A.gmCell), "Mobile access", ["Read Gmail on your mobile phone by pointing your phone's web browser to ", h("b", {}, "http://gmail.com/app"), ". ", link(ABOUT, "Learn more")]), feat(img(A.gmStorage), "Lots of space", ["Over ", qspan(), " megabytes (and counting) of free storage so you'll never need to delete another message."])]; } if (gp === "g09l" || gp === "g10") { return [feat(sprite(-58), "Less spam", ["Keep unwanted messages out of your inbox with Google's innovative technology."]), feat(sprite(-142), "Mobile access", ["Read Gmail on your mobile phone by pointing your phone's web browser to ", h("b", {}, gp === "g09l" ? "http://gmail.com/app" : "http://gmail.com"), ". ", link(ABOUT, "Learn more")]), feat(sprite(0), "Lots of space", ["Over ", qspan(), " megabytes (and counting) of free storage."])]; } // Kennedy (late 2011-2013) const kf = function(src, title, words) { return h("li", {}, img(src), h("p", { class: "title" }, title), h("p", {}, ...words)); }; return [h("ul", { class: "features" }, kf(A.gmCabinet, "Lots of space", ["Over ", qspan(), " megabytes (and counting) of free storage."]), kf(A.gmNosign, "Less spam", ["Keep unwanted messages out of your inbox."]), kf(A.gmPhone, "Mobile access", ["Get Gmail on your mobile phone. ", link(ABOUT, "Learn more")]))]; }; decorations.side = function() { if (kenn) { return [h("div", { class: "ph" }, h("h1", {}, "Gmail"), h("h2", {}, "A Google approach to email.")), h("p", {}, intro)].concat(features(), [ h("ul", { class: "links" }, h("li", {}, link(ABOUT, "About Gmail")), h("li", {}, link(HELP, "New features!")), h("li", {}, link(HELP, "Switch to Gmail")), h("li", {}, link(SIGNUP_URL, "Create an account"))), gp === "g12" ? h("div", { class: "promo" }, img(A.gmApps), h("h3", {}, "Take Gmail to work with Google Apps for Business"), h("p", {}, "Love Gmail, but looking for a custom email address for your company?"), h("p", {}, "Get business email, calendar, and online docs @your_company.com. ", link(WORK, "Learn more"))) : null].filter(Boolean)); } return [h("b", { class: "hd" }, "A Google approach to email."), h("p", {}, intro)].concat(features()); }; decorations.gbelow = function() { if (kenn) { return []; } if (gp === "g05") { return [h("p", {}, "Learn more ", link(ABOUT, "about Gmail"), "."), h("p", {}, "Check out our ", link(HELP, "new features"), "!"), h("p", {}, "A few words about ", link(PRIVACY, "Gmail and privacy"), ".")]; } const links = h("p", { class: "two" }, link(ABOUT, "About Gmail"), link(HELP, "New features!")); if (gp === "g06" || gp === "g07") { return [h("p", { class: "su" }, h("a", { href: SIGNUP_URL }, "Sign up for Gmail")), links]; } return [h("p", {}, "New to Gmail? It's free and easy."), h("a", { class: "btn", href: SIGNUP_URL }, "Create an account »"), links]; }; if (kenn) { decorations.top = function() { return [h("div", { class: "in" }, h("img", { src: A.gmGoogle41, alt: "Google" }), h("span", { class: "new" }, "New to Gmail?", h("a", { class: "up", href: SIGNUP_URL }, "Create an account")))]; }; decorations.boxhead = function() { return [h("span", {}, "Sign in"), h("img", { src: A.gFlat, alt: "Google", width: "52", height: "19" })]; }; decorations.boxfoot = function() { return [link("https://accounts.google.com/signin/recovery", "Can't access your account?")]; }; decorations.foot = function() { return [h("div", { class: "in" }, h("span", {}, "© " + yearOf() + " Google"), link(WORK, "Gmail for Work"), link("https://policies.google.com/", "Terms & Privacy"), link(HELP, "Help"))]; }; } else { const logo = gp === "g05" ? A.gmLogo05 : gp === "g06" ? A.gmLogo06 : (gp === "g07" || gp === "g09") ? A.gmLogo07 : A.gmLogo2; decorations.top = function() { return [h("img", { class: "gm", src: logo, alt: "Gmail", width: "143", height: "59" }), h("div", { class: "bar" }, "Welcome to Gmail")]; }; decorations.boxhead = function() { return [gp === "g10" ? "Sign in with your" : "Sign in to Gmail with your", h("br"), h("img", { src: A.gmTrans, alt: "Google", width: "61", height: "25" }), h("b", {}, "Account")]; }; decorations.boxfoot = function() { return [link("https://accounts.google.com/signin/recovery", gp === "g05" ? "Forgot your password?" : (gp === "g09l" || gp === "g10") ? "Can't access your account?" : "I cannot access my account")]; }; decorations.foot = function() { const y = gp === "g05" ? "2005" : gp === "g06" ? "2006" : gp === "g07" ? "2007" : (gp === "g09" || gp === "g09l") ? "2009" : "2010"; const d = " - "; if (gp === "g05" || gp === "g06" || gp === "g07") { return ["©" + y + " Google" + d, link(PRIVACY, "Privacy Policy"), d, link("https://policies.google.com/", "Program Policies"), d, link(TERMS, "Terms of Use")]; } if (gp === "g09l") { return ["©" + y + " Google" + d, link(WORK, "Gmail for Organizations"), d, link(PRIVACY, "Privacy Policy"), d, link("https://policies.google.com/", "Program Policies"), d, link(TERMS, "Terms of Use")]; } return ["©" + y + " Google" + d, link(WORK, gp === "g09" ? "Gmail for Organizations" : "Gmail for Business"), d, link("https://gmail.googleblog.com/", "Gmail Blog"), d, link(gp === "g09" ? TERMS : "https://policies.google.com/", gp === "g09" ? "Terms" : "Terms & Privacy"), d, link(HELP, "Help")]; }; } decorations.below = null; decorations.banner = null; // the row: the period's words on the left, the box (and, to 2010, the box under it) on the right const PAR = R + " body div:has(> #ugf-sg-side):has(> #ugf-sg-gbelow)"; add(PAR + " > :not(#ugf-sg-side):not(#ugf-sg-gbelow):not(:has(#yDmH0d))", "grid-column: 1 / -1 !important;"); add(R + " #ugf-sg-side", "grid-column: 1; grid-row: 1 / span 3; min-width: 0;"); add(PAR + " > " + "div:has(> #yDmH0d)", "grid-column: 2 !important; grid-row: 1 !important; width: auto !important; margin: 0 !important; align-self: start !important;"); add(R + " #ugf-sg-gbelow", "grid-column: 2; grid-row: 2;"); add(R + " #ugf-sg-side a, " + R + " #ugf-sg-gbelow a, " + R + " #ugf-sg-foot a", kenn ? "color: #15c; text-decoration: none;" : "color: #00f; text-decoration: underline;"); if (!kenn) { // 2005-2010: tables at 95%, the blue bubble bars, the blue-edged boxes add(R + " body", "font: 13px Arial, sans-serif !important; color: #000 !important;"); add(R + " #ugf-sg-top", "display: flex !important; align-items: flex-start !important; gap: 0 !important; width: 95% !important; margin: 0 auto !important; padding: 2px 0 0 !important; border: 0 !important; box-sizing: border-box !important;"); add(R + " #ugf-sg-top img.gm", "width: 143px !important; height: 59px !important; margin: 10px 0 !important; flex: none;"); add(R + " #ugf-sg-top .bar", "flex: 1 1 auto; margin: 26px 0 0 4px; padding: 5px 4px; background: #c3d9ff; border-radius: 4px; font: bold 16px Arial, sans-serif; color: #000;"); add(PAR, "display: grid !important; grid-template-columns: minmax(0, 1fr) 252px !important; column-gap: 24px !important; align-items: start !important; width: 94% !important; max-width: none !important; margin: 14px auto 0 !important; padding: 0 !important; box-sizing: border-box !important;"); add(R + " #ugf-sg-side", "font: 13px/1.25 Arial, sans-serif; color: #000;"); add(R + " #ugf-sg-side .hd", "display: block; font: bold 16px Arial, sans-serif; margin: 0 0 14px;"); add(R + " #ugf-sg-side p", "margin: 0;"); add(R + " #ugf-sg-side ul.b", "margin: 16px 0 0; padding: 0 0 0 36px;"); add(R + " #ugf-sg-side ul.b li", "margin: 0 0 14px;"); add(R + " #ugf-sg-side .f", "display: flex; width: 90%; padding: 15px 0 0;"); add(R + " #ugf-sg-side .f .i", "flex: 0 0 50px; text-align: right;"); add(R + " #ugf-sg-side .f .i:empty", gp === "g06" || gp === "g07" ? "flex-basis: 50px;" : ""); add(R + " #ugf-sg-side .f .t", "flex: 1 1 auto; padding: 0 0 0 10px;"); add(R + " #ugf-sg-side .sp", "display: inline-block; width: 42px; height: 42px; background: url(" + A.gmFeat + ") no-repeat;"); add(R + " #ugf-sg-side p.apps", "margin: 26px 0 0;"); // the box: the pale blue fill inside a white gap and a blue edge (form-noindent) add(CARD, "box-sizing: border-box !important; width: auto !important; margin: 4px !important; padding: 10px 6px 12px !important; background: #e8eefa !important; border: 0 !important; box-shadow: 0 0 0 3px #fff, 0 0 0 4px #c3d9ff !important; border-radius: 0 !important;"); add(R + " #ugf-sg-boxhead", "text-align: center; font: 13px Arial, sans-serif; margin: 2px 0 10px;"); add(R + " #ugf-sg-boxhead img", "vertical-align: middle; margin-right: 4px;"); add(R + " #ugf-sg-boxhead b", "font-size: 16px; vertical-align: middle;"); add(CARD + " " + FIELD + "::before", "flex: 0 0 66px !important; font-size: 13px !important;"); add(CARD + " div:has(> #identifierId)::before", "content: 'Username:' !important;"); add(R + " #ugf-sg-boxfoot", "margin: 14px 0 0; font-size: 11px; text-align: center;"); add(R + " #ugf-sg-gbelow", "box-sizing: border-box; margin: 26px 4px 0; padding: 10px 6px 12px; background: #e8eefa; box-shadow: 0 0 0 3px #fff, 0 0 0 4px #c3d9ff; text-align: center; font: 13px Arial, sans-serif;"); add(R + " #ugf-sg-gbelow p", "margin: 10px 0;"); add(R + " #ugf-sg-gbelow p.su a", "font: bold 16px Arial, sans-serif;"); add(R + " #ugf-sg-gbelow p.two a", "margin: 0 8px;"); // the grey "Create an account >>" button, its left and right ends from Google's own picture add(R + " #ugf-sg-gbelow a.btn", "display: inline-block; box-sizing: border-box; height: 45px; padding: 0 2px; border-style: solid; border-width: 0 15px 0 14px; border-image: url(" + A.gmGrey + ") 0 15 0 14 fill stretch; color: #000 !important; text-decoration: none !important; font: bold 14px/45px Arial, sans-serif; white-space: nowrap; margin: 2px 0 6px;"); add(R + " #ugf-sg-foot", "width: 95% !important; margin: 24px auto 16px !important; padding: 3px 0 !important; background: #c3d9ff !important; border-radius: 4px !important; text-align: center !important; font: 13px Arial, sans-serif !important; color: #666 !important; box-sizing: border-box !important;"); } else { // late 2011-2013: Kennedy add(R + " #ugf-sg-top", "margin-bottom: 0 !important;"); add(R + " #ugf-sg-top .in", "width: auto !important; max-width: none !important; padding: 0 44px; box-sizing: border-box;"); add(R + " #ugf-sg-top .new", "font: 13px Arial, sans-serif; color: #222;"); add(R + " #ugf-sg-top a.up", "margin-left: 1em;"); add(PAR, "display: grid !important; grid-template-columns: minmax(0, 1fr) 335px !important; column-gap: 50px !important; align-items: start !important; width: auto !important; max-width: 1000px !important; min-width: 780px !important; margin: 0 auto !important; padding: 23px 44px 100px !important; box-sizing: border-box !important;"); add(CARD, "box-sizing: border-box !important; width: auto !important; margin: 0 !important; padding: 20px 25px 15px !important;"); add(CARD + " div:has(> #identifierId)::before", "content: 'Username' !important;"); add(R + " #ugf-sg-gbelow", "display: none;"); add(R + " #ugf-sg-side", "font: 13px Arial, sans-serif; color: #333;"); add(R + " #ugf-sg-side .ph", "margin: 0 0 1.5em;"); add(R + " #ugf-sg-side h1", "font: normal 25px/24px Arial, sans-serif; color: #dd4b39; margin: 0;"); add(R + " #ugf-sg-side h2", "font: normal 16px/24px Arial, sans-serif; color: #222; margin: .4em 0 0;"); add(R + " #ugf-sg-side p", "margin: 0 0 1em; line-height: 17px;"); add(R + " #ugf-sg-side ul", "list-style: none; margin: 0; padding: 0;"); add(R + " #ugf-sg-side ul.features", "overflow: hidden; margin: 2em 0 0;"); add(R + " #ugf-sg-side ul.features li", "margin: 3px 0 2em;"); add(R + " #ugf-sg-side ul.features img", "float: left; margin: -3px 0 0;"); add(R + " #ugf-sg-side ul.features p", "margin: 0 0 0 68px;"); add(R + " #ugf-sg-side ul.features p.title", "font-size: 16px; margin-bottom: .3em; color: #222;"); add(R + " #ugf-sg-side ul.links li", "display: inline-block; margin-right: 20px;"); add(R + " #ugf-sg-side .promo", "border: 1px solid #ebebeb; margin: 30px 0 0; padding: 20px; overflow: hidden;"); add(R + " #ugf-sg-side .promo img", "width: 42px; margin: 3px 0 0; float: left;"); add(R + " #ugf-sg-side .promo h3", "font: normal 16px/24px Arial, sans-serif; color: #222; margin: 0 0 .3em 60px;"); add(R + " #ugf-sg-side .promo p", "margin: 0 0 0 60px;"); add(R + " #ugf-sg-foot", "margin-top: auto !important;"); add(R + " #ugf-sg-foot .in", "width: auto !important; max-width: none !important; padding: 0 44px; box-sizing: border-box; color: #999; font-size: 11px;"); add(R + " #ugf-sg-foot a", "color: #333 !important; margin-left: 1.5em !important;"); } } const st = document.createElement("style"); st.id = "ugf-sg-styles"; st.textContent = css.join("\n"); const put = function() { const at = document.head || document.documentElement; if (!at) { return false; } document.documentElement.setAttribute("gplex-sg", era); at.appendChild(st); return true; }; if (!put()) { const wait = new MutationObserver(function() { if (put()) { wait.disconnect(); } }); wait.observe(document, { childList: true, subtree: true }); } // the period's own pieces around Google's form (links and pictures only) const place = function(id, make, parent, first) { if (!make || !parent) { return; } let el = document.getElementById(id); if (!el) { el = document.createElement("div"); el.id = id; make().forEach(function(c) { el.appendChild(typeof c === "string" ? document.createTextNode(c) : c); }); } if (el.parentNode !== parent) { if (first) { parent.insertBefore(el, parent.firstChild); } else { parent.appendChild(el); } } }; const dress = function() { if (!document.body) { return; } place("ugf-sg-top", decorations.top, document.body, false); place("ugf-sg-banner", decorations.banner, document.body, false); place("ugf-sg-below", decorations.below, document.body, false); place("ugf-sg-foot", decorations.foot, document.body, false); const box = document.getElementById("yDmH0d"); const card = box && box.parentElement; if (card) { place("ugf-sg-boxhead", decorations.boxhead, card, true); place("ugf-sg-boxfoot", decorations.boxfoot, card, false); place("ugf-sg-art", decorations.art, card, false); if (decorations.side && card.parentElement) { place("ugf-sg-side", decorations.side, card.parentElement, true); } if (decorations.gbelow && card.parentElement) { place("ugf-sg-gbelow", decorations.gbelow, card.parentElement, false); } } // each sign-up box's words, from the box's own label (the hint only) if (SIGNUP) { document.querySelectorAll("#yDmH0d input:is([type='text'],[type='email'],[type='password'],[type='tel'],[type='number'])").forEach(function(inp) { const holder = inp.parentElement; let words = inp.getAttribute("aria-label") || ""; if (!words && inp.id) { const lab = document.querySelector("label[for='" + inp.id + "']"); words = lab ? String(lab.textContent || "").trim() : ""; } if (!words) { const near = holder && holder.parentElement ? holder.parentElement.querySelector("label, [id$='label'], div[aria-hidden='true']") : null; words = near ? String(near.textContent || "").trim() : ""; } if (!words) { return; } if (era === "sg07" || era === "sg11") { if (holder && holder.getAttribute("data-ugf-label") !== words) { holder.setAttribute("data-ugf-label", words + (era === "sg07" ? ":" : "")); } } else if (!inp.getAttribute("placeholder")) { inp.setAttribute("placeholder", words); } }); // "Create your Google Account", the 2017-2022 wording const ht = document.querySelector("#headingText span, #headingText"); if (era === "sg19" && ht && /^Create a Google Account$/.test(String(ht.textContent || "").trim())) { ht.textContent = "Create your Google Account"; } } // "Sign in to continue to Gmail" (2014-2016), from Google's own line const h2 = document.querySelector("#ugf-sg-banner h2"); if (h2) { const sub = document.getElementById("headingSubtext"); const m = sub ? String(sub.textContent || "").match(/continue to (.+?)\s*$/i) : null; const want = m ? "Sign in to continue to " + m[1] : "Sign in with your Google Account"; if (h2.textContent !== want) { h2.textContent = want; } } // mark each checkbox's row, its box and its words (for the rules above) if (era !== "sg19") { document.querySelectorAll("#yDmH0d input[type='checkbox']").forEach(function(cb) { let child = cb; let el = cb.parentElement; while (el && el.id !== "yDmH0d") { const words = [].filter.call(el.children, function(c) { return c !== child && String(c.textContent || "").trim(); }); if (words.length) { if (!el.hasAttribute("ugf-sg-cbrow")) { el.setAttribute("ugf-sg-cbrow", ""); } if (!child.hasAttribute("ugf-sg-cbbox")) { child.setAttribute("ugf-sg-cbbox", ""); } words.forEach(function(w) { if (!w.hasAttribute("ugf-sg-cbtext")) { w.setAttribute("ugf-sg-cbtext", ""); } }); return; } child = el; el = el.parentElement; } }); } // 2014 on wrote what to type inside the box (only the hint: what is typed is never touched) if (era !== "sg07" && era !== "sg11") { const id = document.getElementById("identifierId"); if (id && !id.getAttribute("placeholder")) { id.setAttribute("placeholder", era === "sg13" ? "Enter your email" : "Email or phone"); } document.querySelectorAll('input[type="password"]:not([aria-hidden="true"]):not([tabindex="-1"])').forEach(function(pw) { if (!pw.getAttribute("placeholder")) { pw.setAttribute("placeholder", era === "sg13" ? "Password" : "Enter your password"); } }); } }; // the tab icon: exactly the one Gplex's search pages give the layout const fav = GMAIL ? A.gmFav : /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|retro)$/.test(L) ? A.fav1999 : L === "2009" ? A.fav2009 : ["2009L", "2010", "2010N", "2011", "2012"].indexOf(L) > -1 ? A.fav2010 : ["2013", "2013L", "2014", "2015", "2015L"].indexOf(L) > -1 ? A.fav2012 : A.fav2015; const setFav = function() { const head = document.head; if (!head) { return; } const ours = head.querySelectorAll("link.ugf-sg-fav"); const theirs = [].filter.call(head.querySelectorAll("link[rel~='icon'], link[rel='apple-touch-icon']"), function(l) { return !l.classList.contains("ugf-sg-fav"); }); theirs.forEach(function(l) { l.remove(); }); if (ours.length === 2 && !theirs.length) { return; } ours.forEach(function(l) { l.remove(); }); ["16x16", "32x32"].forEach(function(sz) { const l = document.createElement("link"); l.className = "ugf-sg-fav"; l.rel = "icon"; l.type = "image/x-icon"; l.setAttribute("sizes", sz); l.href = fav; head.appendChild(l); }); }; const favWatch = new MutationObserver(setFav); const favStart = function() { if (!document.head) { return false; } setFav(); favWatch.observe(document.head, { childList: true }); return true; }; if (!favStart()) { const waitHead = new MutationObserver(function() { if (favStart()) { waitHead.disconnect(); } }); waitHead.observe(document, { childList: true, subtree: true }); } const mo = new MutationObserver(dress); const start = function() { // (6.1.2) a path under signin/ that doesn't exist gets Google's error page: ugfErrorPage's if (ugfIsErrorPage()) { document.documentElement.removeAttribute("gplex-sg"); st.remove(); // (its tab icon stays: it is the same one ugfErrorPage gives the period) favWatch.disconnect(); return; } dress(); mo.observe(document.body, { childList: true, subtree: true }); }; if (document.body) { start(); } else { document.addEventListener("DOMContentLoaded", start); } } catch (e) {} })(); // ---- end Gplex sign-in page ---- // ---- Gplex advanced search page ---- // (5.9) Google's Advanced Search page as each period had it. Gplex draws the form; what it // sends is an ordinary search: the words, phrases and operators in the box (site:, filetype:, // allintitle: ...) plus Google's own lr=, cr=, tbs= and safe= settings, so the results come // back on Gplex's results page like any other search. (function ugfAdvancedSearch() { try { if (window.location.host !== "www.google.com" || window.top !== window.self || !/^\/(advanced_search|preferences)\/?$/.test(window.location.pathname || "") || /[?&]gplex=false\b/.test(window.location.search || "")) { return; } let L = "2015"; try { L = String(window.localStorage.getItem("UGF_LAYOUT") || (typeof GM_getValue === "function" ? GM_getValue("UGF_LAYOUT", null) : null) || "2015"); } catch (e) {} const A = {"nav09":"data:image/png;base64,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","logo10":"data:image/png;base64,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","logo13":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAAxCAYAAAAIlEGVAAAgbklEQVR42u19eZxcVZn2855zb1V19ZJ0J52NQNiM0IkDDGHY6Q4MGkDUUasZGGcTSFhEBnFEHZ3q8mM2FRxHAWmWUZkZnS6XQRCjIOlGFNQggulmXxJClt7X6qp773mf749b3el0tg7Lp+OX9/e7v0519V3OOc95t+d9bwQzkQwtGkDkRCd+tfAjr841LnmEmORhGgWLCFOjAARUGgySpteIbjY29dKWG9Ov7HS9LD20wEGEOCD7L9msQS6nv41by16/JQUtkAmgHPyxkWXi5J2keztVTzAVs6thARBg+UoEQAdoBGhpCFTtFWM2UvmownzfD0Y7trYeVJgEYl60fNoBmYkQAgErv/6B5ZhddSZGSwa6Yx2VTiWdqtSxoL34F1/92RsNLtmrVsmLA4Al1400Gco1dDzX1lR5GgLR2OAmijxEug10sq18OUNwoVLeCvAEGP9o41eBrgjCAlQwKr2g5NeFpdaem+dvO4CA/dQsLTmm/+uvzkHK/77MqQKHizt2qiqQ9sGe0SdA753jz9++BS0g5I3bkLsHTHadh9zK6IiP9B1ML/k5QC6QVBpaLIEafQOit3rFbY8+/6WlpT1eeTX9+mT/CVb8ixX8gEASGpUCsckEvDQ0GO0m3ecj2tuHbp41GD/JARO1z/W676pEanDsb5EwdSi6JEQvjSEhDgljEGlncTTxR1jTGk5oozfXJDXSQ4dEh1/bfZ741beL8ReQhItKz8JFH375xtk/nObbCNAOoGnHNbrACe0EAPOvHjqRii+LX7lCi/2OSkI8z9TUwY30XtZ3c/2tUzXaAZmZVN164dyw0t8OiAEZoirpc7h4S/CXd12BW1f7WNMavtH39HZxRnMSHfrRvkvFq2ylCwAY0IUPm5GR9734lYXdaKNFHkAeuvcFpiCTN+jOyPYvys8XX7PpjCDkzbCpPwcDlWQNdLjnc3299bcjS4PcAbDMWG5d7WPpQgabXqwDp2x7AoQoCEH7wjdFW3s7aYucREs+MvBXJjGr1ZWGI+OnPKfB+iSK5z7zlYUjyNJDs0QzVF5EHjEIGtd5m79wyDiAv557Re8ZpnLO4Tra99ner8y7DqQciJb2U7YsdFiTU/nqXziNUQKQ8QECAmLdm3Nrb6qDe8jf9J0Km7rNlcYiESvq3KDqaPMzNywcQRvtzMEyTTqaXKxxYAQ9tRzv/7fer8y9DhlaCPQAAl5H0MQJ1RIf5Js7nQbZrEEDeORVvTU0/l0Q41EDSqLKalj61KYbFr6E1et9NL9ekyGsr++uEMgnem6aczWyNMhDDzi6r11KAEiCYPnnmy8elrUImsWVru7/e5OqPkwLA4FJVCbc+OBzVbNqb4v9C0SvFywA0HPz/FEAtwKUqUnAA/LaIUPashPDOG2hE9Pa/iYBplncgmv7l4DeFVocUQoENgkEY7d35SRAlh4g0Rt2x9jBfV1gYTZr2tvbze6+a2pqUnkDElUkBHkY1O8mkuwBkYHK6wpZYxMdR5n7ITk4oGWnTB4gU3yY1z+PTfPmEfm8ym4Sqh4AWCeXoqK6QscHIhHju+JQ5FHvnkgevqEQfY1gISDIZIzJ510ZELu/TkdH/PeZjJV83r0GoBjkISJwAPZ6Pttg0QlKbj/miIyB2CxuMijY/10nUy8Xg2Uiebfvs9syGZtpaOBe57E8h9OB4y3JvpQK+7WZQTE2gl4KDAvPvDx77nPlBf6t+xhtE4tfBsArF573FtCd6KgNCp2vJEluNZCXoFx/xLcffFLyeUdAWgDJzWAaJzRKGSjgw3Oq4aVWIOJxCHk4INUABuDhFVjtxLD3C1m1uX8CONI8g8XP0ELEAXCLr9lUIYm5xyMMj4e6g0lUk/BUIIABVEFQlKCoOooV8ZIVDEr/0p2r+82kE+MTEJlUWvvcdNmsSC7nAGDjRecdDoangVgeqdYrdNiHfRWiXaM69jPJ5+PxZWEmNoUXDMxaIdY7QqNifEWTADi+ATnR34Vk2oSmaMs0JE7xD77IElcmPa4gBcOBcySlLuGZas9iKAgxWArdxvc1/sIpvyLffejrAMhs1uzNTDELI3G05rhu/nIk8CEo/hwppjFKAAyRgI9aE0NvUIBU1M2H5n8XQ+4GOb/3uX2CpjyXS67YvkDS6Q8D5lLxKuY6FcD3YCs8aAAgVMCYskuiEGsg5eRHONR34yyv/5nubNYil4tQdnp3hEt7VhhlWBG5HF++YNVZvsG1SaPnVFgfA6UQFZ7FbD+BonMYCRwqNdnz8nvP+I/R0eB6yT3aPwEaA+A0eCnDiXhMBBRuBID9tq9vElg2NZ99xqlm8aMLkol/j5weORIEnxgOw4Zw2K8DTN1gITx280jhX0aKpTEfsKCeXGnxtRfffcr9T73jxEMll1Nms2aPYMlBeR+S/MnczyKlj6MWawB9EH3BeRgJFwGuDgwOQnfwPvSVHoZxgLp5SGINqvEr3l9/lTTDkTC7V5ExWA67tv98W1W53q+u+gThXtBC/zlO9GCUxo6Ihocv1vHRZ6EBtNAfaHEg0KgY6Wjv193I0IVuaOCdPV+ee22ZjtHdxtd78GEmwPLsqlXJTX969s01vjxQZeWc4VLw1e3jhcYxFy0eLwRHbhkbu7R3rPicOofIufoqa66pStufdp1zwlLJQZmF8ZRcZss3Ilk2h6b/t55fKIPl5ff98aWe4JbahGe3jo7dO47gg0vbHu6Z9udPAHji2fNP/R/fIA/qogGnUY1v/xgJ/OSJc046V3K530zXNJNgeWhBPUzwLdTgDAy5ED3Rn0rjwH9Pu8cogO+wDXdj7pzPI4W/wbArwUgVavBv/FHtYSIDH9lF02Rp0Czu8GsH3mu8xLeQSEs4Mnjfxs/Pfue0lMKLi64culsS0XdMsuYMLQ05aGTEr1ylpeEbum9Z8OREJn43iZidfeDdmCG+3J7cPB59d24iuaq/WBoNnDYf/u0HfzBtjC88/c7j/wcmdXfKyim94+PFGs87qmTkvifPO+2EltzDQ0Ygi6kKKmXCdxI4/V3wWV54X+MHqnxp9UjbMza+/vlul1maf7hn/erjfWazhvGMC7NZw9XH+0vv+emjhVLpXUId90E7VAxCj1xcgejeDeeesKAllwOzsRYgIWgB+MP5lUDxXlTwDIxGDpFeLI0D/81b4bMNloRMHuvgIQPKmX3XYDT6OqqYRBRFGAwjzMI1/EHNJ6UZjm2wOyJC8IiPDx4J491FQrQ4WqRG1wJCZDckQAqyNFhNf8tNs/oEA3/CaHyTeCkDjZwYOw9+6oH6K0YXoAUOWZo9qZHdxWz5TMZILqcbR+TOWdauGhwvMiiFVx327Qd/sCGTSbRlMjabhWEWZkOmIXHUvY/1FhQXhmE07JHJoWIpqPXMEb4rfjwHqFGgktNu7ByqfptgyeTz+up7G49KUVoLpUAjF7EUuY+t7OgoMtvorWh9LJRcTiV28yi5nErrY2FbpiGxbO36xwth9OkKA0t1ZjQIwiorhyAMb4qd32x5Jst+i1/4Air5Ryg5Rcl1yMrBu7gePtYgkmY4EXDyWIloMpLyh67EaLQRCVpABUNRhASu5/01J0yCpisvgFBDXi+JyjRFqIx+s/HG+qdBCnLLA4jEhWmtEmL1en/zFw7pR1T8GGxKABgNRiKbnFUvElwTUyjTwuCdgMKdjBUzGducz7sX33Nqc7VnLhwtlXQ8CDoPvbvja8xk7PJ8PmzO510uB5Uc2IUu9+yqVcnl9/50UzEK708bIahuOAgBdR996h3HHGoAFqfelyTEyOI3M/mz10CioYECsBhFX0yAFYYqxTB85vHk/IcIiOQ69pgTyuS7wrZMxmr1+E1DxeD5lBErhBksBq7CyHs7V77tDMnldEO2ISHNcPxx1RlI8VIMRQF8NRD3NRKCkRiIu01BChTtMLISo4jc9UiogAo4BXwVhNE/xnhsA/LN7qCrehcT5l2uNOzgVQhongcoaGm3u1y89fgIWZot2+u/pcWBTvHTBhBoMEaBXrj4mk0VyK2M0NUlOyFmwn+Z+sTPvlWQz+v61cf7cMyOByGTAiPk9wVge3e3lA2arGts9ACwOQ+3dO3a0ovnHrfEJ44QVVNjTYU6HQP5rTBS44myb9IWigg1hJJvAQC0NDnkXlf2S9ACu1fgtQNoagK68mxDHpLLuZfeecrJCcHbh4MgnO17fkh9ojmfd+W8wB4jEQG4rrtblnd0BZ1nHdOa8vjZIh1BwIdwHPwwgIeWLaooO23uOhgBlAZjAErypAhI7iMMb4IjIWgvfBOjqc/Ak4WIoBgF4eEs3pc+Ts698HEBYKycIn5VhQuGS0JYnczENu0hI06LvES4qv8b8FLXIxonXEkgclAUpQ8D0IWGKwTI75S3m+6/rNqwyQjATZsTJ3u+NIyHYZgW+HThCwTkuYoKy0yGks87dMSb8NlVKxo94aVQ/lm1JxgOwk4KvyEm+ubRaztfiBN3IhshJmY4QcOoCKguO+TywdpNIgOx1n8NuZgdLPS+s8Rxrg31MdLhNLwoaRMcV+eoxqfTHgAo74q9r2VHhwKAavSd4cBcL0TCEVoInSixsuuso+bImsf6CvemlgB6JgogDDw4lJDAYLxR9kF0xKCyshKj/IHeg0pZjWEoCKACHkbkXQBiwMAeSWPiGid1gJgFgBAt3P1m7IqX3ZHtNiwApAWp8JJGo7FZAICtz8ouTi53/sWJdeOyFkCJ7uw0hAWqU1WfoBMAWLu2BAAvnXvCAue0WYDL5vj26MEwQqj63aFIbw9rgweW57uCqa6C5+g2WOdApcRpq0BNoqpuvFQ4EeAP0QaD5v3MSJbBUnPxpjqvcs5KFEcJQgAHGrGALSdRLcRFymR1QsLh3qbWg+7PZrOGv7jv1JKLBEpDKgid8f0FUAIi6zpf6Fy5/Im0NSeMRY4BQV+kLhQsB9CRMO5kpJHCKCJ48OBAwM58Y7THDjcUP0Ckqyf3uQOg+KPyDoQTl7axqRd1JSjdUfOv3Vq5XWRst5uxLa7QpedeZFQagbHVUAe6kjPqxYBeuJQ7myTEo+YOH+bn/ZNatMGpEaoCVKjSAuBz7zi+yRP5a6p+YF7SMz3F8OW+IPw7Cfifb1n3640TV1/X2Oi1d3Roc1mze9baRzUqhCLGL9tBpfhGqBcAshZ57r9mAVC3ZkuDeBVrbTp9MBPpHRshCAG6OCmpCkmlwGDQUXGeAFz7yCO1gC4OYgZWqAp1Ont/HqG9sdGioyMSYr0nOIFQiopLeuKp6sGIofpWmPLsOgCCJIxWTGqY3D4BowKQXvAECl4AQQKEK7vFi5GNDHOiovIq48U0DEtq/PRCP8IKkA/FFMG0zVjWHSmpHwzRPwqYahghXLDVS819OdZCN3M6lTRdquuq48IH1XqnDqR6hSgEHS9+7u1/uHpB0l8xGEaIHO/eXgpv2Vyq/vHKsmliFgZdGUE+r9Kxs8/obT+t7qm563o7JVFxDMOCArAMRgCx762/Yvsnem7G9v0iDAVAFhZi3ifwfhUNbG8nJe4tEIgA51KkClQCBhqVxm0welbfnUvWA4KjpC9ZUq1WNSBVIlWAPAgA2svmZqai0E5QAI2deUNABam4sMPVTtHgiiQMIrcIwNPIzyBhmSuf6bAF5KvwcRhKmKgxSO2oH5FHXDgGxOrLwSaMBmOXQKQD2d3k8glAKE5QCWolXKBSUWe00Ne2+QsyjsZ1HhradbcmibuSSVRYqgJKGVfHCmtODMlXukvB3wVF919Hdzzx8nRtEtMA+T2z1bis+9uwqWMRjDGm3cJIUrU1Wuz7G0A+jvZ1duYkpBA5RP3A/9ndt7Wrtz0rNjGbUSkUP+UzGH2y784l6xsb13kdHSujSEMHmChWr5RAHZT6lmdXHZlcuvb50g4ufwbKTmVTFNeJxM4UCYUUyhMcTia9CIUPgxIaCKzbLUO9Gweb8WyVeC+3w+CwHc/FMeREkaXZ2IInFl098FObrDlVS0Pg+LCKTTUvuqr7xi05eRyr6aNVdtTeroEHSBiVth9vvXQ1YUSLg694UfKf4iCiZcc6FAEkOM00xZ9G+kckppd0EDAglFaMlJwbjSgnHf3Ar7bsS5vsTgwAqG++6oqDBYpnSJKAZWlEYVJXzV3T/RZ0rIyQabP7bZoytMjQopEeMrRYTR8Cs9NyiykhSzNvXg8BQG1hCMoeC0IBKTmlAQ62UcXS8gD37fjO65i4w2ikBGPv24w7hRh5KdYp3AjH2PZPHI4nC0D0zLBsoaX8LORIObzVWI3hZQDIosWDCIX2o+oC0niGdA7iJWhTX1ty9cBstEqILA0ytMjSlD97RvxPSbJKSNfnguJ7t7bW9MY9YtM4Me4+aTe/blzK43zRxqV4iJxzaStVAncWGxu9DZmGhOSgks87meEmNMjQ9n9p7mZx0S2SnGVAOsAIGVFsMk0xt8W1G5l906E7hxJx50BeHDoQ/1wYu5YTIyURO9s50XxDhm2ZjF269vkSBZ2+AQWqpLpqz5iQcnbZQTEzfQSjagGBkOqLSKjYmvKjzvKXj6FIALQQmvK/m/hDVJZ5of3g0ehN5kMMAfBncVYip8jQvvqlWY+6YOxy8dIGXtrXYCQQ470tEO9HC64cXIGcxAX1OdH5V/Qtm983cI+pqj3NjQ89xdLQWX2ti9Yj02b3qzTk5Unl+ahTFVUKSTgllLxSOjqiZVi238RyXCaZpQlTieu12LcJfoVHOEeI1WDImVRN45zLu29AszhkYfcLNHvJYXNq6qEs9eWwmdR7DCBOKVBK4BSqvKBc77LPSWvvboyvY6Xei8tFopQxALh26drnh9syGQviVwjwIhLlRwrhkMYiAGfGORbsU6NKDloG1lw4AAYeCgihuGfCMUZeHDK0275cf2tUGnwXqc9IsjZB8SHJqhMkWfHL+R/qWz/vQ31t867qewiCx0xl7So31v9gsTB8Ws+tBz8RM93NbncVd5PqZRr5+MtD5ykAuEh/PBK6UStiCJixKHJV1pzY2bTsAsnnHcupjJkDBkJ05WXoi7WDUPeXUChgJebWjdXiYCSJWdfUXdb9SeQkQhayRz5jr57wNH5Mp9jdHTkUB0DCFPKDQdidMCIEZCyKNGXlhM4z33a6AMpMZkbmUVWPjW9BM+aUQvNvcTY5b+VclADchiQkHjMmIqarREA07V1FT/BL+B7mATgUJSjSsIhwt7wHz7ANdrKwqgya7V+qv8dufuK4KCxcRFe8Mxob7HDB6GMQHGRTdRnjpU+H9ZPR2OB2FAYvGr7jkH5k6e21xGTS2d25gqoL3dqWydjlHV3bVPndSisCqiMpgXOaMPKvjzYeuVg6OqJ1MwQNAYkXPt/skKHtu3VhuwbDl4qXNoAF4rSkx9KwM4nqf6i9rO9G5MrcR5be/gMH4GQnNXexmgKQmYz5g+//ZkCV/1hlxTAeJC0goPsnAEB3d5wD2cOgeuZ1kIBR4l1jkWqN5yVCp7cd97OuX7dlYNGCkFkY1OFmDOMVJOGBAMagSOFsfh/niMBxHfY8ka3wREAQ70Aa1RAoxlEE8SkSgsy00ZVBszl/ynj3F6u/se1fqy/u/nJtU/eX56wgeTOpkQvHCrAJwAVPdd9xxHaspr8LO727EXNqq8lUqiRfzt+H/zAWucCUydqiU3hGFsw2qXt+ffIfzFtZBk1bBnbavMbkbiZjCRgBpix4Xhyy67z+2xbfqeMDl8D6hK0wVI2oarQ07Eyi8pq6K/p/XH/J9mORk2giEkC27NRmGXchTB40yLRZHH+rhyw9dE20bnLPhHw+r20Z2Ib6zi/3B9EDs33rE9TRKHI1nnfqhsaGj0tHR/TY8cd7ZeZ5coBZwHQ2NPjNebjHTzt6TdLao3wRMxxGvxkHP8osTCZfrsVdBpGTMAyHSyFl91+hcCA83MI21MtKRFwPf6o/M8FayxqEbEMFLD6JEIoKeCjhw/IePDNJbO5CHUvcbtNGi+w6D6vX+2X+9BjSWSF8BgXCpP5w3uWv/MEEIblHrEROduzA8k86oi1jgXlGCOYzGXP0umeeGVd+erbvWSFCgZix0LmUkWNTSfeTzjOOPn1lR0fUnMd05zcmd2OnWH9+2lFLd92l5b7qOau3nUUv1Sp++nCWBgHVCAKKX+3TlYoEWxEGrQO3L+zcHw0z+5ItL4hJHEoXlCRRkdCg8MuhOw46eWquZwLlnW9vqPVCeaDGt8f1h1FkIfTF+EXnVi/v6Lptl2qysjx++lFv9yDfrrK2aiRyz4w4vOPUR57aOLXUcGppJb+HK1CNmxAACBCgEgmEeARF/Im8G9snyyHKtED53AQqcBeq0YwQwBg+Le/B9TMu1wQFVz2XQN2rbl7Psn8wlfUfc6M9EUAbk5S6haXCRb23LeqIfZgpLTkTxWBzfrUEYl6AiEAZoirhY7TUig9/b830CoDmfN5taGq4Y47vfbAviNxE/VPKGhsShPI/QuXX1BYeO65j4+BEyP34j4+cY5FoVOqfO+Je2Vs54ayLNtba2dWfInGZ8SvTjApgNB5BRCRRYxmMBhD5CZQPKPhL1eiVRNKNAmlISAauWEmRuZ54h0J4jCpOF5FTxVYAxkC8SrjC1oeHbl98+vTkYBYwOUB/ctrbaut9bU1b8/5AiUDVeSLWKe8g9F+P7ni6cwIsT572tsMV7rK0lb/1RTAURt8bj0qrT/75S9ung2VKEZUnOUS8F81I4CakMBfDAJIAFM8jxGeQxPfkbAwBAL+HNCzOBHA95uIY9KIPET4q78ZX9wmW2ITHumzKWBdfs6miFFb9GmKOoAsBVSM2JQQiaOm63lvm3bgj2BBigoT9wvkXIu1/HYFzUBp4Aii3QvVSjONpVETj6K8eYi4f5jMwzXm4DU0Nn02J+VsRYCxSEgxB2ErP2kAVpYhbIXyVCqdgtRU5OiEi444fWvHI0zft5XUfbZOeefUl3Utt0rtEXJQRmzwUJgm48osbbDJ2hVwJDEcdgRBKC4GBTVpJVEM8v0wLBNBi75gQz0H4C8B7CKoPD965cNMuIdMU0ABAZ9OyCzzwWkJOSFmDamswEDoUIt1IcJBkXdqzByfFYDiMfhERNxz306faphcx73avT2ia7+JgVOA6ABfBQy0qENNePRibDFQFh6EWaQyjAOJ2FHCjvB8b9wqWbNagq0WmOq/1V2yvEs8/XJVHU3WxEH9iUrNP1dIIwMiBFIqIpGqFxaHb+3ofvAwNnURXl6Atr/jS+X+KlP9f8OKC8Unj7kmsn0MHjJYeQ9quwup7+9CSFeZyFIBPNh79xx7M3xM8vdIYOBJB2f9JGEFCBAJgOFJEynsLoVx30i+6usp+zD7UZgZmYqCLr2HFyNjgScZoE1VXCPRQ0M0hUAmIF+cjJAQ4TsiIkH0ENgvxIsU8JapPW4TP9925ZMt+BOE7Vf53NR51EuCtJLksJA8BdA4pBR/YCMNfRqH86NhHnnp8qmmbSVJq6oLzf7AICZwJxUkgDgVxEOKWnF4InobgQSjWybvQu8+ugSmF9PMu33a4msT5Ar6b5GkmMcunhmAwqgC2ABwmZL4ka+YwGHIgDWAiSc3x3XjPdwYWzM8AANLvrkTKfRKel0YYRQDNZH86SUAUvngItBXX3PfU1JcKtWVgm8vtLU82vnWFR3tWSBzrVBeBqCQxbIFXjcXj6vCjYx95esPU82aWU8nSoAuyS3iXpanZ/Mpsz0tXsFQ04qVYYhR60XhpqDBWQH55sMdrNq6LI5Cmdp3JG5L2t8/otfQlMQuDZRCZITu/z76kMljqV288gl7Npwm+36uurXQj/UUC/0kXrTVOnqTK1r6RuQU0gHNe2bQAyfQXJDGrmaVBxiUREpmKel/Htn+u/7ZFH9vPZsBdqJS2DGwmD53JRsoCpqVcBQBgf7sCdurW030/NAXZyRgkrvVog76OtzVIWwamvrtReubNY2c+zxaALYC0ZDLS3t0tTU0dKrk9VbjOlNWYkrhrwtRXqgnaYWbU+VgGy9zLt14Am75FvIpaaAiNSjf648V/3vbvi3r29gx1a3qvhrU3gM7ChQpjSTEGLjpmoHXBb5DNJtDUrnusTWsC0N60183ILEx7e6PpmdfBzjwm53JZBlLf3Tgxl7rnjNr+T218frZlx3VaWqYEof+fNtqXwVK3Zvv7TbI6z2gMMEmFK13Xd0v952MNSw/zwPhlkxPAE071d2pXbz1PbEWejJJg6CRZ57M48M8DrQs+sdsOggPyv1CyWQNQ5l28bf6cy3v751ze7+ZeOezmrNn+SNmMzyzhmdmQAIC61ZszdVcOsXbNtqDuylHOvnTr2ikR1/9zMQdW+I2WFgMII4tLkaipVRcEtCmjwm9NauSZ+B/55QGy9PpbF+c1GLtfbIUPhoCg+rc5ugOAeeNlooP0bLiAImJABwO7NSYk2/fXoRKKWQtjQQpJxk2GXXk5AJjfBylrDwXnx/XWMWWn0EMAIZqa9lNhtYiQAZWAWBHqegBAQ+YAYH4/pGx2iOGY0KbQFQHV5p39nBnI1scEuZxS3SkQowxGQ6v45k6a7ABg/rc7vRN1NHwINilwFAYFlUTNcbNXb4tLRHKfmcL2T68voiDTFlcntq4IZ31w83GwifNhfEO6r/TdufiZ8gssfwdfHX9AXgNgaJAzOvuKV5cg8jaIMVVwQQQxRryUoQv/sbJ//PrN+UPGd9VMO6chaj64ZYXxzDdNxfwj3NiWR6qrF521uQalOAz/7aQsDgDmTQONaN3FmzNMVH0ToGFYiCAGkqj2GBWeBvUupd4PjV4YvuOQybdlzLr6pdk6VnGUhTRD+GGTnm+1sO2Hruj+bOSuxX2vubHwAGB+x6WcvKu5ZNM7jFf5JfHTb4ELwXAMsAmITYLBCEjdBpFuUSpj6vAgqairlUQKOtbbwyj8l6E7Ft4ICH8X3ml8ADBvKmhixr8+s6Eqqp37AUKaoXosRGphPIjxAJMApNzF40pgWBiEyM9FvO+ECL4z2npQ755M1gHA/B6DZuJj3SW9i51Gb4XhoaCbDQGFEqnYHipeJvX50ak8U+M6Dx0rHX5H/oug/wtPK8i9UJHP8QAAAABJRU5ErkJggg==","logo15":"data:image/png;base64,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","fav1999":"data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","fav2009":"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbUFHBwcFQAAABoAAAAaAAAAFgAAAA8AAAAWBAAAGwIAABoAAAAXAAAAGQAAABkAAAAaAAAAGg0NDRiOjo4JJiYmDwAAABQAAAATAAAADQwCAR1YFRB4nCsqua0yLMSbLCyxYxoYfBgFAiwDAQAUAAAAEgAAABMAAAAUBwcHEhQUFA0AAAAOAAAACxMEARayLy/F7T9C/640K7FuJR1pZiMgYpczMZqeLSzBIAcFPQEBABAAAAANAAAADgAAAA4XFxcJAAAACgAAAABbKSNY/1ZO/3MdHY8AAAAAAAAAAAAAAAAAAAAAjzc2lHwdG7oDAAAVAAAACAAAAAoAAAAKFxcXBgAAAAcAAAAAVj43Tfx6df87BQFmAQIAAgAAAAQAAAAEAAAAAI0vJomvLCftCwEAHQAAAAQAAAAHAAAABxEREQQAAAAEAAAAAwYEAAi4bVm0uT8/4UwOC1wnBgMlFAQAEF4YGmnwQ0X8niQfxQEAAAgAAAADAAAABAAAAAQzMzMCHh4eAh8fHwMAAAAAKSglBJVbWGfQX16qxktJsLItKNTqP0X/5DxE8VklJTsAAAAAHx8fAh8fHwIfHx8C7+/vBO3t7QTt7e0E7e3tBOrr6wIAAAAAAAAAALWHgkH+VFD/xjI226J1dDYAAAAA7e7uBO3t7QTt7e0E7e3tBP///wn///8K////Cv///wv///8Eybi3HHw1LHeySkjC/nd2/34iIZ1rbGkJ8fHxCv///wr///8K////Cv///wr///8R////E////xP///8P9OTiHtFGSNHPKS//15KSeP7k4Evgb3DOXh4cjouJiCD9/f4R////E////xP///8T////Gf///xv///8b////Dvu3rnbrNCn/o1NTk9/r6wn///8C/9fXaqskJf9kTUxX7e/vGP///xr///8b////G////yH///8k////JP///xb/0MyT00JA/5Byblv7//8d////Fv7Ix3XUNjH/hFhVee/z8x3///8j////JP///yT///8o////Lf///yz///8j//DmZNphWv+Oa2ll4urpJPHy8iLwcWDF0zEn+7edm1f///8m////LP///yz///8s////MP///zX///80////M////y77u7KoxlhZyrV/f3XSc3Oy7z83/7w5NtymioZg5OHgOf///zP///80////Nf///yv///89////Ov///zr///84////M//T0m/3oaGk/bS0uv24ubPujouw2oqIoO3j40r///83////PP///zP///8K////Mf///z7///89////Pf///z3///80////Mf///zH///8x////Mf///zX///88////Pv///zf///8SAAAAAAAAAAAAAAAAI8AAACBAAAAAAAAAEAgAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","fav2010":"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==","fav2012":"data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAAAAAAAAAA9IVCSvSFQuf0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULk9IVCSvSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQuf0hUL/9IVC//SFQv/0hUL/9Y1O//rIq//+7+f//eXX//vUvf/7z7X/96Fu//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vYwv/97OH/9ZRZ//SFQv/0hUL/9IhG//zbx//3om7/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97uX/+buW//SFQv/0hUL/9IVC//SFQv/5upT/+9O6//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+b6b//zezP/0iEf/9IVC//SFQv/1klf//ezh//vPtP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/3qXr/+siq//m8lv/5wqD//vTu//3t4//1klb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0h0b//vbx//zi0//1j1H/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2nmn/+bmS/////v/4sIX/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5uJH///v5//eoef/1jU//+82y//afav/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vXw//vOs//0hUL/9IVC//ekcf/96+D/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//728v/4sIX/9IVC//SFQv/4s4n///v4//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6yKn/+byX//SFQv/0hkT//eTV//vWv//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IZE//m6lP/5u5b//OHQ///+/f/6y6//96d3//SFQv/0hUL/9IVC//SFQv/0hULm9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSfSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAASCwAAEgsAAAAAAAAAAAAA9IVCAPSFQif0hUKt9IVC8vSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvL0hUKt9IVCJ/SFQgD0hUIo9IVC7/SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULv9IVCKPSFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVC8fSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvP0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YtL//i2jv/828f//vLr///7+P///Pv//vTu//3n2v/6zbH/96Nw//SFQ//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ekcv/+8+z////////////+9fD/+9K5//m9mf/4to7/+buV//vSuf/++PT//OPT//aYYP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2l13///r3/////////fv/+b2Z//SIRv/0hUL/9IVC//SFQv/0hUL/9IVC//WNT//84M///vXv//aZYf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vPtP////////////i0i//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//WQUv///Pr//OPU//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//eTV///////+9O7/9IVD//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//3m2P//////9ppi//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/718H///////3s4f/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vDn///////4soj/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//erff////////38//WTWP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//iziv////////////iwhf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rMsP///////eXW//WSVv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/4sYb///z7/////////Pv/9ZFV//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ixhv/+8Of//vn1//rMsP/4rH//9plh//WQUv/1j1L/+s2x//////////////////m9mf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SGQ//2nmn/+buW//vNsv/82sb//e3j/////////////////////v/5wZ//9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/83Mj////////////++fb/+K+C//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9ZRZ/////////////vTt//aaYv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/1lFr////////////6xqf/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ehbf/70bj//end//3o2////v3///////3l1//0iEb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5wqD////////////96t7/96Z2//WOUP/2nWf//NvH//zcyP/1i0z/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/96l6/////////////vLr//WPUf/0hUL/9IVC//SFQv/0h0b//end//3k1f/0iUn/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/8387////////////4sYf/9IVC//SFQv/0hUL/9IVC//SFQv/6w6L///////nBn//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC///69////////vj1//SIR//0hUL/9IVC//SFQv/0hUL/9IVC//m+mv///////e3j//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL///r3///////8387/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+syw///////++fb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/95NX///////vUvP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97OH///////7y6//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//i2jv///////N/O//SFQv/0hUL/9IVC//SFQv/0hUL/96Nx////////////+s2x//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IdF//zh0P//+/j/9ZJW//SFQv/0hUL/9IVC//SKSv/96t7///////738v/1k1f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YxN//vUvf/96+D/96Z0//WNT//3om///ebY/////////Pv/+LKI//WVW//0h0X/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//agbP/7zbL//enc//749P////////////////////////////3r4P/3p3f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8/SFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVCJ/SFQu/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC7/SFQif0hUIA9IVCJfSFQq30hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8fSFQq30hUIl9IVCAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB","fav2015":"data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD9/f2W/f392P39/fn9/f35/f391/39/ZT+/v4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Cf39/Zn///////////////////////////////////////////39/ZX///8IAAAAAAAAAAAAAAAA/v7+Cf39/cH/////+v35/7TZp/92ul3/WKs6/1iqOv9yuFn/rNWd//j79v///////f39v////wgAAAAAAAAAAP39/Zn/////7PXp/3G3WP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP+Or1j//vDo///////9/f2VAAAAAP///zD/////+vz5/3G3V/9TqDT/WKo6/6LQkf/U6cz/1urO/6rUm/+Zo0r/8IZB//adZ////v7///////7+/i79/f2Y/////4nWzf9Lqkj/Vqo4/9Xqzv///////////////////////ebY//SHRv/0hUL//NjD///////9/f2U/f392v////8sxPH/Ebzt/43RsP/////////////////////////////////4roL/9IVC//i1jf///////f391/39/fr/////Cr37/wW8+/+16/7/////////////////9IVC//SFQv/0hUL/9IVC//SFQv/3pnX///////39/fn9/f36/////wu++/8FvPv/tuz+//////////////////SFQv/0hUL/9IVC//SFQv/0hUL/96p7///////9/f35/f392/////81yfz/CrL5/2uk9v///////////////////////////////////////////////////////f392P39/Zn/////ks/7/zdS7P84Rur/0NT6///////////////////////9/f////////////////////////39/Zb+/v4y//////n5/v9WYu3/NUPq/ztJ6/+VnPT/z9L6/9HU+v+WnfT/Ul7t/+Hj/P////////////////////8wAAAAAP39/Z3/////6Or9/1hj7v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9sdvD////////////9/f2YAAAAAAAAAAD///8K/f39w//////5+f7/paz2/11p7v88Suv/Okfq/1pm7v+iqfX/+fn+///////9/f3B/v7+CQAAAAAAAAAAAAAAAP///wr9/f2d///////////////////////////////////////////9/f2Z/v7+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f2Z/f392/39/fr9/f36/f392v39/Zj///8wAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/g3+/v5X/f39mf39/cj9/f3q/f39+f39/fn9/f3q/f39yP39/Zn+/v5W////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f2c/f399f/////////////////////////////////////////////////////9/f31/f39mv7+/iMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gn9/f2K/f39+////////////////////////////////////////////////////////////////////////////f39+v39/Yf///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4k/f390v////////////////////////////////////////////////////////////////////////////////////////////////39/dD///8iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////MP39/er//////////////////////////+r05v+v16H/gsBs/2WxSf9Wqjj/Vqk3/2OwRv99vWX/pdKV/97u2P////////////////////////////39/ej+/v4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f3q/////////////////////+v15/+Pxnv/VKk2/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/36+Z//d7tf///////////////////////39/ej///8iAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/f390//////////////////////E4bn/XKw+/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1apN/+x0pv///////////////////////39/dD///8IAAAAAAAAAAAAAAAAAAAAAP39/Yv/////////////////////sdij/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/YKU1/8qOPv/5wZ////////////////////////39/YcAAAAAAAAAAAAAAAD+/v4l/f39+////////////////8Lgt/9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9utlT/n86N/7faqv+426v/pdKV/3u8ZP9UqDX/U6g0/3egN//jiUH/9IVC//SFQv/82MP//////////////////f39+v7+/iMAAAAAAAAAAP39/Z3////////////////q9Ob/W6w+/1OoNP9TqDT/U6g0/1OoNP9nskz/zOXC/////////////////////////////////+Dv2v+osWP/8YVC//SFQv/0hUL/9IVC//WQVP/++fb//////////////////f39mgAAAAD+/v4O/f399v///////////////4LHj/9TqDT/U6g0/1OoNP9TqDT/dblc//L58P/////////////////////////////////////////////8+v/3p3f/9IVC//SFQv/0hUL/9IVC//rIqf/////////////////9/f31////DP7+/ln////////////////f9v7/Cbz2/zOwhv9TqDT/U6g0/2KwRv/v9+z///////////////////////////////////////////////////////738//1kFT/9IVC//SFQv/0hUL/9plg///////////////////////+/v5W/f39nP///////////////4jf/f8FvPv/Bbz7/yG1s/9QqDz/vN2w//////////////////////////////////////////////////////////////////rHqP/0hUL/9IVC//SFQv/0hUL//vDn//////////////////39/Zn9/f3L////////////////R878/wW8+/8FvPv/Bbz7/y7C5P/7/fr//////////////////////////////////////////////////////////////////ere//SFQv/0hUL/9IVC//SFQv/718H//////////////////f39yP39/ez///////////////8cwvv/Bbz7/wW8+/8FvPv/WNL8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rIqv/////////////////9/f3q/f39+v///////////////we9+/8FvPv/Bbz7/wW8+/993P3///////////////////////////////////////SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+cGf//////////////////39/fn9/f36////////////////B737/wW8+/8FvPv/Bbz7/33c/f//////////////////////////////////////9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6xaX//////////////////f39+f39/e3///////////////8cwvv/Bbz7/wW8+/8FvPv/WdP8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vVv//////////////////9/f3q/f39y////////////////0bN/P8FvPv/Bbz7/wW8+/8hrvn/+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/cj9/f2c////////////////ht/9/wW8+/8FvPv/FZP1/zRJ6/+zuPf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39mf7+/lr////////////////d9v7/B7n7/yB38f81Q+r/NUPq/0hV7P/u8P3////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v5X////D/39/ff///////////////9tkPT/NUPq/zVD6v81Q+r/NUPq/2Fs7//y8v7////////////////////////////////////////////09f7//////////////////////////////////////////////////f399f7+/g0AAAAA/f39n////////////////+Tm/P89Suv/NUPq/zVD6v81Q+r/NUPq/1Bc7f/IzPn/////////////////////////////////x8v5/0xY7P+MlPP////////////////////////////////////////////9/f2cAAAAAAAAAAD+/v4n/f39/P///////////////7W69/81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9ZZe7/k5v0/6609/+vtff/lJv0/1pm7v81Q+r/NUPq/zVD6v+GjvL//v7//////////////////////////////f39+/7+/iQAAAAAAAAAAAAAAAD9/f2N/////////////////////6Cn9f81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v+BivL////////////////////////////9/f2KAAAAAAAAAAAAAAAAAAAAAP7+/gv9/f3V/////////////////////7W69/8+S+v/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/P0zr/7q/+P///////////////////////f390v7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3r/////////////////////+Xn/P94gfH/NkTq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NkTq/3Z/8f/l5/z///////////////////////39/er+/v4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f3r///////////////////////////k5vz/nqX1/2p08P9IVez/OEbq/zdF6v9GU+z/aHLv/5qh9f/i5Pz////////////////////////////9/f3q////MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3V/////////////////////////////////////////////////////////////////////////////////////////////////f390v7+/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr9/f2N/f39/P///////////////////////////////////////////////////////////////////////////f39+/39/Yv+/v4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4n/f39n/39/ff//////////////////////////////////////////////////////f399v39/Z3+/v4lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/lr9/f2c/f39y/39/e39/f36/f39+v39/ez9/f3L/f39nP7+/ln+/v4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/","langs":[["lang_af","Afrikaans"],["lang_ar","Arabic"],["lang_hy","Armenian"],["lang_be","Belarusian"],["lang_bg","Bulgarian"],["lang_ca","Catalan"],["lang_zh-CN","Chinese (Simplified)"],["lang_zh-TW","Chinese (Traditional)"],["lang_hr","Croatian"],["lang_cs","Czech"],["lang_da","Danish"],["lang_nl","Dutch"],["lang_en","English"],["lang_eo","Esperanto"],["lang_et","Estonian"],["lang_tl","Filipino"],["lang_fi","Finnish"],["lang_fr","French"],["lang_de","German"],["lang_el","Greek"],["lang_iw","Hebrew"],["lang_hi","Hindi"],["lang_hu","Hungarian"],["lang_is","Icelandic"],["lang_id","Indonesian"],["lang_it","Italian"],["lang_ja","Japanese"],["lang_ko","Korean"],["lang_lv","Latvian"],["lang_lt","Lithuanian"],["lang_no","Norwegian"],["lang_fa","Persian"],["lang_pl","Polish"],["lang_pt","Portuguese"],["lang_ro","Romanian"],["lang_ru","Russian"],["lang_sr","Serbian"],["lang_sk","Slovak"],["lang_sl","Slovenian"],["lang_es","Spanish"],["lang_sw","Swahili"],["lang_sv","Swedish"],["lang_th","Thai"],["lang_tr","Turkish"],["lang_uk","Ukrainian"],["lang_vi","Vietnamese"]],"regions":[["countryAF","Afghanistan"],["countryAL","Albania"],["countryDZ","Algeria"],["countryAS","American Samoa"],["countryAD","Andorra"],["countryAO","Angola"],["countryAI","Anguilla"],["countryAQ","Antarctica"],["countryAG","Antigua & Barbuda"],["countryAR","Argentina"],["countryAM","Armenia"],["countryAW","Aruba"],["countryAU","Australia"],["countryAT","Austria"],["countryAZ","Azerbaijan"],["countryBS","Bahamas"],["countryBH","Bahrain"],["countryBD","Bangladesh"],["countryBB","Barbados"],["countryBY","Belarus"],["countryBE","Belgium"],["countryBZ","Belize"],["countryBJ","Benin"],["countryBM","Bermuda"],["countryBT","Bhutan"],["countryBO","Bolivia"],["countryBA","Bosnia & Herzegovina"],["countryBW","Botswana"],["countryBV","Bouvet Island"],["countryBR","Brazil"],["countryIO","British Indian Ocean Territory"],["countryVG","British Virgin Islands"],["countryBN","Brunei"],["countryBG","Bulgaria"],["countryBF","Burkina Faso"],["countryBI","Burundi"],["countryKH","Cambodia"],["countryCM","Cameroon"],["countryCA","Canada"],["countryCV","Cape Verde"],["countryKY","Cayman Islands"],["countryCF","Central African Republic"],["countryTD","Chad"],["countryCL","Chile"],["countryCN","China"],["countryCX","Christmas Island"],["countryCC","Cocos (Keeling) Islands"],["countryCO","Colombia"],["countryKM","Comoros"],["countryCG","Congo - Brazzaville"],["countryCD","Congo - Kinshasa"],["countryCK","Cook Islands"],["countryCR","Costa Rica"],["countryCI","C\u00f4te d\u2019Ivoire"],["countryHR","Croatia"],["countryCU","Cuba"],["countryCY","Cyprus"],["countryCZ","Czechia"],["countryDK","Denmark"],["countryDJ","Djibouti"],["countryDM","Dominica"],["countryDO","Dominican Republic"],["countryEC","Ecuador"],["countryEG","Egypt"],["countrySV","El Salvador"],["countryGQ","Equatorial Guinea"],["countryER","Eritrea"],["countryEE","Estonia"],["countrySZ","Eswatini"],["countryET","Ethiopia"],["countryFK","Falkland Islands (Islas Malvinas)"],["countryFO","Faroe Islands"],["countryFJ","Fiji"],["countryFI","Finland"],["countryFR","France"],["countryGF","French Guiana"],["countryPF","French Polynesia"],["countryTF","French Southern Territories"],["countryGA","Gabon"],["countryGM","Gambia"],["countryGE","Georgia"],["countryDE","Germany"],["countryGH","Ghana"],["countryGI","Gibraltar"],["countryGR","Greece"],["countryGL","Greenland"],["countryGD","Grenada"],["countryGP","Guadeloupe"],["countryGU","Guam"],["countryGT","Guatemala"],["countryGN","Guinea"],["countryGW","Guinea-Bissau"],["countryGY","Guyana"],["countryHT","Haiti"],["countryHM","Heard & McDonald Islands"],["countryHN","Honduras"],["countryHK","Hong Kong"],["countryHU","Hungary"],["countryIS","Iceland"],["countryIN","India"],["countryID","Indonesia"],["countryIR","Iran"],["countryIQ","Iraq"],["countryIE","Ireland"],["countryIL","Israel"],["countryIT","Italy"],["countryJM","Jamaica"],["countryJP","Japan"],["countryJO","Jordan"],["countryKZ","Kazakhstan"],["countryKE","Kenya"],["countryKI","Kiribati"],["countryKW","Kuwait"],["countryKG","Kyrgyzstan"],["countryLA","Laos"],["countryLV","Latvia"],["countryLB","Lebanon"],["countryLS","Lesotho"],["countryLR","Liberia"],["countryLY","Libya"],["countryLI","Liechtenstein"],["countryLT","Lithuania"],["countryLU","Luxembourg"],["countryMO","Macao"],["countryMG","Madagascar"],["countryMW","Malawi"],["countryMY","Malaysia"],["countryMV","Maldives"],["countryML","Mali"],["countryMT","Malta"],["countryMH","Marshall Islands"],["countryMQ","Martinique"],["countryMR","Mauritania"],["countryMU","Mauritius"],["countryYT","Mayotte"],["countryMX","Mexico"],["countryFM","Micronesia"],["countryMD","Moldova"],["countryMC","Monaco"],["countryMN","Mongolia"],["countryMS","Montserrat"],["countryMA","Morocco"],["countryMZ","Mozambique"],["countryMM","Myanmar (Burma)"],["countryNA","Namibia"],["countryNR","Nauru"],["countryNP","Nepal"],["countryNL","Netherlands"],["countryNC","New Caledonia"],["countryNZ","New Zealand"],["countryNI","Nicaragua"],["countryNE","Niger"],["countryNG","Nigeria"],["countryNU","Niue"],["countryNF","Norfolk Island"],["countryKP","North Korea"],["countryMK","North Macedonia"],["countryMP","Northern Mariana Islands"],["countryNO","Norway"],["countryOM","Oman"],["countryPK","Pakistan"],["countryPW","Palau"],["countryPS","Palestine"],["countryPA","Panama"],["countryPG","Papua New Guinea"],["countryPY","Paraguay"],["countryPE","Peru"],["countryPH","Philippines"],["countryPN","Pitcairn Islands"],["countryPL","Poland"],["countryPT","Portugal"],["countryPR","Puerto Rico"],["countryQA","Qatar"],["countryRE","R\u00e9union"],["countryRO","Romania"],["countryRU","Russia"],["countryRW","Rwanda"],["countryWS","Samoa"],["countrySM","San Marino"],["countryST","S\u00e3o Tom\u00e9 & Pr\u00edncipe"],["countrySA","Saudi Arabia"],["countrySN","Senegal"],["countryRS","Serbia"],["countrySC","Seychelles"],["countrySL","Sierra Leone"],["countrySG","Singapore"],["countrySK","Slovakia"],["countrySI","Slovenia"],["countrySB","Solomon Islands"],["countrySO","Somalia"],["countryZA","South Africa"],["countryGS","South Georgia & South Sandwich Islands"],["countryKR","South Korea"],["countryES","Spain"],["countryLK","Sri Lanka"],["countrySH","St. Helena"],["countryKN","St. Kitts & Nevis"],["countryLC","St. Lucia"],["countryPM","St. Pierre & Miquelon"],["countryVC","St. Vincent & Grenadines"],["countrySD","Sudan"],["countrySR","Suriname"],["countrySJ","Svalbard & Jan Mayen"],["countrySE","Sweden"],["countryCH","Switzerland"],["countrySY","Syria"],["countryTW","Taiwan"],["countryTJ","Tajikistan"],["countryTZ","Tanzania"],["countryTH","Thailand"],["countryTG","Togo"],["countryTK","Tokelau"],["countryTO","Tonga"],["countryTT","Trinidad & Tobago"],["countryTN","Tunisia"],["countryTR","T\u00fcrkiye"],["countryTM","Turkmenistan"],["countryTC","Turks & Caicos Islands"],["countryTV","Tuvalu"],["countryUM","U.S. Outlying Islands"],["countryVI","U.S. Virgin Islands"],["countryUG","Uganda"],["countryUA","Ukraine"],["countryAE","United Arab Emirates"],["countryGB","United Kingdom"],["countryUS","United States"],["countryUY","Uruguay"],["countryUZ","Uzbekistan"],["countryVU","Vanuatu"],["countryVA","Vatican City"],["countryVE","Venezuela"],["countryVN","Vietnam"],["countryWF","Wallis & Futuna"],["countryEH","Western Sahara"],["countryYE","Yemen"],["countryZM","Zambia"],["countryZW","Zimbabwe"]],"gear":"","check":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAtklEQVQ4y2P4//8/A7Ux1Q0cxoaCADIbCUgCMTvVXAoE5kA8CYidyXYpGrAH4iVAHIXiCwoMDQTimUBcBsRMlBrKCsTpUANzkC0j11BuIK6EGlgKsoAkQ4FgChD7AzELVI8YEDdDDawDYk6YQaQY6gg1oAqILYC4D8oHGcyLbBAphoJAKtQgGO4EYiHk2CLHUJAXm6AG9gCxNHoSIMdQEJCFGqiALaGSayjMxQwUGzq0S6nhZygA2ojsbh6J67kAAAAASUVORK5CYII="}; // 2022-2024: the present-day page is Google's own, but with the tab icon Gplex's search // pages give that layout (the sharp four-colour G, not today's gradient one) const favOnly = L === "2022"; // as07 to 2007: the blue-banded table ("with all of the words") // as08 2008 to early 2011: the query built live above the form, "Need more tools?" // as12 late 2011 to 2021: "Find pages with..." / "Then narrow your results by..." const era = /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|retro)$/.test(L) ? "as07" : ["2009", "2009L", "2010", "2010N"].indexOf(L) > -1 ? "as08" : "as12"; const logo = era === "as12" ? (["2011", "2012", "2013", "2013L"].indexOf(L) > -1 ? { src: A.logo10, w: 114 } : ["2014", "2015", "2015L"].indexOf(L) > -1 ? { src: A.logo13, w: 116 } : { src: A.logo15, w: 112 }) : { src: A.nav09, w: 150 }; const fav = /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|retro)$/.test(L) ? A.fav1999 : L === "2009" ? A.fav2009 : ["2009L", "2010", "2010N", "2011", "2012"].indexOf(L) > -1 ? A.fav2010 : ["2013", "2013L", "2014", "2015", "2015L"].indexOf(L) > -1 ? A.fav2012 : A.fav2015; const year = (function() { const m = L.match(/(\d{4})/); return m ? (L === "2007" ? "2008" : m[1]) : "2010"; })(); const esc = function(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); }; const pol = (function() { try { if (window.trustedTypes && window.trustedTypes.createPolicy) { return window.trustedTypes.createPolicy("gplex-adv", { createHTML: function(s) { return s; } }); } } catch (e) {} return { createHTML: function(s) { return s; } }; })(); const opts = function(list, sel) { return list.map(function(o) { return '"; }).join(""); }; const langs = [["", "any language"]].concat(A.langs); const regions = [["", "any region"]].concat(A.regions); const q0 = new URLSearchParams(window.location.search).get("q") || ""; const fileTypes = [["", "any format"], ["pdf", "Adobe Acrobat PDF (.pdf)"], ["ps", "Adobe Postscript (.ps)"], ["dwf", "Autodesk DWF (.dwf)"], ["kml", "Google Earth KML (.kml)"], ["kmz", "Google Earth KMZ (.kmz)"], ["xls", "Microsoft Excel (.xls)"], ["ppt", "Microsoft Powerpoint (.ppt)"], ["doc", "Microsoft Word (.doc)"], ["rtf", "Rich Text Format (.rtf)"], ["swf", "Shockwave Flash (.swf)"]]; const rights = [["", era === "as12" ? "not filtered by license" : "not filtered by license"], ["f", "free to use or share"], ["fc", "free to use or share, even commercially"], ["fm", "free to use share or modify"], ["fmc", "free to use, share or modify, even commercially"]]; const occ = [["", "anywhere in the page"], ["title", "in the title of the page"], ["text", "in the text of the page"], ["url", "in the URL of the page"], ["links", "in links to the page"]]; const dates = era === "as07" ? [["", "anytime"], ["m3", "past 3 months"], ["m6", "past 6 months"], ["y", "past year"]] : [["", "anytime"], ["d", "past 24 hours"], ["w", "past week"], ["m", "past month"], ["y", "past year"]]; const nums = [["10", "10 results"], ["20", "20 results"], ["30", "30 results"], ["50", "50 results"], ["100", "100 results"]]; // ---- the Google bar, as Gplex's other pages draw it for the layout: the blue links // of 2007 to early 2011, the black bar of mid 2011 on (the +You bar in late 2012 and // 2013), none before 2007 or from 2014 (the legacy layouts keep the older bar) const who = (function() { let name = ""; let mail = ""; try { const a = document.querySelector('a[aria-label*="Google Account"], a[aria-label*="@"]'); const label = a ? (a.getAttribute("aria-label") || "") : ""; const m = label.match(/[\w.+-]+@[\w.-]+/); mail = m ? m[0] : ""; const parts = label.split(": "); name = parts.length > 1 ? parts[1].split("\n")[0].split("(")[0].trim() : ""; } catch (e) {} const shared = function(k) { try { const v = typeof GM_getValue === "function" ? GM_getValue(k, "") : ""; return v ? String(v) : String(window.localStorage.getItem(k) || ""); } catch (e) { return ""; } }; name = name || shared("UGF_USERNAME"); mail = mail || shared("UGF_EMAIL"); return { name: name, first: name.split(" ")[0] || "", email: mail, mode: shared("UGF_NAME_EMAIL") || "name" }; }); const gbar = function() { const w = who(); const signedIn = !!(w.name || w.email); const classic = { "2007": "2007", "2009": "2009", "2009L": "2009", "2010": "2010", "2010N": "2010" }[L]; if (classic) { const apps = classic === "2007" ? [["Web", ""], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Maps", "https://www.google.com/maps"], ["Gmail", "https://mail.google.com/"], ["Documents", "https://docs.google.com/document/"]] : [["Web", ""], ["Images", "https://www.google.com/imghp"], [classic === "2009" ? "Video" : "Videos", "https://www.youtube.com/"], ["Maps", "https://www.google.com/maps"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"], ["Documents", "https://docs.google.com/document/"]]; const left = apps.map(function(a) { return a[1] ? '' + a[0] + "" : "" + a[0] + ""; }).join("") + 'more ▼'; const right = signedIn ? '' + esc(w.email || w.name) + " | " + (classic === "2010" ? 'Settings ▾ | ' : 'My Account | ') + 'Sign out' : (classic === "2010" ? 'Settings ▾ | ' : "") + 'Sign in'; return '
' + left + '
' + right + "
"; } if (["2011", "2012", "2013", "2013L", "2015L", "2016L"].indexOf(L) < 0) { return ""; } const plus = L === "2013"; const late = L === "2015L" || L === "2016L"; let apps = [["Search", ""], ["Images", "https://www.google.com/imghp"], ["Maps", "https://www.google.com/maps"], ["Play", "https://play.google.com/"], ["YouTube", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Gmail", "https://mail.google.com/"]]; // Documents until Drive took its place in 2013; Drive from 2012 if (L !== "2013" && L !== "2013L") { apps.push([plus ? "Docs" : "Documents", "https://docs.google.com/document/"]); } if (late || plus || L === "2013L") { apps.push(["Drive", "https://drive.google.com/"]); } if (plus) { apps.push(["Calendar", "https://calendar.google.com/"]); } const plusName = w.mode === "email" ? (w.email || "You") : (w.name || "You"); let links = plus ? '+' + esc(signedIn ? plusName : "You") + "" : ""; links += apps.map(function(a) { return '' + a[0] + ""; }).join("") + 'More ▾'; const right = plus ? "" : (signedIn ? '' + esc(w.first || w.name || w.email) + "" : 'Sign in') + '' + A.gear.replace(/width="24" height="24"/, 'width="16" height="16"') + ""; return '
' + links + '
' + right + "
"; }; // ---- the page let body = ""; if (era === "as07") { body = '
Google
Advanced Search' + 'Advanced Search Tips | About Google
' + '
' + '" + '" + '" + '' + '" + '' + '" + '' + '
Find results' + '' + '' + '' + '
with all of the words' + '
with the exact phrase
with at least one of the words
without the words
LanguageReturn pages written in
File Format return results of the file format
DateReturn web pages updated in the
Numeric RangeReturn web pages containing numbers between and
OccurrencesReturn results where my terms occur
Domain return results from the site or domain
e.g. google.com, .org More info
Usage RightsReturn results that are
SafeSearch
' + '
Page-Specific Search
' + '' + '
Similar
Find pages similar to the page
e.g. www.google.com/help.html
Links
Find pages that link to the page
' + '
©' + year + ' Google
'; } else if (era === "as08") { body = '
Google
Advanced Search' + 'Advanced Search Tips | About Google
' + '
' + '
Find web pages that have...
' + '' + '' + '
all these words:
this exact wording or phrase:tip
one or more of these words: OR OR tip
' + '
But don\'t show pages that have...
' + '
any of these unwanted words:tip
' + '
Need more tools?
' + '" + '" + '" + '
Results per page:
Language:
File type:
Search within a site or domain:
(e.g. youtube.com, .edu)
' + '
▸ Date, usage rights, numeric range, and more
' + '" + '" + '" + '" + '' + '' + '
Date: (how recent the page is)
Usage rights:
Where your keywords show up:
Region:
Numeric range: -
(e.g. $1500..$3000)
SafeSearch:
Page-specific tools:
' + '
' + '' + '
Find pages that are similar to the URL:
Find pages that link to the URL:
' + '
©' + year + ' Google
'; } else { const hint = function(t) { return '' + t + ""; }; body = '
Google
' + '

Advanced Search

' + '
Find pages with...
' + '' + hint("Type the important words: tri-color rat terrier") + "" + '' + hint("Put exact words in quotes: \"rat terrier\"") + "" + '' + hint("Type OR between all the words you want: miniature OR standard") + "" + '' + hint("Put a minus sign just before words that you don't want: -rodent, -\"Jack Russell\"") + "" + '' + hint("Put 2 periods between the numbers and add a unit of measure: 10..35 lb, $300..$500, 2010..2011") + "
all these words:
this exact word or phrase:
any of these words:
none of these words:
numbers ranging from: to
" + '
Then narrow your results by...
' + '" + hint("Find pages in the language that you select.") + "" + '" + hint("Find pages published in a particular region.") + "" + '" + hint("Find pages updated within the time that you specify.") + "" + '' + hint("Search one site (like wikipedia.org ) or limit your results to a domain like .edu, .org or .gov") + "" + '" + hint("Search for terms in the whole page, page title or web address, or links to the page you're looking for.") + "" + '' + hint("Tell SafeSearch whether to filter sexually explicit content.") + "" + '" + hint("Find pages in the format that you prefer.") + "" + '" + hint("Find pages that you are free to use yourself.") + "" + '
language:
region:
last update:
site or domain:
terms appearing:
SafeSearch:
file type:
usage rights:
' + '
You can also...
' + '
Find pages similar to the URL:
' + '
Find pages that link to the URL:
' + '
PrivacyTerms
'; } // ---- the look const S = "#ugf-adv"; const css = [ "html[gplex-adv] body > *:not(#ugf-adv) { display: none !important; }", "html[gplex-adv], html[gplex-adv] body { background: #fff !important; margin: 0 !important; }", S + " { font: 13px Arial, sans-serif; color: #000; }", S + " a { color: #00c; }", S + " select, " + S + " input { font: 13px Arial, sans-serif; }", // the Google bar (Gplex's own, as on its other pages) S + " .gbar.classic { display: flex; justify-content: space-between; padding: 3px 8px 0 8px; height: 25px; font-size: 13px; border-bottom: 1px solid #c9d7f1; margin: 0 0 6px; }", S + " .gbar.classic .left > * { margin-right: 8px; } " + S + " .gbar.classic a { color: #00c; } " + S + " .gbar.classic .more small { font-size: 9px; }", S + " .gbar.dark { display: flex; justify-content: space-between; align-items: center; background: #2d2d2d; height: 30px; padding: 0 0 0 10px; color: #ccc; }", S + " .gbar.dark .left, " + S + " .gbar.dark .right { display: flex; align-items: center; height: 30px; }", S + " .gbar.dark .left a { color: #ccc; line-height: 27px; height: 30px; border-top: 3px solid transparent; text-decoration: none; font-size: 13px; padding: 0 6px; box-sizing: border-box; }", S + " .gbar.dark .left a:hover { color: #fff; background: #4c4c4c; text-decoration: none; }", S + " .gbar.dark .left a.here { color: #fff; font-weight: bold; border-top-color: #dd4b39; }", S + " .gbar.dark .right a { color: #ccc; text-decoration: none; font-weight: bold; padding: 0 10px; line-height: 30px; }", S + " .gbar.dark .right .gear { display: inline-flex; align-items: center; border-left: 1px solid #555; height: 22px; } " + S + " .gbar.dark .gear i { display: flex; } " + S + " .gbar.dark .gear svg { fill: #ccc; }", S + " .gbar.dark.plus { padding-left: 4px; height: 29px; }", S + " .gbar.dark.plus .left a { font-weight: bold; color: #bbb; border-top: 0; line-height: 29px; height: 29px; padding: 0 9px; }", S + " .gbar.dark.plus .left a:hover { background: transparent; color: #fff; } " + S + " .gbar.dark.plus .left a.here { color: #fff; }" ]; if (era === "as07" || era === "as08") { css.push(S + " > :not(.gbar) { margin-left: 12px; margin-right: 12px; } " + S + " > .top { margin-top: 8px; }", S + " .top { display: flex; align-items: flex-end; gap: 10px; margin-bottom: 12px; }", S + " .top img { display: block; height: auto; }", S + " .band { flex: 1; display: flex; justify-content: space-between; align-items: center; background: #e5ecf9; border-top: 1px solid #3366cc; padding: 3px 8px; margin-bottom: 6px; font-size: 16px; }", S + " .band span { font-size: 13px; }", S + " .foot { text-align: center; color: #666; margin: 26px 0 10px; font-size: 13px; }", S + " .eg { color: #666; font-size: 12px; }"); } if (era === "as07") { css.push(S + " table.main { width: 100%; background: #cbdced; border-collapse: collapse; margin-bottom: 4px; }", S + " table.main > tbody > tr > td { padding: 6px 8px; border-top: 1px solid #fff; vertical-align: top; }", S + " td.lbl { width: 110px; }", S + " table.words td { padding: 1px 6px 1px 0; }", S + " table.words td.go { vertical-align: middle; padding-left: 14px; }", S + " .sub { font-weight: bold; margin: 14px 0 4px; }"); } else if (era === "as08") { css.push(S + " .live { background: #fff; border: 1px solid #c9d7f1; padding: 8px; margin: 0 0 14px; }", S + " .qline { display: flex; gap: 6px; } " + S + " #ugf-adv-live { flex: 1; border: 1px solid #ccc; padding: 3px; }", S + " .sec { font-weight: bold; margin: 14px 0 6px; font-size: 13px; }", S + " table.rows td { padding: 3px 6px 3px 0; vertical-align: top; }", S + " table.rows td.l { width: 260px; text-align: right; padding-right: 10px; }", S + " table.rows input:not([type]) { width: 280px; } " + S + " td.or input { width: 80px !important; } " + S + " input.n { width: 80px !important; }", S + " td.tip { font-size: 12px; } " + S + " div.more { margin: 10px 0 0 272px; } " + S + " div.more a { text-decoration: none; }", S + " table.extra { display: none; margin-top: 6px; } " + S + "[more] table.extra { display: table; }", S + " .go { margin: 16px 0 0 272px; }"); } else { css.push(S + " { color: #222; }", S + " a { color: #1a0dab; text-decoration: none; } " + S + " a:hover { text-decoration: underline; }", S + " .top { height: 60px; border-bottom: 1px solid #ebebeb; display: flex; align-items: center; padding: 0 28px; }", S + " .top img { display: block; height: auto; }", S + " .wrap { max-width: 990px; padding: 0 28px 30px; }", S + " h1 { font: normal 20px Arial, sans-serif; color: #dd4b39; margin: 22px 0 16px; }", S + " .sec { border-bottom: 1px solid #ebebeb; margin: 22px 0 10px; font-size: 16px; color: #222; padding-bottom: 6px; }", S + " table.rows { border-collapse: collapse; width: 100%; }", S + " table.rows td { padding: 5px 0; vertical-align: middle; }", S + " td.l { width: 190px; color: #222; } " + S + " td.f { width: 320px; padding-right: 22px !important; }", S + " td.f input:not([type]), " + S + " td.f select { box-sizing: border-box; width: 100%; height: 27px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 1px; padding: 0 6px; background: #fff; color: #222; }", S + " td.f select { background: linear-gradient(#f5f5f5, #f1f1f1); border-color: #dcdcdc; color: #444; }", S + " td.f input:not([type]):focus { border-color: #4d90fe; outline: none; box-shadow: inset 0 1px 2px rgba(0,0,0,.3); }", S + " td.nr { display: flex; align-items: center; gap: 6px; } " + S + " td.nr input { flex: 1; }", S + " td.h { color: #777; font-size: 13px; line-height: 16px; } " + S + " td.h b { color: #222; font-weight: normal; }", S + " td.go input { width: auto !important; height: 29px; padding: 0 12px; background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; border-radius: 2px; color: #fff; font-weight: bold; font-size: 11px; cursor: pointer; }", S + " td.go input:hover { background: linear-gradient(#4d90fe, #357ae8); border-color: #2f5bb7; }", S + " ul.also { list-style: none; padding: 0; margin: 0; } " + S + " ul.also li { margin: 6px 0; }", S + " .relbox { display: none; margin: 10px 0; padding: 10px; background: #f1f1f1; border: 1px solid #e5e5e5; } " + S + "[rel] .relbox { display: block; }", S + " .relbox form { margin: 4px 0; }", S + " .foot { border-top: 1px solid #e4e4e4; background: #f2f2f2; padding: 12px 28px; margin-top: 30px; } " + S + " .foot a { color: #777; margin-right: 22px; }"); } // ---- what it searches for const build = function(form) { const v = function(n) { const el = form.elements[n]; if (!el) { return ""; } if (el.length && !el.tagName) { // radio group let out = ""; [].forEach.call(el, function(r) { if (r.checked) { out = r.value; } }); return out; } return String(el.value || "").trim(); }; const parts = []; if (v("all")) { parts.push(v("all")); } if (v("exact")) { parts.push('"' + v("exact").replace(/"/g, "") + '"'); } const any = [v("any1"), v("any2"), v("any3")].filter(Boolean); if (any.length === 1 && /\s/.test(any[0]) && !/\bOR\b/.test(any[0])) { parts.push(any[0].split(/\s+/).join(" OR ")); } else if (any.length) { parts.push(any.join(" OR ")); } if (v("none")) { v("none").split(/[\s,]+/).filter(Boolean).forEach(function(w) { parts.push(/^-/.test(w) ? w : "-" + w); }); } if (v("nlo") || v("nhi")) { parts.push(v("nlo") + ".." + v("nhi")); } if (v("site")) { parts.push((v("siteneg") || "") + "site:" + v("site")); } if (v("ft")) { parts.push((v("ftneg") || "") + "filetype:" + v("ft")); } let q = parts.join(" "); const occt = { title: "allintitle:", text: "allintext:", url: "allinurl:", links: "allinanchor:" }[v("occt")]; if (occt && q) { q = occt + " " + q; } const p = new URLSearchParams(); p.set("q", q); if (v("lr")) { p.set("lr", v("lr")); } if (v("cr")) { p.set("cr", v("cr")); } const tbs = []; if (v("qdr")) { tbs.push("qdr:" + v("qdr")); } if (v("sur")) { tbs.push("sur:" + v("sur")); } if (tbs.length) { p.set("tbs", tbs.join(",")); } if (v("safe") === "active") { p.set("safe", "active"); } if (v("num") && v("num") !== "10") { p.set("num", v("num")); } return { q: q, url: "/search?" + p.toString() }; }; // ==== Search settings (www.google.com/preferences) ==== // Each period's page, saving into Gplex: the choices are added to every search as // Google's own settings in the address (safe=, lr=, hl=, gl=, num=), and "new window" // opens results in a new tab. Google's own saved settings are not touched. const PREF = function(k) { try { const v = window.localStorage.getItem(k); if (v !== null) { return v; } return typeof GM_getValue === "function" ? String(GM_getValue(k, "") || "") : ""; } catch (e) { return ""; } }; const setPref = function(k, v) { try { window.localStorage.setItem(k, v); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue(k, v); } } catch (e) {} }; const cur = { safe: PREF("UGF_PREF_SAFE"), lr: PREF("UGF_PREF_LR"), hl: PREF("UGF_PREF_HL"), gl: PREF("UGF_PREF_GL"), num: PREF("UGF_PREF_NUM") || "10", newwin: PREF("UGF_PREF_NEWWIN") }; const lrSet = cur.lr ? cur.lr.split("|") : []; const hlList = A.langs.map(function(o) { return [o[0].replace(/^lang_/, ""), o[1]]; }); const glList = [["", "Current region"]].concat(A.regions.map(function(o) { return [o[0].replace(/^country/, ""), o[1]]; })); const prefsBody = function() { const langBoxes = A.langs.map(function(o) { return '"; }).join(""); if (era !== "as12") { const saveRow = '
Save your preferences when finished and return to search.
'; return '
Google
Preferences' + 'Preferences Help | About Google
' + '
' + saveRow + '
Global Preferences (changes apply to all Google services)
' + '' + '" + '" + '" + '" + "
Interface LanguageDisplay Google tips and messages in: " + '
If you do not find your native language in the pulldown above, you can help Google create it through our Google in Your Language program.
Search Language
' + '" + '
' + langBoxes + "
SafeSearch FilteringGoogle\'s SafeSearch blocks web pages containing explicit sexual content from appearing in search results.
' + '
" + '
" + '
Number of ResultsGoogle\'s default (10 results) provides the fastest results.
Display results per page.
Results Window
" + saveRow + '
' + '
©' + year + ' Google
'; } // late 2011 on: "Search Settings", the grey menu on the left const nums = [10, 20, 30, 40, 50, 100]; const numIdx = Math.max(0, nums.indexOf(parseInt(cur.num, 10))); return '
Google
' + '

Search Settings

' + '
' + '

SafeSearch filters

Turn on SafeSearch to filter sexually explicit content from your search results.

' + '
" + '

Results per page

FasterSlower
' + '
' + nums.map(function(n) { return "" + n + ""; }).join("") + "
" + '

Where results open

" + '

Region Settings

" + '" + '
CancelSaved settings are available whenever you use Gplex in this browser.
' + '
' + '
PrivacyTerms
'; }; const prefsCss = function() { const S = "#ugf-adv"; if (era !== "as12") { return [S + " .pfsave { display: flex; justify-content: space-between; align-items: center; margin: 4px 0 10px; }", S + " .pfglobal { background: #e5ecf9; border-top: 1px solid #3366cc; padding: 4px 8px; margin: 0 0 2px; }", S + " table.pf { width: 100%; border-collapse: collapse; margin-bottom: 10px; }", S + " table.pf td { padding: 10px 8px; border-bottom: 1px solid #cbdced; vertical-align: top; line-height: 1.5; }", S + " table.pf td.lbl { width: 150px; }", S + " .langs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 10px; margin: 4px 0 0 22px; font-size: 12px; }", S + " #ugf-pf-note { color: #c00; margin: 6px 0; font-weight: bold; }"]; } return [S + " .cols { display: flex; gap: 30px; }", S + " .nav { flex: 0 0 170px; display: flex; flex-direction: column; }", S + " .nav a { color: #222; padding: 6px 0 6px 12px; border-left: 3px solid transparent; text-decoration: none; }", S + " .nav a.on { color: #dd4b39; font-weight: bold; border-left-color: #dd4b39; }", S + " .panes { flex: 1; max-width: 640px; }", S + " .blk { border-bottom: 1px solid #ebebeb; padding: 0 0 18px; margin: 0 0 18px; }", S + " .blk h2 { font: bold 13px Arial, sans-serif; color: #222; margin: 0 0 8px; }", S + " .blk p { color: #666; margin: 0 0 8px; }", S + " .slider { display: flex; align-items: center; gap: 10px; max-width: 420px; } " + S + " .slider input { flex: 1; } " + S + " .sl { color: #777; font-size: 12px; }", // Kennedy's slider: a thin grey groove and a small grey handle, not today's blue one S + " .slider input[type=range] { -webkit-appearance: none; appearance: none; height: 18px; background: transparent; margin: 0; }", S + " .slider input[type=range]::-webkit-slider-runnable-track { height: 4px; background: #e5e5e5; border: 1px solid #c6c6c6; border-radius: 0; }", S + " .slider input[type=range]::-moz-range-track { height: 4px; background: #e5e5e5; border: 1px solid #c6c6c6; border-radius: 0; }", S + " .slider input[type=range]::-moz-range-progress { background: transparent; }", S + " .slider input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 18px; margin-top: -8px; background: linear-gradient(#f8f8f8, #f1f1f1); border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 0 1px 1px rgba(0,0,0,.1); cursor: pointer; }", S + " .slider input[type=range]::-moz-range-thumb { width: 12px; height: 18px; background: linear-gradient(#f8f8f8, #f1f1f1); border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 0 1px 1px rgba(0,0,0,.1); cursor: pointer; }", S + " .slider input[type=range]:focus { outline: none; } " + S + " .slider input[type=range]:focus::-webkit-slider-thumb { border-color: #4d90fe; } " + S + " .slider input[type=range]:focus::-moz-range-thumb { border-color: #4d90fe; }", S + " .ticks { display: flex; justify-content: space-between; max-width: 290px; margin: 2px 0 0 52px; color: #777; font-size: 11px; }", S + " .blk select { height: 27px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; padding: 0 6px; }", S + " .langs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 2px 12px; }", S + " .btns { display: flex; align-items: center; gap: 12px; }", S + " .btns .save { height: 29px; padding: 0 16px; background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; border-radius: 2px; color: #fff; font-weight: bold; font-size: 11px; cursor: pointer; }", S + " .btns .cancel { display: inline-flex; align-items: center; height: 27px; padding: 0 14px; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid rgba(0,0,0,.1); border-radius: 2px; color: #444; font-weight: bold; font-size: 11px; text-decoration: none; }", S + " .saved-note { color: #777; font-size: 12px; }", S + " #ugf-pf-note { color: #3a3; margin: 10px 0; font-weight: bold; }", // Kennedy's checkbox: a white 13px square, grey edge, Google's grey checkmark over its corner S + " .panes input[type=checkbox] { -webkit-appearance: none; appearance: none; position: relative; width: 15px; height: 15px; margin: 0 6px 0 0; vertical-align: -3px; box-sizing: border-box; border: 1px solid #c6c6c6; border-radius: 1px; background: #fff; cursor: pointer; overflow: visible; }", S + " .panes input[type=checkbox]:hover { border-color: #b2b2b2; box-shadow: inset 0 1px 1px rgba(0,0,0,.1); }", S + " .panes input[type=checkbox]:focus { outline: none; border-color: #4d90fe; }", S + " .panes input[type=checkbox]:checked { background: #fff url(" + A.check + ") no-repeat -4px -3px; }"]; }; const wirePrefs = function(root) { const form = root.querySelector("#ugf-pf-form"); const val = function(n) { const el = form.elements[n]; if (!el) { return ""; } if (el.length && !el.tagName) { let out = ""; [].forEach.call(el, function(r) { if (r.checked) { out = r.value; } }); return out; } if (el.type === "checkbox") { return el.checked ? el.value : ""; } return String(el.value || ""); }; root.querySelectorAll(".nav a[data-pane]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); root.querySelectorAll(".nav a[data-pane]").forEach(function(o) { o.classList.toggle("on", o === a); }); root.querySelectorAll(".pane").forEach(function(p) { p.hidden = p.getAttribute("data-pane") !== a.getAttribute("data-pane"); }); }); }); const back = function() { const r = document.referrer || ""; window.location.href = /^https:\/\/www\.google\.com\/(search|webhp|\?|$)/.test(r) ? r : "https://www.google.com/"; }; const cancel = root.querySelector(".cancel"); if (cancel) { cancel.addEventListener("click", function(ev) { ev.preventDefault(); back(); }); } form.addEventListener("submit", function(ev) { ev.preventDefault(); const langs = [].filter.call(form.querySelectorAll("input[name='lr']"), function(c) { return c.checked; }).map(function(c) { return c.value; }); const mode = val("lrmode"); setPref("UGF_PREF_LR", mode === "any" ? "" : langs.join("|")); setPref("UGF_PREF_HL", val("hl")); if (era === "as12") { setPref("UGF_PREF_SAFE", val("safebox") ? "active" : ""); setPref("UGF_PREF_NUM", String([10, 20, 30, 40, 50, 100][parseInt(val("numidx"), 10) || 0])); setPref("UGF_PREF_GL", val("gl")); } else { setPref("UGF_PREF_SAFE", val("safe")); setPref("UGF_PREF_NUM", val("num") || "10"); } setPref("UGF_PREF_NEWWIN", val("newwin") ? "1" : ""); const note = root.querySelector("#ugf-pf-note"); if (note) { note.textContent = era === "as12" ? "Your preferences have been saved." : "Your preferences have been saved."; } setTimeout(back, 700); }); }; const PAGE = /^\/preferences/.test(window.location.pathname || "") ? "prefs" : "adv"; const render = function() { if (document.getElementById("ugf-adv")) { return; } document.documentElement.setAttribute("gplex-adv", era); document.title = PAGE === "prefs" ? (era === "as12" ? "Search Settings" : "Preferences") : "Google Advanced Search"; const st = document.createElement("style"); st.textContent = css.concat(PAGE === "prefs" ? prefsCss() : []).join("\n"); (document.head || document.documentElement).appendChild(st); const root = document.createElement("div"); root.id = "ugf-adv"; root.setAttribute("era", era); root.innerHTML = pol.createHTML(gbar() + (PAGE === "prefs" ? prefsBody() : body)); document.body.appendChild(root); if (PAGE === "prefs") { wirePrefs(root); return; } const form = root.querySelector("#ugf-adv-form"); const live = root.querySelector("#ugf-adv-live"); const update = function() { if (live) { live.value = build(form).q; } }; form.addEventListener("input", update); form.addEventListener("change", update); form.addEventListener("submit", function(ev) { ev.preventDefault(); const b = build(form); if (b.q) { window.location.href = b.url; } }); root.querySelectorAll("form[data-op]").forEach(function(f) { f.addEventListener("submit", function(ev) { ev.preventDefault(); const u = String(f.elements.u.value || "").trim(); if (u) { window.location.href = "/search?q=" + encodeURIComponent(f.getAttribute("data-op") + u); } }); }); const more = root.querySelector("#ugf-adv-more"); if (more) { more.addEventListener("click", function(ev) { ev.preventDefault(); root.toggleAttribute("more"); more.innerHTML = pol.createHTML((root.hasAttribute("more") ? "▾" : "▸") + " Date, usage rights, numeric range, and more"); }); } const rel = root.querySelector("#ugf-adv-rel"); if (rel) { rel.addEventListener("click", function(ev) { ev.preventDefault(); root.toggleAttribute("rel"); }); } update(); const first = form.querySelector("input:not([type]), input[type='text']"); if (first && !q0) { first.focus(); } }; // the tab icon: the one Gplex's search pages give the layout const setFav = function() { const head = document.head; if (!head) { return; } head.querySelectorAll("link[rel~='icon']:not(.ugf-adv-fav)").forEach(function(l) { l.remove(); }); if (head.querySelectorAll("link.ugf-adv-fav").length === 2) { return; } ["16x16", "32x32"].forEach(function(sz) { const l = document.createElement("link"); l.className = "ugf-adv-fav"; l.rel = "icon"; l.type = "image/x-icon"; l.setAttribute("sizes", sz); l.href = fav; head.appendChild(l); }); }; if (favOnly) { const start = function() { setFav(); new MutationObserver(setFav).observe(document.head, { childList: true }); }; if (document.head) { start(); } else { const wh = new MutationObserver(function() { if (document.head) { wh.disconnect(); start(); } }); wh.observe(document, { childList: true, subtree: true }); } return; } // Google's page never shows: hidden from the first moment, then Gplex's is put up const veil = document.createElement("style"); veil.textContent = "html { background: #fff !important; } body > *:not(#ugf-adv) { display: none !important; }"; const putVeil = function() { const at = document.head || document.documentElement; if (!at) { return false; } at.appendChild(veil); return true; }; if (!putVeil()) { const w = new MutationObserver(function() { if (putVeil()) { w.disconnect(); } }); w.observe(document, { childList: true, subtree: true }); } const go = function() { render(); setFav(); new MutationObserver(setFav).observe(document.head, { childList: true }); }; if (document.body) { go(); } else { document.addEventListener("DOMContentLoaded", go); } } catch (e) {} })(); // (5.10) The Search Settings saved on Gplex's settings page, put into every search: added to // the address as Google's own settings when the search did not say otherwise. (function ugfSearchPrefsApply() { try { if (window.location.host !== "www.google.com" || window.top !== window.self || !/^\/search\/?$/.test(window.location.pathname || "") || /[?&]gplex=false\b/.test(window.location.search || "")) { return; } const get = function(k) { try { return String(window.localStorage.getItem(k) || ""); } catch (e) { return ""; } }; const p = new URLSearchParams(window.location.search); let changed = false; const add = function(name, v) { if (v && !p.has(name)) { p.set(name, v); changed = true; } }; add("safe", get("UGF_PREF_SAFE")); add("lr", get("UGF_PREF_LR")); add("hl", get("UGF_PREF_HL")); add("gl", get("UGF_PREF_GL")); const num = get("UGF_PREF_NUM"); add("num", num && num !== "10" ? num : ""); if (changed && p.get("q")) { window.location.replace(window.location.pathname + "?" + p.toString() + window.location.hash); return; } // "Open search results in a new browser window" if (get("UGF_PREF_NEWWIN") === "1") { document.addEventListener("click", function(ev) { const a = ev.target && ev.target.closest ? ev.target.closest(".ugf-search-result a[href]") : null; if (!a || ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.button !== 0) { return; } const href = a.getAttribute("href") || ""; if (!/^https?:\/\//.test(href) || /^https?:\/\/www\.google\.com\/search/.test(href)) { return; } ev.preventDefault(); ev.stopPropagation(); window.open(href, "_blank", "noopener"); }, true); } } catch (e) {} })(); // ---- end Gplex advanced search page ---- // ---- Gplex My Account page ---- // (5.11) myaccount.google.com in the period's clothes. The overview page of each period is // drawn by Gplex from the name and address Google already shows in its bar, with every link // going to the real page that does that job today. The pages under it (Personal info, // Security, Data & privacy, the password and 2-Step Verification pages ...) are Google's own, // restyled in place, so every setting still works exactly as Google made it. Only the look // changes: Gplex never reads, keeps or sends anything typed into those pages. (function ugfMyAccountTheme() { try { const SITE = window.location.host === "keep.google.com" ? "keep" : "acct"; if ((window.location.host !== "myaccount.google.com" && SITE !== "keep") || window.top !== window.self || /[?&]gplex=false\b/.test(window.location.search || "")) { return; } const gv = function(k, d) { try { const v = typeof GM_getValue === "function" ? GM_getValue(k, null) : null; if (v !== null && v !== undefined) { return String(v); } } catch (e) {} try { const w = window.localStorage.getItem(k); return w === null ? d : String(w); } catch (e) { return d; } }; if (gv(SITE === "keep" ? "UGF_KEEP_ON" : "UGF_ACCOUNT_ON", "true") === "false") { return; } const L = gv("UGF_LAYOUT", "2015"); const A = {"check":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAtklEQVQ4y2P4//8/A7Ux1Q0cxoaCADIbCUgCMTvVXAoE5kA8CYidyXYpGrAH4iVAHIXiCwoMDQTimUBcBsRMlBrKCsTpUANzkC0j11BuIK6EGlgKsoAkQ4FgChD7AzELVI8YEDdDDawDYk6YQaQY6gg1oAqILYC4D8oHGcyLbBAphoJAKtQgGO4EYiHk2CLHUJAXm6AG9gCxNHoSIMdQEJCFGqiALaGSayjMxQwUGzq0S6nhZygA2ojsbh6J67kAAAAASUVORK5CYII=","nav09":"data:image/png;base64,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","logo10":"data:image/png;base64,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","logo13":"data:image/png;base64,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","logo15":"data:image/png;base64,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","fav1999":"data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","fav2009":"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbUFHBwcFQAAABoAAAAaAAAAFgAAAA8AAAAWBAAAGwIAABoAAAAXAAAAGQAAABkAAAAaAAAAGg0NDRiOjo4JJiYmDwAAABQAAAATAAAADQwCAR1YFRB4nCsqua0yLMSbLCyxYxoYfBgFAiwDAQAUAAAAEgAAABMAAAAUBwcHEhQUFA0AAAAOAAAACxMEARayLy/F7T9C/640K7FuJR1pZiMgYpczMZqeLSzBIAcFPQEBABAAAAANAAAADgAAAA4XFxcJAAAACgAAAABbKSNY/1ZO/3MdHY8AAAAAAAAAAAAAAAAAAAAAjzc2lHwdG7oDAAAVAAAACAAAAAoAAAAKFxcXBgAAAAcAAAAAVj43Tfx6df87BQFmAQIAAgAAAAQAAAAEAAAAAI0vJomvLCftCwEAHQAAAAQAAAAHAAAABxEREQQAAAAEAAAAAwYEAAi4bVm0uT8/4UwOC1wnBgMlFAQAEF4YGmnwQ0X8niQfxQEAAAgAAAADAAAABAAAAAQzMzMCHh4eAh8fHwMAAAAAKSglBJVbWGfQX16qxktJsLItKNTqP0X/5DxE8VklJTsAAAAAHx8fAh8fHwIfHx8C7+/vBO3t7QTt7e0E7e3tBOrr6wIAAAAAAAAAALWHgkH+VFD/xjI226J1dDYAAAAA7e7uBO3t7QTt7e0E7e3tBP///wn///8K////Cv///wv///8Eybi3HHw1LHeySkjC/nd2/34iIZ1rbGkJ8fHxCv///wr///8K////Cv///wr///8R////E////xP///8P9OTiHtFGSNHPKS//15KSeP7k4Evgb3DOXh4cjouJiCD9/f4R////E////xP///8T////Gf///xv///8b////Dvu3rnbrNCn/o1NTk9/r6wn///8C/9fXaqskJf9kTUxX7e/vGP///xr///8b////G////yH///8k////JP///xb/0MyT00JA/5Byblv7//8d////Fv7Ix3XUNjH/hFhVee/z8x3///8j////JP///yT///8o////Lf///yz///8j//DmZNphWv+Oa2ll4urpJPHy8iLwcWDF0zEn+7edm1f///8m////LP///yz///8s////MP///zX///80////M////y77u7KoxlhZyrV/f3XSc3Oy7z83/7w5NtymioZg5OHgOf///zP///80////Nf///yv///89////Ov///zr///84////M//T0m/3oaGk/bS0uv24ubPujouw2oqIoO3j40r///83////PP///zP///8K////Mf///z7///89////Pf///z3///80////Mf///zH///8x////Mf///zX///88////Pv///zf///8SAAAAAAAAAAAAAAAAI8AAACBAAAAAAAAAEAgAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","fav2010":"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==","fav2012":"data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAAAAAAAAAA9IVCSvSFQuf0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULk9IVCSvSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQuf0hUL/9IVC//SFQv/0hUL/9Y1O//rIq//+7+f//eXX//vUvf/7z7X/96Fu//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vYwv/97OH/9ZRZ//SFQv/0hUL/9IhG//zbx//3om7/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97uX/+buW//SFQv/0hUL/9IVC//SFQv/5upT/+9O6//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+b6b//zezP/0iEf/9IVC//SFQv/1klf//ezh//vPtP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/3qXr/+siq//m8lv/5wqD//vTu//3t4//1klb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0h0b//vbx//zi0//1j1H/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2nmn/+bmS/////v/4sIX/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5uJH///v5//eoef/1jU//+82y//afav/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vXw//vOs//0hUL/9IVC//ekcf/96+D/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//728v/4sIX/9IVC//SFQv/4s4n///v4//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6yKn/+byX//SFQv/0hkT//eTV//vWv//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IZE//m6lP/5u5b//OHQ///+/f/6y6//96d3//SFQv/0hUL/9IVC//SFQv/0hULm9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSfSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAASCwAAEgsAAAAAAAAAAAAA9IVCAPSFQif0hUKt9IVC8vSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvL0hUKt9IVCJ/SFQgD0hUIo9IVC7/SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULv9IVCKPSFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVC8fSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvP0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YtL//i2jv/828f//vLr///7+P///Pv//vTu//3n2v/6zbH/96Nw//SFQ//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ekcv/+8+z////////////+9fD/+9K5//m9mf/4to7/+buV//vSuf/++PT//OPT//aYYP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2l13///r3/////////fv/+b2Z//SIRv/0hUL/9IVC//SFQv/0hUL/9IVC//WNT//84M///vXv//aZYf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vPtP////////////i0i//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//WQUv///Pr//OPU//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//eTV///////+9O7/9IVD//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//3m2P//////9ppi//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/718H///////3s4f/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vDn///////4soj/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//erff////////38//WTWP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//iziv////////////iwhf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rMsP///////eXW//WSVv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/4sYb///z7/////////Pv/9ZFV//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ixhv/+8Of//vn1//rMsP/4rH//9plh//WQUv/1j1L/+s2x//////////////////m9mf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SGQ//2nmn/+buW//vNsv/82sb//e3j/////////////////////v/5wZ//9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/83Mj////////////++fb/+K+C//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9ZRZ/////////////vTt//aaYv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/1lFr////////////6xqf/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ehbf/70bj//end//3o2////v3///////3l1//0iEb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5wqD////////////96t7/96Z2//WOUP/2nWf//NvH//zcyP/1i0z/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/96l6/////////////vLr//WPUf/0hUL/9IVC//SFQv/0h0b//end//3k1f/0iUn/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/8387////////////4sYf/9IVC//SFQv/0hUL/9IVC//SFQv/6w6L///////nBn//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC///69////////vj1//SIR//0hUL/9IVC//SFQv/0hUL/9IVC//m+mv///////e3j//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL///r3///////8387/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+syw///////++fb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/95NX///////vUvP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97OH///////7y6//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//i2jv///////N/O//SFQv/0hUL/9IVC//SFQv/0hUL/96Nx////////////+s2x//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IdF//zh0P//+/j/9ZJW//SFQv/0hUL/9IVC//SKSv/96t7///////738v/1k1f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YxN//vUvf/96+D/96Z0//WNT//3om///ebY/////////Pv/+LKI//WVW//0h0X/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//agbP/7zbL//enc//749P////////////////////////////3r4P/3p3f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8/SFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVCJ/SFQu/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC7/SFQif0hUIA9IVCJfSFQq30hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8fSFQq30hUIl9IVCAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB","fav2015":"data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD9/f2W/f392P39/fn9/f35/f391/39/ZT+/v4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Cf39/Zn///////////////////////////////////////////39/ZX///8IAAAAAAAAAAAAAAAA/v7+Cf39/cH/////+v35/7TZp/92ul3/WKs6/1iqOv9yuFn/rNWd//j79v///////f39v////wgAAAAAAAAAAP39/Zn/////7PXp/3G3WP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP+Or1j//vDo///////9/f2VAAAAAP///zD/////+vz5/3G3V/9TqDT/WKo6/6LQkf/U6cz/1urO/6rUm/+Zo0r/8IZB//adZ////v7///////7+/i79/f2Y/////4nWzf9Lqkj/Vqo4/9Xqzv///////////////////////ebY//SHRv/0hUL//NjD///////9/f2U/f392v////8sxPH/Ebzt/43RsP/////////////////////////////////4roL/9IVC//i1jf///////f391/39/fr/////Cr37/wW8+/+16/7/////////////////9IVC//SFQv/0hUL/9IVC//SFQv/3pnX///////39/fn9/f36/////wu++/8FvPv/tuz+//////////////////SFQv/0hUL/9IVC//SFQv/0hUL/96p7///////9/f35/f392/////81yfz/CrL5/2uk9v///////////////////////////////////////////////////////f392P39/Zn/////ks/7/zdS7P84Rur/0NT6///////////////////////9/f////////////////////////39/Zb+/v4y//////n5/v9WYu3/NUPq/ztJ6/+VnPT/z9L6/9HU+v+WnfT/Ul7t/+Hj/P////////////////////8wAAAAAP39/Z3/////6Or9/1hj7v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9sdvD////////////9/f2YAAAAAAAAAAD///8K/f39w//////5+f7/paz2/11p7v88Suv/Okfq/1pm7v+iqfX/+fn+///////9/f3B/v7+CQAAAAAAAAAAAAAAAP///wr9/f2d///////////////////////////////////////////9/f2Z/v7+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f2Z/f392/39/fr9/f36/f392v39/Zj///8wAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/g3+/v5X/f39mf39/cj9/f3q/f39+f39/fn9/f3q/f39yP39/Zn+/v5W////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f2c/f399f/////////////////////////////////////////////////////9/f31/f39mv7+/iMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gn9/f2K/f39+////////////////////////////////////////////////////////////////////////////f39+v39/Yf///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4k/f390v////////////////////////////////////////////////////////////////////////////////////////////////39/dD///8iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////MP39/er//////////////////////////+r05v+v16H/gsBs/2WxSf9Wqjj/Vqk3/2OwRv99vWX/pdKV/97u2P////////////////////////////39/ej+/v4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f3q/////////////////////+v15/+Pxnv/VKk2/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/36+Z//d7tf///////////////////////39/ej///8iAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/f390//////////////////////E4bn/XKw+/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1apN/+x0pv///////////////////////39/dD///8IAAAAAAAAAAAAAAAAAAAAAP39/Yv/////////////////////sdij/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/YKU1/8qOPv/5wZ////////////////////////39/YcAAAAAAAAAAAAAAAD+/v4l/f39+////////////////8Lgt/9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9utlT/n86N/7faqv+426v/pdKV/3u8ZP9UqDX/U6g0/3egN//jiUH/9IVC//SFQv/82MP//////////////////f39+v7+/iMAAAAAAAAAAP39/Z3////////////////q9Ob/W6w+/1OoNP9TqDT/U6g0/1OoNP9nskz/zOXC/////////////////////////////////+Dv2v+osWP/8YVC//SFQv/0hUL/9IVC//WQVP/++fb//////////////////f39mgAAAAD+/v4O/f399v///////////////4LHj/9TqDT/U6g0/1OoNP9TqDT/dblc//L58P/////////////////////////////////////////////8+v/3p3f/9IVC//SFQv/0hUL/9IVC//rIqf/////////////////9/f31////DP7+/ln////////////////f9v7/Cbz2/zOwhv9TqDT/U6g0/2KwRv/v9+z///////////////////////////////////////////////////////738//1kFT/9IVC//SFQv/0hUL/9plg///////////////////////+/v5W/f39nP///////////////4jf/f8FvPv/Bbz7/yG1s/9QqDz/vN2w//////////////////////////////////////////////////////////////////rHqP/0hUL/9IVC//SFQv/0hUL//vDn//////////////////39/Zn9/f3L////////////////R878/wW8+/8FvPv/Bbz7/y7C5P/7/fr//////////////////////////////////////////////////////////////////ere//SFQv/0hUL/9IVC//SFQv/718H//////////////////f39yP39/ez///////////////8cwvv/Bbz7/wW8+/8FvPv/WNL8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rIqv/////////////////9/f3q/f39+v///////////////we9+/8FvPv/Bbz7/wW8+/993P3///////////////////////////////////////SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+cGf//////////////////39/fn9/f36////////////////B737/wW8+/8FvPv/Bbz7/33c/f//////////////////////////////////////9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6xaX//////////////////f39+f39/e3///////////////8cwvv/Bbz7/wW8+/8FvPv/WdP8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vVv//////////////////9/f3q/f39y////////////////0bN/P8FvPv/Bbz7/wW8+/8hrvn/+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/cj9/f2c////////////////ht/9/wW8+/8FvPv/FZP1/zRJ6/+zuPf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39mf7+/lr////////////////d9v7/B7n7/yB38f81Q+r/NUPq/0hV7P/u8P3////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v5X////D/39/ff///////////////9tkPT/NUPq/zVD6v81Q+r/NUPq/2Fs7//y8v7////////////////////////////////////////////09f7//////////////////////////////////////////////////f399f7+/g0AAAAA/f39n////////////////+Tm/P89Suv/NUPq/zVD6v81Q+r/NUPq/1Bc7f/IzPn/////////////////////////////////x8v5/0xY7P+MlPP////////////////////////////////////////////9/f2cAAAAAAAAAAD+/v4n/f39/P///////////////7W69/81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9ZZe7/k5v0/6609/+vtff/lJv0/1pm7v81Q+r/NUPq/zVD6v+GjvL//v7//////////////////////////////f39+/7+/iQAAAAAAAAAAAAAAAD9/f2N/////////////////////6Cn9f81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v+BivL////////////////////////////9/f2KAAAAAAAAAAAAAAAAAAAAAP7+/gv9/f3V/////////////////////7W69/8+S+v/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/P0zr/7q/+P///////////////////////f390v7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3r/////////////////////+Xn/P94gfH/NkTq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NkTq/3Z/8f/l5/z///////////////////////39/er+/v4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f3r///////////////////////////k5vz/nqX1/2p08P9IVez/OEbq/zdF6v9GU+z/aHLv/5qh9f/i5Pz////////////////////////////9/f3q////MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3V/////////////////////////////////////////////////////////////////////////////////////////////////f390v7+/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr9/f2N/f39/P///////////////////////////////////////////////////////////////////////////f39+/39/Yv+/v4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4n/f39n/39/ff//////////////////////////////////////////////////////f399v39/Z3+/v4lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/lr9/f2c/f39y/39/e39/f36/f39+v39/ez9/f3L/f39nP7+/ln+/v4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/","mi":{"apps":"","lock_outline":"","people_outline":"","settings":"","check":""},"maps14":"data:image/png;base64,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","maps15":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGi0lEQVR4nI2Xf2wcxRXHv2929+7si+9HNvhHQtKY1DTEDTQRYJs0MSHYiRRA4L+RKiSC2yDRv5qqf1RVkVAURJtWaUKEWgKVkCoZIpAKcQIBVLVJFVtNZESLQm2fW2hsh3PN5Wzf7c7O44+93dvdu4sypzvvvpl5n/d982Z2TQCwaeRgN9nqRQXu14AkADAzAMD9BRh8cxtXLEqh1SIMTRXRN1vGuiULMQWQEQM1N4OaWkqUXpqPd339CwCv0aaRg91COheIKeU5jQZQzxYKgCt9zNh9zcJPLi+guVT2ovInMDPI0KG3dYCSBowtc08JstWLHjzauJ4xAA8bGLtmLfz87/MuvNE824b95RfgG2XYX6z6rVDg/qhTT+ktNTdFSJcZhy7nIVjdwhwFOXcNmE806RqQDKphZmxKdeDQtiH0tW0GEeHi3Gc4/I8R/Pvra/WzwoxHZ5awasUOmS3FmCmuwAHQ2RxHTIjqFCmhbhQNPezHhY/s/SlWpIXXr34IxQr7N9yLTCxZh1sNp3d2OdRnM2P0Wh4FSwIA/rko8EiHCUMjf4wqFqBH031o2xAsR+Lx0Rcwt7IIAPjVlbfdgvPAdfKwdkmG7r8sllCwHf9+yXGQWy6hq6WpGkDZgp8Bz2Vf22aMTP3Nhx///g/9CbniPI5cfqsGDgDV5LuehKCaMYIqtopohxwpGOFqZzBUpZCYGZIdSHZwX2sXdrTfVbslK3//m9RCsHVNMZhxw/eZNQx8KxkLjSmb7brwBnifC7Of4bGN96M1kQYAPPfXV/DL8T8hpumYyE+HoMGgL7YnENjw0Iiwt201+lsz6L8tg30dq6GTCM1b6bwTdMcbB0LeOlvacHrvz2ApidNTF+GwwhOdvVhlJLD/vecxU7wePpCUewAll228c/5/0O1qioMHkG+oXCshMPODZ2uLcKowi6Gzh3Hoe0N48s4HQSBcmr+Kw5ffrIVX1BOAI1sLSEgN8n3ZGB5o+e294HQGoW3oDZsszGL4Lyd8gN8XgXvtlbsWsDNpYamXUJggiLmbH2Qr6SwW792BmKbBL8J6xRgsuHpwZsYftixgT7YMIYBYDKD9Simq9kfSAQeEuYcfgZZIQAiBUFUEizGquh781e4FDKy2QAQQMQQRSmufEAu9uxuqz2+7H3LdBmia5gZQDxpV3RCedR86gghCE/iKHscN1YPyA/0oma016kvp1Vjs2eWChYBhGBAeKPoNgjkAjsJd9YRi/EkUnD7oug4jHsfiQ/tCcACY7+sHGQY0TfO/4Y0ZgUZVAwjB3UYopZ6GnnkUpmn6jtUdXVhZ3+mPWr6tHaVvb/b7dV33liAMjEKDGXm1Ox+AMxQTllc9DRkfABEhlUr5Qei6juXtPb76wt3bq6qFqNZAjfoGy+DCLd/isMDxK8/gyMd7ISvPHC+INWvWQNM02N/ZAmnEoITAcle3D9Z1vRpMo7UPLsUpH84+/MSVZzA6OYDxHHD0HEE6bgBCCLS0tMA0TejxBKz1G1Fuvx2iuTmknojc8Y3W3gvllJ/2yhMsAPfmjM9QJQj2M5FOp2GaJlT77ZAda6HrulughuHvAgDhGggHw/j95uscLDiHqQbutfEc4eg5AUdVM5FOp9HUvRX2+k4YhhFOvRDuuOA5EPyc6s7LfWts70yrwIcxOjkQDjhwM5Yj/PqcgMPuNE3TkN2xCy07d7OnPgivWQKv/fG7+dJgtqx73m1JfOLKMM5U4KE1i1yO5whHzwpYUrGXCdM0KZvNOl4GPLi7BJEifGPL9aU9mXLCc2zZxC9PDNOZStqjqsMHlfsdyxGOfRgny3bYKzrTNDXTNK0gHEA4AyNb5/7/YNZOel4tm/jkJ8M0OjVYSwtfgiP2sRzh2EcJsmxHeeueSqVimUxmyQuAmatF+M49X83uSKus58R2lDr5yTCNTg7WBUdV1wTFwNg04dhHCWHZ0vGUZzKZpGmaeW/LCwe8fHb79dx9LVa751o60nl54qAYnRysgd5MdagwK+3SNOE3H8Q1y7L91+ZkMmm2trb+x7ZtS7x7z9y5u5vtjV6ndBzndxM/UqOTgw2hQdU1W7hONi5NE146I5Qtpf/y3NTUtKGjo+MtUrmdD6hy7LymU0JKxzn56YHiu58/lkakRf9bq3nnuYXa6OtU+R8P2CnD0A0AiwB6xI3sny+IuLXHUXLs1KcHpjx4UGnDVNcx3GyJLkwL8/h5/V+S+TSAHgBXvwHdldDiaVcuBgAAAABJRU5ErkJggg==","chrome14":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAYAAADG4PRLAAAjZUlEQVR42u2de5yeVXXvv2vv/TzvO+9ccyOTkATkmguIkhQRkAQrCFWE1k7UeuHUWkGP7ZGeetS2niSt54i2nvactl6gKHgKPSa1VqSoWA1BrSJEUUi4BVAI5Eomc3svz7P3XueP553JBBLIJDOTgNmfz8MbZt553+fZv73W+q2111objo6j4+g4Oo6Oo+NXc8hL5UF0z7PImv08Vw9o8VaQ5utRAA/DPa8AWdS89x5QgXiQoJthsDeArhoF8FEAx1eyhq+4L8lRkG9AelJ3d0cWQqdPkvZUpBSNcQAhRu9UG5rnA6m1fZu2bu2/BLL9fRZgmkDqkS6pcgSDZu4AuQD88M/Xgpt3wgmttYGBGWrMfDHmNEQWaIwniDGzVHWaEalEcDJKrQqoFqh4VR1CZJfGuMVY+2iI8UGJ8X5ifKDS3r7zhMceGxQIo79zWQFiPBLBPKIAXAHmUrADoMPA3TNrViURmSsxvtzCa6Ix5wosKouUIoXuVEBVh8Hf6/XZDzryKoJhj7jVY2yoyAbgBxLjncGY+6arPnnsli3VYSDbQRZDOFiV/ZIFUAvikfQUkxMANsycuQhrXxXhdQKvbROZGYCMQoyakxiH1esoVYvs57l0FL6yx94pYBSME5EUsMCg6jZU14rItwnhrkXbtm1ofoZdA7YH8iNBIg87gMMrewnkCnLfscf+hsR4CXBhqzGnAFQL8fJNVWgUrIzzvWsBahCIzcXgKiIiIgyG8IjAv6vIbac//fStAPdAMlpT/MoBqIWNM8MTsHH27LdG1XcqnNdhbUdVFa+aNW/SKhiZpPttghkVAqrijElaRegLYUDgTuDm07Zsubn5Xte0j/FXBsDVYJc3VeW9s2e/0an+sYj8WkWkMlTYslwL0zRpoL2QZDZVbdIqQk21GlXvVpFPn/70019/9jO9ZAEc/ZA/nzVrvohc4+BCK1LJ9gBnpQDvSGTHsQlmkooQVKsevk2MHz1969YHDgeQk6WS5A6wF4C/f8aMNnHu/VHkY06kLaqiEPQIkLaxqlgBa0TwqoNG9S/U+8+ctmPH4Fpwd0BcNQlq1UyG1K1s+nMbZ806U5Lk1hZrPwm0BtXQpHFWXkRRoea9WgWCagBaW6z9pCTJrRtmz37lsF1fXRDaF68E3gPJEvAK5r7Zs3/fwjWJSGemmmvhbL8kYrFNifSpSJKr9qnIhxc99dQ/CMR7wC2B/EUHYBO8/P45c6YSwl+kxrzfQwyqQSDhJTgUcitiEzCNGD+LtX922ubNu4bn4kUD4FpwF4B/4Ljjjg+NxrUlay/MVPMAxjZVz0txCBAgWAipSNpQ/bZz7sr5Tzzx+PCcHPEADrOwB4455vTg3M2pyGm5ahbBmcIJf0kPKcJDUQoQk4bqhuj9287Yvv2+iWCoMiGSN2vW4hy+WjJmbv4Ss3djtYuJSJLFuNnB5Qu2bFk/3pI4biz085BcAH59d/eSCLemBXgeSH7VwBvFVJNc1SfGzIlw6/ru7iUXgP/8OHKAcZnYYSP905kzF5Wsvc2KzMsLem05OgBCImKD6hONEH7jldu2bRgvYnPIEqhLl7olkG/o7j7OWfvlJnj+KHh7DZureisyz1n75Q3d3cc1g/fusAK4GuwdwMPd3TO8MdeVRBZlBXjuKGbPGS5T9SWRRd6Y6x7u7p5xxzg4+wf9xyvAHANy/C9/abP29k+2GPOWXDX7VSQsYzFZCnlJ5JQatLUNDn5rB+hCkHUHubd4UBI4nPKwHELs7n53h8h7/FHwDojYKDivmnWIvIfu7t9tuhVGD3Le5CABNALxZ9Onn2mS5LtWpCM0g7tHYTqg+QsWTFTtC3n+62fs3PmT4TmdFAkURW876aQOmySfLhnTGYrd8qPgHbjU2AA+NabLJclfbZsxo63AdewCZQ5G+hD0pIGh97dau6x+JMY2Vfd9HVkgJnXV0GrMBTuc+4CArj4IPMb2B6uxoig/+Oj8W14x84/NUCNEa4zoEQIYgLVImhZXqVRczf/HWFTQIgXqWRmnh+ESwQyhEeG//ez42af2QBwrKzVjWzQ9IGj5ie2f+MvfPm3agx1po9zwEu1hys9SBRGkVMKUy4i1kGXowACxt5e4c2dx9fYSBwYgz7FixZgyIiUEc1hxNCARJDVmis3lGlSH8/9lDKAc4Fi7wnHBKj/lhnddQuRf+ztTd/Gdj9c//oWfpr6z7Cpa5IzpZAHnHGIt2mgQ+/uJeY4kSTCdnSGZNg3T2elNuawAsV43Yffu1O/aFcNAn4fMiE2tSdpVJVWJQZUg4xGckgNV1jKK0qtGr9gwFC5d0thxuy7FyboDi5fKAU6YsHKlLGSj23x8+du25M6PeYxZYuLKa3+cve6eLZXalBamhEkA0BhEhDg0hB8awk2bllcWLw5tr3lNLJ9xhknnzEFaW50pl9WkaVRV0TyXWKvZWK3mee/WRr77vljf+SPje39iNN+VmKRVcK1qVFWJxZzEg0ZQVfYzwaPQDc3PtyJYR2iv2EpSljtabLyYDRs9K1GRF57OAwNwdU/K8jVZx/9913IiN4pIyfrIYGsqJz7R1/jrv/m+tNV9GksJUxGaae3jDhyA1mrEel3ThQuzaW9/e2i/9FKbzOp2tqUyWjsNL+59PWwzmbeheb4l1LZ8K9ae/Ir1A484a1PBtDTfEhlPl1ZHpYyLgcQJpVQopwZjRE2CkFGnEa6Qc362WlcvTGX5xuzQAVyxwrBoo7Bhu3Qef/wtUkku0VruBZxVZVd7Kbzr1gezD3xlQ2l3W2oShS5jSMYRRHEObTTwg4PaMn9+Nv2DHwxdv/3bzpTLCYUdQX1EUIw1+3+qCCFGFMEagzQZQMhree3JW/OhRz9ns/5NqUtbBUlBw0Hp0H1yKwPOCeVUKKcW5/ZWo6h62pyjGm6j1nEZy9YpK1FZ9fy6QA7U9rXf8K5LjJGbULqay9PaGMlSh4SY/+X//mE4c9Mz5b5Kgo1KuwgtxhyyNEqSEHfvhnLZT7vqqnzmhz5kTGtrCVV8KFwn5/Y8Rj1ThhpQz3WPmjJQToTWEpTTPe/1QREUawvBDflQY+Chv41Dj38pEW04SToh5geMm7K3ATRGSJ2QpgVwbnTq1nProgIiBqEX5e3yqp9+U3WpE1nnDx5ARVjTY+idYjrL9b+WlvQ/ay3LQUb8vsRHejtKnLlxe+1Tf/8jZ5Ukb7LSigjtTRAPRiFJkuB37KC0cGFj9qc+FdovuKAMakIeicaQ2OITt/VFHtka2bDZ8/DTgad7ld3VSCMvZqmUCF0Vw+wpwimzLYvmOE7qNnR3FiKYB8USC+lFYm379xp9P19pwuAjqS1PFw35C4I27IVbK6QO0sRQSpuLS3jhykMF0Jx2lzDg/57EXs3iEyKsic9nC+UFbJ9l+ZrQ/g/vPhWb/5tx7gRCCIjstduQ+MjOrpZw9c33Nt52+6aWgbZUTFQikIrQLkIqMiZeYNKUbNs2bVu2rD73c58z6bx5Jc0ygnE4V0z8w1sCt/88484HA5u2eAYaikFIXCF1pvl0UQvSkHuIKG0l4eRZjvPnWy56ecops2xTIiPOeJCUfOjJRt9PPxwbO75XtuUZok1JHA1aVDCiWGdImzYtdWMA7bkoeqxYMn0Ul7xBXnX3w6o9VmTNfnW5e17p3LBdiskM51FKT6CaPwc8FQhGaK9l9ktvONW++v6tjTk7quV66jCq5KrsVqXNGFpE9q09nv3FaUq+bRsdl1xSn3v99cZ1dZU0z4g2xVnoryo33Fnn6+tzntgVcQJtJaG7Q0aY3mh1Js35FCluOPOw4UnPz3/p+de7cy5dkvC755fpqBh8SLGSk7TOLXWd9Zls9/qrG42t3ynZ8nSJIR/JQHa2kLJyKrikqR5HS9NBcSBxePW02xOp5q8BHuaONVJ4u/ueNnle9Skw80vvqNSjuV5a0rdoPW8Apee8VSD1kV3tJc5f/1T1k5/9cTrUkjh5Vs1exRja5PlZqiQJfudOWpcurR13883GdXaWYp6jLsEK3PNo4BO3VHlgcyB1UCkJRgoJi6Pqx2RfGmrYgZZCQlVhqKFkHhbMsXzkTRV+7URLiGDIEZPgs77GrruujPnO/2hJKtMpuUApFRInWCOjankPMpj5XEQatJgSQ/GfSMx7WLy+1lyEOrZIzMoVAmjVutkqZqnWc9B9S6wo5NbQNZhx5+JjS9949dxG12ADb81ekYdqjPSGgFfd5xeLc4S+PkqnntqY89nPyjB40gTvK3dlvO/6QR7eEuiqCK1lIUbIQwEez/YjnrVSh38etfgbH6G1JHRVhIe3BN53/SD/fFdGYQoTNOa4tLM05cy/kqmz5jdmtNfo7ChRLpsm8WFPhel4OR2qjmoE0WXk4dgmcDL2UNrGjUWxpA9nmorrBs1fKPQWRShnwV532QL71NSWRqXh8Ub2msQM6I2R+rPvyhhoNJBSyc/+1KdCad68smaF5InAjXc2+LPVVSLQXi7sqQ+H7qr4yMhnKvCx1VVuWNdABCIJaE7SOqfcsuC/B7GpJ2YQzcSFDlUMqjltdhbGvPKFNOX+AVm9RlndYwXOIyioNJXq8303lLPAlmmtpesvXxBKWYjP7udhmou2LwQGY9zr7vzQUJxx5ZWN9l//9RLeE6zDCvzzXQ2u+VqN9rKQ2kJdjufmgjZJTmoLID91S41//nEhiT46wEPneSW639HAD01swYogiCgBiPE8VSys0LECKAhxWn97BcyrNQ8gBxb4jgJtdS+3nzUvveMVsxpT+huaO7MX8sP/HlKlLxYugdRqlE89NZt+9dWWGKynIAZ3P+b5xNdqtJYEa/aoyokYUQvbWCkJn/jXKnc/5nFWCNEA0TLnSkvlxAytMbF1QWrIFIRz+MGpFZFVcX8BbrOf6IsA5M4fo8hCYlRU7YFpAMH5iE+M/cIb55udHeW8teHJrezTLtVjpFeVar0ep3/gA8F2dZVCUMRadvQr13ytRuaFkptY8EaDWHKQeeGar9XY0V/0t4hBwXaUOPbdAZ8pMoGZIyoWr4qwkLR9xgipPGAAFxX2T0UXmNS0oBKRA7/jaIT2ai4PvGxK+uULTwylRghG93EPqljnyIaGyE49Ne/s6Uk0qqgpVOdNP6jzwOZAe7mwVZM1fIT2MjywOXDzD+oFYy3opjDtjQmtJzUIVUZicROhRiGS2hY0WwjAmh4ZiwotfqmySONBuKMCitLW8PKVZSfan500LWuv5hr38W1iLXFwUGe+9a3BtramMSrOFk76retz0sO4158m8PX1OQ9vDVgr+KhgKwkzLg8FgJYJYzOiSlQl2kVj39DtWaPN3y7Ye3NkDKvYGspZYLAtSa+7bD61xIbUR+JoQbaW2Gjgpk71M9/0Josqw992+88yNu+KtKYyEtOczBEitKbC5l2Rb92bjQiGosLUixzJlIyYTawtLFTWggKThWPwA4WIIhrlxDFv/I7yDTNn6BrIuOv07vTr5x2flete1exRn2Itob+fjiVLQsvcuS6K4KxhW19k3YMBZ5hQU/OCzyBFSdWdDwa29UWsaW72lbot7acF4iCImygplGY46QRVRMyqeGAADhuqlSsSge4ibUEPehqjQGvN2y9eeqr75eyORkvDj0iZGEPIMu085xy1lYqo15EY5yNbA62lwyN9e0lhSdi0NfDIlrDH57AthrZfU3w+cWRmeDvXMIsNJBRbU3LANrDtlC0dCNNGPuxgJ8EILZmnt7Ocfu7yBcHlGhQpCEDwmDQNna98pYyOFt33ZKDaiCTu8CaTqULiYKgRuf/JMKJaIgjtpwkmCcWeoUyMBBYv06gv7jhwG1iE0GgJ1S5VWg9VOwjNMNtAxrrFs8u3v2pOo2sww6cOrWe4zs5YnjdPCoEU6jls2hqKAPRhbkoWhwPhAo9sDdTzIqdSQCjNFlx7BD9xbLSIyrcisWt/pszsz4XIgm0TUdeMxB3yEouipLnaa39zkd06pdSo5IE8BpIpUzBtbXb4bgbrkS29kcTKEZHKqQqJFZ7eHRmsxz1TaFotros9REbHW/6Go6AOH9v250rsd+lYl5QLezg+N6ZFnJSnprek118631fqwWvwmK4ub5vZYwCNHHqHFGvHKbp/iNpDC7JM75DSGL03blsU1+GL0oYJvsvoSmOOhWrWGPcSsShKWyPIN8+dl9555uxsSn+N0FZR45yOJg6Zb7rNR4gEGiDLlRCeNXWmpOgEKnkdJpV5MvZgthn/fgTDYbbc2uT6Ny2QZ9rSvKWeJ7mRI7K11mEfI/kzMuZgNkFcvv/dtUORQqG9lrPhZVPS/3fRyXl596A19YYbXsfWQOpkhEAc9jlsEqlSItjR0WD1gjaEyVl7+ZgBFPUZohMghcV/KjVv/+V1pyQ/memylr6hke8pJTClVQiBickvHaMGEyAE6GoVyqONSmwIvj8pShl0IqVQsWQHDuCGZsgm5v0KeXMWx/UOvRXKtQZD09qTz5w7M/Sa0ChsntJWNsyeYsiDHjESmAdldpehtWyGNZsSBgNZL0jKeCcBN1fPcNpCRpb07xXifH4/cFVRT+Bsn0B1IgiWALmBrgbcNbel/KN0UAH1KpQTOKnbjiTFHk7jOEykVOHkWZZyArGZbUfjKSUMGsQxcURGAKqk0jdKKRyYCh1Y1NIPsrOpT8ddR0QUKwYN3v149y/2Slc7ba6lUjLk/vDHQnMPrWXDaXPtyKQaUAY3KprbCdyR0Oam0jPY2H/gKnQ4nrX4Wq/K1iKhbWIqACOKGMv3t2yUqs+ia+bPnDLLcnK3ZaihRYLRYRrWFFlrJ80s7mcE1VBT+u822GTifJ1hoRHdwuL1vllPeIASWOTHqqCP7U90xyPQEGKgLW3l7p2PmieHdgYEfFRmdhqWzrf4ePhjoT7C+fMtMzsNISoiCo0tgcH7DKYN1E+UI19IoMpjIqjGFebAWehwyMbKhuKOJ2YElLJ19NUH3Fd/cVcU9pz/cNErUuZMNQxlh0cKrYGhTDl2muH1r0hHeIUg0Ht7wO92mGECM2FGWCFuLDDZOPYd+QgbxUyAMziakWqklJTlpk3fM0N5PbdG8AFO6bZcujghyw+fBGY5XLY44ZRuSwiKMwKhmrP9axZbkQnciSiiHiKC6gMvRLSeO5YXroQx5oGYxSFEzYhojDPHihppdWXu730yufnR73sjopFIjPA755ZZOMcyUGdSpdAaGKjDwjmWt51TJsRijxtE2XGLp7opwVYmjn1qcyewEaq0pxv350I8jwQWu7+uJjtE4wMYI4hMWCd2VaVsU/lf9/+bfaY+4J0VgkZmdAgfuayFkivS380kMFIjkHkoOeUjl7Uwo6OggsYK5L2ep79osenEbpWIBpwIKhvoH9jR5E5xbCpUMc90DFSBH0piQSdO2UeUFpfyYO/m5C9/fkswSBBRfFSWnOD46OUVqvWi3m8iQRyusag2lI9eXmHJCQ4fFGsiYAKbrwvUHkuQlom1fUgkFUB/xLkPVVVXmDGH0ljTIyxfExS+X/SUV2GCS+DbSi3ymY3fTL65+d7cGUskEBTefFbKhy9vYaCuZKFQcePpH0qz2CULMFBXPnxZC28+KyVEsKbZu2/3nTlbb0pwlYltyaEoqkUateF7IgRYdRCp9c2Qmkbz01j1W5pFnRMnhaqUTEI9env1j24wjw9sb6TGEaJHFa44v8THl1cQikk2FCVeh4KjND/DAAO1grV//C0Vrji/VKQC4RFJoP5kFh/7HxYyW4TOJlR9RkQSBsMWatz7Qm7c81QnrVJA2vKdT4nEtdKSFE80gcPHQGfaykO7N6e/f+dntbcxlKXW4TUQI7z5VSmf+702Tpll2V1VhuqKMZDYPap1f0mso39upPk3Bobqyu6qcupsy2d/r403n5USIwTNMcYx0BisVx/+U2/qjyZq2w+ubn5sCHoqBpC19NunmolMBwGgACuW2i1X3loF+W7RgUPtRKvRPHqmtXTynafvK73jjr+Nu7LBLDEWjycEWHKi5QtXtfG+C0sc02F4ZkjpHVJiszil5IpXZwu1aE2zGHPU72IsdtifGVJmdBiuurDE9Ve1FbWBoQDPmYRNAwP5bT9e0YgDPyjFZBrECT+obLiEQRG+I29aX+UO7POpGfe8H7bomCKwrfF7VPNHTWJPxIfQTIacOBBDYEalS2574p5Sz7c/3bju/KuyE9pnpln0hGDpLAt/cHELF78iLUqsHwg8ssWzq/rCJdaK0loSFs11LF1guej0lJNnFfkbWVCQQGoSfv7M037V2v+T/WnnbeW26VOtr3vchLsyGkjEMhg34d33AVjWo8Kag6yRP4AmBxM5UuvYUe1j/tRjs785+93x9ce+PAVMHgKqRV06FE0ONm2N3D/c5GC3snvoWU0OWg2zu/Y0OTi52zCz2eQg81oQv2LHVr/x+D35H9x+vS5vXx//56JQzqsqiZlw2WOkycGQ/zuqnVez7Bg9tCYHMNJmpOPGd75ejL2JqFObZGZS2kumxtGbDdFqE/++ha/P/+SM37LtaUuqFE0JQEa6VUDRXmSovp82I+XidY+kF3tFrln+1lev5tfc9eX42fXfcHNLA/m9Zz1jUZ+YOBm7IqPajHjeLueMR5sR2NPoB+isVm6RluQ3tJZ7ZPL6YjtjacScwUZd5085Nv/Q6ZeGt514rmtxpWR48fpQBJqNgJFnn5irI6o0qhat1uyemsVqXvc3PbDOf/rur9pHdm12atriN8/Y0rhoSl8l5BY7Ke0Y1VNxjsH8Nhpd49joB0ZabXV+8Z09auRLIqbUPKh00nbrTLPVRDXPyHymC6fMyd918gXht152lp1dmWIrrmQO8Jm0AK2hm/t3hq8+8sN448bvmAd2bnZtqZNBWnnrtN3Vf1rwRCl6Zycj+jOy+67UiXqFnHPvmvFrtVXEuoSVK2Xx7C12U6n+bSm5pdoIAZn8Lr0GQYxhKK/TyGp0tLTnZ00/KSydtYgzpx0v89qn0+bKtmwSTV0SVVW8Rmq+YQYatfDLvu38dNsmvfPJ+82Ptj5sBmuDLknLdKRlfNH8JfvhKx+PCypZOQYzWRkBgZKxNOId1DouZNm6COPZ7G60LfziFRcL+jWsOPTwZTxYEaxY6sEzkFch5IrY2FVui1PK7UxNKnnZpYqq1KKX3fUBt3P7TvprgxYNBpfQnlYoWTfS4GdnI4l/fvz22sfm7ahotJOXDGCIBDzo5fLqe79xILZv7ACCsLrHsHxN6Ljxin8RZ36TPETk8OV0FprHkBiLiOBjINNAHnK8xpENFLEGmytJNZJahzOWqBEfAyEqZaMMBMtJpXr9u2c8aY5xIY0qk7M6VSOpMTTiv8g5975ZV/dYep6feR6YI79P27EGFNHcfpQ89haO1uHbM28WXNKIOfWQETSSiqU9aWFq2sa0UjvTSu1MTVpplxKJGEKM1H2DLOSoKtYoASGP+I/M26XHlHwSdZJUp1Kk3uXai3N/UkRd1nCg4I0VQFhOgBUy8J4vPKTCp6ScGFQOZwHRCJDDfCpoJIuBRvR7ruDxeU7UyHALquH3J0BvbvXiKYN5z/Q+p8FMXlWNEqlYg/JJOeueh1jTY2T52I6nG/tCk1URVSm1tP4dtfy7hferOUfQ2Ks3dfO0DY1xH3ZUqUZDlw3+v87ZKSVHEoJMyr4jUXPKYqmGOwjVz6giLF8zOedGwErZsfwzgxr8hyT3uzHGoRo4UkfU5rGL8hyoq4H49pl9+WunVp33BjsZR1QqAWcSGrobH6+W8x4a4Hka2o0/gLJKWbHU9b37pp+o2g+TWo+RyISW6hwKgM30Ntn7wWtBOL7k/Qfn7DSqxhEnxbGNWAJlyRE+Iuf97F5dsfSgC+3NQa8hlkVW99i+yuANsZZfK84mqHiUI++U1X315hJoqMT/cuyu/KSWvORzg5to6SvmxuMkpd9fxxMnfVFX91hYFsdCXA7WjdhXhMYCtNE21db8P+KSi8i8x8iRc/ycCAw00FFp3gZlKFrOqNTqa1/+C1s2JjFxEnJuNHpS62jE26nEd9I7ZRc7jlFZvuagzc+hseXlawIzFsrg8i/uEBveq97fR2Idij9iANTYJDB70FGBqPiPH7cztiUkEieDuGgBXqYbSO3vyyt+vp1lcCjgHTqAABes8nz+vcnud9z8yxhlucb4BM44lCOD1AQtriZDSEXpzx3LZ/Q3Xj91oOwnJVitgcQ4fPwlkiyXJeuf0HsWJwcabZlYAAGuvDbn8+9NBn/3xgfF+9/UEJ8mMfawS6IIoxvNOKCuhk7ns1XzdlowZhLA8zhjyXQrmXmznP3jjfr5xYksWT8urtf4BRyuvDYfZqYS5FL14UkS60Dzw0lsNOgIe3BGGcxN/KPZu/KTWxtpjGbiWGeRXZY3Je8JxL9RXvOT9bp2qZMr14+b3zy+EaNV6zyre2zfu2/4iVUuUe/vE5ckoB49HC5GoT4VKAn0esdpbfXG+2b3JkQmru2uEgubZxIyvR/j3iBn37deV/dYuWDduGql8Q/5LV8TWLvC9f6nL22QRrxMg/+WpC5BJEy6sx+KZBgrQhAwUf2H5z7D9JJ3Idjxl74iNBwQDZRsQqa3Q7xUzrrnfl271B0qYZkcAEcRm773/uPj2Pxt2vCfwZkEKzJpYTdpOvBRcaL0ZlYvnjKQXz6tz8VY7NOOO4BRc6wYUpOQx79HS2+TV//sF3rP4mS8JW9iARxFbPp+5+bdfa21P8TH96pKP84lqOYTv4shaFCsRKrRMMXF/I/m7aLN4WIQxvXUymF7l9oElT4yvYqz3vSHnPOjXr1n/AjL5AI4DOKaHsOGhdp3xY3XSdALxIfvSkuaNOtNJ1ClKtI8W6kaJL7jmN3+NV2Dae6tjC/zbJqFVpuQx3V4/1o5+6efZyWwusdMJHgwWZ2sVIU7llkuWOdn/N3727KOwas0yp+JM51FmKs4inu8c2xkoE41g+5SaNx5xi/0uJIvBy9YGQeJEyKCLSpidAAnf065/jk5beOgrl3qWLYuHGx47MgDcHTorWnI2//h3aeK89dgzEXGSUVzpXA51B7yLr8UBEYG6uz2Ev/6ZdvrH5y7syXPEkkOJd5ZsMuASEJiQGMVz7cI5k/k3PUPAuhq7Fj39F48AA6Pnh7LmiaQN7zrEoEPY80SkyatWs8KIIvApT2oexTB5J6BPs+ZrfX6ujMedyUxjoPJ71S0uctSFJ1ULNR8FZUfI/JpedVPbi2A67ETwTKPTACLiTHcsdTQZGetX3jnW5yTd6ByrrSWpmgthxCH0+rsWFSsimBqOUMDPtx2+ubG66YNji2/U4uG06iE4kw5SakYGAz9RL6H6E1y9r3/BNBUl3GMh7O9BAAcHmtXOB7eIlx5bQ7Q8cUrLhbHG4j6Oiml8xHQej4slUXpsWL3B6YCqVF27oq8vWtn9R8XbCnHcABnpRegBZCIqiDiqDRD3EPxYYzcjso35ez1/wag95AwsFQnyj148QA4THLWX+n4+kPKqmJCpt74zgVB5WxEXovqhVRKMyVGdM9JV4FmqxlAEBVVESuQK1IabGQ/OG2TnlLxpZGN2j0hPW32YWleYlAMToRUCnkfittQvoPy74jeJWffu7G4VSxrFlp6NuaTQVJeHAAOjxUrDLO3WE55SIdV65xP97T0TS/PNSqLVOQ1AucpusikrlJYJx1eBKBQsrB9QPTjM56o/encHS0xWDHDDXVHDhFkr8PcMQL10CByP8p/kMg68PezNX1S3rS+WqhKHO2Lha+vDy+U7v6rC+AoF67pPworV4WR7lGre+yU3iltcUp1aqzJAqJZYERPVzEvU42zS6LTetVVzrRD3PKyR0y3wwUFO1wcLmRADfQZkKeAXwAbIW7A+QehvJPHThgcTUZ0LY5lPS9YJXQUwOcDc+UKKU7SXqPsa/UXqf/JKaes73i4Prfjz499tP1j07aVyBkug8uJZGjsx6f9zKj1s2jfKlBVmy31C/V6JIL24gJwn/e8Qljd7FzUs0Y5GAYooHGFGemAVCwOFY5swF4KAO5fUqF5bMIqdNE+DosqmuVo01VUjo6j4+g4Oo6Oo+PoeNGO/w/yI2hguYaX3AAAAABJRU5ErkJggg==","grid":{"google-search":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKe0lEQVR42u2ae4zcVRXHP/f+fvPY6W677LLullYLZesWCpRCClVQqxa1CKbYQIQoEaJG4pNggpAgEYxCxMQQoyZECA8f+Gipjxiq8qi8pPKoXaUPKIUKtN22sM+Znfn97vGP+/vN/OY3M7sz21n+cW663dmdOzP3fM853/M95y60Vmu1Vmu1Vmu1Vmu11v/nUo1szvT0J5Zd8qNvd/V/6FpBaxAEwIBBQEAEQDAC9kkQI+HDisdQ+Zpwh4j9T8IXYB9LuMf+Q8Q34JjCxNAz+x+9+bOHn797R9MBSMzpVmd95aEN3Seeti43VjDEABAEFRxaqcYAMALGTA+AREAuB0AAY5ROaeUkeGXT5086vK0+ENx6AVi46oqVXYtPW5cdzeWUTqRDKxwFvgLfQMGzX0aIGBMCVDKmeOjQMIH2dJUPlUbiU2vxsh6Inv++639zeNvdpzYVgLZ3DCzzfTEiSisBRwt5H0ZzoIGONljcLXTNgUyyPGyLQJR5s2Sgb+Dx3ZD34iFZHYGauGjXFb+A2zH/lHrtqhsAKWTHUUo7ygbxcBa6MrBmwHDeyYZl84V0KjyeasidD26DzYOQdsFInW6XGu+oFIhnmg6AEdAKJjxBO7B+heGysw1984QXDyg2PKcZGoWeDlh5vLCkTyh4ASdEjupo0E7pffcOwXf+AK4OUmNG4V+ZDk0HwFGQzVuvX7vW46zFwngObvy9w8MvKLIFAhIUOtKK9WcYvrja1oqQD7QDLw/Br55SJF1QGra9AtmCkHLBmKniprxiTB0d9aNXNwC5PPS0w3fXepzQ6zIxCddvdHj8RUVnBtIJa7yIzek7/q44OKK48ROmWG+MDwu6QGvhJw8p2tOQdKAtAfGgLdogMyXFOmOl3o2ppHDDx+Gd3bZcbf635omXFMe228N6RvB8azzAse2w6Tm48zGF44TlEZIavnkBrDsTEq4lTF9irFiFRmQqMng7ALhkheHkHvA9hVbwyE5F0gHfCIKURZ0g+D50ZuDeJxV7DoDj2FTwfbvnqg8KbQko+DVMkSnMlSm4QhqDpG4AeuZZLzoaxrKw701bCn0DYiLOE7HKUCwVjeWEXz6tUSrgAQ1eAfr7YPWAMJGvrBkSUX2VVkkT/d8AAMa3IYwWxvO2ZkdpOypuwkMZY8ntsV1weARct/QSAd4/EBAksfCX6kFeyW1yVATYEAAq4qaEjnhNhbJUYo4SjLF5fnAE/rlX2b3GvpcCjj8WMinL/hLzfs060MTwbwiAUiRY1p/bJnhGiiEfNz5UusoqYf61r7L7cLStAkZsHxE9fVwxStPpb6YABPV8cbfgeaAkHqYl40NDNMKeoelLtkwVwlJHTRR5GwAIytwpC4OSp6KkVW58CIhWMJyFfMF6PTznSNaSpNaxKhjr/soAbmL4NwiAhD0XiPDeEw1d7VDwpJjvcQeIKZ3KSOXz2/bZMqgJKkmt5qdKHkiT8kE3Zr5NYc+Hhd1wbr9hfLKcIItpUKJ3jIFMQki4Nmq0Bs+DzYNCwgkrgcSiONLvU06wIs1jhLoB0Kp0uHDwcfl7hPa09aJSEcOjgk6B5wtL5weG+1YUbXxGGPyvlcFhWpVNfhoqfXERJc0HIFcIjbTffR9O6IWvrRHGJwVjBEeVixpXQy4vtLfB+pX2NekUDO6DH26GlIuVwRGDy5hfYvOEWraJzH4VuO9JxZ4j4CasFxU2jNevFK75qG2WRnJQMOF0SHhz3Ib9DRfCib3W89tehat/IeTytsMsr3dViE+mz82jKYd1d4NDI3DN/XDLhTCw0JJWwbfM/plzhCW9ts194Q1h0oNjMnDGIrh0lZW9AJu3w02bhOwkJF2rFCvyPlJuK2SRyPSpL9IQIHUDkEnB/mG46l7F51Yr1q0QMpE53qp+WNUvjGfhzQnoboe2VOn53z4t3PQApBIl46WW56uEflXDJJY8DRrfEAC+L6RdGB8Tbv2TsHErnDsAp78L+uaVvLag01YIMZDPW/2/8w247c/WeFdVK5nlxsdZP84RkebjqJWg28hmPxiLzW2Dlw/DjkfBdYJcDs5zx5Ww4viAJ5Rl/kd3CKNZ6MzYmUHckijBSZWkrkV8Uuvn2ZgICaVxt+dbDZ92S59V8IVjOmDpcQoVTOXC8tbdbiOo8mxSxvhSMQCrUfOPouzNXAlK+ZeIbYZ8EQyCqUJKWlkQzl+u+MBSODRqpbAKOsiowJMI9U9LelV+LzMEQzduv5QOH3nSUXZQcnAk6A8CvSAG5qTgB5dpLjpTMZwVjIj9YInZM13e1yC6uPGzMhEq5UFJDerAywpIaFv3f/20VMwRfN/e/NzyKcU31uriDVKoHok3USLVHWkq876kI2T6jrIZEaA0KBHynjCSFYbHheGsMJKz5Lh5u7D91UD2mnIQPA+uXK247VJNOgkTeasepZ46XsdMQGaQAm79SBnEwOiE4LgwvxOW9MK7+xSLe2BBl6K7HTrSNuS1thNgL7juCqdAhQKsOVXR1a65+j6fI2O2PJpaXqfEOTSB9WcMwNgkzNdw/nJYe7pi2UJFX2f5niOjcGgMdh8Q8gWYl4HTFikwtnJobUmwUIAzTlDcfrnDF37mM+mBUyt3pzO+ivdnRQmeswS+dwX0d2tc1xb+148IW3bC1j3Crv3C8IRtmiYLpSpw8dmKr39Mk0lZw50AhHweli9SXHuB5rr7fXs7LDMwPvxZZHZvhtacolnaa0P6tSNw1xbDXwaFgyMBCTrBvZ+yUjes4XdtEZ7fK9x8sWbgOFUEwXXse120UrPpGcM/XhLmpCPXY9VSokrYy1EQYEMkmPfs96d2C5/+sc99j1l1N7fN5n3SDa8kbZkzwWG7MrD9NeHyn/r8bVBIxPp/pWDtcl3sMEPFVbfx1QTRbFSBpAuvvgVfvsfn0JjNbzvgsILIBMMQkYiyE9set6cgW4Cv3uOxcavBTVhFGU6STjpO0ZEObo2qNj1TGB/+LDKj2VADOkBx1xYYnhAyScHzI9MfiSq6ygN4vpDQguvAjb/zefZlsZckwcauOXYy5PtS5ZqoDuETNX62UuDgsPDsKzAnaRldKtVxZTiKFA9kxF6STBbg9gdNMfxLUS8zanjiE+hZS4G8BxN5W9CldrEORuNSFRTjQ1sSXnjdsO+QjQKw8nkiH3CIRMCrpfiino9HQYMzgUbG4lIsS1FDpfp9QO1EgkJBODxW+t2uNwxjOXvZWgFexNO1Qr3CeDGm6QC0t7nJjrQYY6TBvy6M5okUL0z75lEkzL8OGhJaEFO9zY2Xt6mNF1CObjoAw0N7dy/sUjpfkIp7gOmGCGGUKAXjk3DSAkVvp0IpeHyn4cldhkwqnBCXp0BDxvuep7Rr8uP7B5sOwJ133r1Vhp56YE5nT1pMjRCT8smJRPJRKdsBZlLwpY+4aA2jE/D9P3qImsLrDYS9clMuOqEPPXHrxfXa5dS7MZvN8uLzj2xIdi5yE3MXnUuYCKIqr8Zr5b+Cb33S5cOnanJ5uHmDx8P/MXSkSxPiqiEfEzkVg9LgT2Xz4we3Hnj4uvPeGvz5DlqrtVqrtVqrtVqrtVqrtaZc/wNVG+HX3z/d0wAAAABJRU5ErkJggg==","plus":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAK+0lEQVR42u2af4xc1XXHP/fe9+bNr92ZXe8uzhLHxmsb3NJKAYUQCjVqFBARNC1p0yYNSG0iE7WiRBAVUtXQSiRtqGmp2kYEIUgTKKFtgAjSKHYDaYJNcCGU37gl4Jjg9Xp/eL07b97MvPfu6R93PLtrr5dZs6ytdI505/3z5r57vu/c7/mecx90rGMd61jHOtaxjnXs/6epxdx8fl+p77MbVm1Z15W9LKf1qQql551SHedqRBZe6uF5pfUDiBUgsTK+J6pv++JLP71ux9ih8SUH4MKBcv9d7ztjT87ofM1abPP5SmtQau7CFnRkHr8BrJ2Z55irVajWY+QoRwqeYbTWGP7IjhfW/KQSNdp5tml3kX9/1ro7V+dzZ03FSU1p7WEMiCC1GrYaIrUISWJIU0QEEYukFrFvPUgTdDa3MHDWIjZFUgsiDvgjLEzSan826B2rxz98YnzqtXb88toFYDAbnBNZa43vZ6TRQKIQnS+SGdpAsH4jmTVDeP0rMV3dqFweZfRMlC4U8iKoQoHp7d9m8l//CeX5c4BQWpOG0/R8/FMUN10EIiQHhhn50hYQOyeINXixiB3MBUPA9iUFQCnlaaV0fGjSZgbeRdfln6B44cUE6ze+bSI69MC9HHrgXpQ284Y9SYI/uKr1LNOz4phzadBatR/ZbQMgSYIVS/mjn6T347+P13cKANF//xfVp54gmRjDlHvIv/f95N93novaJEYd5knl5pB6HZXNQppioyrjt9/K1L8/gOkug9bzbwOlkEbD8QQgUXXJskDbAJhyDyuvu5HsBzahlCIeGWb0tpup7nocSRKU1ohYJu//KoX3X0D/tTfh9fUjNgXVdMxaxm7fSvT0jzClMun0FMnIPvdGrV2YA5RyAMHMdTkB6PvM58iddyFp3IAoYv+Wa6i98jymZ0WLmQ9fwx2PEu/fx+DWO/B6ViBNx3Q2x4pPX8O+l5+nvvtFdKGILnS13uyJsLahVJkMWIv2fCa/eQ+1l57FWzHgWD9N51xNbx+N13Zz4JYbXTYQQQCbJHg9Kzjlz/8GXepxkXECnV8UAKQWtCZt1Al3fh9dKCJJMj9fxDGm3Et15/eZ2vYw2hhIU9AaGzcI3nMapY/8LrYyBcbMDfFjjSM1wgL3Kq3V0gPQtGR8jHT8AMrzWCjPSWpRuRyH/uVrpLUaeKa1cBGh68OXY8q9kCQtkpNqiFRD7Kwh1RAbVpA4npM+7RH3zb6/UQnjpc8CzX0sUegYWemFSUssKsjReP1Vqk/toOv8D5ImMcoYxFr8lYMEG36R6JknASj95iconHuB20azSE6hkCQmc9q6GULuP4XBv/ryPFrJ6owxXDI2/tE/ufjSrywpALPfLCJvLVtbQlsIH3+U4vkfdMpRBNIUZQyZteupPrUTgGDtBnJnndte2GZz5M/+wHwvSSulWD09feY7tgVULgdHqLWF5KvKBDRefoE0isCf+z/T2zc3zS1VhaeUXvItcHiBptSD6S6RjO5H+Zm32AaC8n2SsRGS4Z+RWbu+tZXcZAYQlJehtvsFdLGIWDtX5yuFxDHB+o34g6scrlGV6MdPHsVBqRWbMVq/emDi6aXngMPr6erGO3UV8b43UJngrSNBaySsEI/sawJgXcEIpJVpSC2qO8/UI//GoQfvOxp3Y0gnJxi44YuUf+uTztHREYa3XHNULZBaa0sZn+/uHfnW0kfArG2d/aWziZ74QZs8oJA0xU5NziDZ/Fvy5l5HeFZQQQ6Vzc8LgIh1OmQWqLqrdBQAYi0q45PtijKw/53hAAHy512ILna53N7u9mluSwEwHmlUpb77xWYUWTdsOv9I06Mj7Vj32hSxVt4xErS1GpnT1pE791ex4fSMkFmICIMs3uq1CCDWZYBo1+PEb+xBBcGiGygnRgk25SwiiLWUrrjKRUESH7s4MQaJqgSn/wLB0OnYRgPl+dhajcl773Ri6sT5fnwRgNaOldcM0Xv1nzr1lcRgvLly1POa9UFC6fc2OzDSFO37THzlVhr/+xIql2/u4zb7hdY2q8alqx8WlwYPFy5aY+t1ui66DJTi4Jf/mnRiFDzfpTAr2DRBZTL0/tEN5M75FaRRx+RyHLzrH5h+6BuOxNrlEBGXcpuRpoLc8gNg43qz5hckTUBp0lqN4ocuJTjzvYTbH6H+8nNItYLK5vBXD1H4tUvInHGmC32lGbvtZud8d6n9KlAEjEe8/03qr/2Pa4mNDC8/AAfvuI0yQvaiy9DN1CZJQhqGmP5TKF95lSO5JEV5ptUbkHodbMrozddT/eH30D297b/5ZmrT+YJrm33znrnVIGr5AEgnJxi/ZQvefzxC94cvJ/jlszG9/eggaKU3qddd66ueuG4voLJZxm+5kfAH2zErBhxpHp++XVK5vPimqOehswG1H++i/vSP8AZW4q9a45zKZLDTU5SuuAp/zVCzWnR7tf7yc4Tf+7Zrex2v8++gtU+C0szphQIasIcmqY3uch2feg1/9RBmYCWSpDPEpSAZfrNV85+Mtmgp3CIvz0P5vpOqlWkyGzaii11IFDX3p3Z1/7rTXbo7nCpPcAvs7euAI/NymrpTm2oIsxWoUki9jr96LeWrrsVGVddCM+bnBIDZOToIiPe8RjIxinieO/ISQZTCRlWKv/4x+m66FZ0JkDA8qUBYPABKgTbOCW1cKvIDkgPDhN95CO37c8NcaWwYkt90Ef1/exf+0AZXGZ4kILQPgGo2MJIEqUxhDx1EKlNIrYo0aqhcnun776b2/DOuwJmd643BhiH+miH6t95J/oIPYScPnhQgtN8Qadb0un8l2Y0X4A9twAwMortLqHzene4qje7pRYwBP4PEDdDKoac1Ug1RQUDvTVvR/3gLlQfuXZwqPJEAmFIPpd+5ksymi/H6BlBGz/leQeLEEV04Tfz6q+hcHvOuU5FarXUmgDauvZ2m9Pzx59GFIlP33IHu6j5hILQNQPenr6b7kt+gkaRgNMnwm9RffJb4leeJ975OOnYACaeReq3V1ytc+jG6r9gMuRxSrTZ5w7XTbRhS+tTVSKPB9P13o0vlRUnk5dcBxkeA5Gc/pfqt+4h2PEY6dsCJI2PAeO6qnWSVJGHq67dTf+4pSld/nsz6M7CVyhxJm4Yh3Zs/S7z3J9R37UAVisseCW2ToCkUiHY8xug1V1J58D5kegpd7EaXyqhC0RGf581kBmPQ5V4aLz3L2LV/QOXB+5yDxjQ/h9GtDyRKm69DtVps6uQEIPzOQxz80p9ho8gdbHreTL/u8NG2zPo+SATSBJV3b3Xy777AwS/cgDTqEASupNYaW63inTZEbtPF2GoFjD45AYh2PNoUPVlIk/b7eNYRoC6VqW5/mPHrP0M6PooKAncMphRihey5m1DGW/b+4CKOxwMXnsfTjmoeh+meXhqvvMDBv/ic+8rDa1JQEmNOfbfLBmmyrNtgEfHWPNF4O5Yk6HIPjRefYfobd6OyOcSm2NRCJnDDyrLSwCK6wkoD1lqb2Jn25OJHkljyRRvtfMzG42PWoqykqbWNhrVJYq1S1spxz58oIBWSJU+D/7x3ZPP1G9/zXV+rTGLl+GNBKTAaVYvwFU5JKqjvmcKrVqB13rj4MCj4Xj4VYdv+iYeXHICtu9/Y9kZU3/jb7+77w8Fs9pyM1j2zqoTFAZA2UHlFbed/gtKoXI7Gk48ThREqt+jPZgRQidjKaD1+5qt79v/ltv0T++hYxzrWsY51rGMd61jHFrT/AxXDt/2E1q2wAAAAAElFTkSuQmCC","books":"data:image/png;base64,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","contacts":"data:image/png;base64,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","translate":"data:image/png;base64,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","maps":"data:image/png;base64,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"},"appsCss":"#ugf-gmail-appsmenu {position: absolute; z-index: 1401; font: 13px arial, sans-serif;}\n#ugf-gmail-appsmenu #gp-apps-dd-card {scrollbar-width: none; background: #fff; padding: 28px 28px 12px 28px; border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 10px rgba(0,0,0,.2); cursor: auto; overflow-y: auto; overscroll-behavior: contain; width: 264px; max-height: 442px; box-sizing: content-box;}\n#ugf-gmail-appsmenu #gp-apps-dd-card::-webkit-scrollbar {width: 0;}\n#ugf-gmail-appsmenu[chrome=\"m2018\"] #gp-apps-dd-card {border-radius: 8px;}\n#ugf-gmail-appsmenu .sector {display: flex; flex-wrap: wrap; justify-content: center;}\n#ugf-gmail-appsmenu .sector:nth-child(1) {padding-bottom: 28px; border-bottom: 1px solid #ebebeb;}\n#ugf-gmail-appsmenu .sector:nth-child(2), #ugf-gmail-appsmenu .sector:nth-child(3) {padding-top: 28px;}\n#ugf-gmail-appsmenu #even-more {color: #737373 !important; font-size: 13px; font-family: arial, sans-serif !important; text-decoration: none !important; margin: 0 auto;}\n#ugf-gmail-appsmenu #even-more:hover {text-decoration: underline !important;}\n#ugf-gmail-appsmenu .gp-app {width: 86px; height: 100px; font-size: 13px; font-family: arial, sans-serif !important; padding: 1px;}\n#ugf-gmail-appsmenu .gp-app-inner {text-decoration: none !important; margin: 7px 0; height: 86px; display: block; border: 1px solid transparent; border-radius: 2px;}\n#ugf-gmail-appsmenu .gp-app:hover .gp-app-inner {border: 1px solid #e5e5e5; background: rgba(255,255,255,.9);}\n#ugf-gmail-appsmenu .gp-app-icon {background-image: url(https://ssl.gstatic.com/gb/images/v1_76783e20.png); -webkit-background-size: 92px 2541px; background-size: 92px 2541px;}\n#ugf-gmail-appsmenu #myaccount .gp-app-icon {background-position: 0 -1451px;}\n#ugf-gmail-appsmenu #google-search .gp-app-icon {background-position: -17px -207px;}\n#ugf-gmail-appsmenu #maps .gp-app-icon {background-position: 0 -450px;}\n#ugf-gmail-appsmenu #youtube .gp-app-icon {background-position: 0 0;}\n#ugf-gmail-appsmenu #play .gp-app-icon {background-position: 0 -1779px;}\n#ugf-gmail-appsmenu #news .gp-app-icon {background-position: 0 -1990px;}\n#ugf-gmail-appsmenu #envelope .gp-app-icon {background-position: 0 -1710px;}\n#ugf-gmail-appsmenu #drive .gp-app-icon {background-position: 0 -138px;}\n#ugf-gmail-appsmenu #calendar .gp-app-icon {background-position: 0 -2059px;}\n#ugf-gmail-appsmenu #plus .gp-app-icon {background-position: 0 -938px;}\n#ugf-gmail-appsmenu #translate .gp-app-icon {background-position: 0 -693px;}\n#ugf-gmail-appsmenu #photos .gp-app-icon {background-position: 0 -1145px;}\n#ugf-gmail-appsmenu #shopping .gp-app-icon {background-position: 0 -1352px;}\n#ugf-gmail-appsmenu #wallet .gp-app-icon, #ugf-gmail-appsmenu #finance .gp-app-icon {background-image: url(https://ssl.gstatic.com/gb/images/p1_a4541be8.png); -webkit-background-size: 64px 2065px; background-size: 64px 2065px; background-position: 0 -966px;}\n#ugf-gmail-appsmenu #finance .gp-app-icon {background-position: 0 -1725px;}\n#ugf-gmail-appsmenu #docs .gp-app-icon {background-position: 0 -1214px;}\n#ugf-gmail-appsmenu #books .gp-app-icon {background-position: 0 -554px;}\n#ugf-gmail-appsmenu #blogger .gp-app-icon {background-position: 0 -1007px;}\n#ugf-gmail-appsmenu #contacts .gp-app-icon {background-position: 0 -69px;}\n#ugf-gmail-appsmenu #hangouts .gp-app-icon {background-position: 0 -2335px;}\n#ugf-gmail-appsmenu #chrome .gp-app-icon {background-image: url(\"data:image/png;base64,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\"); background-size: 48px 48px; background-position: center; background-repeat: no-repeat; margin-top: 0; width: 64px !important; height: 64px !important;}\n#ugf-gmail-appsmenu[layout^=\"2016\"] #chrome .gp-app-icon, #ugf-gmail-appsmenu[layout^=\"2018\"] #chrome .gp-app-icon, #ugf-gmail-appsmenu[layout=\"2019\"] #chrome .gp-app-icon, #ugf-gmail-appsmenu[layout=\"2022\"] #chrome .gp-app-icon {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAYAAADG4PRLAAAjZUlEQVR42u2de5yeVXXvv2vv/TzvO+9ccyOTkATkmguIkhQRkAQrCFWE1k7UeuHUWkGP7ZGeetS2niSt54i2nvactl6gKHgKPSa1VqSoWA1BrSJEUUi4BVAI5Eomc3svz7P3XueP553JBBLIJDOTgNmfz8MbZt553+fZv73W+q2111objo6j4+g4Oo6Oo+NXc8hL5UF0z7PImv08Vw9o8VaQ5utRAA/DPa8AWdS89x5QgXiQoJthsDeArhoF8FEAx1eyhq+4L8lRkG9AelJ3d0cWQqdPkvZUpBSNcQAhRu9UG5rnA6m1fZu2bu2/BLL9fRZgmkDqkS6pcgSDZu4AuQD88M/Xgpt3wgmttYGBGWrMfDHmNEQWaIwniDGzVHWaEalEcDJKrQqoFqh4VR1CZJfGuMVY+2iI8UGJ8X5ifKDS3r7zhMceGxQIo79zWQFiPBLBPKIAXAHmUrADoMPA3TNrViURmSsxvtzCa6Ix5wosKouUIoXuVEBVh8Hf6/XZDzryKoJhj7jVY2yoyAbgBxLjncGY+6arPnnsli3VYSDbQRZDOFiV/ZIFUAvikfQUkxMANsycuQhrXxXhdQKvbROZGYCMQoyakxiH1esoVYvs57l0FL6yx94pYBSME5EUsMCg6jZU14rItwnhrkXbtm1ofoZdA7YH8iNBIg87gMMrewnkCnLfscf+hsR4CXBhqzGnAFQL8fJNVWgUrIzzvWsBahCIzcXgKiIiIgyG8IjAv6vIbac//fStAPdAMlpT/MoBqIWNM8MTsHH27LdG1XcqnNdhbUdVFa+aNW/SKhiZpPttghkVAqrijElaRegLYUDgTuDm07Zsubn5Xte0j/FXBsDVYJc3VeW9s2e/0an+sYj8WkWkMlTYslwL0zRpoL2QZDZVbdIqQk21GlXvVpFPn/70019/9jO9ZAEc/ZA/nzVrvohc4+BCK1LJ9gBnpQDvSGTHsQlmkooQVKsevk2MHz1969YHDgeQk6WS5A6wF4C/f8aMNnHu/VHkY06kLaqiEPQIkLaxqlgBa0TwqoNG9S/U+8+ctmPH4Fpwd0BcNQlq1UyG1K1s+nMbZ806U5Lk1hZrPwm0BtXQpHFWXkRRoea9WgWCagBaW6z9pCTJrRtmz37lsF1fXRDaF68E3gPJEvAK5r7Zs3/fwjWJSGemmmvhbL8kYrFNifSpSJKr9qnIhxc99dQ/CMR7wC2B/EUHYBO8/P45c6YSwl+kxrzfQwyqQSDhJTgUcitiEzCNGD+LtX922ubNu4bn4kUD4FpwF4B/4Ljjjg+NxrUlay/MVPMAxjZVz0txCBAgWAipSNpQ/bZz7sr5Tzzx+PCcHPEADrOwB4455vTg3M2pyGm5ahbBmcIJf0kPKcJDUQoQk4bqhuj9287Yvv2+iWCoMiGSN2vW4hy+WjJmbv4Ss3djtYuJSJLFuNnB5Qu2bFk/3pI4biz085BcAH59d/eSCLemBXgeSH7VwBvFVJNc1SfGzIlw6/ru7iUXgP/8OHKAcZnYYSP905kzF5Wsvc2KzMsLem05OgBCImKD6hONEH7jldu2bRgvYnPIEqhLl7olkG/o7j7OWfvlJnj+KHh7DZureisyz1n75Q3d3cc1g/fusAK4GuwdwMPd3TO8MdeVRBZlBXjuKGbPGS5T9SWRRd6Y6x7u7p5xxzg4+wf9xyvAHANy/C9/abP29k+2GPOWXDX7VSQsYzFZCnlJ5JQatLUNDn5rB+hCkHUHubd4UBI4nPKwHELs7n53h8h7/FHwDojYKDivmnWIvIfu7t9tuhVGD3Le5CABNALxZ9Onn2mS5LtWpCM0g7tHYTqg+QsWTFTtC3n+62fs3PmT4TmdFAkURW876aQOmySfLhnTGYrd8qPgHbjU2AA+NabLJclfbZsxo63AdewCZQ5G+hD0pIGh97dau6x+JMY2Vfd9HVkgJnXV0GrMBTuc+4CArj4IPMb2B6uxoig/+Oj8W14x84/NUCNEa4zoEQIYgLVImhZXqVRczf/HWFTQIgXqWRmnh+ESwQyhEeG//ez42af2QBwrKzVjWzQ9IGj5ie2f+MvfPm3agx1po9zwEu1hys9SBRGkVMKUy4i1kGXowACxt5e4c2dx9fYSBwYgz7FixZgyIiUEc1hxNCARJDVmis3lGlSH8/9lDKAc4Fi7wnHBKj/lhnddQuRf+ztTd/Gdj9c//oWfpr6z7Cpa5IzpZAHnHGIt2mgQ+/uJeY4kSTCdnSGZNg3T2elNuawAsV43Yffu1O/aFcNAn4fMiE2tSdpVJVWJQZUg4xGckgNV1jKK0qtGr9gwFC5d0thxuy7FyboDi5fKAU6YsHKlLGSj23x8+du25M6PeYxZYuLKa3+cve6eLZXalBamhEkA0BhEhDg0hB8awk2bllcWLw5tr3lNLJ9xhknnzEFaW50pl9WkaVRV0TyXWKvZWK3mee/WRr77vljf+SPje39iNN+VmKRVcK1qVFWJxZzEg0ZQVfYzwaPQDc3PtyJYR2iv2EpSljtabLyYDRs9K1GRF57OAwNwdU/K8jVZx/9913IiN4pIyfrIYGsqJz7R1/jrv/m+tNV9GksJUxGaae3jDhyA1mrEel3ThQuzaW9/e2i/9FKbzOp2tqUyWjsNL+59PWwzmbeheb4l1LZ8K9ae/Ir1A484a1PBtDTfEhlPl1ZHpYyLgcQJpVQopwZjRE2CkFGnEa6Qc362WlcvTGX5xuzQAVyxwrBoo7Bhu3Qef/wtUkku0VruBZxVZVd7Kbzr1gezD3xlQ2l3W2oShS5jSMYRRHEObTTwg4PaMn9+Nv2DHwxdv/3bzpTLCYUdQX1EUIw1+3+qCCFGFMEagzQZQMhree3JW/OhRz9ns/5NqUtbBUlBw0Hp0H1yKwPOCeVUKKcW5/ZWo6h62pyjGm6j1nEZy9YpK1FZ9fy6QA7U9rXf8K5LjJGbULqay9PaGMlSh4SY/+X//mE4c9Mz5b5Kgo1KuwgtxhyyNEqSEHfvhnLZT7vqqnzmhz5kTGtrCVV8KFwn5/Y8Rj1ThhpQz3WPmjJQToTWEpTTPe/1QREUawvBDflQY+Chv41Dj38pEW04SToh5geMm7K3ATRGSJ2QpgVwbnTq1nProgIiBqEX5e3yqp9+U3WpE1nnDx5ARVjTY+idYjrL9b+WlvQ/ay3LQUb8vsRHejtKnLlxe+1Tf/8jZ5Ukb7LSigjtTRAPRiFJkuB37KC0cGFj9qc+FdovuKAMakIeicaQ2OITt/VFHtka2bDZ8/DTgad7ld3VSCMvZqmUCF0Vw+wpwimzLYvmOE7qNnR3FiKYB8USC+lFYm379xp9P19pwuAjqS1PFw35C4I27IVbK6QO0sRQSpuLS3jhykMF0Jx2lzDg/57EXs3iEyKsic9nC+UFbJ9l+ZrQ/g/vPhWb/5tx7gRCCIjstduQ+MjOrpZw9c33Nt52+6aWgbZUTFQikIrQLkIqMiZeYNKUbNs2bVu2rD73c58z6bx5Jc0ygnE4V0z8w1sCt/88484HA5u2eAYaikFIXCF1pvl0UQvSkHuIKG0l4eRZjvPnWy56ecops2xTIiPOeJCUfOjJRt9PPxwbO75XtuUZok1JHA1aVDCiWGdImzYtdWMA7bkoeqxYMn0Ul7xBXnX3w6o9VmTNfnW5e17p3LBdiskM51FKT6CaPwc8FQhGaK9l9ktvONW++v6tjTk7quV66jCq5KrsVqXNGFpE9q09nv3FaUq+bRsdl1xSn3v99cZ1dZU0z4g2xVnoryo33Fnn6+tzntgVcQJtJaG7Q0aY3mh1Js35FCluOPOw4UnPz3/p+de7cy5dkvC755fpqBh8SLGSk7TOLXWd9Zls9/qrG42t3ynZ8nSJIR/JQHa2kLJyKrikqR5HS9NBcSBxePW02xOp5q8BHuaONVJ4u/ueNnle9Skw80vvqNSjuV5a0rdoPW8Apee8VSD1kV3tJc5f/1T1k5/9cTrUkjh5Vs1exRja5PlZqiQJfudOWpcurR13883GdXaWYp6jLsEK3PNo4BO3VHlgcyB1UCkJRgoJi6Pqx2RfGmrYgZZCQlVhqKFkHhbMsXzkTRV+7URLiGDIEZPgs77GrruujPnO/2hJKtMpuUApFRInWCOjankPMpj5XEQatJgSQ/GfSMx7WLy+1lyEOrZIzMoVAmjVutkqZqnWc9B9S6wo5NbQNZhx5+JjS9949dxG12ADb81ekYdqjPSGgFfd5xeLc4S+PkqnntqY89nPyjB40gTvK3dlvO/6QR7eEuiqCK1lIUbIQwEez/YjnrVSh38etfgbH6G1JHRVhIe3BN53/SD/fFdGYQoTNOa4tLM05cy/kqmz5jdmtNfo7ChRLpsm8WFPhel4OR2qjmoE0WXk4dgmcDL2UNrGjUWxpA9nmorrBs1fKPQWRShnwV532QL71NSWRqXh8Ub2msQM6I2R+rPvyhhoNJBSyc/+1KdCad68smaF5InAjXc2+LPVVSLQXi7sqQ+H7qr4yMhnKvCx1VVuWNdABCIJaE7SOqfcsuC/B7GpJ2YQzcSFDlUMqjltdhbGvPKFNOX+AVm9RlndYwXOIyioNJXq8303lLPAlmmtpesvXxBKWYjP7udhmou2LwQGY9zr7vzQUJxx5ZWN9l//9RLeE6zDCvzzXQ2u+VqN9rKQ2kJdjufmgjZJTmoLID91S41//nEhiT46wEPneSW639HAD01swYogiCgBiPE8VSys0LECKAhxWn97BcyrNQ8gBxb4jgJtdS+3nzUvveMVsxpT+huaO7MX8sP/HlKlLxYugdRqlE89NZt+9dWWGKynIAZ3P+b5xNdqtJYEa/aoyokYUQvbWCkJn/jXKnc/5nFWCNEA0TLnSkvlxAytMbF1QWrIFIRz+MGpFZFVcX8BbrOf6IsA5M4fo8hCYlRU7YFpAMH5iE+M/cIb55udHeW8teHJrezTLtVjpFeVar0ep3/gA8F2dZVCUMRadvQr13ytRuaFkptY8EaDWHKQeeGar9XY0V/0t4hBwXaUOPbdAZ8pMoGZIyoWr4qwkLR9xgipPGAAFxX2T0UXmNS0oBKRA7/jaIT2ai4PvGxK+uULTwylRghG93EPqljnyIaGyE49Ne/s6Uk0qqgpVOdNP6jzwOZAe7mwVZM1fIT2MjywOXDzD+oFYy3opjDtjQmtJzUIVUZicROhRiGS2hY0WwjAmh4ZiwotfqmySONBuKMCitLW8PKVZSfan500LWuv5hr38W1iLXFwUGe+9a3BtramMSrOFk76retz0sO4158m8PX1OQ9vDVgr+KhgKwkzLg8FgJYJYzOiSlQl2kVj39DtWaPN3y7Ye3NkDKvYGspZYLAtSa+7bD61xIbUR+JoQbaW2Gjgpk71M9/0Josqw992+88yNu+KtKYyEtOczBEitKbC5l2Rb92bjQiGosLUixzJlIyYTawtLFTWggKThWPwA4WIIhrlxDFv/I7yDTNn6BrIuOv07vTr5x2flete1exRn2Itob+fjiVLQsvcuS6K4KxhW19k3YMBZ5hQU/OCzyBFSdWdDwa29UWsaW72lbot7acF4iCImygplGY46QRVRMyqeGAADhuqlSsSge4ibUEPehqjQGvN2y9eeqr75eyORkvDj0iZGEPIMu085xy1lYqo15EY5yNbA62lwyN9e0lhSdi0NfDIlrDH57AthrZfU3w+cWRmeDvXMIsNJBRbU3LANrDtlC0dCNNGPuxgJ8EILZmnt7Ocfu7yBcHlGhQpCEDwmDQNna98pYyOFt33ZKDaiCTu8CaTqULiYKgRuf/JMKJaIgjtpwkmCcWeoUyMBBYv06gv7jhwG1iE0GgJ1S5VWg9VOwjNMNtAxrrFs8u3v2pOo2sww6cOrWe4zs5YnjdPCoEU6jls2hqKAPRhbkoWhwPhAo9sDdTzIqdSQCjNFlx7BD9xbLSIyrcisWt/pszsz4XIgm0TUdeMxB3yEouipLnaa39zkd06pdSo5IE8BpIpUzBtbXb4bgbrkS29kcTKEZHKqQqJFZ7eHRmsxz1TaFotros9REbHW/6Go6AOH9v250rsd+lYl5QLezg+N6ZFnJSnprek118631fqwWvwmK4ub5vZYwCNHHqHFGvHKbp/iNpDC7JM75DSGL03blsU1+GL0oYJvsvoSmOOhWrWGPcSsShKWyPIN8+dl9555uxsSn+N0FZR45yOJg6Zb7rNR4gEGiDLlRCeNXWmpOgEKnkdJpV5MvZgthn/fgTDYbbc2uT6Ny2QZ9rSvKWeJ7mRI7K11mEfI/kzMuZgNkFcvv/dtUORQqG9lrPhZVPS/3fRyXl596A19YYbXsfWQOpkhEAc9jlsEqlSItjR0WD1gjaEyVl7+ZgBFPUZohMghcV/KjVv/+V1pyQ/memylr6hke8pJTClVQiBickvHaMGEyAE6GoVyqONSmwIvj8pShl0IqVQsWQHDuCGZsgm5v0KeXMWx/UOvRXKtQZD09qTz5w7M/Sa0ChsntJWNsyeYsiDHjESmAdldpehtWyGNZsSBgNZL0jKeCcBN1fPcNpCRpb07xXifH4/cFVRT+Bsn0B1IgiWALmBrgbcNbel/KN0UAH1KpQTOKnbjiTFHk7jOEykVOHkWZZyArGZbUfjKSUMGsQxcURGAKqk0jdKKRyYCh1Y1NIPsrOpT8ddR0QUKwYN3v149y/2Slc7ba6lUjLk/vDHQnMPrWXDaXPtyKQaUAY3KprbCdyR0Oam0jPY2H/gKnQ4nrX4Wq/K1iKhbWIqACOKGMv3t2yUqs+ia+bPnDLLcnK3ZaihRYLRYRrWFFlrJ80s7mcE1VBT+u822GTifJ1hoRHdwuL1vllPeIASWOTHqqCP7U90xyPQEGKgLW3l7p2PmieHdgYEfFRmdhqWzrf4ePhjoT7C+fMtMzsNISoiCo0tgcH7DKYN1E+UI19IoMpjIqjGFebAWehwyMbKhuKOJ2YElLJ19NUH3Fd/cVcU9pz/cNErUuZMNQxlh0cKrYGhTDl2muH1r0hHeIUg0Ht7wO92mGECM2FGWCFuLDDZOPYd+QgbxUyAMziakWqklJTlpk3fM0N5PbdG8AFO6bZcujghyw+fBGY5XLY44ZRuSwiKMwKhmrP9axZbkQnciSiiHiKC6gMvRLSeO5YXroQx5oGYxSFEzYhojDPHihppdWXu730yufnR73sjopFIjPA755ZZOMcyUGdSpdAaGKjDwjmWt51TJsRijxtE2XGLp7opwVYmjn1qcyewEaq0pxv350I8jwQWu7+uJjtE4wMYI4hMWCd2VaVsU/lf9/+bfaY+4J0VgkZmdAgfuayFkivS380kMFIjkHkoOeUjl7Uwo6OggsYK5L2ep79osenEbpWIBpwIKhvoH9jR5E5xbCpUMc90DFSBH0piQSdO2UeUFpfyYO/m5C9/fkswSBBRfFSWnOD46OUVqvWi3m8iQRyusag2lI9eXmHJCQ4fFGsiYAKbrwvUHkuQlom1fUgkFUB/xLkPVVVXmDGH0ljTIyxfExS+X/SUV2GCS+DbSi3ymY3fTL65+d7cGUskEBTefFbKhy9vYaCuZKFQcePpH0qz2CULMFBXPnxZC28+KyVEsKbZu2/3nTlbb0pwlYltyaEoqkUateF7IgRYdRCp9c2Qmkbz01j1W5pFnRMnhaqUTEI9env1j24wjw9sb6TGEaJHFa44v8THl1cQikk2FCVeh4KjND/DAAO1grV//C0Vrji/VKQC4RFJoP5kFh/7HxYyW4TOJlR9RkQSBsMWatz7Qm7c81QnrVJA2vKdT4nEtdKSFE80gcPHQGfaykO7N6e/f+dntbcxlKXW4TUQI7z5VSmf+702Tpll2V1VhuqKMZDYPap1f0mso39upPk3Bobqyu6qcupsy2d/r403n5USIwTNMcYx0BisVx/+U2/qjyZq2w+ubn5sCHoqBpC19NunmolMBwGgACuW2i1X3loF+W7RgUPtRKvRPHqmtXTynafvK73jjr+Nu7LBLDEWjycEWHKi5QtXtfG+C0sc02F4ZkjpHVJiszil5IpXZwu1aE2zGHPU72IsdtifGVJmdBiuurDE9Ve1FbWBoQDPmYRNAwP5bT9e0YgDPyjFZBrECT+obLiEQRG+I29aX+UO7POpGfe8H7bomCKwrfF7VPNHTWJPxIfQTIacOBBDYEalS2574p5Sz7c/3bju/KuyE9pnpln0hGDpLAt/cHELF78iLUqsHwg8ssWzq/rCJdaK0loSFs11LF1guej0lJNnFfkbWVCQQGoSfv7M037V2v+T/WnnbeW26VOtr3vchLsyGkjEMhg34d33AVjWo8Kag6yRP4AmBxM5UuvYUe1j/tRjs785+93x9ce+PAVMHgKqRV06FE0ONm2N3D/c5GC3snvoWU0OWg2zu/Y0OTi52zCz2eQg81oQv2LHVr/x+D35H9x+vS5vXx//56JQzqsqiZlw2WOkycGQ/zuqnVez7Bg9tCYHMNJmpOPGd75ejL2JqFObZGZS2kumxtGbDdFqE/++ha/P/+SM37LtaUuqFE0JQEa6VUDRXmSovp82I+XidY+kF3tFrln+1lev5tfc9eX42fXfcHNLA/m9Zz1jUZ+YOBm7IqPajHjeLueMR5sR2NPoB+isVm6RluQ3tJZ7ZPL6YjtjacScwUZd5085Nv/Q6ZeGt514rmtxpWR48fpQBJqNgJFnn5irI6o0qhat1uyemsVqXvc3PbDOf/rur9pHdm12atriN8/Y0rhoSl8l5BY7Ke0Y1VNxjsH8Nhpd49joB0ZabXV+8Z09auRLIqbUPKh00nbrTLPVRDXPyHymC6fMyd918gXht152lp1dmWIrrmQO8Jm0AK2hm/t3hq8+8sN448bvmAd2bnZtqZNBWnnrtN3Vf1rwRCl6Zycj+jOy+67UiXqFnHPvmvFrtVXEuoSVK2Xx7C12U6n+bSm5pdoIAZn8Lr0GQYxhKK/TyGp0tLTnZ00/KSydtYgzpx0v89qn0+bKtmwSTV0SVVW8Rmq+YQYatfDLvu38dNsmvfPJ+82Ptj5sBmuDLknLdKRlfNH8JfvhKx+PCypZOQYzWRkBgZKxNOId1DouZNm6COPZ7G60LfziFRcL+jWsOPTwZTxYEaxY6sEzkFch5IrY2FVui1PK7UxNKnnZpYqq1KKX3fUBt3P7TvprgxYNBpfQnlYoWTfS4GdnI4l/fvz22sfm7ahotJOXDGCIBDzo5fLqe79xILZv7ACCsLrHsHxN6Ljxin8RZ36TPETk8OV0FprHkBiLiOBjINNAHnK8xpENFLEGmytJNZJahzOWqBEfAyEqZaMMBMtJpXr9u2c8aY5xIY0qk7M6VSOpMTTiv8g5975ZV/dYep6feR6YI79P27EGFNHcfpQ89haO1uHbM28WXNKIOfWQETSSiqU9aWFq2sa0UjvTSu1MTVpplxKJGEKM1H2DLOSoKtYoASGP+I/M26XHlHwSdZJUp1Kk3uXai3N/UkRd1nCg4I0VQFhOgBUy8J4vPKTCp6ScGFQOZwHRCJDDfCpoJIuBRvR7ruDxeU7UyHALquH3J0BvbvXiKYN5z/Q+p8FMXlWNEqlYg/JJOeueh1jTY2T52I6nG/tCk1URVSm1tP4dtfy7hferOUfQ2Ks3dfO0DY1xH3ZUqUZDlw3+v87ZKSVHEoJMyr4jUXPKYqmGOwjVz6giLF8zOedGwErZsfwzgxr8hyT3uzHGoRo4UkfU5rGL8hyoq4H49pl9+WunVp33BjsZR1QqAWcSGrobH6+W8x4a4Hka2o0/gLJKWbHU9b37pp+o2g+TWo+RyISW6hwKgM30Ntn7wWtBOL7k/Qfn7DSqxhEnxbGNWAJlyRE+Iuf97F5dsfSgC+3NQa8hlkVW99i+yuANsZZfK84mqHiUI++U1X315hJoqMT/cuyu/KSWvORzg5to6SvmxuMkpd9fxxMnfVFX91hYFsdCXA7WjdhXhMYCtNE21db8P+KSi8i8x8iRc/ycCAw00FFp3gZlKFrOqNTqa1/+C1s2JjFxEnJuNHpS62jE26nEd9I7ZRc7jlFZvuagzc+hseXlawIzFsrg8i/uEBveq97fR2Idij9iANTYJDB70FGBqPiPH7cztiUkEieDuGgBXqYbSO3vyyt+vp1lcCjgHTqAABes8nz+vcnud9z8yxhlucb4BM44lCOD1AQtriZDSEXpzx3LZ/Q3Xj91oOwnJVitgcQ4fPwlkiyXJeuf0HsWJwcabZlYAAGuvDbn8+9NBn/3xgfF+9/UEJ8mMfawS6IIoxvNOKCuhk7ns1XzdlowZhLA8zhjyXQrmXmznP3jjfr5xYksWT8urtf4BRyuvDYfZqYS5FL14UkS60Dzw0lsNOgIe3BGGcxN/KPZu/KTWxtpjGbiWGeRXZY3Je8JxL9RXvOT9bp2qZMr14+b3zy+EaNV6zyre2zfu2/4iVUuUe/vE5ckoB49HC5GoT4VKAn0esdpbfXG+2b3JkQmru2uEgubZxIyvR/j3iBn37deV/dYuWDduGql8Q/5LV8TWLvC9f6nL22QRrxMg/+WpC5BJEy6sx+KZBgrQhAwUf2H5z7D9JJ3Idjxl74iNBwQDZRsQqa3Q7xUzrrnfl271B0qYZkcAEcRm773/uPj2Pxt2vCfwZkEKzJpYTdpOvBRcaL0ZlYvnjKQXz6tz8VY7NOOO4BRc6wYUpOQx79HS2+TV//sF3rP4mS8JW9iARxFbPp+5+bdfa21P8TH96pKP84lqOYTv4shaFCsRKrRMMXF/I/m7aLN4WIQxvXUymF7l9oElT4yvYqz3vSHnPOjXr1n/AjL5AI4DOKaHsOGhdp3xY3XSdALxIfvSkuaNOtNJ1ClKtI8W6kaJL7jmN3+NV2Dae6tjC/zbJqFVpuQx3V4/1o5+6efZyWwusdMJHgwWZ2sVIU7llkuWOdn/N3727KOwas0yp+JM51FmKs4inu8c2xkoE41g+5SaNx5xi/0uJIvBy9YGQeJEyKCLSpidAAnf065/jk5beOgrl3qWLYuHGx47MgDcHTorWnI2//h3aeK89dgzEXGSUVzpXA51B7yLr8UBEYG6uz2Ev/6ZdvrH5y7syXPEkkOJd5ZsMuASEJiQGMVz7cI5k/k3PUPAuhq7Fj39F48AA6Pnh7LmiaQN7zrEoEPY80SkyatWs8KIIvApT2oexTB5J6BPs+ZrfX6ujMedyUxjoPJ71S0uctSFJ1ULNR8FZUfI/JpedVPbi2A67ETwTKPTACLiTHcsdTQZGetX3jnW5yTd6ByrrSWpmgthxCH0+rsWFSsimBqOUMDPtx2+ubG66YNji2/U4uG06iE4kw5SakYGAz9RL6H6E1y9r3/BNBUl3GMh7O9BAAcHmtXOB7eIlx5bQ7Q8cUrLhbHG4j6Oiml8xHQej4slUXpsWL3B6YCqVF27oq8vWtn9R8XbCnHcABnpRegBZCIqiDiqDRD3EPxYYzcjso35ez1/wag95AwsFQnyj148QA4THLWX+n4+kPKqmJCpt74zgVB5WxEXovqhVRKMyVGdM9JV4FmqxlAEBVVESuQK1IabGQ/OG2TnlLxpZGN2j0hPW32YWleYlAMToRUCnkfittQvoPy74jeJWffu7G4VSxrFlp6NuaTQVJeHAAOjxUrDLO3WE55SIdV65xP97T0TS/PNSqLVOQ1AucpusikrlJYJx1eBKBQsrB9QPTjM56o/encHS0xWDHDDXVHDhFkr8PcMQL10CByP8p/kMg68PezNX1S3rS+WqhKHO2Lha+vDy+U7v6rC+AoF67pPworV4WR7lGre+yU3iltcUp1aqzJAqJZYERPVzEvU42zS6LTetVVzrRD3PKyR0y3wwUFO1wcLmRADfQZkKeAXwAbIW7A+QehvJPHThgcTUZ0LY5lPS9YJXQUwOcDc+UKKU7SXqPsa/UXqf/JKaes73i4Prfjz499tP1j07aVyBkug8uJZGjsx6f9zKj1s2jfKlBVmy31C/V6JIL24gJwn/e8Qljd7FzUs0Y5GAYooHGFGemAVCwOFY5swF4KAO5fUqF5bMIqdNE+DosqmuVo01VUjo6j4+g4Oo6Oo+PoeNGO/w/yI2hguYaX3AAAAABJRU5ErkJggg==\");}\n#ugf-gmail-appsmenu .gp-app-icon {margin: 0 auto; height: 64px; width: 64px;}\n#ugf-gmail-appsmenu .gp-app-title {width: fit-content; margin: 0 auto; color: #404040 !important; text-decoration: none !important;}\n#ugf-gmail-appsmenu .gp-app-title {width: fit-content; margin: 0 auto; color: #404040 !important; text-decoration: none !important; text-align: center;}\n#ugf-gmail-appsmenu .gp-app-icon {margin: 0 auto; height: 64px; width: 64px;}","accCss":"#ugf-gmail-accfence { position: fixed; inset: 0; z-index: 1400; } #ugf-gmail-accmenu { position: absolute; width: 300px; z-index: 1401; background: #fff; font: 13px arial, sans-serif; color: #222; border: 1px solid #ccc; box-shadow: 0 2px 10px rgba(0,0,0,.2); } #ugf-gmail-accmenu[chrome=\"m2018\"] { border: 0; border-radius: 12px; box-shadow: 0 4px 16px rgba(0,0,0,.2), 0 0 0 1px rgba(0,0,0,.05); font-family: \"Google Sans\", Roboto, arial, sans-serif; overflow: hidden; } #ugf-gmail-accmenu[chrome=\"m2013\"] { border-color: #ccc; border-radius: 2px; box-shadow: 0 2px 10px rgba(0,0,0,.2); } #ugf-gmail-accmenu .head { display: flex; gap: 12px; padding: 16px; border-bottom: 1px solid #eee; align-items: flex-start; } #ugf-gmail-accmenu .head img, #ugf-gmail-accmenu .head .letter { width: 64px; height: 64px; border-radius: 2px; flex: 0 0 64px; object-fit: cover; display: block; } #ugf-gmail-accmenu[chrome=\"m2018\"] .head img, #ugf-gmail-accmenu[chrome=\"m2018\"] .head .letter, #ugf-gmail-accmenu[chrome=\"m2013\"] .head img, #ugf-gmail-accmenu[chrome=\"m2013\"] .head .letter { border-radius: 50%; } #ugf-gmail-accmenu .head .letter { background: #c62828; color: #fff; font-size: 30px; display: flex; align-items: center; justify-content: center; text-transform: uppercase; } #ugf-gmail-accmenu .meta { min-width: 0; display: flex; flex-direction: column; gap: 2px; } #ugf-gmail-accmenu .meta b { font-size: 14px; } #ugf-gmail-accmenu .meta span { color: #777; font-size: 12px; overflow: hidden; text-overflow: ellipsis; } #ugf-gmail-accmenu .meta a { font-size: 12px; margin-top: 6px; color: #1a73e8; } #ugf-gmail-accmenu .acts { display: flex; gap: 8px; padding: 12px 16px; background: #fafafa; border-bottom: 1px solid #eee; } #ugf-gmail-accmenu .acts a { flex: 1 1 auto; text-align: center; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px arial, sans-serif; line-height: 25px; text-decoration: none; } #ugf-gmail-accmenu .acts a:hover { border-color: #c6c6c6; text-decoration: none; } #ugf-gmail-accmenu[chrome=\"m2018\"] .acts a { border-radius: 18px; font: 500 13px \"Google Sans\", Roboto, arial, sans-serif; line-height: 32px; background: #fff; } #ugf-gmail-accmenu .foot { display: flex; gap: 14px; justify-content: center; padding: 10px 16px; font-size: 11px; } #ugf-gmail-accmenu .foot a { color: #777; } #ugf-gmail-accmenu[chrome=\"classic\"] { border-radius: 0; }"}; const OLD = /^(1997|1998|1999|2000|2001|2002|2003|2005|2006|2007|retro)$/.test(L); // the account pages of each period // ma07 to early 2011: "Google Accounts", the blue band over "Personal Settings" and "My products" // ma11 late 2011 to 2014: the grey Kennedy "Accounts" pages with the menu down the left // ma15 2015 to 2018: "My Account", "Welcome" over the three cards // ma19 2019 to 2021: the first "Google Account" design (square-ish Material 2 buttons) // ma22 2022 to 2024: the same pages with the pill-shaped buttons of 2022 let era = L === "2022" ? "ma22" : L === "2019" ? "ma19" : ["2015", "2015L", "2015N", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(L) > -1 ? "ma15" : ["2011", "2012", "2013", "2013L", "2014"].indexOf(L) > -1 ? "ma11" : "ma07"; // Keep began in 2013, so the earlier layouts get the first (Kennedy-era) Keep if (SITE === "keep" && era === "ma07") { era = "ma11"; } const newLogo = ["2015N", "2016", "2016C", "2016L", "2017", "2018", "2018M", "2019"].indexOf(L) > -1; const year = (function() { const m = L.match(/(\d{4})/); let y = m ? parseInt(m[1], 10) : 2008; if (L === "2007" || OLD) { y = 2008; } return String(y); })(); const fav = SITE === "keep" ? (era === "ma22" ? "https://ssl.gstatic.com/keep/icon_2020q4v2_128.png" : "https://ssl.gstatic.com/keep/keep.ico") : OLD ? A.fav1999 : L === "2009" ? A.fav2009 : ["2009L", "2010", "2010N", "2011", "2012"].indexOf(L) > -1 ? A.fav2010 : ["2013", "2013L", "2014", "2015", "2015L"].indexOf(L) > -1 ? A.fav2012 : A.fav2015; const R = "html[gplex-ma]"; const pathOf = function() { return (window.location.pathname || "/").replace(/^\/u\/\d+/, "") || "/"; }; const base = ((window.location.pathname || "").match(/^\/u\/\d+/) || [""])[0]; const U = function(p) { return /^https?:/.test(p) ? p : "https://myaccount.google.com" + base + p; }; // every page is themed (the password and security pages too, by their look only) const alone = function() { return false; }; const GM2 = era === "ma19" || era === "ma22"; const esc = function(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); }; // this site refuses innerHTML (Trusted Types), so Gplex's own markup is built node by node const SVGNS = "http://www.w3.org/2000/svg"; const ENT = { amp: "&", lt: "<", gt: ">", quot: '"', nbsp: " ", middot: "·", copy: "©", raquo: "»", laquo: "«", ndash: "–", mdash: "—", rsaquo: "›" }; const dec = function(s) { return s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, function(all, k) { if (k[0] === "#") { return String.fromCodePoint(k[1] === "x" || k[1] === "X" ? parseInt(k.slice(2), 16) : parseInt(k.slice(1), 10)); } return ENT[k] !== undefined ? ENT[k] : all; }); }; const VOID = { img: 1, input: 1, br: 1, hr: 1, path: 1, rect: 1, circle: 1, meta: 1, link: 1 }; const frag = function(html) { const root = document.createDocumentFragment(); const st = [root]; const re = /<(\/?)([a-zA-Z][a-zA-Z0-9-]*)((?:\s+[^\s=>\/]+(?:="[^"]*")?)*)\s*(\/?)>|([^<]+)/g; let m; while ((m = re.exec(html))) { const top = st[st.length - 1]; if (m[5] !== undefined) { top.appendChild(document.createTextNode(dec(m[5]))); continue; } if (m[1]) { if (st.length > 1) { st.pop(); } continue; } const tag = m[2]; const svg = tag.toLowerCase() === "svg" || (top.namespaceURI === SVGNS); const el = svg ? document.createElementNS(SVGNS, tag) : document.createElement(tag); const ar = /([^\s=]+)(?:="([^"]*)")?/g; let a; while ((a = ar.exec(m[3] || ""))) { try { el.setAttribute(a[1], dec(a[2] || "")); } catch (e) {} } top.appendChild(el); if (!m[4] && !VOID[tag.toLowerCase()]) { st.push(el); } } return root; }; const icon = function(name, size, color) { const s = A.mi[name] || ""; return s.replace(/height="24"/, 'height="' + size + '"').replace(/width="24"/, 'width="' + size + '"') .replace(" -1 ? label.slice(i + 1).split("(")[0].replace(/\s+/g, " ").trim() : ""; const im = a ? a.querySelector("img") : null; photo = im ? (im.getAttribute("src") || "") : ""; if (!name) { const h = document.querySelector("h1.dnIVJb"); name = h ? h.textContent.trim() : ""; } if (!mail) { const s = document.querySelector(".aZb0Yd"); mail = s ? s.textContent.trim() : ""; } } catch (e) {} return { name: name, email: mail, photo: photo, first: name.split(" ")[0] || "" }; }; const signOut = function() { const a = document.querySelector('header#gb a[href*="SignOutOptions"]'); return a ? a.getAttribute("href") : "https://accounts.google.com/SignOutOptions"; }; // ---- the Google bar Gplex's other pages draw for the layout const gbar = function(w) { const classic = { "2007": "2007", "2009": "2009", "2009L": "2009", "2010": "2010", "2010N": "2010" }[L]; if (classic) { const apps = classic === "2007" ? [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Maps", "https://www.google.com/maps"], ["Gmail", "https://mail.google.com/"], ["Documents", "https://docs.google.com/document/"]] : [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], [classic === "2009" ? "Video" : "Videos", "https://www.youtube.com/"], ["Maps", "https://www.google.com/maps"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"], ["Documents", "https://docs.google.com/document/"]]; const left = apps.map(function(a) { return '' + a[0] + ""; }).join("") + 'more ▼'; const right = "" + esc(w.email || w.name) + " | " + (classic === "2010" ? 'Settings ▾ | ' : 'My Account | ') + 'Sign out'; return '
' + left + '
' + right + "
"; } if (["2011", "2012", "2013", "2013L"].indexOf(L) < 0) { return ""; } const plus = L === "2013"; let apps = [["Search", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Maps", "https://www.google.com/maps"], ["Play", "https://play.google.com/"], ["YouTube", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Gmail", "https://mail.google.com/"]]; if (!plus && L !== "2013L") { apps.push(["Documents", "https://docs.google.com/document/"]); } if (plus || L === "2013L") { apps.push(["Drive", "https://drive.google.com/"]); } if (plus) { apps.push(["Calendar", "https://calendar.google.com/"]); } let links = plus ? '+' + esc(w.first || "You") + "" : ""; links += apps.map(function(a) { return '' + a[0] + ""; }).join("") + 'More ▾'; const right = plus ? "" : '' + esc(w.name || w.email) + ""; return '
' + links + '
' + right + "
"; }; // ---- what each period called today's pages const TITLES = { ma07: { "/personal-info": "Personal Information", "/security": "Security", "/data-and-privacy": "Privacy", "/people-and-sharing": "Contacts and sharing", "/payments-and-subscriptions": "Google Checkout", "/email": "Email addresses", "/language": "Language" }, ma11: { "/personal-info": "Profile and privacy", "/security": "Security", "/data-and-privacy": "Data tools", "/people-and-sharing": "Sharing", "/payments-and-subscriptions": "Google Wallet", "/language": "Language" }, ma15: { "/personal-info": "Your personal info", "/security": "Sign-in & security", "/data-and-privacy": "Manage your Google activity", "/people-and-sharing": "Contacts & sharing", "/payments-and-subscriptions": "Payments", "/language": "Language" }, ma19: { "/security": "Security", "/data-and-privacy": "Data & personalization", "/payments-and-subscriptions": "Payments & subscriptions" }, ma22: { "/security": "Security", "/payments-and-subscriptions": "Payments & subscriptions" } }; const NAV = { ma11: [["Account", "/"], ["Security", "/security"], ["Profile and privacy", "/personal-info"], ["Language", "/language"], ["Data tools", "/data-and-privacy"], ["Google Wallet", "/payments-and-subscriptions"], ["Account history", "https://myactivity.google.com/"]], ma15: [["Welcome", "/", "home"], ["Sign-in & security", "/security", "lock_outline"], ["Signing in to Google", "/security", "", 1], ["Device activity & notifications", "/device-activity", "", 1], ["Connected apps & sites", "/connections", "", 1], ["Personal info & privacy", "/personal-info", "people_outline"], ["Your personal info", "/personal-info", "", 1], ["Manage your Google activity", "/data-and-privacy", "", 1], ["Ads settings", "https://myadcenter.google.com/", "", 1], ["Control your content", "https://takeout.google.com/", "", 1], ["Account preferences", "/language", "settings"], ["Language & Input Tools", "/language", "", 1], ["Your Google Drive storage", "https://one.google.com/storage", "", 1], ["Delete your account or services", "/delete-services-or-account", "", 1]] }; const pageTitle = function(p) { const t = (TITLES[era] || {})[p.replace(/\/$/, "")]; if (t) { return t; } const h = visibleMain(); const h1 = h ? h.querySelector("h1") : null; return h1 ? h1.textContent.trim() : "Google Accounts"; }; const visibleMain = function() { const all = document.querySelectorAll('[role="main"]'); for (let i = 0; i < all.length; i++) { if (all[i].getClientRects().length) { return all[i]; } } return all[0] || null; }; const logoFor = function() { if (era === "ma07") { return { src: A.nav09, w: 150 }; } if (era === "ma11") { return L === "2014" ? { src: A.logo13, w: 116 } : { src: A.logo10, w: 114 }; } return newLogo ? { src: A.logo15, w: 92 } : { src: A.logo13, w: 94 }; }; const foot = function() { if (era === "ma07") { return '
©' + year + ' Google - Google Home - Terms of Service - Privacy Policy - Help
'; } if (era === "ma11") { return '
© ' + year + ' Google – Terms of Service – Privacy Policy – Help
'; } return '
GooglePrivacyTermsHelp
'; }; // ---- the header of the period const header = function(w, p) { const lg = logoFor(); const home = p === "/"; if (era === "ma07") { const bar = gbar(w) || '
' + esc(w.email || w.name) + ' | Sign out
'; return bar + '
GoogleAccounts
' + '
' + esc(home ? "My Account" : pageTitle(p)) + "" + (home ? "" : '« Back to My Account') + "
"; } if (era === "ma11") { return gbar(w) + '
Google' + 'Accounts' + (L === "2014" ? '' + icon("apps", 24, "#666") + "" : "") + esc(w.email) + "
"; } return '
GoogleMy Account' + '' + icon("apps", 24, "#616161") + "" + '' + (w.photo ? '' : "" + esc((w.first || w.email || "?").charAt(0).toUpperCase()) + "") + "
"; }; const nav = function(p) { const list = NAV[era]; if (!list || (era === "ma15" && p === "/")) { return ""; } let on = -1; list.forEach(function(n, i) { if (on < 0 && !/^https?:/.test(n[1]) && (n[1] === "/" ? p === "/" : p.indexOf(n[1]) === 0)) { on = i; } }); return '
' + list.map(function(n, i) { return '' + (era === "ma15" && !n[3] ? (n[2] === "home" ? '' : icon(n[2], 20, i === on ? "#4285f4" : "#757575")) : "") + "" + esc(n[0]) + ""; }).join("") + "
"; }; // ---- the overview page of the period, drawn by Gplex (every link is the real page today) const homePage = function(w) { if (era === "ma07") { return '
' + '

Personal Information

' + esc(w.name) + '
Edit
' + '

Personal Settings

' + '' + '
Email addresses
' + esc(w.email) + '
Edit
' + '
Language
Edit
' + '
Web History
View and manage
' + '

My products – Edit

' + [["Gmail", "https://mail.google.com/", "https://mail.google.com/mail/#settings"], ["Calendar", "https://calendar.google.com/", "https://calendar.google.com/calendar/r/settings"], ["Docs", "https://docs.google.com/document/"], ["Picasa Web Albums", "https://photos.google.com/"], ["YouTube", "https://www.youtube.com/"], ["Maps", "https://www.google.com/maps"], ["Search settings", "https://www.google.com/preferences"], ["Web History", "https://myactivity.google.com/"]] .map(function(x) { return '' + x[0] + "" + (x[2] ? ' – Settings' : "") + "
"; }).join("") + '

Try something new

' + '
'; } if (era === "ma11") { const row = function(label, body) { return '' + label + '' + body + ""; }; return '

Account overview

' + row("Personal info", "" + esc(w.name) + "
" + esc(w.email) + '
Edit') + row("Email", esc(w.email) + '
Edit') + row("Security", 'Password
Change password

2-step verification
Edit

Recovery options
Edit') + row("Profile and privacy", 'Edit profile
Contacts, sharing and location') + row("Language", 'Edit') + row("Data tools", 'Download data
Web History
Dashboard') + row("Account management", 'Delete account and data') + "
"; } // ma15: My Account const card = function(ic, title, text, links) { return '
' + icon(ic, 40, "#4285f4") + "

" + title + "

" + text + "

" + links.map(function(l) { return '' + l[0] + ""; }).join("") + "
"; }; return '

Welcome, ' + esc(w.name || w.email) + '

Control, protect, and secure your account, all in one place
' + '

My Account gives you quick access to settings and tools that let you safeguard your data, protect your privacy, and decide how your information can make Google services work better for you.

' + '
' + card("lock_outline", "Sign-in & security", "Control your password and account access, along with backup options if you get locked out of your account.", [["Signing in to Google", "/security"], ["Device activity & notifications", "/device-activity"], ["Connected apps & sites", "/connections"]]) + card("people_outline", "Personal info & privacy", "Manage your visibility settings and the data we use to personalize your experience.", [["Your personal info", "/personal-info"], ["Manage your Google activity", "/data-and-privacy"], ["Ads settings", "https://myadcenter.google.com/"], ["Control your content", "https://takeout.google.com/"]]) + card("settings", "Account preferences", "Set language, accessibility, and other settings that help you use Google.", [["Language & Input Tools", "/language"], ["Your Google Drive storage", "https://one.google.com/storage"], ["Delete your account or services", "/delete-services-or-account"]]) + '
' + '

Security Checkup

Protect your account in just a few minutes by reviewing your security settings and activity.

GET STARTED
' + '

Privacy Checkup

Take this quick checkup to review important privacy settings and adjust them to your preference.

GET STARTED
'; }; // ---- the app launcher behind the nine dots: the same menu Gplex gives Gmail, Maps // and the rest (Google's own sheet of app icons for 2015-2019, the pre-rebrand // artwork carried inline for 2014 and early 2015) const appsList = function() { return [ [["myaccount", "https://myaccount.google.com" + base + "/", "My Account"], ["google-search", "https://www.google.com", "Search"], ["maps", "https://maps.google.com", "Maps"], ["youtube", "https://youtube.com", "YouTube"], ["play", "https://play.google.com", "Play"], ["news", "https://news.google.com", "News"], ["envelope", "https://mail.google.com", "Gmail"], ["drive", "https://drive.google.com", "Drive"], ["calendar", "https://google.com/calendar", "Calendar"], ["plus", gv("UGF_PLUS_LINK", "") || "https://plus.google.com/", "Google+"], ["translate", "https://translate.google.com", "Translate"], ["photos", "https://photos.google.com", "Photos"], ["gp-docs", "https://docs.google.com/document/u/0/", "Docs"], ["gp-sheets", "https://docs.google.com/spreadsheets/u/0/", "Sheets"], ["gp-slides", "https://docs.google.com/presentation/u/0/", "Slides"]], [["shopping", "https://www.google.com/shopping", "Shopping"], ["wallet", "https://wallet.google.com", "Wallet"], ["finance", "https://www.google.com/finance", "Finance"], ["books", "https://books.google.com", "Books"], ["blogger", "https://www.blogger.com", "Blogger"], ["contacts", "https://www.google.com/contacts", "Contacts"], ["hangouts", "https://hangouts.google.com", "Hangouts"], ["chrome", "https://www.google.com/chrome/", "Chrome"]] ]; }; const closeApps = function() { document.querySelectorAll("#ugf-gmail-appsmenu, #ugf-ma-appsfence").forEach(function(el) { el.remove(); }); }; const openApps = function(anchor, chrome) { if (document.getElementById("ugf-gmail-appsmenu")) { closeApps(); return; } if (!document.getElementById("ugf-ma-apps-style")) { const st = document.createElement("style"); st.id = "ugf-ma-apps-style"; st.textContent = A.appsCss + "\n#ugf-ma-appsfence { position: fixed; inset: 0; z-index: 2147483600; }" + "\n#ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; letter-spacing: normal; }" + "\n#ugf-gmail-appsmenu a { text-decoration: none; }"; (document.head || document.documentElement).appendChild(st); } let h = ""; appsList().forEach(function(sector) { h += '
' + sector.map(function(a) { return '
' + '
' + esc(a[2]) + "
"; }).join("") + "
"; }); h += '
Even more from Google
'; const fence = document.createElement("div"); fence.id = "ugf-ma-appsfence"; const menu = document.createElement("div"); menu.id = "ugf-gmail-appsmenu"; menu.setAttribute("chrome", chrome); menu.setAttribute("layout", L); menu.appendChild(frag('
' + h + "
")); document.body.appendChild(fence); document.body.appendChild(menu); const r = anchor.getBoundingClientRect(); menu.style.left = Math.max(8, r.right + window.scrollX - 322) + "px"; menu.style.top = (r.bottom + window.scrollY + 6) + "px"; // before the September 2015 rebrand: the lowercase g, the red g+ square and // the older Maps, Translate, Books and Contacts marks const old = ["2012", "2013", "2013L", "2014", "2015"].indexOf(L) > -1 ? A.grid : null; const bg = function(el, url, inline) { el.style.setProperty("background-image", 'url("' + url + '")', "important"); el.style.setProperty("background-size", inline ? "64px 64px" : "48px 48px", "important"); el.style.setProperty("background-position", inline ? "0 0" : "center", "important"); el.style.setProperty("background-repeat", "no-repeat", "important"); }; if (old) { Object.keys(old).forEach(function(id) { const ic = menu.querySelector("#" + id + " .gp-app-icon"); if (ic) { bg(ic, old[id], true); } }); } ["docs", "sheets", "slides"].forEach(function(n) { const ic = menu.querySelector("#gp-" + n + " .gp-app-icon"); if (ic) { bg(ic, "https://www.gstatic.com/images/branding/product/2x/" + n + "_48dp.png", false); } }); fence.addEventListener("click", closeApps); }; // ---- the account menu behind the photo: the one Gplex gives Gmail and Maps (name, // address, Google Account settings, Add account, Sign out) in place of today's pop-up const closeAcc = function() { document.querySelectorAll("#ugf-gmail-accmenu, #ugf-ma-accfence").forEach(function(el) { el.remove(); }); }; const openAcc = function(anchor, chrome) { if (document.getElementById("ugf-gmail-accmenu")) { closeAcc(); return; } closeApps(); if (!document.getElementById("ugf-ma-acc-style")) { const st = document.createElement("style"); st.id = "ugf-ma-acc-style"; st.textContent = A.accCss + "\n#ugf-ma-accfence { position: fixed; inset: 0; z-index: 2147483600; }" + "\n#ugf-gmail-accmenu { z-index: 2147483601 !important; text-align: left; letter-spacing: normal; }" + "\n#ugf-gmail-accmenu a { text-decoration: none; }" + "\n#ugf-gmail-accmenu a:hover { text-decoration: underline; }"; (document.head || document.documentElement).appendChild(st); } const w = who(); const photo = w.photo ? '' : '' + esc((w.first || w.email || "?").charAt(0)) + ""; const fence = document.createElement("div"); fence.id = "ugf-ma-accfence"; const menu = document.createElement("div"); menu.id = "ugf-gmail-accmenu"; menu.setAttribute("chrome", chrome); menu.appendChild(frag('
' + photo + '
' + esc(w.name || w.first || "Account") + "" + esc(w.email) + "" + '' + (era === "ma15" || era === "ma11" ? "My Account" : "Google Account") + "
" + '
Add accountSign out
' + '
PrivacyTerms
')); document.body.appendChild(fence); document.body.appendChild(menu); const r = anchor.getBoundingClientRect(); let left = r.right + window.scrollX - 300; left = Math.max(8, Math.min(left, window.innerWidth - 308)); menu.style.left = left + "px"; menu.style.top = (r.bottom + window.scrollY + 4) + "px"; fence.addEventListener("click", closeAcc); }; document.addEventListener("keydown", function(ev) { if (ev.key === "Escape") { closeApps(); closeAcc(); } }); // the photo in Google's bar (Keep, and the 2019 and 2022 account pages) and in Gplex's // 2015 bar document.addEventListener("click", function(ev) { if (ev.button !== 0 || ev.ctrlKey || ev.metaKey || ev.shiftKey || !ev.target || !ev.target.closest) { return; } const a = ev.target.closest('#ugf-ma a.me, header#gb a[href*="SignOutOptions"], header#gb a[aria-label^="Google Account"]'); if (!a) { return; } ev.preventDefault(); ev.stopImmediatePropagation(); openAcc(a, GM2 ? "m2018" : "m2013"); }, true); // Gplex's nine dots, and on 2019 Google's own (which would otherwise open today's // launcher) document.addEventListener("click", function(ev) { if (ev.button !== 0 || ev.ctrlKey || ev.metaKey || ev.shiftKey || !ev.target || !ev.target.closest) { return; } let a = ev.target.closest("#ugf-ma a.apps"); let chrome = "m2013"; if (!a && (GM2 || SITE === "keep")) { a = ev.target.closest('header#gb a[href*="/about/products"], header#gb #gbwa a'); chrome = GM2 ? "m2018" : "m2013"; } if (!a) { return; } ev.preventDefault(); ev.stopImmediatePropagation(); openApps(a, chrome); }, true); // ---- the look const css = []; const add = function(sel, body) { css.push(sel + " { " + body + " }"); }; const G = R + " :is(#ugf-ma, #ugf-ma-foot)"; const OURS = function(s) { return ["ma07", "ma11", "ma15"].map(function(e) { return s.replace(/\bR\b/g, 'html[gplex-ma="' + e + '"]'); }).join(", "); }; // Gplex's bar and menu take the place of Google's; Google's recommendation strip (the // Google AI plan offer) is hidden in every period add(R + " .ugf-ma-ai", "display: none !important;"); if (SITE === "acct") { add(OURS("R:not([gplex-ma-alone]) body > div:has(> header#gb), R:not([gplex-ma-alone]) header#gb"), "display: none !important;"); add(OURS("R:not([gplex-ma-alone]) div:has(> div > div > nav[jsname])"), "display: none !important;"); } add(OURS("R:not([gplex-ma-alone]) footer[role=contentinfo], R:not([gplex-ma-alone]) .VjFXz"), "display: none !important;"); add(OURS("R[gplex-ma-home]:not([gplex-ma-alone]) c-wiz[jsname]"), "display: none !important;"); add(R + "[gplex-ma-alone] #ugf-ma", "display: none !important;"); add(OURS("R:not([gplex-ma-alone]) body"), "margin: 0 !important;"); add(G, "position: relative; z-index: 3; text-align: left;"); add(G + " a", "text-decoration: none;"); add(G + " svg", "vertical-align: middle;"); // the bar across the top (classic blue links / black bar) add(G + " .gbar.classic", "display: flex; justify-content: space-between; font: 13px arial, sans-serif; padding: 3px 8px 0 4px; height: 22px; white-space: nowrap;"); add(G + " .gbar.classic a", "color: #00c; text-decoration: underline; margin: 0 4px;"); add(G + " .gbar.classic .left a:first-child", "margin-left: 0;"); add(G + " .gbar.classic small", "font-size: 9px;"); add(G + " .gbar.dark", "display: flex; justify-content: space-between; background: #2d2d2d; height: 30px; font: bold 13px arial, sans-serif; white-space: nowrap;"); add(G + " .gbar.dark a", "color: #ccc; display: inline-block; line-height: 29px; padding: 0 8px;"); add(G + " .gbar.dark a:hover", "background: #4c4c4c; color: #fff;"); add(G + " .gbar.dark .plus", "color: #fff;"); add(G + " .gbar.dark .right a", "color: #ccc;"); // ---- ma07 if (era === "ma07") { add(R + ", " + R + " body", "background: #fff !important;"); add(G + " .hd", "padding: 8px 8px 4px; display: flex; align-items: flex-end;"); add(G + " .hd img", "display: block;"); add(G + " .ttl", "font: bold 16px arial, sans-serif; color: #676767; margin: 0 0 8px 6px;"); add(G + " .band", "margin: 0 8px; border-top: 1px solid #36c; background: #e5ecf9; padding: 3px 5px; font: 13px arial, sans-serif; display: flex; justify-content: space-between;"); add(G + " .band a", "color: #00c; text-decoration: underline;"); add(G + " #ugf-ma-home", "margin: 0 8px; font: 13px arial, sans-serif;"); add(G + " table.two", "width: 100%; border-collapse: collapse; margin-top: 8px;"); add(G + " table.two td", "vertical-align: top; padding: 0 12px 0 0;"); add(G + " table.two td.l", "width: 55%;"); add(G + " h3", "font: bold 13px arial, sans-serif; margin: 14px 0 6px; padding-bottom: 2px; border-bottom: 1px solid #c3d9ff;"); add(G + " .blk", "margin: 0 0 12px 10px; line-height: 1.5;"); add(G + " .blk a", "color: #00c; text-decoration: underline;"); add(G + " .blk a.s", "font-size: 11px;"); add(G + " .foot", "margin: 24px 8px 12px; text-align: center; font: 11px arial, sans-serif; color: #676767;"); add(G + " .foot a", "color: #00c; text-decoration: underline;"); } // ---- ma11 (Kennedy) if (era === "ma11") { add(R + ", " + R + " body", "background: #fff !important;"); add(G + " .khd", "height: 70px; border-bottom: 1px solid #ebebeb; display: flex; align-items: center; padding: 0 44px 0 44px; font: 13px arial, sans-serif; background: #f1f1f1;"); add(G + " .khd .lg", "width: 160px; display: block;"); add(G + " .khd img", "display: block;"); add(G + " .khd .app", "font-size: 20px; color: #dd4b39; flex: 1;"); add(G + " .khd .r", "color: #666; display: flex; align-items: center;"); add(G + " .khd .apps", "display: block; padding: 6px; margin-right: 14px; opacity: .8;"); add(G + " .khd .apps:hover", "opacity: 1;"); add(G + " #ugf-ma-nav", "position: absolute; left: 0; width: 204px; padding-top: 20px; font: 13px arial, sans-serif;"); add(G + " #ugf-ma-nav a", "display: block; color: #222; line-height: 28px; padding-left: 44px; border-left: 4px solid transparent;"); add(G + " #ugf-ma-nav a:hover", "background: #eee;"); add(G + " #ugf-ma-nav a.on", "color: #dd4b39; font-weight: bold; border-left-color: #dd4b39;"); add(G + " #ugf-ma-home", "margin-left: 204px; padding: 16px 44px 0 0; font: 13px arial, sans-serif; color: #222; max-width: 760px;"); add(G + " #ugf-ma-home h1", "font: normal 20px arial, sans-serif; color: #222; margin: 6px 0 18px;"); add(G + " table.kt", "width: 100%; border-collapse: collapse;"); add(G + " table.kt td", "border-top: 1px solid #ebebeb; padding: 14px 0; vertical-align: top; line-height: 1.5;"); add(G + " table.kt td.k", "width: 190px; color: #666; font-weight: bold;"); add(G + " table.kt a", "color: #15c;"); add(G + " table.kt a:hover", "text-decoration: underline;"); add(G + " .foot", "margin: 40px 0 16px 248px; font: 13px arial, sans-serif; color: #666;"); add(R + " #ugf-ma-foot .foot", "margin-left: 0;"); add(G + " .foot a", "color: #15c;"); } // ---- ma15 (My Account) if (era === "ma15") { add(R + ", " + R + " body", "background: #eee !important;"); add(G, "font-family: Roboto, arial, sans-serif;"); add(G + " .abar", "height: 64px; background: #fff; box-shadow: 0 2px 4px rgba(0,0,0,.2); display: flex; align-items: center; padding: 0 16px 0 24px;"); add(G + " .abar .lg", "display: block; margin-right: 8px;"); add(G + " .abar .lg img", "display: block; margin-top: 3px;"); add(G + " .abar .app", "flex: 1; font-size: 22px; color: #757575;"); add(G + " .abar .r", "display: flex; align-items: center;"); add(G + " .abar .apps", "padding: 8px; margin-right: 8px; display: block;"); add(G + " .abar .me", "display: block; width: 32px; height: 32px; border-radius: 50%; overflow: hidden; background: #4285f4; color: #fff; text-align: center; line-height: 32px;"); add(G + " .abar .me img", "width: 32px; height: 32px; display: block;"); add(G + " #ugf-ma-home", "max-width: 1040px; margin: 0 auto; padding: 0 16px 24px; color: #212121;"); add(G + " .wel", "text-align: center; padding: 40px 10% 24px;"); add(G + " .wel h1", "font-size: 34px; font-weight: 400; margin: 0 0 8px; color: #212121;"); add(G + " .wel .sub", "font-size: 20px; color: #212121; margin-bottom: 12px;"); add(G + " .wel p", "font-size: 14px; color: #757575; line-height: 20px; margin: 0;"); add(G + " .cards", "display: flex; gap: 16px; margin-bottom: 16px;"); add(G + " .card", "flex: 1; background: #fff; border-radius: 2px; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); padding: 24px; box-sizing: border-box;"); add(G + " .card .ci", "height: 56px;"); add(G + " .card h2", "font-size: 20px; font-weight: 400; margin: 0 0 8px; color: #212121;"); add(G + " .card p", "font-size: 14px; line-height: 20px; color: #757575; margin: 0 0 16px; min-height: 60px;"); add(G + " .card a", "display: block; color: #4285f4; font-size: 14px; line-height: 32px; border-top: 1px solid #eee;"); add(G + " .card a:hover", "text-decoration: underline;"); add(G + " .card.wide p", "min-height: 0;"); add(G + " .card a.go", "border: 0; font-weight: 500; display: inline-block;"); add(G + " #ugf-ma-nav", "position: absolute; left: 0; width: 256px; padding: 16px 0; background: #fff; box-shadow: 1px 0 2px rgba(0,0,0,.1); font-size: 14px; min-height: calc(100vh - 64px); box-sizing: border-box;"); add(G + " #ugf-ma-nav a", "display: flex; align-items: center; color: #212121; height: 40px; padding: 0 16px;"); add(G + " #ugf-ma-nav a svg, " + G + " #ugf-ma-nav i.sp", "margin-right: 24px; width: 20px; flex: none;"); add(G + " #ugf-ma-nav a.top", "font-weight: 500;"); add(G + " #ugf-ma-nav a.sub", "padding-left: 60px; color: #616161; height: 32px; font-size: 13px;"); add(G + " #ugf-ma-nav a:hover", "background: #f5f5f5;"); add(G + " #ugf-ma-nav a.on", "color: #4285f4;"); add(G + " .foot", "text-align: center; padding: 16px; font-size: 13px;"); add(G + " .foot a", "color: #757575; margin: 0 8px;"); } // ---- Google's pages under the overview, restyled in place // icons drawn with Google's icon font keep that font (otherwise their names show as words) const ICX = ':not(i):not(.google-material-icons):not([class*="material-icons"]):not([class*="material-symbols"]):not([data-ugf-icon])'; const Z = R + " body"; const PAGE = R + " body > c-wiz"; const NAVW = { ma11: "204px", ma15: "256px" }[era]; if (era === "ma07" || era === "ma11" || era === "ma15") { const S = R + ":not([gplex-ma-alone])"; const MM = S + ' [role="main"]'; // Gplex's menu down the left: Google's whole page moves over to make room for it if (NAVW) { add(S + ":not([gplex-ma-home]) body > c-wiz", "margin-left: " + NAVW + " !important;"); } add(MM, "margin: 0 !important; padding: 0 0 0 " + (era === "ma07" ? "8px" : "0") + " !important; max-width: none !important; width: auto !important; flex: 1 !important;"); add(MM + " > div", "max-width: " + (era === "ma07" ? "none" : "760px") + " !important; margin: 0 !important; padding: " + (era === "ma07" ? "4px 8px 0 0" : era === "ma11" ? "16px 44px 0 0" : "24px 32px 0") + " !important;"); add(PAGE + " *:not(img):not(input):not([role=switch]):not([data-ugf-btn])", "border-radius: 0 !important;"); add(MM + " .UTNHae, " + MM + " .XjoK4b", "display: none !important;"); add(MM + " .eEdfGd, " + MM + " .mTDnUe, " + MM + " .I6X0Eb, " + MM + " .Rju2Ue-LatNUc", "display: none !important;"); add(MM + " .O0Ojy svg, " + MM + " .BsqAx svg", "display: none !important;"); add(MM + " .Og0J1", "background: transparent !important; box-shadow: none !important; border: 0 !important; margin: 0 !important;"); add(MM + " .RCVhid", "margin: 0 0 18px !important; padding: 0 !important; background: none !important; border: 0 !important;"); add(MM + " .N25As, " + MM + " a.umngff, " + MM + " button.umngff", "background: transparent !important; box-shadow: none !important;"); add(MM + " .O0Ojy", "min-height: 0 !important; padding: 0 !important; align-items: flex-start !important;"); add(MM + " .At4TMd, " + MM + " .eEhIle, " + MM + " .OvmKPe, " + MM + " .jk48ud > *", "margin: 0 !important; padding: 0 !important;"); add(MM + " h1.dY4qye", "padding: 0 !important; margin-left: 0 !important; margin-right: 0 !important;"); add(MM + " .jk48ud", "background: none !important; padding: 0 !important; height: auto !important;"); add(MM + " .jk48ud > div:not(.plYl1b), " + MM + " .fmpYVc img, " + MM + " .jk48ud svg", "display: none !important;"); add(MM + " .fmpYVc, " + MM + " .b70Oac", "background: none !important; border: 0 !important; padding: 0 !important; margin: 4px 0 0 !important;"); if (era === "ma07" || era === "ma11") { const link = era === "ma07" ? "#00c" : "#15c"; // the shortcut chips were plain links then add(MM + " .Rju2Ue-XPtOyb", "background: none !important; border: 0 !important; box-shadow: none !important; height: auto !important; margin: 0 16px 6px 0 !important; padding: 0 !important;"); add(MM + " .Rju2Ue-jPmIDe", "background: none !important; border: 0 !important; height: auto !important; padding: 0 !important;"); add(MM + " .Rju2Ue-jPmIDe::before, " + MM + " .Rju2Ue-jPmIDe::after, " + MM + " .Rju2Ue-jPmIDe-dgl2Hf", "display: none !important;"); add(PAGE + ", " + PAGE + " *" + ICX, "font-family: arial, sans-serif !important; letter-spacing: normal !important;"); add(MM, "font-size: 13px !important; color: #000 !important;"); add(MM + " h1.dY4qye, " + MM + " .tdmI2c", era === "ma07" ? "display: none !important;" : "font: normal 20px arial, sans-serif !important; color: #222 !important; margin: 6px 0 18px !important; text-align: left !important;"); add(MM + " .Megnze", "padding: 0 !important; margin: 0 0 6px !important;"); add(MM + " .s54gZb", era === "ma07" ? "font: bold 13px arial, sans-serif !important; color: #000 !important; margin: 0 !important; padding: 2px 0 !important; border-bottom: 1px solid #c3d9ff !important;" : "font: normal 16px arial, sans-serif !important; color: #222 !important; margin: 0 0 4px !important; padding: 0 !important;"); add(MM + " .cU7iNb", "font-size: 13px !important; color: #666 !important; margin: 2px 0 0 !important;"); add(MM + " .N25As", era === "ma07" ? "border: 0 !important; margin: 0 0 0 10px !important;" : "border-top: 1px solid #ebebeb !important; margin: 0 !important;"); add(MM + " a.umngff, " + MM + " button.umngff", "padding: " + (era === "ma07" ? "4px 0" : "10px 0") + " !important; min-height: 0 !important; height: auto !important; text-align: left !important; font: inherit !important; cursor: pointer;"); add(MM + " .IlKlLe", "font-size: 13px !important; font-weight: " + (era === "ma07" ? "normal" : "bold") + " !important; color: " + (era === "ma07" ? link : "#222") + " !important; line-height: 1.5 !important;" + (era === "ma07" ? " text-decoration: underline !important;" : "")); add(MM + " .ImPZoc, " + MM + " .qqVS5, " + MM + " .oeTldb", "font-size: 13px !important; color: " + (era === "ma07" ? "#000" : "#666") + " !important; line-height: 1.5 !important;"); add(MM + " .jk48ud, " + MM + " .plYl1b", "color: #080 !important; font-size: 13px !important;"); add(MM + " .hf2rhe, " + MM + " .IMnWLd", "font-size: 12px !important; color: #666 !important;"); add(PAGE + " a:not(.umngff):not([data-ugf-btn])", "color: " + link + " !important;"); add(MM + " .Rju2Ue-TfeOUb-V67aGc", "color: " + link + " !important; font-size: 13px !important; text-decoration: " + (era === "ma07" ? "underline" : "none") + " !important;"); add(MM + " .umngff:hover .IlKlLe", era === "ma07" ? "color: #c00 !important;" : "text-decoration: underline !important;"); add(MM + " .BsqAx img, " + MM + " .bVKaZd img", "width: 48px !important; height: 48px !important;"); // the pages behind a row (Nickname, Gender ...): their title bar and card flat // on the white page, the heading in the period's type add(PAGE + " h1" + ICX + ", " + PAGE + " [role=heading][aria-level='1']", "font: " + (era === "ma07" ? "bold 16px" : "normal 20px") + " arial, sans-serif !important; color: " + (era === "ma07" ? "#000" : "#222") + " !important;"); } else { // ma15: the 2015 Material cards add(PAGE + ", " + PAGE + " *" + ICX, "font-family: Roboto, arial, sans-serif !important; letter-spacing: normal !important;"); add(MM, "color: #212121 !important;"); add(MM + " h1.dY4qye", "font-size: 24px !important; font-weight: 400 !important; color: #212121 !important; text-align: left !important; margin: 0 0 24px !important;"); add(MM + " .RCVhid", "background: #fff !important; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12) !important; border-radius: 2px !important; margin: 0 0 16px !important;"); add(MM + " .Megnze", "padding: 20px 24px 8px !important; margin: 0 !important;"); add(MM + " .s54gZb", "font-size: 20px !important; font-weight: 400 !important; color: #212121 !important; margin: 0 !important;"); add(MM + " .cU7iNb", "font-size: 14px !important; color: #757575 !important; margin: 6px 0 0 !important;"); add(MM + " .N25As", "border-top: 1px solid #e0e0e0 !important; margin: 0 !important;"); add(MM + " .RCVhid > .Og0J1 > .OvmKPe > .N25As:first-child", "border-top: 0 !important;"); add(MM + " a.umngff, " + MM + " button.umngff", "padding: 16px 24px !important; min-height: 0 !important; height: auto !important; text-align: left !important;"); add(MM + " a.umngff:hover, " + MM + " button.umngff:hover", "background: #f5f5f5 !important;"); add(MM + " .IlKlLe", "font-size: 14px !important; font-weight: 500 !important; color: #212121 !important;"); add(MM + " .ImPZoc, " + MM + " .qqVS5", "font-size: 14px !important; color: #757575 !important;"); add(MM + " .jk48ud, " + MM + " .plYl1b", "color: #0f9d58 !important; font-size: 14px !important;"); add(MM + " .fmpYVc, " + MM + " .b70Oac", "padding: 8px 24px 16px !important;"); add(MM + " .hf2rhe, " + MM + " .IMnWLd", "font-size: 13px !important; color: #757575 !important;"); add(PAGE + " a:not(.umngff):not([data-ugf-btn])", "color: #4285f4 !important;"); add(MM + " .BXs2he", "padding: 0 !important;"); add(MM + " .BsqAx img, " + MM + " .bVKaZd img", "border-radius: 50% !important;"); add(PAGE + " h1" + ICX, "font-weight: 400 !important; color: #212121 !important;"); // the cards of the pages behind a row: white, with the 2015 card shadow add(PAGE + ' [data-ugf-bg="surf"]', "box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12) !important;"); add(PAGE + ' [data-ugf-bg="surf"] [data-ugf-bg="surf"]', "box-shadow: none !important; border-bottom: 1px solid #e0e0e0 !important;"); } } // ---- 2019 and 2022: Material 2, "Google Account", white pages with grey-outlined cards if (GM2) { const MM = R + ' [role="main"]'; const SANS = '"Google Sans", Roboto, Arial, sans-serif'; add(R + ", " + R + " body", "background: #fff !important;"); add(R + " .ugf-ma19-hide", "display: none !important;"); add(R + " .ugf-ma19-sub", "font-size: 16px; color: #5f6368; margin: 8px 0 0; text-align: center; font-family: Roboto, arial, sans-serif;"); if (era === "ma19") { add(R + " .fgkpSc", "display: none !important;"); } add(R + " header#gb", "background: #fff !important; box-shadow: none !important; border-bottom: 1px solid #dadce0 !important;"); add(R + ' header#gb form[role="search"], ' + R + ' header#gb form[role="search"] [data-ugf-bg]', "background: #f1f3f4 !important; border-radius: 8px !important;"); add(PAGE + " *" + ICX, "font-family: Roboto, Arial, sans-serif !important; letter-spacing: normal !important;"); add(R + " nav[jsname] a *:not(img)", "background: transparent !important;"); add(R + " nav[jsname] a", "border-radius: 0 25px 25px 0 !important; margin-right: 16px !important;"); add(R + " nav[jsname] a, " + R + " nav[jsname] a *" + ICX, "font-family: " + SANS + " !important; color: #3c4043 !important;"); add(R + " nav[jsname] a.F1QCd-yXBf7b-yrbHlf-ibnC6b-OWXEXe, " + R + ' nav[jsname] a[aria-current="page"]', "background: #e8f0fe !important;"); add(R + " nav[jsname] a.F1QCd-yXBf7b-yrbHlf-ibnC6b-OWXEXe *" + ICX + ", " + R + ' nav[jsname] a[aria-current="page"] *' + ICX, "color: #1967d2 !important; font-weight: 500 !important;"); add(PAGE + " h1" + ICX + ", " + MM + " h1.dY4qye", "font-family: " + SANS + " !important; font-weight: 400 !important; color: #202124 !important;"); add(MM + " h1.dnIVJb", "font: 400 28px/36px " + SANS + " !important; color: #202124 !important;"); add(MM + " .s54gZb", "font: 400 22px/28px " + SANS + " !important; color: #202124 !important;"); add(MM + " .cU7iNb", "font-size: 14px !important; color: #5f6368 !important;"); add(MM + " .RCVhid", "background: transparent !important;"); add(MM + " .Og0J1", "background: #fff !important; border: 1px solid #dadce0 !important; border-radius: 8px !important; box-shadow: none !important; overflow: hidden !important;"); add(MM + " .OvmKPe", "gap: 0 !important; padding: 0 !important;"); add(MM + " .N25As", "margin: 0 !important; border-radius: 0 !important; background: #fff !important;"); add(MM + " .N25As + .N25As", "border-top: 1px solid #dadce0 !important;"); add(MM + " a.umngff, " + MM + " button.umngff", "background: transparent !important; border-radius: 0 !important;"); add(MM + " a.umngff:hover, " + MM + " button.umngff:hover", "background: #f8f9fa !important;"); add(MM + " .UTNHae, " + MM + " .XjoK4b", "display: none !important;"); add(MM + " .IlKlLe", "font-size: 16px !important; font-weight: 400 !important; color: #202124 !important;"); add(MM + " .ImPZoc, " + MM + " .qqVS5", "font-size: 14px !important; color: #5f6368 !important;"); // 2019's rows: the small grey capitals on the left, the value beside them add(MM + " .At4TMd:has(.qqVS5)", "display: flex !important; align-items: baseline !important;"); add(MM + " .At4TMd:has(.qqVS5) > div:first-child", "flex: 0 0 156px !important;"); add(MM + " .At4TMd:has(.qqVS5) .IlKlLe", "font-size: 11px !important; font-weight: 500 !important; letter-spacing: .8px !important; text-transform: uppercase !important; color: #5f6368 !important;"); add(MM + " .At4TMd:has(.qqVS5) .qqVS5", "font-size: 16px !important; color: #202124 !important;"); // the row pictures are today's; 2019 and 2022 rows had none add(MM + " .eEdfGd", "display: none !important;"); add(MM + " .jk48ud", "background: none !important; padding: 0 !important;"); add(MM + " .jk48ud > div:not(.plYl1b)", "display: none !important;"); add(MM + " .jk48ud, " + MM + " .plYl1b", "color: #188038 !important;"); add(PAGE + " a:not(.umngff):not([data-ugf-btn])", "color: #1a73e8 !important;"); add(MM + ' [data-ugf-bg="surf"]', "border-radius: 8px !important;"); add(MM + ' [data-ugf-bg="surf"]:not([data-ugf-bg="surf"] *)', "border: 1px solid #dadce0 !important;"); } // ---- Google's colour palette itself, swapped for the period's. Every page and every // menu Google draws takes its greys, blues and outlines from these few named colours, // so replacing them reaches the pages Gplex has never seen as well as the known ones. { const T = { ma07: { surf: "#fff", primary: "#00c", onPrimary: "#fff", cont: "#e5ecf9", onCont: "#000", text: "#000", text2: "#666", outline: "#999", outline2: "#ebebeb", variant: "#f0f0f0", green: "#080", red: "#c00" }, ma11: { surf: "#fff", primary: "#15c", onPrimary: "#fff", cont: "#eee", onCont: "#222", text: "#222", text2: "#666", outline: "#d9d9d9", outline2: "#ebebeb", variant: "#f1f1f1", green: "#093", red: "#dd4b39" }, ma15: { surf: "#fff", primary: "#4285f4", onPrimary: "#fff", cont: "#e8f0fe", onCont: "#3367d6", text: "#212121", text2: "#757575", outline: "#bdbdbd", outline2: "#e0e0e0", variant: "#f5f5f5", green: "#0f9d58", red: "#db4437" }, ma19: { surf: "#fff", primary: "#1a73e8", onPrimary: "#fff", cont: "#e8f0fe", onCont: "#1967d2", text: "#202124", text2: "#5f6368", outline: "#dadce0", outline2: "#dadce0", variant: "#f1f3f4", green: "#188038", red: "#d93025" } }; T.ma22 = T.ma19; const t = T[era]; const v = { "background": t.surf, "surface": t.surf, "surface-bright": t.surf, "surface-dim": t.variant, "surface-container-lowest": t.surf, "surface-container-low": t.surf, "surface-container": t.surf, "surface-container-high": t.surf, "surface-container-highest": t.variant, "surface-variant": t.variant, "on-background": t.text, "on-surface": t.text, "on-surface-variant": t.text2, "primary": t.primary, "on-primary": t.onPrimary, "inverse-primary": t.primary, "surface-tint": t.surf, "primary-container": t.cont, "on-primary-container": t.onCont, "primary-fixed": t.cont, "primary-fixed-dim": t.cont, "secondary": t.primary, "on-secondary": t.onPrimary, "secondary-container": t.cont, "on-secondary-container": t.onCont, "secondary-fixed": t.cont, "secondary-fixed-dim": t.cont, "tertiary": t.green, "tertiary-container": t.cont, "on-tertiary-container": t.onCont, "outline": t.outline, "outline-variant": t.outline2, "error": t.red }; const decl = Object.keys(v).map(function(k) { return "--gm3-sys-color-" + k + ": " + v[k] + " !important;"; }).join(" ") + " --identity-common-ui-components-web-color-on-primary-container: " + t.onCont + " !important;" + " --identity-common-ui-components-web-color-link: " + t.primary + " !important;"; add(R + " body, " + R + " body *", decl); } // ---- every page, every period: Google's grey panels, buttons, boxes and switches as // the period drew them. Google's own colours are read once per element (Gplex's // stylesheet switched off for that instant) and the element is marked with what it is. { const P = Z; const surf = { ma07: "transparent", ma11: "transparent", ma15: "#fff", ma19: "#fff", ma22: "#fff" }[era]; const tonal = { ma07: "#e5ecf9", ma11: "#eee", ma15: "rgba(66,133,244,.12)", ma19: "#e8f0fe", ma22: "#e8f0fe" }[era]; add(P + ' [data-ugf-bg="surf"]', "background: " + surf + " !important;"); add(P + ' [data-ugf-bg="page"], ' + P + ' [data-ugf-bg="bar"], ' + P + '[data-ugf-bg]', "background: transparent !important; box-shadow: none !important;"); add(P + ' [data-ugf-bg="tonal"]', "background: " + tonal + " !important;"); // white cards: the 2015 card shadow, or 2019's grey outline const cardLook = { ma07: "box-shadow: none !important;", ma11: "box-shadow: none !important;", ma15: "border: 0 !important; border-radius: 2px !important; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12) !important;", ma19: "border: 1px solid #dadce0 !important; border-radius: 8px !important; box-shadow: none !important;" }; cardLook.ma22 = cardLook.ma19; add(P + ' [data-ugf-bg="card"][data-ugf-bg]', "background: #fff !important; " + cardLook[era]); add(P + ' [data-ugf-bg="card"] [data-ugf-bg="card"][data-ugf-bg], ' + P + ' [data-ugf-bg="surf"] [data-ugf-bg="card"][data-ugf-bg]', "box-shadow: none !important; border: 0 !important;"); add(P + " [data-ugf-bg]::before, " + P + " [data-ugf-bg]::after", "background: transparent !important;"); add(Z + " [data-ugf-hide]", "display: none !important;"); // "Search Google Account" and "Get help" (both now answer with AI), and the search // boxes that do the same add(Z + ' .RCVhid:has([jscontroller="EjDe9b"]), ' + Z + ' .RCVhid:has([jscontroller="MWNFg"]), ' + Z + ' [jscontroller="EjDe9b"], ' + Z + ' [jscontroller="MWNFg"], ' + Z + " .fgkpSc" + (SITE === "acct" ? ", " + R + ' header#gb form[role="search"]' : ""), "display: none !important;"); if (!GM2) { // nothing round before 2019: Google's outlines drawn on the ::before/::after layers too add(P + " *:not([role=switch])::before, " + P + " *:not([role=switch])::after", "border-radius: 0 !important;"); // the sign-in option chips as the period's buttons const CH = P + " .Rju2Ue-jPmIDe"; add(CH + "::before, " + CH + "::after, " + CH + "-dgl2Hf, " + P + " .Rju2Ue-XPtOyb::before, " + P + " .Rju2Ue-XPtOyb::after", "display: none !important;"); add(P + " .Rju2Ue-XPtOyb", "border: 0 !important; background: none !important; box-shadow: none !important; border-radius: 0 !important; overflow: visible !important;"); add(P + " .Rju2Ue-AnTmuf, " + P + " .Rju2Ue-jPmIDe-hSRGPd-sM5MNb", "overflow: visible !important;"); } // ---- buttons const B = function(k) { return P + ' [data-ugf-btn="' + k + '"]:not([data-ugf-icon])'; }; const ALLB = P + " [data-ugf-btn]"; add(ALLB + "::before, " + ALLB + "::after", "display: none !important;"); add(ALLB + " *" + ICX + ":not(svg):not(path):not(img)", "color: inherit !important; background: transparent !important; font: inherit !important; letter-spacing: inherit !important; text-transform: inherit !important;"); add(ALLB, "box-shadow: none !important; min-width: 0 !important; cursor: pointer !important; text-decoration: none !important;"); const btn = { ma07: { box: "font: 13px arial, sans-serif !important; color: #000 !important; background: #f0f0f0 !important; border: 1px solid !important; border-color: #ccc #888 #888 #ccc !important; border-radius: 0 !important; height: auto !important; min-height: 0 !important; padding: 2px 8px !important; text-transform: none !important;", on: "background: #e5ecf9 !important; border-color: #888 #ccc #ccc #888 !important; font-weight: bold !important;", text: "font: 13px arial, sans-serif !important; color: #00c !important; background: none !important; border: 0 !important; text-decoration: underline !important; padding: 0 4px !important; height: auto !important; text-transform: none !important;" }, ma11: { filled: "font: bold 11px arial, sans-serif !important; color: #fff !important; background: #4d90fe linear-gradient(#4d90fe, #4787ed) !important; border: 1px solid #3079ed !important; border-radius: 2px !important; height: 29px !important; line-height: 27px !important; padding: 0 12px !important; text-transform: none !important;", filledHover: "background: #357ae8 linear-gradient(#4d90fe, #357ae8) !important; border-color: #2f5bb7 !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;", box: "font: bold 11px arial, sans-serif !important; color: #444 !important; background: #f5f5f5 linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; border-radius: 2px !important; height: 29px !important; line-height: 27px !important; padding: 0 12px !important; text-transform: none !important;", boxHover: "color: #222 !important; border-color: #c6c6c6 !important; background: #f8f8f8 linear-gradient(#f8f8f8, #f1f1f1) !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;", on: "color: #222 !important; background: #eee linear-gradient(#eee, #e0e0e0) !important; border-color: #ccc !important; box-shadow: inset 0 1px 2px rgba(0,0,0,.1) !important;", text: "font: 13px arial, sans-serif !important; color: #15c !important; background: none !important; border: 0 !important; padding: 0 4px !important; height: auto !important; text-transform: none !important;" }, ma15: { filled: "font: 500 14px Roboto, arial, sans-serif !important; color: #fff !important; background: #4285f4 !important; border: 0 !important; border-radius: 2px !important; height: 36px !important; padding: 0 16px !important; text-transform: uppercase !important; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12) !important;", filledHover: "background: #3b78e7 !important; box-shadow: 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12), 0 2px 4px -1px rgba(0,0,0,.2) !important;", box: "font: 500 14px Roboto, arial, sans-serif !important; color: #4285f4 !important; background: transparent !important; border: 1px solid #e0e0e0 !important; border-radius: 2px !important; height: 36px !important; padding: 0 16px !important; text-transform: uppercase !important;", boxHover: "background: rgba(158,158,158,.2) !important;", on: "background: rgba(66,133,244,.12) !important; border-color: #4285f4 !important;", text: "font: 500 14px Roboto, arial, sans-serif !important; color: #4285f4 !important; background: transparent !important; border: 0 !important; border-radius: 2px !important; height: 36px !important; padding: 0 8px !important; text-transform: uppercase !important;" } }; const r = era === "ma22" ? "18px" : "4px"; btn.ma19 = btn.ma22 = { filled: "font: 500 14px/36px " + '"Google Sans", Roboto, Arial, sans-serif' + " !important; color: #fff !important; background: #1a73e8 !important; border: 0 !important; border-radius: " + r + " !important; height: 36px !important; padding: 0 24px !important; text-transform: none !important; letter-spacing: .25px !important;", filledHover: "background: #1b66c9 !important; box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15) !important;", box: "font: 500 14px/34px " + '"Google Sans", Roboto, Arial, sans-serif' + " !important; color: #1a73e8 !important; background: #fff !important; border: 1px solid #dadce0 !important; border-radius: " + r + " !important; height: 36px !important; padding: 0 23px !important; text-transform: none !important; letter-spacing: .25px !important;", boxHover: "background: #f8fbff !important; border-color: #d2e3fc !important;", on: "background: #e8f0fe !important; color: #1967d2 !important; border-color: #d2e3fc !important;", text: "font: 500 14px/36px " + '"Google Sans", Roboto, Arial, sans-serif' + " !important; color: #1a73e8 !important; background: transparent !important; border: 0 !important; border-radius: " + r + " !important; height: 36px !important; padding: 0 8px !important; text-transform: none !important; letter-spacing: .25px !important;" }; const bs = btn[era]; add(B("filled"), bs.filled || bs.box); add(B("outlined"), bs.box); add(B("tonal"), bs.box + " " + bs.on); add(B("text"), bs.text); if (bs.filledHover) { add(B("filled") + ":hover", bs.filledHover); } if (bs.boxHover) { add(B("outlined") + ":hover", bs.boxHover); } if (era === "ma15") { // the sign-in option chips as 2015's flat buttons add(P + " a.Rju2Ue-jPmIDe, " + P + " button.Rju2Ue-jPmIDe", bs.box + " display: inline-flex !important; align-items: center !important; margin: 0 8px 8px 0 !important;"); add(P + " .Rju2Ue-jPmIDe *" + ICX, "color: inherit !important; font: inherit !important; text-transform: inherit !important;"); add(P + " a.Rju2Ue-jPmIDe:hover, " + P + " button.Rju2Ue-jPmIDe:hover", bs.boxHover); } // ---- round buttons and tick boxes: the browser's own box shown, in the period's look add(Z + " [data-ugf-deco]", "display: none !important;"); add(Z + " :is(.VfPpkd-RsCWK, .VfPpkd-YQoJzd, .VfPpkd-OYHm6b, .VfPpkd-eHTEvd, .VfPpkd-HUofsb, .VfPpkd-SJnn3d)", "display: none !important;"); add(Z + " :is(.VfPpkd-GCYh9b, .VfPpkd-MPu53c) > input", "position: absolute !important; inset: 0 !important; margin: auto !important; z-index: 1 !important;"); add(Z + " [data-ugf-ctl]::before, " + Z + " [data-ugf-ctl]::after", "display: none !important;"); add(Z + " [data-ugf-ctl]", "background: transparent !important;"); const RB = Z + ' input[type="radio"]'; const CB = Z + ' input[type="checkbox"]:not([role="switch"])'; add(RB + ", " + CB, "opacity: 1 !important; box-sizing: border-box !important; padding: 0 !important; cursor: pointer !important; transform: none !important; flex: none !important;"); add(Z + " [data-ugf-ctl] > input", "position: absolute !important; inset: 0 !important; margin: auto !important; z-index: 1 !important;"); const checkUrl = 'url("data:image/svg+xml,' + encodeURIComponent(icon("check", 24, "#fff")) + '")'; if (era === "ma07") { add(RB + ", " + CB, "appearance: auto !important; -moz-appearance: auto !important; -webkit-appearance: auto !important; width: 13px !important; height: 13px !important;"); } else if (era === "ma11") { add(RB + ", " + CB, "appearance: none !important; -moz-appearance: none !important; -webkit-appearance: none !important; background: #fff !important; border: 1px solid #c6c6c6 !important;"); add(CB, "width: 13px !important; height: 13px !important; border-radius: 1px !important;"); add(RB, "width: 15px !important; height: 15px !important; border-radius: 50% !important;"); add(RB + ":hover, " + CB + ":hover", "border-color: #b2b2b2 !important; box-shadow: inset 0 1px 1px rgba(0,0,0,.1) !important;"); add(RB + ":focus, " + CB + ":focus", "border-color: #4d90fe !important; outline: none !important;"); add(CB + ":checked", "background: #fff url(" + JSON.stringify(A.check) + ") no-repeat -5px -4px !important;"); add(RB + ":checked", "background: radial-gradient(circle, #555 0 3.5px, #fff 4px) !important;"); } else { const blue = era === "ma15" ? "#4285f4" : "#1a73e8"; const rim = era === "ma15" ? "rgba(0,0,0,.54)" : "#5f6368"; add(RB + ", " + CB, "appearance: none !important; -moz-appearance: none !important; -webkit-appearance: none !important; background: transparent !important; border: 2px solid " + rim + " !important;"); add(CB, "width: 18px !important; height: 18px !important; border-radius: 2px !important;"); add(RB, "width: 20px !important; height: 20px !important; border-radius: 50% !important;"); add(CB + ":checked", "background: " + blue + " " + checkUrl + " no-repeat center / 16px 16px !important; border-color: " + blue + " !important;"); add(RB + ":checked", "border-color: " + blue + " !important; background: radial-gradient(circle, " + blue + " 0 5px, transparent 5.5px) !important;"); add(RB + ":focus, " + CB + ":focus", "outline: none !important;"); } // ---- switches const SW = Z + ' [role="switch"]:not(input)'; const ON = SW + '[aria-checked="true"]'; add(SW, "position: relative !important; display: inline-block !important; flex: none !important; padding: 0 !important; margin: 0 4px !important; border: 0 !important; background: transparent !important; box-shadow: none !important; overflow: visible !important; outline: none !important; cursor: pointer !important; vertical-align: middle !important;"); add(SW + " > *", "visibility: hidden !important;"); add(SW + "::before, " + SW + "::after", 'content: "" !important; position: absolute !important; display: block !important; box-sizing: border-box !important; pointer-events: none !important; opacity: 1 !important; transform: none !important; transition: left .15s, background-color .15s !important;'); if (era === "ma07" || era === "ma11") { // no switches yet: an on/off setting was a tick box add(SW, "width: 13px !important; min-width: 13px !important; height: 13px !important;"); add(SW + "::before", "inset: 0 !important; width: auto !important; height: auto !important; border-radius: 1px !important; border: 1px solid " + (era === "ma07" ? "#7a7a7a" : "#c6c6c6") + " !important; background: " + (era === "ma07" ? "linear-gradient(#dcdcdc, #fff)" : "#fff") + " !important;"); add(SW + "::after", "inset: 0 !important; width: auto !important; height: auto !important; background: none !important;"); add(ON + "::after", "background: url(" + JSON.stringify(A.check) + ") no-repeat -5px -4px !important;"); } else { const onThumb = era === "ma15" ? "#4285f4" : "#1a73e8"; const onTrack = era === "ma15" ? "rgba(66,133,244,.5)" : "#8ab4f8"; const offTrack = era === "ma15" ? "rgba(0,0,0,.26)" : "#bdc1c6"; add(SW, "width: 36px !important; min-width: 36px !important; height: 20px !important;"); add(SW + "::before", "left: 1px !important; top: 3px !important; width: 34px !important; height: 14px !important; border-radius: 7px !important; border: 0 !important; background: " + offTrack + " !important;"); add(SW + "::after", "left: 0 !important; top: 0 !important; width: 20px !important; height: 20px !important; border-radius: 50% !important; border: 0 !important; background: " + (era === "ma15" ? "#fafafa" : "#fff") + " !important; box-shadow: 0 1px 3px 0 rgba(0,0,0,.4) !important;"); add(ON + "::before", "background: " + onTrack + " !important;"); add(ON + "::after", "left: 16px !important; background: " + onThumb + " !important;"); } // ---- title bars scroll away with the page, as they did add(Z + ' [data-ugf-unstick="sticky"], ' + Z + ' [data-ugf-unstick=""]', "position: relative !important; top: auto !important; inset: auto !important; transform: none !important;"); add(Z + ' [data-ugf-unstick="fixed"]', "position: absolute !important; top: 0 !important; transform: none !important;"); add(Z + " [data-ugf-unstick][data-ugf-unstick]", "background: transparent !important; box-shadow: none !important;"); // ---- pop-up boxes and menus (they sit outside Google's page): the period's corners, // shadow and type const POP = ['[role="dialog"]', '[role="alertdialog"]', '[role="menu"]', '[role="listbox"]'].map(function(x) { return Z + " " + x; }); const POPS = POP.join(", "); const POPALL = POP.map(function(x) { return x + ", " + x + " *:not(img):not(input):not([role=switch]):not([data-ugf-btn]), " + x + "::before, " + x + "::after"; }).join(", "); if (!GM2) { add(POPALL, "border-radius: " + (era === "ma15" ? "0" : "0") + " !important;"); } const popLook = { ma07: "border: 1px solid #36c !important; box-shadow: 2px 2px 4px rgba(0,0,0,.3) !important; background: #fff !important;", ma11: "border: 1px solid rgba(0,0,0,.333) !important; box-shadow: 0 4px 16px rgba(0,0,0,.2) !important; background: #fff !important;", ma15: "border-radius: 2px !important; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2) !important; background: #fff !important;", ma19: "border-radius: 8px !important; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15) !important; background: #fff !important;" }; popLook.ma22 = popLook.ma19; add(Z + ' [role="dialog"]:not([aria-hidden="true"]), ' + Z + ' [role="alertdialog"]', popLook[era]); add(Z + ' [role="menu"], ' + Z + ' [role="listbox"]:not(input)', era === "ma07" ? "border: 1px solid #aaa !important; box-shadow: 2px 2px 3px rgba(0,0,0,.2) !important; background: #fff !important;" : era === "ma11" ? "border: 1px solid rgba(0,0,0,.2) !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important; background: #fff !important;" : era === "ma15" ? "border-radius: 2px !important; box-shadow: 0 2px 10px rgba(0,0,0,.2) !important; background: #fff !important;" : "border-radius: 4px !important; box-shadow: 0 2px 2px 0 rgba(60,64,67,.14), 0 3px 1px -2px rgba(60,64,67,.12), 0 1px 5px 0 rgba(60,64,67,.2) !important; background: #fff !important;"); const popFont = { ma07: "arial, sans-serif", ma11: "arial, sans-serif", ma15: "Roboto, arial, sans-serif", ma19: "Roboto, Arial, sans-serif", ma22: "Roboto, Arial, sans-serif" }[era]; add(POP.map(function(x) { return x + " *" + ICX; }).join(", "), "font-family: " + popFont + " !important; letter-spacing: normal !important;"); add(POP.slice(0, 2).map(function(x) { return x + " :is(h1, h2, [role=heading])"; }).join(", "), era === "ma07" ? "font: bold 16px arial, sans-serif !important; color: #000 !important;" : era === "ma11" ? "font: normal 16px arial, sans-serif !important; color: #222 !important;" : era === "ma15" ? "font: 500 20px Roboto, arial, sans-serif !important; color: #212121 !important;" : 'font: 400 22px "Google Sans", Roboto, Arial, sans-serif !important; color: #202124 !important;'); // ---- text boxes: Google's filled grey box and its line taken away (or recoloured) const F = P + " [data-ugf-field][data-ugf-field]"; const lineIdle = { ma07: "transparent", ma11: "transparent", ma15: "transparent", ma19: "#80868b", ma22: "#80868b" }[era]; const lineOn = { ma07: "transparent", ma11: "transparent", ma15: "transparent", ma19: "#1a73e8", ma22: "#1a73e8" }[era]; if (!GM2) { add(F + ", " + F + " *:not(input):not(textarea)", "background: transparent !important; box-shadow: none !important;"); } else { add(F + ", " + F + " *:not(input):not(textarea)", "box-shadow: none !important;"); } add(F + "::before, " + F + " *::before", "border-color: " + lineIdle + " !important; background: transparent !important;"); add(F + "::after, " + F + " *::after", "border-color: " + lineOn + " !important; background: transparent !important;"); const lbl = { ma07: ["#000", "#000"], ma11: ["#666", "#222"], ma15: ["#757575", "#4285f4"], ma19: ["#5f6368", "#1a73e8"], ma22: ["#5f6368", "#1a73e8"] }[era]; add(F + " [data-ugf-lbl]", "color: " + lbl[0] + " !important;"); add(F + ":focus-within [data-ugf-lbl]", "color: " + lbl[1] + " !important;"); const IN = Z + " [data-ugf-in]"; if (GM2) { add(Z + " [data-ugf-ol]", "border-color: #dadce0 !important;"); add(Z + " [data-ugf-field]:focus-within [data-ugf-ol]", "border-color: #1a73e8 !important;"); } else { add(Z + " [data-ugf-ol]", "border-color: transparent !important; background: transparent !important;"); add(F + ":has([data-ugf-flbl])", "padding-top: " + (era === "ma15" ? "18px" : "20px") + " !important; height: auto !important; overflow: visible !important;"); add(F + " [data-ugf-flbl][data-ugf-flbl]", "position: absolute !important; top: 0 !important; left: 0 !important; right: auto !important; bottom: auto !important; transform: none !important; max-width: 100% !important; margin: 0 !important; padding: 0 !important; background: transparent !important; line-height: 16px !important; font-size: " + (era === "ma15" ? "12px" : "13px") + " !important; font-weight: " + (era === "ma11" ? "bold" : "normal") + " !important; font-family: " + (era === "ma15" ? "Roboto, arial, sans-serif" : "arial, sans-serif") + " !important; letter-spacing: normal !important; transition: none !important; pointer-events: none !important;"); add(F + " [data-ugf-flbl] *", "transform: none !important; font: inherit !important;"); add(F + " [data-ugf-ol]:has([data-ugf-flbl])", "overflow: visible !important;"); add(F + ":has([data-ugf-flbl]) input:not([type='checkbox']):not([type='radio'])", "height: " + (era === "ma07" ? "24px" : era === "ma11" ? "29px" : "32px") + " !important; min-height: 0 !important; max-height: none !important; width: 100% !important; position: relative !important; inset: auto !important;"); add(F + ":has([data-ugf-flbl]) textarea", "min-height: 60px !important; width: 100% !important; position: relative !important; inset: auto !important;"); add(IN, "box-sizing: border-box !important; box-shadow: none !important; outline: none !important;"); if (era === "ma07") { add(IN, "border: 1px solid !important; border-color: #7c7c7c #c3c3c3 #ddd !important; background: #fff !important; font: 13px arial, sans-serif !important; color: #000 !important; padding: 2px 4px !important; border-radius: 0 !important;"); } else if (era === "ma11") { add(IN, "border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; background: #fff !important; font: 13px arial, sans-serif !important; color: #222 !important; padding: 0 8px !important; border-radius: 1px !important;"); add(IN + ":hover", "border-color: #b9b9b9 !important; border-top-color: #a0a0a0 !important; box-shadow: inset 0 1px 2px rgba(0,0,0,.1) !important;"); add(IN + ":focus", "border-color: #4d90fe !important; box-shadow: inset 0 1px 2px rgba(0,0,0,.3) !important;"); } else { add(IN, "border: 0 !important; border-bottom: 1px solid #e0e0e0 !important; background: transparent !important; font: 16px Roboto, arial, sans-serif !important; color: #212121 !important; border-radius: 0 !important;"); add(IN + ":focus", "border-bottom: 2px solid #4285f4 !important;"); } } } // ---- the classifier: reads Google's own colours for new elements and marks them const seen = new WeakSet(); let dirty = true; const rgb = function(c) { c = String(c || ""); let q = c.match(/color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+%?))?/); if (q) { const al = q[4] === undefined ? 1 : (q[4].indexOf("%") > -1 ? parseFloat(q[4]) / 100 : parseFloat(q[4])); return { r: q[1] * 255, g: q[2] * 255, b: q[3] * 255, a: al }; } q = c.match(/okl(ab|ch)\(\s*([\d.]+%?)\s+([-\d.]+)\s+([-\d.]+)(?:\s*\/\s*([\d.]+%?))?/); if (q) { const Lr = q[2].indexOf("%") > -1 ? parseFloat(q[2]) / 100 : parseFloat(q[2]); let A = parseFloat(q[3]); let Bv = parseFloat(q[4]); if (q[1] === "ch") { const h = Bv * Math.PI / 180; Bv = A * Math.sin(h); A = A * Math.cos(h); } const l = Math.pow(Lr + 0.3963377774 * A + 0.2158037573 * Bv, 3); const m2 = Math.pow(Lr - 0.1055613458 * A - 0.0638541728 * Bv, 3); const s2 = Math.pow(Lr - 0.0894841775 * A - 1.2914855480 * Bv, 3); const g = function(x) { x = Math.max(0, Math.min(1, x)); return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); }; const al = q[5] === undefined ? 1 : (q[5].indexOf("%") > -1 ? parseFloat(q[5]) / 100 : parseFloat(q[5])); return { r: g(4.0767416621 * l - 3.3077115913 * m2 + 0.2309699292 * s2), g: g(-1.2684380046 * l + 2.6097574011 * m2 - 0.3413193965 * s2), b: g(-0.0041960863 * l - 0.7034186147 * m2 + 1.7076147010 * s2), a: al }; } const m = c.match(/rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+%?))?/); if (!m) { return null; } let a = m[4] === undefined ? 1 : parseFloat(m[4]); if (m[4] && m[4].indexOf("%") > -1) { a = a / 100; } return { r: +m[1], g: +m[2], b: +m[3], a: a }; }; const kind = function(c) { if (!c || c.a < 0.35) { return ""; } const mx = Math.max(c.r, c.g, c.b); const mn = Math.min(c.r, c.g, c.b); if (c.b > 150 && c.b - c.r > 80 && mx - mn > 80) { return "filled"; } if (mn >= 250) { return "white"; } if (c.b >= 235 && c.b - c.r >= 18 && mn >= 180) { return "tonal"; } if (mn >= 205 && mx - mn <= 30) { return "surf"; } return ""; }; // Google's product pictures of today (the 2020 redraw, and the gradient G of 2025) // swapped for the period's: the 2015-2019 set, or none on the pages before them // ---- Google's product pictures, as each period drew them. Whatever form a page uses // (a picture file, a background, a drawing), it is recognised by its address or by the // product name printed beside it, and replaced with that period's artwork: Google's // own 2015-2019 sheet of app icons (the one the app launcher uses), the pre-rebrand set // for early 2015, Chrome's 2014 logo, and none at all on the pages before 2015. const SHEET = "https://ssl.gstatic.com/gb/images/v1_76783e20.png"; const SHEET_P1 = "https://ssl.gstatic.com/gb/images/p1_a4541be8.png"; const CELL = { myaccount: [0, -1451], search: [-17, -207], maps: [0, -450], youtube: [0, 0], play: [0, -1779], news: [0, -1990], gmail: [0, -1710], drive: [0, -138], calendar: [0, -2059], plus: [0, -938], translate: [0, -693], photos: [0, -1145], shopping: [0, -1352], docs: [0, -1214], books: [0, -554], blogger: [0, -1007], contacts: [0, -69], hangouts: [0, -2335] }; const CELL_P1 = { wallet: [0, -966], finance: [0, -1725] }; const URLKEY = { google_g: "search", googleg: "search", google: "search", gmail: "gmail", youtube: "youtube", calendar: "calendar", drive: "drive", maps: "maps", photos: "photos", play_prism: "play", play: "play", chrome: "chrome", contacts: "contacts", keep: "keep", news: "news", translate: "translate", blogger: "blogger", shopping: "shopping", docs: "docs", sheets: "sheets", slides: "slides", forms: "forms", hangouts: "hangouts", finance: "finance", books: "books", play_books: "books", wallet: "wallet", gemini: "ai", bard: "ai" }; const LABELKEY = { "gmail": "gmail", "youtube": "youtube", "calendar": "calendar", "google calendar": "calendar", "drive": "drive", "google drive": "drive", "maps": "maps", "google maps": "maps", "photos": "photos", "google photos": "photos", "google play": "play", "play": "play", "google play store": "play", "contacts": "contacts", "google contacts": "contacts", "chrome": "chrome", "google chrome": "chrome", "keep": "keep", "google keep": "keep", "blogger": "blogger", "google play books": "books", "books": "books", "google books": "books", "news": "news", "google news": "news", "translate": "translate", "google translate": "translate", "shopping": "shopping", "google shopping": "shopping", "hangouts": "hangouts", "docs": "docs", "google docs": "docs", "sheets": "sheets", "google sheets": "sheets", "slides": "slides", "google slides": "slides", "forms": "forms", "google forms": "forms", "google search": "search", "google pay": "wallet", "google wallet": "wallet", "wallet": "wallet", "google finance": "finance", "finance": "finance", "gemini": "ai", "gemini apps": "ai", "google ai": "ai", "notebooklm": "ai" }; const isLogoUrl = function(u) { return /(gstatic\.com|googleusercontent\.com|google\.com)\//.test(u) && /(productlogos|branding\/product|\/product\/|logo|\/icons\/)/i.test(u); }; const keyFromUrl = function(src) { const path = src.replace(/^[a-z]+:\/\/[^/]+/i, "").split("?")[0].toLowerCase(); const m = path.match(/(?:^|[\/_-])(google_g|googleg|gmail|youtube|calendar|drive|maps|photos|play_books|play_prism|play|chrome|contacts|keep|news|translate|blogger|shopping|docs|sheets|slides|forms|hangouts|finance|books|wallet|gemini|bard)(?=[\/_.-]|$)/); return m ? URLKEY[m[1]] || "" : ""; }; // what to paint for a product in this layout: a cell of the sheet, or a picture const artFor = function(key) { if (!key || key === "ai" || era === "ma07" || era === "ma11") { return null; } if (era === "ma22") { // 2022 is the 2020 redraw, which is today's artwork apart from the gradient G return key === "search" ? { url: "https://www.gstatic.com/images/branding/product/2x/googleg_48dp.png" } : null; } if (L === "2015") { const pre = { maps: A.maps14, search: A.grid["google-search"], translate: A.grid.translate, contacts: A.grid.contacts, books: A.grid.books, plus: A.grid.plus }; if (pre[key]) { return { url: pre[key], full: true }; } } if (key === "chrome") { return { url: A.chrome14 }; } if (CELL[key]) { return { sheet: SHEET, w: 92, h: 2541, x: CELL[key][0], y: CELL[key][1] }; } if (CELL_P1[key]) { return { sheet: SHEET_P1, w: 64, h: 2065, x: CELL_P1[key][0], y: CELL_P1[key][1] }; } // Sheets, Slides, Forms and Keep kept their 2015 pictures at the old addresses when // Google redrew them in 2020 if (/^(sheets|slides|forms|keep)$/.test(key)) { return { url: "https://www.gstatic.com/images/branding/product/2x/" + key + "_48dp.png" }; } return null; }; const BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; const paint = function(el, art, size) { const S = Math.max(12, Math.round(size || 24)); el.style.setProperty("background-repeat", "no-repeat", "important"); if (art.sheet) { // the sheet's cells are 64px with the picture 44px across in the middle const k = S * 0.92 / 44; const o = S / 2 - 32 * k; el.style.setProperty("background-image", 'url("' + art.sheet + '")', "important"); el.style.setProperty("background-size", (art.w * k) + "px " + (art.h * k) + "px", "important"); el.style.setProperty("background-position", (art.x * k + o) + "px " + (art.y * k + o) + "px", "important"); } else { el.style.setProperty("background-image", 'url("' + art.url + '")', "important"); el.style.setProperty("background-size", art.full ? (S / 0.6875) + "px " + (S / 0.6875) + "px" : "contain", "important"); el.style.setProperty("background-position", "center", "important"); } }; // swap one picture: an keeps its place and shows the period's art behind a blank // picture; anything else is hidden with the period's art put in front of it const swapArt = function(g, key) { if (!g || g.hasAttribute("data-ugf-art")) { return; } g.setAttribute("data-ugf-art", key || "?"); if (era === "ma07" || era === "ma11") { g.setAttribute("data-ugf-hide", ""); return; } const art = artFor(key); if (!art) { return; } const r = g.getBoundingClientRect(); const size = Math.min(r.width || 24, r.height || 24); if (g.tagName === "IMG") { g.removeAttribute("srcset"); g.setAttribute("src", BLANK); paint(g, art, size); return; } const sp = document.createElement("span"); sp.className = "ugf-ma-prod"; sp.style.cssText = "display: inline-block; flex: none; vertical-align: middle; width: " + Math.round(size) + "px; height: " + Math.round(size) + "px;"; paint(sp, art, size); g.parentNode.insertBefore(sp, g); g.setAttribute("data-ugf-hide", ""); }; const fixProduct = function(img) { const src = img.getAttribute("src") || img.currentSrc || ""; if (src === BLANK || !isLogoUrl(src)) { return; } const key = keyFromUrl(src); if (key) { swapArt(img, key); } }; const fixProductBg = function(el, bgi) { const m = String(bgi || "").match(/url\(["']?([^"')]+)/); if (!m || !isLogoUrl(m[1]) || el.classList.contains("ugf-ma-prod")) { return; } const key = keyFromUrl(m[1]); if (key) { swapArt(el, key); } }; // a product logo, not one of the one-colour symbols Google puts beside plain words const looksLikeLogo = function(g) { if (g.tagName === "IMG") { const u = g.getAttribute("src") || ""; return u === BLANK ? false : (isLogoUrl(u) || /googleusercontent\.com|gstatic\.com/.test(u)); } if (g.tagName.toLowerCase() === "svg") { const fills = {}; g.querySelectorAll("[fill], [style*='fill'], stop").forEach(function(p) { const f = (p.getAttribute("fill") || p.getAttribute("stop-color") || p.style.fill || "").toLowerCase(); if (f && f !== "none" && f !== "currentcolor") { fills[f] = 1; } }); return Object.keys(fills).length >= 2; } const m = String(g.style.backgroundImage || window.getComputedStyle(g).backgroundImage || "").match(/url\(["']?([^"')]+)/); return !!(m && (isLogoUrl(m[1]) || /googleusercontent\.com|gstatic\.com/.test(m[1]))); }; // a product's picture found by the name printed beside it const byLabel = function(el) { let own = ""; for (let n = el.firstChild; n; n = n.nextSibling) { if (n.nodeType === 3) { own += n.nodeValue; } } const key = LABELKEY[own.trim().toLowerCase()]; if (!key) { return; } let anc = el.parentElement; for (let up = 0; anc && up < 3; up++, anc = anc.parentElement) { // this row's picture has already been done if (anc.querySelector("[data-ugf-art], .ugf-ma-prod")) { return; } const pics = anc.querySelectorAll("img, svg, [style*='background'], [data-ugf-bgi]"); let pick = null; for (let i = 0; i < pics.length; i++) { const g = pics[i]; if (g === el || g.contains(el) || (g.parentElement && g.parentElement.closest("svg"))) { continue; } if (!(g.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_FOLLOWING)) { break; } const r = g.getBoundingClientRect(); if (r.width >= 14 && r.width <= 72 && r.height >= 14 && r.height <= 72 && Math.abs(r.width - r.height) <= 8 && looksLikeLogo(g)) { pick = g; } } if (pick) { if (key === "ai") { // an AI product's card goes altogether const card = el.closest('[data-ugf-bg="card"], [data-ugf-bg="surf"]'); (card || pick).setAttribute("data-ugf-hide", ""); return; } swapArt(pick, key); return; } } }; const classify = function() { const body = document.body; if (!body || !dirty) { return; } dirty = false; const all = body.getElementsByTagName("*"); const todo = []; for (let i = 0; i < all.length; i++) { const el = all[i]; if (!seen.has(el)) { seen.add(el); todo.push(el); } } if (!todo.length) { return; } const ours = function(el) { return !!el.closest("#ugf-ma, #ugf-ma-foot, #ugf-gmail-appsmenu, #ugf-ma-appsfence"); }; const got = []; const inputs = []; const fields = []; const stuck = []; const appsSt = document.getElementById("ugf-ma-apps-style"); style.disabled = true; if (appsSt) { appsSt.disabled = true; } try { todo.forEach(function(el) { if (el instanceof SVGElement || ours(el) || el.closest("nav")) { return; } const cs = window.getComputedStyle(el); const tag = el.tagName; const rec = { el: el, bg: rgb(cs.backgroundColor), ff: cs.fontFamily || "", bw: parseFloat(cs.borderTopWidth) || 0, bs: cs.borderTopStyle, bc: rgb(cs.borderTopColor), pos: cs.position, bgi: cs.backgroundImage, br: parseFloat(cs.borderTopLeftRadius) || 0, sh: cs.boxShadow }; if (rec.bg && rec.bg.a < 0.35) { const pb = rgb(window.getComputedStyle(el, "::before").backgroundColor); const po = parseFloat(window.getComputedStyle(el, "::before").opacity); if (pb && pb.a >= 0.35 && po >= 0.5) { rec.bg = pb; } } got.push(rec); if ((tag === "INPUT" && /^(text|email|password|tel|number|search|url|)$/.test(el.type || "")) || tag === "TEXTAREA") { if (!el.closest("header#gb")) { inputs.push(el); } } }); // the outline drawn round each text box inputs.forEach(function(inp) { const before = fields.length; let anc = inp.parentElement; const ih = Math.max(inp.getBoundingClientRect().height, 24); for (let up = 0; anc && up < 4; up++, anc = anc.parentElement) { const kids = anc.getElementsByTagName("*"); if (kids.length > 40 || anc.getBoundingClientRect().height > ih + 60) { break; } const pieces = []; for (let k = 0; k < kids.length; k++) { const e = kids[k]; if (e === inp || e instanceof SVGElement) { continue; } const c = window.getComputedStyle(e); if ((parseFloat(c.borderTopWidth) > 0 && c.borderTopStyle !== "none") || (parseFloat(c.borderBottomWidth) > 0 && c.borderBottomStyle !== "none") || (parseFloat(c.borderLeftWidth) > 0 && c.borderLeftStyle !== "none")) { pieces.push(e); } } if (pieces.length) { fields.push({ root: anc, pieces: pieces }); break; } } if (fields.length === before) { // a filled box: its line is drawn by the box itself, not a bordered part; // take the widest ancestor that is still only the box's own height const ir = inp.getBoundingClientRect(); let root = null; let a2 = inp.parentElement; for (let up = 0; a2 && up < 4; up++, a2 = a2.parentElement) { const r2 = a2.getBoundingClientRect(); if (r2.height <= Math.max(ir.height, 24) + 48 && r2.width <= ir.width + 80) { root = a2; } else { break; } } if (root) { fields.push({ root: root, pieces: [] }); } } }); // a page title bar that stays on screen while the page scrolls under it todo.forEach(function(el) { if (!(el.tagName === "H1" || (el.getAttribute && el.getAttribute("role") === "heading" && el.getAttribute("aria-level") === "1")) || ours(el)) { return; } for (let a3 = el; a3 && a3 !== document.body; a3 = a3.parentElement) { const pos = window.getComputedStyle(a3).position; if (pos === "fixed" || pos === "sticky") { stuck.push([a3, pos]); break; } } }); } finally { style.disabled = false; if (appsSt) { appsSt.disabled = false; } } const vw = window.innerWidth; const vh = window.innerHeight; got.forEach(function(rec) { const el = rec.el; if (/material|icons|symbols/i.test(rec.ff)) { el.setAttribute("data-ugf-icon", ""); } }); got.forEach(function(rec) { const el = rec.el; const tag = el.tagName; if (tag === "IMG") { fixProduct(el); return; } if (tag === "INPUT") { if (el.type === "radio" || (el.type === "checkbox" && el.getAttribute("role") !== "switch")) { const root = el.parentElement; if (root && root.firstElementChild === el || (root && root.querySelector(":scope > input") === el)) { root.setAttribute("data-ugf-ctl", ""); Array.prototype.forEach.call(root.children, function(sib) { if (sib !== el && !(sib.textContent || "").trim()) { sib.setAttribute("data-ugf-deco", ""); } }); } } if (inputs.indexOf(el) > -1) { el.setAttribute("data-ugf-in", ""); } return; } const role = el.getAttribute("role") || ""; const cls = typeof el.className === "string" ? el.className : ""; const btnLike = (tag === "BUTTON" || role === "button" || (tag === "A" && /LgbsSe/.test(cls))) && role !== "switch" && role !== "tab" && !/\bumngff\b/.test(cls) && !el.closest("nav, header#gb, [role=menubar], [role=listbox]"); if (btnLike && !el.hasAttribute("data-ugf-icon")) { let label = ""; el.childNodes.forEach(function walk(n) { if (n.nodeType === 3) { label += n.nodeValue; } else if (n.nodeType === 1 && !n.hasAttribute("data-ugf-icon") && !/^(I|svg)$/i.test(n.tagName)) { n.childNodes.forEach(walk); } }); const rect = el.getBoundingClientRect(); if (label.trim() && rect.height > 0 && rect.height <= 60) { const k = kind(rec.bg); const b = k === "filled" ? "filled" : k === "tonal" ? "tonal" : (rec.bw >= 1 && rec.bs !== "none" && rec.bc && rec.bc.a > 0.2) ? "outlined" : "text"; el.setAttribute("data-ugf-btn", b); return; } } const k = kind(rec.bg); // Google's white panels (a thin outline or round corners round them) are the // period's cards if (k === "white" && tag !== "BODY" && !el.closest('[role="dialog"], [role="alertdialog"], [role="menu"], [role="listbox"], header#gb')) { const edged = (rec.bw >= 1 && rec.bs !== "none" && rec.bc && rec.bc.a > 0.1) || rec.br >= 6 || (rec.sh && rec.sh !== "none"); if (edged && el.closest("body > c-wiz")) { const rect = el.getBoundingClientRect(); if (rect.width >= 240 && rect.height >= 56 && !(rect.width >= vw * 0.9 && rect.height >= vh * 0.9)) { el.setAttribute("data-ugf-bg", "card"); } } return; } if (k === "surf" || k === "tonal") { const rect = el.getBoundingClientRect(); let v = k; if (k === "surf") { if ((rect.width >= vw * 0.5 && rect.height >= vh * 0.5) || el.parentElement === document.body || tag === "C-WIZ") { v = "page"; } else if (rect.height < 140 && el.querySelector("h1, [role=heading][aria-level='1']")) { v = "bar"; } } el.setAttribute("data-ugf-bg", v); } }); got.forEach(function(rec) { if (rec.el.tagName !== "IMG" && rec.el.closest("body > c-wiz, [role='dialog']")) { byLabel(rec.el); } }); stuck.forEach(function(e) { e[0].setAttribute("data-ugf-unstick", e[1]); }); got.forEach(function(rec) { const el = rec.el; if (rec.bgi && rec.bgi !== "none" && el.tagName !== "IMG") { if (/url\(/.test(rec.bgi)) { el.setAttribute("data-ugf-bgi", ""); } fixProductBg(el, rec.bgi); } if (rec.pos !== "fixed" && rec.pos !== "sticky") { return; } if (!el.closest("body > c-wiz") || el.closest('[role="dialog"], [role="alertdialog"], [role="menu"], [role="listbox"], [role="tooltip"], [aria-hidden="true"]')) { return; } const r = el.getBoundingClientRect(); if (r.height > 0 && r.height < 160 && r.width > 200 && r.top < 200 && (el.textContent || "").trim()) { el.setAttribute("data-ugf-unstick", rec.pos); } }); fields.forEach(function(f) { f.root.querySelectorAll("*").forEach(function(e) { if (e.tagName !== "INPUT" && e.tagName !== "TEXTAREA" && Array.prototype.some.call(e.childNodes, function(n) { return n.nodeType === 3 && n.nodeValue.trim(); })) { e.setAttribute("data-ugf-lbl", ""); // the label that floats (the closest holder of it Google places absolutely, // the box itself not included) for (let up = e; up && up !== f.root; up = up.parentElement) { if (up.querySelector("input, textarea")) { break; } if (window.getComputedStyle(up).position === "absolute") { up.setAttribute("data-ugf-flbl", ""); break; } } } }); f.root.setAttribute("data-ugf-field", ""); f.pieces.forEach(function(e) { e.setAttribute("data-ugf-ol", ""); }); }); }; const watch = function() { if (!document.body) { setTimeout(watch, 50); return; } new MutationObserver(function(list) { for (let i = 0; i < list.length; i++) { const m = list[i]; if (m.type === "attributes") { seen.delete(m.target); } } dirty = true; }).observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ["class", "aria-checked", "aria-pressed", "aria-selected", "src"] }); }; watch(); // ---- Google Keep (keep.google.com) in the period's clothes: Keep's own page, restyled // in place, so every note, list, label and reminder works exactly as Google made it. // k13 (layouts to 2014): the first web Keep of 2013, on Kennedy-era Google // k15 (2015-2018): Material Keep, the yellow bar and the 2015 cards // k19 (2019) and k22 (2022): the Material Theme Keep of 2018, white bar, outlined cards const KERA = SITE !== "keep" ? "" : era === "ma15" ? "k15" : era === "ma19" ? "k19" : era === "ma22" ? "k22" : "k13"; if (KERA) { const K = 'html[gplex-site="keep"]'; const KD = K + "[gplex-kdark]"; const KL = K + ":not([gplex-kdark])"; const T = { k13: { page: "#f5f5f5", text: "#222", text2: "#777", font: "arial, sans-serif", title: "bold 15px arial, sans-serif", body: "13px", radius: "2px" }, k15: { page: "#f5f5f5", text: "#212121", text2: "#757575", font: "Roboto, arial, sans-serif", title: "500 17px Roboto, arial, sans-serif", body: "14px", radius: "2px" }, k19: { page: "#fff", text: "#202124", text2: "#5f6368", font: "Roboto, Arial, sans-serif", title: '500 16px "Google Sans", Roboto, Arial, sans-serif', body: "14px", radius: "8px" } }; T.k22 = T.k19; const t = T[KERA]; // the note colours: Keep's classic set (2014-2018), then the Material Theme set of 2018 const COLS = ["zTETae", "oq6NAc", "PL7Zl", "gS7Ybc", "nllRtd", "QCWUNe", "v3pZbf", "rxVFIc", "O2jK", "jSQ0xf", "jVAvLd", "mrxPge"]; const OLDC = ["#fff", "#ff8a80", "#ffd180", "#ffff8d", "#ccff90", "#a7ffeb", "#80d8ff", "#82b1ff", "#b388ff", "#f8bbd0", "#d7ccc8", "#cfd8dc"]; const GM2C = ["#fff", "#f28b82", "#fbbc04", "#fff475", "#ccff90", "#a7ffeb", "#cbf0f8", "#aecbfa", "#d7aefb", "#fdcfe8", "#e6c9a8", "#e8eaed"]; const pal = KERA === "k19" || KERA === "k22" ? GM2C : OLDC; const ICONS = ":is(.Q0hgme-Bz112c-LgbsSe, .IZ65Hb-nQ1Faf, .Q0hgme-MPu53c, .XPtOyb-Bz112c, .XPtOyb-VkLyEc, .XPtOyb-K4efff-Bz112c, .neVct-Ne3sFf-Bz112c, .Yygnk-m5SR9c-Bz112c)"; // light pages always (web Keep had no dark theme before 2020) add(K + ", " + K + " body", "color-scheme: light !important; background: " + t.page + " !important;"); add(K + " .notes-container, " + K + " .RfDI4d-bN97Pc, " + K + " .RfDI4d-sKfxWe, " + K + " .PvRhvb-bN97Pc", "background: " + t.page + " !important;"); add(K + " .notes-container, " + K + " .notes-container *:not(svg):not(path)", "color: " + t.text + " !important;"); add(K + " .notes-container, " + K + " .notes-container *" + ICX + ":not(svg):not(path)", "font-family: " + t.font + " !important; letter-spacing: normal !important;"); // the dark theme's white icons turned dark for these light pages add(KD + " " + ICONS, "filter: invert(1) !important;"); add(K + " svg", "fill: currentColor;"); // AI: Gemini and its "Help me" buttons add(K + ' [aria-label*="Gemini" i], ' + K + ' [data-tooltip-text*="Gemini" i], ' + K + ' [aria-label^="Help me" i], ' + K + ' [data-tooltip-text^="Help me" i]', "display: none !important;"); // ---- the bar const HB = K + " header#gb"; if (KERA === "k13") { add(HB, "background: #f1f1f1 !important; border-bottom: 1px solid #e5e5e5 !important; box-shadow: none !important;"); add(HB + " .gb_0d, " + HB + " .gb_Cd", "color: #666 !important; font: 20px arial, sans-serif !important;"); add(HB + " svg", "fill: #666 !important; color: #666 !important;"); add(HB + ' form[role="search"]', "background: #fff !important; border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; border-radius: 1px !important; box-shadow: none !important;"); add(HB + ' form[role="search"]:focus-within', "border-color: #4d90fe !important;"); add(HB + ' form[role="search"] input', "color: #222 !important; font: 16px arial, sans-serif !important;"); } else if (KERA === "k15") { add(HB, "background: #ffbb00 !important; border-bottom: 0 !important; box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important;"); add(HB + " .gb_0d, " + HB + " .gb_Cd", "color: #fff !important; font: 500 20px Roboto, arial, sans-serif !important;"); add(HB + " .gb_9c", "display: none !important;"); add(HB + " svg", "fill: #fff !important; color: #fff !important;"); add(KL + " header#gb .Q0hgme-Bz112c-LgbsSe", "filter: invert(1) brightness(2) !important;"); add(KD + " header#gb .Q0hgme-Bz112c-LgbsSe", "filter: none !important;"); add(HB + " .Q0hgme-Bz112c-LgbsSe", "opacity: 1 !important;"); add(HB + ' form[role="search"]', "background: #fff !important; border: 0 !important; border-radius: 2px !important; box-shadow: 0 1px 2px rgba(0,0,0,.2) !important;"); add(HB + ' form[role="search"] svg', "fill: #757575 !important;"); add(HB + ' form[role="search"] input', "color: #212121 !important; font: 16px Roboto, arial, sans-serif !important;"); } else { add(HB, "background: #fff !important; border-bottom: 1px solid #e0e0e0 !important; box-shadow: none !important;"); add(HB + " .gb_0d, " + HB + " .gb_Cd", 'color: #5f6368 !important; font: 22px "Product Sans", Arial, sans-serif !important;'); add(HB + " svg", "fill: #5f6368 !important; color: #5f6368 !important;"); add(HB + ' form[role="search"]', "background: #f1f3f4 !important; border: 0 !important; border-radius: 8px !important; box-shadow: none !important;"); add(HB + ' form[role="search"] input', 'color: #202124 !important; font: 16px Roboto, Arial, sans-serif !important;'); } add(HB + ' form[role="search"] input::placeholder', "color: " + t.text2 + " !important;"); add(HB + ' form[role="search"] *:not(svg):not(path)', "border: 0 !important; box-shadow: none !important; background-color: transparent !important; border-radius: 0 !important;"); // the Keep logo, whichever way the bar draws it add(HB + " span.gb_9c", KERA === "k15" ? "display: none !important;" : 'background: url("' + (KERA === "k22" ? "https://www.gstatic.com/images/branding/product/2x/keep_2020q4_48dp.png" : "https://ssl.gstatic.com/keep/icon_128.png") + '") center / contain no-repeat !important; width: 40px !important; height: 40px !important; display: inline-block !important;'); add(HB + " span.gb_9c > *", "display: none !important;"); // ---- the menu down the left const NI = K + " .PvRhvb-ibnC6b"; add(K + " .PvRhvb-bN97Pc", "box-shadow: none !important;"); add(NI + ", " + NI + " *", "color: " + t.text + " !important;"); add(NI + " svg", "fill: " + t.text2 + " !important;"); add(NI + ".gk6SMd svg", "fill: " + t.text + " !important;"); add(K + " .PvRhvb-hSRGPd", "color: " + t.text2 + " !important;"); if (KERA === "k13") { add(NI, "border-radius: 0 !important; border: 0 !important; border-left: 4px solid transparent !important; min-height: 32px !important; height: 32px !important; font: 13px arial, sans-serif !important;"); add(NI + ":hover", "background: #eee !important;"); add(NI + ".gk6SMd", "background: transparent !important; border-left-color: #dd4b39 !important;"); add(NI + ".gk6SMd, " + NI + ".gk6SMd *", "color: #dd4b39 !important; font-weight: bold !important;"); } else if (KERA === "k15") { add(NI, "border-radius: 0 !important; border: 0 !important; font: 500 14px Roboto, arial, sans-serif !important;"); add(NI + ":hover", "background: rgba(0,0,0,.05) !important;"); add(NI + ".gk6SMd", "background: rgba(0,0,0,.1) !important;"); } else { add(NI, 'border-radius: 0 25px 25px 0 !important; font: 500 14px "Google Sans", Roboto, Arial, sans-serif !important;'); add(NI + ":hover", "background: #f1f3f4 !important;"); add(NI + ".gk6SMd", "background: #feefc3 !important;"); } // ---- the notes COLS.forEach(function(c, i) { const col = pal[i]; const edge = i === 0 ? (KERA === "k15" ? "transparent" : KERA === "k13" ? "#e5e5e5" : "#e0e0e0") : (KERA === "k15" ? "transparent" : col); add(K + " ." + c + "-h1U9Be-hxXJme.IZ65Hb-TBnied, " + K + " ." + c + "-h1U9Be-hxXJme.CmABtb, " + K + " ." + c + "-h1U9Be-hxXJme .IZ65Hb-DaY83b-gKvOdd", "background-color: " + col + " !important; border-color: " + edge + " !important;"); add(K + " ." + c + "-h1U9Be-hxXJme.Q0hgme-hxXJme-LgbsSe", "background-color: " + col + " !important; border-color: " + (i === 0 ? "#ccc" : col) + " !important;"); }); // the patterned backgrounds of 2021 on did not exist before 2022 if (KERA !== "k22") { add(K + " .IZ65Hb-TBnied", "background-image: none !important;"); } const CARD = K + " .ma6Yeb-r8s4j-gkA7Yd .IZ65Hb-n0tgWb, " + K + " .h1U9Be-xhiy4 .IZ65Hb-n0tgWb"; add(K + " .IZ65Hb-n0tgWb, " + K + " .IZ65Hb-TBnied", "border-radius: " + t.radius + " !important;"); add(K + " .IZ65Hb-TBnied", "border-width: 1px !important; border-style: solid !important;"); if (KERA === "k13") { add(CARD, "box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); add(K + " .ma6Yeb-r8s4j-gkA7Yd .IZ65Hb-n0tgWb:hover", "box-shadow: 0 1px 3px rgba(0,0,0,.25) !important;"); } else if (KERA === "k15") { add(CARD, "box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12) !important;"); add(K + " .ma6Yeb-r8s4j-gkA7Yd .IZ65Hb-n0tgWb:hover", "box-shadow: 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12), 0 2px 4px -1px rgba(0,0,0,.2) !important;"); } else { add(CARD, "box-shadow: none !important;"); add(K + " .h1U9Be-xhiy4 .IZ65Hb-n0tgWb", "box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 2px 6px 2px rgba(60,64,67,.15) !important;"); add(K + " .h1U9Be-xhiy4 .IZ65Hb-TBnied", "border-color: transparent !important;"); add(K + " .ma6Yeb-r8s4j-gkA7Yd .IZ65Hb-n0tgWb:hover", "box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15) !important;"); } // the note opened for editing add(K + " .XKSfm-L9AdLc .IZ65Hb-n0tgWb", "background: transparent !important; box-shadow: " + (KERA === "k13" ? "0 4px 16px rgba(0,0,0,.2)" : KERA === "k15" ? "0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2)" : "0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15)") + " !important;"); add(K + " .IZ65Hb-INgbqf", "background: transparent !important;"); // type add(K + " .IZ65Hb-YPqjbf, " + K + " .IZ65Hb-YPqjbf *", "font: " + t.title + " !important; color: " + t.text + " !important;"); add(K + " .vIzZGf-fmcmS, " + K + " .IZ65Hb-vIzZGf-bVEB4e-qJTHM, " + K + " .IZ65Hb-vIzZGf-bVEB4e-qJTHM *, " + K + " .fmcmS-LwH6nd", "font-family: " + t.font + " !important; font-size: " + t.body + " !important; color: " + t.text + " !important;"); add(K + " .IZ65Hb-vIzZGf-bVEB4e-qJTHM p, " + K + " .IZ65Hb-vIzZGf-bVEB4e-qJTHM span, " + K + " .IZ65Hb-qJTHM-haAclf p", "line-height: " + (KERA === "k13" ? "17px" : "20px") + " !important; margin: 0 !important;"); add(K + " .IZ65Hb-vIzZGf-bVEB4e-qJTHM, " + K + " .IZ65Hb-YPqjbf", "word-break: break-word !important; overflow-wrap: anywhere !important;"); add(K + " .IZ65Hb-jfdpUb-fmcmS", "color: " + t.text2 + " !important; font-size: " + (KERA === "k13" ? "11px" : "12px") + " !important;"); add(K + " .neVct-LS81yb-tJHJj", "color: " + t.text2 + " !important; font: " + (KERA === "k13" ? "bold 11px arial, sans-serif" : KERA === "k15" ? "500 12px Roboto, arial, sans-serif" : "500 11px Roboto, Arial, sans-serif") + " !important; letter-spacing: " + (KERA === "k19" || KERA === "k22" ? ".8px" : "normal") + " !important; text-transform: uppercase !important;"); add(K + " .zM6fo-Ne3sFf, " + K + " .neVct-Ne3sFf-fmcmS", "color: " + t.text2 + " !important;"); // label chips on notes add(K + " .Q0hgme-XPtOyb", "background: rgba(0,0,0,.08) !important; border: 0 !important; border-radius: " + (KERA === "k13" ? "2px" : KERA === "k15" ? "2px" : "10px") + " !important;"); add(K + " .XPtOyb-fmcmS", "color: " + t.text + " !important; font-family: " + t.font + " !important;"); // ---- Keep's pop-ups (Edit labels, Settings) and its menus const POPK = K + " .VIpgJd-TUo6Hb, " + K + " .VIpgJd-xl07Ob, " + K + ' [role="dialog"], ' + K + ' [role="menu"]'; add(POPK, "background: #fff !important; color: " + t.text + " !important; border-radius: " + (KERA === "k19" || KERA === "k22" ? "8px" : KERA === "k15" ? "2px" : "0") + " !important;" + (KERA === "k13" ? " border: 1px solid rgba(0,0,0,.333) !important; box-shadow: 0 4px 16px rgba(0,0,0,.2) !important;" : KERA === "k15" ? " border: 0 !important; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2) !important;" : " border: 0 !important; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15) !important;")); const POPIN = [".VIpgJd-TUo6Hb", ".VIpgJd-xl07Ob", '[role="dialog"]', '[role="menu"]'].map(function(x) { return K + " " + x + " *:not(input):not([data-ugf-btn]):not(.Q0hgme-hxXJme-LgbsSe):not(svg):not(path)"; }).join(", "); add(POPIN, "background-color: transparent !important; color: " + t.text + " !important; border-color: " + (KERA === "k19" || KERA === "k22" ? "#e0e0e0" : "#e5e5e5") + " !important;"); add([".VIpgJd-TUo6Hb", ".VIpgJd-xl07Ob"].map(function(x) { return K + " " + x + " *" + ICX; }).join(", "), "font-family: " + t.font + " !important;"); add(K + " .VIpgJd-TUo6Hb input, " + K + " .VIpgJd-TUo6Hb [contenteditable]", "color: " + t.text + " !important; background: transparent !important;"); add(K + " .VIpgJd-TUo6Hb a, " + K + " .VIpgJd-TUo6Hb [class*='-hSRGPd']", "color: " + (KERA === "k13" ? "#15c" : KERA === "k15" ? "#4285f4" : "#1a73e8") + " !important;"); add(K + " .VIpgJd-xl07Ob-ibnC6b-sM5MNb, " + K + " .VIpgJd-xl07Ob-ibnC6b:hover", "background: " + (KERA === "k13" ? "#eee" : "#f1f3f4") + " !important;"); // the dark theme setting (web Keep had no dark theme before 2020) if (KERA !== "k22") { add(K + " .ugf-keep-darkopt", "display: none !important;"); } // the Google bar above Keep's own bar (2007-2013 layouts) add(K + " #ugf-ma", "position: fixed !important; top: 0; left: 0; right: 0; z-index: 2000 !important; background: #fff;"); add(K + "[gplex-kgbar] header#gb", "top: 30px !important;"); add(K + "[gplex-kgbar] .gb_5d", "height: 94px !important;"); add(K + "[gplex-kgbar] .PvRhvb-bN97Pc", "top: 94px !important; height: calc(100% - 94px) !important;"); // the backdrop behind a pop-up add(K + " .VIpgJd-TUo6Hb-xJ5Hnf, " + K + " .XKSfm-L9AdLc-xJ5Hnf", "background: " + (KERA === "k13" ? "rgba(255,255,255,.75)" : "rgba(0,0,0,.4)") + " !important;"); } const style = document.createElement("style"); style.id = "ugf-ma-style"; style.textContent = css.join("\n"); let html = document.documentElement; // ---- the tab icon of the layout, as Gplex's search pages give it const setFav = function() { const h = document.head; if (!h) { return; } const ours = h.querySelector("link.ugf-ma-fav"); h.querySelectorAll('link[rel~="icon"]:not(.ugf-ma-fav)').forEach(function(l) { l.remove(); }); if (!ours) { const l = document.createElement("link"); l.rel = "icon"; l.className = "ugf-ma-fav"; l.href = fav; h.appendChild(l); } }; // ---- keeping it all in place while Google's page moves between its own pages let last = ""; // ---- Keep: the bar's logo, the dark-theme check, the Google bar of the older periods let kdarkAt = 0; const keepTick = function() { const now = Date.now(); const probe = document.querySelector(".PvRhvb-bN97Pc"); if (probe && now - kdarkAt > 5000) { // Keep's own colours, read with Gplex's stylesheet switched off for the instant style.disabled = true; const c = rgb(window.getComputedStyle(probe).backgroundColor); style.disabled = false; if (c && c.a > 0.5) { kdarkAt = now; html.toggleAttribute("gplex-kdark", (c.r + c.g + c.b) / 3 < 110); } } const logo = KERA === "k22" ? "https://www.gstatic.com/images/branding/product/2x/keep_2020q4_48dp.png" : "https://ssl.gstatic.com/keep/icon_128.png"; document.querySelectorAll("header#gb img.gb_9c").forEach(function(im) { if (im.getAttribute("src") !== logo) { im.removeAttribute("srcset"); im.setAttribute("src", logo); } }); document.querySelectorAll(".EnFNjd-MPu53c-x3Eknd").forEach(function(row) { if (/dark theme/i.test(row.textContent || "") && !row.classList.contains("ugf-keep-darkopt")) { row.classList.add("ugf-keep-darkopt"); } }); // the Google bar across the top, for the periods that had one const w = who(); const bar = gbar(w); let box = document.getElementById("ugf-ma"); if (bar) { if (!box) { box = document.createElement("div"); box.id = "ugf-ma"; box.appendChild(frag(bar)); document.body.insertBefore(box, document.body.firstChild); } html.setAttribute("gplex-kgbar", ""); } else if (box) { box.remove(); html.removeAttribute("gplex-kgbar"); } }; let gaveUp = false; const tick = function() { try { if (gaveUp) { return; } if (ugfIsErrorPage()) { gaveUp = true; html.removeAttribute("gplex-ma"); html.removeAttribute("gplex-site"); style.remove(); return; } setFav(); document.querySelectorAll('input[type="radio"], input[type="checkbox"]:not([role="switch"])').forEach(function(inp) { const root = inp.parentElement; if (!root || root === document.body || root.tagName === "LABEL" && (root.textContent || "").trim()) { return; } if (!root.hasAttribute("data-ugf-ctl")) { root.setAttribute("data-ugf-ctl", ""); } Array.prototype.forEach.call(root.children, function(sib) { if (sib !== inp && !sib.hasAttribute("data-ugf-deco") && !(sib.textContent || "").trim()) { sib.setAttribute("data-ugf-deco", ""); } }); }); if (!document.getElementById("ugf-ma-style") && document.head) { document.head.appendChild(style); } const body = document.body; if (!body) { return; } const p = pathOf(); const isAlone = alone(p); html.toggleAttribute("gplex-ma-alone", isAlone); html.toggleAttribute("gplex-ma-home", p === "/" && !isAlone); // Google's offer of a Google AI plan (and anything else in that strip about AI) document.querySelectorAll(".O4jDed, .G6g8Wc").forEach(function(el) { if (/\bGoogle AI\b|\bGemini\b|\bAI plan\b|\bAI Pro\b|\bAI Ultra\b/i.test(el.textContent || "")) { el.classList.add("ugf-ma-ai"); } }); classify(); if (SITE === "keep") { keepTick(); return; } if (isAlone) { return; } const w = who(); if (GM2) { gm2(w, p); return; } footIn(p); retitle(p); const key = p + "|" + w.name + "|" + w.email + "|" + w.photo + "|" + pageTitle(p); let box = document.getElementById("ugf-ma"); if (box && key === last && box.parentNode === body) { placeNav(box); return; } last = key; if (!box) { box = document.createElement("div"); box.id = "ugf-ma"; } while (box.firstChild) { box.removeChild(box.firstChild); } box.appendChild(frag(header(w, p) + nav(p) + (p === "/" ? '
' + homePage(w) + "
" + foot() : ""))); if (box.parentNode !== body || body.firstChild !== box) { body.insertBefore(box, body.firstChild); } placeNav(box); } catch (e) {} }; // the period's small print, at the foot of Google's page (Google redraws that page, so // it is put back whenever it goes) const footIn = function(p) { let f = document.getElementById("ugf-ma-foot"); if (p === "/") { if (f) { f.remove(); } return; } const m = visibleMain(); if (!m) { return; } if (!f) { f = document.createElement("div"); f.id = "ugf-ma-foot"; f.appendChild(frag(foot())); } if (f.parentNode !== m || m.lastElementChild !== f) { m.appendChild(f); } }; // the page's heading in the period's words const retitle = function(p) { const t = (TITLES[era] || {})[p.replace(/\/$/, "")]; if (!t) { return; } document.querySelectorAll("h1.dY4qye").forEach(function(h) { if (h.textContent !== t) { h.textContent = t; } }); }; const placeNav = function(box) { const n = document.getElementById("ugf-ma-nav"); if (!n) { return; } let h = 0; for (let c = box.firstElementChild; c && c !== n; c = c.nextElementSibling) { h += c.offsetHeight; } if (n.style.top !== h + "px") { n.style.top = h + "px"; } }; // 2019 and 2022: Google's page with that period's words, menu and "Welcome" const gm2 = function(w, p) { const hideNav = /\/(family\/|signinoptions\/password|linkedapps)|one\.google\.com\/storage/; document.querySelectorAll("nav[jsname] a[href]").forEach(function(a) { const href = a.getAttribute("href") || ""; const box = a.closest("span") || a; if (hideNav.test(href)) { box.classList.add("ugf-ma19-hide"); return; } const k = href.replace(/^https:\/\/myaccount\.google\.com(\/u\/\d+)?/, "").split("?")[0]; // that year's order: Home, Personal info, Data & personalization, Security, // People & sharing, Payments & subscriptions const ord = { "/": 1, "": 1, "/personal-info": 2, "/data-and-privacy": 3, "/security": 4, "/people-and-sharing": 5, "/payments-and-subscriptions": 6 }[k]; const item = a.closest('[role="menubar"] > *'); if (item && ord && item.style.order !== String(ord)) { item.style.order = String(ord); const bar = item.parentNode; bar.style.display = "flex"; bar.style.flexDirection = "column"; } const t = TITLES[era][k]; if (t) { a.querySelectorAll('[jsname="yNNHXb"], [jsname="gjCo3d"]').forEach(function(s) { if (s.textContent !== t) { s.textContent = t; } }); } }); const t = TITLES[era][p.replace(/\/$/, "")]; if (t) { document.querySelectorAll("h1.dY4qye").forEach(function(h) { if (h.textContent !== t) { h.textContent = t; } }); } // the home page's cards for what 2019 did not have document.querySelectorAll('.RCVhid a.umngff[href*="/family/"], .RCVhid a.umngff[href*="signinoptions/password"], .RCVhid a.umngff[href*="linkedapps"]').forEach(function(a) { const row = a.closest(".N25As"); if (row) { row.classList.add("ugf-ma19-hide"); } }); // "Google Account" in the bar is already Google's own logo and word, as in 2019 if (p === "/") { document.querySelectorAll("h1.dnIVJb").forEach(function(h) { const want = "Welcome, " + (w.name || h.textContent.replace(/^Welcome, /, "")); if (h.textContent !== want) { h.textContent = want; } const box = h.closest(".na3Crf"); if (box && !box.querySelector(".ugf-ma19-sub")) { const mail = box.querySelector(".kYZvBb"); if (mail) { mail.classList.add("ugf-ma19-hide"); } const d = document.createElement("div"); d.className = "ugf-ma19-sub"; d.textContent = "Manage your info, privacy, and security to make Google work better for you"; box.appendChild(d); } }); } }; const start = function() { html = document.documentElement; if (!html) { setTimeout(start, 10); return; } if (gaveUp || ugfIsErrorPage()) { return; } html.setAttribute("gplex-ma", era); html.setAttribute("gplex-site", SITE); (document.head || html).appendChild(style); tick(); setInterval(tick, 400); }; start(); document.addEventListener("DOMContentLoaded", tick); window.addEventListener("popstate", function() { setTimeout(tick, 50); }); } catch (e) { try { console.log("[Gplex] My Account theme: " + (e && e.message)); } catch (e2) {} } })(); // ---- end Gplex My Account page ---- // (6.1.2) Gplex matches every google.com page so that Google's error page can be given the // period's look anywhere; the rest of Gplex still runs only on the pages it always has const UGF_OWN_PAGES = ["www.google.com/search*", "www.google.com/", "www.google.com/?*", "www.google.com/#*", "www.google.com/webhp*", "www.google.com/imghp*", "www.google.com/videohp*", "www.google.com/shopping*", "www.google.com/advanced_search*", "www.google.com/preferences*", "mail.google.com/mail/*", "www.google.com/maps*", "maps.google.com/*", "calendar.google.com/calendar/*", "news.google.com/*", "translate.google.com/*", "docs.google.com/document/*", "docs.google.com/spreadsheets/*", "docs.google.com/presentation/*", "docs.google.com/forms/*", "docs.google.com/drawings/*", "drive.google.com/*", "photos.google.com/*", "accounts.google.com/v3/signin/*", "accounts.google.com/signin/*", "accounts.google.com/ServiceLogin*", "accounts.google.com/AccountChooser*", "accounts.google.com/InteractiveLogin*", "accounts.google.com/lifecycle/steps/signup/*", "accounts.google.com/signup*", "accounts.google.com/SignUp*", "myaccount.google.com/*", "keep.google.com/*", "www.google.com/gplex", "www.google.com/Gplex"]; function ugfOwnPage() { const u = window.location.host + window.location.pathname + window.location.search; return UGF_OWN_PAGES.some(function(m) { const re = new RegExp("^" + m.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*") + "$"); return re.test(u) || re.test(u + window.location.hash); }); } function ugfWhenBody(fn) { if (document.body) { fn(); return; } const mo = new MutationObserver(function() { if (document.body) { mo.disconnect(); fn(); } }); mo.observe(document.documentElement || document, { childList: true, subtree: !document.documentElement }); } ugfWhenBody(function ugfBoot() { // Google's error page is ugfErrorPage's; pages Gplex doesn't restyle are left alone if (ugfIsErrorPage() || !ugfOwnPage()) { return; } // the sign-in page is only restyled (by ugfSignInTheme above): none of the rest runs there if (window.location.host === "accounts.google.com") { return; } // myaccount.google.com is only restyled (by ugfMyAccountTheme above) if (window.location.host === "myaccount.google.com" || window.location.host === "keep.google.com") { return; } // the Advanced Search page is Gplex's own (ugfAdvancedSearch above), or Google's on 2022 if (window.location.host === "www.google.com" && /^\/(advanced_search|preferences)\/?$/.test(window.location.pathname || "")) { return; } function showMenu(){ window.location = "https://www.google.com/gplex"; } function loadWithoutGplex(){ if(window.location.href=="https://www.google.com/"){ window.location.href="https://www.google.com/?gplex=false"; }else{ window.location.href+="&gplex=false"; } } GM_registerMenuCommand("Go to Gplex settings page",showMenu); GM_registerMenuCommand("Load page without Gplex",loadWithoutGplex); (function() { 'use strict'; document.querySelector("html").setAttribute("gplex","loading"); // (6.2.1) one policy for the whole script (ugfTT, at the top): creating a second one here threw // on pages that limit the policy names, and took the whole of Gplex down with it window["trusted_policy"] = { createHTML: function(a){ return typeof ugfTT === "function" ? ugfTT(a) : a; } }; // Inlined retro logos (no Wikimedia / Logopedia hotlinking, 429s or link rot). Credit: StonedKhajiit const UGF_LOGO_1997 = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDE4OTQuNSAyMDguMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTg5NC41IDIwOC4yOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6I0ZEMDAwMTt9DQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMV8pO30NCgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8yXyk7fQ0KCS5zdDN7ZmlsbDojODQwNzEzO30NCgkuc3Q0e2ZpbGw6I0VFMDAwMTt9DQoJLnN0NXtmaWxsOiNGRkIzQjc7fQ0KCS5zdDZ7ZmlsbDp1cmwoI1NWR0lEXzNfKTt9DQoJLnN0N3tmaWxsOiM3RDA0MEE7fQ0KCS5zdDh7ZmlsbDojRkZEMkQ2O30NCgkuc3Q5e2ZpbGw6dXJsKCNTVkdJRF80Xyk7fQ0KCS5zdDEwe2ZpbGw6dXJsKCNTVkdJRF81Xyk7fQ0KCS5zdDExe2ZpbGw6dXJsKCNTVkdJRF82Xyk7fQ0KCS5zdDEye2ZpbGw6I0ZGMDAwMDt9DQoJLnN0MTN7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTR7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTV7ZmlsbDp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7ZmlsbDp1cmwoI1NWR0lEXzEwXyk7fQ0KCS5zdDE3e2ZpbGw6dXJsKCNTVkdJRF8xMV8pO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTJfKTt9DQoJLnN0MTl7ZmlsbDojMDAwMEZGO30NCgkuc3QyMHtmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjF7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDIye2ZpbGw6dXJsKCNTVkdJRF8xNV8pO30NCgkuc3QyM3tmaWxsOnVybCgjU1ZHSURfMTZfKTt9DQoJLnN0MjR7ZmlsbDp1cmwoI1NWR0lEXzE3Xyk7fQ0KCS5zdDI1e2ZpbGw6IzAwRkYwMDt9DQoJLnN0MjZ7ZmlsbDojRkZGRjAwO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMThfKTt9DQoJLnN0Mjh7ZmlsbDojRkYxNzE3O30NCgkuc3QyOXtmaWxsOnVybCgjU1ZHSURfMTlfKTt9DQoJLnN0MzB7ZmlsbDp1cmwoI1NWR0lEXzIwXyk7fQ0KPC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMzg3LjYsNzFsLTE2LjQtMS4ybDEwLjMtMTMuN0MzNjkuOCwzNy4zLDM0Mi45LDE1LDIwOC4zLDIuOEM4Ni41LTguMiwzNy4yLDE0LjUsMjYuNiw0MC45TDMuOCw4MC42DQoJYy00LjUsNy44LTUuMSwxNy4zLTEuNCwyNS41YzE5LjYsNDMuMyw5MC40LDQ3LjMsMTc1LjIsNjAuNWM2MCw5LjMsMTI5LjEsNC4zLDE3My42LTEuMWwzNy44LTM4TDM4Ny42LDcxeiBNMTk1LjEsODguNXY4LjYNCgljLTIyLjUtMy41LTQwLjMtMTEuNS01MC4zLTIxLjFjOC45LTAuNiwxOS4yLTAuNCwzMC44LDEuMWM5LjYsMS4yLDE3LjcsMywyNC41LDUuMkwxOTUuMSw4OC41eiIvPjxnPjxnPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzEuNzA0NSIgeTE9IjM2LjI5ODYiIHgyPSIzMjQuOTc2NSIgeTI9IjE5Mi4zMDUxIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojODAwMDAyIi8+PHN0b3AgIG9mZnNldD0iMC4yNzYzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0U3MDAwMSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MSIgZD0iTTM1OC43LDExNS40bC0xNDQuNS0zLjZMMTM0LDkzLjFMNzIuMiw1OC40TDI2LjYsNDAuOUwzLjgsODAuNmMtNC41LDcuOC01LjEsMTcuMy0xLjQsMjUuNQ0KCQkJYzE5LjYsNDMuMyw5MC40LDQ3LjMsMTc1LjIsNjAuNWM2MCw5LjMsMTI5LjEsNC4zLDE3My42LTEuMWwzNy44LTM4TDM1OC43LDExNS40eiIvPjxyZWN0IHg9IjI3Mi41IiB5PSI4MS4xIiBjbGFzcz0ic3QwIiB3aWR0aD0iNDEuNSIgaGVpZ2h0PSI0MS41Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNDAuNzY2MyIgeTE9IjQ1LjUzODEiIHgyPSIyNjMuNDcwNSIgeTI9IjY0LjA0NTIiPjxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48c3RvcCAgb2Zmc2V0PSIwLjUiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDI0MjUiLz48c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBjbGFzcz0ic3QyIiBkPSJNMjU1LjUsMjEuMWwtMTA4LjgtNi42TDEwOC4yLDM0bDMuNCw0OC45YzEyLjMtNC43LDMzLjYtOS42LDY0LTUuOGMyNS44LDMuMyw0MSwxMC45LDQ5LjgsMTcuNmwxMTAuMi01MS4zDQoJCQlMMjU1LjUsMjEuMXoiLz48cG9seWdvbiBjbGFzcz0ic3QzIiBwb2ludHM9IjIxOS41LDU4LjQgMTk1LjEsODguNSAxOTUuMSwxMTEuMyAyNTMuNywxMDUuNyAyMjkuMSw2NS4xIAkJIi8+PHBvbHlnb24gY2xhc3M9InN0NCIgcG9pbnRzPSIyMzgsNzYgMjE3LjIsODUuMiAxOTMuNSwxMTMuMiAyNzEuNCwxMTMuNyAyOTEuNyw5MC42IDI5MS43LDc2IAkJIi8+PHBvbHlnb24gY2xhc3M9InN0NCIgcG9pbnRzPSIyOTMuMywzNi45IDI3NS43LDUyLjQgMjcyLjUsNTYuMSAyNjEuMyw3OS44IDM1NS42LDkwLjUgMzgxLjUsNTYuMSAzNDYsMzYuOSAJCSIvPjwvZz48Zz48cG9seWdvbiBjbGFzcz0ic3Q1IiBwb2ludHM9IjI3Mi41LDU2LjEgMjc1LjcsNTIuNCAzMzEuMyw0My40IDM3Mi45LDUyLjQgMzgxLjUsNTYuMSAJCSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfM18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzkuMTk0NCIgeTE9IjgxLjE4MTEiIHgyPSIzNjcuMjUwOCIgeTI9IjEwNS4wMTIxIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PHN0b3AgIG9mZnNldD0iMC4xMDExIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZCM0I3Ii8+PHN0b3AgIG9mZnNldD0iMC4yMDQ5IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC4yOTIzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC44ODgiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGNsYXNzPSJzdDYiIGQ9Ik0yMTIuNiwxMjkuMWM0OS40LDQuOCwxMjQsMiwxNzYuNS0xLjVMMzg3LjYsNzFsLTMuMiw0LjNMMzUwLDEwMS4ybC00OC4xLDEybC04Ny44LTEuNGwtODguOC0xNy41TDgxLjgsNTkuMQ0KCQkJbC01Ny4zLTkuOUMxOC45LDEwMC4yLDE2My4yLDEyNC4zLDIxMi42LDEyOS4xeiIvPjxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0yMDguMywyLjhDNzMuNy05LjMsMjcuOCwxOS42LDI0LjUsNDkuMmw1Ny4zLDkuOWwyNy45LTI5LjRsODMuMi0xMS45bDg5LjcsOS45bDQ4LjcsMTUuN2w0MS42LDlsOC42LDMuNw0KCQkJQzM2OS44LDM3LjMsMzQyLjksMTUsMjA4LjMsMi44eiIvPjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMjE5LjUsNTguNCAyMjIuNCw2My4yIDI5Ni44LDc2IDIyMS40LDgxLjQgMjE3LjIsODUuMiAJCSIvPjxwb2x5Z29uIGNsYXNzPSJzdDciIHBvaW50cz0iMzg3LjYsNzEgMzg0LjQsNzUuNCAzNTAsMTAxLjIgMzI2LjQsODQuNiAyOTYuOCw3NiAyMjIuNCw2My4yIDIxOS41LDU4LjQgCQkiLz48cG9seWdvbiBjbGFzcz0ic3Q4IiBwb2ludHM9IjIxNy4yLDg1LjIgMjIxLjQsODEuNCAyOTYuOCw3NiAzMjYuNCw4NC42IDI5NS44LDg1LjQgMjkxLjcsOTAuNiAJCSIvPjxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0zMDEuOSwxMTMuMmw0OC4xLTEybC0yMy43LTE2LjZsLTMwLjUsMC44bC00LjEsNS4xVjEwMWMtMjAuMiwwLjItNTUuMywwLTg1LjctMi41DQoJCQljLTQ1LjYtMy44LTc2LjEtMjUuOS02OS00NS40bC0yLjYtMy45bC0yNC44LTE5LjRMODEuOCw1OS4xbDQzLjUsMzUuM2w4OC44LDE3LjVMMzAxLjksMTEzLjJ6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF80XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMzguODM4MyIgeTE9IjMzLjg4OTUiIHgyPSIyOTIuNTI4NyIgeTI9IjQyLjgyNSI+PHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzdEMDQwQSIvPjxzdG9wICBvZmZzZXQ9IjAuMjM5OSIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuNjU0NyIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPjxzdG9wICBvZmZzZXQ9IjAuNzYzMiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPjxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGNsYXNzPSJzdDkiIGQ9Ik0yNzIuNSw1Ni4xYy0zLTguMS0zNy4xLTIxLTcxLTIyLjFzLTU3LjMtMC41LTY0LjQsMTlsLTIuNi0zLjlsLTI0LjgtMTkuNGw4My4yLTExLjlsODkuNyw5LjlsNDguNywxNS43DQoJCQlsLTU1LjYsOUwyNzIuNSw1Ni4xeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTI4LjE1NjgiIHkxPSIzOS42NjA2IiB4Mj0iMTE5LjUzNzEiIHkyPSI4OC44NDM3Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxO3N0b3Atb3BhY2l0eTowIi8+PHN0b3AgIG9mZnNldD0iMC41IiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMTtzdG9wLW9wYWNpdHk6MCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0xMjUuNCw5NC40TDgxLjgsNTkuMWwyNy45LTI5LjRMMjA1LDE2LjVsMy4zLTEzLjdDNzMuNy05LjMsMjcuOCwxOS42LDI0LjUsNDkuMg0KCQkJYy01LjYsNTEsMTM4LjcsNzUsMTg4LjEsNzkuOWw0LjYtMTUuNEwxMjUuNCw5NC40eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTU1LjE5NzEiIHkxPSI0OS4wNDM2IiB4Mj0iMTUxLjY0NzgiIHkyPSI3Mi4zNjc1Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxO3N0b3Atb3BhY2l0eTowIi8+PHN0b3AgIG9mZnNldD0iMC41IiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMTtzdG9wLW9wYWNpdHk6MCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTEiIGQ9Ik04MS44LDU5LjFsNDMuNSwzNS4zbDkxLjgsMTkuM0wyMDYsOTguNGMtNDUuNi0zLjgtNzYuMS0yNS45LTY5LTQ1LjRjNy4xLTE5LjUsMzAuNC0yMCw2NC40LTE5bDMuNS0xNy41DQoJCQlsLTk1LjMsMTMuMkw4MS44LDU5LjF6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNMjIyLjQsNjMuMmwtMSwxOC4ybDc0LjQsNFYxMDZjLTI0LjUsMC42LTUzLjktMC4yLTg4LjYtMy42Yy02NC45LTYuNC03OS0zNS45LTcyLjctNTMuMw0KCQlzMzIuOS0yMC44LDY5LjQtMTkuMWM1NC41LDIuNSw2OC4zLDE1LjEsNzEuOCwyMi4zaDk3LjJDMzU2LDMyLjgsMjk0LjQsMTIuNSwyMDguNiw3LjdjLTQxLTIuMy0xNzEtMTIuMi0xNzcuMSw0Mi42DQoJCWMtNC41LDQwLjYsMTI1LjUsNjkuNywxODMuMiw3NWM0NSw0LjEsMTM1LjgsMS44LDE3MC43LTFsLTEtNDlMMjIyLjQsNjMuMnoiLz48L2c+PHBhdGggY2xhc3M9InN0MTIiIGQ9Ik03MTMuNSw0MS43TDcxMy41LDQxLjdMNzEzLjUsNDEuN2MtMC4yLTIuOS0xLTUuNy0yLjQtOC40Yy0xNS43LTMwLjQtODYuMi0yNC44LTE3MC40LDUuMQ0KCUM0NzAuOSw2My4xLDQzMi44LDgxLjcsNDI5LDEwNC45bC0xMC43LDQxLjVjLTMuMywxMi43LDIuOCwyNi4xLDE0LjcsMzEuN2MxNS45LDcuNCw0NC40LDExLjcsOTQuNy0xLjkNCgljNjYuOS0xOC4xLDEyOS4zLTQ4LjMsMTYyLTY1LjVjMTQuNi03LjcsMjMuNy0yMi44LDIzLjctMzkuM2wwLTI3LjJDNzEzLjUsNDMuNCw3MTMuNSw0Mi42LDcxMy41LDQxLjd6Ii8+PGc+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF83XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0MzEuMjEyNiIgeTE9IjgyLjk4MTMiIHgyPSI2OTYuNzUwMiIgeTI9IjEyNy4zMjA2Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojODAwMDAyIi8+PHN0b3AgIG9mZnNldD0iMC4yMjIzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBjbGFzcz0ic3QxMyIgZD0iTTQyOSwxMDQuOWwtMTAuNyw0MS41Yy0zLjMsMTIuNywyLjgsMjYuMSwxNC43LDMxLjdjMTUuOSw3LjQsNDQuNCwxMS43LDk0LjctMS45DQoJCWM2Ni45LTE4LjEsMTI5LjMtNDguMywxNjItNjUuNWMxNC42LTcuNywyMy43LTIyLjgsMjMuNy0zOS4zbDAtMjkuN2wtNDkuMS0xN2wtODAuNiw4LjZsLTczLDI1LjlMNDI5LDEwNC45eiIvPjxnPjxwYXRoIGNsYXNzPSJzdDciIGQ9Ik00ODEuOSw5OC4ybDMzLTM2LjVsODIuNi0yOC45bDUyLjEsMjEuMmw1Ny41LTE4LjFsMy45LTIuNWMtMTUuNy0zMC40LTg2LjItMjQuOC0xNzAuNCw1LjENCgkJCUM0NTYuNSw2OC4zLDQxOC41LDg5LDQzMSwxMjBsNC43LTQuNEw0ODEuOSw5OC4yeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfOF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQ1LjcxMDEiIHkxPSIxMzcuNDUwOCIgeDI9IjcxMS40MDAyIiB5Mj0iNTMuMjgxOCI+PHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzdEMDQwQSIvPjxzdG9wICBvZmZzZXQ9IjYuNjU3MzU1ZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuMTQyMiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGQjNCNyIvPjxzdG9wICBvZmZzZXQ9IjAuMjg3NiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPjxzdG9wICBvZmZzZXQ9IjAuODY0NiIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuOTc4MSIgc3R5bGU9InN0b3AtY29sb3I6IzdEMDQwQSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTQiIGQ9Ik00MzEsMTIwYzE0LDM0LjYsOTkuNiwxNS43LDE2Ni41LTNzMTI5LjMtNTMuMiwxMTMuNi04My43bC0zLjksMi41bC01Ny41LDE4LjFsLTI4LjMsMzYuMWwtODEuMiwyNi4zDQoJCQlsLTU4LjMtMTguMmwtNDYuMiwxNy40TDQzMSwxMjB6Ii8+PHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF85XyIgY3g9IjU2MS4xNDUzIiBjeT0iNTAuOTg4NSIgcj0iMTA0LjE2MjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MzE1IC0wLjM2MzYgMC4yNjc2IDAuNjg1NSAyNC43NzE1IDIyMC4wODg3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wICBvZmZzZXQ9IjAuMTAwMiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRUZFRiIvPjxzdG9wICBvZmZzZXQ9IjAuMzkzMiIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuNTExMSIgc3R5bGU9InN0b3AtY29sb3I6IzgwMDAwMiIvPjwvcmFkaWFsR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTUiIGQ9Ik01OTcuNSwzMi44bC04Mi42LDI4LjlsLTMzLDM2LjVsNTguMywxOC4ybDgxLjItMjYuM2wyOC4zLTM2LjFMNTk3LjUsMzIuOHogTTU3My43LDk1LjYNCgkJCWMtMjEuOCw3LjEtNDIuNiw1LjYtNDUuNi02LjFjLTIuNS05LjYsMTUuOC0yMC44LDI2LjktMjUuNGMyNS40LTEwLjYsNTIuMi0xMC42LDU1LjMtMS41QzYxNC44LDc2LjMsNTk1LjUsODguNSw1NzMuNyw5NS42eiIvPjwvZz48cGF0aCBjbGFzcz0ic3QzIiBkPSJNNzA3LjIsMzUuOGMtMTIuNS0zMy4xLTEwOS0xNC0xNjQuMyw1LjRjLTQ5LjYsMTcuNC0xMjEsNDEuOS0xMDcuMiw3NC40YzEzLjUsMzEuNiwxMDEuNSwxMi45LDE2MC4zLTUuMQ0KCQlDNjI3LjIsMTAxLDcxOS4zLDY3LjksNzA3LjIsMzUuOHogTTU3Ni4xLDEwMGMtMzUuOCwxMC4zLTQ5LjUsMi44LTUyLjgtOC4yYy0zLjEtMTAuNiw0LTI3LjYsMjguNy0zNy4xYzMxLjItMTIsNTYuNC05LjEsNjIuMywyLjENCgkJQzYyMC41LDY4LjQsNjE2LjEsODguNSw1NzYuMSwxMDB6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNOTA2LjMsNjAuOGMtODYuNC03LjgtMTQ5LDMuNy0xNTcuMiwyOC40bDAsMGwtMjIuNiwzMGMtNy4yLDkuNi02LjMsMjMuMiwyLjMsMzEuNg0KCWMyMC40LDIwLDU5LjQsMzEuMSwxNDEuNywzNi4zYzQ1LjcsMi45LDgwLjgtMC4zLDEwNi4yLTVjMTMuMS0yLjQsMjUuMi04LjUsMzUtMTcuNGwzMC4xLTI3LjVsMCwwYzUuOC01LjEsOS41LTEwLjksMTAuOS0xNy4yDQoJQzEwNTkuNCw5MC4yLDk5NS44LDY4LjksOTA2LjMsNjAuOHoiLz48Zz48bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI3NTcuMDMwNSIgeTE9Ijc2LjQ3MDEiIHgyPSI5ODQuMTg1NCIgeTI9IjE5MS4wNjE3Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojODAwMDAyIi8+PHN0b3AgIG9mZnNldD0iMC4yNzYzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0U3MDAwMSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTYiIGQ9Ik05NDMuMSw3OC4xbC0xMTguNi04LjFsLTc1LjQsMTkuMmwtMjIuNiwzMGMtNy4yLDkuNi02LjMsMjMuMiwyLjMsMzEuNmMyMC40LDIwLDU5LjQsMzEuMSwxNDEuNywzNi4zDQoJCWM0NS43LDIuOSw4MC44LTAuMywxMDYuMi01YzEzLjEtMi40LDI1LjItOC41LDM1LTE3LjRsMzAuMS0yNy41TDk0My4xLDc4LjF6Ii8+PGc+PHBhdGggY2xhc3M9InN0NyIgZD0iTTkwNi4zLDYwLjhjLTg5LjYtOC4xLTE1My41LDQuNi0xNTcuOSwzMS4xbDUuNCwxLjdsNDkuMyw3LjFsNjEuMi0yOS40bDg2LjUsOC4xbDI5LjQsMzMuNWw2OCw2LjFsNC40LDENCgkJCUMxMDU5LjQsOTAuMiw5OTUuOCw2OC45LDkwNi4zLDYwLjh6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNzUzLjkwNzciIHkxPSIxMTEuMDgyIiB4Mj0iMTA0Mi41ODM3IiB5Mj0iMTQ1LjIyMjgiPjxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM3RDA0MEEiLz48c3RvcCAgb2Zmc2V0PSI0LjU4NTY5NmUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48c3RvcCAgb2Zmc2V0PSIwLjExNjUiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkIzQjciLz48c3RvcCAgb2Zmc2V0PSIwLjI4NzYiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz48c3RvcCAgb2Zmc2V0PSIwLjQwMTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz48c3RvcCAgb2Zmc2V0PSIwLjg2NDYiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48c3RvcCAgb2Zmc2V0PSIwLjk3ODEiIHN0eWxlPSJzdG9wLWNvbG9yOiM3RDA0MEEiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGNsYXNzPSJzdDE3IiBkPSJNOTgwLjMsMTEyLjlsLTQ3LDI5LjFsLTkxLjMtOS4zbC0zOC45LTMxLjlsLTQ5LjMtNy4xbC01LjQtMS43Yy0yLjQsMTQuNSw1LjEsNDQuMSwxMzMuNSw2MS4yDQoJCQljMTA5LjUsMTQuNSwxNjMuOS0zLjQsMTcwLjctMzMuMWwtNC40LTFMOTgwLjMsMTEyLjl6Ii8+PHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8xMl8iIGN4PSI5MTEuMzQyNCIgY3k9IjgwLjc2MzIiIHI9IjgwLjk3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjk4NzUgMC4xNTc0IC0wLjEwMTMgMC42MzU3IDE5LjUzODYgLTExNC4wMDMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wICBvZmZzZXQ9IjAuMTkzNiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRUZFRiIvPjxzdG9wICBvZmZzZXQ9IjAuNDg1OSIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuNjg3NyIgc3R5bGU9InN0b3AtY29sb3I6IzgwMDAwMiIvPjwvcmFkaWFsR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MTgiIGQ9Ik05NTAuOSw3OS40bC04Ni41LTguMWwtNjEuMiwyOS40bDM4LjksMzEuOWw5MS4zLDkuM2w0Ny0yOS4xTDk1MC45LDc5LjR6IE05NDUuNSwxMTIuOQ0KCQkJYy0yLDkuMS0xMy41LDE5LTUxLjQsMTIuMmMtMzcuOS02LjgtNDAuOS0xNy43LTM4LjItMjYuNGMyLjctOC44LDE1LTE2LjcsNDQuOS0xMi40QzkzOC4zLDkxLjcsOTQ3LjUsMTAzLjcsOTQ1LjUsMTEyLjl6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDE5IiBkPSJNOTA0LjksNjYuOWMtNjUuNi02LjQtMTQ0LTIuNy0xNTEuMSwyNi43Yy00LjQsMTguMSwzNy44LDQyLjYsMTI4LjgsNTIuNGMxMzYsMTQuNywxNjAuMy05LjUsMTY1LjctMjcuMQ0KCQlTMTAxMi4xLDc3LjQsOTA0LjksNjYuOXogTTk1MS40LDExNi4yYy0zLjYsMTEuNi0yMS40LDIxLjItNTcuNiwxNi40Yy0zOS45LTUuMi01MC40LTI1LjMtNDQuOS0zNy4yYzcuOC0xNi45LDI5LjItMTcuOCw1NC4yLTE1LjcNCgkJQzkzNyw4Mi42LDk1NiwxMDEuMyw5NTEuNCwxMTYuMnoiLz48L2c+PHBhdGggY2xhc3M9InN0MTIiIGQ9Ik0xMzkzLDExNC42bC0wLjMtMS44YzAtMC4zLTAuMS0wLjYtMC4xLTAuOWwtNC45LTI2LjZsLTEwLjktNTkuOGwtOTguNiwxMi4ybDEuNyw4Yy0yMi45LTQtNDYuNC02LjEtOTAtMi42DQoJYy00Mi44LDMuNC04OCwyMS4zLTk1LjYsNDQuOWwtMTguMSwyOC43Yy02LjQsMTAuMS01LjMsMjMuNCwyLjksMzIuMWM0LjgsNS4xLDExLjQsOS4xLDE5LjcsMTJsLTEzLjYsMjQuMw0KCWMyMi42LDM1LjUsOTUuOCwyMy45LDE4Ny42LDguMWMxNy4zLTMsMzIuNy01LjcsNDYuNC04LjljMjMtNS4zLDI5LjQtMTMuMSw0Ni41LTI5LjdsMTgtMjAuMUMxMzkyLjQsMTI2LjIsMTM5My44LDExOC45LDEzOTMsMTE0LjYNCgl6Ii8+PGc+PGc+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xM18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTEwMC45MjY2IiB5MT0iNzEuOTMzMyIgeDI9IjEyNjUuOTc2OCIgeTI9IjEzNi4zNDMxIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojODAwMDAyIi8+PHN0b3AgIG9mZnNldD0iMC4yNzYzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0U3MDAwMSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MjAiIGQ9Ik0xMDk0LjQsODcuOGwtMTguMSwyOC43Yy02LjQsMTAuMS01LjMsMjMuNCwyLjksMzIuMWMxNC4yLDE1LjIsNDQuNiwyMC42LDg3LjIsMTYuNg0KCQkJYzU5LjMtNS42LDExMS0xNy43LDE0NC44LTI5LjdsLTEzLjQtNzYuMmwtNDguMi04LjdsLTc5LjYsOC43TDEwOTQuNCw4Ny44eiIvPjxwb2x5Z29uIGNsYXNzPSJzdDMiIHBvaW50cz0iMTI4NS4yLDEwNyAxMjgxLjUsMTE0LjYgMTI2Mi4yLDE0NS4zIDEzMDMuOCwxNTAuNSAxMzYzLjYsMTA3LjQgCQkiLz48bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMTIyLjUwOTYiIHkxPSIxMTIuMzQiIHgyPSIxMzI4Ljg3NTkiIHkyPSIxOTkuNTUxMiI+PHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzgwMDAwMiIvPjxzdG9wICBvZmZzZXQ9IjAuMjIyMyIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MjEiIGQ9Ik0xMzM4LjMsMTIwbC00NS43LDI5bC05MS45LDMuMWwtODYuMy00LjdsLTYuNi0yLjhsLTIyLjYsNDAuM2MyMi42LDM1LjUsOTUuOCwyMy45LDE4Ny42LDguMQ0KCQkJYzE3LjMtMywzMi43LTUuNyw0Ni40LTguOWMyMy01LjMsMjkuNC0xMy4xLDQ2LjUtMjkuN2wyMi45LTI1LjZMMTMzOC4zLDEyMHoiLz48L2c+PGc+PHBhdGggY2xhc3M9InN0NyIgZD0iTTExODMuNiwxNjAuMmwxMDktMTEuM2w1Ni0zNS42bC00OC4yLTIxbC0xNS4zLDE0LjdsLTMuNyw3LjZsNC45LDEwLjRjMC45LDEuOC0xLjYsNS42LTI4LjUsMTIuOQ0KCQkJYy0yNi45LDcuNC00MS4xLDQuMy00Ny45LTMuNWwtMTAyLjEsMTAuMWw2LjYsMi44TDExODMuNiwxNjAuMnoiLz48cGF0aCBjbGFzcz0ic3Q3IiBkPSJNMTE1MC40LDg5LjJsNDQuNC0zNC40aDY5LjJsNDcuMSwyMGw2Ni43LTQzLjZsLTEtNS44bC05OC42LDEyLjJsMS43LDhjLTIyLjktNC00Ni40LTYuMS05MC0yLjYNCgkJCWMtNTEsNC4xLTEwNS4yLDI4LjYtOTUuNiw1OC44bDQuNi0zLjFMMTE1MC40LDg5LjJ6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xNV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTEyMy44NTYzIiB5MT0iMTI1Ljk5OTgiIHgyPSIxMzcyLjI1OTIiIHkyPSI4OS44NTkyIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PHN0b3AgIG9mZnNldD0iNi44MzA2MDFlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZCM0I3Ii8+PHN0b3AgIG9mZnNldD0iMC4xNDQ4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC4yNDMyIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC43NTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzdEMDQwQSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MjIiIGQ9Ik0xMzkzLDExNC42bC0xNi4yLTg5LjJsMSw1LjhsLTY2LjcsNDMuNmwtMTAuNiwxNy41bDQ4LjIsMjFsLTU2LDM1LjZsLTEwOSwxMS4zbC02OS4xLTEyLjlsLTYuNi0yLjgNCgkJCWMxMC40LDIxLjgsMjEsMzMuMiwxNDMuMiwyNC44QzEzODEuMSwxNjAuNCwxMzk1LjMsMTI2LjIsMTM5MywxMTQuNnoiLz48bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE2XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMTA2LjgwMDciIHkxPSIxMDkuMzkwOCIgeDI9IjEyNzAuMDY4MiIgeTI9IjEwNC4zMjAzIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PHN0b3AgIG9mZnNldD0iMC4xMDQxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMC4zMTQ5IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC40ODY3IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC44ODgiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRDAwMDEiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGNsYXNzPSJzdDIzIiBkPSJNMTI4My41LDEwMS43bC03NC4zLDEzLjlsLTU4LjgtMjYuNWwtNTEuNSw5LjVsLTQuNiwzLjFjOC4yLDI1LjgsNDguNCw0MC44LDEyMC40LDMwLjQNCgkJCWMzMy4xLTQuOCw1My45LTExLjYsNjYuNy0xNy41bDMuNy03LjZsMTUuMy0xNC43bDEwLjYtMTcuNUwxMjgzLjUsMTAxLjd6Ii8+PHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8xN18iIGN4PSIxMjQ0LjIxNTciIGN5PSI1OS44ODk5IiByPSI3OC4wMDAyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk5NSAtMy4wMjg5MTNlLTAyIDEuODgxNDU1ZS0wMiAwLjYyMDkgLTAuNTU1OSA2MC4zOTE3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wICBvZmZzZXQ9IjAuMTkzNiIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRUZFRiIvPjxzdG9wICBvZmZzZXQ9IjAuNDg1OSIgc3R5bGU9InN0b3AtY29sb3I6I0ZEMDAwMSIvPjxzdG9wICBvZmZzZXQ9IjAuNjg3NyIgc3R5bGU9InN0b3AtY29sb3I6IzgwMDAwMiIvPjwvcmFkaWFsR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MjQiIGQ9Ik0xMjY0LDU0LjhoLTY5LjJsLTQ0LjQsMzQuNGw1OC44LDI2LjVsNzQuMy0xMy45bDI3LjYtMjYuOUwxMjY0LDU0Ljh6IE0xMjQ3LjMsOTcuNw0KCQkJYy0yMi42LDQuMy00MC4xLDUuNy00My4xLTguNmMtMy4zLTE1LjYsMTMuNy0xOSwyOC42LTIxLjNzNDIuNC01LjgsNDUuOSw4LjRDMTI4MS41LDg3LjUsMTI2OS44LDkzLjMsMTI0Ny4zLDk3Ljd6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMTM5Mi41LDExMS45bC0xNC43LTgwLjdsLTkyLjksMTEuN2wxLDkuNWMtMTAuNS0zLjEtMzkuMy05LjItOTQuMy0zLjdjLTcyLDcuMS05OCwzMS43LTkyLjYsNTANCgkJYzUuNCwxOC4zLDMyLjgsMzguOSwxMTUuOSwyNy40YzM2LTUsNTcuNS0xMi4zLDcwLjMtMTlsOC4yLDE2LjJjMS43LDUuMi0xLjUsMTMuOS0zNC4zLDIwLjFjLTUwLDkuNS00OSwxLjQtNTIuNC00LjFsLTkyLjMsOC4xDQoJCWMxNy45LDE5LjMsMzEuMSwyMC42LDEzNS45LDE0LjlDMTM1OC44LDE1Ni4zLDEzOTUuOSwxMjkuMiwxMzkyLjUsMTExLjl6IE0xMTk4LjcsOTAuMmMtMi44LTE2LDcuMS0yNiwzMy42LTI5LjYNCgkJYzIzLjktMy4yLDUxLjItMi4zLDU0LDE2LjdjMS41LDEwLjYtNS40LDIxLjMtMzYuNiwyNy4yQzEyMjYuNywxMDguOSwxMjAxLjksMTA4LjgsMTE5OC43LDkwLjJ6Ii8+PC9nPjxwb2x5Z29uIGNsYXNzPSJzdDEyIiBwb2ludHM9IjE0NDcuNSwyNS4yIDE0NDMuNSwyOS43IDE0MTMuMyw1OC4zIDE0MTMuMywxNzguOCAxNTE4LjMsMTgwLjggMTU0NS44LDE1OC4yIDE1NDUuOCwxNTIuMSANCgkxNTQ1LjgsMzUuMSAxNTQ1LjgsMjkuNCAiLz48Zz48Zz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE1MTguMywxODAuOCAxNDEzLjMsMTc4LjggMTQ5NS43LDc5LjkgMTU0NS44LDE1OC4yIAkJIi8+PHBvbHlnb24gY2xhc3M9InN0NyIgcG9pbnRzPSIxNDQzLjUsMjkuNyAxNDEzLjMsNTguMyAxNDEzLjMsMTc4LjggMTQ0My4xLDE1Mi4xIDE0OTUuNyw3OS45IDE1NDUuOCwzNS4xIDE1NDUuOCwyOS40IA0KCQkJMTQ0Ny41LDI1LjIgCQkiLz48L2c+PHBvbHlnb24gY2xhc3M9InN0NSIgcG9pbnRzPSIxNDQzLjEsMTQ3LjcgMTQ0My4xLDE1Mi4xIDE1NDUuOCwxNTguMiAxNTQ1LjgsMTUyLjEgCSIvPjxwb2x5Z29uIGNsYXNzPSJzdDI2IiBwb2ludHM9IjE0NDMuMSwxNDcuNyAxNDQzLjUsMjkuNyAxNTQ1LjgsMzUuMSAxNTQ1LjgsMTUyLjEgCSIvPjwvZz48cGF0aCBjbGFzcz0ic3QxMiIgZD0iTTE4ODQuOSw4Ni44bDktMi40bC0xNC43LTFsMTMuNy03LjF2MGwtMC4yLTYuMWwwLjIsNi4xYzEzLTQzLjktNTMuOS01OC41LTEzNS43LTY2LjMNCgljLTc0LjctNy4xLTE0Ny41LTctMTY3LDIwLjhsMCwwbC0zMC43LDI4Yy03LjcsNi43LTkuMSwxOC4yLTMsMjYuNGMyOS42LDM5LjEsMTEwLjEsNDMuMSwxNjQuNSw0My4xYzYxLjIsMCw5OS45LTAuNywxMjYuMS0xNi42DQoJbDM2LTIwLjhjMy43LTIuMSw3LjItNC4yLDEwLjgtNi42TDE4ODQuOSw4Ni44eiIvPjxnPjxnPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMThfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE1NzguMTM0OSIgeTE9IjM5LjM2MyIgeDI9IjE4NjkuMTc3MiIgeTI9IjE1MS41ODgzIj48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojODAwMDAyIi8+PHN0b3AgIG9mZnNldD0iMC4yMjIzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBjbGFzcz0ic3QyNyIgZD0iTTE1OTAuMSwzMWwtMzAuNywyOGMtNy43LDYuNy05LjEsMTguMi0zLDI2LjRjMjkuNiwzOS4xLDExMC4xLDQzLjEsMTY0LjUsNDMuMWM2MS4yLDAsOTkuOS0wLjcsMTI2LjEtMTYuNg0KCQkJbDM2LjMtMjFoLTYwLjZsLTQ4LDUuNmwtNzkuMi02LjhMMTY2OC45LDcxTDE1OTAuMSwzMXoiLz48cG9seWdvbiBjbGFzcz0ic3QyOCIgcG9pbnRzPSIxODkyLjgsNzYuNCAxODYyLjksOTEuOSAxNzMzLjQsOTMuNiAxNjQ1LjIsNzkuNyAxNjQ1LjIsMjggMTY5NC4yLDE4LjYgMTc2Mi4yLDIwLjYgMTg2My42LDQ5LjcgCQkNCgkJCSIvPjwvZz48Zz48cG9seWdvbiBjbGFzcz0ic3Q1IiBwb2ludHM9IjE2MjcuMyw1NS4xIDE2ODQuNSw2Mi45IDE2OTMuMiw2Ny45IDE4OTIuOCw3Ni40IDE4OTIuNiw3MC4zIDE4NTAsNjEuOCAJCSIvPjxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xNjI3LjMsNTUuMWw1Mi4xLDI4LjdsODMuMiwxMi44bDEyMi40LTkuOGw5LTIuNEwxNzczLDc2LjRjLTQuNCw2LjQtMjIuNCw5LjItNTAuNyw1LjENCgkJCWMtMjAuNi0zLTI0LjctOC41LTI5LjEtMTMuNWwtOC43LTVMMTYyNy4zLDU1LjF6Ii8+PHBvbHlnb24gY2xhc3M9InN0NyIgcG9pbnRzPSIxODUwLDYxLjggMTc5MS4yLDU0LjEgMTc4MC40LDQ4LjMgMTY5NC42LDQ3LjMgMTY4NC40LDUyLjIgMTYyNy4zLDU1LjEgCQkiLz48cGF0aCBjbGFzcz0ic3Q3IiBkPSJNMTYyNy4zLDU1LjFsNzIuNy0zNi41bDgyLjUsOC4xbDY3LjYsMzUuMmw0Mi42LDguNWwwLjIsNi4xYzEzLTQzLjktNTMuOS01OC41LTEzNS43LTY2LjMNCgkJCWMtODEuOC03LjgtMTYxLjItNi45LTE3MSwyOS41bDQuNywzLjlMMTYyNy4zLDU1LjF6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xOV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTU5Mi42NjI4IiB5MT0iNjUuNjc3NyIgeDI9IjE4NjkuODQ1OSIgeTI9IjEwMi4xODQ4Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PHN0b3AgIG9mZnNldD0iNC4wMzQ3MTBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMC4xMjI3IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZCM0I3Ii8+PHN0b3AgIG9mZnNldD0iMC4xNzkxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC4zMzI4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC43NzAzIiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMC45NzgxIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBjbGFzcz0ic3QyOSIgZD0iTTE3NjIuNSw5Ni43bC04My4yLTEyLjhsLTUyLjEtMjguN2wtMzYuNS0xMS41bC00LjctMy45QzE1NzMsODguMywxNjE5LDk4LDE3MjYuMywxMDYuNA0KCQkJYzEwNy44LDguNSwxMzcuMi0yLjQsMTY3LjUtMjJsLTksMi40TDE3NjIuNSw5Ni43eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMjBfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE2OTguNjA1MSIgeTE9IjM5LjMxMTYiIHgyPSIxNzgyLjM3MTciIHkyPSI0NS4yOTQ5Ij48c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojN0QwNDBBIi8+PHN0b3AgIG9mZnNldD0iMC4xNTY1IiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMC41ODU2IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC43MTEyIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+PHN0b3AgIG9mZnNldD0iMC45MjQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojRkQwMDAxIi8+PHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzdEMDQwQSIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggY2xhc3M9InN0MzAiIGQ9Ik0xODUwLDYxLjhsLTY3LjYtMzUuMmwtODIuNS04LjFsLTcyLjcsMzYuNWw1Ny4yLTIuOWwxMC4xLTQuOWM2LjEtMTEuMiwyMy4zLTE3LjksNDkuMy0xMy45DQoJCQljMjYsNC4xLDMyLjEsNi44LDM2LjUsMTQuOWwxMC44LDUuN0wxODUwLDYxLjh6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNMTc1MC43LDE1LjJjLTkzLTcuMS0xNTAuMSwxLjQtMTU5LjksMjguNEMxNTc2LjksODIsMTY0MS43LDk1LDE3MjksMTAxYzg1LjEsNS45LDEzOS42LTQuNywxNTUuOC0xNC4yDQoJCWwtMTA4LjUtNS40Yy0zLDUuMS0yMSw4LjgtNDgsNS40Yy0yMy40LTIuOS00MC43LTguNi00My45LTIzLjlsMjA4LjEsNy4zQzE4OTYuNCw0MS45LDE4NDMuNiwyMi4zLDE3NTAuNywxNS4yeiBNMTY4NC40LDUyLjINCgkJYzMuMi0xOS41LDIzLTMwLjEsNTkuMS0yNi4yYzM3LjksNC4xLDQ1LjMsMTAuMSw0Ny43LDI4LjFMMTY4NC40LDUyLjJ6Ii8+PC9nPjwvc3ZnPg=="; const UGF_LOGO_1998 = "data:image/webp;base64,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"; // Chrome app-grid icons (glossy 2011 icon for 2014-2015, flat 2014 icon for 2016+) const UGF_CHROME_ICON_2011 = "data:image/png;base64,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"; const UGF_CHROME_ICON_2014 = "data:image/png;base64,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"; // Printed at startup so the console says which build is running - guessing at that // has cost us a round trip more than once. const UGF_VERSION = (function() { try { return (typeof GM_info !== "undefined" && GM_info && GM_info.script && GM_info.script.version) || ""; } catch (e) { return ""; } })(); // Pre-2015 app-grid icons: Google was a lowercase "g" and Google+ a red square // until the 2015 rebrand brought in the four-colour capital. const UGF_G_2011 = "data:image/png;base64,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"; const UGF_GPLUS_2011 = "data:image/png;base64,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"; const UGF_BOOKS_2011 = "data:image/png;base64,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"; const UGF_CONTACTS_2011 = "data:image/png;base64,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"; const UGF_TRANSLATE_2011 = "data:image/png;base64,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"; const UGF_MAPS_2011 = "data:image/png;base64,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"; // ---- Interface language: Gplex's own text follows the browser language (Google's results already come localized) ---- const UGF_I18N = {"ja":{"s":{"Web":"ウェブ","Images":"画像","Videos":"動画","Video":"動画","News":"ニュース","Maps":"地図","More":"もっと見る","more":"もっと見る","more »":"もっと見る »","Even More":"さらにもっと","Even more from Google":"Google のその他のサービス","Everything":"すべて","All":"すべて","Search":"検索","Settings":"設定","Search settings":"検索設定","Advanced search":"検索オプション","Advanced Search":"検索オプション","Language tools":"言語ツール","Language Tools":"言語ツール","Preferences":"表示設定","Search Help":"検索ヘルプ","Search Tips":"検索のヒント","Send feedback":"フィードバックを送信","Give us feedback":"フィードバックを送信","Google Search":"Google 検索","I'm feeling lucky":"I'm Feeling Lucky","Search Images":"画像検索","Search Video":"動画検索","Sign in":"ログイン","Sign out":"ログアウト","Account":"アカウント","My Account":"マイアカウント","Add account":"アカウントを追加","Your profile":"プロフィール","Change photo":"写真を変更","Privacy":"プライバシー","Terms":"規約","Privacy & Terms":"プライバシーと規約","About":"Google について","About Google":"Google について","Advertising":"広告","Advertising Programs":"広告掲載","Advertise with Us":"広告掲載","Business":"ビジネス","Business Solutions":"ビジネス ソリューション","Services & Tools":"サービス & ツール","Jobs, Press, & Help":"採用情報、プレス、ヘルプ","Google Home":"Google ホーム","Next":"次へ","Prev":"前へ","Any time":"期間指定なし","Past hour":"1 時間以内","Past day":"24 時間以内","Past week":"1 週間以内","Past month":"1 か月以内","Past year":"1 年以内","All results":"すべての結果","Verbatim":"完全一致","Cached":"キャッシュ","Similar pages":"類似ページ","Dissatisfied with your search results?":"検索結果にご満足いただけませんでしたか?","Help us improve.":"改善にご協力ください。","Search within results":"結果の中を検索","Loading...":"読み込み中...","Generating...":"生成中...","Opening...":"開いています...","Loading more results…":"結果を読み込んでいます…","Show more":"もっと見る","Show less":"一部を表示","Dismiss":"閉じる","Share":"共有","Translate":"翻訳","AI Overview":"AI による概要","AI Overviews":"AI による概要","An AI Overview is not available for this search":"この検索では AI による概要はご利用いただけません","All caught up!":"すべて確認済みです","Previously read":"既読","Did you mean:":"もしかして:","Showing results for":"次の検索結果を表示しています:","Search instead for":"元の検索キーワード:","Currently showing personal results":"現在パーソナル検索結果を表示しています","Hide personal results":"パーソナル検索結果を非表示","Not enough results found. Results will load in a few seconds...":"十分な検索結果が見つかりませんでした。数秒後に結果が読み込まれます...","Force-load results now":"今すぐ結果を読み込む","View image":"画像を表示","Visit page":"ページを表示","Size of the preview image. Actual image may be larger.":"プレビュー画像のサイズです。実際の画像はこれより大きい場合があります。","Size of the preview image. Actual image size may be larger.":"プレビュー画像のサイズです。実際の画像サイズはこれより大きい場合があります。","Search by image":"画像で検索","Search by image (Google Lens)":"画像で検索(Google レンズ)","Google Lens":"Google レンズ","Search any image with Google Lens":"Google レンズで画像を検索","Search Google with an image instead of text. Try dragging an image here.":"テキストの代わりに画像で Google 検索できます。ここに画像をドラッグしてみてください。","Paste image URL":"画像の URL を貼り付け","Upload an image":"画像をアップロード","Choose File":"ファイルを選択","No file chosen":"選択されていません","Drag an image here or":"ここに画像をドラッグするか、","upload a file":"ファイルをアップロード","OR":"または","Paste image link":"画像のリンクを貼り付け","Remove image":"画像を削除","Close":"閉じる","Visually similar images":"外観が類似した画像","Visual matches":"一致する画像","Pages that include matching images":"一致する画像を含むページ","Image size:":"画像サイズ:","Calendar":"カレンダー","Contacts":"連絡先","Docs":"ドキュメント","Photos":"フォト","Shopping":"ショッピング","Finance":"ファイナンス","Books":"ブックス","Groups":"グループ","Directory":"ディレクトリ","Wallet":"ウォレット","Drive":"ドライブ","Google+ notifications":"Google+ の通知","Cannot connect to Google+.":"Google+ に接続できません。","Gplex Settings":"Gplex 設定","Google Images":"Google 画像検索","Google Videos":"Google 動画検索","Google Search by image":"Google 画像で検索","Layout":"レイアウト","You can also change this setting by searching for \"Google in [year]\".":"「Google in [年]」と検索してこの設定を変更することもできます。","Info Cards":"情報カード","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"情報カードは 2012 年に追加されたため、正確さを重視する場合は 2011 年後半~2012 年前半以前のレイアウトでは無効にすることをおすすめします。ただし、2006 年などの UI が好きで、その機能も使いたい場合は有効のままにしてください。","Custom Image Page":"カスタム画像ページ","On:":"オン:","Off:":"オフ:","On":"オン","Off":"オフ","Gplex creates it's own image page, which can have some bugs.":"Gplex が独自の画像ページを作成します。不具合が発生する場合があります。","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex は通常の Google 画像ページを使用します。機能は充実していますが、レイアウトに合わせたスタイルにはなりません。","\"Force load results\" message":"「結果を強制読み込み」メッセージ","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Gplex がページ内で十分な検索結果を見つけられない場合、さらに結果が見つかることを期待して数秒間待機し、結果を早めに強制読み込みするオプション付きのメッセージを表示します。低速な接続では理論上より確実です。","When Gplex would normally show the message, it will instead force load the results automatically.":"通常メッセージが表示される場面で、代わりに結果を自動的に強制読み込みします。","Gplex Settings button":"Gplex 設定ボタン","Choose whether or not to display a link to this page on the topbar.":"このページへのリンクをトップバーに表示するかどうかを選択します。","Display name":"表示名","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"一部のレイアウト(主に古いレイアウト)には表示名があります。元々はメールアドレスが表示されていましたが、代わりにユーザー名を表示することもできます。アカウント メニューには影響しません。","Google+ custom link":"Google+ カスタム リンク","Invalid URL.":"無効な URL です。","You have unsaved changes. Press enter to save.":"保存されていない変更があります。Enter キーを押して保存してください。","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"gbar の +You や一部のレイアウトのトップバーなど、Google+ ボタンのカスタム リンクです。デフォルトは",", which redirects to a notice that Google+ has been discontinued.":"で、Google+ のサービス終了のお知らせにリダイレクトされます。","Choose whether or not to show AI overviews in search results.":"検索結果に AI による概要を表示するかどうかを選択します。","Save Settings":"設定を保存","Settings are automatically saved. There is no need to manually save.":"設定は自動的に保存されます。手動で保存する必要はありません。","Off (hide info cards)":"オフ(情報カードを非表示)","Off (compatible with the Google Images Restored extension)":"オフ(Google Images Restored 拡張機能と互換)","Off (experimental fast mode, not recommended)":"オフ(試験的な高速モード、非推奨)","Username":"ユーザー名","Email":"メールアドレス","None (it will say \"account\" instead)":"なし(代わりに「アカウント」と表示)","Never show":"表示しない","Always show":"常に表示","Show on hover":"ホバー時に表示","Search the web using Google":"Google でウェブを検索","Search the web using Google!":"Google でウェブを検索!","Personalized Home":"パーソナライズド ホーム","Language, Display, & Filtering Options":"言語、表示、フィルタのオプション","image":"画像"},"p":{"loading":"読み込み中... {n} 件見つかりました","early":"{y} 年前半","late":"{y} 年後半","stanford":"(スタンフォード)","legacy":"(旧ブラウザ版)","cardified":"(カード化テスト)","material":"(カスタム マテリアル版)","now":"(現在の見た目、AI は 0.0000%)","searching":"{n} ウェブページから検索","matches":"{n} 件の一致"}},"es":{"s":{"Images":"Imágenes","Videos":"Vídeos","Video":"Vídeo","News":"Noticias","More":"Más","more":"más","more »":"más »","Even More":"Aún más","Even more from Google":"Aún más de Google","Everything":"Todo","All":"Todo","Search":"Buscar","Settings":"Configuración","Search settings":"Configuración de búsqueda","Advanced search":"Búsqueda avanzada","Advanced Search":"Búsqueda avanzada","Language tools":"Herramientas del idioma","Language Tools":"Herramientas del idioma","Preferences":"Preferencias","Search Help":"Ayuda para la búsqueda","Search Tips":"Sugerencias de búsqueda","Send feedback":"Enviar comentarios","Give us feedback":"Envíanos tus comentarios","Google Search":"Buscar con Google","I'm Feeling Lucky":"Voy a tener suerte","I'm feeling lucky":"Voy a tener suerte","Search Images":"Buscar imágenes","Search Video":"Buscar vídeos","Sign in":"Iniciar sesión","Sign out":"Cerrar sesión","Account":"Cuenta","My Account":"Mi cuenta","Add account":"Añadir cuenta","Your profile":"Tu perfil","Change photo":"Cambiar foto","Privacy":"Privacidad","Terms":"Condiciones","Privacy & Terms":"Privacidad y condiciones","About":"Información","About Google":"Todo acerca de Google","Advertising":"Publicidad","Advertising Programs":"Programas de publicidad","Advertise with Us":"Anúnciese con nosotros","Business":"Empresa","Business Solutions":"Soluciones empresariales","Services & Tools":"Servicios y herramientas","Jobs, Press, & Help":"Empleo, prensa y ayuda","Google Home":"Página principal de Google","Next":"Siguiente","Prev":"Anterior","Any time":"Cualquier fecha","Past hour":"Última hora","Past day":"Últimas 24 horas","Past week":"Última semana","Past month":"Último mes","Past year":"Último año","All results":"Todos los resultados","Verbatim":"Literal","Cached":"En caché","Similar pages":"Páginas similares","Dissatisfied with your search results?":"¿No está satisfecho con los resultados de su búsqueda?","Help us improve.":"Ayúdenos a mejorar.","Search within results":"Buscar en los resultados","Loading...":"Cargando...","Generating...":"Generando...","Opening...":"Abriendo...","Loading more results…":"Cargando más resultados…","Show more":"Mostrar más","Show less":"Mostrar menos","Dismiss":"Descartar","Share":"Compartir","Translate":"Traducir","AI Overview":"Vista creada con IA","AI Overviews":"Vistas creadas con IA","An AI Overview is not available for this search":"No hay ninguna vista creada con IA disponible para esta búsqueda","All caught up!":"¡Estás al día!","Previously read":"Leído anteriormente","Did you mean:":"Quizás quisiste decir:","Showing results for":"Mostrando resultados de","Search instead for":"Buscar en su lugar","Currently showing personal results":"Mostrando resultados personales","Hide personal results":"Ocultar resultados personales","Not enough results found. Results will load in a few seconds...":"No se han encontrado suficientes resultados. Los resultados se cargarán en unos segundos...","Force-load results now":"Cargar resultados ahora","View image":"Ver imagen","Visit page":"Visitar página","Size of the preview image. Actual image may be larger.":"Tamaño de la imagen de vista previa. La imagen real puede ser más grande.","Size of the preview image. Actual image size may be larger.":"Tamaño de la imagen de vista previa. El tamaño real de la imagen puede ser mayor.","Search by image":"Buscar por imagen","Search by image (Google Lens)":"Buscar por imagen (Google Lens)","Search any image with Google Lens":"Busca cualquier imagen con Google Lens","Search Google with an image instead of text. Try dragging an image here.":"Busca en Google con una imagen en lugar de texto. Prueba a arrastrar una imagen aquí.","Paste image URL":"Pegar URL de imagen","Upload an image":"Subir una imagen","Choose File":"Seleccionar archivo","No file chosen":"No se ha seleccionado ningún archivo","Drag an image here or":"Arrastra una imagen aquí o","upload a file":"sube un archivo","OR":"O","Paste image link":"Pegar enlace de imagen","Remove image":"Quitar imagen","Close":"Cerrar","Visually similar images":"Imágenes visualmente similares","Visual matches":"Coincidencias visuales","Pages that include matching images":"Páginas que incluyen imágenes coincidentes","Image size:":"Tamaño de la imagen:","Contacts":"Contactos","Photos":"Fotos","Finance":"Finanzas","Books":"Libros","Groups":"Grupos","Directory":"Directorio","Google+ notifications":"Notificaciones de Google+","Cannot connect to Google+.":"No se puede conectar con Google+.","Gplex Settings":"Configuración de Gplex","Google Images":"Google Imágenes","Google Videos":"Google Vídeos","Google Search by image":"Búsqueda por imagen de Google","Layout":"Diseño","You can also change this setting by searching for \"Google in [year]\".":"También puedes cambiar este ajuste buscando \"Google in [año]\".","Info Cards":"Tarjetas de información","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Las tarjetas de información se añadieron en 2012, así que para una precisión total recomiendo desactivarlas en finales de 2011-principios de 2012 y anteriores. Pero si simplemente te gusta la interfaz de, por ejemplo, 2006 y quieres sus funciones, déjalas activadas.","Custom Image Page":"Página de imágenes personalizada","On:":"Activado:","Off:":"Desactivado:","On":"Activado","Off":"Desactivado","Gplex creates it's own image page, which can have some bugs.":"Gplex crea su propia página de imágenes, que puede tener algunos errores.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex usa la página de imágenes normal de Google, que tiene más funciones, pero no se adapta al estilo del diseño.","\"Force load results\" message":"Mensaje \"Forzar carga de resultados\"","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Cuando Gplex no encuentra suficientes resultados en la página, espera unos segundos con la esperanza de encontrar más y muestra un mensaje con la opción de forzar la carga de los resultados antes. En teoría es más fiable con conexiones lentas.","When Gplex would normally show the message, it will instead force load the results automatically.":"Cuando Gplex normalmente mostraría el mensaje, forzará la carga de los resultados automáticamente.","Gplex Settings button":"Botón de configuración de Gplex","Choose whether or not to display a link to this page on the topbar.":"Elige si quieres mostrar un enlace a esta página en la barra superior.","Display name":"Nombre visible","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Algunos diseños (en general, los más antiguos) muestran un nombre. Originalmente se mostraba tu dirección de correo, pero puedes elegir mostrar tu nombre de usuario. Esto no afecta a los menús de la cuenta.","Google+ custom link":"Enlace personalizado de Google+","Invalid URL.":"URL no válida.","You have unsaved changes. Press enter to save.":"Tienes cambios sin guardar. Pulsa Intro para guardar.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Enlace personalizado para los botones de Google+, como el +Tú de la gbar o la barra superior en ciertos diseños. El valor predeterminado es",", which redirects to a notice that Google+ has been discontinued.":", que redirige a un aviso de que Google+ ha dejado de estar disponible.","Choose whether or not to show AI overviews in search results.":"Elige si quieres mostrar las vistas creadas con IA en los resultados de búsqueda.","Save Settings":"Guardar configuración","Settings are automatically saved. There is no need to manually save.":"La configuración se guarda automáticamente. No es necesario guardarla manualmente.","Off (hide info cards)":"Desactivado (ocultar tarjetas de información)","Off (compatible with the Google Images Restored extension)":"Desactivado (compatible con la extensión Google Images Restored)","Off (experimental fast mode, not recommended)":"Desactivado (modo rápido experimental, no recomendado)","Username":"Nombre de usuario","Email":"Correo electrónico","None (it will say \"account\" instead)":"Ninguno (mostrará \"cuenta\" en su lugar)","Never show":"No mostrar nunca","Always show":"Mostrar siempre","Show on hover":"Mostrar al pasar el cursor","Search the web using Google":"Buscar en la Web con Google","Search the web using Google!":"¡Buscar en la Web con Google!","Personalized Home":"Página principal personalizada","Language, Display, & Filtering Options":"Opciones de idioma, visualización y filtrado","Results":"Resultados","of about":"de aproximadamente","for":"de","seconds.":"segundos.","Searched the web for":"Se buscó en la Web","Searched news for":"Se buscó en noticias","Searched images for":"Se buscó en imágenes","Result Page:":"Página de resultados:",". Search took":". La búsqueda tardó","image":"imagen"},"p":{"loading":"Cargando... {n} resultados encontrados","early":"principios de {y}","late":"finales de {y}","stanford":" (Stanford)","legacy":" (versión para navegadores antiguos)","cardified":" (experimento con tarjetas)","material":" (versión Material personalizada)","now":" (Aspecto actual, 0,0000 % de IA)","searching":"Buscando en {n} páginas web","matches":"{n} coincidencias encontradas"}},"fr":{"s":{"Videos":"Vidéos","Video":"Vidéo","News":"Actualités","More":"Plus","more":"plus","more »":"plus »","Even More":"Encore plus","Even more from Google":"Encore plus de Google","Everything":"Tout","All":"Tous","Search":"Rechercher","Settings":"Paramètres","Search settings":"Paramètres de recherche","Advanced search":"Recherche avancée","Advanced Search":"Recherche avancée","Language tools":"Outils linguistiques","Language Tools":"Outils linguistiques","Preferences":"Préférences","Search Help":"Aide sur la recherche","Search Tips":"Conseils de recherche","Send feedback":"Envoyer des commentaires","Give us feedback":"Envoyez-nous vos commentaires","Google Search":"Recherche Google","I'm Feeling Lucky":"J'ai de la chance","I'm feeling lucky":"J'ai de la chance","Search Images":"Rechercher des images","Search Video":"Rechercher des vidéos","Sign in":"Connexion","Sign out":"Déconnexion","Account":"Compte","My Account":"Mon compte","Add account":"Ajouter un compte","Your profile":"Votre profil","Change photo":"Changer de photo","Privacy":"Confidentialité","Terms":"Conditions","Privacy & Terms":"Confidentialité et conditions","About":"À propos","About Google":"À propos de Google","Advertising":"Publicité","Advertising Programs":"Solutions publicitaires","Advertise with Us":"Publicité","Business":"Entreprise","Business Solutions":"Solutions d'entreprise","Services & Tools":"Services et outils","Jobs, Press, & Help":"Emplois, presse et aide","Google Home":"Accueil Google","Next":"Suivant","Prev":"Précédent","Any time":"Toutes les dates","Past hour":"Moins d'une heure","Past day":"Moins de 24 heures","Past week":"Moins d'une semaine","Past month":"Moins d'un mois","Past year":"Moins d'un an","All results":"Tous les résultats","Verbatim":"Mot à mot","Cached":"En cache","Similar pages":"Pages similaires","Dissatisfied with your search results?":"Vous n'êtes pas satisfait des résultats de votre recherche ?","Help us improve.":"Aidez-nous à nous améliorer.","Search within results":"Rechercher dans les résultats","Loading...":"Chargement...","Generating...":"Génération...","Opening...":"Ouverture...","Loading more results…":"Chargement de résultats supplémentaires…","Show more":"Plus","Show less":"Moins","Dismiss":"Ignorer","Share":"Partager","Translate":"Traduire","AI Overview":"Aperçu IA","AI Overviews":"Aperçus IA","An AI Overview is not available for this search":"Aucun aperçu IA n'est disponible pour cette recherche","All caught up!":"Vous êtes à jour !","Previously read":"Déjà lu","Did you mean:":"Essayez avec cette orthographe :","Showing results for":"Résultats pour","Search instead for":"Rechercher plutôt","Currently showing personal results":"Résultats personnels affichés","Hide personal results":"Masquer les résultats personnels","Not enough results found. Results will load in a few seconds...":"Pas assez de résultats trouvés. Les résultats se chargeront dans quelques secondes...","Force-load results now":"Forcer le chargement maintenant","View image":"Afficher l'image","Visit page":"Consulter la page","Size of the preview image. Actual image may be larger.":"Taille de l'aperçu. L'image réelle peut être plus grande.","Size of the preview image. Actual image size may be larger.":"Taille de l'aperçu. La taille réelle de l'image peut être supérieure.","Search by image":"Recherche par image","Search by image (Google Lens)":"Recherche par image (Google Lens)","Search any image with Google Lens":"Recherchez n'importe quelle image avec Google Lens","Search Google with an image instead of text. Try dragging an image here.":"Effectuez une recherche Google à partir d'une image plutôt que d'un texte. Essayez de faire glisser une image ici.","Paste image URL":"Coller l'URL de l'image","Upload an image":"Importer une image","Choose File":"Choisir un fichier","No file chosen":"Aucun fichier choisi","Drag an image here or":"Faites glisser une image ici ou","upload a file":"importez un fichier","OR":"OU","Paste image link":"Coller le lien de l'image","Remove image":"Supprimer l'image","Close":"Fermer","Visually similar images":"Images similaires","Visual matches":"Correspondances visuelles","Pages that include matching images":"Pages contenant des images correspondantes","Image size:":"Taille de l'image :","Calendar":"Agenda","Books":"Livres","Groups":"Groupes","Directory":"Annuaire","Google+ notifications":"Notifications Google+","Cannot connect to Google+.":"Impossible de se connecter à Google+.","Gplex Settings":"Paramètres Gplex","Google Videos":"Google Vidéos","Google Search by image":"Recherche par image Google","Layout":"Mise en page","You can also change this setting by searching for \"Google in [year]\".":"Vous pouvez aussi modifier ce paramètre en recherchant « Google in [année] ».","Info Cards":"Fiches d'informations","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Les fiches d'informations ont été ajoutées en 2012 : pour une fidélité totale, je les désactiverais sur fin 2011-début 2012 et avant. Mais si vous aimez simplement l'interface de 2006, par exemple, et voulez profiter de leurs fonctionnalités, laissez-les activées.","Custom Image Page":"Page d'images personnalisée","On:":"Activé :","Off:":"Désactivé :","On":"Activé","Off":"Désactivé","Gplex creates it's own image page, which can have some bugs.":"Gplex crée sa propre page d'images, qui peut comporter quelques bugs.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex utilise la page d'images Google habituelle, plus complète, mais qui n'est pas stylisée selon la mise en page.","\"Force load results\" message":"Message « Forcer le chargement des résultats »","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Lorsque Gplex ne trouve pas assez de résultats dans la page, il patiente quelques secondes dans l'espoir d'en trouver davantage et affiche un message proposant de forcer le chargement plus tôt. En théorie plus fiable sur les connexions lentes.","When Gplex would normally show the message, it will instead force load the results automatically.":"Lorsque Gplex devrait afficher le message, il force automatiquement le chargement des résultats.","Gplex Settings button":"Bouton des paramètres Gplex","Choose whether or not to display a link to this page on the topbar.":"Choisissez d'afficher ou non un lien vers cette page dans la barre supérieure.","Display name":"Nom affiché","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Certaines mises en page (généralement les plus anciennes) affichent un nom. Votre adresse e-mail était affichée à l'origine, mais vous pouvez choisir d'afficher votre nom d'utilisateur. Cela n'affecte pas les menus du compte.","Google+ custom link":"Lien Google+ personnalisé","Invalid URL.":"URL non valide.","You have unsaved changes. Press enter to save.":"Vous avez des modifications non enregistrées. Appuyez sur Entrée pour enregistrer.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Lien personnalisé pour les boutons Google+, comme le +Vous de la gbar ou la barre supérieure de certaines mises en page. Valeur par défaut :",", which redirects to a notice that Google+ has been discontinued.":", qui redirige vers un avis indiquant que Google+ a été arrêté.","Choose whether or not to show AI overviews in search results.":"Choisissez d'afficher ou non les aperçus IA dans les résultats de recherche.","Save Settings":"Enregistrer les paramètres","Settings are automatically saved. There is no need to manually save.":"Les paramètres sont enregistrés automatiquement. Inutile de les enregistrer manuellement.","Off (hide info cards)":"Désactivé (masquer les fiches d'informations)","Off (compatible with the Google Images Restored extension)":"Désactivé (compatible avec l'extension Google Images Restored)","Off (experimental fast mode, not recommended)":"Désactivé (mode rapide expérimental, non recommandé)","Username":"Nom d'utilisateur","Email":"E-mail","None (it will say \"account\" instead)":"Aucun (« compte » sera affiché à la place)","Never show":"Ne jamais afficher","Always show":"Toujours afficher","Show on hover":"Afficher au survol","Search the web using Google":"Rechercher sur le Web avec Google","Search the web using Google!":"Rechercher sur le Web avec Google !","Personalized Home":"Page d'accueil personnalisée","Language, Display, & Filtering Options":"Options de langue, d'affichage et de filtrage","Results":"Résultats","of about":"sur un total d'environ","for":"pour","seconds.":"secondes.","Searched the web for":"Recherche sur le Web","Searched news for":"Recherche dans les actualités","Searched images for":"Recherche d'images","Result Page:":"Page de résultats :",". Search took":". Durée de la recherche :"},"p":{"loading":"Chargement... {n} résultats trouvés","early":"début {y}","late":"fin {y}","stanford":" (Stanford)","legacy":" (version pour anciens navigateurs)","cardified":" (expérience en fiches)","material":" (version Material personnalisée)","now":" (Apparence actuelle, 0,0000 % d'IA)","searching":"Recherche parmi {n} pages Web","matches":"{n} correspondances trouvées"}},"de":{"s":{"Images":"Bilder","More":"Mehr","more":"mehr","more »":"mehr »","Even More":"Noch mehr","Even more from Google":"Noch mehr von Google","Everything":"Alles","All":"Alle","Search":"Suche","Settings":"Einstellungen","Search settings":"Sucheinstellungen","Advanced search":"Erweiterte Suche","Advanced Search":"Erweiterte Suche","Language tools":"Sprachtools","Language Tools":"Sprachtools","Preferences":"Einstellungen","Search Help":"Suchhilfe","Search Tips":"Suchtipps","Send feedback":"Feedback senden","Give us feedback":"Feedback geben","Google Search":"Google-Suche","I'm Feeling Lucky":"Auf gut Glück!","I'm feeling lucky":"Auf gut Glück!","Search Images":"Bilder suchen","Search Video":"Videos suchen","Sign in":"Anmelden","Sign out":"Abmelden","Account":"Konto","My Account":"Mein Konto","Add account":"Konto hinzufügen","Your profile":"Ihr Profil","Change photo":"Foto ändern","Privacy":"Datenschutz","Terms":"Nutzungsbedingungen","Privacy & Terms":"Datenschutzerklärung & Nutzungsbedingungen","About":"Über Google","About Google":"Über Google","Advertising":"Werbung","Advertising Programs":"Werbeprogramme","Advertise with Us":"Werben mit Google","Business":"Unternehmen","Business Solutions":"Unternehmensangebote","Services & Tools":"Dienste & Tools","Jobs, Press, & Help":"Jobs, Presse & Hilfe","Google Home":"Google-Startseite","Next":"Weiter","Prev":"Zurück","Any time":"Beliebige Zeit","Past hour":"Letzte Stunde","Past day":"Letzte 24 Stunden","Past week":"Letzte Woche","Past month":"Letzter Monat","Past year":"Letztes Jahr","All results":"Alle Ergebnisse","Verbatim":"Wortgetreu","Cached":"Im Cache","Similar pages":"Ähnliche Seiten","Dissatisfied with your search results?":"Sind Sie mit Ihren Suchergebnissen nicht zufrieden?","Help us improve.":"Helfen Sie uns, besser zu werden.","Search within results":"Innerhalb der Ergebnisse suchen","Loading...":"Wird geladen...","Generating...":"Wird erstellt...","Opening...":"Wird geöffnet...","Loading more results…":"Weitere Ergebnisse werden geladen…","Show more":"Mehr anzeigen","Show less":"Weniger anzeigen","Dismiss":"Schließen","Share":"Teilen","Translate":"Übersetzen","AI Overview":"KI-Übersicht","AI Overviews":"KI-Übersichten","An AI Overview is not available for this search":"Für diese Suche ist keine KI-Übersicht verfügbar","All caught up!":"Alles gelesen!","Previously read":"Bereits gelesen","Did you mean:":"Meinten Sie:","Showing results for":"Ergebnisse für","Search instead for":"Stattdessen suchen nach","Currently showing personal results":"Persönliche Ergebnisse werden angezeigt","Hide personal results":"Persönliche Ergebnisse ausblenden","Not enough results found. Results will load in a few seconds...":"Nicht genügend Ergebnisse gefunden. Die Ergebnisse werden in wenigen Sekunden geladen...","Force-load results now":"Ergebnisse jetzt laden","View image":"Bild ansehen","Visit page":"Seite besuchen","Size of the preview image. Actual image may be larger.":"Größe des Vorschaubilds. Das Originalbild kann größer sein.","Size of the preview image. Actual image size may be larger.":"Größe des Vorschaubilds. Die tatsächliche Bildgröße kann größer sein.","Search by image":"Bildersuche","Search by image (Google Lens)":"Bildersuche (Google Lens)","Search any image with Google Lens":"Jedes Bild mit Google Lens suchen","Search Google with an image instead of text. Try dragging an image here.":"Suchen Sie bei Google mit einem Bild statt mit Text. Ziehen Sie ein Bild hierher.","Paste image URL":"Bild-URL einfügen","Upload an image":"Bild hochladen","Choose File":"Datei auswählen","No file chosen":"Keine ausgewählt","Drag an image here or":"Bild hierher ziehen oder","upload a file":"Datei hochladen","OR":"ODER","Paste image link":"Bildlink einfügen","Remove image":"Bild entfernen","Close":"Schließen","Visually similar images":"Ähnliche Bilder","Visual matches":"Visuelle Übereinstimmungen","Pages that include matching images":"Seiten mit übereinstimmenden Bildern","Image size:":"Bildgröße:","Calendar":"Kalender","Contacts":"Kontakte","Photos":"Fotos","Finance":"Finanzen","Books":"Bücher","Directory":"Verzeichnis","Google+ notifications":"Google+ Benachrichtigungen","Cannot connect to Google+.":"Verbindung zu Google+ nicht möglich.","Gplex Settings":"Gplex-Einstellungen","Google Images":"Google Bilder","Google Search by image":"Google-Bildersuche","You can also change this setting by searching for \"Google in [year]\".":"Sie können diese Einstellung auch ändern, indem Sie nach „Google in [Jahr]\" suchen.","Info Cards":"Infokarten","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Infokarten wurden 2012 eingeführt. Für volle Genauigkeit würde ich sie bei Ende 2011–Anfang 2012 und älter deaktivieren. Wenn Ihnen aber z. B. einfach die Oberfläche von 2006 gefällt und Sie die Funktionen nutzen möchten, lassen Sie sie aktiviert.","Custom Image Page":"Eigene Bilderseite","On:":"An:","Off:":"Aus:","On":"An","Off":"Aus","Gplex creates it's own image page, which can have some bugs.":"Gplex erstellt eine eigene Bilderseite, die einige Fehler haben kann.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex verwendet die normale Google-Bilderseite, die mehr Funktionen bietet, aber nicht dem Layout entsprechend gestaltet ist.","\"Force load results\" message":"Meldung „Ergebnisse erzwingen\"","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Wenn Gplex nicht genügend Ergebnisse auf der Seite findet, wartet es einige Sekunden auf weitere Ergebnisse und zeigt eine Meldung mit der Option, die Ergebnisse vorzeitig zu laden. Theoretisch zuverlässiger bei langsamen Verbindungen.","When Gplex would normally show the message, it will instead force load the results automatically.":"Wenn Gplex normalerweise die Meldung anzeigen würde, werden die Ergebnisse stattdessen automatisch geladen.","Gplex Settings button":"Schaltfläche „Gplex-Einstellungen\"","Choose whether or not to display a link to this page on the topbar.":"Wählen Sie, ob ein Link zu dieser Seite in der oberen Leiste angezeigt werden soll.","Display name":"Anzeigename","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Einige Layouts (meist ältere) zeigen einen Namen an. Ursprünglich wurde Ihre E-Mail-Adresse angezeigt, Sie können aber stattdessen Ihren Nutzernamen anzeigen lassen. Kontomenüs sind davon nicht betroffen.","Google+ custom link":"Eigener Google+ Link","Invalid URL.":"Ungültige URL.","You have unsaved changes. Press enter to save.":"Sie haben nicht gespeicherte Änderungen. Drücken Sie die Eingabetaste zum Speichern.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Eigener Link für Google+ Schaltflächen, z. B. +Du in der gbar oder die obere Leiste in bestimmten Layouts. Standard ist",", which redirects to a notice that Google+ has been discontinued.":", das auf einen Hinweis weiterleitet, dass Google+ eingestellt wurde.","Choose whether or not to show AI overviews in search results.":"Wählen Sie, ob KI-Übersichten in den Suchergebnissen angezeigt werden sollen.","Save Settings":"Einstellungen speichern","Settings are automatically saved. There is no need to manually save.":"Einstellungen werden automatisch gespeichert. Manuelles Speichern ist nicht nötig.","Off (hide info cards)":"Aus (Infokarten ausblenden)","Off (compatible with the Google Images Restored extension)":"Aus (kompatibel mit der Erweiterung Google Images Restored)","Off (experimental fast mode, not recommended)":"Aus (experimenteller Schnellmodus, nicht empfohlen)","Username":"Nutzername","Email":"E-Mail","None (it will say \"account\" instead)":"Keiner (stattdessen wird „Konto\" angezeigt)","Never show":"Nie anzeigen","Always show":"Immer anzeigen","Show on hover":"Beim Darüberfahren anzeigen","Search the web using Google":"Das Web mit Google durchsuchen","Search the web using Google!":"Das Web mit Google durchsuchen!","Personalized Home":"Personalisierte Startseite","Language, Display, & Filtering Options":"Sprach-, Anzeige- und Filteroptionen","Results":"Ergebnisse","of about":"von ungefähr","for":"für","seconds.":"Sekunden.","Searched the web for":"Das Web wurde durchsucht nach","Searched news for":"News wurden durchsucht nach","Searched images for":"Bilder wurden durchsucht nach","Result Page:":"Ergebnisseite:",". Search took":". Suchdauer:","image":"Bild"},"p":{"loading":"Wird geladen... {n} Ergebnisse gefunden","early":"Anfang {y}","late":"Ende {y}","stanford":" (Stanford)","legacy":" (Version für ältere Browser)","cardified":" (Karten-Experiment)","material":" (eigene Material-Version)","now":" (Heutiges Aussehen, 0,0000 % KI)","searching":"{n} Webseiten werden durchsucht","matches":"{n} Übereinstimmungen gefunden"}},"it":{"s":{"Images":"Immagini","Videos":"Video","News":"Notizie","More":"Altro","more":"altro","more »":"altro »","Even More":"Ancora altro","Even more from Google":"Ancora altro da Google","Everything":"Tutto","All":"Tutti","Search":"Cerca","Settings":"Impostazioni","Search settings":"Impostazioni di ricerca","Advanced search":"Ricerca avanzata","Advanced Search":"Ricerca avanzata","Language tools":"Strumenti per le lingue","Language Tools":"Strumenti per le lingue","Preferences":"Preferenze","Search Help":"Guida alla ricerca","Search Tips":"Suggerimenti per la ricerca","Send feedback":"Invia feedback","Give us feedback":"Inviaci un feedback","Google Search":"Cerca con Google","I'm Feeling Lucky":"Mi sento fortunato","I'm feeling lucky":"Mi sento fortunato","Search Images":"Cerca immagini","Search Video":"Cerca video","Sign in":"Accedi","Sign out":"Esci","My Account":"Il mio account","Add account":"Aggiungi account","Your profile":"Il tuo profilo","Change photo":"Cambia foto","Terms":"Termini","Privacy & Terms":"Privacy e termini","About":"Informazioni","About Google":"Tutto su Google","Advertising":"Pubblicità","Advertising Programs":"Programmi pubblicitari","Advertise with Us":"Pubblicità su Google","Business Solutions":"Soluzioni aziendali","Services & Tools":"Servizi e strumenti","Jobs, Press, & Help":"Lavora con noi, stampa e guida","Google Home":"Home page di Google","Next":"Avanti","Prev":"Indietro","Any time":"Qualsiasi data","Past hour":"Ultima ora","Past day":"Ultime 24 ore","Past week":"Ultima settimana","Past month":"Ultimo mese","Past year":"Ultimo anno","All results":"Tutti i risultati","Verbatim":"Parola per parola","Cached":"Copia cache","Similar pages":"Pagine simili","Dissatisfied with your search results?":"Non sei soddisfatto dei risultati della ricerca?","Help us improve.":"Aiutaci a migliorare.","Search within results":"Cerca nei risultati","Loading...":"Caricamento...","Generating...":"Generazione...","Opening...":"Apertura...","Loading more results…":"Caricamento di altri risultati…","Show more":"Mostra altro","Show less":"Mostra meno","Dismiss":"Ignora","Share":"Condividi","Translate":"Traduci","AI Overview":"Panoramica AI","AI Overviews":"Panoramiche AI","An AI Overview is not available for this search":"Nessuna panoramica AI disponibile per questa ricerca","All caught up!":"Sei aggiornato!","Previously read":"Già letti","Did you mean:":"Forse cercavi:","Showing results for":"Sono inclusi i risultati per","Search instead for":"Cerca invece","Currently showing personal results":"Risultati personali visualizzati","Hide personal results":"Nascondi risultati personali","Not enough results found. Results will load in a few seconds...":"Risultati insufficienti. I risultati verranno caricati tra qualche secondo...","Force-load results now":"Carica i risultati ora","View image":"Visualizza immagine","Visit page":"Visita pagina","Size of the preview image. Actual image may be larger.":"Dimensioni dell'anteprima. L'immagine reale potrebbe essere più grande.","Size of the preview image. Actual image size may be larger.":"Dimensioni dell'anteprima. Le dimensioni reali potrebbero essere maggiori.","Search by image":"Cerca tramite immagine","Search by image (Google Lens)":"Cerca tramite immagine (Google Lens)","Search any image with Google Lens":"Cerca qualsiasi immagine con Google Lens","Search Google with an image instead of text. Try dragging an image here.":"Cerca su Google con un'immagine anziché con il testo. Prova a trascinare un'immagine qui.","Paste image URL":"Incolla URL immagine","Upload an image":"Carica un'immagine","Choose File":"Scegli file","No file chosen":"Nessun file selezionato","Drag an image here or":"Trascina un'immagine qui o","upload a file":"carica un file","OR":"OPPURE","Paste image link":"Incolla link immagine","Remove image":"Rimuovi immagine","Close":"Chiudi","Visually similar images":"Immagini visivamente simili","Visual matches":"Corrispondenze visive","Pages that include matching images":"Pagine che includono immagini corrispondenti","Image size:":"Dimensioni immagine:","Contacts":"Contatti","Docs":"Documenti","Photos":"Foto","Finance":"Finanza","Books":"Libri","Groups":"Gruppi","Google+ notifications":"Notifiche di Google+","Cannot connect to Google+.":"Impossibile connettersi a Google+.","Gplex Settings":"Impostazioni di Gplex","Google Images":"Google Immagini","Google Videos":"Google Video","Google Search by image":"Ricerca tramite immagine di Google","You can also change this setting by searching for \"Google in [year]\".":"Puoi cambiare questa impostazione anche cercando \"Google in [anno]\".","Info Cards":"Schede informative","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Le schede informative sono state aggiunte nel 2012, quindi per la massima fedeltà ti consiglio di disattivarle su fine 2011-inizio 2012 e precedenti. Ma se ti piace semplicemente l'interfaccia del 2006, ad esempio, e vuoi le loro funzioni, lasciale attive.","Custom Image Page":"Pagina immagini personalizzata","On:":"Attivo:","Off:":"Disattivo:","On":"Attivo","Off":"Disattivo","Gplex creates it's own image page, which can have some bugs.":"Gplex crea una propria pagina delle immagini, che può avere qualche bug.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex usa la normale pagina delle immagini di Google, più completa, ma non adattata allo stile del layout.","\"Force load results\" message":"Messaggio \"Forza caricamento risultati\"","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Quando Gplex non trova abbastanza risultati nella pagina, attende qualche secondo sperando di trovarne altri e mostra un messaggio con l'opzione di forzare il caricamento anticipato. In teoria più affidabile con connessioni lente.","When Gplex would normally show the message, it will instead force load the results automatically.":"Quando Gplex dovrebbe mostrare il messaggio, forza invece il caricamento dei risultati automaticamente.","Gplex Settings button":"Pulsante Impostazioni di Gplex","Choose whether or not to display a link to this page on the topbar.":"Scegli se mostrare un link a questa pagina nella barra superiore.","Display name":"Nome visualizzato","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Alcuni layout (in genere i più vecchi) mostrano un nome. In origine veniva mostrato il tuo indirizzo email, ma puoi scegliere di mostrare il tuo nome utente. Questo non influisce sui menu dell'account.","Google+ custom link":"Link personalizzato Google+","Invalid URL.":"URL non valido.","You have unsaved changes. Press enter to save.":"Hai modifiche non salvate. Premi Invio per salvare.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Link personalizzato per i pulsanti Google+, come +Tu nella gbar o la barra superiore di alcuni layout. Il valore predefinito è",", which redirects to a notice that Google+ has been discontinued.":", che reindirizza a un avviso sulla chiusura di Google+.","Choose whether or not to show AI overviews in search results.":"Scegli se mostrare le panoramiche AI nei risultati di ricerca.","Save Settings":"Salva impostazioni","Settings are automatically saved. There is no need to manually save.":"Le impostazioni vengono salvate automaticamente. Non è necessario salvarle manualmente.","Off (hide info cards)":"Disattivo (nascondi schede informative)","Off (compatible with the Google Images Restored extension)":"Disattivo (compatibile con l'estensione Google Images Restored)","Off (experimental fast mode, not recommended)":"Disattivo (modalità veloce sperimentale, sconsigliata)","Username":"Nome utente","None (it will say \"account\" instead)":"Nessuno (verrà mostrato \"account\")","Never show":"Non mostrare mai","Always show":"Mostra sempre","Show on hover":"Mostra al passaggio del mouse","Search the web using Google":"Cerca nel Web con Google","Search the web using Google!":"Cerca nel Web con Google!","Personalized Home":"Home page personalizzata","Language, Display, & Filtering Options":"Opzioni di lingua, visualizzazione e filtro","Results":"Risultati","of about":"su circa","for":"per","seconds.":"secondi.","Searched the web for":"Ricerca nel Web di","Searched news for":"Ricerca nelle notizie di","Searched images for":"Ricerca di immagini di","Result Page:":"Pagina dei risultati:",". Search took":". Tempo di ricerca:","image":"immagine"},"p":{"loading":"Caricamento... {n} risultati trovati","early":"inizio {y}","late":"fine {y}","stanford":" (Stanford)","legacy":" (versione per browser datati)","cardified":" (esperimento a schede)","material":" (versione Material personalizzata)","now":" (Aspetto attuale, 0,0000% di IA)","searching":"Ricerca tra {n} pagine web","matches":"{n} corrispondenze trovate"}},"pt":{"s":{"Images":"Imagens","Videos":"Vídeos","Video":"Vídeo","News":"Notícias","More":"Mais","more":"mais","more »":"mais »","Even More":"Ainda mais","Even more from Google":"Ainda mais do Google","Everything":"Tudo","All":"Todas","Search":"Pesquisar","Settings":"Configurações","Search settings":"Configurações de pesquisa","Advanced search":"Pesquisa avançada","Advanced Search":"Pesquisa avançada","Language tools":"Ferramentas de idiomas","Language Tools":"Ferramentas de idiomas","Preferences":"Preferências","Search Help":"Ajuda da pesquisa","Search Tips":"Dicas de pesquisa","Send feedback":"Enviar feedback","Give us feedback":"Envie-nos seu feedback","Google Search":"Pesquisa Google","I'm Feeling Lucky":"Estou com sorte","I'm feeling lucky":"Estou com sorte","Search Images":"Pesquisar imagens","Search Video":"Pesquisar vídeos","Sign in":"Fazer login","Sign out":"Sair","Account":"Conta","My Account":"Minha conta","Add account":"Adicionar conta","Your profile":"Seu perfil","Change photo":"Alterar foto","Privacy":"Privacidade","Terms":"Termos","Privacy & Terms":"Privacidade e Termos","About":"Sobre","About Google":"Sobre o Google","Advertising":"Publicidade","Advertising Programs":"Programas de publicidade","Advertise with Us":"Anuncie no Google","Business":"Negócios","Business Solutions":"Soluções empresariais","Services & Tools":"Serviços e ferramentas","Jobs, Press, & Help":"Empregos, imprensa e ajuda","Google Home":"Página inicial do Google","Next":"Mais","Prev":"Anterior","Any time":"Qualquer data","Past hour":"Última hora","Past day":"Últimas 24 horas","Past week":"Última semana","Past month":"Último mês","Past year":"Último ano","All results":"Todos os resultados","Verbatim":"Literal","Cached":"Em cache","Similar pages":"Páginas semelhantes","Dissatisfied with your search results?":"Não está satisfeito com os resultados da pesquisa?","Help us improve.":"Ajude-nos a melhorar.","Search within results":"Pesquisar nos resultados","Loading...":"Carregando...","Generating...":"Gerando...","Opening...":"Abrindo...","Loading more results…":"Carregando mais resultados…","Show more":"Mostrar mais","Show less":"Mostrar menos","Dismiss":"Dispensar","Share":"Compartilhar","Translate":"Traduzir","AI Overview":"Visão geral criada por IA","AI Overviews":"Visões gerais criadas por IA","An AI Overview is not available for this search":"Não há uma visão geral criada por IA disponível para esta pesquisa","All caught up!":"Tudo em dia!","Previously read":"Lido anteriormente","Did you mean:":"Você quis dizer:","Showing results for":"Mostrando resultados para","Search instead for":"Em vez disso, pesquisar","Currently showing personal results":"Mostrando resultados pessoais","Hide personal results":"Ocultar resultados pessoais","Not enough results found. Results will load in a few seconds...":"Não foram encontrados resultados suficientes. Os resultados serão carregados em alguns segundos...","Force-load results now":"Carregar resultados agora","View image":"Ver imagem","Visit page":"Visitar página","Size of the preview image. Actual image may be larger.":"Tamanho da imagem de visualização. A imagem real pode ser maior.","Size of the preview image. Actual image size may be larger.":"Tamanho da imagem de visualização. O tamanho real da imagem pode ser maior.","Search by image":"Pesquisar por imagem","Search by image (Google Lens)":"Pesquisar por imagem (Google Lens)","Search any image with Google Lens":"Pesquise qualquer imagem com o Google Lens","Search Google with an image instead of text. Try dragging an image here.":"Pesquise no Google usando uma imagem em vez de texto. Tente arrastar uma imagem para cá.","Paste image URL":"Colar URL da imagem","Upload an image":"Enviar uma imagem","Choose File":"Escolher arquivo","No file chosen":"Nenhum arquivo escolhido","Drag an image here or":"Arraste uma imagem para cá ou","upload a file":"envie um arquivo","OR":"OU","Paste image link":"Colar link da imagem","Remove image":"Remover imagem","Close":"Fechar","Visually similar images":"Imagens visualmente semelhantes","Visual matches":"Correspondências visuais","Pages that include matching images":"Páginas que incluem imagens correspondentes","Image size:":"Tamanho da imagem:","Calendar":"Agenda","Contacts":"Contatos","Docs":"Documentos","Photos":"Fotos","Finance":"Finanças","Books":"Livros","Groups":"Grupos","Directory":"Diretório","Wallet":"Carteira","Google+ notifications":"Notificações do Google+","Cannot connect to Google+.":"Não foi possível conectar ao Google+.","Gplex Settings":"Configurações do Gplex","Google Images":"Google Imagens","Google Videos":"Google Vídeos","Google Search by image":"Pesquisa por imagem do Google","You can also change this setting by searching for \"Google in [year]\".":"Você também pode alterar esta configuração pesquisando \"Google in [ano]\".","Info Cards":"Cartões de informações","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Os cartões de informações foram adicionados em 2012, então para total fidelidade eu os desativaria no final de 2011-início de 2012 e anteriores. Mas se você só gosta da interface de 2006, por exemplo, e quer os recursos deles, deixe-os ativados.","Custom Image Page":"Página de imagens personalizada","On:":"Ativado:","Off:":"Desativado:","On":"Ativado","Off":"Desativado","Gplex creates it's own image page, which can have some bugs.":"O Gplex cria a própria página de imagens, que pode ter alguns bugs.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"O Gplex usa a página de imagens normal do Google, que tem mais recursos, mas não segue o estilo do layout.","\"Force load results\" message":"Mensagem \"Forçar carregamento dos resultados\"","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Quando o Gplex não encontra resultados suficientes na página, ele aguarda alguns segundos na esperança de encontrar mais e mostra uma mensagem com a opção de forçar o carregamento antecipado. Em teoria, mais confiável em conexões lentas.","When Gplex would normally show the message, it will instead force load the results automatically.":"Quando o Gplex normalmente mostraria a mensagem, ele força o carregamento dos resultados automaticamente.","Gplex Settings button":"Botão de configurações do Gplex","Choose whether or not to display a link to this page on the topbar.":"Escolha se deseja mostrar um link para esta página na barra superior.","Display name":"Nome de exibição","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Alguns layouts (geralmente os mais antigos) mostram um nome. Originalmente seu endereço de e-mail era exibido, mas você pode optar por mostrar seu nome de usuário. Isso não afeta os menus da conta.","Google+ custom link":"Link personalizado do Google+","Invalid URL.":"URL inválido.","You have unsaved changes. Press enter to save.":"Você tem alterações não salvas. Pressione Enter para salvar.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Link personalizado para os botões do Google+, como o +Você na gbar ou a barra superior de certos layouts. O padrão é",", which redirects to a notice that Google+ has been discontinued.":", que redireciona para um aviso de que o Google+ foi descontinuado.","Choose whether or not to show AI overviews in search results.":"Escolha se deseja mostrar visões gerais criadas por IA nos resultados da pesquisa.","Save Settings":"Salvar configurações","Settings are automatically saved. There is no need to manually save.":"As configurações são salvas automaticamente. Não é necessário salvar manualmente.","Off (hide info cards)":"Desativado (ocultar cartões de informações)","Off (compatible with the Google Images Restored extension)":"Desativado (compatível com a extensão Google Images Restored)","Off (experimental fast mode, not recommended)":"Desativado (modo rápido experimental, não recomendado)","Username":"Nome de usuário","Email":"E-mail","None (it will say \"account\" instead)":"Nenhum (mostrará \"conta\")","Never show":"Nunca mostrar","Always show":"Sempre mostrar","Show on hover":"Mostrar ao passar o cursor","Search the web using Google":"Pesquisar na Web com o Google","Search the web using Google!":"Pesquisar na Web com o Google!","Personalized Home":"Página inicial personalizada","Language, Display, & Filtering Options":"Opções de idioma, exibição e filtragem","Results":"Resultados","of about":"de aproximadamente","for":"para","seconds.":"segundos.","Searched the web for":"Pesquisou na Web por","Searched news for":"Pesquisou nas notícias por","Searched images for":"Pesquisou nas imagens por","Result Page:":"Página de resultados:",". Search took":". A pesquisa levou","image":"imagem"},"p":{"loading":"Carregando... {n} resultados encontrados","early":"início de {y}","late":"final de {y}","stanford":" (Stanford)","legacy":" (versão para navegadores antigos)","cardified":" (experimento com cards)","material":" (versão Material personalizada)","now":" (Visual atual, 0,0000% de IA)","searching":"Pesquisando {n} páginas da web","matches":"{n} correspondências encontradas"}},"ru":{"s":{"Web":"Веб","Images":"Картинки","Videos":"Видео","Video":"Видео","News":"Новости","Maps":"Карты","More":"Ещё","more":"ещё","more »":"ещё »","Even More":"Ещё больше","Even more from Google":"Другие сервисы Google","Everything":"Все результаты","All":"Все","Search":"Поиск","Settings":"Настройки","Search settings":"Настройки поиска","Advanced search":"Расширенный поиск","Advanced Search":"Расширенный поиск","Language tools":"Языковые инструменты","Language Tools":"Языковые инструменты","Preferences":"Настройки","Search Help":"Справка по поиску","Search Tips":"Советы по поиску","Send feedback":"Отправить отзыв","Give us feedback":"Оставить отзыв","Google Search":"Поиск в Google","I'm Feeling Lucky":"Мне повезёт!","I'm feeling lucky":"Мне повезёт!","Search Images":"Поиск картинок","Search Video":"Поиск видео","Sign in":"Войти","Sign out":"Выйти","Account":"Аккаунт","My Account":"Мой аккаунт","Add account":"Добавить аккаунт","Your profile":"Ваш профиль","Change photo":"Изменить фото","Privacy":"Конфиденциальность","Terms":"Условия","Privacy & Terms":"Конфиденциальность и условия","About":"Всё о Google","About Google":"Всё о Google","Advertising":"Реклама","Advertising Programs":"Рекламные программы","Advertise with Us":"Реклама в Google","Business":"Для бизнеса","Business Solutions":"Решения для бизнеса","Services & Tools":"Сервисы и инструменты","Jobs, Press, & Help":"Вакансии, пресса и справка","Google Home":"Главная страница Google","Next":"Следующая","Prev":"Предыдущая","Any time":"За всё время","Past hour":"За час","Past day":"За 24 часа","Past week":"За неделю","Past month":"За месяц","Past year":"За год","All results":"Все результаты","Verbatim":"Дословно","Cached":"Сохранённая копия","Similar pages":"Похожие","Dissatisfied with your search results?":"Не удовлетворены результатами поиска?","Help us improve.":"Помогите нам стать лучше.","Search within results":"Искать в найденном","Loading...":"Загрузка...","Generating...":"Создание...","Opening...":"Открытие...","Loading more results…":"Загрузка других результатов…","Show more":"Ещё","Show less":"Свернуть","Dismiss":"Закрыть","Share":"Поделиться","Translate":"Перевести","AI Overview":"Обзор от ИИ","AI Overviews":"Обзоры от ИИ","An AI Overview is not available for this search":"Для этого запроса нет обзора от ИИ","All caught up!":"Вы всё прочитали!","Previously read":"Прочитанное","Did you mean:":"Возможно, вы имели в виду:","Showing results for":"Показаны результаты по запросу","Search instead for":"Искать вместо этого","Currently showing personal results":"Показаны персональные результаты","Hide personal results":"Скрыть персональные результаты","Not enough results found. Results will load in a few seconds...":"Найдено недостаточно результатов. Результаты загрузятся через несколько секунд...","Force-load results now":"Загрузить результаты сейчас","View image":"Открыть картинку","Visit page":"Перейти на страницу","Size of the preview image. Actual image may be larger.":"Размер уменьшенного изображения. Оригинал может быть больше.","Size of the preview image. Actual image size may be larger.":"Размер уменьшенного изображения. Реальный размер может быть больше.","Search by image":"Поиск по картинке","Search by image (Google Lens)":"Поиск по картинке (Google Объектив)","Google Lens":"Google Объектив","Search any image with Google Lens":"Ищите по любому изображению с помощью Google Объектива","Search Google with an image instead of text. Try dragging an image here.":"Ищите в Google по изображению, а не по тексту. Попробуйте перетащить сюда изображение.","Paste image URL":"Вставить URL изображения","Upload an image":"Загрузить изображение","Choose File":"Выберите файл","No file chosen":"Файл не выбран","Drag an image here or":"Перетащите изображение сюда или","upload a file":"загрузите файл","OR":"ИЛИ","Paste image link":"Вставьте ссылку на изображение","Remove image":"Удалить изображение","Close":"Закрыть","Visually similar images":"Похожие изображения","Visual matches":"Визуальные совпадения","Pages that include matching images":"Страницы с подходящими изображениями","Image size:":"Размер изображения:","Calendar":"Календарь","Contacts":"Контакты","Docs":"Документы","Photos":"Фото","Shopping":"Покупки","Finance":"Финансы","Books":"Книги","Groups":"Группы","Directory":"Каталог","Wallet":"Кошелёк","Drive":"Диск","Google+ notifications":"Уведомления Google+","Cannot connect to Google+.":"Не удалось подключиться к Google+.","Gplex Settings":"Настройки Gplex","Google Images":"Google Картинки","Google Videos":"Google Видео","Google Search by image":"Поиск по картинке Google","Layout":"Оформление","You can also change this setting by searching for \"Google in [year]\".":"Эту настройку также можно изменить, выполнив поиск «Google in [год]».","Info Cards":"Карточки","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Карточки появились в 2012 году, поэтому для полной достоверности я бы отключил их на макетах «конец 2011 – начало 2012» и старше. Но если вам просто нравится, например, интерфейс 2006 года и нужны их функции, оставьте их включёнными.","Custom Image Page":"Своя страница картинок","On:":"Вкл.:","Off:":"Выкл.:","On":"Вкл.","Off":"Выкл.","Gplex creates it's own image page, which can have some bugs.":"Gplex создаёт собственную страницу картинок, в которой возможны ошибки.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex использует обычную страницу картинок Google: у неё больше функций, но она не оформлена под выбранный макет.","\"Force load results\" message":"Сообщение «Принудительная загрузка результатов»","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Если Gplex не находит на странице достаточно результатов, он ждёт несколько секунд в надежде найти больше и показывает сообщение с возможностью загрузить результаты досрочно. Теоретически надёжнее при медленном соединении.","When Gplex would normally show the message, it will instead force load the results automatically.":"Когда Gplex должен был бы показать сообщение, он вместо этого загружает результаты автоматически.","Gplex Settings button":"Кнопка настроек Gplex","Choose whether or not to display a link to this page on the topbar.":"Показывать ли ссылку на эту страницу в верхней панели.","Display name":"Отображаемое имя","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"В некоторых макетах (в основном старых) показывается имя. Изначально отображался ваш адрес электронной почты, но можно показывать имя пользователя. На меню аккаунта это не влияет.","Google+ custom link":"Своя ссылка Google+","Invalid URL.":"Недопустимый URL.","You have unsaved changes. Press enter to save.":"Есть несохранённые изменения. Нажмите Enter, чтобы сохранить.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Своя ссылка для кнопок Google+, например +Вы в gbar или верхней панели некоторых макетов. По умолчанию",", which redirects to a notice that Google+ has been discontinued.":", которая ведёт на уведомление о закрытии Google+.","Choose whether or not to show AI overviews in search results.":"Показывать ли обзоры от ИИ в результатах поиска.","Save Settings":"Сохранить настройки","Settings are automatically saved. There is no need to manually save.":"Настройки сохраняются автоматически. Сохранять вручную не нужно.","Off (hide info cards)":"Выкл. (скрыть карточки)","Off (compatible with the Google Images Restored extension)":"Выкл. (совместимо с расширением Google Images Restored)","Off (experimental fast mode, not recommended)":"Выкл. (экспериментальный быстрый режим, не рекомендуется)","Username":"Имя пользователя","Email":"Эл. почта","None (it will say \"account\" instead)":"Нет (будет написано «аккаунт»)","Never show":"Никогда не показывать","Always show":"Всегда показывать","Show on hover":"Показывать при наведении","Search the web using Google":"Искать в Интернете с Google","Search the web using Google!":"Искать в Интернете с Google!","Personalized Home":"Персональная главная страница","Language, Display, & Filtering Options":"Настройки языка, отображения и фильтрации","Results":"Результаты","of about":"из примерно","for":"для","seconds.":"сек.","Searched the web for":"Поиск в Интернете:","Searched news for":"Поиск в новостях:","Searched images for":"Поиск картинок:","Result Page:":"Страница результатов:",". Search took":". Время поиска:","image":"картинка"},"p":{"loading":"Загрузка... найдено результатов: {n}","early":"начало {y}","late":"конец {y}","stanford":" (Стэнфорд)","legacy":" (версия для старых браузеров)","cardified":" (эксперимент с карточками)","material":" (своя версия Material)","now":" (современный вид, 0,0000 % ИИ)","searching":"Поиск по {n} веб-страницам","matches":"Найдено совпадений: {n}"}},"zh-CN":{"s":{"Web":"网页","Images":"图片","Videos":"视频","Video":"视频","News":"资讯","Maps":"地图","More":"更多","more":"更多","more »":"更多 »","Even More":"还有更多","Even more from Google":"Google 的更多服务","Everything":"所有结果","All":"全部","Search":"搜索","Settings":"设置","Search settings":"搜索设置","Advanced search":"高级搜索","Advanced Search":"高级搜索","Language tools":"语言工具","Language Tools":"语言工具","Preferences":"使用偏好","Search Help":"搜索帮助","Search Tips":"搜索技巧","Send feedback":"发送反馈","Give us feedback":"向我们提供反馈","Google Search":"Google 搜索","I'm Feeling Lucky":"手气不错","I'm feeling lucky":"手气不错","Search Images":"搜索图片","Search Video":"搜索视频","Sign in":"登录","Sign out":"退出","Account":"帐号","My Account":"我的帐号","Add account":"添加帐号","Your profile":"您的个人资料","Change photo":"更换照片","Privacy":"隐私权","Terms":"条款","Privacy & Terms":"隐私权和条款","About":"关于 Google","About Google":"关于 Google","Advertising":"广告","Advertising Programs":"广告计划","Advertise with Us":"在 Google 投放广告","Business":"商务","Business Solutions":"商务解决方案","Services & Tools":"服务和工具","Jobs, Press, & Help":"招聘、新闻和帮助","Google Home":"Google 首页","Next":"下一页","Prev":"上一页","Any time":"时间不限","Past hour":"过去 1 小时内","Past day":"过去 24 小时内","Past week":"过去 1 周内","Past month":"过去 1 个月内","Past year":"过去 1 年内","All results":"所有结果","Verbatim":"字词匹配","Cached":"网页快照","Similar pages":"类似结果","Dissatisfied with your search results?":"对搜索结果不满意?","Help us improve.":"帮助我们改进。","Search within results":"在结果中搜索","Loading...":"正在加载...","Generating...":"正在生成...","Opening...":"正在打开...","Loading more results…":"正在加载更多结果…","Show more":"显示更多","Show less":"收起","Dismiss":"关闭","Share":"分享","Translate":"翻译","AI Overview":"AI 概览","AI Overviews":"AI 概览","An AI Overview is not available for this search":"此搜索没有可用的 AI 概览","All caught up!":"已全部看完!","Previously read":"已读","Did you mean:":"您是不是要找:","Showing results for":"以下显示的是","Search instead for":"仍然搜索","Currently showing personal results":"正在显示个人搜索结果","Hide personal results":"隐藏个人搜索结果","Not enough results found. Results will load in a few seconds...":"未找到足够的结果。结果将在几秒钟后加载...","Force-load results now":"立即加载结果","View image":"查看图片","Visit page":"访问网页","Size of the preview image. Actual image may be larger.":"预览图片的尺寸。实际图片可能更大。","Size of the preview image. Actual image size may be larger.":"预览图片的尺寸。实际图片尺寸可能更大。","Search by image":"按图片搜索","Search by image (Google Lens)":"按图片搜索(Google 智能镜头)","Google Lens":"Google 智能镜头","Search any image with Google Lens":"使用 Google 智能镜头搜索任意图片","Search Google with an image instead of text. Try dragging an image here.":"使用图片而非文字进行 Google 搜索。试试将图片拖到这里。","Paste image URL":"粘贴图片网址","Upload an image":"上传图片","Choose File":"选择文件","No file chosen":"未选择任何文件","Drag an image here or":"将图片拖到这里,或","upload a file":"上传文件","OR":"或","Paste image link":"粘贴图片链接","Remove image":"移除图片","Close":"关闭","Visually similar images":"外观类似的图片","Visual matches":"视觉匹配结果","Pages that include matching images":"包含匹配图片的网页","Image size:":"图片尺寸:","Calendar":"日历","Contacts":"通讯录","Docs":"文档","Photos":"相册","Shopping":"购物","Finance":"财经","Books":"图书","Groups":"网上论坛","Directory":"目录","Wallet":"钱包","Drive":"云端硬盘","Google+ notifications":"Google+ 通知","Cannot connect to Google+.":"无法连接到 Google+。","Gplex Settings":"Gplex 设置","Google Images":"Google 图片","Google Videos":"Google 视频","Google Search by image":"Google 按图片搜索","Layout":"布局","You can also change this setting by searching for \"Google in [year]\".":"您也可以通过搜索“Google in [年份]”来更改此设置。","Info Cards":"信息卡片","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"信息卡片于 2012 年推出,因此如果追求完全还原,建议在 2011 年底至 2012 年初及更早的布局中停用它。但如果您只是喜欢 2006 年等的界面,并希望使用它提供的功能,请保持开启。","Custom Image Page":"自定义图片页","On:":"开启:","Off:":"关闭:","On":"开启","Off":"关闭","Gplex creates it's own image page, which can have some bugs.":"Gplex 会创建自己的图片页,可能存在一些错误。","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex 使用常规的 Google 图片页,功能更完善,但不会根据布局调整样式。","\"Force load results\" message":"“强制加载结果”消息","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"当 Gplex 在页面中找不到足够的结果时,会等待几秒钟以期找到更多结果,并显示一条消息,提供提前强制加载结果的选项。理论上在慢速网络下更可靠。","When Gplex would normally show the message, it will instead force load the results automatically.":"在 Gplex 通常会显示该消息时,改为自动强制加载结果。","Gplex Settings button":"Gplex 设置按钮","Choose whether or not to display a link to this page on the topbar.":"选择是否在顶栏显示指向此页面的链接。","Display name":"显示名称","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"某些布局(通常是较旧的布局)会显示名称。最初显示的是您的电子邮件地址,但您可以改为显示用户名。这不会影响帐号菜单。","Google+ custom link":"Google+ 自定义链接","Invalid URL.":"网址无效。","You have unsaved changes. Press enter to save.":"您有未保存的更改。按 Enter 键保存。","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Google+ 按钮的自定义链接,例如 gbar 上的 +You 或某些布局的顶栏。默认为",", which redirects to a notice that Google+ has been discontinued.":",它会重定向到 Google+ 已停止服务的通知。","Choose whether or not to show AI overviews in search results.":"选择是否在搜索结果中显示 AI 概览。","Save Settings":"保存设置","Settings are automatically saved. There is no need to manually save.":"设置会自动保存,无需手动保存。","Off (hide info cards)":"关闭(隐藏信息卡片)","Off (compatible with the Google Images Restored extension)":"关闭(兼容 Google Images Restored 扩展程序)","Off (experimental fast mode, not recommended)":"关闭(实验性快速模式,不推荐)","Username":"用户名","Email":"电子邮件","None (it will say \"account\" instead)":"无(将显示“帐号”)","Never show":"从不显示","Always show":"始终显示","Show on hover":"悬停时显示","Search the web using Google":"使用 Google 搜索网络","Search the web using Google!":"使用 Google 搜索网络!","Personalized Home":"个性化首页","Language, Display, & Filtering Options":"语言、显示和过滤选项","image":"图片"},"p":{"loading":"正在加载... 已找到 {n} 条结果","early":"{y} 年初","late":"{y} 年底","stanford":"(斯坦福)","legacy":"(旧版浏览器版本)","cardified":"(卡片化实验)","material":"(自定义 Material 版)","now":"(当前外观,0.0000% AI)","searching":"搜索 {n} 个网页","matches":"找到 {n} 个匹配结果"}},"zh-TW":{"s":{"Web":"網頁","Images":"圖片","Videos":"影片","Video":"影片","News":"新聞","Maps":"地圖","More":"更多","more":"更多","more »":"更多 »","Even More":"還有更多","Even more from Google":"Google 的更多服務","Everything":"全部","All":"全部","Search":"搜尋","Settings":"設定","Search settings":"搜尋設定","Advanced search":"進階搜尋","Advanced Search":"進階搜尋","Language tools":"語言工具","Language Tools":"語言工具","Preferences":"使用偏好","Search Help":"搜尋說明","Search Tips":"搜尋秘訣","Send feedback":"提供意見","Give us feedback":"提供意見","Google Search":"Google 搜尋","I'm Feeling Lucky":"好手氣","I'm feeling lucky":"好手氣","Search Images":"搜尋圖片","Search Video":"搜尋影片","Sign in":"登入","Sign out":"登出","Account":"帳戶","My Account":"我的帳戶","Add account":"新增帳戶","Your profile":"你的個人資料","Change photo":"變更相片","Privacy":"隱私權","Terms":"條款","Privacy & Terms":"隱私權與條款","About":"關於 Google","About Google":"關於 Google","Advertising":"廣告","Advertising Programs":"廣告計劃","Advertise with Us":"在 Google 刊登廣告","Business":"商務","Business Solutions":"商業解決方案","Services & Tools":"服務與工具","Jobs, Press, & Help":"工作機會、新聞與說明","Google Home":"Google 首頁","Next":"下一頁","Prev":"上一頁","Any time":"不限時間","Past hour":"過去 1 小時","Past day":"過去 24 小時","Past week":"過去 1 週","Past month":"過去 1 個月","Past year":"過去 1 年","All results":"所有結果","Verbatim":"一字不差","Cached":"頁庫存檔","Similar pages":"類似網頁","Dissatisfied with your search results?":"對搜尋結果不滿意嗎?","Help us improve.":"協助我們改善。","Search within results":"在結果中搜尋","Loading...":"載入中...","Generating...":"正在產生...","Opening...":"正在開啟...","Loading more results…":"正在載入更多結果…","Show more":"顯示更多","Show less":"顯示較少","Dismiss":"關閉","Share":"分享","Translate":"翻譯","AI Overview":"AI 摘要","AI Overviews":"AI 摘要","An AI Overview is not available for this search":"這項搜尋沒有 AI 摘要","All caught up!":"你已看完所有內容!","Previously read":"已讀","Did you mean:":"你是不是要查:","Showing results for":"顯示的是以下查詢字詞的搜尋結果:","Search instead for":"改為搜尋","Currently showing personal results":"目前顯示個人搜尋結果","Hide personal results":"隱藏個人搜尋結果","Not enough results found. Results will load in a few seconds...":"找不到足夠的結果。結果將在幾秒後載入...","Force-load results now":"立即載入結果","View image":"查看圖片","Visit page":"造訪網頁","Size of the preview image. Actual image may be larger.":"預覽圖片的大小。實際圖片可能更大。","Size of the preview image. Actual image size may be larger.":"預覽圖片的大小。實際圖片大小可能更大。","Search by image":"以圖搜尋","Search by image (Google Lens)":"以圖搜尋(Google 智慧鏡頭)","Google Lens":"Google 智慧鏡頭","Search any image with Google Lens":"使用 Google 智慧鏡頭搜尋任何圖片","Search Google with an image instead of text. Try dragging an image here.":"使用圖片而非文字進行 Google 搜尋。試著將圖片拖曳到這裡。","Paste image URL":"貼上圖片網址","Upload an image":"上傳圖片","Choose File":"選擇檔案","No file chosen":"未選擇任何檔案","Drag an image here or":"將圖片拖曳到這裡,或","upload a file":"上傳檔案","OR":"或","Paste image link":"貼上圖片連結","Remove image":"移除圖片","Close":"關閉","Visually similar images":"外觀類似的圖片","Visual matches":"視覺相符項目","Pages that include matching images":"包含相符圖片的網頁","Image size:":"圖片大小:","Calendar":"日曆","Contacts":"聯絡人","Docs":"文件","Photos":"相簿","Shopping":"購物","Finance":"財經","Books":"圖書","Groups":"網上論壇","Directory":"目錄","Wallet":"錢包","Drive":"雲端硬碟","Google+ notifications":"Google+ 通知","Cannot connect to Google+.":"無法連線至 Google+。","Gplex Settings":"Gplex 設定","Google Images":"Google 圖片","Google Videos":"Google 影片","Google Search by image":"Google 以圖搜尋","Layout":"版面配置","You can also change this setting by searching for \"Google in [year]\".":"你也可以搜尋「Google in [年份]」來變更這項設定。","Info Cards":"資訊卡","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"資訊卡於 2012 年推出,因此若要完全還原,建議在 2011 年底至 2012 年初及更早的版面停用。但如果你只是喜歡 2006 年等的介面,又想使用它提供的功能,請保持開啟。","Custom Image Page":"自訂圖片頁面","On:":"開啟:","Off:":"關閉:","On":"開啟","Off":"關閉","Gplex creates it's own image page, which can have some bugs.":"Gplex 會建立自己的圖片頁面,可能會有一些錯誤。","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex 使用一般的 Google 圖片頁面,功能較完整,但不會依版面配置調整樣式。","\"Force load results\" message":"「強制載入結果」訊息","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"當 Gplex 在頁面中找不到足夠的結果時,會等待幾秒希望找到更多結果,並顯示一則訊息,提供提前強制載入結果的選項。理論上在慢速連線時更可靠。","When Gplex would normally show the message, it will instead force load the results automatically.":"在 Gplex 通常會顯示該訊息時,改為自動強制載入結果。","Gplex Settings button":"Gplex 設定按鈕","Choose whether or not to display a link to this page on the topbar.":"選擇是否在頂端列顯示這個頁面的連結。","Display name":"顯示名稱","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"部分版面(通常是較舊的版面)會顯示名稱。原本顯示的是你的電子郵件地址,但你可以改為顯示使用者名稱。這不會影響帳戶選單。","Google+ custom link":"Google+ 自訂連結","Invalid URL.":"網址無效。","You have unsaved changes. Press enter to save.":"你有尚未儲存的變更。按下 Enter 鍵即可儲存。","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Google+ 按鈕的自訂連結,例如 gbar 上的 +You 或部分版面的頂端列。預設為",", which redirects to a notice that Google+ has been discontinued.":",會重新導向至 Google+ 已停止服務的通知。","Choose whether or not to show AI overviews in search results.":"選擇是否在搜尋結果中顯示 AI 摘要。","Save Settings":"儲存設定","Settings are automatically saved. There is no need to manually save.":"設定會自動儲存,不需要手動儲存。","Off (hide info cards)":"關閉(隱藏資訊卡)","Off (compatible with the Google Images Restored extension)":"關閉(相容於 Google Images Restored 擴充功能)","Off (experimental fast mode, not recommended)":"關閉(實驗性快速模式,不建議使用)","Username":"使用者名稱","Email":"電子郵件","None (it will say \"account\" instead)":"無(將顯示「帳戶」)","Never show":"永不顯示","Always show":"一律顯示","Show on hover":"游標停留時顯示","Search the web using Google":"使用 Google 搜尋網路","Search the web using Google!":"使用 Google 搜尋網路!","Personalized Home":"個人化首頁","Language, Display, & Filtering Options":"語言、顯示和篩選選項","image":"圖片"},"p":{"loading":"載入中... 已找到 {n} 筆結果","early":"{y} 年初","late":"{y} 年底","stanford":"(史丹佛)","legacy":"(舊版瀏覽器版本)","cardified":"(卡片化實驗)","material":"(自訂 Material 版)","now":"(現今外觀,0.0000% AI)","searching":"搜尋 {n} 個網頁","matches":"找到 {n} 個相符結果"}},"ko":{"s":{"Web":"웹","Images":"이미지","Videos":"동영상","Video":"동영상","News":"뉴스","Maps":"지도","More":"더보기","more":"더보기","more »":"더보기 »","Even More":"더보기","Even more from Google":"Google 서비스 더보기","Everything":"전체","All":"전체","Search":"검색","Settings":"설정","Search settings":"검색 설정","Advanced search":"고급검색","Advanced Search":"고급검색","Language tools":"언어 도구","Language Tools":"언어 도구","Preferences":"환경설정","Search Help":"검색 도움말","Search Tips":"검색 도움말","Send feedback":"의견 보내기","Give us feedback":"의견 보내기","Google Search":"Google 검색","I'm feeling lucky":"I'm Feeling Lucky","Search Images":"이미지 검색","Search Video":"동영상 검색","Sign in":"로그인","Sign out":"로그아웃","Account":"계정","My Account":"내 계정","Add account":"계정 추가","Your profile":"내 프로필","Change photo":"사진 변경","Privacy":"개인정보처리방침","Terms":"약관","Privacy & Terms":"개인정보처리방침 및 약관","About":"Google 정보","About Google":"Google 정보","Advertising":"광고","Advertising Programs":"광고 프로그램","Advertise with Us":"Google 광고","Business":"비즈니스","Business Solutions":"비즈니스 솔루션","Services & Tools":"서비스 및 도구","Jobs, Press, & Help":"채용, 보도자료, 도움말","Google Home":"Google 홈","Next":"다음","Prev":"이전","Any time":"모든 날짜","Past hour":"지난 1시간","Past day":"지난 1일","Past week":"지난 1주","Past month":"지난 1개월","Past year":"지난 1년","All results":"모든 결과","Verbatim":"완전 일치","Cached":"저장된 페이지","Similar pages":"유사한 페이지","Dissatisfied with your search results?":"검색결과가 만족스럽지 않으신가요?","Help us improve.":"개선에 참여해 주세요.","Search within results":"결과 내 검색","Loading...":"로드 중...","Generating...":"생성 중...","Opening...":"여는 중...","Loading more results…":"결과 더 로드 중…","Show more":"더보기","Show less":"간략히 보기","Dismiss":"닫기","Share":"공유","Translate":"번역","AI Overview":"AI 개요","AI Overviews":"AI 개요","An AI Overview is not available for this search":"이 검색어에 대해 제공되는 AI 개요가 없습니다","All caught up!":"모두 확인했습니다!","Previously read":"이전에 읽음","Did you mean:":"이것을 찾으셨나요?","Showing results for":"다음에 대한 검색결과 표시:","Search instead for":"대신 다음 검색어로 검색:","Currently showing personal results":"현재 개인 검색결과를 표시하는 중","Hide personal results":"개인 검색결과 숨기기","Not enough results found. Results will load in a few seconds...":"검색결과를 충분히 찾지 못했습니다. 몇 초 후에 결과가 로드됩니다...","Force-load results now":"지금 결과 로드","View image":"이미지 보기","Visit page":"페이지 방문","Size of the preview image. Actual image may be larger.":"미리보기 이미지 크기입니다. 실제 이미지는 더 클 수 있습니다.","Size of the preview image. Actual image size may be larger.":"미리보기 이미지 크기입니다. 실제 이미지 크기는 더 클 수 있습니다.","Search by image":"이미지로 검색","Search by image (Google Lens)":"이미지로 검색(Google 렌즈)","Google Lens":"Google 렌즈","Search any image with Google Lens":"Google 렌즈로 모든 이미지 검색","Search Google with an image instead of text. Try dragging an image here.":"텍스트 대신 이미지로 Google을 검색하세요. 여기에 이미지를 드래그해 보세요.","Paste image URL":"이미지 URL 붙여넣기","Upload an image":"이미지 업로드","Choose File":"파일 선택","No file chosen":"선택된 파일 없음","Drag an image here or":"여기에 이미지를 드래그하거나","upload a file":"파일 업로드","OR":"또는","Paste image link":"이미지 링크 붙여넣기","Remove image":"이미지 삭제","Close":"닫기","Visually similar images":"시각적으로 유사한 이미지","Visual matches":"시각적 일치 항목","Pages that include matching images":"일치하는 이미지가 포함된 페이지","Image size:":"이미지 크기:","Calendar":"캘린더","Contacts":"주소록","Docs":"문서","Photos":"포토","Shopping":"쇼핑","Finance":"금융","Books":"도서","Groups":"그룹스","Directory":"디렉토리","Wallet":"월렛","Drive":"드라이브","Google+ notifications":"Google+ 알림","Cannot connect to Google+.":"Google+에 연결할 수 없습니다.","Gplex Settings":"Gplex 설정","Google Images":"Google 이미지","Google Videos":"Google 동영상","Google Search by image":"Google 이미지로 검색","Layout":"레이아웃","You can also change this setting by searching for \"Google in [year]\".":"\"Google in [연도]\"를 검색해 이 설정을 변경할 수도 있습니다.","Info Cards":"정보 카드","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"정보 카드는 2012년에 추가되었으므로, 완벽한 재현을 원한다면 2011년 말~2012년 초 및 그 이전 레이아웃에서는 사용 중지하는 것이 좋습니다. 하지만 2006년 등의 UI가 좋고 해당 기능도 사용하고 싶다면 켜 두세요.","Custom Image Page":"맞춤 이미지 페이지","On:":"사용:","Off:":"사용 안함:","On":"사용","Off":"사용 안함","Gplex creates it's own image page, which can have some bugs.":"Gplex가 자체 이미지 페이지를 만듭니다. 일부 버그가 있을 수 있습니다.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex가 일반 Google 이미지 페이지를 사용합니다. 기능은 더 좋지만 레이아웃에 맞는 스타일은 적용되지 않습니다.","\"Force load results\" message":"\"결과 강제 로드\" 메시지","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Gplex가 페이지에서 충분한 결과를 찾지 못하면 더 많은 결과를 찾기 위해 몇 초 동안 기다리고, 결과를 먼저 강제 로드할 수 있는 옵션이 포함된 메시지를 표시합니다. 이론상 느린 연결에서 더 안정적입니다.","When Gplex would normally show the message, it will instead force load the results automatically.":"Gplex가 평소 메시지를 표시할 때 대신 결과를 자동으로 강제 로드합니다.","Gplex Settings button":"Gplex 설정 버튼","Choose whether or not to display a link to this page on the topbar.":"상단 바에 이 페이지로 가는 링크를 표시할지 선택합니다.","Display name":"표시 이름","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"일부 레이아웃(주로 오래된 레이아웃)에는 표시 이름이 있습니다. 원래는 이메일 주소가 표시되었지만 대신 사용자 이름을 표시할 수 있습니다. 계정 메뉴에는 영향을 주지 않습니다.","Google+ custom link":"Google+ 맞춤 링크","Invalid URL.":"잘못된 URL입니다.","You have unsaved changes. Press enter to save.":"저장되지 않은 변경사항이 있습니다. Enter 키를 눌러 저장하세요.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"gbar의 +You나 일부 레이아웃의 상단 바 등 Google+ 버튼의 맞춤 링크입니다. 기본값은",", which redirects to a notice that Google+ has been discontinued.":"이며, Google+ 서비스 종료 안내로 리디렉션됩니다.","Choose whether or not to show AI overviews in search results.":"검색결과에 AI 개요를 표시할지 선택합니다.","Save Settings":"설정 저장","Settings are automatically saved. There is no need to manually save.":"설정은 자동으로 저장됩니다. 직접 저장할 필요가 없습니다.","Off (hide info cards)":"사용 안함(정보 카드 숨기기)","Off (compatible with the Google Images Restored extension)":"사용 안함(Google Images Restored 확장 프로그램과 호환)","Off (experimental fast mode, not recommended)":"사용 안함(실험용 빠른 모드, 권장하지 않음)","Username":"사용자 이름","Email":"이메일","None (it will say \"account\" instead)":"없음(대신 \"계정\"으로 표시)","Never show":"표시 안함","Always show":"항상 표시","Show on hover":"마우스를 올리면 표시","Search the web using Google":"Google로 웹 검색","Search the web using Google!":"Google로 웹 검색!","Personalized Home":"맞춤 홈","Language, Display, & Filtering Options":"언어, 표시 및 필터링 옵션","image":"이미지"},"p":{"loading":"로드 중... 결과 {n}개 찾음","early":"{y}년 초","late":"{y}년 말","stanford":" (스탠퍼드)","legacy":" (구형 브라우저 버전)","cardified":" (카드형 실험)","material":" (맞춤 머티리얼 버전)","now":" (현재 디자인, AI 0.0000%)","searching":"{n}개의 웹페이지 검색","matches":"일치 항목 {n}개 찾음"}},"nl":{"s":{"Web":"Internet","Images":"Afbeeldingen","Videos":"Video's","News":"Nieuws","More":"Meer","more":"meer","more »":"meer »","Even More":"Nog meer","Even more from Google":"Nog meer van Google","Everything":"Alles","All":"Alle","Search":"Zoeken","Settings":"Instellingen","Search settings":"Zoekinstellingen","Advanced search":"Geavanceerd zoeken","Advanced Search":"Geavanceerd zoeken","Language tools":"Taalhulpmiddelen","Language Tools":"Taalhulpmiddelen","Preferences":"Voorkeuren","Search Help":"Zoekhulp","Search Tips":"Zoektips","Send feedback":"Feedback sturen","Give us feedback":"Geef ons feedback","Google Search":"Google zoeken","I'm Feeling Lucky":"Ik doe een gok","I'm feeling lucky":"Ik doe een gok","Search Images":"Afbeeldingen zoeken","Search Video":"Video's zoeken","Sign in":"Inloggen","Sign out":"Uitloggen","My Account":"Mijn account","Add account":"Account toevoegen","Your profile":"Je profiel","Change photo":"Foto wijzigen","Terms":"Voorwaarden","Privacy & Terms":"Privacy en voorwaarden","About":"Over","About Google":"Alles over Google","Advertising":"Adverteren","Advertising Programs":"Advertentieprogramma's","Advertise with Us":"Adverteren bij Google","Business":"Bedrijf","Business Solutions":"Bedrijfsoplossingen","Services & Tools":"Services en tools","Jobs, Press, & Help":"Vacatures, pers en help","Google Home":"Google-startpagina","Next":"Volgende","Prev":"Vorige","Any time":"Wanneer dan ook","Past hour":"Afgelopen uur","Past day":"Afgelopen 24 uur","Past week":"Afgelopen week","Past month":"Afgelopen maand","Past year":"Afgelopen jaar","All results":"Alle resultaten","Verbatim":"Letterlijk","Cached":"In cache","Similar pages":"Vergelijkbare pagina's","Dissatisfied with your search results?":"Niet tevreden met je zoekresultaten?","Help us improve.":"Help ons verbeteren.","Search within results":"Zoeken in resultaten","Loading...":"Laden...","Generating...":"Genereren...","Opening...":"Openen...","Loading more results…":"Meer resultaten laden…","Show more":"Meer tonen","Show less":"Minder tonen","Dismiss":"Sluiten","Share":"Delen","Translate":"Vertalen","AI Overview":"AI-overzicht","AI Overviews":"AI-overzichten","An AI Overview is not available for this search":"Er is geen AI-overzicht beschikbaar voor deze zoekopdracht","All caught up!":"Je bent helemaal bij!","Previously read":"Eerder gelezen","Did you mean:":"Bedoelde je:","Showing results for":"Resultaten voor","Search instead for":"In plaats daarvan zoeken naar","Currently showing personal results":"Persoonlijke resultaten worden getoond","Hide personal results":"Persoonlijke resultaten verbergen","Not enough results found. Results will load in a few seconds...":"Niet genoeg resultaten gevonden. De resultaten worden over een paar seconden geladen...","Force-load results now":"Resultaten nu laden","View image":"Afbeelding bekijken","Visit page":"Pagina bezoeken","Size of the preview image. Actual image may be larger.":"Grootte van de voorbeeldafbeelding. De echte afbeelding kan groter zijn.","Size of the preview image. Actual image size may be larger.":"Grootte van de voorbeeldafbeelding. De echte afbeelding kan groter zijn.","Search by image":"Zoeken op afbeelding","Search by image (Google Lens)":"Zoeken op afbeelding (Google Lens)","Search any image with Google Lens":"Zoek elke afbeelding met Google Lens","Search Google with an image instead of text. Try dragging an image here.":"Zoek met Google op een afbeelding in plaats van tekst. Sleep hier een afbeelding naartoe.","Paste image URL":"URL van afbeelding plakken","Upload an image":"Een afbeelding uploaden","Choose File":"Bestand kiezen","No file chosen":"Geen bestand gekozen","Drag an image here or":"Sleep een afbeelding hierheen of","upload a file":"upload een bestand","OR":"OF","Paste image link":"Link naar afbeelding plakken","Remove image":"Afbeelding verwijderen","Close":"Sluiten","Visually similar images":"Visueel vergelijkbare afbeeldingen","Visual matches":"Visuele overeenkomsten","Pages that include matching images":"Pagina's met overeenkomende afbeeldingen","Image size:":"Afbeeldingsgrootte:","Calendar":"Agenda","Contacts":"Contacten","Docs":"Documenten","Photos":"Foto's","Finance":"Financiën","Books":"Boeken","Groups":"Discussiegroepen","Directory":"Gids","Google+ notifications":"Google+ meldingen","Cannot connect to Google+.":"Kan geen verbinding maken met Google+.","Gplex Settings":"Gplex-instellingen","Google Images":"Google Afbeeldingen","Google Videos":"Google Video's","Google Search by image":"Google zoeken op afbeelding","Layout":"Indeling","You can also change this setting by searching for \"Google in [year]\".":"Je kunt deze instelling ook wijzigen door te zoeken op \"Google in [jaar]\".","Info Cards":"Infokaarten","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Infokaarten zijn in 2012 toegevoegd, dus voor volledige nauwkeurigheid zou ik ze uitzetten bij eind 2011-begin 2012 en ouder. Maar als je gewoon van de interface van bijvoorbeeld 2006 houdt en hun functies wilt, laat ze dan aan.","Custom Image Page":"Eigen afbeeldingenpagina","On:":"Aan:","Off:":"Uit:","On":"Aan","Off":"Uit","Gplex creates it's own image page, which can have some bugs.":"Gplex maakt een eigen afbeeldingenpagina, die wat bugs kan hebben.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex gebruikt de gewone afbeeldingenpagina van Google, die meer functies heeft maar niet in de stijl van de indeling is.","\"Force load results\" message":"Melding 'Resultaten geforceerd laden'","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Als Gplex niet genoeg resultaten op de pagina vindt, wacht het een paar seconden in de hoop meer te vinden en toont het een melding met de optie om de resultaten eerder te laden. Theoretisch betrouwbaarder bij trage verbindingen.","When Gplex would normally show the message, it will instead force load the results automatically.":"Wanneer Gplex normaal de melding zou tonen, laadt het de resultaten in plaats daarvan automatisch.","Gplex Settings button":"Knop Gplex-instellingen","Choose whether or not to display a link to this page on the topbar.":"Kies of er een link naar deze pagina in de bovenbalk moet staan.","Display name":"Weergavenaam","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Sommige indelingen (meestal oudere) tonen een naam. Oorspronkelijk werd je e-mailadres getoond, maar je kunt ook je gebruikersnaam laten zien. Dit heeft geen invloed op accountmenu's.","Google+ custom link":"Aangepaste Google+ link","Invalid URL.":"Ongeldige URL.","You have unsaved changes. Press enter to save.":"Je hebt niet-opgeslagen wijzigingen. Druk op Enter om op te slaan.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Aangepaste link voor Google+ knoppen, zoals +Jij in de gbar of de bovenbalk in bepaalde indelingen. Standaard is dit",", which redirects to a notice that Google+ has been discontinued.":", dat doorverwijst naar een melding dat Google+ is stopgezet.","Choose whether or not to show AI overviews in search results.":"Kies of AI-overzichten in zoekresultaten worden getoond.","Save Settings":"Instellingen opslaan","Settings are automatically saved. There is no need to manually save.":"Instellingen worden automatisch opgeslagen. Handmatig opslaan is niet nodig.","Off (hide info cards)":"Uit (infokaarten verbergen)","Off (compatible with the Google Images Restored extension)":"Uit (compatibel met de extensie Google Images Restored)","Off (experimental fast mode, not recommended)":"Uit (experimentele snelle modus, niet aanbevolen)","Username":"Gebruikersnaam","Email":"E-mail","None (it will say \"account\" instead)":"Geen (in plaats daarvan staat er \"account\")","Never show":"Nooit tonen","Always show":"Altijd tonen","Show on hover":"Tonen bij aanwijzen","Search the web using Google":"Zoek op het web met Google","Search the web using Google!":"Zoek op het web met Google!","Personalized Home":"Persoonlijke startpagina","Language, Display, & Filtering Options":"Opties voor taal, weergave en filters","Results":"Resultaten","of about":"van ongeveer","for":"voor","seconds.":"seconden.","Searched the web for":"Gezocht op het web naar","Searched news for":"Gezocht in nieuws naar","Searched images for":"Gezocht in afbeeldingen naar","Result Page:":"Resultatenpagina:",". Search took":". Zoektijd:","image":"afbeelding"},"p":{"loading":"Laden... {n} resultaten gevonden","early":"begin {y}","late":"eind {y}","stanford":" (Stanford)","legacy":" (versie voor oude browsers)","cardified":" (kaarten-experiment)","material":" (aangepaste Material-versie)","now":" (Huidige uiterlijk, 0,0000% AI)","searching":"{n} webpagina's doorzocht","matches":"{n} overeenkomsten gevonden"}},"pl":{"s":{"Web":"Sieć","Images":"Grafika","Videos":"Wideo","Video":"Wideo","News":"Wiadomości","Maps":"Mapy","More":"Więcej","more":"więcej","more »":"więcej »","Even More":"Jeszcze więcej","Even more from Google":"Jeszcze więcej od Google","Everything":"Wszystko","All":"Wszystko","Search":"Szukaj","Settings":"Ustawienia","Search settings":"Ustawienia wyszukiwania","Advanced search":"Wyszukiwanie zaawansowane","Advanced Search":"Wyszukiwanie zaawansowane","Language tools":"Narzędzia językowe","Language Tools":"Narzędzia językowe","Preferences":"Ustawienia","Search Help":"Pomoc wyszukiwania","Search Tips":"Wskazówki","Send feedback":"Prześlij opinię","Give us feedback":"Prześlij nam opinię","Google Search":"Szukaj w Google","I'm Feeling Lucky":"Szczęśliwy traf","I'm feeling lucky":"Szczęśliwy traf","Search Images":"Szukaj grafik","Search Video":"Szukaj wideo","Sign in":"Zaloguj się","Sign out":"Wyloguj się","Account":"Konto","My Account":"Moje konto","Add account":"Dodaj konto","Your profile":"Twój profil","Change photo":"Zmień zdjęcie","Privacy":"Prywatność","Terms":"Warunki","Privacy & Terms":"Prywatność i warunki","About":"Informacje","About Google":"Wszystko o Google","Advertising":"Reklamuj się","Advertising Programs":"Programy reklamowe","Advertise with Us":"Reklamuj się w Google","Business":"Dla firm","Business Solutions":"Rozwiązania dla firm","Services & Tools":"Usługi i narzędzia","Jobs, Press, & Help":"Praca, prasa i pomoc","Google Home":"Strona główna Google","Next":"Następna","Prev":"Poprzednia","Any time":"Dowolny czas","Past hour":"Ostatnia godzina","Past day":"Ostatnie 24 godziny","Past week":"Ostatni tydzień","Past month":"Ostatni miesiąc","Past year":"Ostatni rok","All results":"Wszystkie wyniki","Verbatim":"Dosłownie","Cached":"Kopia","Similar pages":"Podobne strony","Dissatisfied with your search results?":"Nie jesteś zadowolony z wyników wyszukiwania?","Help us improve.":"Pomóż nam je ulepszyć.","Search within results":"Szukaj w wynikach","Loading...":"Wczytuję...","Generating...":"Generuję...","Opening...":"Otwieram...","Loading more results…":"Wczytuję więcej wyników…","Show more":"Pokaż więcej","Show less":"Pokaż mniej","Dismiss":"Zamknij","Share":"Udostępnij","Translate":"Przetłumacz","AI Overview":"Przegląd od AI","AI Overviews":"Przeglądy od AI","An AI Overview is not available for this search":"Dla tego wyszukiwania nie ma przeglądu od AI","All caught up!":"Wszystko przeczytane!","Previously read":"Przeczytane","Did you mean:":"Czy chodziło Ci o:","Showing results for":"Wyniki dla","Search instead for":"Zamiast tego szukaj","Currently showing personal results":"Wyświetlane są wyniki osobiste","Hide personal results":"Ukryj wyniki osobiste","Not enough results found. Results will load in a few seconds...":"Nie znaleziono wystarczającej liczby wyników. Wyniki wczytają się za kilka sekund...","Force-load results now":"Wczytaj wyniki teraz","View image":"Wyświetl obraz","Visit page":"Odwiedź stronę","Size of the preview image. Actual image may be larger.":"Rozmiar podglądu. Rzeczywisty obraz może być większy.","Size of the preview image. Actual image size may be larger.":"Rozmiar podglądu. Rzeczywisty rozmiar obrazu może być większy.","Search by image":"Szukaj obrazem","Search by image (Google Lens)":"Szukaj obrazem (Obiektyw Google)","Google Lens":"Obiektyw Google","Search any image with Google Lens":"Wyszukuj dowolny obraz za pomocą Obiektywu Google","Search Google with an image instead of text. Try dragging an image here.":"Szukaj w Google za pomocą obrazu zamiast tekstu. Spróbuj przeciągnąć tutaj obraz.","Paste image URL":"Wklej URL obrazu","Upload an image":"Prześlij obraz","Choose File":"Wybierz plik","No file chosen":"Nie wybrano pliku","Drag an image here or":"Przeciągnij tutaj obraz lub","upload a file":"prześlij plik","OR":"LUB","Paste image link":"Wklej link do obrazu","Remove image":"Usuń obraz","Close":"Zamknij","Visually similar images":"Podobne obrazy","Visual matches":"Dopasowania wizualne","Pages that include matching images":"Strony zawierające pasujące obrazy","Image size:":"Rozmiar obrazu:","Calendar":"Kalendarz","Contacts":"Kontakty","Docs":"Dokumenty","Photos":"Zdjęcia","Shopping":"Zakupy","Finance":"Finanse","Books":"Książki","Groups":"Grupy","Directory":"Katalog","Wallet":"Portfel","Drive":"Dysk","Google+ notifications":"Powiadomienia Google+","Cannot connect to Google+.":"Nie można połączyć się z Google+.","Gplex Settings":"Ustawienia Gplex","Google Images":"Grafika Google","Google Videos":"Wideo Google","Google Search by image":"Wyszukiwanie obrazem Google","Layout":"Układ","You can also change this setting by searching for \"Google in [year]\".":"To ustawienie możesz też zmienić, wyszukując „Google in [rok]\".","Info Cards":"Karty informacyjne","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Karty informacyjne dodano w 2012 roku, więc dla pełnej wierności wyłączyłbym je w układach „koniec 2011 – początek 2012\" i starszych. Ale jeśli po prostu lubisz interfejs np. z 2006 roku i chcesz korzystać z ich funkcji, zostaw je włączone.","Custom Image Page":"Własna strona grafiki","On:":"Wł.:","Off:":"Wył.:","On":"Wł.","Off":"Wył.","Gplex creates it's own image page, which can have some bugs.":"Gplex tworzy własną stronę grafiki, która może mieć błędy.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex używa zwykłej strony grafiki Google, która ma więcej funkcji, ale nie jest dopasowana do stylu układu.","\"Force load results\" message":"Komunikat „Wymuś wczytanie wyników\"","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Gdy Gplex nie znajdzie na stronie wystarczającej liczby wyników, czeka kilka sekund w nadziei na znalezienie kolejnych i pokazuje komunikat z opcją wcześniejszego wymuszenia wczytania. Teoretycznie bardziej niezawodne przy wolnych połączeniach.","When Gplex would normally show the message, it will instead force load the results automatically.":"Gdy Gplex normalnie pokazałby komunikat, zamiast tego automatycznie wymusza wczytanie wyników.","Gplex Settings button":"Przycisk ustawień Gplex","Choose whether or not to display a link to this page on the topbar.":"Zdecyduj, czy na górnym pasku ma być link do tej strony.","Display name":"Wyświetlana nazwa","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Niektóre układy (zwykle starsze) wyświetlają nazwę. Pierwotnie wyświetlany był Twój adres e-mail, ale możesz zamiast tego pokazać nazwę użytkownika. Nie wpływa to na menu konta.","Google+ custom link":"Własny link Google+","Invalid URL.":"Nieprawidłowy URL.","You have unsaved changes. Press enter to save.":"Masz niezapisane zmiany. Naciśnij Enter, aby zapisać.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"Własny link dla przycisków Google+, takich jak +Ty na gbar lub górny pasek w niektórych układach. Domyślnie",", which redirects to a notice that Google+ has been discontinued.":", który przekierowuje do informacji o zamknięciu Google+.","Choose whether or not to show AI overviews in search results.":"Zdecyduj, czy w wynikach wyszukiwania mają się pojawiać przeglądy od AI.","Save Settings":"Zapisz ustawienia","Settings are automatically saved. There is no need to manually save.":"Ustawienia zapisują się automatycznie. Nie trzeba ich zapisywać ręcznie.","Off (hide info cards)":"Wył. (ukryj karty informacyjne)","Off (compatible with the Google Images Restored extension)":"Wył. (zgodne z rozszerzeniem Google Images Restored)","Off (experimental fast mode, not recommended)":"Wył. (eksperymentalny tryb szybki, niezalecany)","Username":"Nazwa użytkownika","Email":"E-mail","None (it will say \"account\" instead)":"Brak (zamiast tego pojawi się „konto\")","Never show":"Nigdy nie pokazuj","Always show":"Zawsze pokazuj","Show on hover":"Pokaż po najechaniu","Search the web using Google":"Szukaj w sieci z Google","Search the web using Google!":"Szukaj w sieci z Google!","Personalized Home":"Spersonalizowana strona główna","Language, Display, & Filtering Options":"Opcje języka, wyświetlania i filtrowania","Results":"Wyniki","of about":"z około","for":"dla","seconds.":"sek.","Searched the web for":"Szukano w sieci:","Searched news for":"Szukano w wiadomościach:","Searched images for":"Szukano w grafice:","Result Page:":"Strona wyników:",". Search took":". Czas wyszukiwania:","image":"obraz"},"p":{"loading":"Wczytuję... znaleziono wyników: {n}","early":"początek {y}","late":"koniec {y}","stanford":" (Stanford)","legacy":" (wersja dla starszych przeglądarek)","cardified":" (eksperyment z kartami)","material":" (własna wersja Material)","now":" (Obecny wygląd, 0,0000% AI)","searching":"Przeszukiwanie {n} stron","matches":"Znaleziono dopasowań: {n}"}},"tr":{"s":{"Images":"Görseller","Videos":"Videolar","News":"Haberler","Maps":"Haritalar","More":"Diğer","more":"diğer","more »":"diğer »","Even More":"Daha fazlası","Even more from Google":"Google'dan daha fazlası","Everything":"Tümü","All":"Tümü","Search":"Ara","Settings":"Ayarlar","Search settings":"Arama ayarları","Advanced search":"Gelişmiş arama","Advanced Search":"Gelişmiş Arama","Language tools":"Dil araçları","Language Tools":"Dil Araçları","Preferences":"Tercihler","Search Help":"Arama Yardımı","Search Tips":"Arama İpuçları","Send feedback":"Geri bildirim gönder","Give us feedback":"Bize geri bildirim gönderin","Google Search":"Google'da Ara","I'm Feeling Lucky":"Kendimi Şanslı Hissediyorum","I'm feeling lucky":"Kendimi şanslı hissediyorum","Search Images":"Görsel Ara","Search Video":"Video Ara","Sign in":"Oturum aç","Sign out":"Oturumu kapat","Account":"Hesap","My Account":"Hesabım","Add account":"Hesap ekle","Your profile":"Profiliniz","Change photo":"Fotoğrafı değiştir","Privacy":"Gizlilik","Terms":"Şartlar","Privacy & Terms":"Gizlilik ve Şartlar","About":"Hakkında","About Google":"Google Hakkında","Advertising":"Reklam","Advertising Programs":"Reklam Programları","Advertise with Us":"Google'da Reklam Verin","Business":"İşletme","Business Solutions":"İşletme Çözümleri","Services & Tools":"Hizmetler ve Araçlar","Jobs, Press, & Help":"İş, Basın ve Yardım","Google Home":"Google Ana Sayfa","Next":"Sonraki","Prev":"Önceki","Any time":"Herhangi bir zaman","Past hour":"Son bir saat","Past day":"Son 24 saat","Past week":"Son bir hafta","Past month":"Son bir ay","Past year":"Son bir yıl","All results":"Tüm sonuçlar","Verbatim":"Kelimesi kelimesine","Cached":"Önbellek","Similar pages":"Benzer sayfalar","Dissatisfied with your search results?":"Arama sonuçlarından memnun değil misiniz?","Help us improve.":"Gelişmemize yardımcı olun.","Search within results":"Sonuçlar içinde ara","Loading...":"Yükleniyor...","Generating...":"Oluşturuluyor...","Opening...":"Açılıyor...","Loading more results…":"Daha fazla sonuç yükleniyor…","Show more":"Daha fazla göster","Show less":"Daha az göster","Dismiss":"Kapat","Share":"Paylaş","Translate":"Çevir","AI Overview":"Yapay Zeka Genel Bakışı","AI Overviews":"Yapay Zeka Genel Bakışları","An AI Overview is not available for this search":"Bu arama için Yapay Zeka Genel Bakışı yok","All caught up!":"Hepsini okudunuz!","Previously read":"Daha önce okunanlar","Did you mean:":"Bunu mu demek istediniz:","Showing results for":"Şunun için sonuçlar gösteriliyor:","Search instead for":"Bunun yerine şunu ara:","Currently showing personal results":"Kişisel sonuçlar gösteriliyor","Hide personal results":"Kişisel sonuçları gizle","Not enough results found. Results will load in a few seconds...":"Yeterli sonuç bulunamadı. Sonuçlar birkaç saniye içinde yüklenecek...","Force-load results now":"Sonuçları şimdi yükle","View image":"Görseli göster","Visit page":"Sayfayı ziyaret et","Size of the preview image. Actual image may be larger.":"Önizleme görselinin boyutu. Gerçek görsel daha büyük olabilir.","Size of the preview image. Actual image size may be larger.":"Önizleme görselinin boyutu. Gerçek görsel boyutu daha büyük olabilir.","Search by image":"Görselle ara","Search by image (Google Lens)":"Görselle ara (Google Lens)","Search any image with Google Lens":"Google Lens ile herhangi bir görseli arayın","Search Google with an image instead of text. Try dragging an image here.":"Google'da metin yerine görselle arama yapın. Buraya bir görsel sürüklemeyi deneyin.","Paste image URL":"Görsel URL'sini yapıştır","Upload an image":"Görsel yükle","Choose File":"Dosya Seç","No file chosen":"Dosya seçilmedi","Drag an image here or":"Buraya bir görsel sürükleyin veya","upload a file":"dosya yükleyin","OR":"VEYA","Paste image link":"Görsel bağlantısını yapıştır","Remove image":"Görseli kaldır","Close":"Kapat","Visually similar images":"Görsel olarak benzer görseller","Visual matches":"Görsel eşleşmeler","Pages that include matching images":"Eşleşen görseller içeren sayfalar","Image size:":"Görsel boyutu:","Calendar":"Takvim","Contacts":"Kişiler","Docs":"Dokümanlar","Photos":"Fotoğraflar","Shopping":"Alışveriş","Finance":"Finans","Books":"Kitaplar","Groups":"Gruplar","Directory":"Dizin","Wallet":"Cüzdan","Google+ notifications":"Google+ bildirimleri","Cannot connect to Google+.":"Google+'ya bağlanılamıyor.","Gplex Settings":"Gplex Ayarları","Google Images":"Google Görseller","Google Videos":"Google Videolar","Google Search by image":"Google Görselle Arama","Layout":"Düzen","You can also change this setting by searching for \"Google in [year]\".":"Bu ayarı \"Google in [yıl]\" araması yaparak da değiştirebilirsiniz.","Info Cards":"Bilgi Kartları","Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.":"Bilgi kartları 2012'de eklendi; bu yüzden tam doğruluk için 2011 sonu-2012 başı ve daha eski düzenlerde kapatmanızı öneririm. Ancak örneğin 2006 arayüzünü seviyor ve bu özellikleri istiyorsanız açık bırakın.","Custom Image Page":"Özel Görsel Sayfası","On:":"Açık:","Off:":"Kapalı:","On":"Açık","Off":"Kapalı","Gplex creates it's own image page, which can have some bugs.":"Gplex kendi görsel sayfasını oluşturur; bazı hatalar olabilir.","Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.":"Gplex normal Google görsel sayfasını kullanır; daha işlevseldir ancak düzene göre biçimlendirilmez.","\"Force load results\" message":"\"Sonuçları zorla yükle\" mesajı","When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.":"Gplex sayfada yeterli sonuç bulamadığında daha fazla sonuç bulma umuduyla birkaç saniye bekler ve sonuçları erkenden zorla yükleme seçeneği sunan bir mesaj gösterir. Teoride yavaş bağlantılarda daha güvenilirdir.","When Gplex would normally show the message, it will instead force load the results automatically.":"Gplex normalde mesajı göstereceği durumda sonuçları otomatik olarak zorla yükler.","Gplex Settings button":"Gplex Ayarları düğmesi","Choose whether or not to display a link to this page on the topbar.":"Üst çubukta bu sayfaya bağlantı gösterilip gösterilmeyeceğini seçin.","Display name":"Görünen ad","Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.":"Bazı düzenlerde (genellikle eski olanlarda) bir ad görünür. Başlangıçta e-posta adresiniz gösteriliyordu, ancak bunun yerine kullanıcı adınızı göstermeyi seçebilirsiniz. Bu, hesap menülerini etkilemez.","Google+ custom link":"Google+ özel bağlantısı","Invalid URL.":"Geçersiz URL.","You have unsaved changes. Press enter to save.":"Kaydedilmemiş değişiklikleriniz var. Kaydetmek için Enter'a basın.","Custom link for Google+ buttons, such as the +You on the gbar, or the topbar on certain layouts. Defaults to":"gbar'daki +Sen veya bazı düzenlerdeki üst çubuk gibi Google+ düğmeleri için özel bağlantı. Varsayılan:",", which redirects to a notice that Google+ has been discontinued.":", Google+'nın kapatıldığına dair bir bildirime yönlendirir.","Choose whether or not to show AI overviews in search results.":"Arama sonuçlarında Yapay Zeka Genel Bakışlarının gösterilip gösterilmeyeceğini seçin.","Save Settings":"Ayarları Kaydet","Settings are automatically saved. There is no need to manually save.":"Ayarlar otomatik olarak kaydedilir. Elle kaydetmeye gerek yoktur.","Off (hide info cards)":"Kapalı (bilgi kartlarını gizle)","Off (compatible with the Google Images Restored extension)":"Kapalı (Google Images Restored uzantısıyla uyumlu)","Off (experimental fast mode, not recommended)":"Kapalı (deneysel hızlı mod, önerilmez)","Username":"Kullanıcı adı","Email":"E-posta","None (it will say \"account\" instead)":"Yok (bunun yerine \"hesap\" yazar)","Never show":"Asla gösterme","Always show":"Her zaman göster","Show on hover":"Üzerine gelince göster","Search the web using Google":"Google ile web'de ara","Search the web using Google!":"Google ile web'de ara!","Personalized Home":"Kişiselleştirilmiş Ana Sayfa","Language, Display, & Filtering Options":"Dil, Görüntüleme ve Filtreleme Seçenekleri","image":"görsel"},"p":{"loading":"Yükleniyor... {n} sonuç bulundu","early":"{y} başı","late":"{y} sonu","stanford":" (Stanford)","legacy":" (eski tarayıcı sürümü)","cardified":" (kartlı deneme)","material":" (özel Material sürümü)","now":" (Güncel görünüm, %0,0000 yapay zeka)","searching":"{n} web sayfasında arama","matches":"{n} eşleşme bulundu"}}}; // ---- Gplex for Gmail in the interface language (4.0) ---- // UGF_GMAIL_I18N_EN is every piece of text Gplex itself writes on mail.google.com; // each language is the same list in the same order. "" means the fragment has no // counterpart in that language (its word order puts the meaning elsewhere). const UGF_GMAIL_I18N_EN = ["0 Messages","1 star 4 stars all stars","1. Status: POP is disabled","Accounts","Accounts and Import","Add a forwarding address","Add a mail account","Add additional storage:","Add another account","Add another email address you own","Add-ons","Advanced","Advanced:","All Mail","Always use https","Archive","Auto-add suggested contacts:","Auto-advance","Automatically allow people I communicate with often to chat with me","Back to Inbox","Beach","Below inbox","Blocked addresses:","Browser connection:","Button labels:","Buy more storage","Calendar","Cancel","Canned Responses","Categories","Categories:","Change account settings:","Change password","Change password recovery options","Chat","Chat history:","Chat off","Chat on","Chat:","Chats","Check mail from other accounts:","Choose a theme:","Choose which message categories to show as inbox tabs.","Classic","Click here to","Compose","Compose Mail","Configuration instructions","Contacts","Could not drive Gmail's compose window.","Could not fill Gmail's compose window.","Could not open Gmail's compose window.","Could not open that conversation","Could not select those conversations","Create a filter","Create a new filter","Create new label","Custom keyboard shortcuts","Dark","Default","Default 'Reply to all'","Delete","Delete forever","Details","Disable","Disable IMAP","Disable Offline Mail for this computer","Disable POP","Disable forwarding","Disable hover actions","Disable offline mail","Discard","Display density","Do not play sounds","Docs","Don't always use https","Drafts","Drive","Enable","Enable IMAP","Enable Offline Mail for this computer","Enable POP for all mail","Enable POP for mail that arrives from now on","Enable hover actions","Enable offline mail","Filtered mail:","Filters","Filters and Blocked Addresses","Filters:","Finance","Forums","Forward","Forward a copy of incoming mail to","Forwarding and POP","Forwarding and POP/IMAP","Forwarding:","General","Get add-ons","Gmail did not accept the message.","Gmail did not accept the message. Its compose window is still open.","Gmail did not offer that action","Gmail display language:","Gmail is being shown in the layout you picked in Gplex. If you find that it impacts productivity, go to Gplex settings and turn it off.","Gmail saved it as a draft instead of sending it.","Gmail's compose window did not open in time.","Google Account settings","Google Calendar gadget","Gplex for Gmail is active","Gplex for Gmail:","Grant access to your account:","Hangouts","Help","High Contrast","Hover actions:","IMAP Access:","Icons","Images","Import filters","Import from Yahoo!, Hotmail, AOL, or other webmail or POP3 accounts.","Import mail and contacts","Import mail and contacts:","Importance markers:","Important","Important first","In new window","Inbox","Inbox type:","Input tools","Installed add-ons:","Keyboard shortcuts off","Keyboard shortcuts on","Keyboard shortcuts:","Label","Labels","Labels:","Labs","Labs are experimental features that may change, break or disappear at any time.","Labs:","Language:","Last account activity: 1 minute ago","Last account activity: 22 minutes ago","Layout","Learn more","Loading…","Mail","Manage","Maps","Mark as important","Mark as unread","Maximum page size:","Message sent.","More","More actions","Mountains","Move to","Multiple Inboxes","My clips:","My picture:","Never save chat history","New Message","Newer","Newest","News","No accounts have access.","No add-ons are installed.","No conversations matched your search.","No indicators","No markers","No other mailboxes","No signature","No snippets","No split","None","Not spam","Nudges:","Off – use the normal Gmail","Offline","Offline Mail uses Gears to store your mail on this computer.","Offline Mail:","Older","Oldest","On – show Gmail in the","Only allow people that I've explicitly approved to chat with me","Open in 1 other location","Open this page without Gplex once","Override filters - include important messages in the inbox","POP Download:","Personal level indicators:","Photos","Planets","Play","Play a sound when a new chat message arrives","Preview Pane","Primary","Print all","Priority Inbox","Privacy","Privacy Policy","Program Policies","Promotions","Quote selected text","Read","Reading pane:","Refresh","Reply","Report Spam","Report spam","Right of inbox","Right-side chat","SEARCH MAIL","SEARCH THE WEB","Save Changes","Save Now","Save chat history in my Gmail account","Search Mail","Search Mail and Docs","Search by topic or URL","Search for clips:","Search mail","Search the Web","Searching…","Select a conversation first","Select a picture that everyone will see when you email them.","Select:","Send","Send mail as:","Sending…","Sent","Sent Mail","Set status here","Shiny","Shopping","Show","Show all language options","Show in IMAP","Show in label list","Show indicators","Show markers","Show my web clips above the Inbox","Show search options","Show snippets","Signature:","Smart Compose:","Snippets:","Snooze","Snoozed","Social","Soft Grey","Sounds:","Spam","Star","Starred","Starred first","Stars:","Status: IMAP is disabled ·","Store the last 30 days of mail on this computer so you can read it without a connection.","Subject","Suggest emails to follow up on","Suggest emails to reply to","Tasks","Templates","Terms & Privacy","Terms of Use","Text","The layout itself is picked in Gplex settings on google.com.","Theme mail.google.com to match the layout","Themes","This message seems dangerous","To","Trash","Tree","Undo Send","Unread","Unread first","Unread message icon","Unstarred","Updates","Used by both Google and Gmail","Vacation responder off","Vacation responder on","Vacation responder:","Very buggy, not recommended. The category tabs often do not match what Gmail actually shows, so they are off unless you turn them on here.","Video","Videos","Voice and video chat is installed.","Voice and video chat:","Wallet","Web","Web Clips","Web clips show news headlines, blog posts, ads and other items above your messages.","Writing suggestions off","Writing suggestions on","You are currently using","You currently have no blocked addresses.","You have no filters.","You have no other accounts set up.","address","conversations per page","edit","hide","layout","more","of","or","remove","show"]; const UGF_GMAIL_I18N = {"de":["0 Nachrichten","1 Stern 4 Sterne alle Sterne","1. Status: POP ist deaktiviert","Konten","Konten und Import","Weiterleitungsadresse hinzufügen","E-Mail-Konto hinzufügen","Zusätzlichen Speicherplatz hinzufügen:","Weiteres Konto hinzufügen","Weitere eigene E-Mail-Adresse hinzufügen","Add-ons","Erweitert","Erweitert:","Alle Nachrichten","Immer https verwenden","Archivieren","Vorgeschlagene Kontakte automatisch hinzufügen:","Automatisch weiter","Personen, mit denen ich oft kommuniziere, automatisch erlauben, mit mir zu chatten","Zurück zum Posteingang","Strand","Unter dem Posteingang","Blockierte Adressen:","Browserverbindung:","Schaltflächenbeschriftung:","Speicherplatz kaufen","Kalender","Abbrechen","Textbausteine","Kategorien","Kategorien:","Kontoeinstellungen ändern:","Passwort ändern","Optionen zur Passwortwiederherstellung ändern","Chat","Chatverlauf:","Chat aus","Chat an","Chat:","Chats","E-Mails von anderen Konten abrufen:","Design auswählen:","Wählen Sie aus, welche Nachrichtenkategorien als Tabs im Posteingang angezeigt werden.","Klassisch","Hier klicken zum","Schreiben","E-Mail schreiben","Konfigurationsanleitung","Kontakte","Das Gmail-Schreibfenster ließ sich nicht steuern.","Das Gmail-Schreibfenster ließ sich nicht ausfüllen.","Das Gmail-Schreibfenster ließ sich nicht öffnen.","Diese Unterhaltung ließ sich nicht öffnen","Diese Unterhaltungen ließen sich nicht auswählen","Filter erstellen","Neuen Filter erstellen","Neues Label erstellen","Benutzerdefinierte Tastenkombinationen","Dunkel","Standard","Standardmäßig „Allen antworten“","Löschen","Endgültig löschen","Details","Deaktivieren","IMAP deaktivieren","Offline-Mail für diesen Computer deaktivieren","POP deaktivieren","Weiterleitung deaktivieren","Hover-Aktionen deaktivieren","Offline-Mail deaktivieren","Verwerfen","Anzeigedichte","Keine Töne abspielen","Docs","Nicht immer https verwenden","Entwürfe","Drive","Aktivieren","IMAP aktivieren","Offline-Mail für diesen Computer aktivieren","POP für alle Nachrichten aktivieren","POP für ab jetzt eingehende Nachrichten aktivieren","Hover-Aktionen aktivieren","Offline-Mail aktivieren","Gefilterte Nachrichten:","Filter","Filter und blockierte Adressen","Filter:","Finanzen","Foren","Weiterleiten","Eine Kopie eingehender Nachrichten weiterleiten an","Weiterleitung und POP","Weiterleitung und POP/IMAP","Weiterleitung:","Allgemein","Add-ons herunterladen","Gmail hat die Nachricht nicht angenommen.","Gmail hat die Nachricht nicht angenommen. Das Schreibfenster ist noch geöffnet.","Gmail hat diese Aktion nicht angeboten","Gmail-Anzeigesprache:","Gmail wird in dem Layout angezeigt, das Sie in Gplex ausgewählt haben. Falls es Ihre Arbeit behindert, schalten Sie es in den Gplex-Einstellungen aus.","Gmail hat die Nachricht als Entwurf gespeichert, statt sie zu senden.","Das Gmail-Schreibfenster hat sich nicht rechtzeitig geöffnet.","Google-Kontoeinstellungen","Google Kalender-Gadget","Gplex für Gmail ist aktiv","Gplex für Gmail:","Zugriff auf Ihr Konto gewähren:","Hangouts","Hilfe","Hoher Kontrast","Hover-Aktionen:","IMAP-Zugriff:","Symbole","Bilder","Filter importieren","Von Yahoo!, Hotmail, AOL oder anderen Webmail- oder POP3-Konten importieren.","E-Mails und Kontakte importieren","E-Mails und Kontakte importieren:","Wichtigkeitsmarkierungen:","Wichtig","Wichtige zuerst","In neuem Fenster","Posteingang","Posteingangstyp:","Eingabetools","Installierte Add-ons:","Tastenkombinationen aus","Tastenkombinationen an","Tastenkombinationen:","Label","Labels","Labels:","Labs","Labs sind experimentelle Funktionen, die sich jederzeit ändern, ausfallen oder verschwinden können.","Labs:","Sprache:","Letzte Kontoaktivität: vor 1 Minute","Letzte Kontoaktivität: vor 22 Minuten","Layout","Weitere Informationen","Wird geladen…","Mail","Verwalten","Maps","Als wichtig markieren","Als ungelesen markieren","Maximale Seitengröße:","Nachricht gesendet.","Mehr","Weitere Aktionen","Berge","Verschieben nach","Mehrere Posteingänge","Meine Clips:","Mein Bild:","Chatverlauf nie speichern","Neue Nachricht","Neuer","Neueste","News","Niemand hat Zugriff.","Es sind keine Add-ons installiert.","Keine Unterhaltungen entsprechen Ihrer Suche.","Keine Kennzeichnungen","Keine Markierungen","Keine anderen Postfächer","Keine Signatur","Keine Textausschnitte","Keine Aufteilung","Keine","Kein Spam","Erinnerungen:","Aus – normales Gmail verwenden","Offline","Offline-Mail speichert Ihre E-Mails mithilfe von Gears auf diesem Computer.","Offline-Mail:","Älter","Älteste","An – Gmail im Layout","Nur Personen, die ich ausdrücklich zugelassen habe, dürfen mit mir chatten","An 1 anderen Ort geöffnet","Diese Seite einmal ohne Gplex öffnen","Filter überschreiben – wichtige Nachrichten in den Posteingang aufnehmen","POP-Download:","Persönliche Kennzeichnungen:","Fotos","Planeten","Play","Ton abspielen, wenn eine neue Chatnachricht eintrifft","Vorschaufenster","Allgemein","Alle drucken","Sortierter Eingang","Datenschutz","Datenschutzerklärung","Programmrichtlinien","Werbung","Markierten Text zitieren","Gelesen","Lesebereich:","Aktualisieren","Antworten","Spam melden","Spam melden","Rechts vom Posteingang","Chat rechts","E-MAILS DURCHSUCHEN","IM WEB SUCHEN","Änderungen speichern","Jetzt speichern","Chatverlauf in meinem Gmail-Konto speichern","E-Mails durchsuchen","E-Mails und Docs durchsuchen","Nach Thema oder URL suchen","Clips suchen:","E-Mails durchsuchen","Im Web suchen","Suche läuft…","Wählen Sie zuerst eine Unterhaltung aus","Wählen Sie ein Bild aus, das alle sehen, denen Sie eine E-Mail senden.","Auswählen:","Senden","E-Mails senden als:","Wird gesendet…","Gesendet","Gesendet","Status hier festlegen","Glänzend","Shopping","Anzeigen","Alle Sprachoptionen anzeigen","In IMAP anzeigen","In Labelliste anzeigen","Kennzeichnungen anzeigen","Markierungen anzeigen","Meine Web Clips über dem Posteingang anzeigen","Suchoptionen anzeigen","Textausschnitte anzeigen","Signatur:","Intelligentes Schreiben:","Textausschnitte:","Zurückstellen","Zurückgestellt","Soziale Netzwerke","Zartgrau","Töne:","Spam","Markieren","Markiert","Markierte zuerst","Sterne:","Status: IMAP ist deaktiviert ·","Die E-Mails der letzten 30 Tage auf diesem Computer speichern, damit Sie sie auch ohne Verbindung lesen können.","Betreff","E-Mails vorschlagen, bei denen Sie nachhaken sollten","E-Mails vorschlagen, auf die Sie antworten sollten","Aufgaben","Vorlagen","Nutzungsbedingungen & Datenschutz","Nutzungsbedingungen","Text","Das Layout selbst wählen Sie in den Gplex-Einstellungen auf google.com.","mail.google.com an das Layout anpassen","Designs","Diese Nachricht scheint gefährlich zu sein","An","Papierkorb","Baum","Senden rückgängig machen","Ungelesen","Ungelesene zuerst","Symbol für ungelesene Nachrichten","Nicht markiert","Benachrichtigungen","Von Google und Gmail verwendet","Abwesenheitsnotiz aus","Abwesenheitsnotiz an","Abwesenheitsnotiz:","Sehr fehlerhaft, nicht empfohlen. Die Kategorie-Tabs stimmen oft nicht mit dem überein, was Gmail tatsächlich anzeigt, deshalb sind sie aus, bis Sie sie hier einschalten.","Video","Videos","Sprach- und Videochat ist installiert.","Sprach- und Videochat:","Wallet","Web","Web Clips","Web Clips zeigen Schlagzeilen, Blogbeiträge, Anzeigen und andere Inhalte über Ihren Nachrichten.","Schreibvorschläge aus","Schreibvorschläge an","Sie verwenden derzeit","Sie haben derzeit keine blockierten Adressen.","Sie haben keine Filter.","Sie haben keine anderen Konten eingerichtet.","Adresse","Unterhaltungen pro Seite","bearbeiten","ausblenden","anzeigen","mehr","von","oder","entfernen","anzeigen"],"es":["0 mensajes","1 estrella 4 estrellas todas las estrellas","1. Estado: POP está inhabilitado","Cuentas","Cuentas e importación","Añadir una dirección de reenvío","Añadir una cuenta de correo","Añadir más espacio de almacenamiento:","Añadir otra cuenta","Añadir otra dirección de correo tuya","Complementos","Avanzada","Avanzada:","Todos","Usar siempre https","Archivar","Añadir contactos sugeridos automáticamente:","Avance automático","Permitir automáticamente chatear conmigo a las personas con las que me comunico a menudo","Volver a Recibidos","Playa","Debajo de la bandeja de entrada","Direcciones bloqueadas:","Conexión del navegador:","Etiquetas de los botones:","Comprar más espacio","Calendar","Cancelar","Respuestas predefinidas","Categorías","Categorías:","Cambiar la configuración de la cuenta:","Cambiar contraseña","Cambiar las opciones de recuperación de contraseña","Chat","Historial de chat:","Chat desactivado","Chat activado","Chat:","Chats","Consultar el correo de otras cuentas:","Elige un tema:","Elige qué categorías de mensajes quieres ver como pestañas en la bandeja de entrada.","Clásico","Haz clic aquí para","Redactar","Redactar correo","Instrucciones de configuración","Contactos","No se ha podido controlar la ventana de redacción de Gmail.","No se ha podido rellenar la ventana de redacción de Gmail.","No se ha podido abrir la ventana de redacción de Gmail.","No se ha podido abrir esa conversación","No se han podido seleccionar esas conversaciones","Crear un filtro","Crear un filtro nuevo","Crear etiqueta nueva","Combinaciones de teclas personalizadas","Oscuro","Predeterminado","«Responder a todos» predeterminado","Eliminar","Eliminar definitivamente","Detalles","Inhabilitar","Inhabilitar IMAP","Inhabilitar el correo sin conexión en este ordenador","Inhabilitar POP","Inhabilitar el reenvío","Inhabilitar acciones al pasar el cursor","Inhabilitar el correo sin conexión","Descartar","Densidad de visualización","No reproducir sonidos","Documentos","No usar siempre https","Borradores","Drive","Habilitar","Habilitar IMAP","Habilitar el correo sin conexión en este ordenador","Habilitar POP para todos los mensajes","Habilitar POP para los mensajes que se reciban a partir de ahora","Habilitar acciones al pasar el cursor","Habilitar el correo sin conexión","Correo filtrado:","Filtros","Filtros y direcciones bloqueadas","Filtros:","Finanzas","Foros","Reenviar","Reenviar una copia del correo entrante a","Reenvío y correo POP","Reenvío y correo POP/IMAP","Reenvío:","General","Obtener complementos","Gmail no ha aceptado el mensaje.","Gmail no ha aceptado el mensaje. Su ventana de redacción sigue abierta.","Gmail no ha ofrecido esa acción","Idioma de Gmail:","Gmail se muestra con el diseño que has elegido en Gplex. Si ves que afecta a tu productividad, ve a la configuración de Gplex y desactívalo.","Gmail lo ha guardado como borrador en lugar de enviarlo.","La ventana de redacción de Gmail no se ha abierto a tiempo.","Configuración de la cuenta de Google","Gadget de Google Calendar","Gplex para Gmail está activo","Gplex para Gmail:","Conceder acceso a tu cuenta:","Hangouts","Ayuda","Contraste alto","Acciones al pasar el cursor:","Acceso IMAP:","Iconos","Imágenes","Importar filtros","Importar desde Yahoo!, Hotmail, AOL u otras cuentas de correo web o POP3.","Importar correo y contactos","Importar correo y contactos:","Marcadores de importancia:","Importantes","Importantes primero","En otra ventana","Recibidos","Tipo de bandeja de entrada:","Herramientas de introducción de texto","Complementos instalados:","Combinaciones de teclas desactivadas","Combinaciones de teclas activadas","Combinaciones de teclas:","Etiqueta","Etiquetas","Etiquetas:","Labs","Labs son funciones experimentales que pueden cambiar, dejar de funcionar o desaparecer en cualquier momento.","Labs:","Idioma:","Última actividad de la cuenta: hace 1 minuto","Última actividad de la cuenta: hace 22 minutos","Diseño","Más información","Cargando…","Correo","Gestionar","Maps","Marcar como importante","Marcar como no leído","Tamaño máximo de página:","Mensaje enviado.","Más","Más acciones","Montañas","Mover a","Varias bandejas de entrada","Mis clips:","Mi imagen:","No guardar nunca el historial de chat","Mensaje nuevo","Más recientes","Lo más reciente","Noticias","Ninguna cuenta tiene acceso.","No hay complementos instalados.","No hay conversaciones que coincidan con tu búsqueda.","Sin indicadores","Sin marcadores","No hay otros buzones","Sin firma","Sin fragmentos","Sin división","Ninguno","No es spam","Recordatorios:","Desactivado: usar el Gmail normal","Sin conexión","El correo sin conexión usa Gears para guardar tu correo en este ordenador.","Correo sin conexión:","Más antiguos","Lo más antiguo","Activado: mostrar Gmail con el diseño","Permitir chatear conmigo solo a las personas que haya aprobado expresamente","Abierto en 1 ubicación más","Abrir esta página sin Gplex una vez","Anular filtros: incluir los mensajes importantes en Recibidos","Descarga POP:","Indicadores personales:","Fotos","Planetas","Play","Reproducir un sonido cuando llegue un mensaje de chat nuevo","Panel de vista previa","Principal","Imprimir todo","Recibidos prioritarios","Privacidad","Política de privacidad","Políticas del programa","Promociones","Citar el texto seleccionado","Leídos","Panel de lectura:","Actualizar","Responder","Marcar como spam","Marcar como spam","A la derecha de la bandeja de entrada","Chat a la derecha","BUSCAR CORREO","BUSCAR EN LA WEB","Guardar cambios","Guardar ahora","Guardar el historial de chat en mi cuenta de Gmail","Buscar correo","Buscar en el correo y en Documentos","Buscar por tema o URL","Buscar clips:","Buscar correo","Buscar en la Web","Buscando…","Primero selecciona una conversación","Selecciona una imagen que verán todos los destinatarios de tus correos.","Seleccionar:","Enviar","Enviar como:","Enviando…","Enviados","Enviados","Establece tu estado aquí","Brillante","Shopping","Mostrar","Mostrar todas las opciones de idioma","Mostrar en IMAP","Mostrar en la lista de etiquetas","Mostrar indicadores","Mostrar marcadores","Mostrar mis clips web encima de Recibidos","Mostrar opciones de búsqueda","Mostrar fragmentos","Firma:","Redacción inteligente:","Fragmentos:","Posponer","Pospuestos","Social","Gris suave","Sonidos:","Spam","Destacar","Destacados","Destacados primero","Estrellas:","Estado: IMAP está inhabilitado ·","Guardar en este ordenador el correo de los últimos 30 días para leerlo sin conexión.","Asunto","Sugerir correos a los que hacer seguimiento","Sugerir correos a los que responder","Tareas","Plantillas","Términos y privacidad","Condiciones de servicio","Texto","El diseño se elige en la configuración de Gplex en google.com.","Adaptar mail.google.com al diseño","Temas","Este mensaje parece peligroso","Para","Papelera","Árbol","Deshacer el envío","No leídos","No leídos primero","Icono de mensajes no leídos","Sin destacar","Notificaciones","Lo usan tanto Google como Gmail","Respuesta automática desactivada","Respuesta automática activada","Respuesta automática:","Muy inestable, no recomendado. Las pestañas de categorías a menudo no coinciden con lo que muestra Gmail, así que están desactivadas salvo que las actives aquí.","Vídeo","Vídeos","El chat de voz y vídeo está instalado.","Chat de voz y vídeo:","Wallet","Web","Clips web","Los clips web muestran titulares de noticias, entradas de blogs, anuncios y otros elementos encima de tus mensajes.","Sugerencias de escritura desactivadas","Sugerencias de escritura activadas","Estás usando","No tienes direcciones bloqueadas.","No tienes filtros.","No has configurado ninguna otra cuenta.","dirección","conversaciones por página","editar","ocultar","","más","de","o","quitar","mostrar"],"fr":["0 message","1 étoile 4 étoiles toutes les étoiles","1. État : POP est désactivé","Comptes","Comptes et importation","Ajouter une adresse de transfert","Ajouter un compte de messagerie","Ajouter de l'espace de stockage :","Ajouter un autre compte","Ajouter une autre adresse e-mail que vous possédez","Modules complémentaires","Paramètres avancés","Paramètres avancés :","Tous les messages","Toujours utiliser https","Archiver","Ajouter automatiquement les contacts suggérés :","Avance automatique","Autoriser automatiquement les personnes avec qui je communique souvent à discuter avec moi","Retour à la boîte de réception","Plage","Sous la boîte de réception","Adresses bloquées :","Connexion du navigateur :","Libellés des boutons :","Acheter de l'espace de stockage","Agenda","Annuler","Réponses standardisées","Catégories","Catégories :","Modifier les paramètres du compte :","Modifier le mot de passe","Modifier les options de récupération du mot de passe","Chat","Historique du chat :","Chat désactivé","Chat activé","Chat :","Chats","Consulter d'autres comptes de messagerie :","Choisir un thème :","Choisissez les catégories de messages à afficher sous forme d'onglets dans la boîte de réception.","Classique","Cliquez ici pour","Nouveau message","Nouveau message","Instructions de configuration","Contacts","Impossible de piloter la fenêtre de rédaction de Gmail.","Impossible de remplir la fenêtre de rédaction de Gmail.","Impossible d'ouvrir la fenêtre de rédaction de Gmail.","Impossible d'ouvrir cette conversation","Impossible de sélectionner ces conversations","Créer un filtre","Créer un nouveau filtre","Créer un libellé","Raccourcis clavier personnalisés","Sombre","Par défaut","« Répondre à tous » par défaut","Supprimer","Supprimer définitivement","Détails","Désactiver","Désactiver IMAP","Désactiver le mode hors connexion sur cet ordinateur","Désactiver POP","Désactiver le transfert","Désactiver les actions au survol","Désactiver le mode hors connexion","Supprimer","Densité d'affichage","Ne pas émettre de son","Docs","Ne pas toujours utiliser https","Brouillons","Drive","Activer","Activer IMAP","Activer le mode hors connexion sur cet ordinateur","Activer POP pour tous les messages","Activer POP pour les messages reçus à partir de maintenant","Activer les actions au survol","Activer le mode hors connexion","Messages filtrés :","Filtres","Filtres et adresses bloquées","Filtres :","Finance","Forums","Transférer","Transférer une copie des messages reçus à","Transfert et POP","Transfert et POP/IMAP","Transfert :","Général","Télécharger des modules complémentaires","Gmail n'a pas accepté le message.","Gmail n'a pas accepté le message. Sa fenêtre de rédaction est toujours ouverte.","Gmail n'a pas proposé cette action","Langue d'affichage de Gmail :","Gmail s'affiche dans la mise en page choisie dans Gplex. Si cela nuit à votre productivité, désactivez-le dans les paramètres de Gplex.","Gmail l'a enregistré comme brouillon au lieu de l'envoyer.","La fenêtre de rédaction de Gmail ne s'est pas ouverte à temps.","Paramètres du compte Google","Gadget Google Agenda","Gplex pour Gmail est actif","Gplex pour Gmail :","Accorder l'accès à votre compte :","Hangouts","Aide","Contraste élevé","Actions au survol :","Accès IMAP :","Icônes","Images","Importer des filtres","Importer depuis Yahoo!, Hotmail, AOL ou d'autres comptes de messagerie Web ou POP3.","Importer des messages et des contacts","Importer des messages et des contacts :","Marqueurs d'importance :","Important","Importants d'abord","Dans une nouvelle fenêtre","Boîte de réception","Type de boîte de réception :","Outils de saisie","Modules complémentaires installés :","Raccourcis clavier désactivés","Raccourcis clavier activés","Raccourcis clavier :","Libellé","Libellés","Libellés :","Labos","Les Labos sont des fonctionnalités expérimentales susceptibles d'être modifiées, de cesser de fonctionner ou de disparaître à tout moment.","Labos :","Langue :","Dernière activité sur le compte : il y a 1 minute","Dernière activité sur le compte : il y a 22 minutes","Mise en page","En savoir plus","Chargement…","Messagerie","Gérer","Maps","Marquer comme important","Marquer comme non lu","Taille de page maximale :","Message envoyé.","Plus","Autres actions","Montagnes","Déplacer vers","Boîtes de réception multiples","Mes clips :","Ma photo :","Ne jamais enregistrer l'historique du chat","Nouveau message","Plus récents","Les plus récents","Actualités","Aucun compte n'a accès.","Aucun module complémentaire n'est installé.","Aucune conversation ne correspond à votre recherche.","Aucun indicateur","Aucun marqueur","Aucune autre boîte aux lettres","Aucune signature","Pas d'extraits","Pas de partage","Aucune","Non-spam","Rappels :","Désactivé – utiliser le Gmail normal","Hors connexion","La messagerie hors connexion utilise Gears pour stocker vos messages sur cet ordinateur.","Messagerie hors connexion :","Plus anciens","Les plus anciens","Activé – afficher Gmail avec la mise en page","N'autoriser que les personnes que j'ai explicitement approuvées à discuter avec moi","Ouvert dans 1 autre emplacement","Ouvrir cette page sans Gplex une fois","Ignorer les filtres – inclure les messages importants dans la boîte de réception","Téléchargement POP :","Indicateurs personnels :","Photos","Planètes","Play","Émettre un son à l'arrivée d'un nouveau message de chat","Volet de visualisation","Principale","Tout imprimer","Boîte de réception prioritaire","Confidentialité","Règles de confidentialité","Règlement du programme","Promotions","Citer le texte sélectionné","Lus","Volet de lecture :","Actualiser","Répondre","Signaler comme spam","Signaler comme spam","À droite de la boîte de réception","Chat à droite","RECHERCHER DANS LES MESSAGES","RECHERCHER SUR LE WEB","Enregistrer les modifications","Enregistrer maintenant","Enregistrer l'historique du chat dans mon compte Gmail","Rechercher dans les messages","Rechercher dans les messages et Docs","Rechercher par thème ou URL","Rechercher des clips :","Rechercher dans les messages","Rechercher sur le Web","Recherche…","Sélectionnez d'abord une conversation","Choisissez une photo que verront toutes les personnes à qui vous écrivez.","Sélectionner :","Envoyer","Envoyer des e-mails en tant que :","Envoi…","Messages envoyés","Messages envoyés","Définir votre statut ici","Brillant","Shopping","Afficher","Afficher toutes les options de langue","Afficher dans IMAP","Afficher dans la liste des libellés","Afficher les indicateurs","Afficher les marqueurs","Afficher mes clips Web au-dessus de la boîte de réception","Afficher les options de recherche","Afficher les extraits","Signature :","Saisie intelligente :","Extraits :","Mettre en attente","En attente","Réseaux sociaux","Gris doux","Sons :","Spam","Suivre","Messages suivis","Suivis d'abord","Étoiles :","État : IMAP est désactivé ·","Stocker les messages des 30 derniers jours sur cet ordinateur pour les lire sans connexion.","Objet","Suggérer des e-mails à relancer","Suggérer des e-mails auxquels répondre","Tâches","Modèles","Conditions et confidentialité","Conditions d'utilisation","Texte","La mise en page elle-même se choisit dans les paramètres de Gplex sur google.com.","Adapter mail.google.com à la mise en page","Thèmes","Ce message semble dangereux","À","Corbeille","Arbre","Annuler l'envoi","Non lus","Non lus d'abord","Icône des messages non lus","Non suivis","Notifications","Utilisé par Google et par Gmail","Réponse automatique désactivée","Réponse automatique activée","Réponse automatique :","Très instable, déconseillé. Les onglets de catégories ne correspondent souvent pas à ce que Gmail affiche réellement ; ils restent donc désactivés tant que vous ne les activez pas ici.","Vidéo","Vidéos","Le chat vocal et vidéo est installé.","Chat vocal et vidéo :","Wallet","Web","Clips Web","Les clips Web affichent des titres d'actualités, des articles de blog, des annonces et d'autres éléments au-dessus de vos messages.","Suggestions d'écriture désactivées","Suggestions d'écriture activées","Vous utilisez actuellement","Vous n'avez aucune adresse bloquée.","Vous n'avez aucun filtre.","Vous n'avez configuré aucun autre compte.","adresse","conversations par page","modifier","masquer","","plus","sur","ou","supprimer","afficher"],"it":["0 messaggi","1 stella 4 stelle tutte le stelle","1. Stato: POP disattivato","Account","Account e importazione","Aggiungi un indirizzo di inoltro","Aggiungi un account email","Aggiungi altro spazio di archiviazione:","Aggiungi un altro account","Aggiungi un altro tuo indirizzo email","Componenti aggiuntivi","Avanzate","Avanzate:","Tutti i messaggi","Usa sempre https","Archivia","Aggiungi automaticamente i contatti suggeriti:","Avanzamento automatico","Consenti automaticamente di chattare con me alle persone con cui comunico spesso","Torna a Posta in arrivo","Spiaggia","Sotto la posta in arrivo","Indirizzi bloccati:","Connessione del browser:","Etichette dei pulsanti:","Acquista altro spazio","Calendar","Annulla","Risposte predefinite","Categorie","Categorie:","Modifica impostazioni account:","Cambia password","Modifica le opzioni di recupero della password","Chat","Cronologia chat:","Chat disattivata","Chat attivata","Chat:","Chat","Controlla la posta da altri account:","Scegli un tema:","Scegli quali categorie di messaggi mostrare come schede nella posta in arrivo.","Classico","Fai clic qui per","Scrivi","Scrivi messaggio","Istruzioni di configurazione","Contatti","Impossibile controllare la finestra di scrittura di Gmail.","Impossibile compilare la finestra di scrittura di Gmail.","Impossibile aprire la finestra di scrittura di Gmail.","Impossibile aprire la conversazione","Impossibile selezionare le conversazioni","Crea un filtro","Crea un nuovo filtro","Crea nuova etichetta","Scorciatoie da tastiera personalizzate","Scuro","Predefinito","\"Rispondi a tutti\" predefinito","Elimina","Elimina definitivamente","Dettagli","Disattiva","Disattiva IMAP","Disattiva la posta offline su questo computer","Disattiva POP","Disattiva l'inoltro","Disattiva azioni al passaggio del mouse","Disattiva la posta offline","Annulla","Densità di visualizzazione","Non riprodurre suoni","Documenti","Non usare sempre https","Bozze","Drive","Attiva","Attiva IMAP","Attiva la posta offline su questo computer","Attiva POP per tutti i messaggi","Attiva POP per i messaggi che arrivano da ora in poi","Attiva azioni al passaggio del mouse","Attiva la posta offline","Posta filtrata:","Filtri","Filtri e indirizzi bloccati","Filtri:","Finanza","Forum","Inoltra","Inoltra una copia della posta in arrivo a","Inoltro e POP","Inoltro e POP/IMAP","Inoltro:","Generali","Scarica componenti aggiuntivi","Gmail non ha accettato il messaggio.","Gmail non ha accettato il messaggio. La sua finestra di scrittura è ancora aperta.","Gmail non ha offerto quell'azione","Lingua di visualizzazione di Gmail:","Gmail viene mostrato con il layout che hai scelto in Gplex. Se noti che ostacola il tuo lavoro, disattivalo nelle impostazioni di Gplex.","Gmail lo ha salvato come bozza invece di inviarlo.","La finestra di scrittura di Gmail non si è aperta in tempo.","Impostazioni dell'account Google","Gadget di Google Calendar","Gplex per Gmail è attivo","Gplex per Gmail:","Concedi l'accesso al tuo account:","Hangouts","Guida","Contrasto elevato","Azioni al passaggio del mouse:","Accesso IMAP:","Icone","Immagini","Importa filtri","Importa da Yahoo!, Hotmail, AOL o altri account webmail o POP3.","Importa posta e contatti","Importa posta e contatti:","Indicatori di importanza:","Importanti","Prima gli importanti","In una nuova finestra","Posta in arrivo","Tipo di posta in arrivo:","Strumenti di immissione","Componenti aggiuntivi installati:","Scorciatoie da tastiera disattivate","Scorciatoie da tastiera attivate","Scorciatoie da tastiera:","Etichetta","Etichette","Etichette:","Labs","I Labs sono funzioni sperimentali che possono cambiare, smettere di funzionare o scomparire in qualsiasi momento.","Labs:","Lingua:","Ultima attività dell'account: 1 minuto fa","Ultima attività dell'account: 22 minuti fa","Layout","Ulteriori informazioni","Caricamento…","Posta","Gestisci","Maps","Contrassegna come importante","Segna come da leggere","Dimensioni massime della pagina:","Messaggio inviato.","Altro","Altre azioni","Montagne","Sposta in","Posta in arrivo multipla","I miei clip:","La mia immagine:","Non salvare mai la cronologia chat","Nuovo messaggio","Più recenti","I più recenti","Notizie","Nessun account ha accesso.","Nessun componente aggiuntivo installato.","Nessuna conversazione corrisponde alla ricerca.","Nessun indicatore","Nessun contrassegno","Nessun'altra casella di posta","Nessuna firma","Nessuno snippet","Nessuna suddivisione","Nessuno","Non spam","Promemoria:","Disattivato – usa il normale Gmail","Offline","La posta offline usa Gears per archiviare la tua posta su questo computer.","Posta offline:","Meno recenti","I meno recenti","Attivato – mostra Gmail con il layout","Consenti di chattare con me solo alle persone che ho approvato esplicitamente","Aperto in 1 altra posizione","Apri questa pagina senza Gplex una volta","Ignora i filtri – includi i messaggi importanti nella posta in arrivo","Download POP:","Indicatori personali:","Foto","Pianeti","Play","Riproduci un suono all'arrivo di un nuovo messaggio di chat","Riquadro di anteprima","Principale","Stampa tutto","Posta prioritaria","Privacy","Norme sulla privacy","Norme del programma","Promozioni","Cita il testo selezionato","Letti","Riquadro di lettura:","Aggiorna","Rispondi","Segnala come spam","Segnala come spam","A destra della posta in arrivo","Chat sul lato destro","CERCA NELLA POSTA","CERCA NEL WEB","Salva modifiche","Salva ora","Salva la cronologia chat nel mio account Gmail","Cerca nella posta","Cerca nella posta e in Documenti","Cerca per argomento o URL","Cerca clip:","Cerca nella posta","Cerca nel Web","Ricerca in corso…","Seleziona prima una conversazione","Seleziona un'immagine che vedranno tutti quelli a cui invii email.","Seleziona:","Invia","Invia messaggio come:","Invio in corso…","Posta inviata","Posta inviata","Imposta qui lo stato","Lucido","Shopping","Mostra","Mostra tutte le opzioni della lingua","Mostra in IMAP","Mostra nell'elenco delle etichette","Mostra indicatori","Mostra contrassegni","Mostra i miei web clip sopra la posta in arrivo","Mostra opzioni di ricerca","Mostra snippet","Firma:","Scrittura intelligente:","Snippet:","Posticipa","Posticipati","Social","Grigio tenue","Suoni:","Spam","Speciale","Speciali","Prima gli speciali","Stelle:","Stato: IMAP disattivato ·","Archivia su questo computer la posta degli ultimi 30 giorni per leggerla senza connessione.","Oggetto","Suggerisci email da sollecitare","Suggerisci email a cui rispondere","Tasks","Modelli","Termini e privacy","Termini di servizio","Testo","Il layout si sceglie nelle impostazioni di Gplex su google.com.","Adatta mail.google.com al layout","Temi","Questo messaggio sembra pericoloso","A","Cestino","Albero","Annulla invio","Da leggere","Prima i messaggi da leggere","Icona dei messaggi da leggere","Non speciali","Aggiornamenti","Usato sia da Google sia da Gmail","Risponditore automatico disattivato","Risponditore automatico attivato","Risponditore automatico:","Molto instabile, sconsigliato. Le schede delle categorie spesso non corrispondono a ciò che Gmail mostra davvero, quindi restano disattivate finché non le attivi qui.","Video","Video","La chat vocale e video è installata.","Chat vocale e video:","Wallet","Web","Web Clip","I web clip mostrano titoli di notizie, post di blog, annunci e altri elementi sopra i tuoi messaggi.","Suggerimenti di scrittura disattivati","Suggerimenti di scrittura attivati","Stai utilizzando","Non hai indirizzi bloccati.","Non hai filtri.","Non hai configurato altri account.","indirizzo","conversazioni per pagina","modifica","nascondi","","altro","di","oppure","rimuovi","mostra"],"ja":["0 件のメッセージ","スター 1 個 スター 4 個 すべてのスター","1. ステータス: POP は無効です","アカウント","アカウントとインポート","転送先アドレスを追加","メールアカウントを追加","保存容量を追加:","別のアカウントを追加","所有している別のメールアドレスを追加","アドオン","詳細","詳細:","すべてのメール","常に https を使用する","アーカイブ","おすすめの連絡先を自動的に追加:","自動送り","頻繁にやり取りするユーザーにはチャットを自動的に許可する","受信トレイに戻る","ビーチ","受信トレイの下","ブロック中のアドレス:","ブラウザ接続:","ボタンのラベル:","保存容量を購入","カレンダー","キャンセル","返信定型文","カテゴリ","カテゴリ:","アカウント設定の変更:","パスワードを変更","パスワード再設定オプションを変更","チャット","チャット履歴:","チャット オフ","チャット オン","チャット:","チャット","他のアカウントでメールを確認:","テーマを選択:","受信トレイにタブとして表示するメールのカテゴリを選択してください。","クラシック","ここをクリックして","作成","メールを作成","設定手順","連絡先","Gmail の作成ウィンドウを操作できませんでした。","Gmail の作成ウィンドウに入力できませんでした。","Gmail の作成ウィンドウを開けませんでした。","そのスレッドを開けませんでした","それらのスレッドを選択できませんでした","フィルタを作成","新しいフィルタを作成","新しいラベルを作成","カスタム キーボード ショートカット","ダーク","デフォルト","デフォルトの返信動作を「全員に返信」にする","削除","完全に削除","詳細","無効にする","IMAP を無効にする","このパソコンでオフライン メールを無効にする","POP を無効にする","転送を無効にする","カーソル操作を無効にする","オフライン メールを無効にする","破棄","表示間隔","音を鳴らさない","ドキュメント","常に https を使用しない","下書き","ドライブ","有効にする","IMAP を有効にする","このパソコンでオフライン メールを有効にする","すべてのメールで POP を有効にする","今後受信するメールで POP を有効にする","カーソル操作を有効にする","オフライン メールを有効にする","フィルタで処理されたメール:","フィルタ","フィルタとブロック中のアドレス","フィルタ:","ファイナンス","フォーラム","転送","受信メールのコピーを転送:","メール転送と POP","メール転送と POP/IMAP","転送:","全般","アドオンを入手","Gmail がメールを受け付けませんでした。","Gmail がメールを受け付けませんでした。作成ウィンドウは開いたままです。","Gmail にその操作がありませんでした","Gmail の表示言語:","Gmail は Gplex で選んだレイアウトで表示されています。作業の妨げになる場合は、Gplex の設定でオフにしてください。","Gmail はメールを送信せず下書きとして保存しました。","Gmail の作成ウィンドウが時間内に開きませんでした。","Google アカウントの設定","Google カレンダー ガジェット","Gmail 版 Gplex が有効です","Gmail 版 Gplex:","アカウントへのアクセスを許可:","ハングアウト","ヘルプ","ハイコントラスト","カーソル操作:","IMAP アクセス:","アイコン","画像","フィルタをインポート","Yahoo!、Hotmail、AOL などのウェブメールや POP3 アカウントからインポートします。","メールと連絡先のインポート","メールと連絡先のインポート:","重要マーク:","重要","重要なメールを先頭","新しいウィンドウで開く","受信トレイ","受信トレイの種類:","入力ツール","インストール済みのアドオン:","キーボード ショートカット OFF","キーボード ショートカット ON","キーボード ショートカット:","ラベル","ラベル","ラベル:","Labs","Labs は試験運用中の機能で、変更、停止、廃止されることがあります。","Labs:","言語:","前回のアカウント アクティビティ: 1 分前","前回のアカウント アクティビティ: 22 分前","レイアウト","詳細","読み込んでいます…","メール","管理","マップ","重要マークを付ける","未読にする","最大ページサイズ:","メッセージを送信しました。","その他","その他の操作","山","移動","マルチ受信トレイ","マイ クリップ:","マイ画像:","チャット履歴を保存しない","新規メッセージ","新しい","最新","ニュース","アクセス権のあるアカウントはありません。","インストールされているアドオンはありません。","検索に一致するスレッドはありません。","インジケータを表示しない","マークを表示しない","他のメールボックスはありません","署名なし","メッセージの一部を表示しない","分割なし","なし","迷惑メールではない","リマインダー:","オフ – 通常の Gmail を使う","オフライン","オフライン メールは Gears を使用してこのパソコンにメールを保存します。","オフライン メール:","古い","最古","オン – Gmail を","明示的に承認したユーザーだけにチャットを許可する","他の 1 か所で開いています","このページを一度だけ Gplex なしで開く","フィルタを無視 – 重要なメールを受信トレイに含める","POP ダウンロード:","個人レベルのインジケータ:","フォト","惑星","Play","新しいチャット メッセージを受信したら音を鳴らす","プレビュー パネル","メイン","すべて印刷","優先トレイ","プライバシー","プライバシー ポリシー","プログラム ポリシー","プロモーション","選択したテキストを引用","既読","閲覧ウィンドウ:","更新","返信","迷惑メールを報告","迷惑メールを報告","受信トレイの右","右側にチャットを表示","メールを検索","ウェブを検索","変更を保存","今すぐ保存","Gmail アカウントにチャット履歴を保存する","メールを検索","メールとドキュメントを検索","トピックまたは URL で検索","クリップを検索:","メールを検索","ウェブを検索","検索しています…","先にスレッドを選択してください","メールを送る相手全員に表示される画像を選択します。","選択:","送信","名前:","送信しています…","送信済み","送信済みメール","ここでステータスを設定","光沢","ショッピング","表示","すべての言語オプションを表示","IMAP で表示","ラベルリストに表示","インジケータを表示","マークを表示","受信トレイの上にウェブクリップを表示する","検索オプションを表示","メッセージの一部を表示","署名:","スマート作成:","メッセージの一部の表示:","スヌーズ","スヌーズ中","ソーシャル","ソフトグレー","サウンド:","迷惑メール","スター","スター付き","スター付きを先頭","スター:","ステータス: IMAP は無効です ·","オフラインでも読めるように、過去 30 日間のメールをこのパソコンに保存します。","件名","フォローアップするメールを提案する","返信するメールを提案する","ToDo リスト","テンプレート","規約とプライバシー","利用規約","テキスト","レイアウト自体は google.com の Gplex 設定で選びます。","mail.google.com をレイアウトに合わせる","テーマ","このメールは危険な可能性があります","To","ゴミ箱","木","送信取り消し","未読","未読を先頭","未読メール アイコン","スターなし","新着","Google と Gmail の両方で使用","不在通知 OFF","不在通知 ON","不在通知:","非常に不安定なため、おすすめしません。カテゴリタブは Gmail の実際の表示と一致しないことが多いため、ここでオンにしない限りオフになっています。","動画","動画","音声 / ビデオ チャットがインストールされています。","音声 / ビデオ チャット:","ウォレット","ウェブ","ウェブクリップ","ウェブクリップは、ニュースの見出し、ブログ投稿、広告などをメールの上に表示します。","文章の提案 OFF","文章の提案 ON","現在の使用量:","ブロック中のアドレスはありません。","フィルタはありません。","他のアカウントは設定されていません。","アドレス","件のスレッドを 1 ページに表示","編集","非表示","のレイアウトで表示","その他","/","または","削除","表示"],"ko":["메일 0개","별표 1개 별표 4개 모든 별표","1. 상태: POP 사용 안함","계정","계정 및 가져오기","전달 주소 추가","메일 계정 추가","저장용량 추가:","다른 계정 추가","내가 소유한 다른 이메일 주소 추가","부가기능","고급","고급:","전체보관함","항상 https 사용","보관처리","추천 연락처 자동 추가:","자동 진행","자주 연락하는 사용자가 나와 채팅하도록 자동으로 허용","받은편지함으로 돌아가기","해변","받은편지함 아래","차단된 주소:","브라우저 연결:","버튼 라벨:","저장용량 추가 구매","캘린더","취소","자주 쓰는 답장","카테고리","카테고리:","계정 설정 변경:","비밀번호 변경","비밀번호 복구 옵션 변경","채팅","채팅 기록:","채팅 사용 안함","채팅 사용","채팅:","채팅","다른 계정의 메일 확인:","테마 선택:","받은편지함에 탭으로 표시할 메일 카테고리를 선택하세요.","클래식","여기를 클릭하여","편지쓰기","메일 쓰기","구성 안내","주소록","Gmail 편지쓰기 창을 조작할 수 없습니다.","Gmail 편지쓰기 창을 채울 수 없습니다.","Gmail 편지쓰기 창을 열 수 없습니다.","해당 대화를 열 수 없습니다.","해당 대화를 선택할 수 없습니다.","필터 만들기","새 필터 만들기","새 라벨 만들기","맞춤 단축키","어둡게","기본값","기본값: '전체답장'","삭제","영구삭제","세부정보","사용 안함","IMAP 사용 중지","이 컴퓨터에서 오프라인 메일 사용 중지","POP 사용 중지","전달 사용 중지","마우스 오버 작업 사용 중지","오프라인 메일 사용 중지","삭제","화면 밀도","소리 재생 안함","문서","항상 https를 사용하지 않음","임시보관함","드라이브","사용","IMAP 사용","이 컴퓨터에서 오프라인 메일 사용","모든 메일에 POP 사용","지금부터 수신되는 메일에 POP 사용","마우스 오버 작업 사용","오프라인 메일 사용","필터링된 메일:","필터","필터 및 차단된 주소","필터:","금융","포럼","전달","수신 메일의 사본을 다음 주소로 전달","전달 및 POP","전달 및 POP/IMAP","전달:","기본설정","부가기능 설치","Gmail에서 메일을 받아들이지 않았습니다.","Gmail에서 메일을 받아들이지 않았습니다. 편지쓰기 창이 아직 열려 있습니다.","Gmail에서 해당 작업을 제공하지 않았습니다.","Gmail 표시 언어:","Gmail이 Gplex에서 선택한 레이아웃으로 표시되고 있습니다. 작업에 방해가 된다면 Gplex 설정에서 사용 중지하세요.","Gmail에서 메일을 보내지 않고 임시보관함에 저장했습니다.","Gmail 편지쓰기 창이 제시간에 열리지 않았습니다.","Google 계정 설정","Google 캘린더 가젯","Gmail용 Gplex 사용 중","Gmail용 Gplex:","계정에 대한 액세스 권한 부여:","행아웃","고객센터","고대비","마우스 오버 작업:","IMAP 액세스:","아이콘","이미지","필터 가져오기","Yahoo!, Hotmail, AOL 또는 기타 웹메일이나 POP3 계정에서 가져옵니다.","메일 및 연락처 가져오기","메일 및 연락처 가져오기:","중요 표시:","중요","중요메일 먼저","새 창에서 열기","받은편지함","받은편지함 유형:","입력 도구","설치된 부가기능:","단축키 사용 안함","단축키 사용","단축키:","라벨","라벨","라벨:","실험실","실험실은 언제든지 변경되거나 작동하지 않거나 사라질 수 있는 실험적인 기능입니다.","실험실:","언어:","마지막 계정 활동: 1분 전","마지막 계정 활동: 22분 전","레이아웃","자세히 알아보기","로드 중…","메일","관리","지도","중요로 표시","읽지 않음으로 표시","최대 페이지 크기:","메일을 보냈습니다.","더보기","추가 작업","산","이동","다중 받은편지함","내 클립:","내 사진:","채팅 기록 저장 안함","새 메일","최신","최신 항목","뉴스","액세스 권한이 있는 계정이 없습니다.","설치된 부가기능이 없습니다.","검색과 일치하는 대화가 없습니다.","표시기 없음","표시 없음","다른 편지함 없음","서명 없음","미리보기 없음","분할 안함","없음","스팸 아님","알림:","사용 안함 – 기본 Gmail 사용","오프라인","오프라인 메일은 Gears를 사용해 이 컴퓨터에 메일을 저장합니다.","오프라인 메일:","이전","가장 오래된 항목","사용 – Gmail을","내가 명시적으로 승인한 사용자만 나와 채팅하도록 허용","다른 1곳에서 열려 있음","Gplex 없이 이 페이지를 한 번 열기","필터 무시 – 중요한 메일을 받은편지함에 포함","POP 다운로드:","개인 수준 표시기:","포토","행성","Play","새 채팅 메일이 도착하면 소리 재생","미리보기 창","기본","모두 인쇄","우선순위 받은편지함","개인정보처리방침","개인정보처리방침","프로그램 정책","프로모션","선택한 텍스트 인용","읽음","읽기 창:","새로고침","답장","스팸신고","스팸신고","받은편지함 오른쪽","오른쪽 채팅","메일 검색","웹 검색","변경사항 저장","지금 저장","내 Gmail 계정에 채팅 기록 저장","메일 검색","메일 및 문서 검색","주제 또는 URL로 검색","클립 검색:","메일 검색","웹 검색","검색 중…","먼저 대화를 선택하세요","내가 이메일을 보낼 때 모두가 보게 될 사진을 선택하세요.","선택:","보내기","다른 주소에서 메일 보내기:","보내는 중…","보낸편지함","보낸편지함","여기에서 상태 설정","광택","쇼핑","표시","모든 언어 옵션 표시","IMAP에서 표시","라벨 목록에 표시","표시기 표시","표시 사용","받은편지함 위에 웹 클립 표시","검색 옵션 표시","미리보기 표시","서명:","스마트 편지쓰기:","미리보기:","다시 알림","다시 알림 항목","소셜","연한 회색","소리:","스팸함","별표","별표편지함","별표 메일 먼저","별표:","상태: IMAP 사용 안함 ·","연결 없이도 읽을 수 있도록 최근 30일 동안의 메일을 이 컴퓨터에 저장합니다.","제목","후속 조치할 이메일 추천","답장할 이메일 추천","할 일","템플릿","약관 및 개인정보처리방침","이용약관","텍스트","레이아웃 자체는 google.com의 Gplex 설정에서 선택합니다.","mail.google.com을 레이아웃에 맞게 꾸미기","테마","위험한 메일로 보입니다","받는사람","휴지통","나무","보내기 취소","읽지 않음","읽지 않은 메일 먼저","읽지 않은 메일 아이콘","별표 없음","업데이트","Google과 Gmail에서 함께 사용","부재중 자동응답 사용 안함","부재중 자동응답 사용","부재중 자동응답:","버그가 매우 많아 권장하지 않습니다. 카테고리 탭은 Gmail에 실제로 표시되는 내용과 다른 경우가 많으므로, 여기에서 사용 설정하지 않는 한 사용 중지됩니다.","동영상","동영상","음성 및 화상 채팅이 설치되어 있습니다.","음성 및 화상 채팅:","월렛","웹","웹 클립","웹 클립은 메일 위에 뉴스 헤드라인, 블로그 게시물, 광고 등을 표시합니다.","글쓰기 추천 사용 안함","글쓰기 추천 사용","현재 사용량:","현재 차단된 주소가 없습니다.","필터가 없습니다.","설정된 다른 계정이 없습니다.","주소","개의 대화를 한 페이지에 표시","수정","숨기기","레이아웃으로 표시","더보기","/","또는","삭제","표시"],"nl":["0 berichten","1 ster 4 sterren alle sterren","1. Status: POP is uitgeschakeld","Accounts","Accounts en importeren","Een doorstuuradres toevoegen","Een e-mailaccount toevoegen","Extra opslagruimte toevoegen:","Nog een account toevoegen","Nog een e-mailadres van jou toevoegen","Add-ons","Geavanceerd","Geavanceerd:","Alle berichten","Altijd https gebruiken","Archiveren","Voorgestelde contacten automatisch toevoegen:","Automatisch doorgaan","Mensen met wie ik vaak communiceer automatisch toestaan met mij te chatten","Terug naar Inbox","Strand","Onder de inbox","Geblokkeerde adressen:","Browserverbinding:","Knoplabels:","Meer opslagruimte kopen","Agenda","Annuleren","Standaardreacties","Categorieën","Categorieën:","Accountinstellingen wijzigen:","Wachtwoord wijzigen","Herstelopties voor wachtwoord wijzigen","Chat","Chatgeschiedenis:","Chat uit","Chat aan","Chat:","Chats","E-mail van andere accounts controleren:","Kies een thema:","Kies welke berichtcategorieën als tabbladen in de inbox worden weergegeven.","Klassiek","Klik hier om te","Opstellen","E-mail opstellen","Configuratie-instructies","Contacten","Kan het opstelvenster van Gmail niet bedienen.","Kan het opstelvenster van Gmail niet invullen.","Kan het opstelvenster van Gmail niet openen.","Kan dat gesprek niet openen","Kan die gesprekken niet selecteren","Een filter maken","Een nieuw filter maken","Nieuw label maken","Aangepaste sneltoetsen","Donker","Standaard","Standaard 'Allen beantwoorden'","Verwijderen","Definitief verwijderen","Details","Uitschakelen","IMAP uitschakelen","Offline e-mail uitschakelen voor deze computer","POP uitschakelen","Doorsturen uitschakelen","Aanwijsacties uitschakelen","Offline e-mail uitschakelen","Weggooien","Weergavedichtheid","Geen geluiden afspelen","Documenten","Niet altijd https gebruiken","Concepten","Drive","Inschakelen","IMAP inschakelen","Offline e-mail inschakelen voor deze computer","POP inschakelen voor alle berichten","POP inschakelen voor berichten die vanaf nu binnenkomen","Aanwijsacties inschakelen","Offline e-mail inschakelen","Gefilterde e-mail:","Filters","Filters en geblokkeerde adressen","Filters:","Financiën","Forums","Doorsturen","Een kopie van inkomende e-mail doorsturen naar","Doorsturen en POP","Doorsturen en POP/IMAP","Doorsturen:","Algemeen","Add-ons downloaden","Gmail heeft het bericht niet geaccepteerd.","Gmail heeft het bericht niet geaccepteerd. Het opstelvenster is nog open.","Gmail bood die actie niet aan","Weergavetaal van Gmail:","Gmail wordt weergegeven in de lay-out die je in Gplex hebt gekozen. Als dit je productiviteit belemmert, zet het dan uit in de instellingen van Gplex.","Gmail heeft het als concept opgeslagen in plaats van het te verzenden.","Het opstelvenster van Gmail ging niet op tijd open.","Instellingen voor Google-account","Google Agenda-gadget","Gplex voor Gmail is actief","Gplex voor Gmail:","Toegang tot je account verlenen:","Hangouts","Help","Hoog contrast","Aanwijsacties:","IMAP-toegang:","Pictogrammen","Afbeeldingen","Filters importeren","Importeren uit Yahoo!, Hotmail, AOL of andere webmail- of POP3-accounts.","E-mail en contacten importeren","E-mail en contacten importeren:","Belangrijkheidsmarkeringen:","Belangrijk","Belangrijk eerst","In nieuw venster","Inbox","Type inbox:","Invoertools","Geïnstalleerde add-ons:","Sneltoetsen uit","Sneltoetsen aan","Sneltoetsen:","Label","Labels","Labels:","Labs","Labs zijn experimentele functies die op elk moment kunnen veranderen, niet meer werken of verdwijnen.","Labs:","Taal:","Laatste accountactiviteit: 1 minuut geleden","Laatste accountactiviteit: 22 minuten geleden","Lay-out","Meer informatie","Laden…","E-mail","Beheren","Maps","Markeren als belangrijk","Markeren als ongelezen","Maximale paginagrootte:","Bericht verzonden.","Meer","Meer acties","Bergen","Verplaatsen naar","Meerdere inboxen","Mijn clips:","Mijn foto:","Chatgeschiedenis nooit opslaan","Nieuw bericht","Nieuwer","Nieuwste","Nieuws","Geen accounts hebben toegang.","Er zijn geen add-ons geïnstalleerd.","Geen gesprekken gevonden die overeenkomen met je zoekopdracht.","Geen indicatoren","Geen markeringen","Geen andere mailboxen","Geen handtekening","Geen fragmenten","Geen splitsing","Geen","Geen spam","Herinneringen:","Uit – de normale Gmail gebruiken","Offline","Offline e-mail gebruikt Gears om je e-mail op deze computer op te slaan.","Offline e-mail:","Ouder","Oudste","Aan – Gmail weergeven in de lay-out","Alleen mensen die ik uitdrukkelijk heb goedgekeurd, mogen met mij chatten","Open op 1 andere locatie","Deze pagina één keer zonder Gplex openen","Filters negeren – belangrijke berichten in de inbox opnemen","POP-download:","Persoonlijke indicatoren:","Foto's","Planeten","Play","Een geluid afspelen als er een nieuw chatbericht binnenkomt","Voorbeeldvenster","Primair","Alles afdrukken","Prioriteitsinbox","Privacy","Privacybeleid","Programmabeleid","Reclame","Geselecteerde tekst citeren","Gelezen","Leesvenster:","Vernieuwen","Beantwoorden","Spam melden","Spam melden","Rechts van de inbox","Chat aan de rechterkant","E-MAIL DOORZOEKEN","HET WEB DOORZOEKEN","Wijzigingen opslaan","Nu opslaan","Chatgeschiedenis opslaan in mijn Gmail-account","E-mail doorzoeken","E-mail en Documenten doorzoeken","Zoeken op onderwerp of URL","Clips zoeken:","E-mail doorzoeken","Het web doorzoeken","Zoeken…","Selecteer eerst een gesprek","Selecteer een foto die iedereen ziet als je ze e-mailt.","Selecteren:","Verzenden","E-mail verzenden als:","Verzenden…","Verzonden","Verzonden berichten","Stel hier je status in","Glanzend","Shopping","Weergeven","Alle taalopties weergeven","Weergeven in IMAP","Weergeven in labellijst","Indicatoren weergeven","Markeringen weergeven","Mijn webclips boven de inbox weergeven","Zoekopties weergeven","Fragmenten weergeven","Handtekening:","Slim opstellen:","Fragmenten:","Snoozen","Gesnoozed","Sociaal","Zachtgrijs","Geluiden:","Spam","Ster","Met ster","Met ster eerst","Sterren:","Status: IMAP is uitgeschakeld ·","De e-mail van de afgelopen 30 dagen op deze computer opslaan, zodat je die zonder verbinding kunt lezen.","Onderwerp","E-mails voorstellen om op terug te komen","E-mails voorstellen om te beantwoorden","Taken","Sjablonen","Voorwaarden en privacy","Servicevoorwaarden","Tekst","De lay-out zelf kies je in de instellingen van Gplex op google.com.","mail.google.com aanpassen aan de lay-out","Thema's","Dit bericht lijkt gevaarlijk","Aan","Prullenbak","Boom","Verzenden ongedaan maken","Ongelezen","Ongelezen eerst","Pictogram voor ongelezen berichten","Zonder ster","Updates","Gebruikt door Google en Gmail","Automatisch antwoord uit","Automatisch antwoord aan","Automatisch antwoord:","Erg onstabiel, niet aanbevolen. De categorietabbladen komen vaak niet overeen met wat Gmail echt laat zien, dus staan ze uit tenzij je ze hier aanzet.","Video","Video's","Spraak- en videochat is geïnstalleerd.","Spraak- en videochat:","Wallet","Web","Webclips","Webclips tonen nieuwskoppen, blogposts, advertenties en andere items boven je berichten.","Schrijfsuggesties uit","Schrijfsuggesties aan","Je gebruikt momenteel","Je hebt momenteel geen geblokkeerde adressen.","Je hebt geen filters.","Je hebt geen andere accounts ingesteld.","adres","gesprekken per pagina","bewerken","verbergen","","meer","van","of","verwijderen","weergeven"],"pl":["0 wiadomości","1 gwiazdka 4 gwiazdki wszystkie gwiazdki","1. Stan: POP jest wyłączony","Konta","Konta i importowanie","Dodaj adres do przekazywania","Dodaj konto pocztowe","Dodaj więcej miejsca:","Dodaj kolejne konto","Dodaj inny należący do Ciebie adres e-mail","Dodatki","Zaawansowane","Zaawansowane:","Wszystkie","Zawsze używaj https","Archiwizuj","Automatycznie dodawaj sugerowane kontakty:","Automatyczne przejście","Automatycznie zezwalaj na czat osobom, z którymi często się kontaktuję","Wróć do folderu Odebrane","Plaża","Pod skrzynką odbiorczą","Zablokowane adresy:","Połączenie przeglądarki:","Etykiety przycisków:","Kup więcej miejsca","Kalendarz","Anuluj","Gotowe odpowiedzi","Kategorie","Kategorie:","Zmień ustawienia konta:","Zmień hasło","Zmień opcje odzyskiwania hasła","Czat","Historia czatu:","Czat wyłączony","Czat włączony","Czat:","Czaty","Sprawdzaj pocztę z innych kont:","Wybierz motyw:","Wybierz, które kategorie wiadomości mają być kartami w skrzynce odbiorczej.","Klasyczny","Kliknij tutaj, aby","Utwórz","Napisz wiadomość","Instrukcje konfiguracji","Kontakty","Nie udało się sterować oknem tworzenia wiadomości Gmaila.","Nie udało się wypełnić okna tworzenia wiadomości Gmaila.","Nie udało się otworzyć okna tworzenia wiadomości Gmaila.","Nie udało się otworzyć tego wątku","Nie udało się zaznaczyć tych wątków","Utwórz filtr","Utwórz nowy filtr","Utwórz nową etykietę","Własne skróty klawiszowe","Ciemny","Domyślny","Domyślnie „Odpowiedz wszystkim”","Usuń","Usuń na zawsze","Szczegóły","Wyłącz","Wyłącz IMAP","Wyłącz pocztę offline na tym komputerze","Wyłącz POP","Wyłącz przekazywanie","Wyłącz działania po najechaniu kursorem","Wyłącz pocztę offline","Odrzuć","Gęstość wyświetlania","Nie odtwarzaj dźwięków","Dokumenty","Nie używaj zawsze https","Wersje robocze","Drive","Włącz","Włącz IMAP","Włącz pocztę offline na tym komputerze","Włącz POP dla wszystkich wiadomości","Włącz POP dla wiadomości, które przyjdą od teraz","Włącz działania po najechaniu kursorem","Włącz pocztę offline","Odfiltrowana poczta:","Filtry","Filtry i zablokowane adresy","Filtry:","Finanse","Fora","Przekaż dalej","Przekazuj kopię poczty przychodzącej na adres","Przekazywanie i POP","Przekazywanie i POP/IMAP","Przekazywanie:","Ogólne","Pobierz dodatki","Gmail nie przyjął wiadomości.","Gmail nie przyjął wiadomości. Okno tworzenia wiadomości jest nadal otwarte.","Gmail nie udostępnił tej czynności","Język wyświetlania Gmaila:","Gmail jest wyświetlany w układzie wybranym w Gplex. Jeśli przeszkadza to w pracy, wyłącz go w ustawieniach Gplex.","Gmail zapisał wiadomość jako wersję roboczą zamiast ją wysłać.","Okno tworzenia wiadomości Gmaila nie otworzyło się na czas.","Ustawienia konta Google","Gadżet Kalendarza Google","Gplex dla Gmaila jest aktywny","Gplex dla Gmaila:","Przyznaj dostęp do swojego konta:","Hangouts","Pomoc","Wysoki kontrast","Działania po najechaniu kursorem:","Dostęp IMAP:","Ikony","Grafika","Importuj filtry","Importuj z Yahoo!, Hotmail, AOL lub innych kont poczty internetowej albo POP3.","Importuj pocztę i kontakty","Importuj pocztę i kontakty:","Znaczniki ważności:","Ważne","Najpierw ważne","W nowym oknie","Odebrane","Typ skrzynki odbiorczej:","Narzędzia do wprowadzania tekstu","Zainstalowane dodatki:","Skróty klawiszowe wyłączone","Skróty klawiszowe włączone","Skróty klawiszowe:","Etykieta","Etykiety","Etykiety:","Laboratorium","Laboratorium to funkcje eksperymentalne, które w każdej chwili mogą się zmienić, przestać działać lub zniknąć.","Laboratorium:","Język:","Ostatnia aktywność na koncie: 1 minutę temu","Ostatnia aktywność na koncie: 22 minuty temu","Układ","Więcej informacji","Wczytywanie…","Poczta","Zarządzaj","Mapy","Oznacz jako ważne","Oznacz jako nieprzeczytane","Maksymalny rozmiar strony:","Wiadomość wysłana.","Więcej","Więcej działań","Góry","Przenieś do","Wiele skrzynek odbiorczych","Moje klipy:","Moje zdjęcie:","Nigdy nie zapisuj historii czatu","Nowa wiadomość","Nowsze","Najnowsze","Wiadomości","Żadne konto nie ma dostępu.","Nie zainstalowano żadnych dodatków.","Żaden wątek nie pasuje do wyszukiwania.","Bez wskaźników","Bez znaczników","Brak innych skrzynek","Bez podpisu","Bez fragmentów","Bez podziału","Brak","To nie jest spam","Przypomnienia:","Wyłączone – używaj zwykłego Gmaila","Offline","Poczta offline używa Gears do przechowywania poczty na tym komputerze.","Poczta offline:","Starsze","Najstarsze","Włączone – pokazuj Gmaila w układzie","Zezwalaj na czat tylko osobom, które wyraźnie zatwierdziłem","Otwarte w 1 innej lokalizacji","Otwórz tę stronę raz bez Gplex","Zastąp filtry – umieszczaj ważne wiadomości w skrzynce odbiorczej","Pobieranie POP:","Osobiste wskaźniki:","Zdjęcia","Planety","Play","Odtwarzaj dźwięk po nadejściu nowej wiadomości czatu","Panel podglądu","Główne","Drukuj wszystko","Priorytetowe","Prywatność","Polityka prywatności","Zasady programu","Oferty","Cytuj zaznaczony tekst","Przeczytane","Panel odczytu:","Odśwież","Odpowiedz","Zgłoś spam","Zgłoś spam","Z prawej strony skrzynki odbiorczej","Czat po prawej stronie","SZUKAJ W POCZCIE","SZUKAJ W INTERNECIE","Zapisz zmiany","Zapisz teraz","Zapisuj historię czatu na moim koncie Gmail","Szukaj w poczcie","Szukaj w poczcie i Dokumentach","Szukaj według tematu lub adresu URL","Szukaj klipów:","Szukaj w poczcie","Szukaj w internecie","Wyszukiwanie…","Najpierw zaznacz wątek","Wybierz zdjęcie, które zobaczą wszyscy, do których piszesz.","Zaznacz:","Wyślij","Wysyłaj pocztę jako:","Wysyłanie…","Wysłane","Wysłane","Ustaw tutaj swój stan","Błyszczący","Zakupy","Pokaż","Pokaż wszystkie opcje językowe","Pokaż w IMAP","Pokaż na liście etykiet","Pokaż wskaźniki","Pokaż znaczniki","Pokazuj moje klipy internetowe nad skrzynką odbiorczą","Pokaż opcje wyszukiwania","Pokazuj fragmenty","Podpis:","Inteligentne tworzenie:","Fragmenty:","Odłóż","Odłożone","Społeczności","Delikatna szarość","Dźwięki:","Spam","Gwiazdka","Oznaczone gwiazdką","Najpierw oznaczone gwiazdką","Gwiazdki:","Stan: IMAP jest wyłączony ·","Przechowuj pocztę z ostatnich 30 dni na tym komputerze, aby czytać ją bez połączenia.","Temat","Sugeruj e-maile, do których warto wrócić","Sugeruj e-maile, na które warto odpowiedzieć","Lista zadań","Szablony","Warunki i prywatność","Warunki korzystania z usługi","Tekst","Sam układ wybiera się w ustawieniach Gplex na google.com.","Dopasuj mail.google.com do układu","Motywy","Ta wiadomość wygląda na niebezpieczną","Do","Kosz","Drzewo","Cofnij wysłanie","Nieprzeczytane","Najpierw nieprzeczytane","Ikona nieprzeczytanych wiadomości","Bez gwiazdki","Powiadomienia","Używane przez Google i Gmaila","Autoodpowiedź wyłączona","Autoodpowiedź włączona","Autoodpowiedź:","Bardzo niestabilne, niezalecane. Karty kategorii często nie odpowiadają temu, co faktycznie pokazuje Gmail, więc są wyłączone, dopóki ich tu nie włączysz.","Wideo","Wideo","Czat głosowy i wideo jest zainstalowany.","Czat głosowy i wideo:","Wallet","Internet","Klipy internetowe","Klipy internetowe pokazują nagłówki wiadomości, wpisy z blogów, reklamy i inne elementy nad Twoimi wiadomościami.","Sugestie pisania wyłączone","Sugestie pisania włączone","Obecnie używasz","Nie masz obecnie żadnych zablokowanych adresów.","Nie masz filtrów.","Nie masz skonfigurowanych innych kont.","adres","wątków na stronie","edytuj","ukryj","","więcej","z","lub","usuń","pokaż"],"pt":["0 mensagens","1 estrela 4 estrelas todas as estrelas","1. Status: o POP está desativado","Contas","Contas e importação","Adicionar um endereço de encaminhamento","Adicionar uma conta de e-mail","Adicionar mais armazenamento:","Adicionar outra conta","Adicionar outro endereço de e-mail seu","Complementos","Avançado","Avançado:","Todos os e-mails","Sempre usar https","Arquivar","Adicionar contatos sugeridos automaticamente:","Avanço automático","Permitir automaticamente que as pessoas com quem me comunico com frequência conversem comigo","Voltar para a Caixa de entrada","Praia","Abaixo da caixa de entrada","Endereços bloqueados:","Conexão do navegador:","Rótulos dos botões:","Comprar mais armazenamento","Agenda","Cancelar","Respostas prontas","Categorias","Categorias:","Alterar configurações da conta:","Alterar senha","Alterar opções de recuperação de senha","Chat","Histórico do chat:","Chat desativado","Chat ativado","Chat:","Chats","Verificar e-mails de outras contas:","Escolha um tema:","Escolha quais categorias de mensagens mostrar como guias na caixa de entrada.","Clássico","Clique aqui para","Escrever","Escrever e-mail","Instruções de configuração","Contatos","Não foi possível controlar a janela de escrita do Gmail.","Não foi possível preencher a janela de escrita do Gmail.","Não foi possível abrir a janela de escrita do Gmail.","Não foi possível abrir essa conversa","Não foi possível selecionar essas conversas","Criar um filtro","Criar um novo filtro","Criar novo marcador","Atalhos de teclado personalizados","Escuro","Padrão","\"Responder a todos\" como padrão","Excluir","Excluir definitivamente","Detalhes","Desativar","Desativar IMAP","Desativar o e-mail off-line neste computador","Desativar POP","Desativar encaminhamento","Desativar ações ao passar o cursor","Desativar e-mail off-line","Descartar","Densidade de exibição","Não tocar sons","Documentos","Não usar sempre https","Rascunhos","Drive","Ativar","Ativar IMAP","Ativar o e-mail off-line neste computador","Ativar POP para todos os e-mails","Ativar POP para os e-mails que chegarem a partir de agora","Ativar ações ao passar o cursor","Ativar e-mail off-line","E-mails filtrados:","Filtros","Filtros e endereços bloqueados","Filtros:","Finanças","Fóruns","Encaminhar","Encaminhar uma cópia dos e-mails recebidos para","Encaminhamento e POP","Encaminhamento e POP/IMAP","Encaminhamento:","Geral","Instalar complementos","O Gmail não aceitou a mensagem.","O Gmail não aceitou a mensagem. A janela de escrita continua aberta.","O Gmail não ofereceu essa ação","Idioma de exibição do Gmail:","O Gmail está sendo exibido no layout que você escolheu no Gplex. Se isso atrapalhar sua produtividade, desative nas configurações do Gplex.","O Gmail salvou como rascunho em vez de enviar.","A janela de escrita do Gmail não abriu a tempo.","Configurações da Conta do Google","Gadget do Google Agenda","Gplex para Gmail está ativo","Gplex para Gmail:","Conceder acesso à sua conta:","Hangouts","Ajuda","Alto contraste","Ações ao passar o cursor:","Acesso IMAP:","Ícones","Imagens","Importar filtros","Importar do Yahoo!, Hotmail, AOL ou de outras contas de webmail ou POP3.","Importar e-mails e contatos","Importar e-mails e contatos:","Marcadores de importância:","Importante","Importantes primeiro","Em nova janela","Caixa de entrada","Tipo de caixa de entrada:","Ferramentas de entrada","Complementos instalados:","Atalhos de teclado desativados","Atalhos de teclado ativados","Atalhos de teclado:","Marcador","Marcadores","Marcadores:","Labs","Os Labs são recursos experimentais que podem mudar, deixar de funcionar ou desaparecer a qualquer momento.","Labs:","Idioma:","Última atividade da conta: há 1 minuto","Última atividade da conta: há 22 minutos","Layout","Saiba mais","Carregando…","E-mail","Gerenciar","Maps","Marcar como importante","Marcar como não lida","Tamanho máximo da página:","Mensagem enviada.","Mais","Mais ações","Montanhas","Mover para","Várias caixas de entrada","Meus clipes:","Minha foto:","Nunca salvar o histórico do chat","Nova mensagem","Mais recentes","Mais recente","Notícias","Nenhuma conta tem acesso.","Nenhum complemento instalado.","Nenhuma conversa corresponde à sua pesquisa.","Sem indicadores","Sem marcadores","Nenhuma outra caixa postal","Sem assinatura","Sem trechos","Sem divisão","Nenhum","Não é spam","Lembretes:","Desativado – usar o Gmail normal","Off-line","O e-mail off-line usa o Gears para armazenar seus e-mails neste computador.","E-mail off-line:","Mais antigos","Mais antigo","Ativado – mostrar o Gmail no layout","Permitir que conversem comigo somente as pessoas que eu aprovei explicitamente","Aberto em outro local","Abrir esta página sem o Gplex uma vez","Substituir filtros – incluir mensagens importantes na caixa de entrada","Download por POP:","Indicadores pessoais:","Fotos","Planetas","Play","Tocar um som quando chegar uma nova mensagem de chat","Painel de visualização","Principal","Imprimir tudo","Caixa prioritária","Privacidade","Política de Privacidade","Políticas do programa","Promoções","Citar texto selecionado","Lidas","Painel de leitura:","Atualizar","Responder","Denunciar spam","Denunciar spam","À direita da caixa de entrada","Chat do lado direito","PESQUISAR E-MAIL","PESQUISAR NA WEB","Salvar alterações","Salvar agora","Salvar o histórico do chat na minha conta do Gmail","Pesquisar e-mail","Pesquisar e-mail e Documentos","Pesquisar por tema ou URL","Pesquisar clipes:","Pesquisar e-mail","Pesquisar na Web","Pesquisando…","Selecione uma conversa primeiro","Selecione uma foto que todos verão quando você enviar um e-mail.","Selecionar:","Enviar","Enviar e-mail como:","Enviando…","Enviados","E-mails enviados","Defina seu status aqui","Brilhante","Shopping","Mostrar","Mostrar todas as opções de idioma","Mostrar no IMAP","Mostrar na lista de marcadores","Mostrar indicadores","Mostrar marcadores","Mostrar meus clipes da Web acima da caixa de entrada","Mostrar opções de pesquisa","Mostrar trechos","Assinatura:","Escrita inteligente:","Trechos:","Adiar","Adiados","Social","Cinza suave","Sons:","Spam","Estrela","Com estrela","Com estrela primeiro","Estrelas:","Status: o IMAP está desativado ·","Armazenar os e-mails dos últimos 30 dias neste computador para ler sem conexão.","Assunto","Sugerir e-mails para acompanhar","Sugerir e-mails para responder","Tarefas","Modelos","Termos e privacidade","Termos de Serviço","Texto","O layout em si é escolhido nas configurações do Gplex no google.com.","Adaptar o mail.google.com ao layout","Temas","Esta mensagem parece perigosa","Para","Lixeira","Árvore","Cancelar envio","Não lidas","Não lidas primeiro","Ícone de mensagem não lida","Sem estrela","Atualizações","Usado pelo Google e pelo Gmail","Resposta automática desativada","Resposta automática ativada","Resposta automática:","Muito instável, não recomendado. As guias de categorias muitas vezes não correspondem ao que o Gmail realmente mostra, por isso ficam desativadas a menos que você as ative aqui.","Vídeo","Vídeos","O chat de voz e vídeo está instalado.","Chat de voz e vídeo:","Wallet","Web","Clipes da Web","Os clipes da Web mostram manchetes, posts de blogs, anúncios e outros itens acima das suas mensagens.","Sugestões de escrita desativadas","Sugestões de escrita ativadas","Você está usando","Você não tem endereços bloqueados.","Você não tem filtros.","Você não configurou outras contas.","endereço","conversas por página","editar","ocultar","","mais","de","ou","remover","mostrar"],"ru":["0 писем","1 звезда 4 звезды все звезды","1. Статус: POP отключен","Аккаунты","Аккаунты и импорт","Добавить адрес для пересылки","Добавить почтовый аккаунт","Добавить место в хранилище:","Добавить ещё один аккаунт","Добавить ещё один свой адрес электронной почты","Дополнения","Расширенные","Расширенные:","Вся почта","Всегда использовать https","Архивировать","Автоматически добавлять предлагаемые контакты:","Автопереход","Автоматически разрешать чат людям, с которыми я часто общаюсь","Назад во «Входящие»","Пляж","Под папкой «Входящие»","Заблокированные адреса:","Подключение браузера:","Подписи кнопок:","Купить больше места","Календарь","Отмена","Шаблоны ответов","Категории","Категории:","Изменить настройки аккаунта:","Изменить пароль","Изменить параметры восстановления пароля","Чат","История чата:","Чат выключен","Чат включен","Чат:","Чаты","Проверять почту других аккаунтов:","Выберите тему:","Выберите, какие категории писем показывать вкладками в папке «Входящие».","Классическая","Нажмите здесь, чтобы","Написать","Написать письмо","Инструкции по настройке","Контакты","Не удалось управлять окном создания письма Gmail.","Не удалось заполнить окно создания письма Gmail.","Не удалось открыть окно создания письма Gmail.","Не удалось открыть эту цепочку","Не удалось выбрать эти цепочки","Создать фильтр","Создать новый фильтр","Создать ярлык","Собственные быстрые клавиши","Тёмная","По умолчанию","«Ответить всем» по умолчанию","Удалить","Удалить навсегда","Подробнее","Отключить","Отключить IMAP","Отключить офлайн-почту на этом компьютере","Отключить POP","Отключить пересылку","Отключить действия при наведении","Отключить офлайн-почту","Удалить черновик","Плотность отображения","Не воспроизводить звуки","Документы","Не всегда использовать https","Черновики","Диск","Включить","Включить IMAP","Включить офлайн-почту на этом компьютере","Включить POP для всех писем","Включить POP для писем, получаемых с этого момента","Включить действия при наведении","Включить офлайн-почту","Отфильтрованная почта:","Фильтры","Фильтры и заблокированные адреса","Фильтры:","Финансы","Форумы","Переслать","Пересылать копии входящих писем на адрес","Пересылка и POP","Пересылка и POP/IMAP","Пересылка:","Общие","Установить дополнения","Gmail не принял письмо.","Gmail не принял письмо. Окно создания письма всё ещё открыто.","Gmail не предложил это действие","Язык интерфейса Gmail:","Gmail показан в оформлении, выбранном в Gplex. Если это мешает работе, отключите его в настройках Gplex.","Gmail сохранил письмо как черновик вместо отправки.","Окно создания письма Gmail не открылось вовремя.","Настройки аккаунта Google","Гаджет Google Календаря","Gplex для Gmail включен","Gplex для Gmail:","Предоставить доступ к аккаунту:","Hangouts","Справка","Высокая контрастность","Действия при наведении:","Доступ по протоколу IMAP:","Значки","Картинки","Импортировать фильтры","Импорт из Yahoo!, Hotmail, AOL или других аккаунтов веб-почты или POP3.","Импортировать почту и контакты","Импортировать почту и контакты:","Маркеры важности:","Важные","Сначала важные","В новом окне","Входящие","Тип папки «Входящие»:","Способы ввода","Установленные дополнения:","Быстрые клавиши отключены","Быстрые клавиши включены","Быстрые клавиши:","Ярлык","Ярлыки","Ярлыки:","Лаборатория","Лаборатория – это экспериментальные функции, которые могут измениться, перестать работать или исчезнуть в любой момент.","Лаборатория:","Язык:","Последние действия в аккаунте: 1 минуту назад","Последние действия в аккаунте: 22 минуты назад","Оформление","Подробнее","Загрузка…","Почта","Управление","Карты","Пометить как важное","Отметить как непрочитанное","Максимальный размер страницы:","Письмо отправлено.","Ещё","Другие действия","Горы","Переместить в","Несколько папок «Входящие»","Мои клипы:","Моё фото:","Никогда не сохранять историю чата","Новое сообщение","Новее","Самые новые","Новости","Ни у одного аккаунта нет доступа.","Дополнения не установлены.","Нет цепочек, соответствующих вашему запросу.","Без индикаторов","Без маркеров","Других папок нет","Без подписи","Без фрагментов","Без разделения","Нет","Не спам","Напоминания:","Выкл. – обычный Gmail","Офлайн","Офлайн-почта хранит ваши письма на этом компьютере с помощью Gears.","Офлайн-почта:","Старее","Самые старые","Вкл. – показывать Gmail в оформлении","Разрешать чат только людям, которых я явно одобрил","Открыто ещё в 1 месте","Один раз открыть эту страницу без Gplex","Игнорировать фильтры – включать важные письма во «Входящие»","Загрузка по POP:","Персональные индикаторы:","Фото","Планеты","Play","Воспроизводить звук при получении нового сообщения чата","Панель просмотра","Несортированные","Распечатать все","Приоритетные","Конфиденциальность","Политика конфиденциальности","Правила программы","Промоакции","Цитировать выделенный текст","Прочитанные","Область просмотра:","Обновить","Ответить","В спам","В спам","Справа от «Входящих»","Чат справа","ИСКАТЬ В ПОЧТЕ","ИСКАТЬ В ИНТЕРНЕТЕ","Сохранить изменения","Сохранить","Сохранять историю чата в моём аккаунте Gmail","Искать в почте","Искать в почте и Документах","Поиск по теме или URL","Поиск клипов:","Поиск в почте","Искать в Интернете","Поиск…","Сначала выберите цепочку","Выберите фото, которое увидят все, кому вы пишете.","Выбрать:","Отправить","Отправлять письма как:","Отправка…","Отправленные","Отправленные","Укажите здесь свой статус","Глянец","Покупки","Показать","Показать все языковые параметры","Показывать в IMAP","Показывать в списке ярлыков","Показывать индикаторы","Показывать маркеры","Показывать мои веб-клипы над папкой «Входящие»","Показать параметры поиска","Показывать фрагменты","Подпись:","Умный ввод:","Фрагменты:","Отложить","Отложенные","Соцсети","Мягкий серый","Звуки:","Спам","Пометить","Помеченные","Сначала помеченные","Звезды:","Статус: IMAP отключен ·","Хранить почту за последние 30 дней на этом компьютере, чтобы читать её без подключения.","Тема","Предлагать письма, к которым стоит вернуться","Предлагать письма, на которые стоит ответить","Задачи","Шаблоны","Условия и конфиденциальность","Условия использования","Текст","Само оформление выбирается в настройках Gplex на google.com.","Оформлять mail.google.com в выбранном стиле","Темы","Это письмо кажется опасным","Кому","Корзина","Дерево","Отмена отправки","Непрочитанные","Сначала непрочитанные","Значок непрочитанных писем","Без пометки","Оповещения","Используется и Google, и Gmail","Автоответчик выключен","Автоответчик включен","Автоответчик:","Очень нестабильно, не рекомендуется. Вкладки категорий часто не совпадают с тем, что на самом деле показывает Gmail, поэтому они выключены, пока вы не включите их здесь.","Видео","Видео","Голосовой и видеочат установлен.","Голосовой и видеочат:","Wallet","Веб","Веб-клипы","Веб-клипы показывают заголовки новостей, записи блогов, рекламу и другие материалы над вашими письмами.","Подсказки при вводе выключены","Подсказки при вводе включены","Сейчас используется","У вас нет заблокированных адресов.","У вас нет фильтров.","Другие аккаунты не настроены.","адрес","цепочек на странице","изменить","скрыть","","ещё","из","или","удалить","показать"],"tr":["0 ileti","1 yıldız 4 yıldız tüm yıldızlar","1. Durum: POP devre dışı","Hesaplar","Hesaplar ve İçe Aktarma","Yönlendirme adresi ekle","Posta hesabı ekle","Ek depolama alanı ekle:","Başka bir hesap ekle","Sahip olduğunuz başka bir e-posta adresini ekleyin","Eklentiler","Gelişmiş","Gelişmiş:","Tüm Postalar","Her zaman https kullan","Arşivle","Önerilen kişileri otomatik ekle:","Otomatik ilerle","Sık iletişim kurduğum kişilerin benimle sohbet etmesine otomatik olarak izin ver","Gelen Kutusu'na dön","Plaj","Gelen kutusunun altında","Engellenen adresler:","Tarayıcı bağlantısı:","Düğme etiketleri:","Daha fazla depolama alanı satın al","Takvim","İptal","Hazır Yanıtlar","Kategoriler","Kategoriler:","Hesap ayarlarını değiştir:","Şifreyi değiştir","Şifre kurtarma seçeneklerini değiştir","Sohbet","Sohbet geçmişi:","Sohbet kapalı","Sohbet açık","Sohbet:","Sohbetler","Diğer hesaplardaki postaları kontrol et:","Tema seçin:","Gelen kutusunda sekme olarak gösterilecek ileti kategorilerini seçin.","Klasik","Buraya tıklayarak","Oluştur","Posta Oluştur","Yapılandırma talimatları","Kişiler","Gmail'in oluşturma penceresi kontrol edilemedi.","Gmail'in oluşturma penceresi doldurulamadı.","Gmail'in oluşturma penceresi açılamadı.","Bu görüşme açılamadı","Bu görüşmeler seçilemedi","Filtre oluştur","Yeni filtre oluştur","Yeni etiket oluştur","Özel klavye kısayolları","Koyu","Varsayılan","Varsayılan olarak \"Tümünü yanıtla\"","Sil","Kalıcı olarak sil","Ayrıntılar","Devre dışı bırak","IMAP'i devre dışı bırak","Bu bilgisayarda çevrimdışı postayı devre dışı bırak","POP'u devre dışı bırak","Yönlendirmeyi devre dışı bırak","Fareyle üzerine gelme işlemlerini devre dışı bırak","Çevrimdışı postayı devre dışı bırak","Sil","Görüntü yoğunluğu","Ses çalma","Dokümanlar","Her zaman https kullanma","Taslaklar","Drive","Etkinleştir","IMAP'i etkinleştir","Bu bilgisayarda çevrimdışı postayı etkinleştir","Tüm postalar için POP'u etkinleştir","Şu andan itibaren gelen postalar için POP'u etkinleştir","Fareyle üzerine gelme işlemlerini etkinleştir","Çevrimdışı postayı etkinleştir","Filtrelenen posta:","Filtreler","Filtreler ve Engellenen Adresler","Filtreler:","Finans","Forumlar","Yönlendir","Gelen postanın bir kopyasını şuraya yönlendir:","Yönlendirme ve POP","Yönlendirme ve POP/IMAP","Yönlendirme:","Genel","Eklenti edinin","Gmail iletiyi kabul etmedi.","Gmail iletiyi kabul etmedi. Oluşturma penceresi hâlâ açık.","Gmail bu işlemi sunmadı","Gmail görüntüleme dili:","Gmail, Gplex'te seçtiğiniz düzende gösteriliyor. Verimliliğinizi etkilediğini düşünüyorsanız Gplex ayarlarından kapatın.","Gmail iletiyi göndermek yerine taslak olarak kaydetti.","Gmail'in oluşturma penceresi zamanında açılmadı.","Google Hesabı ayarları","Google Takvim aracı","Gmail için Gplex etkin","Gmail için Gplex:","Hesabınıza erişim izni verin:","Hangouts","Yardım","Yüksek Kontrast","Fareyle üzerine gelme işlemleri:","IMAP Erişimi:","Simgeler","Görseller","Filtreleri içe aktar","Yahoo!, Hotmail, AOL veya diğer web postası ya da POP3 hesaplarından içe aktarın.","Postaları ve kişileri içe aktar","Postaları ve kişileri içe aktar:","Önem işaretleri:","Önemli","Önce önemliler","Yeni pencerede","Gelen Kutusu","Gelen kutusu türü:","Giriş araçları","Yüklü eklentiler:","Klavye kısayolları kapalı","Klavye kısayolları açık","Klavye kısayolları:","Etiket","Etiketler","Etiketler:","Labs","Labs, her an değişebilecek, bozulabilecek veya kaybolabilecek deneysel özelliklerdir.","Labs:","Dil:","Son hesap etkinliği: 1 dakika önce","Son hesap etkinliği: 22 dakika önce","Düzen","Daha fazla bilgi","Yükleniyor…","Posta","Yönet","Haritalar","Önemli olarak işaretle","Okunmadı olarak işaretle","Maksimum sayfa boyutu:","İleti gönderildi.","Diğer","Diğer işlemler","Dağlar","Şuraya taşı","Birden Fazla Gelen Kutusu","Kliplerim:","Resmim:","Sohbet geçmişini hiçbir zaman kaydetme","Yeni İleti","Daha yeni","En yeni","Haberler","Hiçbir hesabın erişimi yok.","Yüklü eklenti yok.","Aramanızla eşleşen görüşme yok.","Gösterge yok","İşaret yok","Başka posta kutusu yok","İmza yok","Snippet yok","Bölme yok","Yok","Spam değil","Hatırlatmalar:","Kapalı – normal Gmail'i kullan","Çevrimdışı","Çevrimdışı posta, postalarınızı bu bilgisayarda depolamak için Gears'ı kullanır.","Çevrimdışı posta:","Daha eski","En eski","Açık – Gmail'i şu düzende göster:","Yalnızca açıkça onayladığım kişilerin benimle sohbet etmesine izin ver","1 başka konumda açık","Bu sayfayı bir kez Gplex olmadan aç","Filtreleri geçersiz kıl – önemli iletileri gelen kutusuna dahil et","POP İndirme:","Kişisel düzey göstergeleri:","Fotoğraflar","Gezegenler","Play","Yeni bir sohbet iletisi geldiğinde ses çal","Önizleme Bölmesi","Birincil","Tümünü yazdır","Öncelikli Gelen Kutusu","Gizlilik","Gizlilik Politikası","Program Politikaları","Promosyonlar","Seçili metni alıntıla","Okundu","Okuma bölmesi:","Yenile","Yanıtla","Spam bildir","Spam bildir","Gelen kutusunun sağında","Sağ tarafta sohbet","POSTALARDA ARA","WEB'DE ARA","Değişiklikleri Kaydet","Şimdi Kaydet","Sohbet geçmişini Gmail hesabımda kaydet","Postalarda Ara","Postalarda ve Dokümanlarda Ara","Konuya veya URL'ye göre ara","Klip ara:","Postalarda ara","Web'de Ara","Aranıyor…","Önce bir görüşme seçin","E-posta gönderdiğiniz herkesin göreceği bir resim seçin.","Seç:","Gönder","Farklı adla posta gönder:","Gönderiliyor…","Gönderilmiş","Gönderilmiş Postalar","Durumu buradan ayarlayın","Parlak","Alışveriş","Göster","Tüm dil seçeneklerini göster","IMAP'te göster","Etiket listesinde göster","Göstergeleri göster","İşaretleri göster","Web kliplerimi Gelen Kutusu'nun üstünde göster","Arama seçeneklerini göster","Snippet'leri göster","İmza:","Akıllı Yazma:","Snippet'ler:","Ertele","Ertelenenler","Sosyal","Yumuşak Gri","Sesler:","Spam","Yıldız","Yıldızlı","Önce yıldızlılar","Yıldızlar:","Durum: IMAP devre dışı ·","Son 30 günün postalarını bağlantı olmadan okuyabilmek için bu bilgisayarda depolayın.","Konu","Takip edilecek e-postaları öner","Yanıtlanacak e-postaları öner","Görevler","Şablonlar","Şartlar ve Gizlilik","Kullanım Şartları","Metin","Düzenin kendisi google.com'daki Gplex ayarlarından seçilir.","mail.google.com'u düzene uydur","Temalar","Bu ileti tehlikeli görünüyor","Kime","Çöp Kutusu","Ağaç","Göndermeyi Geri Al","Okunmamış","Önce okunmamışlar","Okunmamış ileti simgesi","Yıldızsız","Güncellemeler","Hem Google hem de Gmail tarafından kullanılır","Otomatik yanıtlayıcı kapalı","Otomatik yanıtlayıcı açık","Otomatik yanıtlayıcı:","Çok hatalı, önerilmez. Kategori sekmeleri çoğu zaman Gmail'in gerçekte gösterdiğiyle eşleşmez; bu nedenle burada açmadığınız sürece kapalıdır.","Video","Videolar","Sesli ve görüntülü sohbet yüklü.","Sesli ve görüntülü sohbet:","Wallet","Web","Web Klipleri","Web klipleri, iletilerinizin üstünde haber başlıklarını, blog yayınlarını, reklamları ve diğer öğeleri gösterir.","Yazma önerileri kapalı","Yazma önerileri açık","Şu anda kullandığınız","Engellenmiş adresiniz yok.","Filtreniz yok.","Başka hesap ayarlamadınız.","adres","sayfa başına görüşme","düzenle","gizle","","diğer","/","veya","kaldır","göster"],"zh-CN":["0 封邮件","1 颗星 4 颗星 所有星标","1. 状态:POP 已停用","帐号","帐号和导入","添加转发地址","添加邮件帐号","添加额外存储空间:","添加其他帐号","添加您拥有的其他电子邮件地址","插件","高级","高级:","所有邮件","始终使用 https","归档","自动添加建议的联系人:","自动推进","自动允许与我经常联系的人和我聊天","返回收件箱","海滩","收件箱下方","已屏蔽的地址:","浏览器连接:","按钮标签:","购买更多存储空间","日历","取消","自动回复模板","类别","类别:","更改帐号设置:","更改密码","更改密码恢复选项","聊天","聊天记录:","聊天已关闭","聊天已开启","聊天:","聊天","查收其他帐号的邮件:","选择主题背景:","选择要在收件箱中以标签页形式显示的邮件类别。","经典","点击此处","写邮件","写邮件","配置说明","通讯录","无法操作 Gmail 的写邮件窗口。","无法填写 Gmail 的写邮件窗口。","无法打开 Gmail 的写邮件窗口。","无法打开该会话","无法选择这些会话","创建过滤器","创建新过滤器","新建标签","自定义键盘快捷键","深色","默认","默认“回复全部”","删除","永久删除","详细信息","停用","停用 IMAP","在此计算机上停用离线邮件","停用 POP","停用转发","停用悬停操作","停用离线邮件","舍弃","显示密度","不播放声音","文档","不始终使用 https","草稿","云端硬盘","启用","启用 IMAP","在此计算机上启用离线邮件","对所有邮件启用 POP","对从现在起收到的邮件启用 POP","启用悬停操作","启用离线邮件","已过滤的邮件:","过滤器","过滤器和已屏蔽的地址","过滤器:","财经","论坛","转发","将收到的邮件副本转发到","转发和 POP","转发和 POP/IMAP","转发:","常规","获取插件","Gmail 未接受该邮件。","Gmail 未接受该邮件。写邮件窗口仍处于打开状态。","Gmail 未提供该操作","Gmail 显示语言:","Gmail 正以您在 Gplex 中选择的布局显示。如果影响工作效率,请在 Gplex 设置中将其关闭。","Gmail 将其保存为草稿,而没有发送。","Gmail 的写邮件窗口未能及时打开。","Google 帐号设置","Google 日历小工具","Gmail 版 Gplex 已启用","Gmail 版 Gplex:","授予您帐号的访问权限:","环聊","帮助","高对比度","悬停操作:","IMAP 访问:","图标","图片","导入过滤器","从 Yahoo!、Hotmail、AOL 或其他网页邮件或 POP3 帐号导入。","导入邮件和联系人","导入邮件和联系人:","重要性标记:","重要邮件","重要邮件优先","在新窗口中打开","收件箱","收件箱类型:","输入工具","已安装的插件:","键盘快捷键已关闭","键盘快捷键已开启","键盘快捷键:","标签","标签","标签:","实验室","实验室功能是实验性功能,可能随时更改、出错或消失。","实验室:","语言:","上次帐号活动时间:1 分钟前","上次帐号活动时间:22 分钟前","布局","了解详情","正在加载…","邮件","管理","地图","标记为重要","标记为未读","每页最多显示:","邮件已发送。","更多","更多操作","群山","移至","多个收件箱","我的剪辑:","我的照片:","从不保存聊天记录","新邮件","较新","最新","新闻","没有帐号拥有访问权限。","未安装任何插件。","没有与您的搜索相符的会话。","无指示标志","无标记","没有其他邮箱","无签名","不显示摘要","不拆分","无","不是垃圾邮件","提醒:","关闭 – 使用普通 Gmail","离线","离线邮件使用 Gears 将您的邮件存储在此计算机上。","离线邮件:","较早","最早","开启 – 以","仅允许我明确批准的人和我聊天","在另外 1 个位置打开","不使用 Gplex 打开此页一次","忽略过滤器 – 在收件箱中包含重要邮件","POP 下载:","个人级别指示标志:","相册","行星","Play","收到新聊天消息时播放提示音","预览窗格","主要","全部打印","优先收件箱","隐私权","隐私权政策","计划政策","推广","引用所选文字","已读","阅读窗格:","刷新","回复","举报垃圾邮件","举报垃圾邮件","收件箱右侧","右侧聊天","搜索邮件","搜索网页","保存更改","立即保存","在我的 Gmail 帐号中保存聊天记录","搜索邮件","搜索邮件和文档","按主题或网址搜索","搜索剪辑:","搜索邮件","搜索网页","正在搜索…","请先选择一个会话","选择一张照片,您给别人发邮件时大家都会看到它。","选择:","发送","用这个地址发送邮件:","正在发送…","已发送","已发送邮件","在此设置状态","亮泽","购物","显示","显示所有语言选项","在 IMAP 中显示","在标签列表中显示","显示指示标志","显示标记","在收件箱上方显示我的网页剪辑","显示搜索选项","显示摘要","签名:","智能写作:","摘要:","延后","已延后","社交","柔和灰","声音:","垃圾邮件","星标","已加星标","已加星标的邮件优先","星标:","状态:IMAP 已停用 ·","将最近 30 天的邮件存储在此计算机上,以便在没有网络连接时阅读。","主题","建议需要跟进的邮件","建议需要回复的邮件","任务","模板","条款和隐私权","使用条款","文字","布局本身在 google.com 上的 Gplex 设置中选择。","让 mail.google.com 的外观与布局一致","主题背景","这封邮件似乎有危险","收件人","已删除邮件","树木","撤消发送","未读","未读邮件优先","未读邮件图标","未加星标","动态","由 Google 和 Gmail 共同使用","自动回复已关闭","自动回复已开启","休假自动回复:","问题很多,不建议使用。类别标签页经常与 Gmail 实际显示的内容不一致,因此除非您在此处开启,否则会保持关闭。","视频","视频","已安装语音和视频聊天。","语音和视频聊天:","钱包","网页","网页剪辑","网页剪辑会在您的邮件上方显示新闻标题、博客文章、广告及其他内容。","写作建议已关闭","写作建议已开启","您目前已使用","您目前没有已屏蔽的地址。","您没有过滤器。","您尚未设置其他帐号。","地址","个会话/页","修改","隐藏","布局显示 Gmail","更多","/","或","移除","显示"],"zh-TW":["0 封郵件","1 顆星 4 顆星 所有星號","1. 狀態:POP 已停用","帳戶","帳戶和匯入","新增轉寄地址","新增郵件帳戶","新增額外儲存空間:","新增其他帳戶","新增您擁有的其他電子郵件地址","外掛程式","進階","進階:","所有郵件","一律使用 https","封存","自動新增建議的聯絡人:","自動前進","自動允許經常與我聯絡的人和我即時通訊","返回收件匣","海灘","收件匣下方","已封鎖的地址:","瀏覽器連線:","按鈕標籤:","購買更多儲存空間","日曆","取消","罐頭回應","類別","類別:","變更帳戶設定:","變更密碼","變更密碼復原選項","即時通訊","即時通訊記錄:","即時通訊已關閉","即時通訊已開啟","即時通訊:","即時通訊","查看其他帳戶的郵件:","選擇主題:","選擇要在收件匣中以分頁顯示的郵件類別。","經典","按一下這裡","撰寫","撰寫郵件","設定操作說明","聯絡人","無法操作 Gmail 的撰寫視窗。","無法填寫 Gmail 的撰寫視窗。","無法開啟 Gmail 的撰寫視窗。","無法開啟這個會話群組","無法選取這些會話群組","建立篩選器","建立新篩選器","建立新標籤","自訂鍵盤快速鍵","深色","預設","預設「回覆所有人」","刪除","永久刪除","詳細資料","停用","停用 IMAP","在這部電腦上停用離線郵件","停用 POP","停用轉寄","停用懸停操作","停用離線郵件","捨棄","顯示密度","不播放音效","文件","不一律使用 https","草稿","雲端硬碟","啟用","啟用 IMAP","在這部電腦上啟用離線郵件","對所有郵件啟用 POP","對從現在起收到的郵件啟用 POP","啟用懸停操作","啟用離線郵件","已篩選的郵件:","篩選器","篩選器和封鎖的地址","篩選器:","財經","論壇","轉寄","將收到的郵件副本轉寄到","轉寄和 POP","轉寄和 POP/IMAP","轉寄:","一般設定","取得外掛程式","Gmail 未接受這封郵件。","Gmail 未接受這封郵件。撰寫視窗仍然開啟。","Gmail 沒有提供這項操作","Gmail 顯示語言:","Gmail 正以您在 Gplex 中選擇的版面配置顯示。如果影響工作效率,請到 Gplex 設定中將其關閉。","Gmail 將郵件儲存為草稿,而沒有寄出。","Gmail 的撰寫視窗未能及時開啟。","Google 帳戶設定","Google 日曆小工具","Gmail 版 Gplex 已啟用","Gmail 版 Gplex:","授予您帳戶的存取權:","Hangouts","說明","高對比","懸停操作:","IMAP 存取:","圖示","圖片","匯入篩選器","從 Yahoo!、Hotmail、AOL 或其他網路郵件或 POP3 帳戶匯入。","匯入郵件和聯絡人","匯入郵件和聯絡人:","重要性標記:","重要郵件","重要郵件優先","在新視窗中開啟","收件匣","收件匣類型:","輸入工具","已安裝的外掛程式:","鍵盤快速鍵已關閉","鍵盤快速鍵已開啟","鍵盤快速鍵:","標籤","標籤","標籤:","研究室","研究室是實驗性功能,隨時可能變更、失效或消失。","研究室:","語言:","上次帳戶活動:1 分鐘前","上次帳戶活動:22 分鐘前","版面配置","瞭解詳情","載入中…","郵件","管理","地圖","標示為重要郵件","標示為未讀取","每頁顯示上限:","郵件已寄出。","更多","更多操作","山脈","移至","多個收件匣","我的剪輯:","我的相片:","永不儲存即時通訊記錄","新郵件","較新","最新","新聞","沒有帳戶擁有存取權。","未安裝任何外掛程式。","沒有符合搜尋條件的會話群組。","不顯示指標","不顯示標記","沒有其他信箱","無簽名","不顯示摘要","不分割","無","不是垃圾郵件","提醒:","關閉 – 使用一般 Gmail","離線","離線郵件使用 Gears 將您的郵件儲存在這部電腦上。","離線郵件:","較舊","最舊","開啟 – 以","只允許我明確核准的人和我即時通訊","在其他 1 個位置開啟","不使用 Gplex 開啟此頁一次","覆寫篩選器 – 在收件匣中納入重要郵件","POP 下載:","個人層級指標:","相簿","行星","Play","收到新的即時訊息時播放音效","預覽窗格","主要","全部列印","優先收件匣","隱私權","隱私權政策","計畫政策","促銷內容","引用選取的文字","已讀取","閱讀窗格:","重新整理","回覆","回報垃圾郵件","回報垃圾郵件","收件匣右側","右側即時通訊","搜尋郵件","搜尋網頁","儲存變更","立即儲存","在我的 Gmail 帳戶中儲存即時通訊記錄","搜尋郵件","搜尋郵件和文件","依主題或網址搜尋","搜尋剪輯:","搜尋郵件","搜尋網頁","搜尋中…","請先選取一個會話群組","選取一張相片,您寄信給別人時大家都會看到。","選取:","傳送","選擇寄件地址:","傳送中…","寄件備份","寄件備份","在這裡設定狀態","亮面","購物","顯示","顯示所有語言選項","在 IMAP 中顯示","在標籤清單中顯示","顯示指標","顯示標記","在收件匣上方顯示我的網頁剪輯","顯示搜尋選項","顯示摘要","簽名:","智慧撰寫:","摘要:","延後","已延後","社交網路","柔和灰","音效:","垃圾郵件","星號","已加星號","已加星號郵件優先","星號:","狀態:IMAP 已停用 ·","將最近 30 天的郵件儲存在這部電腦上,讓您在沒有網路連線時也能閱讀。","主旨","建議需要追蹤的郵件","建議需要回覆的郵件","Tasks","範本","條款及隱私權","使用條款","文字","版面配置本身是在 google.com 的 Gplex 設定中選擇。","讓 mail.google.com 的外觀配合版面配置","主題","這封郵件似乎有危險","收件者","垃圾桶","樹木","復原傳送","未讀取","未讀取郵件優先","未讀取郵件圖示","未加星號","最新快訊","由 Google 和 Gmail 共同使用","休假回覆已關閉","休假回覆已開啟","休假回覆:","問題很多,不建議使用。類別分頁經常與 Gmail 實際顯示的內容不一致,因此除非您在這裡開啟,否則會保持關閉。","影片","影片","已安裝語音和視訊即時通訊。","語音和視訊即時通訊:","錢包","網頁","網頁剪輯","網頁剪輯會在您的郵件上方顯示新聞標題、網誌文章、廣告和其他項目。","寫作建議已關閉","寫作建議已開啟","您目前已使用","您目前沒有已封鎖的地址。","您沒有任何篩選器。","您尚未設定其他帳戶。","地址","個會話群組/頁","編輯","隱藏","版面配置顯示 Gmail","更多","/","或","移除","顯示"]}; // extra strings (s: Gmail only, g: google.com too) and the patterns for text Gplex // builds from figures: counts, storage, "Moving to Spam..." const UGF_GMAIL_I18N_X = {"de":{"s":{"(no subject)":"(kein Betreff)","to me":"an mich","many":"vielen","Save Draft":"Entwurf speichern","Share":"Teilen","Close":"Schließen"},"g":{"Gplex for Gmail":"Gplex für Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Legt fest, ob mail.google.com passend zum oben gewählten Layout gestaltet wird. Schalten Sie dies aus, um das normale Gmail zurückzubekommen, ohne den Rest von Gplex auszuschalten."},"p":{"gcount":"{a}–{b} von {c}","gcountmany":"{a}–{b} von vielen","gof":"{a} von {b}","gusedof":"{u} von {q} belegt","gofyour":"von Ihren {q}.","gmoving":"Wird verschoben nach {x}…","gbackto":"Zurück zu {x}","gdraftat":"Entwurf um {t} gespeichert.","gdefault":"{e} (Standard)"}},"es":{"s":{"(no subject)":"(sin asunto)","to me":"para mí","many":"muchos","Save Draft":"Guardar borrador","Share":"Compartir","Close":"Cerrar"},"g":{"Gplex for Gmail":"Gplex para Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Elige si mail.google.com se muestra con el diseño que elegiste arriba. Desactívalo para recuperar el Gmail normal sin desactivar el resto de Gplex."},"p":{"gcount":"{a}–{b} de {c}","gcountmany":"{a}–{b} de muchos","gof":"{a} de {b}","gusedof":"{u} de {q} en uso","gofyour":"de tus {q}.","gmoving":"Moviendo a {x}…","gbackto":"Volver a {x}","gdraftat":"Borrador guardado a las {t}.","gdefault":"{e} (predeterminada)"}},"fr":{"s":{"(no subject)":"(aucun objet)","to me":"à moi","many":"plusieurs","Save Draft":"Enregistrer le brouillon","Share":"Partager","Close":"Fermer"},"g":{"Gplex for Gmail":"Gplex pour Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Choisissez si mail.google.com adopte la mise en page choisie ci-dessus. Désactivez cette option pour retrouver le Gmail normal sans désactiver le reste de Gplex."},"p":{"gcount":"{a}–{b} sur {c}","gcountmany":"{a}–{b} sur plusieurs","gof":"{a} sur {b}","gusedof":"{u} utilisés sur {q}","gofyour":"sur vos {q}.","gmoving":"Déplacement vers {x}…","gbackto":"Retour à {x}","gdraftat":"Brouillon enregistré à {t}.","gdefault":"{e} (par défaut)"}},"it":{"s":{"(no subject)":"(nessun oggetto)","to me":"a me","many":"molti","Save Draft":"Salva bozza","Share":"Condividi","Close":"Chiudi"},"g":{"Gplex for Gmail":"Gplex per Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Scegli se applicare a mail.google.com il layout scelto sopra. Disattiva questa opzione per tornare al Gmail normale senza disattivare il resto di Gplex."},"p":{"gcount":"{a}–{b} di {c}","gcountmany":"{a}–{b} di molti","gof":"{a} di {b}","gusedof":"{u} di {q} utilizzati","gofyour":"dei tuoi {q}.","gmoving":"Spostamento in {x}…","gbackto":"Torna a {x}","gdraftat":"Bozza salvata alle {t}.","gdefault":"{e} (predefinito)"}},"ja":{"s":{"(no subject)":"(件名なし)","to me":"To 自分","many":"多数","Save Draft":"下書きを保存","Share":"共有","Close":"閉じる"},"g":{"Gplex for Gmail":"Gmail 版 Gplex","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"mail.google.com を上で選んだレイアウトに合わせるかどうかを選びます。Gplex の他の機能はそのままで通常の Gmail に戻すには、オフにしてください。"},"p":{"gcount":"{a}–{b} / {c}","gcountmany":"{a}–{b} / 多数","gof":"{a} / {b}","gusedof":"{q} 中 {u} を使用中","gofyour":"/ {q}","gmoving":"{x} に移動しています…","gbackto":"{x} に戻る","gdraftat":"{t} に下書きを保存しました。","gdefault":"{e}(デフォルト)"}},"ko":{"s":{"(no subject)":"(제목 없음)","to me":"나에게","many":"다수","Save Draft":"임시보관함에 저장","Share":"공유","Close":"닫기"},"g":{"Gplex for Gmail":"Gmail용 Gplex","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"mail.google.com을 위에서 선택한 레이아웃에 맞게 꾸밀지 선택합니다. Gplex의 나머지 기능은 그대로 두고 기본 Gmail로 돌아가려면 사용 중지하세요."},"p":{"gcount":"{a}–{b} / {c}","gcountmany":"{a}–{b} / 다수","gof":"{a} / {b}","gusedof":"{q} 중 {u} 사용 중","gofyour":"/ {q}","gmoving":"{x}(으)로 이동하는 중…","gbackto":"{x}(으)로 돌아가기","gdraftat":"{t}에 임시보관함에 저장했습니다.","gdefault":"{e} (기본값)"}},"nl":{"s":{"(no subject)":"(geen onderwerp)","to me":"aan mij","many":"vele","Save Draft":"Concept opslaan","Share":"Delen","Close":"Sluiten"},"g":{"Gplex for Gmail":"Gplex voor Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Kies of mail.google.com wordt aangepast aan de hierboven gekozen lay-out. Zet dit uit om de normale Gmail terug te krijgen zonder de rest van Gplex uit te zetten."},"p":{"gcount":"{a}–{b} van {c}","gcountmany":"{a}–{b} van vele","gof":"{a} van {b}","gusedof":"{u} van {q} gebruikt","gofyour":"van je {q}.","gmoving":"Verplaatsen naar {x}…","gbackto":"Terug naar {x}","gdraftat":"Concept opgeslagen om {t}.","gdefault":"{e} (standaard)"}},"pl":{"s":{"(no subject)":"(bez tematu)","to me":"do mnie","many":"wielu","Save Draft":"Zapisz wersję roboczą","Share":"Udostępnij","Close":"Zamknij"},"g":{"Gplex for Gmail":"Gplex dla Gmaila","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Wybierz, czy mail.google.com ma być dopasowany do wybranego powyżej układu. Wyłącz to, aby wrócić do zwykłego Gmaila bez wyłączania reszty Gplex."},"p":{"gcount":"{a}–{b} z {c}","gcountmany":"{a}–{b} z wielu","gof":"{a} z {b}","gusedof":"Wykorzystano {u} z {q}","gofyour":"z dostępnych {q}.","gmoving":"Przenoszenie do: {x}…","gbackto":"Wróć do: {x}","gdraftat":"Wersja robocza zapisana o {t}.","gdefault":"{e} (domyślny)"}},"pt":{"s":{"(no subject)":"(sem assunto)","to me":"para mim","many":"muitas","Save Draft":"Salvar rascunho","Share":"Compartilhar","Close":"Fechar"},"g":{"Gplex for Gmail":"Gplex para Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Escolha se o mail.google.com usa o layout escolhido acima. Desative para voltar ao Gmail normal sem desativar o resto do Gplex."},"p":{"gcount":"{a}–{b} de {c}","gcountmany":"{a}–{b} de muitas","gof":"{a} de {b}","gusedof":"{u} de {q} usados","gofyour":"dos seus {q}.","gmoving":"Movendo para {x}…","gbackto":"Voltar para {x}","gdraftat":"Rascunho salvo às {t}.","gdefault":"{e} (padrão)"}},"ru":{"s":{"(no subject)":"(без темы)","to me":"мне","many":"многих","Save Draft":"Сохранить черновик","Share":"Поделиться","Close":"Закрыть"},"g":{"Gplex for Gmail":"Gplex для Gmail","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"Выберите, оформлять ли mail.google.com в стиле, выбранном выше. Отключите, чтобы вернуть обычный Gmail, не отключая остальной Gplex."},"p":{"gcount":"{a}–{b} из {c}","gcountmany":"{a}–{b} из многих","gof":"{a} из {b}","gusedof":"Использовано {u} из {q}","gofyour":"из {q}.","gmoving":"Перемещение: {x}…","gbackto":"Назад: {x}","gdraftat":"Черновик сохранен в {t}.","gdefault":"{e} (по умолчанию)"}},"tr":{"s":{"(no subject)":"(konu yok)","to me":"alıcı: ben","many":"çok sayıda","Save Draft":"Taslağı kaydet","Share":"Paylaş","Close":"Kapat"},"g":{"Gplex for Gmail":"Gmail için Gplex","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"mail.google.com'un yukarıda seçtiğiniz düzene uydurulup uydurulmayacağını seçin. Gplex'in geri kalanını kapatmadan normal Gmail'e dönmek için bunu kapatın."},"p":{"gcount":"{a}–{b} / {c}","gcountmany":"{a}–{b} / çok sayıda","gof":"{a} / {b}","gusedof":"{u} / {q} kullanılıyor","gofyour":"/ {q}.","gmoving":"{x} konumuna taşınıyor…","gbackto":"{x} bölümüne dön","gdraftat":"Taslak {t} saatinde kaydedildi.","gdefault":"{e} (varsayılan)"}},"zh-CN":{"s":{"(no subject)":"(无主题)","to me":"发送至 我","many":"很多","Save Draft":"保存草稿","Share":"分享","Close":"关闭"},"g":{"Gplex for Gmail":"Gmail 版 Gplex","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"选择是否让 mail.google.com 采用上面选择的布局。关闭此项可恢复普通 Gmail,而不会关闭 Gplex 的其他功能。"},"p":{"gcount":"第 {a}–{b} 封,共 {c} 封","gcountmany":"第 {a}–{b} 封,共很多封","gof":"第 {a} 封,共 {b} 封","gusedof":"已使用 {u},共 {q}","gofyour":"(共 {q})。","gmoving":"正在移至“{x}”…","gbackto":"返回{x}","gdraftat":"草稿已于 {t} 保存。","gdefault":"{e}(默认)"}},"zh-TW":{"s":{"(no subject)":"(無主旨)","to me":"寄給 我","many":"很多","Save Draft":"儲存草稿","Share":"分享","Close":"關閉"},"g":{"Gplex for Gmail":"Gmail 版 Gplex","Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.":"選擇是否讓 mail.google.com 採用上方選擇的版面配置。關閉此項即可恢復一般 Gmail,而不會關閉 Gplex 的其他功能。"},"p":{"gcount":"第 {a}–{b} 封,共 {c} 封","gcountmany":"第 {a}–{b} 封,共很多封","gof":"第 {a} 封,共 {b} 封","gusedof":"已使用 {u},共 {q}","gofyour":"(共 {q})。","gmoving":"正在移至「{x}」…","gbackto":"返回{x}","gdraftat":"草稿已於 {t} 儲存。","gdefault":"{e}(預設)"}}}; // Gmail's own words for the controls Gplex drives, so they can be found when Gmail // itself is set to another language. _sent/_draft: its notices; _used: its storage // line; _empty: its empty-mailbox text (regular expressions). const UGF_GMAIL_WORDS = {"de":{"Archive":["Archivieren"],"Report spam":["Spam melden","Als Spam melden"],"Spam":["Spam"],"Delete":["Löschen"],"Delete forever":["Endgültig löschen"],"Move to Trash":["In den Papierkorb verschieben"],"Trash":["Papierkorb"],"Move to":["Verschieben nach","Verschieben in"],"Move to Inbox":["In den Posteingang verschieben","In Posteingang verschieben"],"Inbox":["Posteingang"],"Mark as important":["Als wichtig markieren"],"Important":["Wichtig"],"Mark as unread":["Als ungelesen markieren"],"Snooze":["Zurückstellen"],"Labels":["Labels","Label hinzufügen"],"More":["Mehr","Weitere Optionen","Weitere Aktionen"],"Not spam":["Kein Spam"],"In new window":["In neuem Fenster öffnen","In neuem Fenster"],"Newer":["Neuer","Neuere"],"Older":["Älter","Ältere"],"Send":["Senden"],"OK":["OK"],"_sent":["Nachricht gesendet","Wird gesendet","Gesendet"],"_draft":["Entwurf"],"_used":["belegt","genutzt","verwendet","Speicher"],"_empty":["keine (neuen )?(nachrichten|e-mails|konversationen)","ist leer"]},"es":{"Archive":["Archivar"],"Report spam":["Marcar como spam","Denunciar spam","Notificar spam"],"Spam":["Spam"],"Delete":["Eliminar"],"Delete forever":["Eliminar definitivamente","Eliminar para siempre"],"Move to Trash":["Mover a la papelera"],"Trash":["Papelera"],"Move to":["Mover a"],"Move to Inbox":["Mover a Recibidos","Mover a la bandeja de entrada"],"Inbox":["Recibidos","Bandeja de entrada"],"Mark as important":["Marcar como importante"],"Important":["Importantes","Importante"],"Mark as unread":["Marcar como no leído","Marcar como no leídos"],"Snooze":["Posponer"],"Labels":["Etiquetas","Etiquetar como"],"More":["Más","Más opciones"],"Not spam":["No es spam"],"In new window":["En una ventana nueva","Abrir en una ventana nueva"],"Newer":["Más recientes","Más reciente"],"Older":["Más antiguos","Más antiguo"],"Send":["Enviar"],"OK":["Aceptar","OK"],"_sent":["Mensaje enviado","Enviando","Enviado"],"_draft":["Borrador"],"_used":["usado","utilizado","en uso","almacenamiento"],"_empty":["no hay (ningún )?(mensaje|conversaci)","no tienes","está vací"]},"fr":{"Archive":["Archiver"],"Report spam":["Signaler comme spam","Signaler un spam"],"Spam":["Spam"],"Delete":["Supprimer"],"Delete forever":["Supprimer définitivement"],"Move to Trash":["Placer dans la corbeille"],"Trash":["Corbeille"],"Move to":["Déplacer vers"],"Move to Inbox":["Déplacer vers la boîte de réception"],"Inbox":["Boîte de réception"],"Mark as important":["Marquer comme important"],"Important":["Important","Importants"],"Mark as unread":["Marquer comme non lu","Marquer comme non lus"],"Snooze":["Mettre en attente","Répéter"],"Labels":["Libellés","Ajouter un libellé"],"More":["Plus","Plus d'options"],"Not spam":["Non-spam","Pas un spam"],"In new window":["Dans une nouvelle fenêtre","Ouvrir dans une nouvelle fenêtre"],"Newer":["Plus récents","Plus récent"],"Older":["Plus anciens","Plus ancien"],"Send":["Envoyer"],"OK":["OK"],"_sent":["Message envoyé","Envoi en cours","Envoyé"],"_draft":["Brouillon"],"_used":["utilisé","stockage"],"_empty":["aucun(e)? (message|conversation|e-mail)","est vide"]},"it":{"Archive":["Archivia"],"Report spam":["Segnala come spam","Segnala spam"],"Spam":["Spam"],"Delete":["Elimina"],"Delete forever":["Elimina definitivamente"],"Move to Trash":["Sposta nel cestino"],"Trash":["Cestino"],"Move to":["Sposta in"],"Move to Inbox":["Sposta in Posta in arrivo"],"Inbox":["Posta in arrivo"],"Mark as important":["Contrassegna come importante","Segna come importante"],"Important":["Importanti","Importante"],"Mark as unread":["Segna come da leggere","Segna come non letto"],"Snooze":["Posticipa"],"Labels":["Etichette","Etichetta"],"More":["Altro","Altre opzioni"],"Not spam":["Non è spam"],"In new window":["In una nuova finestra","Apri in una nuova finestra"],"Newer":["Più recenti","Più recente"],"Older":["Meno recenti","Meno recente"],"Send":["Invia"],"OK":["OK"],"_sent":["Messaggio inviato","Invio in corso","Inviato"],"_draft":["Bozza"],"_used":["utilizzat","in uso","spazio"],"_empty":["nessun (messaggio|conversazion|nuovo)","è vuot"]},"ja":{"Archive":["アーカイブ"],"Report spam":["迷惑メールを報告","迷惑メールとして報告"],"Spam":["迷惑メール"],"Delete":["削除"],"Delete forever":["完全に削除"],"Move to Trash":["ゴミ箱に移動"],"Trash":["ゴミ箱"],"Move to":["移動","移動先"],"Move to Inbox":["受信トレイに移動"],"Inbox":["受信トレイ"],"Mark as important":["重要マークを付ける","重要としてマーク"],"Important":["重要"],"Mark as unread":["未読にする"],"Snooze":["スヌーズ"],"Labels":["ラベル","ラベルを付ける"],"More":["その他","その他の操作","その他のオプション"],"Not spam":["迷惑メールではない"],"In new window":["新しいウィンドウで開く","新しいウィンドウ"],"Newer":["新しい","新しいメール"],"Older":["古い","古いメール"],"Send":["送信"],"OK":["OK","はい"],"_sent":["メッセージを送信しました","送信しました","送信しています","送信中"],"_draft":["下書き"],"_used":["使用"],"_empty":["ありません","空です"]},"ko":{"Archive":["보관처리","보관"],"Report spam":["스팸신고","스팸 신고"],"Spam":["스팸함","스팸"],"Delete":["삭제"],"Delete forever":["영구삭제","영구 삭제"],"Move to Trash":["휴지통으로 이동"],"Trash":["휴지통"],"Move to":["이동","다음으로 이동"],"Move to Inbox":["받은편지함으로 이동"],"Inbox":["받은편지함"],"Mark as important":["중요 표시","중요로 표시","중요 메일로 표시"],"Important":["중요","중요편지함"],"Mark as unread":["읽지 않음으로 표시"],"Snooze":["다시 알림"],"Labels":["라벨","라벨 지정"],"More":["더보기","옵션 더보기"],"Not spam":["스팸 아님"],"In new window":["새 창에서 열기","새 창"],"Newer":["최신","최근"],"Older":["이전","오래된 항목"],"Send":["보내기"],"OK":["확인"],"_sent":["메일을 보냈습니다","보냈습니다","보내는 중"],"_draft":["임시보관","임시 저장"],"_used":["사용"],"_empty":["없습니다","비어 있습니다"]},"nl":{"Archive":["Archiveren"],"Report spam":["Spam melden","Rapporteren als spam"],"Spam":["Spam"],"Delete":["Verwijderen"],"Delete forever":["Definitief verwijderen"],"Move to Trash":["Naar prullenbak verplaatsen"],"Trash":["Prullenbak"],"Move to":["Verplaatsen naar"],"Move to Inbox":["Naar inbox verplaatsen","Verplaatsen naar inbox"],"Inbox":["Inbox","Postvak IN"],"Mark as important":["Markeren als belangrijk"],"Important":["Belangrijk"],"Mark as unread":["Markeren als ongelezen"],"Snooze":["Snoozen","Sluimeren"],"Labels":["Labels","Labelen als"],"More":["Meer","Meer opties"],"Not spam":["Geen spam"],"In new window":["In nieuw venster","Openen in nieuw venster"],"Newer":["Nieuwer","Nieuwere"],"Older":["Ouder","Oudere"],"Send":["Verzenden","Versturen"],"OK":["OK"],"_sent":["Bericht verzonden","Bericht verstuurd","Verzonden"],"_draft":["Concept"],"_used":["gebruikt","opslag"],"_empty":["geen (nieuwe )?(berichten|gesprekken|e-mails)","is leeg"]},"pl":{"Archive":["Archiwizuj"],"Report spam":["Zgłoś spam"],"Spam":["Spam"],"Delete":["Usuń"],"Delete forever":["Usuń na zawsze","Usuń trwale"],"Move to Trash":["Przenieś do kosza"],"Trash":["Kosz"],"Move to":["Przenieś do"],"Move to Inbox":["Przenieś do Odebranych","Przenieś do skrzynki odbiorczej"],"Inbox":["Odebrane"],"Mark as important":["Oznacz jako ważne"],"Important":["Ważne"],"Mark as unread":["Oznacz jako nieprzeczytane"],"Snooze":["Odłóż"],"Labels":["Etykiety","Oznacz etykietą"],"More":["Więcej","Więcej opcji"],"Not spam":["To nie jest spam","Nie spam"],"In new window":["W nowym oknie","Otwórz w nowym oknie"],"Newer":["Nowsze"],"Older":["Starsze"],"Send":["Wyślij"],"OK":["OK"],"_sent":["Wiadomość wysłana","Wysłano","Wysyłanie","Wysyłam"],"_draft":["robocz"],"_used":["wykorzyst","używ","miejsc"],"_empty":["brak (nowych )?(wiadomości|wątków|e-maili)","nie ma (żadnych )?(wiadomości|wątków)","jest pust"]},"pt":{"Archive":["Arquivar"],"Report spam":["Denunciar spam","Marcar como spam"],"Spam":["Spam"],"Delete":["Excluir","Eliminar"],"Delete forever":["Excluir definitivamente","Excluir permanentemente","Eliminar definitivamente"],"Move to Trash":["Mover para a lixeira","Mover para o lixo"],"Trash":["Lixeira","Lixo"],"Move to":["Mover para"],"Move to Inbox":["Mover para a Caixa de entrada","Mover para a caixa de entrada"],"Inbox":["Caixa de entrada"],"Mark as important":["Marcar como importante"],"Important":["Importante","Importantes"],"Mark as unread":["Marcar como não lida","Marcar como não lidas","Marcar como não lido"],"Snooze":["Adiar","Suspender"],"Labels":["Marcadores","Etiquetas"],"More":["Mais","Mais opções"],"Not spam":["Não é spam"],"In new window":["Em nova janela","Abrir em uma nova janela"],"Newer":["Mais recentes","Mais recente"],"Older":["Mais antigas","Mais antigos","Mais antiga"],"Send":["Enviar"],"OK":["OK"],"_sent":["Mensagem enviada","Enviando","Enviada"],"_draft":["Rascunho"],"_used":["usado","em uso","utilizado","armazenamento"],"_empty":["nenhum(a)? (mensagem|conversa|e-mail)","não há (nenhuma )?(mensage|conversa)","está vazi"]},"ru":{"Archive":["Архивировать","В архив"],"Report spam":["В спам","Сообщить о спаме","Пометить как спам"],"Spam":["Спам"],"Delete":["Удалить"],"Delete forever":["Удалить навсегда","Удалить окончательно"],"Move to Trash":["Переместить в корзину"],"Trash":["Корзина"],"Move to":["Переместить в"],"Move to Inbox":["Переместить во входящие","Во входящие","Переместить во «Входящие»"],"Inbox":["Входящие"],"Mark as important":["Пометить как важное","Отметить как важное"],"Important":["Важные"],"Mark as unread":["Отметить как непрочитанное","Пометить как непрочитанное"],"Snooze":["Отложить"],"Labels":["Ярлыки","Добавить ярлык"],"More":["Ещё","Еще","Другие действия","Дополнительные параметры"],"Not spam":["Не спам"],"In new window":["В новом окне","Открыть в новом окне"],"Newer":["Новые","Более новые","Новее"],"Older":["Старые","Более старые","Старее"],"Send":["Отправить"],"OK":["ОК","OK"],"_sent":["Письмо отправлено","Сообщение отправлено","Отправка","Отправлено"],"_draft":["Черновик"],"_used":["использовано","используется","хранилищ"],"_empty":["нет (новых )?(писем|цепочек|сообщений)","пуст"]},"tr":{"Archive":["Arşivle"],"Report spam":["Spam bildir","Spam olarak bildir"],"Spam":["Spam"],"Delete":["Sil"],"Delete forever":["Kalıcı olarak sil","Sonsuza kadar sil"],"Move to Trash":["Çöp kutusuna taşı"],"Trash":["Çöp Kutusu"],"Move to":["Şuraya taşı","Taşı"],"Move to Inbox":["Gelen Kutusu'na taşı","Gelen kutusuna taşı"],"Inbox":["Gelen Kutusu"],"Mark as important":["Önemli olarak işaretle"],"Important":["Önemli"],"Mark as unread":["Okunmadı olarak işaretle","Okunmamış olarak işaretle"],"Snooze":["Ertele"],"Labels":["Etiketler","Etiketle"],"More":["Diğer","Diğer seçenekler","Daha fazla"],"Not spam":["Spam değil"],"In new window":["Yeni pencerede","Yeni pencerede aç"],"Newer":["Daha yeni"],"Older":["Daha eski"],"Send":["Gönder"],"OK":["Tamam"],"_sent":["İleti gönderildi","Gönderiliyor","Gönderildi"],"_draft":["Taslak"],"_used":["kullan","depolama"],"_empty":["(ileti|görüşme|e-posta)\\S* yok","boş"]},"zh-CN":{"Archive":["归档"],"Report spam":["举报垃圾邮件"],"Spam":["垃圾邮件"],"Delete":["删除"],"Delete forever":["永久删除"],"Move to Trash":["移至已删除邮件"],"Trash":["已删除邮件"],"Move to":["移至"],"Move to Inbox":["移至收件箱"],"Inbox":["收件箱"],"Mark as important":["标记为重要"],"Important":["重要邮件","重要"],"Mark as unread":["标记为未读"],"Snooze":["延后"],"Labels":["标签"],"More":["更多","更多选项"],"Not spam":["不是垃圾邮件"],"In new window":["在新窗口中打开"],"Newer":["较新"],"Older":["较早","较旧"],"Send":["发送"],"OK":["确定"],"_sent":["邮件已发送","已发送","正在发送"],"_draft":["草稿"],"_used":["已使用","使用"],"_empty":["没有(任何)?(邮件|会话)","为空"]},"zh-TW":{"Archive":["封存"],"Report spam":["回報垃圾郵件"],"Spam":["垃圾郵件"],"Delete":["刪除"],"Delete forever":["永久刪除"],"Move to Trash":["移至垃圾桶"],"Trash":["垃圾桶"],"Move to":["移至"],"Move to Inbox":["移至收件匣"],"Inbox":["收件匣"],"Mark as important":["標示為重要郵件","標示為重要"],"Important":["重要郵件","重要"],"Mark as unread":["標示為未讀取","標示為未讀"],"Snooze":["延後"],"Labels":["標籤"],"More":["更多","更多選項"],"Not spam":["不是垃圾郵件"],"In new window":["在新視窗中開啟"],"Newer":["較新"],"Older":["較舊"],"Send":["傳送"],"OK":["確定"],"_sent":["郵件已寄出","已寄出","傳送中"],"_draft":["草稿"],"_used":["已使用","使用"],"_empty":["沒有(任何)?(郵件|會話)","是空的"]}}; const UGF_LANG = (function() { let list = []; try { list = (navigator.languages && navigator.languages.length) ? Array.from(navigator.languages) : [navigator.language || "en"]; } catch (e) { list = ["en"]; } for (let i = 0; i < list.length; i++) { const l = String(list[i] || "").toLowerCase(); if (!l) { continue; } if (l.indexOf("en") === 0) { return "en"; } if (l.indexOf("zh") === 0) { return /-(tw|hk|mo)\b|hant/.test(l) ? "zh-TW" : "zh-CN"; } const base = l.split("-")[0]; if (UGF_I18N[base]) { return base; } } return "en"; })(); const UGF_LANG_HL = (function() { try { return (navigator.language || "en").replace(/[^A-Za-z-]/g, "") || "en"; } catch (e) { return "en"; } })(); const UGF_LAYOUT_SUFFIX = [ [" (Stanford)", "stanford"], [" (Legacy/old browser version)", "legacy"], [" (Cardified experiment)", "cardified"], [" (Custom material version)", "material"], [" (Present look, 0.0000% AI)", "now"] ]; const UGF_I18N_ON_GMAIL = window.location.host === "mail.google.com"; // The strings for the current page: the search-page set everywhere, with Gmail's // on top on mail.google.com ("More" is "Más" in Gmail but "Más" is not always // what the search pages said). google.com only borrows the two Gplex-for-Gmail // lines its settings panel shows. function ugfI18nS() { if (ugfI18nS.c) { return ugfI18nS.c; } const L = UGF_I18N[UGF_LANG] || { s: {} }; const X = UGF_GMAIL_I18N_X[UGF_LANG] || { s: {}, g: {}, p: {} }; const out = Object.assign({}, L.s, X.g); if (UGF_I18N_ON_GMAIL) { const g = UGF_GMAIL_I18N[UGF_LANG] || []; UGF_GMAIL_I18N_EN.forEach(function(en, i) { if (typeof g[i] === "string") { out[en] = g[i]; } }); Object.assign(out, X.s); } ugfI18nS.c = out; return out; } // Text Gplex builds out of figures on mail.google.com. Only the mailbox names Gplex // itself supplies are translated inside them - never a label the person made. function ugfTGmailPattern(core) { const X = UGF_GMAIL_I18N_X[UGF_LANG]; if (!X) { return null; } const p = X.p; const S = ugfI18nS(); const box = function(x) { const own = ["Inbox", "Starred", "Important", "Sent Mail", "Sent", "Drafts", "All Mail", "Spam", "Trash", "Snoozed", "Chats"]; return own.indexOf(x) > -1 && S[x] ? S[x] : x; }; const fill = function(tpl, map) { return String(tpl).replace(/\{([a-z])\}/g, function(all, k) { return map[k] !== undefined ? map[k] : all; }); }; let m = core.match(/^([\d][\d,.]*) ?[-–] ?([\d][\d,.]*) of (many|[\d][\d,.]*)$/); if (m) { return m[3] === "many" ? fill(p.gcountmany, { a: m[1], b: m[2] }) : fill(p.gcount, { a: m[1], b: m[2], c: m[3] }); } m = core.match(/^([\d][\d,.]*) of (many|[\d][\d,.]*)$/); if (m) { return fill(p.gof, { a: m[1], b: m[2] === "many" ? (S.many || m[2]) : m[2] }); } m = core.match(/^(.+?) of (.+?) used$/); if (m && /\d/.test(m[1]) && /\d/.test(m[2])) { return fill(p.gusedof, { u: m[1], q: m[2] }); } m = core.match(/^of your (.+?)\.$/); if (m && /\d/.test(m[1])) { return fill(p.gofyour, { q: m[1] }); } m = core.match(/^Moving to (.+?)…$/); if (m) { return fill(p.gmoving, { x: box(m[1]) }); } m = core.match(/^Back to (.+)$/); if (m) { return fill(p.gbackto, { x: box(m[1]) }); } m = core.match(/^Draft saved at (.+?)\.$/); if (m) { return fill(p.gdraftat, { t: m[1] }); } m = core.match(/^(\S+@\S+) \(default\)$/); if (m) { return fill(p.gdefault, { e: m[1] }); } return null; } function ugfTPattern(core, p) { if (UGF_I18N_ON_GMAIL) { const g = ugfTGmailPattern(core); if (g !== null) { return g; } } const load = core.match(/^Loading\.\.\. (\d+) results? found$/); if (load) { return p.loading.replace("{n}", load[1]); } const mt = core.match(/^(\d+) (?:visual )?matches(?: found)?$/); if (mt) { return p.matches.replace("{n}", mt[1]); } const srch = core.match(/^(©\d{4} Google - )?Search(?:ing)? ([\d,]+) web pages$/); if (srch) { return (srch[1] || "") + p.searching.replace("{n}", srch[2]); } if (/^(Late |Early )?\d{4}/.test(core)) { let o = core.replace(/Late (\d{4})/g, function(a, y) { return p.late.replace("{y}", y); }).replace(/Early (\d{4})/g, function(a, y) { return p.early.replace("{y}", y); }); UGF_LAYOUT_SUFFIX.forEach(function(sfx) { if (o.slice(-sfx[0].length) === sfx[0]) { o = o.slice(0, -sfx[0].length) + p[sfx[1]]; } }); return o !== core ? o : null; } return null; } function ugfT(text) { if (UGF_LANG === "en" || !text) { return text; } const L = UGF_I18N[UGF_LANG]; const S = ugfI18nS(); const m = text.match(/^(\s*)([\s\S]*?)(\s*)$/); const core = m[2].replace(/\s+/g, " "); if (!core || !/[A-Za-z]/.test(core)) { return text; } let out = Object.prototype.hasOwnProperty.call(S, core) ? S[core] : ugfTPattern(core, L.p); if ((out === null || out === undefined) && /^[a-z]/.test(core)) { // lowercase labels such as the "images" under the 2015+ logos const cap = core.charAt(0).toUpperCase() + core.slice(1); if (Object.prototype.hasOwnProperty.call(S, cap) && S[cap]) { out = UGF_LANG === "de" ? S[cap] : S[cap].charAt(0).toLowerCase() + S[cap].slice(1); } } if (out === null || out === undefined) { return text; } return m[1] + out + m[3]; } // text Google (not Gplex) wrote: result titles, snippets, URLs, suggestions, typed queries const UGF_I18N_SKIP = "script, style, textarea, [contenteditable], #ugf-search-value, .ugf-search-result-title, .ugf-search-result-desc, .ugf-search-result-link, cite, h3, .ugf-search-prediction, .ugf-news-result-main, .ugf-lens-card, .ugf-lens-page-result, .ugf-neuro-content, .ugf-maps-raw, #ugf-styles"; function ugfI18nEnglishEra() { const h = document.documentElement; // Google was English-only until the first localized interfaces in 2000 return h.hasAttribute("gplex1997") || h.hasAttribute("gplex1998") || h.hasAttribute("gplex1999"); } function ugfI18nAllowed(el) { if (!el || el.closest(UGF_I18N_SKIP)) { return false; } if (ugfI18nEnglishEra() && !el.closest("#ugf-gplex-settings")) { return false; } return true; } function ugfI18nText(node) { const el = node.parentElement; if (!el || !ugfI18nAllowed(el)) { return; } const v = node.nodeValue; const t = ugfT(v); if (t !== v) { node.nodeValue = t; } } function ugfI18nAttrs(el) { if (!el || el.nodeType !== 1 || !ugfI18nAllowed(el)) { return; } ["placeholder", "title", "aria-label"].forEach(function(a) { const v = el.getAttribute(a); if (v) { const t = ugfT(v); if (t !== v) { el.setAttribute(a, t); } } }); if (el.tagName === "INPUT" && /^(submit|button|reset)$/i.test(el.type || "")) { const v = el.getAttribute("value"); if (v) { const t = ugfT(v); if (t !== v) { el.setAttribute("value", t); el.value = t; } } } } function ugfI18nTree(root) { if (!root) { return; } if (root.nodeType === 3) { ugfI18nText(root); return; } if (root.nodeType !== 1) { return; } ugfI18nAttrs(root); root.querySelectorAll("[placeholder], [title], [aria-label], input").forEach(ugfI18nAttrs); const w = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); let n; while ((n = w.nextNode())) { ugfI18nText(n); } } function ugfI18nTitle() { const t = ugfT(document.title); if (t !== document.title) { document.title = t; } } function ugfI18nCss(css) { if (UGF_LANG === "en") { return css; } return css.replace(/content:\s*"([^"]*[A-Za-z][^"]*)"/g, function(all, val) { const parts = val.split("\\a").map(function(part) { return ugfT(part).replace(/"/g, '\\"'); }); return 'content: "' + parts.join("\\a ") + '"'; }); } function ugfI18nStart() { if (UGF_LANG === "en") { return; } document.documentElement.setAttribute("ugf-lang", UGF_LANG); ugfI18nTree(document.documentElement); ugfI18nTitle(); const mo = new MutationObserver(function(muts) { muts.forEach(function(m) { if (m.type === "childList") { m.addedNodes.forEach(ugfI18nTree); if (m.target && m.target.nodeName === "TITLE") { ugfI18nTitle(); } } else if (m.type === "characterData") { if (m.target.parentElement && m.target.parentElement.nodeName === "TITLE") { ugfI18nTitle(); } else { ugfI18nText(m.target); } } else if (m.type === "attributes") { ugfI18nAttrs(m.target); } }); }); mo.observe(document.documentElement, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ["placeholder", "title", "aria-label", "value"] }); } let styleHTML = ` `; class SearchResultAPI { href; title; unmoddedTitle; itemNo; description; src; width; height; iframeUrl; doc; refdoc; heading; medium; link; domain; bigSrc; list; thumbnail; duration; // Reference to the native element to observe deferred src changes origImg; // Native dimg id (e.g. "dimg_xxx") used by Google's deferred image dictionary (google.ldi) origImgId; constructor(item, type) { if (type == "result") { this.href = item.href; this.title = item.title; this.unmoddedTitle = item.unmoddedTitle; this.itemNo = item.itemNo; this.description = item.description; } if (type == "video") { this.href = item.href; this.title = item.title; this.unmoddedTitle = item.unmoddedTitle; this.itemNo = item.itemNo; this.description = item.description; this.thumbnail = item.thumbnail; this.duration = item.duration; this.origImg = item.origImg; this.origImgId = item.origImgId; } if (type == "image") { this.itemNo = item.itemNo; this.src = item.src; this.width = item.width; this.height = item.height; this.iframeUrl = item.iframeUrl; this.refdoc = item.refdocid; this.doc = item.docid; this.docid = item.docid; this.link = item.link; this.title = item.title; this.domain = item.domain; this.bigSrc = item.bigSrc; this.origWidth = item.origWidth; this.origHeight = item.origHeight; this.origImg = item.origImg; this.origImgId = item.origImgId; } if (type == "block") { this.itemNo = item.itemNo; if (item.title) { this.title = item.title; } if (item.heading) { this.heading = item.heading; } if (item.medium) { this.medium = item.medium; } if (item.list) { this.list = item.list; } } } } class SearchSidebarAPI { title; sub; img; desc; kc1; kc2; kc3; kc4; kc5; kc6; kc7; kc8; kc9; kc10; kc11; kc12; constructor(tit, subtit, img, desc, kc1, kc2, kc3, kc4, kc5, kc6, kc7, kc8, kc9, kc10, kc11, kc12) { if (tit != null) { this.title = tit; this.sub = subtit; this.img = img; this.desc = desc; this.kc1 = kc1; this.kc2 = kc2; this.kc3 = kc3; this.kc4 = kc4; this.kc5 = kc5; this.kc6 = kc6; this.kc7 = kc7; this.kc8 = kc8; this.kc9 = kc9; this.kc10 = kc10; this.kc11 = kc11; this.kc12 = kc12; } } } let UImessages = { "l2019": "2019-Early 2022", "l2022": "2022-2024 (Present look, 0.0000% AI)", "l2018M": "2017-2018 (Custom material version)", "l2018": "2017-2018", "l2016": "2016", "l2016N": "Late 2016 (December)", "l2016E": "Early 2016 (January-July)", "l2015N": "Late 2015 (September-December)", "l2016C": "2016 (Cardified experiment)", "l2016L": "2016 (Legacy/old browser version)", "l2015": "2015", "l2015L": "2014-2015 (Legacy/old browser version)", "l2014": "2014", "l2013": "Late 2012-2013", "l2013L": "2013 (Legacy/old browser version)", "l2012": "Late 2011-Early 2012", "l2009": "Late 2008-2009", "l2009L": "Late 2009-Early 2010", "l2010N": "2010-Early 2011", "l2007": "2007-2008", "l2006": "2006", "l2005": "2004-2005", "l2003": "2003-Early 2004", "l2002": "2002", "l2001": "2001", "l2000": "2000", "l1999": "1999", "l1998": "1998 (Stanford)", "l1997": "1997 (Stanford)", "infoCardsOn": "On", "infoCardsOff": "Off (hide info cards)", "notonOn": "On", "notonOff": "Off (compatible with the Google Images Restored extension)", "forceLoadMsgOn": "On", "forceLoadMsgOff": "Off", "forceLoadMsgFast": "Off (experimental fast mode, not recommended)", "NEname": "Username", "NEemail": "Email", "NEnone": 'None (it will say "account" instead)', "SDnone": "Never show", "SDtopbar": "Always show", "SDtopbarHover": "Show on hover", "NRtrue": "On", "NRfalse": "Off", "GMtrue": "On", "GMfalse": "Off", "MPtrue": "On", "MPfalse": "Off", "CLtrue": "On", "CLfalse": "Off" }; let linkList = []; let searchValue; let searchValueV; let ugfHomeVertical = ""; let hasSidebar = false; let sidebarInfoList = []; let SB = new SearchSidebarAPI(null); let loggedIn = "tbd"; let pfp; let pfp96; let username; let email; let tempSidebarList = []; let tempUpbarList; let firstLinkBelongsToBlock = false; let hasCorrection = false; let correction; let insteadLink; let resultCount; let url = window.location.href; const ugfOnGmail = window.location.host === "mail.google.com"; const ugfOnCalendar = window.location.host === "calendar.google.com"; // news.google.com and translate.google.com: other origins, settings read from GM storage like Calendar const ugfOnNT = window.location.host === "news.google.com" || window.location.host === "translate.google.com" || window.location.host === "docs.google.com" || window.location.host === "drive.google.com" || window.location.host === "photos.google.com"; // "Late 2015" (saved as 2015N) runs as 2016 - Google's look from the new logo of // 1 September 2015 was 2016's - with the few things that only changed in 2016 kept // as they were: the old Forms (the new one became the default on 10 Feb 2016), the // 2015 map and its menu (the lighter map came in July 2016), and 2015 in the small print. let UGF_LATE2015 = false; // (6.3) "Early 2016" (1 January - 25 July 2016) is saved as 2016 with UGF_EARLY2016 set, so every // Google page reads it as 2016 (the new year in the small print, the new Forms, the default from // 10 February and opt-in before that); only Maps keeps the 2015 map and its menu, since the // lighter map came on 25 July 2016 // (6.4) "Late 2016" (from 6 December 2016, when Google rolled out the Material search page - // the shadowed search box, the taller bar) is saved as 2016 with UGF_LATE2016 set: Google's // search pages take the 2017 look, everything else (Gmail, Maps, Drive...) stays 2016 let UGF_LATE2016 = (function() { try { let v = typeof GM_getValue === "function" ? GM_getValue("UGF_LATE2016", null) : null; if (v === null || v === undefined) { v = window.localStorage.getItem("UGF_LATE2016"); } return String(v) === "true"; } catch (e) { return false; } })(); let UGF_EARLY2016 = (function() { try { let v = typeof GM_getValue === "function" ? GM_getValue("UGF_EARLY2016", null) : null; if (v === null || v === undefined) { v = window.localStorage.getItem("UGF_EARLY2016"); } return String(v) === "true"; } catch (e) { return false; } })(); function ugfRuntimeLayout(value) { if (value === "2016E") { UGF_EARLY2016 = true; value = "2016"; } if (value === "2016N") { UGF_LATE2016 = true; value = "2016"; } // Late 2016: the search pages (www.google.com, Maps aside) run as the 2017 search page if (UGF_LATE2016 && value === "2016" && window.location.host === "www.google.com" && !/^\/maps/.test(window.location.pathname || "")) { UGF_LATE2015 = false; return "2018"; } UGF_LATE2015 = value === "2015N"; try { if (UGF_LATE2015) { document.documentElement.setAttribute("gplex2015n", ""); } else { document.documentElement.removeAttribute("gplex2015n"); } } catch (e) {} return UGF_LATE2015 ? "2016" : value; } // the layout lives in www.google.com's localStorage, which mail.google.com cannot read, // so every save is mirrored into the userscript manager's own shared storage function ugfSaveLayout(value) { // Early 2016 is kept as 2016 plus its own flag (any other layout clears the flag) UGF_EARLY2016 = value === "2016E"; UGF_LATE2016 = value === "2016N"; if (UGF_EARLY2016 || UGF_LATE2016) { value = "2016"; } try { window.localStorage.setItem("UGF_EARLY2016", String(UGF_EARLY2016)); window.localStorage.setItem("UGF_LATE2016", String(UGF_LATE2016)); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_EARLY2016", String(UGF_EARLY2016)); GM_setValue("UGF_LATE2016", String(UGF_LATE2016)); } } catch (e) {} UGF_LATE2015 = value === "2015N"; if (!UGF_LATE2015) { try { document.documentElement.removeAttribute("gplex2015n"); } catch (e) {} } try { window.localStorage.setItem("UGF_LAYOUT", value); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_LAYOUT", value); } } catch (e) {} } // mail.google.com is a different origin, so the Gmail switch is mirrored into GM storage too function ugfSaveGmailOn(value) { try { window.localStorage.setItem("UGF_GMAIL_ON", value); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_GMAIL_ON", value); } } catch (e) {} } let tbs; let page = 1; let navbarText = "Search"; let location = "all"; let layout = localStorage.getItem("UGF_LAYOUT"); // the layout lives in www.google.com's storage; mirror it so other Google hosts (Gmail) can read it try { if (window.location.host === "mail.google.com" || window.location.host === "calendar.google.com" || ugfOnNT) { layout = (typeof GM_getValue === "function" ? GM_getValue("UGF_LAYOUT", null) : null) || layout || "2015"; } else if (layout && typeof GM_setValue === "function") { GM_setValue("UGF_LAYOUT", layout); } if (ugfOnGmail) { console.log("[Gplex] Gmail: layout " + layout + " (" + (layout ? "shared storage" : "no layout saved yet - open google.com once") + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); // If Gplex reloaded this page, say why - the console before the reload is gone. try { const rel = JSON.parse(sessionStorage.getItem("UGF_GMAIL_RELOADED") || "null"); if (rel && (Date.now() - rel.t) < 60000) { sessionStorage.removeItem("UGF_GMAIL_RELOADED"); // print it once console.log("[Gplex] Gmail: Gplex reloaded this page to open " + rel.h + " because " + rel.why); // Gmail swaps the address a moment after loading if it refuses a view, // so look again once it has settled setTimeout(function() { const landed = (window.location.hash || "#inbox").split("/")[0]; if (landed !== String(rel.h).split("/")[0]) { console.log("[Gplex] Gmail: Gmail refused " + rel.h + " and opened " + landed + " instead - that view may be hidden in Gmail's label settings"); } }, 5000); } } catch (e) {} } else { console.log("[Gplex] layout " + (layout || "?") + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); } } catch (e) {} // "Late 2009-Early 2010" differs from 2009 only in the home page's buttons: Gmail, // Maps and Calendar treat it as 2009 if (layout === "2009L" && (window.location.host !== "www.google.com" || /^\/maps/.test(window.location.pathname))) { layout = "2009"; } layout = ugfRuntimeLayout(layout); let structuredHP = localStorage.getItem("UGF_STRUCTURED_HOMEPAGE"); let notOnImages = localStorage.getItem("UGF_NOTON_IMAGES"); let infoCards = localStorage.getItem("UGF_INFO_CARDS"); let forceLoadMsg = localStorage.getItem("UGF_FORCE_LOAD_MSG"); let nameEmail = localStorage.getItem("UGF_NAME_EMAIL"); let neuro = localStorage.getItem("UGF_NEURO"); let gmailOn = localStorage.getItem("UGF_GMAIL_ON"); let mapsOn = localStorage.getItem("UGF_MAPS_ON") || "true"; // calendar.google.com is another origin: its switch lives in the userscript manager's storage let calOn = "true"; try { calOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_CAL_ON", null) : null) || "true"); } catch (e) {} // News and Translate are other origins too: their switches live in GM storage let newsOn = "true"; let trOn = "true"; let docsOn = "true"; let sheetsOn = "true"; let slidesOn = "true"; let drawingsOn = "true"; let signinOn = "true"; let accountOn = "true"; let keepOn = "true"; let formsOn = "true"; let driveOn = "true"; let photosOn = "true"; try { newsOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_NEWS_ON", null) : null) || "true"); trOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_TRANSLATE_ON", null) : null) || "true"); docsOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_DOCS_ON", null) : null) || "true"); sheetsOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_SHEETS_ON", null) : null) || "true"); slidesOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_SLIDES_ON", null) : null) || "true"); drawingsOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_DRAWINGS_ON", null) : null) || "true"); signinOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_SIGNIN_ON", null) : null) || "true"); accountOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_ACCOUNT_ON", null) : null) || "true"); keepOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_KEEP_ON", null) : null) || "true"); formsOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_FORMS_ON", null) : null) || "true"); driveOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_DRIVE_ON", null) : null) || "true"); photosOn = String((typeof GM_getValue === "function" ? GM_getValue("UGF_PHOTOS_ON", null) : null) || "true"); } catch (e) {} let settingsDisplay = localStorage.getItem("UGF_SETTINGS_DISPLAY"); let gPlusLink = localStorage.getItem("UGF_PLUS_LINK"); if (url.includes("&tbs=")) { tbs = window.location.href.split("&tbs=")[1]; if (tbs.includes("&")) { tbs = tbs.split("&")[0]; } } switch (layout) { case '2009L': document.querySelector("html").setAttribute("gplex2009l",""); // falls through: otherwise the same as 2009 case '2009': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2009",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2010N': document.querySelector("html").setAttribute("layout","2012"); document.querySelector("html").setAttribute("gplex2010",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2007': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2007",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2006': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2006",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '1997': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1997",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '1998': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1998",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '1999': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1999",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2000': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2000",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2001': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2001",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2002': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2002",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2003': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2003",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2005': document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2005",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2010': document.querySelector("html").setAttribute("layout","2010"); break; case '2011': document.querySelector("html").setAttribute("layout","2011"); break; case '2012': document.querySelector("html").setAttribute("layout","2012"); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-footer",""); break; case '2013': document.querySelector("html").setAttribute("layout","2013"); document.querySelector("html").setAttribute("legacy-footer",""); //document.querySelector("html").setAttribute("fake-spa",""); break; case '2013L': document.querySelector("html").setAttribute("layout","2013L"); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-footer",""); document.querySelector("html").setAttribute("legacy-neuro",""); break; case '2014': document.querySelector("html").setAttribute("layout","2014"); //document.querySelector("html").setAttribute("fake-spa",""); break; case '2015': document.querySelector("html").setAttribute("layout","2015"); //document.querySelector("html").setAttribute("fake-spa",""); break; case '2015L': document.querySelector("html").setAttribute("layout","2015L"); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-footer",""); document.querySelector("html").setAttribute("legacy-neuro",""); break; case '2016': document.querySelector("html").setAttribute("layout","2016"); //document.querySelector("html").setAttribute("fake-spa",""); break; case "2016C": document.querySelector("html").setAttribute("layout","2016C"); break; case '2016L': document.querySelector("html").setAttribute("layout","2016L"); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-footer",""); document.querySelector("html").setAttribute("legacy-neuro",""); break; case "2018": document.querySelector("html").setAttribute("layout","2018"); break; case "2018M": document.querySelector("html").setAttribute("layout","2018M"); break; case "2019": document.querySelector("html").setAttribute("layout","2019"); break; case "2022": document.querySelector("html").setAttribute("layout","2019"); document.querySelector("html").setAttribute("gplex2022",""); break; default: document.querySelector("html").setAttribute("layout","2015"); ugfSaveLayout("2015"); } if (structuredHP == null) { localStorage.setItem("UGF_STRUCTURED_HOMEPAGE","false"); structuredHP = "false"; } if (notOnImages == null) { localStorage.setItem("UGF_NOTON_IMAGES","true"); notOnImages = "true"; } if (infoCards == null) { localStorage.setItem("UGF_INFO_CARDS","true"); infoCards = "true"; } document.querySelector("html").setAttribute("info-cards",infoCards); if (forceLoadMsg == null) { localStorage.setItem("UGF_FORCE_LOAD_MSG","true"); forceLoadMsg = "true"; } if (nameEmail == null) { localStorage.setItem("UGF_NAME_EMAIL","name"); nameEmail = "name"; } // the display-name choice has to cross origins too, for Gmail's header try { if ((ugfOnGmail || ugfOnCalendar || ugfOnNT) && typeof GM_getValue === "function") { const sharedNE = GM_getValue("UGF_NAME_EMAIL", null); if (sharedNE !== null && sharedNE !== undefined) { nameEmail = String(sharedNE); } } else if (typeof GM_setValue === "function") { GM_setValue("UGF_NAME_EMAIL", nameEmail); } } catch (e) {} if (settingsDisplay == null) { localStorage.setItem("UGF_SETTINGS_DISPLAY","topbar"); settingsDisplay = "topbar"; } if (gPlusLink == null) { localStorage.setItem("UGF_PLUS_LINK","https://plus.google.com/"); gPlusLink = "https://plus.google.com/"; } if (neuro == null) { localStorage.setItem("UGF_NEURO","true"); neuro = "true"; } // on mail.google.com the switch can only have come from GM storage, so read that first try { if (ugfOnGmail && typeof GM_getValue === "function") { const shared = GM_getValue("UGF_GMAIL_ON", null); if (shared !== null && shared !== undefined) { gmailOn = String(shared); } } } catch (e) {} if (gmailOn == null) { gmailOn = "true"; } if (!ugfOnGmail && !ugfOnCalendar && !ugfOnNT) { ugfSaveGmailOn(gmailOn); } switch (notOnImages) { case "false": break; case 'true': document.querySelector("html").setAttribute("noton-images",""); break; } switch (nameEmail) { case "name": document.querySelector("html").setAttribute("name-email","name"); break; case 'email': document.querySelector("html").setAttribute("name-email","email"); break; } switch (settingsDisplay) { case "none": break; case "topbar": document.querySelector("html").setAttribute("settings-display","topbar"); break; case 'topbar-hover': document.querySelector("html").setAttribute("settings-display","topbar-hover"); break; } switch (neuro) { case "true": document.querySelector("html").setAttribute("neuro","true"); break; case 'false': document.querySelector("html").setAttribute("neuro","false"); break; } document.querySelector("html").setAttribute("location","all"); // Reverse image search (Google Lens) results live on /search with Lens parameters and no q. // Gplex has no Lens UI, so these pages pass through untouched. const ugfLensPage = (function() { try { const sp = new URLSearchParams(window.location.search); return window.location.pathname.indexOf("/searchbyimage") === 0 || sp.has("vsrid") || sp.has("lns_mode") || sp.has("lns_surface") || sp.has("vsint") || /^lns/.test(sp.get("source") || "") || sp.get("udm") === "26" || /(^|,)sbi:/.test(sp.get("tbs") || "") || sp.has("imgurl") && !sp.get("q"); } catch (e) { return false; } })(); if ( url.includes("tbm=isch") || url.includes("udm=2") ) { location = "images"; document.querySelector("html").setAttribute("location","images"); } if ( url.includes("tbm=vid")|| url.includes("udm=7") ) { location = "videos"; document.querySelector("html").setAttribute("location","videos"); } if (url.includes("tbm=bks")) { location = "news"; document.querySelector("html").setAttribute("location","news"); document.querySelector("html").setAttribute("disabled",""); } if (url.includes("tbm=shop") || url.includes("udm=28") || window.location.pathname.indexOf("/shopping") === 0) { let shopQuery = ""; try { shopQuery = (new URLSearchParams(window.location.search).get("q") || "").trim(); } catch (e) {} if (!shopQuery) { // Google's Shopping browse app renders nothing we can read, so this becomes a Shopping homepage ugfHomeVertical = "shopping"; } else { location = "shopping"; document.querySelector("html").setAttribute("location","shopping"); document.querySelector("html").setAttribute("shopping-results",""); document.querySelector("html").setAttribute("shopping-loading",""); if (window.location.pathname.indexOf("/shopping") === 0) { // the browse page has no start= paging to follow document.querySelector("html").setAttribute("shopping-browse",""); } } } const ugfBasicHtml = /[?&]gbv=1\b/.test(url); if (ugfBasicHtml) { document.querySelector("html").setAttribute("basic-html", ""); } if (ugfLensPage) { location = "lens"; document.querySelector("html").setAttribute("location","lens"); document.querySelector("html").setAttribute("disabled",""); } if (url.includes("tbm=nws") && !ugfLensPage) { location = "news"; document.querySelector("html").setAttribute("location","news"); document.querySelector("html").setAttribute("news-results",""); } if ( url.includes("https://www.google.com/gplex") || url.includes("https://www.google.com/Gplex") ) { location = "gplex"; document.querySelector("html").setAttribute("location","gplex"); } // a refresh can leave the homepage at /?gws_rd=ssl, /?sca_esv=... and so on - still the homepage const ugfBareHome = (function() { try { if (window.location.pathname !== "/" && window.location.pathname !== "") { return false; } return !(new URLSearchParams(window.location.search).get("q") || "").trim(); } catch (e) { return url == "https://www.google.com/"; } })(); if (structuredHP == "false") { if ( url.includes("www.google.com/webhp") || url.includes("www.google.com/imghp") || url.includes("www.google.com/videohp") || ugfBareHome ) { location = "home"; document.querySelector("html").setAttribute("location","home"); } } else { if ( url.includes("www.google.com/webhp") || url.includes("www.google.com/imghp") || url.includes("www.google.com/videohp") || ugfBareHome ) { location = "structured-home"; document.querySelector("html").setAttribute("location","structured-home"); } } // Google Images / Google Video homepages (imghp / videohp) if (url.includes("www.google.com/imghp")) { ugfHomeVertical = "images"; } else if (url.includes("www.google.com/videohp")) { ugfHomeVertical = "videos"; } // Google now redirects /imghp (and friends) to /search?udm=...&udf=... with no query. // A /search page with no q is a homepage, not an empty results page. try { const sp0 = new URLSearchParams(window.location.search); const q0 = (sp0.get("q") || "").trim(); if ((window.location.pathname === "/search" || window.location.pathname.indexOf("/shopping") === 0 || ugfBareHome) && !q0 && !ugfLensPage) { const udm0 = sp0.get("udm") || ""; const tbm0 = sp0.get("tbm") || ""; if (udm0 === "2" || udm0 === "49" || tbm0 === "isch") { ugfHomeVertical = "images"; } else if (udm0 === "7" || tbm0 === "vid") { ugfHomeVertical = "videos"; } else if (udm0 === "28" || tbm0 === "shop" || window.location.pathname.indexOf("/shopping") === 0) { ugfHomeVertical = "shopping"; } if (structuredHP == "false") { location = "home"; document.querySelector("html").setAttribute("location","home"); } else { location = "structured-home"; document.querySelector("html").setAttribute("location","structured-home"); } document.querySelector("html").removeAttribute("news-results"); } } catch (e) {} if (ugfHomeVertical) { document.querySelector("html").setAttribute("home-vertical", ugfHomeVertical); } try { const startParam = parseInt(new URLSearchParams(window.location.search).get("start") || "0", 10); if (!isNaN(startParam) && startParam > 0) { page = Math.floor(startParam / 10) + 1; } } catch (e) { page = 1; } if ( url.includes("do") && url.includes("a") && url.includes("barrel") && url.includes("roll") && url.includes("x") || url.includes("%20times") ) { let times; if (url.includes("%20times")) { times = url.split("times")[0]; times = times.split("roll%20")[1]; times = times.split("%20")[0]; } else { times = url.split("x")[1]; } if (times.includes("&")) { times = times.split("&")[0]; } if (times.includes("#")) { times = times.split("#")[0]; } document.querySelector("body").style.animationDuration = "2s"; if (times >= 10) { document.querySelector("body").style.animationTimingFunction = "linear"; } if (times >= 50) { document.querySelector("body").style.animationDuration = "1s"; } if (times >= 500) { document.querySelector("body").style.animationDuration = "0.5s"; } document.querySelector("body").style.animationName = "roll"; document.querySelector("body").style.animationIterationCount = times; document.querySelector("body").style.animationTimingFunction = "linear"; if ( url.includes("%20reverse") || url.includes("%20backwards") ) { document.querySelector("body").style.animationDirection = "reverse"; } } if (location == "gplex") { navbarText = "Gplex Settings"; } var canGo = false; function timeout(durationMs) { return new Promise((resolve, reject) => { setTimeout(function() { resolve(); }, durationMs); }); } async function waitForElem(elm,time) { while (null == document.querySelector(elm)) { await new Promise(r => requestAnimationFrame(r)); } await timeout(time).then(function() { canGo = true; return document.querySelector(elm); }); } // Safely extract hostname from absolute, protocol-relative, or relative URLs function ugfExtractDomain(rawUrl) { if (!rawUrl || typeof rawUrl !== 'string') return ""; try { let parsed = new URL(rawUrl, window.location.origin); let host = parsed.hostname || ""; return host.startsWith("www.") ? host.substring(4) : host; } catch (e) { return ""; } } async function waitForElement(elm) { let tries = 0; while (null == document.querySelector(elm)) { if (++tries > 200) return null; await new Promise(r => requestAnimationFrame(r)); } await timeout(300).then(function() { canGo = true; return document.querySelector(elm); }); } async function waitForElement500(elm) { let tries = 0; while (null == document.querySelector(elm)) { if (++tries > 200) return null; await new Promise(r => requestAnimationFrame(r)); } await timeout(500).then(function() { canGo = true; return document.querySelector(elm); }); } async function waitForElement10(elm) { let tries = 0; while (null == document.querySelector(elm)) { if (++tries > 200) return null; await new Promise(r => requestAnimationFrame(r)); } await timeout(10).then(function() { canGo = true; return document.querySelector(elm); }); } async function waitForElement10M(elm, parent) { let tries = 0; while (null == elm) { if (++tries > 200) { return null; } await new Promise(r => requestAnimationFrame(r)); } await timeout(10).then(function() { canGo = true; return parent ? parent.querySelector(elm) : elm; }); } async function waitForElement1000M(elm, parent) { let tries = 0; while (null == elm) { if (++tries > 200) return null; await new Promise(r => requestAnimationFrame(r)); } await timeout(100).then(function() { canGo = true; return parent.querySelector(elm); }); } async function waitForElement100(elm) { let tries = 0; while (null == document.querySelector(elm)) { if (++tries > 200) return null; await new Promise(r => requestAnimationFrame(r)); } await timeout(10).then(function() { canGo = true; return document.querySelector(elm); }); } function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } let gPlexHTML = `
Info Cards
${UImessages.infoCardsOn}
Info cards were added in 2012, so for full accuracy I would disable this on Late 2011-Early 2012 and older. But if you just like the UI of e.g. 2006 and want to have the features they provide, then leave it on.
Custom Image Page
${UImessages.notonOn}
On: Gplex creates it's own image page, which can have some bugs.
Off: Gplex uses the regular Google image page, which has better functionality, but isn't styled according to the layout.
"Force load results" message
${UImessages.forceLoadMsgOn}
On: When Gplex can't find enough results in the page, it will stall for a few seconds in hopes of finding more results, and show a message with an option to force load the results early. Theoretically more reliable on slow connections.
Off: When Gplex would normally show the message, it will instead force load the results automatically.
Gplex Settings button
Display name
${UImessages.NEname}
Some layouts have a display name (older layouts generally speaking). Your email address was originally displayed, but you can choose to display your username instead. This will not affect account menus.
Google+ custom link
AI Overviews
${UImessages.NRtrue}
Choose whether or not to show AI overviews in search results.
Gplex for Gmail
${UImessages.GMtrue}
Choose whether or not mail.google.com is themed to match the layout you picked above. Turn this off to get the normal Gmail back without turning off the rest of Gplex.
Gplex for Google Maps
${UImessages.MPtrue}
Choose whether or not Google Maps is shown in the layout you picked above.
Gplex for Google Calendar
${UImessages.CLtrue}
Choose whether or not Google Calendar is shown in the layout you picked above.
Gplex for Google News
${UImessages.CLtrue}
Choose whether or not the Google News front page, sections and search are shown in the layout you picked above. Stories always open on the publisher's site.
Gplex for Google Translate
${UImessages.CLtrue}
Choose whether or not Google Translate is shown in the layout you picked above.
Gplex for Google Docs
${UImessages.CLtrue}
Choose whether or not Google Docs (the documents list and the editor) is shown in the layout you picked above.
Gplex for Google Sheets
${UImessages.CLtrue}
Choose whether or not Google Sheets (the spreadsheets list and the editor) is shown in the layout you picked above.
Gplex for Google Slides
${UImessages.CLtrue}
Choose whether or not Google Slides (the presentations list and the editor) is shown in the layout you picked above.
Gplex for Google Drawings
${UImessages.CLtrue}
Choose whether or not the Google Drawings editor is shown in the layout you picked above. Drawings began in April 2010, so the layouts before that get its first look.
Gplex for the Google sign-in and sign-up pages
${UImessages.CLtrue}
Choose whether or not the Google sign-in and sign-up pages are shown in the layout you picked above. Only its look changes: the email and password boxes and buttons are Google's own and work exactly as normal.
Gplex for the Google Account pages
${UImessages.CLtrue}
Choose whether or not your Google Account pages (myaccount.google.com) are shown in the layout you picked above. The settings on them are Google's own and work as normal; the password, 2-Step Verification, recovery and account deletion pages are left as Google made them.
Gplex for Google Keep
${UImessages.CLtrue}
Choose whether or not Google Keep (keep.google.com) is shown in the layout you picked above. Your notes, lists, labels and reminders are Google's own and work as normal; only the look changes.
Gplex for Google Forms
${UImessages.CLtrue}
Choose whether or not Google Forms (the forms list, the editor and forms you fill in) is shown in the layout you picked above.
Gplex for Google Drive
${UImessages.CLtrue}
Choose whether or not Google Drive (your files and folders, uploading, sharing and the rest) is shown in the layout you picked above. Before Drive (2012) it is the Google Docs list of the period.
Gplex for Google Photos
${UImessages.CLtrue}
Choose whether or not Google Photos (your photos, albums and the photo viewer) is shown in the layout you picked above. Before Google Photos (2015) it is Picasa Web Albums, then Google+ Photos.
`; let normalHTML = `
About 1,000,000 results (0.5 seconds)
AI Overview
Generating...
Show more
Show less
Dismiss
AI Overview
Generating...
Show more
Show less
Dismiss
`; let homepageHTML = `
`; let topHTML = `
`; if (location == "shopping") { ugfShopEnsureShell(); ugfShopWatchdog(); } if (ugfOnGmail) { ugfGmailMain(); return; } // Google Calendar: Gplex's own Calendar page, or Google's where Gplex does not // take over (the event editor, settings) or with Gplex for Calendar switched off if (ugfOnCalendar) { if (ugfCalWanted()) { ugfCalMain(); } return; } // Google News and Google Translate: Gplex's own pages for the front page, sections, // search and the translator; everything else there stays Google's if (window.location.host === "news.google.com") { if (ugfNewsWanted()) { ugfNewsMain(); } else { ugfNewsFavOnly(); } return; } if (window.location.host === "translate.google.com") { if (ugfTrWebBarWanted()) { ugfTrWebBar(); return; } if (ugfTrWanted()) { ugfTrMain(); } else { ugfTrFavOnly(); } return; } // Google Docs: Gplex's own documents list, and the editor in the period's clothes if (window.location.host === "docs.google.com") { ugfDocsStart(); return; } // Google Drive: Gplex's own Drive (or, before 2012, the Google Docs list) if (window.location.host === "drive.google.com") { ugfDvStart(); return; } // Google Photos: Picasa Web Albums, Google+ Photos, or the Google Photos of the period if (window.location.host === "photos.google.com") { ugfPhStart(); return; } // Google Maps: Gplex's own Maps page, or - for directions, Street View and the // rest, or with Gplex for Maps switched off - Google's page left exactly as it is if (window.location.host === "maps.google.com" || (window.location.host === "www.google.com" && /^\/maps(\/|$)/.test(window.location.pathname || ""))) { if (ugfMapsWanted()) { ugfMapsMain(); } return; } if ( !window.location.href.includes("https://www.google.com/sorry") && !window.location.href.includes("https://www.google.com/recaptcha") && !window.location.href.includes("imgres") && !ugfLensPage && !window.location.href.includes("tbm=bks") ) { doSetup(location); } if (location == "gplex") { createCSS(); setTimeout(function() { createCSS(); }, 100); setTimeout(function() { createCSS(); }, 500); setTimeout(function() { createCSS(); }, 3000); setTimeout(function() { createCSS(); }, 10000); } else { createCSS(); } async function putThroughPaces(item) { return new Promise((resolve, reject) => { if (item.tagName == "BLOCK-COMPONENT") { resolve("block"); } let i = 0; // for (i = 0; i < 9; i++) { if (item.parentNode) { if (item.parentNode.tagName == "SPAN") { // Fix: Safe check for .MjjYud container using classList.contains to prevent invalid assignment and TypeError if (item.parentNode?.parentNode?.parentNode?.parentNode?.parentNode?.parentNode?.parentNode?.classList?.contains("MjjYud")) { resolve(item); } else { resolve(item); } } else { resolve("Nope"); } } else { resolve("Nope"); } // } } )}; let asArray; let started = false; let timeoutNumber = 1204; document.querySelector("html").setAttribute("logged-in","tbd"); function doSetup(location) { createPageShell(location).then(function(result) { if (forceLoadMsg == "fast") { timeoutNumber = 150; } if (document.querySelector("body[data-dt='1']")) { /*alert("Please disable dark theme in Google Search settings to use Gplex."); window.location = "https://www.google.com/preferences#tabVal=1";*/ } if (location == "images" && notOnImages == "true") { // (6.5.7) once Google's page has arrived: on a slow first visit the lightweight page's // grid of thumbnails wasn't there yet, and the image page came up empty ugfParseWhenLoaded(location); } else if (location == "images") { let tries1 = 0; let doInterval1 = setInterval(function() { if (++tries1 > 100) { clearInterval(doInterval1); return; } let scripts = document.querySelectorAll("script"); //console.log(scripts); scripts.forEach(itemRoot => { if (itemRoot.innerHTML.includes("AF_initDataCallback({key: 'ds:1',")) { itemRoot.id = "the-script"; clearInterval(doInterval1); } }); }, 10); } let shopTries = 0; let basicTries = 0; let doInterval = setInterval(function() { asArray = document.querySelectorAll("#rso span > a"); if (location == "news" && document.querySelector("html").hasAttribute("news-results")) { if (ugfFindNewsCards(document).length >= 8) { parseHTMLNeo(location); clearInterval(doInterval); } } else if (ugfBasicHtml && location !== "home" && location !== "structured-home" && location !== "gplex" && location !== "images") { if (ugfFindBasicResults().length >= 5 || basicTries++ > 200) { parseHTMLNeo(location); clearInterval(doInterval); } } else if (location == "shopping") { shopTries++; const shopFound = ugfFindShoppingCards().length; if (shopFound >= 6 || (shopTries > 400 && shopFound >= 1) || shopTries > 1500) { parseHTMLNeo(location); clearInterval(doInterval); } } else if (location != "images") { // (6.5.2) 10 links can be there before all the results are: the links of "People // also ask" and the knowledge panel count too. Read once Google's page has arrived. if (asArray.length >= 10) { ugfParseWhenLoaded(location); clearInterval(doInterval); } if ( asArray.length >= 8 && url.includes("barrel") ) { ugfParseWhenLoaded(location); clearInterval(doInterval); } } else if (location == "images") { let imgCount = document.querySelectorAll('#rso img[id^="dimg_"], [data-docid]').length; let gWin = (typeof unsafeWindow !== "undefined" ? unsafeWindow : window); let hasDeferred = (gWin && gWin.google && (gWin.google.pim || gWin.google.ldi)) || (window.google && (window.google.pim || window.google.ldi)) || document.querySelector('script[id="the-script"]'); // (6.5.4) or the lightweight page's table of thumbnails, once it has all arrived // (the thumbnails loaded, so their preview sizes can be shown) const liteImgs = document.querySelectorAll('table a[href^="/url?"] img'); const liteGrid = document.readyState !== "loading" && liteImgs.length >= 4 && Array.prototype.every.call(liteImgs, function(im) { return im.complete; }); if ((imgCount >= 10 && (hasDeferred || document.readyState !== "loading")) || asArray.length >= 30 || liteGrid) { parseHTMLNeo(location); clearInterval(doInterval); } } else { clearInterval(doInterval); } }, 10); setTimeout(function() { if (forceLoadMsg == "true") { if ( started == false && location !== "gplex" && location !== "home" && location !== "shopping" ) { let container = document.querySelector("#ugf-main"); let newElem = document.createElement("div"); newElem.id = "ugf-load-now-container"; newElem.innerHTML = ugfTT(` Not enough results found. Results will load in a few seconds...
Force-load results now
`); container.insertBefore(newElem, container.children[0]); newElem.querySelector("#ugf-load-now").addEventListener("click", function() { parseHTMLNeo(location); clearInterval(doInterval); newElem.remove(); }); } } else { if (location !== "shopping") { clearInterval(doInterval); } if ( started == false && location !== "home" && location !== "gplex" && location !== "shopping" ) { ugfParseWhenLoaded(location); } } }, timeoutNumber); setTimeout(function() { // Shopping loads its cards lazily; its own poll decides when to give up if (location !== "shopping") { clearInterval(doInterval); } if ( started == false && location !== "home" && location !== "gplex" && location !== "shopping" ) { ugfParseWhenLoaded(location); } }, 5000); }); } // (6.5.2) The fallback read of the results (fewer than 10 result links seen after 1.2s) used to // read whatever part of Google's page had arrived by then, so a slow connection or computer // got 3 or 7 results of 10. It now waits until the page has finished arriving. function ugfParseWhenLoaded(location) { if (started) { return; } if (document.readyState === "loading") { if (ugfParseWhenLoaded.waiting) { return; } ugfParseWhenLoaded.waiting = true; document.addEventListener("DOMContentLoaded", function() { parseHTMLNeo(location); }, { once: true }); } else { parseHTMLNeo(location); } } // Helper: Parse YouTube video ID from standard watch URLs, shorts, youtu.be, and Google redirect URLs function ugfExtractYtId(u) { if (!u) return null; let raw = u; try { if (raw.includes("url=") || raw.includes("q=")) { const parsed = new URL(raw, "https://www.google.com"); raw = parsed.searchParams.get("url") || parsed.searchParams.get("q") || raw; } raw = decodeURIComponent(raw); } catch (e) {} const m = raw.match(/(?:v=|vi=|\/v\/|\/vi\/|youtu\.be\/|\/shorts\/)([a-zA-Z0-9_-]{11})/); return m ? m[1] : null; } // Helper: Resolve deferred images populated by Google scripts (google.ldi or _setImagesSrc) // This provides early resolution for non-YouTube platforms such as X and Instagram Reels function ugfGetDeferredImage(imgId) { if (!imgId) return ""; const gWin = (typeof unsafeWindow !== "undefined" ? unsafeWindow : window); if (gWin && gWin.google) { if (gWin.google.pim && gWin.google.pim[imgId]) { return gWin.google.pim[imgId]; } if (gWin.google.ldi && gWin.google.ldi[imgId]) { return gWin.google.ldi[imgId]; } } if (window.google) { if (window.google.pim && window.google.pim[imgId]) { return window.google.pim[imgId]; } if (window.google.ldi && window.google.ldi[imgId]) { return window.google.ldi[imgId]; } } const scripts = document.querySelectorAll("script"); for (let si = scripts.length - 1; si >= 0; si--) { const st = scripts[si].textContent || scripts[si].innerHTML; if (!st || !st.includes(imgId)) continue; const ldiM = st.match(new RegExp('["\']' + imgId + '["\']\\s*:\\s*["\']([^"\']+)["\']')); if (ldiM) { return ldiM[1].replace(/\\u003d/g, '=').replace(/\\u0026/g, '&'); } if (st.includes("_setImagesSrc")) { const sM = st.match(/var\s+s\s*=\s*['"]([^'"]+)['"]/); if (sM && (st.includes("'" + imgId + "'") || st.includes('"' + imgId + '"'))) { return sM[1].replace(/\\x3d/g, '=').replace(/\\u003d/g, '='); } } } return ""; } // Helper: Memoized parser for Google Image original full-resolution metadata let ugfOriginalImageCache = null; function ugfGetOriginalImageMap() { if (ugfOriginalImageCache && Object.keys(ugfOriginalImageCache).length > 0) { return ugfOriginalImageCache; } const map = {}; const scripts = document.querySelectorAll("script"); const re = /\[0,\s*"([^"]+)",\s*\["([^"]+)",\s*(\d+),\s*(\d+)\],\s*\["([^"]+)",\s*(\d+),\s*(\d+)\]/g; for (let i = scripts.length - 1; i >= 0; i--) { const text = scripts[i].textContent || scripts[i].innerHTML; if (!text || !text.includes("encrypted-tbn0.gstatic.com")) continue; let match; while ((match = re.exec(text)) !== null) { const docid = match[1]; if (!map[docid]) { const origRaw = match[5]; const origUrl = origRaw.replace(/\\u003d/g, '=').replace(/\\u0026/g, '&'); map[docid] = { origUrl: origUrl, origHeight: parseInt(match[6], 10), origWidth: parseInt(match[7], 10), tbnHeight: parseInt(match[3], 10), tbnWidth: parseInt(match[4], 10) }; } } if (Object.keys(map).length > 0) break; } if (Object.keys(map).length > 0) { ugfOriginalImageCache = map; } return map; } function ugfGetOriginalImage(docid) { if (!docid) return null; const map = ugfGetOriginalImageMap(); return map[docid] || null; } // Helper: Exclude known non-embeddable image hosts for inline viewer preview function ugfIsExcludedOriginalImageHost(url) { if (!url || typeof url !== 'string') return true; try { let hostname = new URL(url).hostname.toLowerCase(); // Exclude Meta lookaside domains (lookaside.fbsbx.com, lookaside.instagram.com, etc.) if (hostname.includes("lookaside.") || /^lookaside\.[a-z0-9-]+\.com$/.test(hostname)) { return true; } // Exclude TikTok and ByteDance CDN domains if (hostname.endsWith("tiktok.com") || hostname.endsWith("tiktokcdn.com") || hostname.includes("byteoversea") || hostname.includes("ibytedtos")) { return true; } return false; } catch (e) { return true; } } // ---- AI Overviews ---------------------------------------------------------- // What Google calls the block, in the languages Gplex speaks - used when the block // does not carry the data-mcpr marker Google used to give it. function ugfNeuroNames() { return ["AI Overview", "AI Overviews", "Vista creada con IA", "Resumen de IA", "Aperçu IA", "Aperçu généré par l'IA", "Übersicht mit KI", "KI-Übersicht", "Panoramica AI", "Panoramica IA", "Visão geral criada por IA", "Visão geral de IA", "AI による概要", "AI 개요", "AI 概览", "AI 摘要", "AI-overzicht", "Overzicht met AI", "Przegląd od AI", "Omówienie od AI", "Обзор от ИИ", "Yapay Zeka Genel Bakış", "Yapay zeka genel bakışı"]; } function ugfNeuroMine(el) { return !!(el && el.closest && el.closest('#ugf, [id^="ugf-"]')); } // (6.5) inside a "People also ask" question: Google answers those with AI now, and that is // not the overview (and never to be shown) function ugfNeuroInPaa(el) { return !!(el && el.closest && el.closest(".related-question-pair, [data-initq], .wQiwMc")); } // Google's own AI Overview block, or null while there is none (yet) function ugfNeuroSource() { let box = null; document.querySelectorAll("[data-mcpr]").forEach(function(el) { if (!box && !ugfNeuroMine(el) && !ugfNeuroInPaa(el)) { box = el; } }); if (box) { return { box: box, head: null }; } const names = ugfNeuroNames().map(function(n) { return n.toLowerCase(); }); const wanted = function(el) { const t = String(el.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); return t.length > 0 && t.length < 60 && names.indexOf(t) > -1 && !ugfNeuroMine(el) && !ugfNeuroInPaa(el); }; let head = null; const heads = document.querySelectorAll('h1, h2, [role="heading"]'); for (let i = 0; i < heads.length && !head; i++) { if (wanted(heads[i])) { head = heads[i]; } } if (!head) { // some versions write the name in a plain element rather than a heading const leaves = document.querySelectorAll("#rcnt div, #rcnt span, #main div, #main span"); for (let i = 0; i < leaves.length && !head; i++) { if (!leaves[i].children.length && wanted(leaves[i])) { head = leaves[i]; } } } if (!head) { return null; } // The block is the widest ancestor that takes in none of the ordinary results: // stop below the results column, below anything holding the results list, and // at the step that would take in another result block. (Linked headings are no // guide - the overview lists its own sources that way.) const results = function(el) { return el.querySelectorAll(".MjjYud, div.g").length; }; let n = head.parentElement; for (let up = 0; n && up < 14; up++, n = n.parentElement) { const p = n.parentElement; if (!p || p === document.body || /^(rso|search|center_col|rcnt|main|botstuff)$/.test(p.id || "") || (p.querySelector("#rso") && !n.querySelector("#rso")) || results(p) > results(n)) { break; } } if (!n || n === document.body) { return null; } return { box: n, head: head }; } // the overview's content as HTML, without Google's own heading, and its text length // Only the overview itself: no way into AI Mode. Google hangs an "Ask anything" // follow-up box and "Dive deeper in AI Mode" links off the bottom; copied into // Gplex they are dead controls at best, and Gplex is not meant to be a door to a // full AI chat anyway. // The box is found by what it says, wherever Google puts the words: as text, in // a placeholder or label attribute, or drawn in by a stylesheet (::before) - the // last is why removing text boxes and matching plain text was not enough. function ugfNeuroAskRe() { // whole phrases only: an overview can quite properly contain a line that // merely starts with "Ask" or mentions a mode return /^(ask anything|ask a follow[- ]?up|ask follow[- ]?up|ask ai mode|dive deeper in ai mode|dive deeper$|continue in ai mode|start ai mode|ai mode$|pregunta lo que quieras|haz una pregunta de seguimiento|posez vos questions|posez une question de suivi|frag etwas|stelle eine frage|chiedi qualsiasi cosa|pergunte qualquer coisa|何でも質問|무엇이든 물어보세요|有问题,尽管问|提出任何问题|提出任何問題|問我任何問題|vraag iets|stel een vraag|zapytaj o cokolwiek|спросите что угодно|herhangi bir şey sor)/i; } function ugfNeuroAskHit(el, live) { const re = ugfNeuroAskRe(); const attrs = ["placeholder", "aria-label", "data-placeholder", "aria-placeholder", "title", "data-tooltip", "aria-description", "data-hint"]; for (let i = 0; i < attrs.length; i++) { const v = el.getAttribute && el.getAttribute(attrs[i]); if (v && re.test(v.trim())) { return true; } } if (!el.children.length) { const t = (el.textContent || "").replace(/\s+/g, " ").trim(); if (t && t.length < 60 && re.test(t)) { return true; } } if (live) { const pseudo = ["::before", "::after"]; for (let i = 0; i < pseudo.length; i++) { let c = ""; try { c = getComputedStyle(el, pseudo[i]).content || ""; } catch (e) {} if (c && c !== "none" && c !== "normal") { c = c.replace(/^["']|["']$/g, "").trim(); if (c && re.test(c)) { return true; } } } } return false; } // the small box drawn round a control (the "+" button, the send arrow) goes with // it, but never anything that holds real text function ugfNeuroAskBox(el, stop) { const textLen = function(n) { return (n.textContent || "").replace(/\s+/g, "").length; }; let top = el; while (top.parentElement && top.parentElement !== stop && textLen(top.parentElement) <= 40) { top = top.parentElement; } return top; } function ugfNeuroClean(root) { const drop = function(el) { if (!root.contains(el) || el === root) { return; // already gone with a box removed before it } const top = ugfNeuroAskBox(el, root); if (top !== root) { top.remove(); } }; root.querySelectorAll("script, style, noscript, template").forEach(function(el) { el.remove(); }); // anything that takes typing: the follow-up box, in whatever form Google draws it root.querySelectorAll('textarea, input, select, form, [contenteditable], [role="textbox"], ' + '[role="combobox"], [role="searchbox"], [placeholder], [data-placeholder], [aria-placeholder]').forEach(drop); // links and buttons into AI Mode (udm=50 is AI Mode's results page) root.querySelectorAll('a[href*="udm=50"], [data-udm="50"], a[href*="aimode"], a[href*="/ai?"]').forEach(drop); root.querySelectorAll("*").forEach(function(el) { if (root.contains(el) && ugfNeuroAskHit(el, false)) { drop(el); } }); // Google's own buttons do nothing in a copy - the "+" beside the box among // them - so the icon-only ones go too; anything with a name on it (a source // chip) and all links stay root.querySelectorAll('button, [role="button"]').forEach(function(el) { if (root.contains(el) && (el.textContent || "").replace(/\s+/g, "").length <= 2 && !el.querySelector("a[href]") && !el.closest("a[href]")) { drop(el); } }); return root; } // A second pass on the copy once it is on the page, where Google's stylesheet // applies and text drawn in by CSS can be seen - and a sweep for any follow-up box // Google puts on the page outside the results it hides. function ugfNeuroSweep() { const hide = function(el, stop) { const top = ugfNeuroAskBox(el, stop); if (top && top !== stop && !top.hasAttribute("data-ugf-noask")) { top.setAttribute("data-ugf-noask", ""); top.style.setProperty("display", "none", "important"); } }; document.querySelectorAll("#ugf .ugf-neuro-content-inner").forEach(function(root) { root.querySelectorAll("*").forEach(function(el) { if (!el.closest("[data-ugf-noask]") && ugfNeuroAskHit(el, true)) { hide(el, root); } }); }); // Gplex hides Google's page; anything of Google's still showing is something // it floated on top, which is where a follow-up box would end up [].forEach.call(document.body ? document.body.children : [], function(top) { if (/^(ugf|sZmt3b)/.test(top.id || "") || /^(SCRIPT|STYLE|LINK|META|NOSCRIPT|TEMPLATE)$/.test(top.tagName) || !top.getClientRects().length) { return; } const all = [top].concat([].slice.call(top.querySelectorAll("*"))); for (let i = 0; i < all.length && i < 4000; i++) { if (all[i].closest("[data-ugf-noask]") || !all[i].getClientRects().length) { continue; } if (ugfNeuroAskHit(all[i], true) || /^(TEXTAREA|INPUT)$/.test(all[i].tagName) && ugfNeuroAskHit(all[i], false)) { hide(all[i], document.body); } } }); } function ugfNeuroSweepStart() { if (ugfNeuroSweepStart.on) { return; } ugfNeuroSweepStart.on = true; let n = 0; const iv = setInterval(function() { try { ugfNeuroSweep(); } catch (e) {} if (++n > 90) { clearInterval(iv); // 90 seconds is well past the overview finishing } }, 1000); } // the overview's content as HTML, without Google's own heading, and its text length function ugfNeuroRead(src) { const textLen = function(el) { return (el.textContent || "").replace(/\s+/g, "").length; }; let root = src.box; let head = src.head; if (head === null) { // The marked block: take the part holding most of the text. The first // [data-ve-view] inside it was trusted blindly before, and it can be the // follow-up box rather than the overview. let best = null; src.box.querySelectorAll("[data-ve-view]").forEach(function(v) { if (!best || textLen(v) > textLen(best)) { best = v; } }); if (best && textLen(best) >= textLen(src.box) * 0.6) { root = best; } const names = ugfNeuroNames().map(function(n) { return n.toLowerCase(); }); root.querySelectorAll('h1, h2, [role="heading"]').forEach(function(h) { const t = String(h.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); if (!head && names.indexOf(t) > -1) { head = h; } }); } const copy = root.cloneNode(true); if (head && root.contains(head)) { // Drop Google's heading row from the copy - Gplex draws its own "AI Overview" // title. The row is the widest wrapper round the heading that holds little // else (a "Learn more" link, a menu button). let top = head; const headLen = textLen(head); while (top.parentElement && top.parentElement !== root && textLen(top.parentElement) <= headLen + 30) { top = top.parentElement; } const path = []; for (let n = top; n && n !== root; n = n.parentElement) { path.unshift([].indexOf.call(n.parentElement.children, n)); } let h = copy; path.forEach(function(i) { h = h && h.children[i]; }); if (h && h !== copy) { h.remove(); } } ugfNeuroClean(copy); return { html: copy.innerHTML, len: textLen(copy) }; } function ugfNeuroPut(html) { document.querySelectorAll("#ugf .ugf-neuro-content-inner").forEach(function(c) { c.innerHTML = trusted_policy.createHTML(html); }); try { ugfNeuroSweep(); } catch (e) {} } function ugfNeuroWire() { if (ugfNeuroWire.done) { return; } ugfNeuroWire.done = true; // once only: wiring these twice meant one click expanded and collapsed again document.querySelectorAll("#ugf .ugf-neuro-expander").forEach(function(x) { x.addEventListener("click", function() { const h = document.querySelector("html"); if (h.hasAttribute("neuro-expand")) { h.removeAttribute("neuro-expand"); } else { h.setAttribute("neuro-expand", "true"); } }); }); document.querySelectorAll("#ugf .ugf-neuro-dismiss").forEach(function(x) { x.addEventListener("click", function() { document.querySelector("html").setAttribute("neuro-status", "hidden"); }); }); } function ugfNeuroWatch() { if (ugfNeuroWatch.on) { return; } ugfNeuroWatch.on = true; ugfNeuroSweepStart(); const html = document.querySelector("html"); const started = Date.now(); let src = null; let foundAt = 0; let last = ""; let changedAt = 0; let shown = false; const iv = setInterval(function() { const now = Date.now(); if (html.getAttribute("neuro-status") === "hidden") { clearInterval(iv); // dismissed return; } if (!src || !src.box.isConnected) { src = ugfNeuroSource(); if (!src) { // most searches have no overview at all: say nothing if (now - started > 20000) { clearInterval(iv); } return; } if (!foundAt) { foundAt = now; ugfNeuroWire(); html.setAttribute("neuro-status", "generating"); } } let got = null; try { got = ugfNeuroRead(src); } catch (e) { got = null; } if (got && got.len > 20) { if (got.html !== last) { last = got.html; changedAt = now; ugfNeuroPut(got.html); } if (!shown) { shown = true; html.setAttribute("neuro-status", "done"); } // finished once Google has stopped writing for a while if (now - changedAt > 6000 || now - started > 60000) { clearInterval(iv); } return; } if (!shown && now - foundAt > 20000) { // the block turned up but Google never wrote anything into it ugfNeuroPut("An AI Overview is not available for this search"); html.setAttribute("neuro-status", "rejected"); clearInterval(iv); } }, 500); } function parseHTMLNeo(location) { if (started == false) { started = true; if (location == "news" && document.querySelector("html").hasAttribute("news-results")) { ugfParseNews(); return; } if (location == "shopping") { ugfParseShopping(); return; } // ((6.5.7) not Images: its basic HTML page is a grid of thumbnails, read by the image page below) if (ugfBasicHtml && location !== "home" && location !== "structured-home" && location !== "gplex" && location !== "images") { ugfParseBasic(); return; } if (location == "images") { let newImagesExp = false; let modernImages = false; let liteImages = false; let tempImageList; if (document.querySelector('#rso img[id^="dimg_"]')) { modernImages = true; tempImageList = document.querySelectorAll('#rso img[id^="dimg_"]'); } else if (document.querySelectorAll('table a[href^="/url?"] img').length >= 4) { // (6.5.4) the lightweight image page (old browsers, basic HTML): a table of thumbnails. // There is no Google image page here to show instead, so Gplex's own image page is used. liteImages = true; document.querySelector("html").removeAttribute("noton-images"); document.querySelector("html").setAttribute("basic-html", ""); tempImageList = document.querySelectorAll('table a[href^="/url?"] img'); } else if (document.querySelector("body > c-wiz")) { newImagesExp = true; tempImageList = document.querySelectorAll("a > div > img"); } else { tempImageList = document.querySelectorAll("h3 img"); } let check = 0; let itemNo = 0; tempImageList.forEach(itemRoot => { if (liteImages) { const cellA = itemRoot.closest("a[href]"); const cell = itemRoot.closest("td") && itemRoot.closest("td").parentElement ? (itemRoot.closest("table") || cellA) : cellA; const link = ugfBasicHref(cellA) || ""; if (!link || !itemRoot.getAttribute("src")) { check++; return; } let capA = null; (cell ? cell.querySelectorAll("a[href]") : []).forEach(function(x) { if (!capA && x !== cellA && !x.querySelector("img")) { capA = x; } }); const bits = []; (capA ? capA.querySelectorAll("span") : []).forEach(function(sp) { const t = (sp.textContent || "").replace(/\s+/g, " ").trim(); if (t && !sp.querySelector("span") && bits.indexOf(t) < 0) { bits.push(t); } }); const lw = itemRoot.naturalWidth || parseInt(itemRoot.getAttribute("width") || "0", 10) || 150; const lh = itemRoot.naturalHeight || parseInt(itemRoot.getAttribute("height") || "0", 10) || 150; itemRoot.classList.add("ugf-image-parse"); linkList.push({imageResult: { itemNo: itemNo, type: "image", iframeUrl: link, width: lw, height: lh, refdocid: "", docid: "", link: link, title: bits[0] || (capA ? capA.textContent.trim() : ""), domain: bits[1] || ugfExtractDomain(link), bigSrc: "", origWidth: null, origHeight: null, src: itemRoot.getAttribute("src"), origImg: itemRoot, origImgId: itemRoot.getAttribute("id") || "" }}); createItem(linkList[linkList.length - 1], "imageResult"); // (6.5.7) the preview's real size once its thumbnail has loaded const made = document.querySelector("#ugf-image-results-container") ? document.querySelector("#ugf-image-results-container").children[itemNo] : null; if (made && !itemRoot.complete) { itemRoot.addEventListener("load", function() { const w = itemRoot.naturalWidth, hh = itemRoot.naturalHeight; if (!w || !hh) { return; } made.setAttribute("img-w", w); made.setAttribute("img-h", hh); const mi = made.querySelector("img"); if (mi) { mi.setAttribute("width", w); mi.setAttribute("height", hh); } made.querySelectorAll(".ugf-image-result-size-first, .ugf-image-result-size-second").forEach(function(sz) { if (sz.children.length >= 3) { sz.children[0].textContent = w; sz.children[2].textContent = hh; } }); }); } itemNo++; check++; return; } let alt = itemRoot.getAttribute('alt'); itemRoot.classList.add("ugf-image-parse"); if (alt === null) { // not there } else if (alt === '') { // empty // check if it is height 12 for favicon later on } else if (alt === 'Google') { // google, ignore } else if (itemRoot.getAttribute("src") == "data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" && !modernImages && !itemRoot.closest("[data-docid]")) { // pixel, ignore } else { let forIframe; if (modernImages) { let tileRoot = itemRoot.closest('[id^="e-"]'); let mdocid = tileRoot ? tileRoot.getAttribute("id").substring(2) : ""; let wrap = tileRoot || itemRoot; while (wrap && !wrap.querySelector('a[href]')) { wrap = wrap.parentElement; } let capA = wrap ? wrap.querySelector('a[href]') : null; let cardRoot = itemRoot.closest("[data-docid]") || itemRoot.closest("[data-ref-docid]") || itemRoot.closest(".ivg-i"); let lpage = cardRoot ? cardRoot.getAttribute("data-lpage") : null; let mlink = lpage || (capA ? capA.getAttribute("href") : ""); let mdomain = ugfExtractDomain(mlink); let mw = itemRoot.getAttribute("width"); let mh = itemRoot.getAttribute("height"); let arEl = tileRoot ? tileRoot.querySelector('[style*="aspect-ratio"]') : null; if (arEl) { let arM = arEl.getAttribute("style").match(/aspect-ratio:\s*(\d+)\s*\/\s*(\d+)/); if (arM) { mw = arM[1]; mh = arM[2]; } } if (!mw || parseInt(mw, 10) < 40) { check++; return; } forIframe = mlink; let origData = ugfGetOriginalImage(mdocid); linkList.push({imageResult: { itemNo: itemNo, type: "image", iframeUrl: forIframe, width: mw, height: mh, refdocid: mdocid, docid: mdocid, link: mlink, title: alt, domain: mdomain, bigSrc: origData ? origData.origUrl : "", origWidth: origData ? origData.origWidth : null, origHeight: origData ? origData.origHeight : null, src: (function() { let s = itemRoot.getAttribute("src") || ""; if (!s || s.includes("data:image/gif;base64")) { return ugfGetDeferredImage(itemRoot.getAttribute("id")) || s; } return s; })(), origImg: itemRoot, origImgId: itemRoot.getAttribute("id") }}); createItem(linkList[itemNo], "imageResult"); itemNo++; check++; return; } if (newImagesExp) { if (document.querySelector("#the-script")) { // setTimeout(function() { let topdog = itemRoot.parentNode.parentNode.parentNode; // topdog.querySelector("a").click(); // var imgved = topdog.getAttribute("data-ved");*/ var imgdoc = topdog.getAttribute("data-id"); // search script var imgfind = document.querySelector("#the-script").innerHTML.split(imgdoc)[1]; //alert(imgfind); imgfind = imgfind.split('"2008": ')[0]; //console.log(imgfind); imgfind = imgfind.split('"2003":[null,"')[1]; //alert(imgfind); imgfind = imgfind.split('"')[0]; //console.log(imgfind); var mera = topdog.querySelector("a:nth-of-type(2)"); var domain = ""; var link = ""; var title = ""; if (mera && mera.querySelector("div")) { link = mera.getAttribute("href") || ""; title = mera.querySelector("div:nth-child(2)") ? mera.querySelector("div:nth-child(2)").textContent : ""; domain = ugfExtractDomain(link); } forIframe = "https://www.google.com/imgres?q=" + searchValue + "&docid=" + imgfind + "&tbnid=" + imgdoc; linkList.push({imageResult: { itemNo: itemNo, type: "image", iframeUrl: forIframe, width: itemRoot.getAttribute("width"), height: itemRoot.getAttribute("height"), refdocid: imgfind, docid: imgdoc, link: link, title: title, domain: domain, src: itemRoot.getAttribute("src") }}); //console.log(linkList); createItem(linkList[itemNo], "imageResult"); itemNo++; } else { var elm = "#the-script"; waitForElement10(elm).then(function(elm) { if (canGo != false) { // setTimeout(function() { let topdog = itemRoot.parentNode.parentNode.parentNode; // topdog.querySelector("a").click(); // var imgved = topdog.getAttribute("data-ved");*/ var imgdoc = topdog.getAttribute("data-id"); // search script var imgfind = document.querySelector("#the-script").innerHTML.split(imgdoc)[1]; //alert(imgfind); imgfind = imgfind.split('"2008": ')[0]; //console.log(imgfind); imgfind = imgfind.split('"2003":[null,"')[1]; //alert(imgfind); imgfind = imgfind.split('"')[0]; //console.log(imgfind); var mera = topdog.querySelector("a:nth-of-type(2)"); var domain = ""; var link = ""; var title = ""; if (mera && mera.querySelector("div")) { link = mera.getAttribute("href") || ""; title = mera.querySelector("div:nth-child(2)") ? mera.querySelector("div:nth-child(2)").textContent : ""; domain = ugfExtractDomain(link); } forIframe = "https://www.google.com/imgres?q=" + searchValue + "&docid=" + imgfind + "&tbnid=" + imgdoc; linkList.push({imageResult: { itemNo: itemNo, type: "image", iframeUrl: forIframe, width: itemRoot.getAttribute("width"), height: itemRoot.getAttribute("height"), refdocid: imgfind, docid: imgdoc, link: link, title: title, domain: domain, src: itemRoot.getAttribute("src") }}); //console.log(linkList); createItem(linkList[itemNo], "imageResult"); itemNo++; } }); } } else { let cardRoot = itemRoot.closest("[data-docid]") || itemRoot.closest("[data-ref-docid]"); var refdoc = cardRoot ? cardRoot.getAttribute("data-ref-docid") : ""; var imgdoc = cardRoot ? cardRoot.getAttribute("data-docid") : ""; var lpage = cardRoot ? cardRoot.getAttribute("data-lpage") : null; var mera = cardRoot ? cardRoot.querySelector("div:nth-child(3)") : null; var domain = ""; var link = ""; var title = ""; if (mera && mera.querySelector("a")) { link = lpage || mera.querySelector("a").getAttribute("href"); title = mera.querySelector("a").textContent; domain = ugfExtractDomain(link); } else if (mera) { //var elm = document.querySelectorAll(".ugf-image-parse")[itemNo]; var elm = mera.querySelector("a"); waitForElement10M(elm).then(function(elm) { if (canGo != false && mera.querySelector("a")) { link = lpage || mera.querySelector("a").getAttribute("href"); var titleEl = mera.querySelector("a > div:nth-of-type(2)") || mera.querySelector("a"); title = titleEl ? titleEl.textContent : ""; domain = ugfExtractDomain(link); } }); } forIframe = "https://www.google.com/imgres?q=" + searchValue + "&docid=" + refdoc + "&tbnid=" + imgdoc; linkList.push({imageResult: { itemNo: itemNo, type: "image", iframeUrl: forIframe, width: itemRoot.getAttribute("width"), height: itemRoot.getAttribute("height"), refdocid: refdoc, docid: imgdoc, link: link, title: title, domain: domain, src: itemRoot.getAttribute("src") }}); createItem(linkList[itemNo], "imageResult"); itemNo++; } } check++; }); document.querySelector("html").setAttribute("results-arrived", ""); let loadNow = document.querySelector("#ugf-load-now-container"); if (loadNow) loadNow.remove(); // document.querySelector("html").setAttribute("disabled",""); } else { let searchValueArray = searchValue.split(" "); let tempLinkList = document.querySelectorAll("a"); let tempBCList = document.querySelectorAll("block-component"); let check = 0; let itemNo = 0; tempLinkList.forEach(itemRoot => { itemRoot.classList.add("ugf-parse-item"); // [role="heading"].parentNode x4 }); tempBCList.forEach(itemRoot => { itemRoot.classList.add("ugf-parse-item"); // [role="heading"].parentNode x4 }); tempLinkList = document.querySelectorAll(".ugf-parse-item"); tempLinkList.forEach(itemRoot => { putThroughPaces(itemRoot).then(function(result) { if (result == "Nope") { } else if (result == "block") { if(document.querySelector('[data-md="132"]')){ let newISHHome = document.querySelector("#ugf-search-results-reserved-top"); let toBeMoved = document.querySelector('block-component'); newISHHome.appendChild(toBeMoved); document.querySelector("html").setAttribute("has-fake-iframe",""); }else{ let title; let heading; let medium; let list; if (itemRoot.querySelector('[role="heading"][aria-level="2"]')) { title = itemRoot.querySelector('[role="heading"]').innerHTML; title.style.background = "red"; let nextElem = itemRoot.querySelector('[role="heading"]').parentNode.nextSibling; nextElem.style.background = "blue"; heading = nextElem.textContent; } else if (itemRoot.querySelector('[data-attrid="wa:/description"]') == null) { medium = itemRoot.querySelector('[role="heading"]').innerHTML; if (itemRoot.querySelector('[role="heading"]').nextSibling) { list = itemRoot.querySelector('[role="heading"]').nextSibling.innerHTML; } } if (itemRoot.querySelector('[data-attrid="wa:/description"]')) { medium = itemRoot.querySelector('[data-attrid="wa:/description"]').innerHTML; } if (itemRoot.querySelector("a")) { firstLinkBelongsToBlock = true; } if (heading && medium && heading.textContent == medium.textContent) { //... heading = title; title = ""; } linkList.push({searchInfoBlock: { itemNo: itemNo, type: "block", title: title, heading: heading, medium: medium, list: list }}); createItem(linkList[itemNo], "searchBlock"); itemNo++; } } else { let link = result.href; let title; let unmoddedTitle; let description = ""; if (result.querySelector("h3")) { title = result.querySelector("h3").innerHTML; unmoddedTitle = result.querySelector("h3").textContent; searchValueArray.forEach(itemRoot => { if ( itemRoot == "to" || itemRoot == "in" || itemRoot == "the" || itemRoot == "a" || itemRoot == "of" || itemRoot == "an" || itemRoot == "span" || itemRoot == "class" || itemRoot == "=" || itemRoot == "-" || itemRoot == "or" || itemRoot == "pan" || itemRoot == "sp" || itemRoot == "spa" || itemRoot == "cl" || itemRoot == "cla" || itemRoot == "clas" || itemRoot == "as" || itemRoot == "ass" || itemRoot == "lass" || itemRoot == "las" || itemRoot == "ugf" || itemRoot == "ugf-keyword" || itemRoot == "keyword" || itemRoot == "rd" || itemRoot == "ord" || itemRoot == "word" || itemRoot == "yword" || itemRoot == "eyword" || itemRoot == "ey" || itemRoot == "ke" || itemRoot == "key" || itemRoot == "keyw" || itemRoot == "keywo" || itemRoot == "keywor" || itemRoot == "a" || itemRoot == "A" || itemRoot == "b" || itemRoot == "B" || itemRoot == "c" || itemRoot == "C" || itemRoot == "d" || itemRoot == "D" || itemRoot == "e" || itemRoot == "E" || itemRoot == "f" || itemRoot == "F" || itemRoot == "g" || itemRoot == "G" || itemRoot == "h" || itemRoot == "H" || itemRoot == "i" || itemRoot == "I" || itemRoot == "j" || itemRoot == "J" || itemRoot == "k" || itemRoot == "K" || itemRoot == "l" || itemRoot == "L" || itemRoot == "m" || itemRoot == "M" || itemRoot == "n" || itemRoot == "N" || itemRoot == "o" || itemRoot == "O" || itemRoot == "p" || itemRoot == "p" || itemRoot == "q" || itemRoot == "Q" || itemRoot == "r" || itemRoot == "R" || itemRoot == "s" || itemRoot == "S" || itemRoot == "t" || itemRoot == "T" || itemRoot == "u" || itemRoot == "U" || itemRoot == "v" || itemRoot == "V" || itemRoot == "w" || itemRoot == "W" || itemRoot == "x" || itemRoot == "X" || itemRoot == "y" || itemRoot == "Y" || itemRoot == "z" || itemRoot == "Z" ) { } else { title = title.replaceAll(itemRoot,"" + itemRoot + ""); let lowerCaseValue = itemRoot.toLowerCase(); title = title.replaceAll(lowerCaseValue,"" + lowerCaseValue + ""); let upperCaseValue = itemRoot.toUpperCase(); title = title.replaceAll(upperCaseValue,"" + upperCaseValue + ""); let normalCaseValue = capitalizeFirstLetter(itemRoot); title = title.replaceAll(normalCaseValue,"" + normalCaseValue + ""); } }); } // Genuine search results must possess a title/h3 header if (title == null) { return; } // Exclude non-organic interactive widget items (e.g. "Things to know" accordions, "People also ask" cards) if ( result.closest('[data-attrid*="lab/"]') || result.closest('.related-question-pair') || result.closest('.EyBRub, .vRy7rc') || result.closest('.MjjYud')?.querySelector('[role="heading"][aria-level="2"]')?.textContent?.trim() === "Things to know" || result.closest('.MjjYud')?.querySelector('[role="heading"][aria-level="2"]')?.textContent?.trim() === "People also ask" ) { return; } // Snippet extraction with fallbacks for modern Google classes (.VwiC3b and line-clamp) let container7 = result.parentNode?.parentNode?.parentNode?.parentNode?.parentNode?.parentNode?.parentNode; if (container7 && container7.querySelector('[data-sncf="1"]')) { description = container7.querySelector('[data-sncf="1"]').innerHTML; } else if (container7 && container7.querySelector('[data-sncf="2"]')) { description = container7.querySelector('[data-sncf="2"]').innerHTML; } else if (container7 && container7.querySelector('[data-sncf="3"]')) { description = container7.querySelector('[data-sncf="3"]').innerHTML; } else if (container7 && container7.querySelector('.VwiC3b')) { // Modern standard snippet class fallback description = container7.querySelector('.VwiC3b').innerHTML; } else if (container7 && container7.querySelector('.ITZIwc, [style*="-webkit-line-clamp"]')) { // Modern card snippet class fallback description = container7.querySelector('.ITZIwc, [style*="-webkit-line-clamp"]').innerHTML; } // Safely locate adjacent element container (skipping text and comment nodes) let nextElem = result.parentNode?.parentNode?.parentNode?.parentNode?.nextSibling; while (nextElem && nextElem.nodeType !== 1) { nextElem = nextElem.nextSibling; } // Resolve clean canonical URL from data-surl or data-curl if available let cleanVideoLink = result.closest?.("[data-surl]")?.getAttribute("data-surl") || result.closest?.("[data-curl]")?.getAttribute("data-curl") || link; if (cleanVideoLink) { link = cleanVideoLink; } const ytVideoId = ugfExtractYtId(cleanVideoLink) || ugfExtractYtId(link); // Genuine video result detection: // In Videos tab (location == 'videos'), any result with a thumbnail is a video. // In standard Web search, only results with specific video containers (.iHxmLe), // duration containers (.c8rnLc, .kSFuOd, etc.), video buttons/aria-labels, or YouTube video IDs qualify. let isVideo = false; if (nextElem && nextElem.querySelector && nextElem.querySelector("img")) { if (location === "videos") { isVideo = true; } else if ( nextElem.classList.contains("iHxmLe") || nextElem.querySelector(".c8rnLc, .kSFuOd, [role='presentation'] span, a div div div:last-child span") || nextElem.querySelector("[data-vll], [role='button'][aria-label*='Play' i], [aria-label*='Play' i], [aria-label*='video' i], [aria-label*='Watch' i]") || ytVideoId ) { isVideo = true; } } if (isVideo == true) { let imgEl = nextElem.querySelector("img"); let origImgId = imgEl ? (imgEl.id || "") : ""; let thumbnail = imgEl ? (imgEl.getAttribute("src") || imgEl.src || "") : ""; const isPlaceholder = !thumbnail || thumbnail.includes("data:image/gif;base64") || thumbnail.length < 100; // Strategy 1: For YouTube videos, fallback to official high-res CDN thumbnail to avoid deferred loading delay if (isPlaceholder && ytVideoId) { thumbnail = "https://i.ytimg.com/vi/" + ytVideoId + "/mqdefault.jpg"; } // Strategy 2: For other platforms (X, Instagram Reels, etc.), look up deferred image dictionary else if (isPlaceholder && origImgId) { const defSrc = ugfGetDeferredImage(origImgId); if (defSrc) { thumbnail = defSrc; } else if (imgEl.getAttribute("data-src")) { thumbnail = imgEl.getAttribute("data-src"); } } // Video duration extraction: support modern Google containers (.c8rnLc, .kSFuOd) let duration = "0:00"; if (nextElem.querySelector("[role='presentation'] span")) { duration = nextElem.querySelector("[role='presentation'] span").textContent; } else if (nextElem.querySelector(".c8rnLc span, .kSFuOd span")) { duration = nextElem.querySelector(".c8rnLc span, .kSFuOd span").textContent; } else if (nextElem.querySelector("a div div div:last-child span")) { duration = nextElem.querySelector("a div div div:last-child span").textContent; } // Video snippet/description extraction: support modern Google containers (.ITZIwc, line-clamp, .fzUZNc) if (nextElem.querySelector(".ITZIwc")) { description = nextElem.querySelector(".ITZIwc").innerHTML; } else if (nextElem.querySelector("[style*='-webkit-line-clamp']")) { description = nextElem.querySelector("[style*='-webkit-line-clamp']").innerHTML; } else if (nextElem.querySelector(".fzUZNc > div")) { description = nextElem.querySelector(".fzUZNc > div").innerHTML; } else if (nextElem.querySelector("a + div > div")) { description = nextElem.querySelector("a + div > div").innerHTML; } linkList.push({videoResult: { itemNo: itemNo, type: "video", href: link, title: title, unmoddedTitle: unmoddedTitle, description: description, thumbnail: thumbnail, duration: duration, origImg: imgEl, origImgId: origImgId }}); createItem(linkList[itemNo], "videoResult"); document.querySelector("html").setAttribute("results-arrived",""); itemNo++; } else if (title != null) { linkList.push({searchResult: { itemNo: itemNo, type: "result", href: link, title: title, unmoddedTitle: unmoddedTitle, description: description }}); createItem(linkList[itemNo], "searchResult"); document.querySelector("html").setAttribute("results-arrived",""); itemNo++; } } }); check++; }); ugfPaaBuild(); if (ugfKpParts().length) { // (6.5) today's knowledge panel: a head over the results and an overview beside them hasSidebar = true; doSidebar(3); } else if ( document.querySelector('[role="complementary"]') && document.querySelector('body > div > div > div [data-attrid]') ) { hasSidebar = true; if (document.querySelector('body > div > div > div > div[data-hveid]:not([role="complementary"]) [data-attrid]')) { tempUpbarList = document.querySelector('body > div > div > div> div[data-hveid]').querySelectorAll("[data-attrid]"); var elm = "[data-attrid='description']"; waitForElement(elm).then(function(elm) { if (canGo != false) { doSidebar(2); } }); } else { doSidebar(1); } } // AI Overviews arrive after the results - often seconds later, and then // streamed in a piece at a time. The old code looked once, while the page was // being parsed, so it missed almost every one; it also gave up after a single // second and called the search "not available" while Google was still writing. // Now: watch for the overview to turn up, then follow it until it is finished. if (neuro == "true") { ugfNeuroWatch(); } // (6.5) today's "These are results for X / Search instead for Y" (#fprs): read as the // period's "Showing results for" (or "Did you mean"); and whatever Google writes there, // a spelling line it can't read never again stops the results from being drawn const ugfFprs = document.querySelector("dynamic-visibility-control #fprs, #fprs"); if (ugfFprs && ugfFprs.querySelector("a[href]") && !ugfNeuroMine(ugfFprs)) { try { const links = ugfFprs.querySelectorAll("a[href]"); const fixed = links[0]; const href = ugfEscapeHtml(fixed.getAttribute("href") || ""); if (/^\s*Did you mean/i.test(String(ugfFprs.textContent || ""))) { hasCorrection = "type1"; correction = 'Did you mean: ' + fixed.innerHTML + ""; } else { hasCorrection = links[1] ? "type2" : "type1"; correction = 'Showing results for ' + fixed.innerHTML + ""; if (links[1]) { insteadLink = links[1].getAttribute("href") || ""; } } } catch (e) { hasCorrection = null; } } else if (document.querySelector("dynamic-visibility-control")) { try { if ( document.querySelector("dynamic-visibility-control location-permission-button") || document.querySelector("dynamic-visibility-control g-dialog") ) { } else if (document.querySelector("dynamic-visibility-control div") == null) { if (document.querySelectorAll("dynamic-visibility-control a")[1] == null) { hasCorrection = "type1legacy"; correction = document.querySelector("dynamic-visibility-control a").outerHTML; } else { hasCorrection = "type2legacy"; correction = document.querySelector("dynamic-visibility-control a").outerHTML; insteadLink = document.querySelectorAll("dynamic-visibility-control a")[1].outerHTML; } } else { if (document.querySelector("dynamic-visibility-control span span:nth-of-type(3)")) { hasCorrection = "type2"; insteadLink = document.querySelector("dynamic-visibility-control span span:nth-of-type(3)").querySelector("a").getAttribute("href"); } else { hasCorrection = "type1"; } correction = document.querySelector("dynamic-visibility-control span span:nth-of-type(2)").innerHTML; } } catch (e) { hasCorrection = null; } } if (document.querySelector('#rso .card-section')) { let newISHHome = document.querySelector("#ugf-search-results-reserved-fake-iframe"); let toBeMoved; if ( searchValue.includes(" to ") || searchValue.includes("unit") || searchValue.includes("converter") ) { toBeMoved = document.querySelector('#rso .card-section').parentNode.parentNode; } else { toBeMoved = document.querySelector('#rso .card-section'); } newISHHome.appendChild(toBeMoved); document.querySelector("html").setAttribute("has-fake-iframe",""); } if ( document.querySelector('#rso g-lightbox') && document.querySelector('#rso block-component') ) { let newISHHome = document.querySelector("#ugf-search-results-reserved-fake-iframe"); let toBeMoved = document.querySelector('#rso block-component'); newISHHome.appendChild(toBeMoved); document.querySelector("html").setAttribute("has-fake-iframe",""); } if ( document.querySelector('#rso [data-md="2"]') ) { let newISHHome = document.querySelector("#ugf-search-results-reserved-fake-iframe"); let toBeMoved = document.querySelector('#rso [data-md="2"]'); newISHHome.appendChild(toBeMoved); document.querySelector("html").setAttribute("has-fake-iframe",""); } if (hasCorrection == "type1") { createCorrection(correction); } if (hasCorrection == "type2") { createCorrection2(correction); } if (hasCorrection == "type1legacy") { createCorrection1l(correction); } if (hasCorrection == "type2legacy") { createCorrection2l(correction); } if ( location == "all" && !searchValue.includes(" x ") && !searchValue.includes(" X ") && searchValue.includes("twitter") || searchValue.includes("Twitter") || searchValue.includes("TWITTER") ) { bringForthJustice(); } if ( searchValue == "Is Mark Zuckerberg a lizard" || searchValue == "Is mark zuckerberg a lizard" || searchValue == "is mark zuckerberg a lizard" || searchValue == "is Mark Zuckerberg a lizard" ) { createItem("zucc"); document.querySelector("html").setAttribute("lizard",""); } } } } // the pieces of today's knowledge panel (the head over the results, the overview beside them) function ugfKpParts() { const parts = Array.prototype.filter.call(document.querySelectorAll(".kp-wholepage-osrp"), function(e) { return !ugfNeuroMine(e) && !e.parentElement.closest(".kp-wholepage-osrp"); }); return parts.some(function(e) { return e.querySelector('[data-attrid="title"]'); }) ? parts : []; } function doSidebar(mode) { if (mode == 3) { const list = []; ugfKpParts().forEach(function(part) { part.querySelectorAll("[data-attrid]").forEach(function(e) { if (list.indexOf(e) < 0 && !e.closest(".related-question-pair")) { list.push(e); } }); }); tempSidebarList = list; } else if ( mode == 2 && document.querySelectorAll('[role="complementary"]')[2] ) { tempSidebarList = document.querySelectorAll('[role="complementary"]')[2].querySelectorAll("[data-attrid]"); } else { tempSidebarList = document.querySelector('[role="complementary"]').querySelectorAll("[data-attrid]"); } let sidebarTitle; let sidebarSubtitle = ""; let sbImg = ""; let sbDesc = ""; let sbKc1 = ""; let sbKc2 = ""; let sbKc3 = ""; let sbKc4 = ""; let sbKc5 = ""; let sbKc6 = ""; let sbKc7 = ""; let sbKc8 = ""; let sbKc9 = ""; let sbKc10 = ""; let sbKc11 = ""; let sbKc12 = ""; tempSidebarList.forEach(itemRoot => { var itemId = itemRoot.getAttribute("data-attrid"); if (itemId == "title" && !sidebarTitle) { sidebarTitle = mode == 3 ? ugfEscapeHtml(String(itemRoot.textContent || "").trim()) : itemRoot.innerHTML; } if (itemId == "subtitle" && !sidebarSubtitle) { sidebarSubtitle = mode == 3 ? ugfEscapeHtml(String(itemRoot.textContent || "").trim()) : itemRoot.innerHTML; } if ((itemId == "image" || itemId == "VisualDigestFirstImageResult") && !sbImg && itemRoot.querySelector("img")) { const im = itemRoot.querySelector("img"); let src = im.getAttribute("src") || ""; if ((!src || /^data:image\/gif/.test(src) || src.length < 100 && /^data:/.test(src)) && im.id) { src = ugfGetDeferredImage(im.id) || im.getAttribute("data-src") || src; } sbImg = src; } if ( itemId == "description" && !sbDesc ) { if (mode == 3) { const d = itemRoot.cloneNode(true); d.querySelectorAll("h1, h2, h3, [role='heading']").forEach(function(h) { h.remove(); }); sbDesc = d.innerHTML; } else { sbDesc = itemRoot.innerHTML; } } /*if ( document.querySelector("[data-attrid='description']") ) { sbDesc = document.querySelector("[data-attrid='description']").innerHTML; }*/ if ( !itemId.includes("kc:/ugc:user_reviews") && !itemId.includes("kc:/film/film:media_actions_wholepage") && !itemId.includes("kc:/ugc:thumbs_up") && itemId.includes("kc:/") || itemId.includes("ss:/") ) { if (sbKc1 === "") { sbKc1 = itemRoot.innerHTML; } else if (sbKc2 === "") { sbKc2 = itemRoot.innerHTML; } else if (sbKc3 === "") { sbKc3 = itemRoot.innerHTML; } else if (sbKc4 === "") { sbKc4 = itemRoot.innerHTML; } else if (sbKc5 === "") { sbKc5 = itemRoot.innerHTML; } else if (sbKc6 === "") { sbKc6 = itemRoot.innerHTML; } else if (sbKc7 === "") { sbKc7 = itemRoot.innerHTML; } else if (sbKc8 === "") { sbKc8 = itemRoot.innerHTML; } else if (sbKc9 === "") { sbKc9 = itemRoot.innerHTML; } else if (sbKc10 === "") { sbKc10 = itemRoot.innerHTML; } else if (sbKc11 === "") { sbKc11 = itemRoot.innerHTML; } else if (sbKc12 === "") { sbKc12 = itemRoot.innerHTML; } } }); if (mode == 2) { tempUpbarList.forEach(itemRoot => { var itemId = itemRoot.getAttribute("data-attrid"); if (itemId == "title") { sidebarTitle = itemRoot.textContent; } if (itemId == "subtitle") { sidebarSubtitle = itemRoot.textContent; } }); } // (today's picture strip sits outside the panel's parts) if (mode == 3 && !sbImg) { const im = document.querySelector('[data-attrid="VisualDigestFirstImageResult"] img, [data-attrid="image"] img'); if (im && !ugfNeuroMine(im)) { let src = im.getAttribute("src") || ""; if ((!src || /^data:image\/gif/.test(src) || src.length < 100 && /^data:/.test(src)) && im.id) { src = ugfGetDeferredImage(im.id) || im.getAttribute("data-src") || src; } sbImg = src; } } if (!sidebarTitle || sidebarTitle.includes("See results about")) { } else { SB = new SearchSidebarAPI(sidebarTitle, sidebarSubtitle, sbImg, sbDesc, sbKc1, sbKc2, sbKc3, sbKc4, sbKc5, sbKc6, sbKc7, sbKc8, sbKc9, sbKc10, sbKc11, sbKc12); if (document.querySelector("#ugf-right-inner")) { createSidebar(); } else { var elm = "#ugf-right-inner"; waitForElement10(elm).then(function(elm) { if (canGo != false) { createSidebar(); } }); } } } function createCSS() { if (document.querySelector("#ugf-styles")) { } else { let container = document.querySelector("body"); let newElem = document.createElement("div"); newElem.id = "ugf-styles"; newElem.innerHTML = trusted_policy.createHTML(ugfI18nCss(styleHTML)); container.insertBefore(newElem, container.children[0]); } } async function createPageShell(location) { document.querySelector("html").setAttribute("gplex",""); return new Promise((resolve, reject) => { let container = document.querySelector("body"); let newElem = document.createElement("div"); newElem.id = "ugf"; if (location == "gplex") { container = document.querySelector("html"); container.setAttribute("confirmed-sv",""); container.innerHTML = ugfTT(``); newElem.innerHTML = trusted_policy.createHTML(gPlexHTML); } else if (location !== "home") { newElem.innerHTML = trusted_policy.createHTML(normalHTML); } else { newElem.innerHTML = trusted_policy.createHTML(homepageHTML); } container.insertBefore(newElem, container.children[0]); if (location == "home") { document.querySelector("#ugf-hp-search input").focus(); document.querySelector("html").setAttribute("search-focus","hard"); } if (location == "gplex") { document.title = "Gplex Settings"; document.querySelector("#ugf-layout-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("layout-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-noton-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("noton-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-infocards-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("infocards-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-forceload-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("forceload-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-settings-display-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("settings-display-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-name-email-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("name-email-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-neuro-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("neuro-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-layout-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("layout-dd-open"); }); document.querySelector("#ugf-noton-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("noton-dd-open"); }); document.querySelector("#ugf-infocards-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("infocards-dd-open"); }); document.querySelector("#ugf-forceload-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("forceload-dd-open"); }); document.querySelector("#ugf-settings-display-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("settings-display-dd-open"); }); document.querySelector("#ugf-name-email-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("name-email-dd-open"); }); document.querySelector("#ugf-neuro-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("neuro-dd-open"); }); document.querySelector("#ugf-gmailon-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("gmailon-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-gmailon-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("gmailon-dd-open"); }); document.querySelector("#ugf-mapson-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("mapson-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-mapson-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("mapson-dd-open"); }); document.querySelector("#ugf-calon-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute("calon-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-calon-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute("calon-dd-open"); }); ["newson", "tron", "docson", "sheetson", "slideson", "drawingson", "signinon", "accounton", "keepon", "formson", "driveon", "photoson"].forEach(function(k) { document.querySelector("#ugf-" + k + "-dd-btn").addEventListener("click",function() { document.querySelector("html").setAttribute(k + "-dd-open",""); document.title = "Gplex Settings"; }); document.querySelector("#ugf-" + k + "-fence").addEventListener("click",function() { document.querySelector("html").removeAttribute(k + "-dd-open"); }); }); let layoutBtns = document.querySelectorAll("#ugf-option-layout .ugf-dropdown-item"); layoutBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); document.querySelector("html").removeAttribute("gplex2009"); document.querySelector("html").removeAttribute("gplex2009l"); document.querySelector("html").removeAttribute("gplex2010"); document.querySelector("html").removeAttribute("gplex2007"); document.querySelector("html").removeAttribute("gplex2022"); document.querySelector("html").removeAttribute("gplex2006"); document.querySelector("html").removeAttribute("gplex2005"); document.querySelector("html").removeAttribute("gplex2003"); document.querySelector("html").removeAttribute("gplex2002"); document.querySelector("html").removeAttribute("gplex2001"); document.querySelector("html").removeAttribute("gplex2000"); document.querySelector("html").removeAttribute("gplex1999"); document.querySelector("html").removeAttribute("gplex1998"); document.querySelector("html").removeAttribute("gplex1997"); if (value === "2009" || value === "2009L") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2009",""); if (value === "2009L") { // late 2009 to early 2010: the same page, the buttons spaced apart document.querySelector("html").setAttribute("gplex2009l",""); } document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2010N") { document.querySelector("html").setAttribute("layout","2012"); document.querySelector("html").setAttribute("gplex2010",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2022") { document.querySelector("html").setAttribute("layout","2019"); document.querySelector("html").setAttribute("gplex2022",""); } else if (value === "2007") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2007",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2006") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2006",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "1997") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1997",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "1998") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1998",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "1999") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex1999",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2000") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2000",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2001") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2001",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2002") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2002",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2003") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2003",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2005") { document.querySelector("html").setAttribute("layout","2010"); document.querySelector("html").setAttribute("gplex2005",""); document.querySelector("html").setAttribute("legacy-gbar",""); document.querySelector("html").setAttribute("legacy-images",""); document.querySelector("html").setAttribute("legacy-footer",""); } else if (value === "2015N" || value === "2016E") { document.querySelector("html").setAttribute("layout","2016"); } else if (value === "2016N") { document.querySelector("html").setAttribute("layout","2018"); } else { document.querySelector("html").setAttribute("layout",value); } ugfSaveLayout(value); layout = ugfRuntimeLayout(value); doGplexDropdowns("layout"); document.querySelector("html").removeAttribute("layout-dd-open"); }); }); let notonBtns = document.querySelectorAll("#ugf-option-noton .ugf-dropdown-item"); notonBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_NOTON_IMAGES",value); notOnImages = value; doGplexDropdowns("noton"); document.querySelector("html").removeAttribute("noton-dd-open"); }); }); let infoCardsBtns = document.querySelectorAll("#ugf-option-infocards .ugf-dropdown-item"); infoCardsBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_INFO_CARDS",value); infoCards = value; document.querySelector("html").setAttribute("info-cards",value); doGplexDropdowns("infocards"); document.querySelector("html").removeAttribute("infocards-dd-open"); }); }); let forceloadBtns = document.querySelectorAll("#ugf-option-forceload .ugf-dropdown-item"); forceloadBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_FORCE_LOAD_MSG",value); forceLoadMsg = value; doGplexDropdowns("forceload"); document.querySelector("html").removeAttribute("forceload-dd-open"); }); }); let settingsDisplayBtns = document.querySelectorAll("#ugf-option-settings-display .ugf-dropdown-item"); settingsDisplayBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_SETTINGS_DISPLAY",value); settingsDisplay = value; doGplexDropdowns("settings-display"); document.querySelector("html").removeAttribute("settings-display-dd-open"); }); }); let nameEmailBtns = document.querySelectorAll("#ugf-option-name-email .ugf-dropdown-item"); nameEmailBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_NAME_EMAIL",value); try { if (typeof GM_setValue === "function") { GM_setValue("UGF_NAME_EMAIL", value); } } catch (e) {} nameEmail = value; doGplexDropdowns("name-email"); document.querySelector("html").removeAttribute("name-email-dd-open"); }); }); let neuroBtns = document.querySelectorAll("#ugf-option-neuro .ugf-dropdown-item"); neuroBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); localStorage.setItem("UGF_NEURO",value); neuro = value; doGplexDropdowns("neuro"); document.querySelector("html").removeAttribute("neuro-dd-open"); }); }); [["newson", "UGF_NEWS_ON"], ["tron", "UGF_TRANSLATE_ON"], ["docson", "UGF_DOCS_ON"], ["sheetson", "UGF_SHEETS_ON"], ["slideson", "UGF_SLIDES_ON"], ["drawingson", "UGF_DRAWINGS_ON"], ["signinon", "UGF_SIGNIN_ON"], ["accounton", "UGF_ACCOUNT_ON"], ["keepon", "UGF_KEEP_ON"], ["formson", "UGF_FORMS_ON"], ["driveon", "UGF_DRIVE_ON"], ["photoson", "UGF_PHOTOS_ON"]].forEach(function(o) { document.querySelectorAll("#ugf-option-" + o[0] + " .ugf-dropdown-item").forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); try { if (typeof GM_setValue === "function") { GM_setValue(o[1], value); } } catch (e) {} if (o[0] === "newson") { newsOn = value; } else if (o[0] === "docson") { docsOn = value; } else if (o[0] === "sheetson") { sheetsOn = value; } else if (o[0] === "slideson") { slidesOn = value; } else if (o[0] === "drawingson") { drawingsOn = value; } else if (o[0] === "signinon") { signinOn = value; } else if (o[0] === "accounton") { accountOn = value; } else if (o[0] === "keepon") { keepOn = value; } else if (o[0] === "formson") { formsOn = value; } else if (o[0] === "driveon") { driveOn = value; } else if (o[0] === "photoson") { photosOn = value; } else { trOn = value; } doGplexDropdowns(o[0]); document.querySelector("html").removeAttribute(o[0] + "-dd-open"); }); }); }); document.querySelectorAll("#ugf-option-calon .ugf-dropdown-item").forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); try { if (typeof GM_setValue === "function") { GM_setValue("UGF_CAL_ON", value); } } catch (e) {} calOn = value; doGplexDropdowns("calon"); document.querySelector("html").removeAttribute("calon-dd-open"); }); }); document.querySelectorAll("#ugf-option-mapson .ugf-dropdown-item").forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); try { localStorage.setItem("UGF_MAPS_ON", value); } catch (e) {} mapsOn = value; doGplexDropdowns("mapson"); document.querySelector("html").removeAttribute("mapson-dd-open"); }); }); let gmailOnBtns = document.querySelectorAll("#ugf-option-gmailon .ugf-dropdown-item"); gmailOnBtns.forEach(itemRoot => { itemRoot.addEventListener("click",function() { let value = itemRoot.getAttribute("value"); ugfSaveGmailOn(value); gmailOn = value; doGplexDropdowns("gmailon"); document.querySelector("html").removeAttribute("gmailon-dd-open"); }); }); document.querySelector("#ugf-option-plus-link input").addEventListener("keydown", function() { let key = event.key; if (key == "Enter") { var value = document.querySelector("#ugf-option-plus-link input").value; localStorage.setItem("UGF_PLUS_LINK",value); gPlusLink = value; document.querySelector("#ugf-option-plus-link").setAttribute("unsaved","false"); } else { setTimeout(function() { var value = document.querySelector("#ugf-option-plus-link input").value; /*if ( !value.includes("http") || !value.includes("://") ) { //document.querySelector("#ugf-option-plus-link").setAttribute("unsaved","error"); } else*/ if (value == gPlusLink) { document.querySelector("#ugf-option-plus-link").setAttribute("unsaved","false"); } else { document.querySelector("#ugf-option-plus-link").setAttribute("unsaved","true"); } }, 10); } }); doGplexDropdowns("all"); } const qField = document.querySelector('textarea[name="q"]') || document.querySelector('input[name="q"]:not([type="hidden"])'); if (qField) { // (6.5.3) the search box itself: lightweight pages have hidden fields before it searchValue = qField.tagName === "TEXTAREA" ? qField.value : (qField.getAttribute("value") || qField.value || ""); document.querySelector("html").setAttribute("confirmed-sv",""); } else if (document.querySelector("textarea")) { searchValue = document.querySelector("textarea").value; document.querySelector("html").setAttribute("confirmed-sv",""); } else if (document.querySelector("input")) { searchValue = document.querySelector("input").getAttribute("value"); document.querySelector("html").setAttribute("confirmed-sv",""); /*} else if (location == "images") { var elm = "input"; waitForElement10(elm).then(function(elm) { if (canGo != false) { searchValue = document.querySelector("input").getAttribute("value"); document.querySelector("html").setAttribute("confirmed-sv",""); } });*/ } else { var elm = "textarea"; waitForElement10(elm).then(function(elm) { if (canGo != false) { searchValue = document.querySelector("textarea").value; document.querySelector("html").setAttribute("confirmed-sv",""); } }); } var elm = "[confirmed-sv]"; waitForElement10(elm).then(function(elm) { if (canGo != false) { doSearchValueStuff(); resolve("done"); } }); if (document.querySelector("#result-stats nobr")) { resultCount = document.querySelector("#result-stats").innerHTML; document.querySelector("#ugf-search-results-header span").innerHTML = ugfTT(resultCount); ugfEraResultsLine(); } else { var elm = "#result-stats"; waitForElement10(elm).then(function(elm) { if (canGo != false) { if (document.querySelector("#result-stats nobr")) { resultCount = document.querySelector("#result-stats").innerHTML; document.querySelector("#ugf-search-results-header span").innerHTML = ugfTT(resultCount); ugfEraResultsLine(); } } }); } }); } function doGplexDropdowns(setting) { if (setting == "layout" || setting == "all") { let layoutBtnSpan = document.querySelector("#ugf-option-layout .ugf-dropdown-button span"); switch (UGF_LATE2015 ? "2015N" : UGF_LATE2016 && (String(layout) === "2016" || String(layout) === "2018") ? "2016N" : (UGF_EARLY2016 && String(layout) === "2016") ? "2016E" : layout) { case '2010': layoutBtnSpan.textContent = UImessages.l2012; break; case '2011': layoutBtnSpan.textContent = UImessages.l2012; break; case '2012': layoutBtnSpan.textContent = UImessages.l2012; break; case '2013': layoutBtnSpan.textContent = UImessages.l2013; break; case '2013L': layoutBtnSpan.textContent = UImessages.l2013L; break; case '2009': layoutBtnSpan.textContent = UImessages.l2009; break; case '2009L': layoutBtnSpan.textContent = UImessages.l2009L; break; case '2010N': layoutBtnSpan.textContent = UImessages.l2010N; break; case '2007': layoutBtnSpan.textContent = UImessages.l2007; break; case '2006': layoutBtnSpan.textContent = UImessages.l2006; break; case '2005': layoutBtnSpan.textContent = UImessages.l2005; break; case '2003': layoutBtnSpan.textContent = UImessages.l2003; break; case '2002': layoutBtnSpan.textContent = UImessages.l2002; break; case '2001': layoutBtnSpan.textContent = UImessages.l2001; break; case '2000': layoutBtnSpan.textContent = UImessages.l2000; break; case '1999': layoutBtnSpan.textContent = UImessages.l1999; break; case '1998': layoutBtnSpan.textContent = UImessages.l1998; break; case '1997': layoutBtnSpan.textContent = UImessages.l1997; break; case '2014': layoutBtnSpan.textContent = UImessages.l2014; break; case '2015': layoutBtnSpan.textContent = UImessages.l2015; break; case '2015L': layoutBtnSpan.textContent = UImessages.l2015L; break; case "2015N": layoutBtnSpan.textContent = UImessages.l2015N; break; case '2016': layoutBtnSpan.textContent = UImessages.l2016; break; case "2016E": layoutBtnSpan.textContent = UImessages.l2016E; break; case "2016N": layoutBtnSpan.textContent = UImessages.l2016N; break; case "2016C": layoutBtnSpan.textContent = UImessages.l2016C; break; case '2016L': layoutBtnSpan.textContent = UImessages.l2016L; break; case "2018": layoutBtnSpan.textContent = UImessages.l2018; break; case "2018M": layoutBtnSpan.textContent = UImessages.l2018M; break; case "2022": layoutBtnSpan.textContent = UImessages.l2022; break; case "2019": layoutBtnSpan.textContent = UImessages.l2019; break; } } if (setting == "noton" || setting == "all") { let notonBtnSpan = document.querySelector("#ugf-option-noton .ugf-dropdown-button span"); switch (notOnImages) { case 'false': notonBtnSpan.textContent = UImessages.notonOn; break; case 'true': notonBtnSpan.textContent = UImessages.notonOff; break; } } if (setting == "infocards" || setting == "all") { let infoCardsBtnSpan = document.querySelector("#ugf-option-infocards .ugf-dropdown-button span"); if (infoCardsBtnSpan) { switch (infoCards) { case 'true': infoCardsBtnSpan.textContent = UImessages.infoCardsOn; break; case 'false': infoCardsBtnSpan.textContent = UImessages.infoCardsOff; break; } } } if (setting == "forceload" || setting == "all") { let forceloadBtnSpan = document.querySelector("#ugf-option-forceload .ugf-dropdown-button span"); switch (forceLoadMsg) { case 'false': forceloadBtnSpan.textContent = UImessages.forceLoadMsgOff; break; case 'true': forceloadBtnSpan.textContent = UImessages.forceLoadMsgOn; break; case 'fast': forceloadBtnSpan.textContent = UImessages.forceLoadMsgFast; break; } } if (setting == "settings-display" || setting == "all") { let settingsDisplayBtnSpan = document.querySelector("#ugf-option-settings-display .ugf-dropdown-button span"); switch (settingsDisplay) { case 'topbar': settingsDisplayBtnSpan.textContent = UImessages.SDtopbar; break; case 'topbar-hover': settingsDisplayBtnSpan.textContent = UImessages.SDtopbarHover; break; case 'none': settingsDisplayBtnSpan.textContent = UImessages.SDnone; break; } } if (setting == "name-email" || setting == "all") { let nameEmailBtnSpan = document.querySelector("#ugf-option-name-email .ugf-dropdown-button span"); switch (nameEmail) { case 'name': nameEmailBtnSpan.textContent = UImessages.NEname; break; case 'email': nameEmailBtnSpan.textContent = UImessages.NEemail; break; case 'none': nameEmailBtnSpan.textContent = UImessages.NEnone; break; } } if (setting == "neuro" || setting == "all") { let neuroBtnSpan = document.querySelector("#ugf-option-neuro .ugf-dropdown-button span"); switch (neuro) { case 'true': neuroBtnSpan.textContent = UImessages.NRtrue; break; case 'false': neuroBtnSpan.textContent = UImessages.NRfalse; break; } } if (setting == "newson" || setting == "all") { let s1 = document.querySelector("#ugf-option-newson .ugf-dropdown-button span"); if (s1) { s1.textContent = newsOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "tron" || setting == "all") { let s2 = document.querySelector("#ugf-option-tron .ugf-dropdown-button span"); if (s2) { s2.textContent = trOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "docson" || setting == "all") { let s3 = document.querySelector("#ugf-option-docson .ugf-dropdown-button span"); if (s3) { s3.textContent = docsOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "photoson" || setting == "all") { let s8 = document.querySelector("#ugf-option-photoson .ugf-dropdown-button span"); if (s8) { s8.textContent = photosOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "driveon" || setting == "all") { let s7 = document.querySelector("#ugf-option-driveon .ugf-dropdown-button span"); if (s7) { s7.textContent = driveOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "formson" || setting == "all") { let s6 = document.querySelector("#ugf-option-formson .ugf-dropdown-button span"); if (s6) { s6.textContent = formsOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "keepon" || setting == "all") { let skp = document.querySelector("#ugf-option-keepon .ugf-dropdown-button span"); if (skp) { skp.textContent = keepOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "accounton" || setting == "all") { let sac = document.querySelector("#ugf-option-accounton .ugf-dropdown-button span"); if (sac) { sac.textContent = accountOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "signinon" || setting == "all") { let sgn = document.querySelector("#ugf-option-signinon .ugf-dropdown-button span"); if (sgn) { sgn.textContent = signinOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "drawingson" || setting == "all") { let sd = document.querySelector("#ugf-option-drawingson .ugf-dropdown-button span"); if (sd) { sd.textContent = drawingsOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "slideson" || setting == "all") { let s5 = document.querySelector("#ugf-option-slideson .ugf-dropdown-button span"); if (s5) { s5.textContent = slidesOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "sheetson" || setting == "all") { let s4 = document.querySelector("#ugf-option-sheetson .ugf-dropdown-button span"); if (s4) { s4.textContent = sheetsOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "calon" || setting == "all") { let calOnBtnSpan = document.querySelector("#ugf-option-calon .ugf-dropdown-button span"); if (calOnBtnSpan) { calOnBtnSpan.textContent = calOn === "false" ? UImessages.CLfalse : UImessages.CLtrue; } } if (setting == "mapson" || setting == "all") { let mapsOnBtnSpan = document.querySelector("#ugf-option-mapson .ugf-dropdown-button span"); if (mapsOnBtnSpan) { mapsOnBtnSpan.textContent = mapsOn === "false" ? UImessages.MPfalse : UImessages.MPtrue; } } if (setting == "gmailon" || setting == "all") { let gmailOnBtnSpan = document.querySelector("#ugf-option-gmailon .ugf-dropdown-button span"); if (gmailOnBtnSpan) { gmailOnBtnSpan.textContent = gmailOn === "false" ? UImessages.GMfalse : UImessages.GMtrue; } } } function doSearchValueStuff() { if (!searchValue) { // (6.5.3) the search box wasn't readable yet (lightweight pages): the address has the search try { searchValue = new URLSearchParams(window.location.search).get("q") || ""; } catch (e) {} } if ( location !== "home" && location !== "gplex" ) { fixSidebar(); } setLayout(); createTop(); } function fixSidebar() { let encodedSearchValue = encodeURIComponent(searchValue); let sidebarTools = document.querySelectorAll(".ugf-sidebar-tool-inner"); sidebarTools.forEach(itemRoot => { let newHref = itemRoot.getAttribute("href").replaceAll("TEMP_REPLACEME",encodedSearchValue); itemRoot.setAttribute("href",newHref); }); } function fixPagination() { fixPagination.done = true; let encodedSearchValue = encodeURIComponent(searchValue); let pages = document.querySelectorAll(".gp-pagination"); let PRcheck = 0; /*if (loggedIn == true) { let href = document.querySelector("#gp-pagination-2").getAttribute("href"); document.querySelector("#gp-pagination-2").setAttribute("href",href.replaceAll("&start=10","&start=10")); href = document.querySelector("#gp-pagination-3").getAttribute("href"); document.querySelector("#gp-pagination-3").setAttribute("href",href.replaceAll("&start=20","&start=110")); href = document.querySelector("#gp-pagination-4").getAttribute("href"); document.querySelector("#gp-pagination-4").setAttribute("href",href.replaceAll("&start=30","&start=210")); href = document.querySelector("#gp-pagination-5").getAttribute("href"); document.querySelector("#gp-pagination-5").setAttribute("href",href.replaceAll("&start=40","&start=310")); href = document.querySelector("#gp-pagination-6").getAttribute("href"); document.querySelector("#gp-pagination-6").setAttribute("href",href.replaceAll("&start=50","&start=410")); href = document.querySelector("#gp-pagination-7").getAttribute("href"); document.querySelector("#gp-pagination-7").setAttribute("href",href.replaceAll("&start=60","&start=510")); href = document.querySelector("#gp-pagination-8").getAttribute("href"); document.querySelector("#gp-pagination-8").setAttribute("href",href.replaceAll("&start=70","&start=610")); href = document.querySelector("#gp-pagination-9").getAttribute("href"); document.querySelector("#gp-pagination-9").setAttribute("href",href.replaceAll("&start=80","&start=710")); href = document.querySelector("#gp-pagination-10").getAttribute("href"); document.querySelector("#gp-pagination-10").setAttribute("href",href.replaceAll("&start=90","&start=810")); }*/ pages.forEach(itemRoot => { let newHref; if (location == "images") { newHref = itemRoot.getAttribute("href").replaceAll("TEMP_REPLACEME",encodedSearchValue + "&udm=2"); } else if (location == "videos") { newHref = itemRoot.getAttribute("href").replaceAll("TEMP_REPLACEME",encodedSearchValue + "&udm=7"); } else if (location == "news" && document.querySelector("html").hasAttribute("news-results")) { newHref = itemRoot.getAttribute("href").replaceAll("TEMP_REPLACEME",encodedSearchValue + "&tbm=nws"); } else { newHref = itemRoot.getAttribute("href").replaceAll("TEMP_REPLACEME",encodedSearchValue); } if (document.querySelector("html").hasAttribute("basic-html") && newHref.indexOf("gbv=1") === -1) { newHref += "&gbv=1"; } itemRoot.setAttribute("href",newHref); PRcheck++; }); let newPrevHref; let newNextHref; let pageSuffix = ""; if (location == "images") { pageSuffix = "&udm=2"; } else if (location == "videos") { pageSuffix = "&udm=7"; } else if (location == "news" && document.querySelector("html").hasAttribute("news-results")) { pageSuffix = "&tbm=nws"; } if (document.querySelector("html").hasAttribute("basic-html")) { pageSuffix += "&gbv=1"; } const pageBase = "https://www.google.com/search?q=" + encodedSearchValue + pageSuffix; const pageLinks = document.querySelectorAll("#gp-page-numbers .gp-pagination"); const blockStart = Math.floor((page - 1) / 10) * 10 + 1; pageLinks.forEach(function(link, i) { const num = blockStart + i; const startAt = (num - 1) * 10; link.setAttribute("href", pageBase + (startAt ? "&start=" + startAt : "")); const label = link.querySelector("span"); if (label) { label.textContent = String(num); } link.classList.remove("active"); if (num === page) { link.classList.add("active"); } }); if (page > 1) { const prevStart = (page - 2) * 10; newPrevHref = pageBase + (prevStart ? "&start=" + prevStart : ""); } newNextHref = pageBase + "&start=" + (page * 10); if (document.querySelector("#gp-pagination-prev") && newPrevHref) { document.querySelector("#gp-pagination-prev").setAttribute("href",newPrevHref); } if (document.querySelector("#gp-pagination-next")) { document.querySelector("#gp-pagination-next").setAttribute("href",newNextHref); } if (page != 1) { document.querySelector("#gp-pagination-prev").classList.add("has-prev"); } } // Inlined favicon SVGs (no Wikimedia hotlinking / HTTP 429). Credit: StonedKhajiit // Real 1999-2008 google.com favicon (16x16 .ico, from the Wayback Machine) const UGF_FAVICON_1999 = "data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; // Real 2009 google.com favicon (16x16 .ico, lowercase blue g) const UGF_FAVICON_2009_G = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1tbUFHBwcFQAAABoAAAAaAAAAFgAAAA8AAAAWBAAAGwIAABoAAAAXAAAAGQAAABkAAAAaAAAAGg0NDRiOjo4JJiYmDwAAABQAAAATAAAADQwCAR1YFRB4nCsqua0yLMSbLCyxYxoYfBgFAiwDAQAUAAAAEgAAABMAAAAUBwcHEhQUFA0AAAAOAAAACxMEARayLy/F7T9C/640K7FuJR1pZiMgYpczMZqeLSzBIAcFPQEBABAAAAANAAAADgAAAA4XFxcJAAAACgAAAABbKSNY/1ZO/3MdHY8AAAAAAAAAAAAAAAAAAAAAjzc2lHwdG7oDAAAVAAAACAAAAAoAAAAKFxcXBgAAAAcAAAAAVj43Tfx6df87BQFmAQIAAgAAAAQAAAAEAAAAAI0vJomvLCftCwEAHQAAAAQAAAAHAAAABxEREQQAAAAEAAAAAwYEAAi4bVm0uT8/4UwOC1wnBgMlFAQAEF4YGmnwQ0X8niQfxQEAAAgAAAADAAAABAAAAAQzMzMCHh4eAh8fHwMAAAAAKSglBJVbWGfQX16qxktJsLItKNTqP0X/5DxE8VklJTsAAAAAHx8fAh8fHwIfHx8C7+/vBO3t7QTt7e0E7e3tBOrr6wIAAAAAAAAAALWHgkH+VFD/xjI226J1dDYAAAAA7e7uBO3t7QTt7e0E7e3tBP///wn///8K////Cv///wv///8Eybi3HHw1LHeySkjC/nd2/34iIZ1rbGkJ8fHxCv///wr///8K////Cv///wr///8R////E////xP///8P9OTiHtFGSNHPKS//15KSeP7k4Evgb3DOXh4cjouJiCD9/f4R////E////xP///8T////Gf///xv///8b////Dvu3rnbrNCn/o1NTk9/r6wn///8C/9fXaqskJf9kTUxX7e/vGP///xr///8b////G////yH///8k////JP///xb/0MyT00JA/5Byblv7//8d////Fv7Ix3XUNjH/hFhVee/z8x3///8j////JP///yT///8o////Lf///yz///8j//DmZNphWv+Oa2ll4urpJPHy8iLwcWDF0zEn+7edm1f///8m////LP///yz///8s////MP///zX///80////M////y77u7KoxlhZyrV/f3XSc3Oy7z83/7w5NtymioZg5OHgOf///zP///80////Nf///yv///89////Ov///zr///84////M//T0m/3oaGk/bS0uv24ubPujouw2oqIoO3j40r///83////PP///zP///8K////Mf///z7///89////Pf///z3///80////Mf///zH///8x////Mf///zX///88////Pv///zf///8SAAAAAAAAAAAAAAAAI8AAACBAAAAAAAAAEAgAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; // Real 2010-2012 google.com favicon (16x16 .ico, white g on the four-colour tile) const UGF_FAVICON_2010 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA=="; // Real late 2012 - Sep 2015 google.com favicon (.ico with 16x16 and 32x32, white g on blue) const UGF_FAVICON_2012 = "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAAAAAAAAAA9IVCSvSFQuf0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULk9IVCSvSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQuf0hUL/9IVC//SFQv/0hUL/9Y1O//rIq//+7+f//eXX//vUvf/7z7X/96Fu//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vYwv/97OH/9ZRZ//SFQv/0hUL/9IhG//zbx//3om7/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97uX/+buW//SFQv/0hUL/9IVC//SFQv/5upT/+9O6//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+b6b//zezP/0iEf/9IVC//SFQv/1klf//ezh//vPtP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/3qXr/+siq//m8lv/5wqD//vTu//3t4//1klb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0h0b//vbx//zi0//1j1H/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2nmn/+bmS/////v/4sIX/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5uJH///v5//eoef/1jU//+82y//afav/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vXw//vOs//0hUL/9IVC//ekcf/96+D/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//728v/4sIX/9IVC//SFQv/4s4n///v4//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6yKn/+byX//SFQv/0hkT//eTV//vWv//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IZE//m6lP/5u5b//OHQ///+/f/6y6//96d3//SFQv/0hUL/9IVC//SFQv/0hULm9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSfSFQub0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULm9IVCSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAASCwAAEgsAAAAAAAAAAAAA9IVCAPSFQif0hUKt9IVC8vSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvL0hUKt9IVCJ/SFQgD0hUIo9IVC7/SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULv9IVCKPSFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVC8fSFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQvP0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YtL//i2jv/828f//vLr///7+P///Pv//vTu//3n2v/6zbH/96Nw//SFQ//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ekcv/+8+z////////////+9fD/+9K5//m9mf/4to7/+buV//vSuf/++PT//OPT//aYYP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/2l13///r3/////////fv/+b2Z//SIRv/0hUL/9IVC//SFQv/0hUL/9IVC//WNT//84M///vXv//aZYf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vPtP////////////i0i//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//WQUv///Pr//OPU//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//eTV///////+9O7/9IVD//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//3m2P//////9ppi//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/718H///////3s4f/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL//vDn///////4soj/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//erff////////38//WTWP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//iziv////////////iwhf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rMsP///////eXW//WSVv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/4sYb///z7/////////Pv/9ZFV//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ixhv/+8Of//vn1//rMsP/4rH//9plh//WQUv/1j1L/+s2x//////////////////m9mf/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SGQ//2nmn/+buW//vNsv/82sb//e3j/////////////////////v/5wZ//9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/83Mj////////////++fb/+K+C//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9ZRZ/////////////vTt//aaYv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/1lFr////////////6xqf/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//ehbf/70bj//end//3o2////v3///////3l1//0iEb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/5wqD////////////96t7/96Z2//WOUP/2nWf//NvH//zcyP/1i0z/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/96l6/////////////vLr//WPUf/0hUL/9IVC//SFQv/0h0b//end//3k1f/0iUn/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/8387////////////4sYf/9IVC//SFQv/0hUL/9IVC//SFQv/6w6L///////nBn//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC///69////////vj1//SIR//0hUL/9IVC//SFQv/0hUL/9IVC//m+mv///////e3j//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL///r3///////8387/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+syw///////++fb/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/95NX///////vUvP/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/97OH///////7y6//0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//i2jv///////N/O//SFQv/0hUL/9IVC//SFQv/0hUL/96Nx////////////+s2x//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IdF//zh0P//+/j/9ZJW//SFQv/0hUL/9IVC//SKSv/96t7///////738v/1k1f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9YxN//vUvf/96+D/96Z0//WNT//3om///ebY/////////Pv/+LKI//WVW//0h0X/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//agbP/7zbL//enc//749P////////////////////////////3r4P/3p3f/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8/SFQq30hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUKt9IVCJ/SFQu/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC7/SFQif0hUIA9IVCJfSFQq30hULx9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC8fSFQq30hUIl9IVCAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB"; // Real Sep 2015 - 2024 google.com favicon (.ico with 16x16 and 32x32, four-colour G) const UGF_FAVICON_2015 = "data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD9/f2W/f392P39/fn9/f35/f391/39/ZT+/v4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Cf39/Zn///////////////////////////////////////////39/ZX///8IAAAAAAAAAAAAAAAA/v7+Cf39/cH/////+v35/7TZp/92ul3/WKs6/1iqOv9yuFn/rNWd//j79v///////f39v////wgAAAAAAAAAAP39/Zn/////7PXp/3G3WP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP+Or1j//vDo///////9/f2VAAAAAP///zD/////+vz5/3G3V/9TqDT/WKo6/6LQkf/U6cz/1urO/6rUm/+Zo0r/8IZB//adZ////v7///////7+/i79/f2Y/////4nWzf9Lqkj/Vqo4/9Xqzv///////////////////////ebY//SHRv/0hUL//NjD///////9/f2U/f392v////8sxPH/Ebzt/43RsP/////////////////////////////////4roL/9IVC//i1jf///////f391/39/fr/////Cr37/wW8+/+16/7/////////////////9IVC//SFQv/0hUL/9IVC//SFQv/3pnX///////39/fn9/f36/////wu++/8FvPv/tuz+//////////////////SFQv/0hUL/9IVC//SFQv/0hUL/96p7///////9/f35/f392/////81yfz/CrL5/2uk9v///////////////////////////////////////////////////////f392P39/Zn/////ks/7/zdS7P84Rur/0NT6///////////////////////9/f////////////////////////39/Zb+/v4y//////n5/v9WYu3/NUPq/ztJ6/+VnPT/z9L6/9HU+v+WnfT/Ul7t/+Hj/P////////////////////8wAAAAAP39/Z3/////6Or9/1hj7v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9sdvD////////////9/f2YAAAAAAAAAAD///8K/f39w//////5+f7/paz2/11p7v88Suv/Okfq/1pm7v+iqfX/+fn+///////9/f3B/v7+CQAAAAAAAAAAAAAAAP///wr9/f2d///////////////////////////////////////////9/f2Z/v7+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f2Z/f392/39/fr9/f36/f392v39/Zj///8wAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/g3+/v5X/f39mf39/cj9/f3q/f39+f39/fn9/f3q/f39yP39/Zn+/v5W////DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f2c/f399f/////////////////////////////////////////////////////9/f31/f39mv7+/iMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gn9/f2K/f39+////////////////////////////////////////////////////////////////////////////f39+v39/Yf///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4k/f390v////////////////////////////////////////////////////////////////////////////////////////////////39/dD///8iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////MP39/er//////////////////////////+r05v+v16H/gsBs/2WxSf9Wqjj/Vqk3/2OwRv99vWX/pdKV/97u2P////////////////////////////39/ej+/v4vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/iT9/f3q/////////////////////+v15/+Pxnv/VKk2/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/36+Z//d7tf///////////////////////39/ej///8iAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/f390//////////////////////E4bn/XKw+/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1apN/+x0pv///////////////////////39/dD///8IAAAAAAAAAAAAAAAAAAAAAP39/Yv/////////////////////sdij/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9TqDT/YKU1/8qOPv/5wZ////////////////////////39/YcAAAAAAAAAAAAAAAD+/v4l/f39+////////////////8Lgt/9TqDT/U6g0/1OoNP9TqDT/U6g0/1OoNP9utlT/n86N/7faqv+426v/pdKV/3u8ZP9UqDX/U6g0/3egN//jiUH/9IVC//SFQv/82MP//////////////////f39+v7+/iMAAAAAAAAAAP39/Z3////////////////q9Ob/W6w+/1OoNP9TqDT/U6g0/1OoNP9nskz/zOXC/////////////////////////////////+Dv2v+osWP/8YVC//SFQv/0hUL/9IVC//WQVP/++fb//////////////////f39mgAAAAD+/v4O/f399v///////////////4LHj/9TqDT/U6g0/1OoNP9TqDT/dblc//L58P/////////////////////////////////////////////8+v/3p3f/9IVC//SFQv/0hUL/9IVC//rIqf/////////////////9/f31////DP7+/ln////////////////f9v7/Cbz2/zOwhv9TqDT/U6g0/2KwRv/v9+z///////////////////////////////////////////////////////738//1kFT/9IVC//SFQv/0hUL/9plg///////////////////////+/v5W/f39nP///////////////4jf/f8FvPv/Bbz7/yG1s/9QqDz/vN2w//////////////////////////////////////////////////////////////////rHqP/0hUL/9IVC//SFQv/0hUL//vDn//////////////////39/Zn9/f3L////////////////R878/wW8+/8FvPv/Bbz7/y7C5P/7/fr//////////////////////////////////////////////////////////////////ere//SFQv/0hUL/9IVC//SFQv/718H//////////////////f39yP39/ez///////////////8cwvv/Bbz7/wW8+/8FvPv/WNL8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//rIqv/////////////////9/f3q/f39+v///////////////we9+/8FvPv/Bbz7/wW8+/993P3///////////////////////////////////////SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/+cGf//////////////////39/fn9/f36////////////////B737/wW8+/8FvPv/Bbz7/33c/f//////////////////////////////////////9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/6xaX//////////////////f39+f39/e3///////////////8cwvv/Bbz7/wW8+/8FvPv/WdP8///////////////////////////////////////0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//SFQv/0hUL/9IVC//vVv//////////////////9/f3q/f39y////////////////0bN/P8FvPv/Bbz7/wW8+/8hrvn/+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/cj9/f2c////////////////ht/9/wW8+/8FvPv/FZP1/zRJ6/+zuPf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39mf7+/lr////////////////d9v7/B7n7/yB38f81Q+r/NUPq/0hV7P/u8P3////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v5X////D/39/ff///////////////9tkPT/NUPq/zVD6v81Q+r/NUPq/2Fs7//y8v7////////////////////////////////////////////09f7//////////////////////////////////////////////////f399f7+/g0AAAAA/f39n////////////////+Tm/P89Suv/NUPq/zVD6v81Q+r/NUPq/1Bc7f/IzPn/////////////////////////////////x8v5/0xY7P+MlPP////////////////////////////////////////////9/f2cAAAAAAAAAAD+/v4n/f39/P///////////////7W69/81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v9ZZe7/k5v0/6609/+vtff/lJv0/1pm7v81Q+r/NUPq/zVD6v+GjvL//v7//////////////////////////////f39+/7+/iQAAAAAAAAAAAAAAAD9/f2N/////////////////////6Cn9f81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v+BivL////////////////////////////9/f2KAAAAAAAAAAAAAAAAAAAAAP7+/gv9/f3V/////////////////////7W69/8+S+v/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/P0zr/7q/+P///////////////////////f390v7+/gkAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3r/////////////////////+Xn/P94gfH/NkTq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NUPq/zVD6v81Q+r/NkTq/3Z/8f/l5/z///////////////////////39/er+/v4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/jL9/f3r///////////////////////////k5vz/nqX1/2p08P9IVez/OEbq/zdF6v9GU+z/aHLv/5qh9f/i5Pz////////////////////////////9/f3q////MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/ib9/f3V/////////////////////////////////////////////////////////////////////////////////////////////////f390v7+/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr9/f2N/f39/P///////////////////////////////////////////////////////////////////////////f39+/39/Yv+/v4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4n/f39n/39/ff//////////////////////////////////////////////////////f399v39/Z3+/v4lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/lr9/f2c/f39y/39/e39/f36/f39+v39/ez9/f3L/f39nP7+/ln+/v4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/"; function ugfFaviconForLayout() { const h = document.querySelector("html"); const era = ugfRetroEra(); // 2009/2010 eras used the multicolour tile; 1997-2008 used the blue G with coloured edges if (era === "gplex2009") { // the blue "g" of June 2008 gave way to the four-colour tile in January 2009, // so Late 2009-Early 2010 has the tile 2010-2011 uses; Late 2008-2009 keeps the "g" return h.hasAttribute("gplex2009l") ? UGF_FAVICON_2010 : UGF_FAVICON_2009_G; } if (era === "gplex2010") { return UGF_FAVICON_2010; } if (era && era !== "gplex2022") { return UGF_FAVICON_1999; } if (era === "gplex2022") { return UGF_FAVICON_2015; } const layout = h.getAttribute("layout") || ""; if (["2010", "2011", "2012"].indexOf(layout) > -1) { return UGF_FAVICON_2010; } if (["2013", "2013L", "2014", "2015", "2015L"].indexOf(layout) > -1) { return UGF_FAVICON_2012; } if (["2016", "2016C", "2016L", "2017", "2018", "2018M", "2019"].indexOf(layout) > -1) { return UGF_FAVICON_2015; } if (layout === "retro") { return UGF_FAVICON_1999; } return null; } let ugfFaviconObserver = null; function ugfFaviconType(href) { // the type goes by what the icon is: a data address says so, a file by its ending const kind = /^data:/.test(href) ? (href.match(/^data:([^;,]+)/) || [])[1] : ((href.split(/[?#]/)[0].match(/\.(ico|png|gif|svg)$/i) || [])[1] || "").toLowerCase(); return { "image/x-icon": "image/x-icon", "image/vnd.microsoft.icon": "image/x-icon", "image/png": "image/png", "image/gif": "image/gif", ico: "image/x-icon", png: "image/png", gif: "image/gif" }[kind] || "image/svg+xml"; } // Is ours the only tab icon, with the right picture, in the head? Ours is a pair of // links to the same picture, one marked 16x16 and one 32x32: Firefox takes an icon // marked with the size it wants over an unmarked one, so Google's own sized icons // (News, Translate) would beat a plain link function ugfFaviconOk(href) { const head = document.head; const ours = document.querySelectorAll("link.ugf-favicon"); if (!head || ours.length !== 2) { return false; } for (let i = 0; i < ours.length; i++) { if (ours[i].parentElement !== head || ours[i].getAttribute("href") !== href) { return false; } } const icons = document.querySelectorAll("link[rel*='icon' i]"); return icons.length === 2 && ugfIsOurFavicon(icons[0]) && ugfIsOurFavicon(icons[1]); } function ugfIsOurFavicon(el) { return !!(el && el.classList && el.classList.contains("ugf-favicon")); } // force: put ours in again even when it is already there, so Firefox, which only // chooses again among icon links added since it last chose, sees ours alone function ugfApplyFavicon(href, force) { if (!force && ugfFaviconOk(href)) { return; } document.querySelectorAll("link[rel*='icon' i]").forEach(function(el) { if (!ugfIsOurFavicon(el) && el.parentElement) { el.parentElement.removeChild(el); } }); // New links each time: Firefox keeps showing the last icon a page gave it, // even once that link is gone, until an icon link is added again document.querySelectorAll("link.ugf-favicon").forEach(function(el) { if (el.parentElement) { el.parentElement.removeChild(el); } }); ["16x16", "32x32"].forEach(function(size, i) { const link = document.createElement("link"); link.id = i ? "ugf-favicon-32" : "ugf-favicon"; link.className = "ugf-favicon"; link.setAttribute("rel", "icon"); link.setAttribute("type", ugfFaviconType(href)); link.setAttribute("sizes", size); link.setAttribute("href", href); (document.head || document.documentElement).appendChild(link); }); } // Keep ours for as long as the page is open: Google's apps swap their own icon in // now and then (a new day, a notification), from anywhere in the page function ugfKeepFavicon(getHref) { ugfKeepFavicon.get = getHref; if (ugfKeepFavicon.on) { return; } ugfKeepFavicon.on = true; const check = function() { const href = ugfKeepFavicon.get(); if (href && !ugfFaviconOk(href)) { ugfApplyFavicon(href); } }; const mo = new MutationObserver(check); const watch = function() { mo.disconnect(); mo.observe(document.documentElement, { childList: true }); if (document.head) { mo.observe(document.head, { childList: true, subtree: true, attributes: true, attributeFilter: ["href", "rel"] }); } }; watch(); // Firefox gathers every icon link a page adds while it loads into one batch and // picks the best-sized one from it - Google's, even after we have taken them out // of the page. Adding ours again once that batch is done leaves it the only one. const again = function() { const href = ugfKeepFavicon.get(); if (href) { ugfApplyFavicon(href, true); } }; [300, 1500, 4000].forEach(function(ms) { setTimeout(again, ms); }); if (document.readyState !== "complete") { window.addEventListener("load", function() { setTimeout(again, 250); }); } window.addEventListener("pageshow", function() { setTimeout(again, 250); }); setInterval(function() { if (document.head && !ugfKeepFavicon.headSeen) { ugfKeepFavicon.headSeen = true; watch(); } check(); }, 2000); } function ugfSetFavicon() { if (document.querySelector("html").hasAttribute("disabled")) { return; } const href = ugfFaviconForLayout(); if (!href) { return; } ugfApplyFavicon(href); if (ugfFaviconObserver) { ugfFaviconObserver.disconnect(); } // Google re-inserts its own favicon link after we run, so hold ours in place ugfFaviconObserver = new MutationObserver(function(muts) { for (let i = 0; i < muts.length; i++) { const added = muts[i].addedNodes; for (let j = 0; j < added.length; j++) { const n = added[j]; if (n.nodeType === 1 && n.tagName === "LINK" && (n.getAttribute("rel") || "").indexOf("icon") > -1 && !ugfIsOurFavicon(n)) { ugfApplyFavicon(href); return; } } } }); ugfFaviconObserver.observe(document.head || document.documentElement, { childList: true, subtree: true }); ugfKeepFavicon(function() { return document.documentElement.hasAttribute("disabled") ? null : href; }); let ticks = 0; const iv = setInterval(function() { ugfApplyFavicon(href); if (++ticks > 20) { clearInterval(iv); } }, 500); } function ugfSetEraLayout(storeKey, baseLayout, attr) { const h = document.querySelector("html"); ["gplex1997", "gplex1998", "gplex1999", "gplex2000", "gplex2001", "gplex2002", "gplex2003", "gplex2005", "gplex2006", "gplex2007", "gplex2009", "gplex2009l", "gplex2010", "gplex2022"].forEach(function(a) { h.removeAttribute(a); }); h.setAttribute("layout", baseLayout); if (attr) { h.setAttribute(attr, ""); } ugfSaveLayout(storeKey); ugfSetFavicon(); if (attr && attr !== "gplex2022") { h.setAttribute("legacy-gbar", ""); h.setAttribute("legacy-images", ""); h.setAttribute("legacy-footer", ""); } } function setLayout() { if (searchValue == null) { searchValue = ""; } if ( searchValue.includes("SO RETRO") ) { document.querySelector("html").setAttribute("layout","retro"); checkProperty("legacy-neuro",true); } if ( searchValue.toLowerCase()=="google in 2019" ) { document.querySelector("html").setAttribute("layout","2019"); ugfSaveLayout("2019"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); } if ( searchValue.toLowerCase()=="google in 1997" ) { ugfSetEraLayout("1997", "2010", "gplex1997"); } if ( searchValue.toLowerCase()=="google in 1998" ) { ugfSetEraLayout("1998", "2010", "gplex1998"); } if ( searchValue.toLowerCase()=="google in 1999" ) { ugfSetEraLayout("1999", "2010", "gplex1999"); } if ( searchValue.toLowerCase()=="google in 2000" ) { ugfSetEraLayout("2000", "2010", "gplex2000"); } if ( searchValue.toLowerCase()=="google in 2001" ) { ugfSetEraLayout("2001", "2010", "gplex2001"); } if ( searchValue.toLowerCase()=="google in 2002" ) { ugfSetEraLayout("2002", "2010", "gplex2002"); } if ( searchValue.toLowerCase()=="google in 2003" ) { ugfSetEraLayout("2003", "2010", "gplex2003"); } if ( searchValue.toLowerCase()=="google in 2004"|| searchValue.toLowerCase()=="google in 2005" ) { ugfSetEraLayout("2005", "2010", "gplex2005"); } if ( searchValue.toLowerCase()=="google in 2006" ) { ugfSetEraLayout("2006", "2010", "gplex2006"); } if ( searchValue.toLowerCase()=="google in 2007"|| searchValue.toLowerCase()=="google in 2008" ) { ugfSetEraLayout("2007", "2010", "gplex2007"); } if ( searchValue.toLowerCase()=="google in 2009" ) { ugfSetEraLayout("2009", "2010", "gplex2009"); } if ( searchValue.toLowerCase()=="google in 2010" ) { ugfSetEraLayout("2010N", "2012", "gplex2010"); } if ( searchValue.toLowerCase()=="google in 2020"|| searchValue.toLowerCase()=="google in 2021" ) { ugfSetEraLayout("2019", "2019", null); } if ( searchValue.toLowerCase()=="google in 2022"|| searchValue.toLowerCase()=="google in 2023"|| searchValue.toLowerCase()=="google in 2024" ) { ugfSetEraLayout("2022", "2019", "gplex2022"); } if ( searchValue.toLowerCase()=="google in 2017"|| searchValue.toLowerCase()=="google in 2018" ) { document.querySelector("html").setAttribute("layout","2018"); ugfSaveLayout("2018"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); } if ( searchValue.toLowerCase()=="google in 2018m"|| searchValue.toLowerCase()=="google in 2017m" ) { document.querySelector("html").setAttribute("layout","2018M"); ugfSaveLayout("2018M"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); } if ( searchValue.toLowerCase()=="google in 2016" ) { document.querySelector("html").setAttribute("layout","2016"); ugfSaveLayout("2016"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); //document.querySelector("html").setAttribute("fake-spa",""); } if ( searchValue.toLowerCase()=="google in 2016c" ) { document.querySelector("html").setAttribute("layout","2016C"); ugfSaveLayout("2016C"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); } if ( searchValue.toLowerCase()=="google in 2016l" ) { document.querySelector("html").setAttribute("layout","2016L"); ugfSaveLayout("2016L"); setTimeout(function() { checkProperty("legacy-gbar",true); checkProperty("legacy-footer",true); checkProperty("legacy-neuro",true); }, 1000); } if ( searchValue.toLowerCase()=="google in 2015" ) { document.querySelector("html").setAttribute("layout","2015"); ugfSaveLayout("2015"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); //document.querySelector("html").setAttribute("fake-spa",""); } if ( searchValue.toLowerCase()=="google in 2015l" ) { document.querySelector("html").setAttribute("layout","2015L"); ugfSaveLayout("2015L"); setTimeout(function() { checkProperty("legacy-gbar",true); checkProperty("legacy-footer",true); checkProperty("legacy-neuro",true); }, 1000); } if ( searchValue.toLowerCase()=="google in 2014" ) { document.querySelector("html").setAttribute("layout","2014"); ugfSaveLayout("2014"); setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",false); checkProperty("legacy-neuro",false); }, 1000); //document.querySelector("html").setAttribute("fake-spa",""); } if ( searchValue.toLowerCase()=="google in 2013" ) { document.querySelector("html").setAttribute("layout","2013"); ugfSaveLayout("2013"); // timeouts are bad. fix this later. setTimeout(function() { checkProperty("legacy-gbar",false); checkProperty("legacy-footer",true); checkProperty("legacy-neuro",false); }, 1000); //document.querySelector("html").setAttribute("fake-spa",""); } if ( searchValue.toLowerCase()=="google in 2013l" ) { document.querySelector("html").setAttribute("layout","2013L"); ugfSaveLayout("2013L"); setTimeout(function() { checkProperty("legacy-gbar",true); checkProperty("legacy-footer",true); checkProperty("legacy-neuro",true); }, 1000); } if ( searchValue.toLowerCase()=="google in 2012"|| searchValue.toLowerCase()=="google in 2011" ) { document.querySelector("html").setAttribute("layout","2012"); ugfSaveLayout("2012"); setTimeout(function() { checkProperty("legacy-gbar",true); checkProperty("legacy-footer",true); checkProperty("legacy-neuro",false); }, 1000); } /*if ( searchValue == "Google in 2011" || searchValue == "google in 2011" ) { document.querySelector("html").setAttribute("layout","2011"); ugfSaveLayout("2011"); } if ( searchValue == "Google in 2010" || searchValue == "google in 2010" ) { document.querySelector("html").setAttribute("layout","2010"); ugfSaveLayout("2010"); }*/ } function checkProperty(property, shouldHave) { if (document.querySelector("[" + property + "]")) { if (shouldHave == false) { document.querySelector("html").removeAttribute(property); } } else if (shouldHave == true) { document.querySelector("html").setAttribute(property,""); } } function bringForthJustice() { let xValue = searchValue.replaceAll("twitter","x"); let safeXValue = searchValue.replaceAll("twitter","x"); xValue = xValue.replaceAll("Twitter","X"); safeXValue = safeXValue.replaceAll("Twitter","X"); xValue = xValue.replaceAll("TWITTER","𝕏"); safeXValue = safeXValue.replaceAll("TWITTER","𝕏"); let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-correction"); newElem.classList.add("ugf-easter-egg"); newElem.innerHTML = ugfTT(`
Did you mean: ${xValue}
`); container.insertBefore(newElem, container.children[0]); } function createCorrection(value) { let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-correction"); newElem.innerHTML = ugfTT(`
${value}
`); container.insertBefore(newElem, container.children[0]); } function createCorrection1l(value) { let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-correction"); newElem.innerHTML = ugfTT(`
Did you mean: ${value}
`); container.insertBefore(newElem, container.children[0]); } function createCorrection2(value) { let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-correction-blue"); newElem.innerHTML = ugfTT(`
${value}
Search instead for "${searchValue}"
`); container.insertBefore(newElem, container.children[0]); } function createCorrection2l(value) { let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-correction-blue"); newElem.innerHTML = ugfTT(`
Showing results for ${value}
Search instead for "${insteadLink}"
`); container.insertBefore(newElem, container.children[0]); } // ---- (6.5) "People also ask" (from 2015): the questions Google lists, in the period's box, // placed after the result they followed on Google's page. Opening one opens Google's own // (hidden) copy, which fetches the answer; Gplex shows it the way the period did - the // quoted passage, its page, and "Search for" the question. Google now often answers with // AI instead: Gplex never shows that, only the "Search for" link. function ugfPaaEra() { const l = String(layout || ""); if (["2016", "2016C", "2016L"].indexOf(l) > -1) { return "p16"; } if (l === "2018" || l === "2018M") { return "p18"; } if (l === "2019" || l === "2022") { return "p19"; } return null; } // Google's answer is AI written: the AI Overview / AI Mode block, or its words function ugfPaaIsAi(el) { if (!el) { return false; } if (el.querySelector('[data-subtree="aimc"], [data-mcpr], .bzXtMb, [data-scope-id="turn"]')) { return true; } const t = String(el.textContent || ""); return /\bAI Mode\b|AI Mode replied|\bAI Overview\b/.test(t) || ugfNeuroNames().some(function(n) { return t.indexOf(n) > -1; }); } // what Google's copy of a question holds once opened: a classic answer, AI, nothing yet or an error function ugfPaaReadAnswer(pair) { const box = pair.querySelector(".bCOlv") || pair.querySelector("[jsname='NRdf4c']"); if (!box) { return { state: "wait" }; } const text = String(box.textContent || "").replace(/\s+/g, " ").trim(); if (ugfPaaIsAi(box)) { return { state: "ai" }; } if (/^An error has occurred/i.test(text)) { return { state: "error" }; } let link = null; box.querySelectorAll("a[href]").forEach(function(a) { if (!link && a.querySelector("h3") && /^https?:/.test(a.getAttribute("href") || "")) { link = a; } }); if (!link || text.length < 40) { return { state: "wait" }; } // the passage: Google's answer block, else the longest run of text outside the link let snip = box.querySelector('[data-attrid="wa:/description"], .hgKElc, .LGOjhe, [data-tts="answers"]'); if (!snip) { let best = null; let bestLen = 0; box.querySelectorAll("div, span").forEach(function(e) { if (link.contains(e) || e.contains(link) || e.querySelector("div")) { return; } const n = String(e.textContent || "").trim().length; if (n > bestLen) { best = e; bestLen = n; } }); snip = best; } const h3 = link.querySelector("h3"); return { state: "ok", snippet: snip ? String(snip.textContent || "").replace(/\s+/g, " ").trim() : "", title: h3 ? String(h3.textContent || "").trim() : "", href: link.getAttribute("href") }; } function ugfPaaCss(era) { const q = era === "p19" ? "#202124" : "#222"; const line = era === "p19" ? "#dadce0" : "#ebebeb"; const sub = era === "p19" ? "#4d5156" : "#545454"; const url = era === "p19" ? "#202124" : "#006621"; return "#ugf-paa { clear: both; margin: 22px 0 8px; max-width: 600px; font-family: arial, sans-serif; }" + "#ugf-paa .h { font-size: " + (era === "p19" ? "20px" : "18px") + "; color: " + q + "; margin: 0 0 10px; line-height: 1.3; }" + "#ugf-paa .r { border-top: 1px solid " + line + "; } #ugf-paa .r:last-child { border-bottom: 1px solid " + line + "; }" + "#ugf-paa .q { position: relative; display: block; padding: " + (era === "p16" ? "11px" : "13px") + " 36px " + (era === "p16" ? "11px" : "13px") + " 0; font-size: 16px; line-height: 1.375; color: " + q + "; cursor: pointer; user-select: none; }" + // the chevron, drawn as the period's thin down-arrow (a CSS shape) "#ugf-paa .q::after { content: ''; position: absolute; right: 10px; top: 50%; width: 7px; height: 7px; margin-top: -6px; border: solid " + (era === "p19" ? "#70757a" : "#777") + "; border-width: 0 2px 2px 0; transform: rotate(45deg); transition: transform .2s, margin-top .2s; }" + "#ugf-paa .r.open .q::after { transform: rotate(-135deg); margin-top: -2px; }" + "#ugf-paa .a { display: none; padding: 0 0 16px; font-size: 13px; line-height: 1.54; color: " + sub + "; }" + "#ugf-paa .r.open .a { display: block; }" + "#ugf-paa .a .snip { margin: 0 0 10px; }" + "#ugf-paa .a .t { display: block; font-size: 18px; line-height: 1.33; color: #1a0dab; text-decoration: none; }" + "#ugf-paa .a .t:hover { text-decoration: underline; }" + "#ugf-paa .a .u { display: block; font-size: 14px; color: " + url + "; margin: 1px 0 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }" + "#ugf-paa .a .sf { display: block; font-size: 13px; color: " + sub + "; }" + "#ugf-paa .a .sf a { color: #1a0dab; text-decoration: none; } #ugf-paa .a .sf a:hover { text-decoration: underline; }" + "#ugf-paa .a .wait { color: #777; }"; } // A 2015 answer was a passage quoted from a web page. Where Google now writes its own (AI) // answer instead, the question is searched with Google's plain "Web" results (udm=14, which // carry no AI) and the top result's passage, page and address are shown, as the answer was. function ugfPaaAnswerFromWeb(q, done) { ugfPaaAnswerFromWeb.cache = ugfPaaAnswerFromWeb.cache || {}; if (ugfPaaAnswerFromWeb.cache[q]) { done(ugfPaaAnswerFromWeb.cache[q]); return; } let hl = ""; try { hl = "&hl=" + encodeURIComponent(UGF_LANG_HL || "en"); } catch (e) {} fetch("https://www.google.com/search?q=" + encodeURIComponent(q) + "&udm=14" + hl, { credentials: "same-origin" }).then(function(r) { return r.ok ? r.text() : ""; }).then(function(t) { if (!t) { done(null); return; } const doc = new DOMParser().parseFromString(ugfTT(t), "text/html"); // the first ordinary result that has Google's own snippet under it let top = null; doc.querySelectorAll("#rso h3, #search h3").forEach(function(h) { if (top) { return; } const a = h.closest("a[href]"); if (!a || h.closest(".related-question-pair, [data-attrid], .EyBRub")) { return; } let href = a.getAttribute("href") || ""; if (href.indexOf("/url?") === 0) { try { href = new URLSearchParams(href.split("?")[1]).get("q") || href; } catch (e) {} } if (!/^https?:/.test(href) || /\/\/(www\.)?google\.[a-z.]+\//.test(href)) { return; } const block = h.closest(".MjjYud, div.g, [data-hveid][data-ved]") || a.parentElement; const sn = block && block.querySelector('.VwiC3b, [data-sncf="1"], [data-sncf="2"], [style*="-webkit-line-clamp"]'); const text = sn ? String(sn.textContent || "").replace(/\s+/g, " ").trim() : ""; if (text.length > 40) { top = { title: String(h.textContent || "").trim(), href: href, desc: text }; } }); const got = top ? { state: "ok", snippet: top.desc, title: top.title, href: top.href } : null; if (got) { ugfPaaAnswerFromWeb.cache[q] = got; } done(got); }).catch(function() { done(null); }); } function ugfPaaBuild() { const era = ugfPaaEra(); if (!era || document.getElementById("ugf-paa")) { return; } const pairs = Array.prototype.filter.call(document.querySelectorAll(".related-question-pair[data-q]"), function(p) { return !ugfNeuroMine(p); }); if (!pairs.length) { return; } const container = document.querySelector("#ugf-search-results-container"); if (!container || !container.children.length) { // the results are still being drawn: come back once they are ugfPaaBuild.tries = (ugfPaaBuild.tries || 0) + 1; if (ugfPaaBuild.tries < 40) { setTimeout(ugfPaaBuild, 250); } return; } // where it stood on Google's page: after however many results came before it const first = pairs[0]; let before = 0; document.querySelectorAll("#rso h3, #search h3").forEach(function(h) { if (!ugfNeuroMine(h) && !first.contains(h) && !h.closest(".related-question-pair, .EyBRub, [data-attrid]") && (first.compareDocumentPosition(h) & Node.DOCUMENT_POSITION_PRECEDING) && h.closest("a[href]")) { before++; } }); before = Math.max(1, Math.min(before, container.children.length)); if (!document.getElementById("ugf-paa-css")) { const st = document.createElement("style"); st.id = "ugf-paa-css"; st.textContent = ugfPaaCss(era); (document.head || document.documentElement).appendChild(st); } const box = document.createElement("div"); box.id = "ugf-paa"; const head = document.createElement("div"); head.className = "h"; head.textContent = "People also ask"; box.appendChild(head); const list = document.createElement("div"); box.appendChild(list); const seen = {}; const addRow = function(pair) { const q = String(pair.getAttribute("data-q") || "").trim(); if (!q || seen[q]) { return; } seen[q] = true; const row = document.createElement("div"); row.className = "r"; const qa = document.createElement("div"); qa.className = "q"; qa.setAttribute("role", "button"); qa.setAttribute("tabindex", "0"); qa.textContent = q; const ans = document.createElement("div"); ans.className = "a"; row.appendChild(qa); row.appendChild(ans); list.appendChild(row); const searchFor = function() { const p = document.createElement("div"); p.className = "sf"; p.appendChild(document.createTextNode("Search for: ")); const a = document.createElement("a"); a.href = "https://www.google.com/search?q=" + encodeURIComponent(q); a.textContent = q; p.appendChild(a); return p; }; const show = function(got) { ans.textContent = ""; if (got.state === "ok") { if (got.snippet) { const s = document.createElement("div"); s.className = "snip"; s.textContent = got.snippet; ans.appendChild(s); } const t = document.createElement("a"); t.className = "t"; t.href = got.href; t.textContent = got.title || got.href; ans.appendChild(t); const u = document.createElement("div"); u.className = "u"; u.textContent = got.href; ans.appendChild(u); } else if (got.state === "wait") { const w = document.createElement("div"); w.className = "wait snip"; w.textContent = "Loading..."; ans.appendChild(w); } // (AI answers and errors: only the way on to a search for the question) ans.appendChild(searchFor()); }; let asked = false; const more = function() { // Google adds more questions below the one opened: so does Gplex document.querySelectorAll(".related-question-pair[data-q]").forEach(function(p) { if (!ugfNeuroMine(p)) { addRow(p); } }); }; const toggle = function() { const open = !row.classList.contains("open"); row.classList.toggle("open", open); if (!open || asked) { return; } asked = true; let done = false; const finish = function(got) { if (!done) { done = true; show(got); } }; let got = ugfPaaReadAnswer(pair); if (got.state === "ok") { finish(got); return; } show({ state: "wait" }); // open Google's own copy (it fetches its answer, and adds more questions) const btn = pair.querySelector('[role="button"][aria-expanded]'); if (btn && btn.getAttribute("aria-expanded") !== "true") { try { btn.click(); } catch (e) {} } let fell = false; const fallback = function() { if (fell || done) { return; } fell = true; ugfPaaAnswerFromWeb(q, function(r) { finish(r || { state: "none" }); }); }; const t0 = Date.now(); const iv = setInterval(function() { got = ugfPaaReadAnswer(pair); if (got.state === "ok") { clearInterval(iv); finish(got); more(); } else if (got.state !== "wait" || Date.now() - t0 > 3000) { // an AI answer, an error, or nothing yet: the page the answer would have come from fallback(); if (Date.now() - t0 > 8000 || got.state !== "wait") { clearInterval(iv); more(); } } }, 400); }; qa.addEventListener("click", toggle); qa.addEventListener("keydown", function(ev) { if (ev.key === "Enter" || ev.key === " ") { ev.preventDefault(); toggle(); } }); }; pairs.forEach(addRow); // inside the result it follows (so the results list keeps its own numbering) container.children[before - 1].appendChild(box); } function createSidebar() { let container = document.querySelector("#ugf-right-inner"); let newElem = document.createElement("div"); newElem.id = "ugf-side-info-container"; newElem.innerHTML = ugfTT(`
${SB.title}
${SB.sub}
${SB.desc}
${SB.kc1} ${SB.kc2} ${SB.kc3} ${SB.kc4} ${SB.kc5} ${SB.kc6} ${SB.kc7} ${SB.kc8} ${SB.kc9} ${SB.kc10} ${SB.kc11} ${SB.kc12}
`); container.insertBefore(newElem, container.children[0]); } let ugfPredictionIndex = -1; let ugfTypedSearchValue = ""; let searchPredictsAPI = []; function fetchPredicts(value) { fetch("https://www.google.com/complete/search?q=" + encodeURIComponent(value) + "&cp=" + encodeURIComponent(value) + "&client=gws-wiz&xssi=t&gs_pcrt=undefined&hl=" + encodeURIComponent(UGF_LANG_HL) + "&authuser=0&dpr=1", { method: "GET" }).then(response => { if (!response.ok) throw new Error("Prediction network response not ok"); return response.text(); }).then(data => { var cutString1 = data.split(")]}'"); var used = cutString1[1]; data = JSON.parse(used); var list = data[0]; parsePredicts(list); }).catch(() => {}); } function parsePredicts(list) { //API searchPredictsAPI = []; let itemNo = 0; list.forEach(itemRoot => { let text = itemRoot[0]; searchPredictsAPI.push({searchPrediction: { content: text, itemNo: itemNo }}); itemNo++; }); createPredicts(searchPredictsAPI); } function createPredicts(SPAPI) { if (document.querySelector("#ugf-search-predictions")) { document.querySelector("#ugf-search-predictions").remove(); } let container = document.querySelector("#ugf-search-predictions-container"); let newElem = document.createElement("div"); newElem.id = "ugf-search-predictions"; newElem.innerHTML = ugfTT(`
`); container.insertBefore(newElem, container.children[0]); document.querySelector("#ugf-search-predictions-fence").addEventListener("click", function() { document.querySelector("html").removeAttribute("search-focus"); }); SPAPI.forEach(itemRoot => { createPrediction(itemRoot.searchPrediction); }); } function createPrediction(item) { let container = document.querySelector("#ugf-search-predictions-inner"); let newElem = document.createElement("a"); newElem.classList.add("ugf-search-prediction"); newElem.innerHTML = ugfTT(`
${item.content}
`); container.insertBefore(newElem, container.children[item.itemNo]); let a = newElem.textContent; let encodedVal = encodeURIComponent(a.trim()); if (location == "images" || ugfHomeVertical == "images") { newElem.setAttribute("href","https://www.google.com/search?q=" + encodedVal + "&udm=2"); } else if (location == "videos" || ugfHomeVertical == "videos") { newElem.setAttribute("href","https://www.google.com/search?q=" + encodedVal + "&udm=7"); } else { newElem.setAttribute("href","https://www.google.com/search?q=" + encodedVal); } newElem.addEventListener("mouseenter", function() { const allItems = document.querySelectorAll("#ugf-search-predictions-inner .ugf-search-prediction"); allItems.forEach(function(el, idx) { if (el === newElem) { el.classList.add("ugf-prediction-selected"); ugfPredictionIndex = idx; } else { el.classList.remove("ugf-prediction-selected"); } }); }); /*newElem.addEventListener("click", function() { var value = newElem.textContent; if (location == "images") { window.location = "https://www.google.com/search?q=" + value + "&udm=2"; } else { window.location = "https://www.google.com/search?q=" + value; } });*/ } function ugfEsc(t) { return String(t == null ? "" : t).replace(/&/g,"&").replace(/"/g,""").replace(//g,">"); } // Keyboard navigation and lifecycle management for image viewer let ugfActiveImageViewerCard = null; function ugfCloseImageViewer() { let container = document.querySelector("#ugf-image-viewer"); if (container) container.innerHTML = ugfTT(""); window.removeEventListener("keydown", ugfOnImageViewerKeyDown); if (ugfActiveImageViewerCard && typeof ugfActiveImageViewerCard.focus === "function") { try { ugfActiveImageViewerCard.focus(); } catch (e) {} } ugfActiveImageViewerCard = null; } function ugfOnImageViewerKeyDown(e) { if (e.target && (['INPUT', 'TEXTAREA'].includes(e.target.tagName) || e.target.isContentEditable)) { return; } let container = document.querySelector("#ugf-image-viewer"); if (!container || !container.querySelector("#ugf-image-viewer-inner")) { window.removeEventListener("keydown", ugfOnImageViewerKeyDown); ugfActiveImageViewerCard = null; return; } if (e.key === "Escape") { e.preventDefault(); ugfCloseImageViewer(); return; } if (e.key === "ArrowRight") { e.preventDefault(); if (ugfActiveImageViewerCard) { let next = ugfActiveImageViewerCard.nextElementSibling; while (next && !next.classList.contains("ugf-image-result")) { next = next.nextElementSibling; } if (next) { doImageViewer(next); if (typeof next.scrollIntoView === "function") { try { next.scrollIntoView({ block: "nearest", inline: "nearest" }); } catch (err) {} } } } return; } if (e.key === "ArrowLeft") { e.preventDefault(); if (ugfActiveImageViewerCard) { let prev = ugfActiveImageViewerCard.previousElementSibling; while (prev && !prev.classList.contains("ugf-image-result")) { prev = prev.previousElementSibling; } if (prev) { doImageViewer(prev); if (typeof prev.scrollIntoView === "function") { try { prev.scrollIntoView({ block: "nearest", inline: "nearest" }); } catch (err) {} } } } return; } } function doImageViewer(item) { ugfActiveImageViewerCard = item; window.removeEventListener("keydown", ugfOnImageViewerKeyDown); window.addEventListener("keydown", ugfOnImageViewerKeyDown); let container = document.querySelector("#ugf-image-viewer"); container.innerHTML = ugfTT(``); let src = ugfEsc(item.getAttribute("img-src") || (item.querySelector("img") ? item.querySelector("img").getAttribute("src") : "")); let docid = item.getAttribute("img-docid") || ""; let bigSrc = item.getAttribute("img-big-src") || ""; let origW = item.getAttribute("img-orig-w") || ""; let origH = item.getAttribute("img-orig-h") || ""; // On-demand lookup fallback if not pre-cached on DOM attribute if (!bigSrc && docid) { let origData = ugfGetOriginalImage(docid); if (origData) { bigSrc = origData.origUrl || ""; origW = origData.origWidth || ""; origH = origData.origHeight || ""; item.setAttribute("img-big-src", bigSrc); if (origW) item.setAttribute("img-orig-w", origW); if (origH) item.setAttribute("img-orig-h", origH); } } let link = ugfEsc(item.getAttribute("img-link") || item.getAttribute("iframe-url") || ""); let title = ugfEsc(item.getAttribute("img-title") || ""); let domain = ugfEsc(item.getAttribute("img-domain") || ""); let w = ugfEsc(item.getAttribute("img-w") || ""); let h = ugfEsc(item.getAttribute("img-h") || ""); // View image button ALWAYS links to the original image URL (not subject to blacklist) let viewImageHref = ugfEsc(bigSrc || src); let newElem = document.createElement("div"); newElem.id = "ugf-image-viewer-inner"; newElem.innerHTML = ugfTT(`
✕
${title}
${domain}
${w} × ${h}
`); container.insertBefore(newElem, container.children[0]); // Progressive loader for large original image: strictly on-demand upon click // Blacklist check applies strictly to the inline preview image (excludes lookaside.*.com, tiktok.com, etc.) if (bigSrc && bigSrc !== src && !ugfIsExcludedOriginalImageHost(bigSrc)) { let viewerImg = newElem.querySelector("#ugf-image-viewer-image img"); let sizeDiv = newElem.querySelector("#ugf-image-viewer-size"); let preloader = new Image(); preloader.referrerPolicy = "no-referrer"; preloader.onload = function() { if (viewerImg && newElem.isConnected) { viewerImg.src = bigSrc; let actualW = origW || preloader.naturalWidth; let actualH = origH || preloader.naturalHeight; if (sizeDiv && actualW && actualH) { sizeDiv.textContent = `${actualW} × ${actualH}`; sizeDiv.removeAttribute("title"); } } }; preloader.onerror = function() { // Keep the reliable Google cached thumbnail on network/hotlink failure }; preloader.src = bigSrc; } let closeBtn = document.querySelector("#ugf-image-viewer-close"); if (closeBtn) { closeBtn.addEventListener("click", ugfCloseImageViewer); } } function createTop() { let container = document.querySelector("#ugf-top-container"); let newElem = document.createElement("div"); newElem.id = "ugf-top-container-inner"; newElem.innerHTML = trusted_policy.createHTML(topHTML); container.insertBefore(newElem, container.children[0]); document.querySelector("#gp-gbar-more").addEventListener("click", function() { document.querySelector("html").setAttribute("gbar-dd-open",""); }); document.querySelector("#gp-gbar-dd-fence").addEventListener("click", function() { document.querySelector("html").removeAttribute("gbar-dd-open"); }); if (location == "home") { document.querySelector("#ugf-top #ugf-search").remove(); document.querySelector("#ugf-search-btn-2").addEventListener("click", function() { document.querySelector("#ugf-search-btn").click(); }); document.querySelector("#ugf-lucky-btn").addEventListener("click", function() { var value = document.querySelector("#ugf-search-value").value; value = value.replaceAll("(","%28"); value = value.replaceAll(")","%29"); value = value.replaceAll("+","%2B"); value = value.replaceAll("-","%2D"); value = value.replaceAll("/","%2F"); window.location = "https://www.google.com/search?q=" + value + "&btnI=I%27m+Feeling+Lucky&iflsig=ANes7DEAAAAAZhR3OR8bkupN1D63NUfgJj5erQigfDUN"; }); } // (6.5.5) Google's lightweight pages (old browsers) have no account button to read: use the account // Gplex saw elsewhere (google.com, Gmail) and kept, until signing out if (document.querySelector("html").hasAttribute("basic-html") || location == "home") { setTimeout(function() { const h = document.querySelector("html"); // (their own "Sign in" link shows even when signed in, so only a real account button counts) if (canGo == false || h.getAttribute("logged-in") === "true" || document.querySelector("[href^='https://accounts.google.com/SignOutOptions']")) { return; } if (location == "home" && !h.hasAttribute("legacy-lite-home") && !document.querySelector("body > center")) { return; // today's home page has its own account button } let kName = "", kMail = "", kPfp = ""; try { kName = String(GM_getValue("UGF_USERNAME", "") || ""); kMail = String(GM_getValue("UGF_EMAIL", "") || ""); kPfp = String(GM_getValue("UGF_PFP", "") || ""); } catch (e) {} if (!kName || !kMail) { return; } loggedIn = true; h.setAttribute("logged-in", "true"); const first = kName.split(" ")[0]; const small = kPfp.replace(/=s\d+(-[a-z-]*)?$/, "=s32-c").replace(/\/s\d+(-c)?\//, "/s32-c/"); const big = kPfp.replace(/=s\d+(-[a-z-]*)?$/, "=s96-c").replace(/\/s\d+(-c)?\//, "/s96-c/"); [["#gp-gbar-account span", first], ["#gp-gbar-email span", kMail], ["#ugf-account-username span", kName], ["#ugf-account-email span", kMail], ["#ugf-username-button span", "+" + first], ["#ugf-email-button span", kMail], ["#gp-gbar-plusyou span", "+" + first]].forEach(function(x) { const el = document.querySelector(x[0]); if (el) { el.textContent = x[1]; } }); if (kPfp) { [["#ugf-account-button img", small], ["#ugf-account-pfp img", big], ["#ugf-account-normal-pfp img", big]].forEach(function(x) { const el = document.querySelector(x[0]); if (el) { el.src = x[1]; } }); } }, 2500); } // (6.5.7) the page numbers and tabs are filled in once the account is known; pages with no // account links at all (Google's lightweight pages) fill them in after a moment anyway, or // they kept their "TEMP_REPLACEME" placeholder and paging searched for that setTimeout(function() { if (canGo != false && !fixPagination.done) { fixPagination(); } }, 3000); var elm = "[href^='https://accounts.google.com/S']"; waitForElement10(elm).then(function(elm) { if (canGo != false) { if (document.querySelector("[href^='https://accounts.google.com/ServiceLogin']")) { loggedIn = false; document.querySelector("html").setAttribute("logged-in","false"); } if (document.querySelector("[href^='https://accounts.google.com/SignOutOptions']")) { loggedIn = true; document.querySelector("html").setAttribute("logged-in","true"); pfp = document.querySelector("[href^='https://accounts.google.com/SignOutOptions'] img").getAttribute("src"); pfp96 = pfp.replace("s32","s96"); let cutIt = document.querySelector("[href^='https://accounts.google.com/SignOutOptions']").getAttribute("aria-label").split(": "); cutIt = cutIt[1]; cutIt = cutIt.split(" \n"); username = cutIt[0]; let firstName = username.split(" ")[0]; email = cutIt[1]; email = email.split("("); email = email[1]; email = email.split(")"); email = email[0]; try { if (typeof GM_setValue === "function") { GM_setValue("UGF_USERNAME", username); GM_setValue("UGF_EMAIL", email); GM_setValue("UGF_PFP", pfp96 || pfp || ""); } } catch (e) {} document.querySelector("#gp-gbar-account span").textContent = firstName; document.querySelector("#gp-gbar-email span").textContent = email; document.querySelector("#ugf-account-username span").textContent = username; document.querySelector("#ugf-account-email span").textContent = email; document.querySelector("#ugf-username-button span").textContent = "+" + firstName; document.querySelector("#ugf-email-button span").textContent = email; document.querySelector("#ugf-account-button img").src = pfp; document.querySelector("#ugf-account-pfp img").src = pfp96; document.querySelector("#ugf-account-normal-pfp img").src = pfp96; document.querySelector("#gp-gbar-plusyou span").textContent = "+" + firstName; } fixPagination(); } }); if (location == "images") { document.querySelector("#ugf-all-tab").classList.remove("active"); document.querySelector("#ugf-images-tab").classList.add("active"); document.querySelector("#ugf-page-multistate").setAttribute("state","images"); document.querySelector("#ugf-all-item").classList.remove("active"); document.querySelector("#ugf-images-item").classList.add("active"); document.querySelector("#gp-gbar-search").classList.remove("active"); document.querySelector("#gp-gbar-images").classList.add("active"); } if (location == "news" && document.querySelector("html").hasAttribute("news-results")) { document.querySelector("#ugf-all-tab").classList.remove("active"); document.querySelector("#ugf-news-tab").classList.add("active"); document.querySelector("#ugf-all-item").classList.remove("active"); document.querySelector("#ugf-news-item").classList.add("active"); } if (location == "videos") { document.querySelector("#ugf-all-tab").classList.remove("active"); document.querySelector("#ugf-videos-tab").classList.add("active"); document.querySelector("#ugf-all-item").classList.remove("active"); document.querySelector("#ugf-videos-item").classList.add("active"); } if ( location !== "home" && location !== "gplex" ) { switch (tbs) { case 'qdr:h': document.querySelector("#ugf-hour-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); break; case 'qdr:d': document.querySelector("#ugf-day-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); break; case 'qdr:w': document.querySelector("#ugf-week-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); break; case 'qdr:m': document.querySelector("#ugf-month-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); break; case 'qdr:y': document.querySelector("#ugf-year-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); break; case 'li:1': document.querySelector("#ugf-any-time-tool").classList.add("active"); document.querySelector("#ugf-verbatim-tool").classList.add("active"); break; default: document.querySelector("#ugf-any-time-tool").classList.add("active"); document.querySelector("#ugf-all-results-tool").classList.add("active"); } let encodedNavSearch = encodeURIComponent(searchValue); document.querySelector("#ugf-search-value").value = searchValue; document.querySelector("#ugf-all-tab").href = "https://www.google.com/search?q=" + encodedNavSearch; document.querySelector("#ugf-images-tab").href = "https://www.google.com/search?q=" + encodedNavSearch + "&udm=2"; if (document.querySelector("#gp-gbar-images") && searchValue) { document.querySelector("#gp-gbar-images").href = "https://www.google.com/search?q=" + encodedNavSearch + "&udm=2"; } document.querySelector("#ugf-videos-tab").href = "https://www.google.com/search?q=" + encodedNavSearch + "&udm=7"; document.querySelector("#ugf-news-tab").href = "https://www.google.com/search?q=" + encodedNavSearch + "&tbm=nws"; document.querySelector("#ugf-maps-tab").href = "https://maps.google.com/maps?q=" + encodedNavSearch; document.querySelector("#ugf-all-item").href = "https://www.google.com/search?q=" + encodedNavSearch; document.querySelector("#ugf-images-item").href = "https://www.google.com/search?q=" + encodedNavSearch + "&udm=2"; document.querySelector("#ugf-videos-item").href = "https://www.google.com/search?q=" + encodedNavSearch + "&udm=7"; document.querySelector("#ugf-news-item").href = "https://www.google.com/search?q=" + encodedNavSearch + "&tbm=nws"; document.querySelector("#ugf-maps-item").href = "https://maps.google.com/maps?q=" + encodedNavSearch; linkList.forEach(itemRoot => { if (itemRoot.searchResult) { createItem(itemRoot, "searchResult"); } if (itemRoot.videoResult) { createItem(itemRoot, "videoResult"); } if (itemRoot.imageResult) { createItem(itemRoot, "imageResult"); } if (itemRoot.newsResult) { createItem(itemRoot, "newsResult"); } if (itemRoot.shoppingResult) { createItem(itemRoot, "shoppingResult"); } if (itemRoot.searchInfoBlock) { createItem(itemRoot, "searchBlock"); } }); } document.querySelector("#waffle").addEventListener("click", function() { document.querySelector("html").setAttribute("apps-dd-open",""); }); document.querySelector("#ugf-account-button").addEventListener("click", function() { document.querySelector("html").setAttribute("account-dd-open",""); }); document.querySelector("#ugf-fake-notifs-button").addEventListener("click", function() { document.querySelector("html").setAttribute("notifs-dd-open",""); document.querySelector("html").setAttribute("gplus-notif-status","none"); setTimeout(function() { document.querySelector("#ugf-mr-jingles img").setAttribute("src","https://ssl.gstatic.com/s2/oz/images/notifications/jingles_gif_2x_f3cc6d214824b9711a0e8c1a75d285ff.gif"); }, 250); }); /*document.querySelector("#ugf-mr-jingles").addEventListener("click", function() { document.querySelector("#ugf-mr-jingles img").setAttribute("src","https://ssl.gstatic.com/s2/oz/images/notifications/jingles_gif_2x_f3cc6d214824b9711a0e8c1a75d285ff.gif"); });*/ document.querySelector("#ugf-notifs-dd-prev").addEventListener("click", function() { document.querySelector("html").setAttribute("gplus-notif-status","loading"); setTimeout(function() { document.querySelector("html").setAttribute("gplus-notif-status","failed"); }, 1000); }); document.querySelector("#beyond-the-fence").addEventListener("click", function() { document.querySelector("html").removeAttribute("apps-dd-open"); }); document.querySelector("#beyond-the-fence-2").addEventListener("click", function() { document.querySelector("html").removeAttribute("account-dd-open"); }); document.querySelector("#beyond-the-fence-3").addEventListener("click", function() { document.querySelector("html").removeAttribute("notifs-dd-open"); document.querySelector("html").setAttribute("gplus-notif-status","none"); }); document.querySelector("#ugf-search-value").addEventListener("focus", function() { document.querySelector("html").setAttribute("search-focus","hard"); }); document.querySelector("#ugf-search-value").addEventListener("blur", function() { document.querySelector("html").setAttribute("search-focus","soft"); document.querySelector("html").setAttribute("hide-results","false"); }); function performSearch(value) { if (value == "StructuredHomepageOn") { localStorage.setItem("UGF_STRUCTURED_HOMEPAGE","true"); window.location.replace("https://www.google.com/"); } else if (value == "StructuredHomepageOff") { localStorage.setItem("UGF_STRUCTURED_HOMEPAGE","false"); window.location.replace("https://www.google.com/"); } else if (value == "CustomImagePageOn") { localStorage.setItem("UGF_NOTON_IMAGES","false"); alert("Command accepted"); window.location.replace("https://www.google.com/"); } else if (value == "CustomImagePageOff") { localStorage.setItem("UGF_NOTON_IMAGES","true"); alert("Command accepted"); window.location.replace("https://www.google.com/"); } else { let encodedValue = encodeURIComponent(value); if (document.querySelector("html").hasAttribute("basic-html")) { window.location = "https://www.google.com/search?q=" + encodedValue + "&gbv=1"; return; } if (location == "images" || ugfHomeVertical == "images") { window.location = "https://www.google.com/search?q=" + encodedValue + "&udm=2"; } else if (location == "videos" || ugfHomeVertical == "videos") { window.location = "https://www.google.com/search?q=" + encodedValue + "&udm=7"; } else if (location == "news") { window.location = "https://www.google.com/search?q=" + encodedValue + "&tbm=nws"; } else if (location == "shopping" || ugfHomeVertical == "shopping") { window.location = "https://www.google.com/search?q=" + encodedValue + "&udm=28"; } else if (location == "maps") { window.location = "https://maps.google.com/maps?q=" + encodedValue; } else { window.location = "https://www.google.com/search?q=" + encodedValue; } } } document.querySelector("#ugf-search-btn").addEventListener("click", function() { performSearch(document.querySelector("#ugf-search-value").value); }); const searchInput = document.querySelector("#ugf-search-value"); searchInput.addEventListener("keydown", function(event) { const key = event ? event.key : (window.event ? window.event.key : ""); // Navigate search predictions using ArrowDown and ArrowUp keys if (key === "ArrowDown" || key === "ArrowUp") { const items = document.querySelectorAll("#ugf-search-predictions-inner .ugf-search-prediction"); if (items.length > 0) { event.preventDefault(); // Save user typed text before starting arrow navigation if (ugfPredictionIndex === -1) { ugfTypedSearchValue = searchInput.value; } // Remove previous selection styling items.forEach(function(el) { el.classList.remove("ugf-prediction-selected"); }); if (key === "ArrowDown") { ugfPredictionIndex++; if (ugfPredictionIndex >= items.length) { ugfPredictionIndex = -1; } } else { if (ugfPredictionIndex === -1) { ugfPredictionIndex = items.length - 1; } else { ugfPredictionIndex--; } } if (ugfPredictionIndex === -1) { searchInput.value = ugfTypedSearchValue; } else { const activeItem = items[ugfPredictionIndex]; activeItem.classList.add("ugf-prediction-selected"); if (typeof activeItem.scrollIntoView === "function") { activeItem.scrollIntoView({ block: "nearest" }); } const textEl = activeItem.querySelector(".ugf-search-prediction-right span"); const selectedText = textEl ? textEl.textContent.trim() : activeItem.textContent.trim(); searchInput.value = selectedText; } return; } } // Close predictions or blur search input on Escape if (key === "Escape") { const preds = document.querySelector("#ugf-search-predictions"); if (preds) { preds.remove(); document.querySelector("html").removeAttribute("search-focus"); if (ugfPredictionIndex !== -1 && ugfTypedSearchValue) { searchInput.value = ugfTypedSearchValue; } ugfPredictionIndex = -1; } else { // Blur search input when predictions are closed, returning focus to page searchInput.blur(); } return; } document.querySelector("html").setAttribute("hide-results","true"); if (key == "Enter") { ugfPredictionIndex = -1; performSearch(searchInput.value); } else { ugfPredictionIndex = -1; setTimeout(function() { // delay so it gets updated value var value = searchInput.value; fetchPredicts(value); }, 50); } }); // Global shortcut: press '/' to focus search input like native Google if (!window.__ugfSearchShortcutBound) { window.__ugfSearchShortcutBound = true; window.addEventListener("keydown", function(event) { if (event && event.key === "/" && !event.ctrlKey && !event.altKey && !event.metaKey && !event.isComposing && event.keyCode !== 229) { const activeEl = document.activeElement; const isEditable = activeEl && ( activeEl.tagName === "INPUT" || activeEl.tagName === "TEXTAREA" || activeEl.tagName === "SELECT" || activeEl.isContentEditable || activeEl.getAttribute("contenteditable") === "true" ); if (!isEditable) { const targetInput = document.querySelector("#ugf-search-value"); if (targetInput) { event.preventDefault(); targetInput.focus(); const len = targetInput.value.length; if (typeof targetInput.setSelectionRange === "function") { targetInput.setSelectionRange(len, len); } } } } }); } } function createItem(itemGet, itemType) { if (itemType == "newsResult") { ugfRenderNewsItem(itemGet.newsResult); return; } if (itemType == "shoppingResult") { ugfRenderShoppingItem(itemGet.shoppingResult); return; } let item; let type; let SRA; if (itemGet == "zucc") { type = "block"; } if (itemType == "searchResult") { item = itemGet.searchResult; type = item.type; SRA = new SearchResultAPI(item, type); } if (itemType == "videoResult") { item = itemGet.videoResult; type = item.type; SRA = new SearchResultAPI(item, type); } if (itemType == "imageResult") { item = itemGet.imageResult; type = item.type; SRA = new SearchResultAPI(item, type); } if (itemType == "searchBlock") { item = itemGet.searchInfoBlock; type = item.type; SRA = new SearchResultAPI(item, type); } // Video thumbnails first appeared in web results with Universal Search (May 2007). // On 2006-and-older layouts, render video results as plain text results. if (type == "video") { const h = document.querySelector("html"); if (["gplex1997", "gplex1998", "gplex1999", "gplex2000", "gplex2001", "gplex2002", "gplex2003", "gplex2005", "gplex2006"].some(function(a) { return h.hasAttribute(a); })) { type = "result"; } } if (type == "result") { let container = document.querySelector("#ugf-search-results-container"); let newElem = document.createElement("div"); newElem.classList.add("ugf-search-result"); newElem.innerHTML = ugfTT(`
${SRA.title} ${SRA.href}
${SRA.description}
`); container.insertBefore(newElem, container.children[SRA.itemNo]); } if (type == "video") { let container = document.querySelector("#ugf-search-results-container"); let newElem = document.createElement("div"); newElem.classList.add("ugf-search-result"); newElem.classList.add("ugf-video-result"); newElem.setAttribute("thumb-url",SRA.thumbnail); newElem.innerHTML = ugfTT(`
${SRA.title}
▶ ${SRA.duration}
${SRA.href}
${SRA.description}
`); // Synchronize deferred thumbnails for items located in the lower half of SERP (e.g. items 6-10). // In modern Google, these items load deferred thumbnails via google.ldi at the bottom of the HTML. // We observe the native src attribute and poll google.ldi to update Gplex's and thumb-url attribute. (function() { const targetItem = newElem; const origImg = SRA.origImg; const origId = SRA.origImgId; function applyResolvedThumb(realUrl) { if (realUrl && !realUrl.includes("data:image/gif;base64") && realUrl.length > 50) { targetItem.setAttribute("thumb-url", realUrl); const gImg = targetItem.querySelector(".ugf-video-result-thumbnail img"); if (gImg) { gImg.src = realUrl; } return true; } return false; } const currentThumb = targetItem.getAttribute("thumb-url"); if (!currentThumb || currentThumb.includes("data:image/gif;base64") || currentThumb.length < 100) { // Check if native origImg was already populated if (origImg) { const directSrc = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedThumb(directSrc)) return; // Listen directly to native src attribute changes via MutationObserver try { const imgObserver = new MutationObserver(function() { const newSrc = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedThumb(newSrc)) { imgObserver.disconnect(); } }); imgObserver.observe(origImg, { attributes: true, attributeFilter: ["src"] }); } catch (e) {} } // Polling fallback to check google.ldi and document scripts let attempts = 0; const syncTimer = setInterval(function() { attempts++; const gWin = (typeof unsafeWindow !== "undefined" ? unsafeWindow : window); if (origId && gWin && gWin.google && gWin.google.ldi && gWin.google.ldi[origId]) { if (applyResolvedThumb(gWin.google.ldi[origId])) { clearInterval(syncTimer); return; } } if (origImg) { const cur = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedThumb(cur)) { clearInterval(syncTimer); return; } } if (origId) { const def = ugfGetDeferredImage(origId); if (applyResolvedThumb(def)) { clearInterval(syncTimer); return; } } if (attempts >= 35) { clearInterval(syncTimer); } }, 120); } })(); container.insertBefore(newElem, container.children[SRA.itemNo]); } if (type == "image") { let container = document.querySelector("#ugf-image-results-container"); let newElem = document.createElement("div"); newElem.classList.add("ugf-image-result"); newElem.setAttribute("iframe-url",SRA.iframeUrl); newElem.setAttribute("href",SRA.iframeUrl); newElem.setAttribute("img-src",SRA.src); newElem.setAttribute("img-link",SRA.iframeUrl); newElem.setAttribute("img-title",SRA.title); newElem.setAttribute("img-domain",SRA.domain); newElem.setAttribute("img-w",SRA.width); newElem.setAttribute("img-h",SRA.height); newElem.setAttribute("img-docid", SRA.docid || (item && item.docid) || ""); newElem.setAttribute("img-big-src", SRA.bigSrc || (item && item.bigSrc) || ""); if (SRA.origWidth) newElem.setAttribute("img-orig-w", SRA.origWidth); if (SRA.origHeight) newElem.setAttribute("img-orig-h", SRA.origHeight); newElem.innerHTML = ugfTT(`
${SRA.width} x ${SRA.height} ${SRA.domain} ${SRA.title} ${SRA.width} x ${SRA.height}
`); container.insertBefore(newElem, container.children[SRA.itemNo]); newElem.addEventListener("click", function(e) { e.preventDefault(); doImageViewer(newElem); }); if (newElem.querySelector("img").getAttribute("src") == "null") { newElem.remove(); } // Dynamic deferred thumbnail synchronizer for image results (function() { const targetImg = newElem.querySelector("img"); const origImg = SRA.origImg || (item && item.origImg); const origId = SRA.origImgId || (item && item.origImgId) || (origImg ? origImg.getAttribute("id") : ""); function applyResolvedImageThumb(realUrl) { if (realUrl && !realUrl.includes("data:image/gif;base64") && realUrl.length > 50) { newElem.setAttribute("img-src", realUrl); if (targetImg) { targetImg.src = realUrl; } return true; } return false; } const currentSrc = (targetImg ? targetImg.getAttribute("src") : "") || SRA.src || ""; if (!currentSrc || currentSrc.includes("data:image/gif;base64") || currentSrc.length < 50) { if (origImg) { const directSrc = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedImageThumb(directSrc)) return; try { const imgObserver = new MutationObserver(function() { const newSrc = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedImageThumb(newSrc)) { imgObserver.disconnect(); } }); imgObserver.observe(origImg, { attributes: true, attributeFilter: ["src", "data-src"] }); } catch (e) {} } let attempts = 0; const syncTimer = setInterval(function() { attempts++; const gWin = (typeof unsafeWindow !== "undefined" ? unsafeWindow : window); if (origId && gWin && gWin.google) { if (gWin.google.pim && gWin.google.pim[origId] && applyResolvedImageThumb(gWin.google.pim[origId])) { clearInterval(syncTimer); return; } if (gWin.google.ldi && gWin.google.ldi[origId] && applyResolvedImageThumb(gWin.google.ldi[origId])) { clearInterval(syncTimer); return; } } if (origId && window.google) { if (window.google.pim && window.google.pim[origId] && applyResolvedImageThumb(window.google.pim[origId])) { clearInterval(syncTimer); return; } if (window.google.ldi && window.google.ldi[origId] && applyResolvedImageThumb(window.google.ldi[origId])) { clearInterval(syncTimer); return; } } if (origImg) { const cur = origImg.getAttribute("src") || origImg.src || ""; if (applyResolvedImageThumb(cur)) { clearInterval(syncTimer); return; } } if (origId) { const def = ugfGetDeferredImage(origId); if (applyResolvedImageThumb(def)) { clearInterval(syncTimer); return; } } if (attempts >= 40) { clearInterval(syncTimer); } }, 100); } })(); } if (type == "block") { let container = document.querySelector("#ugf-search-results-reserved-top"); let newElem = document.createElement("div"); newElem.classList.add("ugf-instant-answer"); let blockTitle; let blockHeading; let blockMedium; let blockList; if (itemGet == "zucc") { newElem.classList.add("ugf-easter-egg"); blockTitle = ""; blockHeading = "Yes"; blockMedium = ""; blockList = ""; } else { blockTitle = SRA.title; blockHeading = SRA.heading; blockMedium = SRA.medium; blockList = SRA.list; } newElem.innerHTML = ugfTT(`
${blockTitle}
${blockHeading}
${blockMedium}
${blockList}
`); container.insertBefore(newElem, container.children[0]); if (blockTitle == null) { newElem.querySelector(".ugf-instant-answer-supertext").remove(); } if (blockHeading == null) { newElem.querySelector(".ugf-instant-answer-heading").remove(); } if (blockMedium == null) { newElem.querySelector(".ugf-instant-answer-medium").remove(); } if (blockList == null) { newElem.querySelector(".ugf-instant-answer-list").remove(); } if (firstLinkBelongsToBlock == true) { var elm = ".ugf-search-result"; waitForElement10(elm).then(function(elm) { if (canGo != false) { newElem.appendChild(document.querySelector(".ugf-search-result")); } }); } } } const UGF_RETRO_CHROME = { gplex1997: { navAbove: true, left: [], right: [], aboveBox: "Search the web using Google!", luckyLabel: "I\'m feeling lucky", resultsDropdown: ["10 results", "20 results", "30 results", "50 results", "100 results"], indexNote: "Index contains ~25 million pages (soon to be much bigger)", bigLink: ["About Google!", "https://about.google/"], extraLinks: [ ["Stanford Search", "https://www.stanford.edu/"], ["Linux Search", "https://www.google.com/"] ], subscribe: { heading: "Get Google! updates monthly!", placeholder: "your e-mail", button: "Subscribe", archive: "Archive", archiveHref: "https://about.google/" }, footer: [], copyright: "Copyright \u00a91997 Stanford University" }, gplex1998: { navAbove: true, left: [], right: [], aboveBox: "Search the web using Google!", luckyLabel: "I\'m feeling lucky", resultsDropdown: ["10 results", "20 results", "30 results", "50 results", "100 results"], indexNote: "Index contains ~25 million pages (soon to be much bigger)", bigLink: ["About Google!", "https://about.google/"], extraLinks: [ ["Stanford Search", "https://www.stanford.edu/"], ["Linux Search", "https://www.google.com/"] ], subscribe: { heading: "Get Google! updates monthly!", placeholder: "your e-mail", button: "Subscribe", archive: "Archive", archiveHref: "https://about.google/" }, footer: [], copyright: "Copyright \u00a91997-8 Stanford University" }, gplex1999: { navAbove: true, left: [], right: [], aboveBox: "Search the web using Google", logoLinks: [ ["Jobs@Google", "https://about.google/"], ["About Google", "https://about.google/"] ], luckyLabel: "I\'m feeling lucky", promo: ["", "Google Launches! Read the press release.", "https://about.google/", ""], footer: [], copyright: "\u00a91999 Google Inc." }, gplex2000: { navAbove: true, left: [], right: [], aboveLinks: [ ["Advanced Search", "https://www.google.com/advanced_search"], ["Language, Display, & Filtering Options", "https://www.google.com/preferences"] ], indexLine: "Google index: 1,060,000,000 web pages", promo: ["", "Independent Survey Ranks Google #1", "https://about.google/", ""], footer: [ ["Cool Jobs", "https://about.google/"], ["Try our Web Directory", "https://www.google.com/"], ["Advertise with Us", "https://ads.google.com"], ["Add Google to your Site", "https://www.google.com/"], ["Google Browser Buttons", "https://www.google.com/"], ["Everything Else", "https://about.google/"] ], footerBreakAfter: 3, copyright: "\u00a92000 Google" }, gplex2001: { navAbove: true, left: [], right: [], aboveBox: "Search 1,346,966,000 web pages", promo: ["", "Google Web Directory", "https://www.google.com/", ""], promoTagline: "the web organized by topic", footer: [ ["Cool Jobs", "https://about.google/"], ["Add Google to Your Site", "https://www.google.com/"], ["Advertise with Us", "https://ads.google.com"], ["All About Google", "https://about.google/"] ], copyright: "\u00a92001 Google" }, gplex2002: { navAbove: true, tabs: true, left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Groups", "https://groups.google.com"], ["Directory", "https://www.google.com"] ], right: [], promo: ["Improve your company\'s website with the ", "Google Search Appliance", "https://www.google.com/", "."], footer: [ ["Advertise with Us", "https://ads.google.com"], ["Search Solutions", "https://www.google.com/services/"], ["News and Resources", "https://about.google/"], ["Jobs, Press, Cool Stuff...", "https://about.google/"] ], copyright: "\u00a92002 Google - Searching 2,073,418,204 web pages" }, gplex2003: { navAbove: true, tabs: true, left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Groups", "https://groups.google.com"], ["Directory", "https://www.google.com"], ["News", "https://news.google.com"] ], right: [], footer: [ ["Advertise with Us", "https://ads.google.com"], ["Business Solutions", "https://www.google.com/services/"], ["Services & Tools", "https://www.google.com/options/"], ["Jobs, Press, & Help", "https://about.google/"] ], copyright: "©2003 Google - Searching 3,083,324,652 web pages" }, gplex2005: { navAbove: true, footer: [ ["Advertising Programs", "https://ads.google.com"], ["About Google", "https://about.google/"] ], copyright: "©2005 Google - Searching 8,058,044,651 web pages", left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Groups", "https://groups.google.com"], ["News", "https://news.google.com"], ["Froogle", "https://www.google.com/shopping"], ["Local", "https://maps.google.com"] ], right: [] }, gplex2006: { navAbove: true, footer: [ ["Advertising Programs", "https://ads.google.com"], ["Business Solutions", "https://www.google.com/services/"], ["About Google", "https://about.google/"] ], copyright: "©2006 Google", left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Groups", "https://groups.google.com"], ["News", "https://news.google.com"], ["Froogle", "https://www.google.com/shopping"], ["Maps", "https://maps.google.com"] ], right: [ ["Personalized Home", "https://www.google.com/ig"] ] }, gplex2007: { footer: [ ["Advertising Programs", "https://ads.google.com"], ["Business Solutions", "https://www.google.com/services/"], ["About Google", "https://about.google/"] ], copyright: "©2007 Google", left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.google.com/videohp"], ["News", "https://news.google.com"], ["Maps", "https://maps.google.com"], ["Product Search", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com"], ["Documents", "https://docs.google.com/document/"] ], right: [ ["iGoogle", "https://www.google.com/ig"] ] }, gplex2009: { left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.google.com/videohp"], ["Maps", "https://maps.google.com"], ["News", "https://news.google.com"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com"], ["Documents", "https://docs.google.com/document/"] ], right: [ ["iGoogle", "https://www.google.com/ig"], ["Search settings", "https://www.google.com/preferences"] ] }, gplex2010: { left: [ ["Web", "https://www.google.com"], ["Images", "https://www.google.com/imghp"], ["Videos", "https://www.google.com/videohp"], ["Maps", "https://maps.google.com"], ["News", "https://news.google.com"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com"], ["Documents", "https://docs.google.com/document/"] ], right: [ ["iGoogle", "https://www.google.com/ig"], ["Search settings", "https://www.google.com/preferences"] ] } }; function ugfRetroEra() { const h = document.querySelector("html"); if (h.hasAttribute("gplex2007")) { return "gplex2007"; } if (h.hasAttribute("gplex2006")) { return "gplex2006"; } if (h.hasAttribute("gplex2005")) { return "gplex2005"; } if (h.hasAttribute("gplex2003")) { return "gplex2003"; } if (h.hasAttribute("gplex2002")) { return "gplex2002"; } if (h.hasAttribute("gplex2001")) { return "gplex2001"; } if (h.hasAttribute("gplex2000")) { return "gplex2000"; } if (h.hasAttribute("gplex1999")) { return "gplex1999"; } if (h.hasAttribute("gplex1998")) { return "gplex1998"; } if (h.hasAttribute("gplex1997")) { return "gplex1997"; } if (h.hasAttribute("gplex2009")) { return "gplex2009"; } if (h.hasAttribute("gplex2010")) { return "gplex2010"; } return null; } function ugfIsShoppingLink(label) { return label === "Shopping" || label === "Froogle" || label === "Product Search"; } function ugfOnShopping() { return (document.querySelector("html").getAttribute("location") === "shopping") || ugfHomeVertical === "shopping"; } function ugfRetroGbarLink(label, href, active) { const a = document.createElement("a"); a.className = "gp-gbar-link ugf-retro-gbar" + (active ? " active" : ""); a.href = href; const inner = document.createElement("div"); inner.className = "gp-gbar-link-inner"; const span = document.createElement("span"); span.textContent = label; inner.appendChild(span); a.appendChild(inner); return a; } // 2006-2007: "Results 1 - 10 of about N for q. (0.29 seconds)" function ugfEraResultsLine() { const era = ugfRetroEra(); if (ugfClassicEras().indexOf(era) > -1) { ugfClassicResultsLine(); return; } if (era !== "gplex2005" && era !== "gplex2006" && era !== "gplex2007") { return; } const span = document.querySelector("#ugf-search-results-header span"); if (!span) { return; } const txt = span.textContent || ""; const nums = txt.match(/\d[\d.,\u00a0\u202f ]*\d|\d/g); if (!nums || nums.length < 1) { return; } const count = nums[0].trim(); const secs = nums.length > 1 ? nums[nums.length - 1].trim() : ""; let first = parseInt(new URLSearchParams(window.location.search).get("start") || "0", 10); if (isNaN(first)) { first = 0; } first = first + 1; const q = searchValue || ""; span.innerHTML = trusted_policy.createHTML("Results " + first + " - " + (first + 9) + " of about " + ugfEscapeHtml(count) + " for " + ugfEscapeHtml(q) + "." + (secs ? " (" + ugfEscapeHtml(secs) + " seconds)" : "")); } // ---- Google News tab (tbm=nws) ------------------------------------------------- // Cards are found structurally (a link that contains a heading) so Google's // obfuscated class names can change without breaking this. const UGF_NEWS_TIME_RE_INTL = /(\d+\s*(分|時間|日|週間|か月|ヶ月|年|分钟|小时|天|周|个月|分鐘|小時|週|個月|분|시간|일|주|개월|년)\s*(前|전)|前$|\bhace\s+\d|\bil y a\s+\d|\bvor\s+\d|\d+\s*\S+\s+fa$|\bhá\s+\d|назад$|geleden$|\btemu$|önce$|^(ayer|hier|gestern|ieri|ontem|вчера|昨天|昨日|어제|gisteren|wczoraj|dün)$)/i; const UGF_NEWS_TIME_RE = /(\bago\b|\byesterday\b|^\d+\s*(min|mins|minute|minutes|h|hr|hrs|hour|hours|d|day|days|w|wk|week|weeks|mo|month|months|y|yr|year|years)\b|^(jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\.? \d{1,2},? \d{4}$|^\d{1,2} (jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\.? \d{4}$|^\d{1,2}\/\d{1,2}\/\d{2,4}$)/i; function ugfFindNewsCards(root) { const scope = root.querySelector("#rso") || root.querySelector("#search") || root.querySelector("#center_col") || root.body || root; const cards = []; scope.querySelectorAll("a[href]").forEach(function(a) { const heading = a.querySelector('[role="heading"], h3'); if (!heading || !heading.textContent.trim()) { return; } let href = a.getAttribute("href") || ""; if (href.indexOf("/url?") === 0 || href.indexOf("https://www.google.com/url?") === 0) { try { const u = new URL(href, "https://www.google.com"); href = u.searchParams.get("q") || u.searchParams.get("url") || href; } catch (e) {} } if (!/^https?:\/\//.test(href) || /^https?:\/\/(www\.)?google\.[^/]+\/(search|preferences|advanced_search)/.test(href)) { return; } for (let i = 0; i < cards.length; i++) { if (cards[i].a.contains(a) || a.contains(cards[i].a)) { return; } } cards.push({ a: a, heading: heading, href: href }); }); return cards; } function ugfNewsCardContainer(card, all) { let el = card.a; while (el.parentElement && el.parentElement !== document.body) { const p = el.parentElement; let n = 0; for (let i = 0; i < all.length; i++) { if (p.contains(all[i].heading)) { n++; } } if (n > 1) { break; } el = p; if (el.id === "rso" || el.id === "search") { break; } } return el; } function ugfNewsTextBlocks(container) { const blocks = []; const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT); let node; let lastEl = null; while ((node = walker.nextNode())) { const t = node.nodeValue.replace(/\s+/g, " ").trim(); if (!t) { continue; } const el = node.parentElement; if (!el || el.closest("script, style")) { continue; } const cs = window.getComputedStyle ? window.getComputedStyle(el) : null; if (cs && (cs.display === "none" || cs.visibility === "hidden")) { continue; } if (lastEl && (lastEl === el || lastEl.contains(el) || el.contains(lastEl)) && blocks.length) { blocks[blocks.length - 1].text += " " + t; } else { blocks.push({ el: el, text: t }); } lastEl = el; } return blocks; } function ugfGetSearchTerms(query, lang) { if (!query || !query.trim()) return []; lang = lang || (typeof UGF_LANG !== "undefined" ? UGF_LANG : "") || document.documentElement.lang || navigator.language || "en"; const terms = new Set(); const isCjk = function(s) { return /[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(s); }; // 1. Whitespace tokens query.trim().split(/\s+/).forEach(function(w) { const clean = w.replace(/^["'+]+|["'+]+$/g, "").trim(); if (!clean) return; if (isCjk(clean) ? clean.length >= 1 : clean.length >= 3) { terms.add(clean); } }); // 2. Native Intl.Segmenter for fine-grained multi-language word segmentation if (typeof Intl !== "undefined" && Intl.Segmenter) { try { const segmenter = new Intl.Segmenter(lang, { granularity: "word" }); const segments = segmenter.segment(query); for (const item of segments) { if (item.isWordLike) { const trimmed = item.segment.trim(); if (isCjk(trimmed) ? trimmed.length >= 1 : trimmed.length >= 3) { terms.add(trimmed); } } } } catch (e) {} } return Array.from(terms); } function ugfNewsBold(text) { if (!text) return ""; const terms = ugfGetSearchTerms(searchValue || (new URLSearchParams(window.location.search).get("q") || "")); if (!terms.length) { return ugfEscapeHtml(text); } const intervals = []; const isCjk = function(s) { return /[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(s); }; terms.forEach(function(term) { const safe = term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); let re; if (isCjk(term)) { re = new RegExp(safe, "gi"); let match; while ((match = re.exec(text)) !== null) { intervals.push({ start: match.index, end: match.index + match[0].length }); } } else { // Unicode letter/digit boundary for Latin / Cyrillic / European words re = new RegExp("(?:^|[^\\p{L}\\p{N}])(" + safe + ")(?=[^\\p{L}\\p{N}]|$)", "giu"); let match; while ((match = re.exec(text)) !== null) { const fullMatch = match[0]; const group1 = match[1]; const offset = fullMatch.indexOf(group1); const start = match.index + offset; intervals.push({ start: start, end: start + group1.length }); if (re.lastIndex === match.index) re.lastIndex++; } } }); if (!intervals.length) { return ugfEscapeHtml(text); } // Sort intervals by start ascending, then end descending intervals.sort(function(a, b) { return a.start - b.start || b.end - a.end; }); // Merge overlapping or adjacent intervals const merged = [intervals[0]]; for (let i = 1; i < intervals.length; i++) { const last = merged[merged.length - 1]; const curr = intervals[i]; if (curr.start <= last.end) { last.end = Math.max(last.end, curr.end); } else { merged.push(curr); } } // Build safe HTML string from raw slices to prevent HTML tag collisions let result = ""; let lastIndex = 0; merged.forEach(function(interval) { result += ugfEscapeHtml(text.slice(lastIndex, interval.start)); result += "" + ugfEscapeHtml(text.slice(interval.start, interval.end)) + ""; lastIndex = interval.end; }); result += ugfEscapeHtml(text.slice(lastIndex)); return result; } // news thumbnail: the biggest non-favicon image in the card; Google hides the size in different places per build function ugfNewsPickThumb(container, card) { let best = null; let bestScore = -1; container.querySelectorAll("img").forEach(function(img) { if (img.closest('[role="heading"]')) { return; } const aw = parseInt(img.getAttribute("width") || "0", 10); const ah = parseInt(img.getAttribute("height") || "0", 10); const nw = img.naturalWidth || 0; const st = (img.getAttribute("style") || "") + " " + (img.parentElement ? img.parentElement.getAttribute("style") || "" : ""); const sw = parseInt((st.match(/width:\s*(\d+)px/) || [0, 0])[1], 10); const size = Math.max(aw, ah, nw > 1 ? nw : 0, sw); if (size > 0 && size < 36) { return; // favicon } const src = img.getAttribute("src") || ""; if (/favicon|faviconV2|\/s2\/favicons/.test(src)) { return; } const afterHeading = card.heading.compareDocumentPosition(img) & Node.DOCUMENT_POSITION_FOLLOWING; let score = size; if (/^dimg_/.test(img.id || "")) { score += 1000; } if (afterHeading) { score += 500; } if (size === 0 && !afterHeading && !/^dimg_/.test(img.id || "")) { score = 1; // unknown size before the headline: only if nothing better } if (score > bestScore) { best = img; bestScore = score; } }); return best; } function ugfNewsThumbSrc(img) { const ok = function(v) { return v && v.indexOf("data:image/gif") !== 0 && v.length >= 40 ? v : ""; }; return ok(img.getAttribute("src") || "") || ok(ugfGetDeferredImage(img.id)) || ok(img.getAttribute("data-src") || "") || ok(img.getAttribute("data-iurl") || "") || ok(((img.getAttribute("srcset") || img.getAttribute("data-srcset") || "").split(",")[0] || "").trim().split(" ")[0]) || ok(img.currentSrc || ""); } // news thumbnail: the biggest non-favicon image in the card; Google hides the size in different places per build // ---- Gmail: rebuild the message list in the era of the selected layout ---- // ---- Gmail, rebuilt per era from measured captures of the real thing ---- // Classic palette: #C3D9FF chrome, read rows #E8EEF7, unread white + bold, selected #FFC. // Kennedy (2011-12): grey buttons #f5f5f5>#f1f1f1 / border #dcdcdc, red COMPOSE #dd4b39>#d14836. // 2013-17: header #f1f1f1, search border #cdcdcd + #4285f4 button, read rows #f2f2f2, tab strip #f4f4f4. // 2018-19: white 64px header, search field #f1f3f4 r8, nav pill #fce8e6 / #d93025, Roboto 14px. function ugfGmailCss() { return ` /* ============================================================ Gplex for Gmail - one skin per Gmail era. chrome="classic" 2004-early 2011 chrome="kennedy" late 2011-2012 chrome="m2013" 2013-2017 chrome="m2018" 2018+ ============================================================ */ #ugf-gmail { font: 13px arial, sans-serif; color: #000; background: #fff; min-height: 100vh; } #ugf-gmail * { box-sizing: border-box; } #ugf-gmail a { color: #00c; text-decoration: none; } #ugf-gmail a:hover { text-decoration: underline; } #ugf-gmail img { border: 0; } /* ---------- header ---------- */ #ugf-gmail-top { display: flex; align-items: flex-start; justify-content: space-between; padding: 8px 10px 4px 10px; } #ugf-gmail-logo { line-height: 1; display: flex; align-items: center; gap: 8px; } #ugf-gmail-logo img.gmail-mark { display: block; height: 45px; width: auto; } #ugf-gmail-logo img.google-mark { display: block; height: 30px; width: auto; } #ugf-gmail-logo .wordmark { font-family: arial, sans-serif; font-size: 26px; font-weight: bold; color: #c00; letter-spacing: -1px; } #ugf-gmail-logo .ugf-gmail-beta { font-size: 10px; color: #999; font-weight: normal; vertical-align: super; letter-spacing: 0; } #ugf-gmail-account { font-size: 11px; color: #666; padding-top: 6px; text-align: right; } #ugf-gmail-account b { color: #000; } /* ---------- search row ---------- */ #ugf-gmail-searchrow { padding: 0 10px 8px 10px; } #ugf-gmail-searchrow input[type="text"] { font: 13px arial, sans-serif; padding: 2px 4px; } .ugf-gmail-searchlinks { font-size: 11px; margin-left: 8px; } /* ---------- body / sidebar / main ---------- */ #ugf-gmail-body { display: flex; align-items: flex-start; gap: 0; } #ugf-gmail-nav { width: 150px; flex: 0 0 150px; padding: 4px 8px 20px 10px; font-size: 13px; } #ugf-gmail-nav a { display: block; padding: 1px 4px; color: #00c; line-height: 18px; } #ugf-gmail-nav a.active { background: #e8eef7; font-weight: bold; color: #000; } #ugf-gmail-nav .ugf-gmail-navhead { margin: 10px 0 2px 0; font-weight: bold; color: #666; font-size: 11px; text-transform: none; } #ugf-gmail-compose { font-weight: bold; margin-bottom: 10px; } #ugf-gmail-chat { margin-top: 16px; border-top: 1px solid #e5e5e5; padding-top: 6px; font-size: 12px; } .ugf-gmail-chat-note { color: #888; font-size: 11px; margin-top: 2px; } #ugf-gmail-main { flex: 1 1 auto; min-width: 0; padding: 0 10px 20px 4px; } /* ---------- toolbar ---------- */ #ugf-gmail-toolbar { display: flex; align-items: center; gap: 4px; padding: 2px 0 6px 0; flex-wrap: wrap; } #ugf-gmail-count { margin-left: auto; font-size: 11px; color: #666; white-space: nowrap; } #ugf-gmail-toolbar .sep { width: 1px; height: 18px; background: #e0e0e0; margin: 0 4px; } #ugf-gmail-toolbar button.icon svg { fill: #5f6368; display: block; } #ugf-gmail-select { font-size: 11px; color: #666; padding: 0 0 6px 0; } #ugf-gmail-select a { font-size: 11px; } /* ---------- classic buttons (2004 - early 2011) ---------- */ #ugf-gmail[chrome="classic"] button { font: 11px arial, sans-serif; color: #333; background: #f5f5f5; background: linear-gradient(#fbfbfb, #e9e9e9); border: 1px solid #b5b5b5; border-radius: 2px; padding: 2px 8px; cursor: pointer; min-height: 21px; } #ugf-gmail[chrome="classic"] button:hover { border-color: #999; background: linear-gradient(#fff, #e2e2e2); } #ugf-gmail[chrome="classic"] button:active { background: #e0e0e0; box-shadow: inset 0 1px 2px rgba(0,0,0,.2); } #ugf-gmail[chrome="classic"] input[type="text"] { border: 1px solid #a9a9a9; border-top-color: #7a7a7a; height: 21px; width: 340px; } /* ---------- Kennedy buttons (late 2011 - 2012) ---------- */ #ugf-gmail[chrome="kennedy"] { font: 13px arial, sans-serif; color: #222; } #ugf-gmail[chrome="kennedy"] button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; border-radius: 2px; height: 27px; min-width: 27px; padding: 0 8px; cursor: pointer; text-shadow: 0 1px 0 rgba(255,255,255,.9); } #ugf-gmail[chrome="kennedy"] button:hover { border-color: #c6c6c6; background: linear-gradient(#f8f8f8, #f1f1f1); box-shadow: 0 1px 1px rgba(0,0,0,.1); color: #333; } #ugf-gmail[chrome="kennedy"] button:active { background: #f1f1f1; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); } #ugf-gmail[chrome="kennedy"] button.blue, #ugf-gmail[chrome="kennedy"] #ugf-gmail-search { background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; color: #fff; text-shadow: 0 1px rgba(0,0,0,.1); } #ugf-gmail[chrome="kennedy"] button.blue:hover, #ugf-gmail[chrome="kennedy"] #ugf-gmail-search:hover { background: linear-gradient(#4d90fe, #357ae8); border-color: #2f5bb7; color: #fff; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-search svg { fill: #fff; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield { display: flex; align-items: stretch; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield input { height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; border-radius: 2px 0 0 2px; padding: 0 8px; width: 440px; font-size: 15px; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield input:focus { border-color: #4d90fe; outline: none; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield button { height: 29px; border-radius: 0 2px 2px 0; width: 60px; display: flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-compose { display: inline-block; font: bold 11px arial, sans-serif; color: #fff; background: linear-gradient(#dd4b39, #d14836); border: 1px solid transparent; border-bottom-color: #b0281a; border-radius: 2px; padding: 0 18px; line-height: 27px; height: 29px; margin-bottom: 12px; text-align: center; width: 100%; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-compose:hover { background: linear-gradient(#dd4b39, #c53727); text-decoration: none; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-nav a { color: #333; border-radius: 2px; padding: 2px 8px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-nav a.active { background: #ddd; color: #000; } /* ---------- Material 2013 ---------- */ #ugf-gmail[chrome="m2013"] { font: 13px arial, sans-serif; color: #222; background: #fff; } #ugf-gmail[chrome="m2013"] #ugf-gmail-top { background: #f1f1f1; border-bottom: 1px solid #e5e5e5; padding: 14px 16px; align-items: center; gap: 16px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo { flex: 0 0 150px; align-items: center; padding-left: 6px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo img.google-mark { height: 28px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-searchrow { flex: 1 1 auto; padding: 0; margin: 0; max-width: 780px; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield { display: flex; width: 100%; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield input { flex: 1 1 auto; height: 32px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; padding: 0 8px; font-size: 14px; background: #fff; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield input:focus { border-color: #4d90fe; outline: none; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield button { width: 62px; height: 32px; background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; border-radius: 0 2px 2px 0; cursor: pointer; display: flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield button svg { fill: #fff; } #ugf-gmail[chrome="m2013"] #ugf-gmail-account { flex: 0 0 auto; padding-top: 8px; } /* the red Gmail mark sits in the sidebar column, level with the toolbar */ #ugf-gmail-gmark { display: flex; align-items: center; gap: 4px; height: 42px; padding-left: 6px; } #ugf-gmail-gmark .wordmark { font: 20px arial, sans-serif; color: #d14836; } #ugf-gmail-gmark .caret { color: #d14836; font-size: 10px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose { display: block; background: #d14836; color: #fff; font: bold 12px arial, sans-serif; text-transform: uppercase; letter-spacing: .5px; text-align: center; line-height: 34px; border-radius: 2px; margin: 8px 0 16px 0; box-shadow: 0 1px 1px rgba(0,0,0,.2); } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose:hover { background: #c53727; text-decoration: none; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a { color: #333; padding: 3px 10px; line-height: 20px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a.active { background: #ddd; font-weight: bold; } #ugf-gmail[chrome="m2013"] #ugf-gmail-main { background: #fff; border: 0; margin: 0; padding: 0 16px 20px 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar { padding: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav { background: #fff; width: 200px; flex: 0 0 200px; padding: 0 0 20px 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a { color: #333; font-size: 13px; line-height: 28px; padding: 0 0 0 30px; border-left: 5px solid transparent; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a:hover { background: #eee; text-decoration: none; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a.active { background: none; color: #dd4b39; font-weight: bold; border-left-color: #dd4b39; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose { margin: 0 0 16px 25px; width: 150px; } #ugf-gmail[chrome="m2013"] button.icon, #ugf-gmail[chrome="m2018"] button.icon { background: none; border: 1px solid transparent; border-radius: 2px; width: 30px; height: 28px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; } #ugf-gmail[chrome="m2013"] button.icon:hover { background: #f1f1f1; border-color: #ddd; } /* ---------- Material 2018 ---------- */ #ugf-gmail[chrome="m2018"] { font: 14px "Google Sans", Roboto, arial, sans-serif; color: #202124; background: #fff; } #ugf-gmail[chrome="m2018"] a { color: #1a73e8; } #ugf-gmail[chrome="m2018"] #ugf-gmail-top { align-items: center; padding: 8px 16px; gap: 16px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo { flex: 0 0 auto; gap: 12px; min-width: 200px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .hamburger { width: 24px; height: 24px; display: inline-block; position: relative; flex: 0 0 24px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .hamburger i { position: absolute; left: 3px; right: 3px; height: 2px; background: #5f6368; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .hamburger i:nth-child(1) { top: 6px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .hamburger i:nth-child(2) { top: 11px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .hamburger i:nth-child(3) { top: 16px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo img.gmail-mark { height: 30px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo .wordmark { font-size: 22px; font-weight: normal; color: #5f6368; letter-spacing: 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-searchrow { flex: 1 1 auto; padding: 0; order: 2; max-width: 720px; } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield { display: flex; align-items: center; background: #f1f3f4; border-radius: 8px; height: 48px; padding: 0 8px; } /* The bar behind it was #f1f3f4 too, so the field was invisible. 2019 is the 2018 redesign: white bar, grey field. 2022 keeps its tinted shell and takes the blue-grey field Gmail uses there. Either way the two no longer match. */ html[layout="2019"] #ugf-gmail[chrome="m2018"] #ugf-gmail-top, html[layout="2019"] #ugf-gmail[chrome="m2018"] #ugf-gmail-logo, html[layout="2019"] #ugf-gmail[chrome="m2018"] #ugf-gmail-nav { background: #fff; } html[layout="2022"] #ugf-gmail[chrome="m2018"] #ugf-gmail-top, html[layout="2022"] #ugf-gmail[chrome="m2018"] #ugf-gmail-logo, html[layout="2022"] #ugf-gmail[chrome="m2018"] #ugf-gmail-nav { background: #f6f8fc; } html[layout="2022"] #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield { background: #eaf1fb; } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield:focus-within { background: #fff; box-shadow: 0 1px 1px 0 rgba(65,69,73,.3), 0 1px 3px 1px rgba(65,69,73,.15); } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield input { flex: 1 1 auto; border: 0; background: none; height: 46px; font-size: 16px; color: #202124; outline: none; padding: 0 8px; order: 2; } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield button { order: 1; background: none; border: 0; cursor: pointer; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield button:hover { background: rgba(0,0,0,.05); } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield button svg { fill: #5f6368; width: 20px; height: 20px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-account { order: 3; font-size: 12px; color: #5f6368; display: flex; align-items: center; gap: 12px; padding-top: 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-body { border-top: 1px solid #e8eaed; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav { width: 230px; flex: 0 0 230px; padding: 8px 0 20px 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a { color: #202124; font-size: 14px; line-height: 32px; height: 32px; padding: 0 12px 0 26px; border-radius: 0 16px 16px 0; margin-right: 10px; display: flex; align-items: center; gap: 18px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a:hover { background: #f1f3f4; text-decoration: none; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a.active { background: #e3e6e8; color: #202124; font-weight: bold; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a.active svg { fill: #202124; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a svg { fill: #5f6368; width: 20px; height: 20px; flex: 0 0 20px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav a .navcount { margin-left: auto; font-size: 12px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose { display: inline-flex; align-items: center; gap: 10px; height: 48px; border-radius: 24px; background: #fff; color: #3c4043; font-size: 14px; font-weight: 500; box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15); padding: 0 24px 0 16px; margin: 8px 0 16px 16px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose:hover { background: #fafafb; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15); text-decoration: none; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose .plus { font-size: 22px; color: #d93025; line-height: 1; } #ugf-gmail[chrome="m2018"] #ugf-gmail-main { padding: 0; border-left: 1px solid #e8eaed; } #ugf-gmail[chrome="m2018"] #ugf-gmail-toolbar { padding: 4px 16px; height: 48px; } #ugf-gmail[chrome="m2018"] button.icon { width: 40px; height: 40px; border-radius: 50%; } #ugf-gmail[chrome="m2018"] button.icon:hover { background: rgba(32,33,36,.059); } #ugf-gmail[chrome="m2018"] #ugf-gmail-count { font-size: 12px; color: #5f6368; } /* ---------- select-all control ---------- */ .ugf-gmail-selectall { display: inline-flex; align-items: center; gap: 2px; padding: 0 4px; cursor: pointer; } .ugf-gmail-selectall .caret { color: #5f6368; font-size: 10px; } /* ---------- category tabs ---------- */ #ugf-gmail-tabs { display: flex; border-bottom: 1px solid #e0e0e0; padding: 0 8px; } #ugf-gmail-tabs .tab { padding: 10px 18px 8px 18px; font-size: 13px; color: #5f6368; cursor: pointer; border-bottom: 3px solid transparent; display: flex; align-items: center; gap: 8px; white-space: nowrap; } #ugf-gmail-tabs .tab svg { fill: #5f6368; width: 18px; height: 18px; } #ugf-gmail-tabs .tab.active { color: #1a73e8; border-bottom-color: #1a73e8; font-weight: bold; } #ugf-gmail-tabs .tab.active svg { fill: #1a73e8; } #ugf-gmail[chrome="m2013"] #ugf-gmail-tabs .tab.active { color: #d14836; border-bottom-color: #d14836; } #ugf-gmail[chrome="m2013"] #ugf-gmail-tabs .tab.active svg { fill: #d14836; } /* ---------- message list ---------- */ #ugf-gmail-list { width: 100%; border-collapse: collapse; table-layout: fixed; } #ugf-gmail-list tr { cursor: pointer; background: #f2f2f2; } #ugf-gmail-list tr.unread { background: #fff; font-weight: bold; } #ugf-gmail-list tr.checked { background: #fff9c4 !important; } #ugf-gmail-list td { padding: 3px 4px; vertical-align: middle; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .ugf-gmail-check { width: 24px; } .ugf-gmail-star { width: 20px; color: #ddd; text-align: center; } .ugf-gmail-star.on { color: #f4b400; } .ugf-gmail-from { width: 180px; } .ugf-gmail-date { width: 80px; text-align: right; color: #666; font-size: 11px; } #ugf-gmail-list tr.unread .ugf-gmail-date { color: #000; } .ugf-gmail-subject .snippet { color: #777; font-weight: normal; } #ugf-gmail[chrome="m2013"] #ugf-gmail-list tr, #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr { border-bottom: 1px solid #f1f3f4; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list td { padding: 8px 6px; font-size: 14px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr:hover { box-shadow: inset 1px 0 0 #dadce0, inset -1px 0 0 #dadce0, 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15); z-index: 1; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-list tr:hover { box-shadow: inset 0 1px 0 #f0f0f0, inset 0 -1px 0 #f0f0f0, 0 1px 2px rgba(0,0,0,.2); } /* ---------- message viewer ---------- */ #ugf-gmail-thread-bar { display: flex; align-items: center; gap: 4px; padding: 2px 0 8px 0; flex-wrap: wrap; } #ugf-gmail-thread-nav { margin-left: auto; display: flex; align-items: center; gap: 4px; font-size: 11px; color: #666; white-space: nowrap; } #ugf-gmail-back { font-size: 13px; } #ugf-gmail-subject { font-size: 18px; font-weight: normal; margin: 6px 0 12px 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } #ugf-gmail[chrome="classic"] #ugf-gmail-subject { font-size: 16px; font-weight: bold; } #ugf-gmail-subject .labelchip { font-size: 11px; background: #ddd; color: #333; border-radius: 2px; padding: 2px 6px 2px 8px; font-weight: normal; display: inline-flex; align-items: center; gap: 6px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-subject { font-size: 22px; color: #202124; padding: 0 16px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-subject .labelchip { background: #ddd; border-radius: 4px; font-size: 12px; } #ugf-gmail-subject .subject-icons { margin-left: auto; display: flex; gap: 4px; } .ugf-gmail-msg { border: 1px solid #e5e5e5; border-radius: 2px; margin-bottom: 10px; background: #fff; } #ugf-gmail[chrome="m2018"] .ugf-gmail-msg { border: 0; margin: 0; padding: 0 16px; } .ugf-gmail-msg-head { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px 4px 12px; border-bottom: 1px solid #f1f1f1; } #ugf-gmail[chrome="m2018"] .ugf-gmail-msg-head { border-bottom: 0; padding: 10px 0 4px 0; } .ugf-gmail-avatar { width: 36px; height: 36px; border-radius: 50%; background: #c62828; color: #fff; font-size: 18px; display: flex; align-items: center; justify-content: center; flex: 0 0 36px; text-transform: uppercase; } #ugf-gmail[chrome="classic"] .ugf-gmail-avatar { display: none; } .ugf-gmail-msg-who { flex: 1 1 auto; min-width: 0; } .ugf-gmail-msg-from { font-weight: bold; } .ugf-gmail-msg-addr { color: #777; font-weight: normal; font-size: 12px; } .ugf-gmail-msg-to { color: #5f6368; font-size: 12px; display: block; margin-top: 1px; } .ugf-gmail-msg-right { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #5f6368; white-space: nowrap; } .ugf-gmail-msg-body { padding: 10px 12px 14px 12px; font-size: 13px; line-height: 1.5; overflow-wrap: break-word; word-break: break-word; } #ugf-gmail[chrome="m2018"] .ugf-gmail-msg-body { padding: 12px 0 16px 46px; font-size: 14px; } .ugf-gmail-msg-body img { max-width: 100%; height: auto; } .ugf-gmail-msg-body table { max-width: 100%; } #ugf-gmail-thread-actions { display: flex; gap: 8px; padding: 6px 0 14px 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-thread-actions { padding: 8px 16px 20px 62px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-thread-actions button { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 24px; border: 1px solid #dadce0; border-radius: 18px; background: #fff; color: #3c4043; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; } #ugf-gmail[chrome="m2018"] #ugf-gmail-thread-actions button:hover { background: #f1f3f4; } #ugf-gmail[chrome="m2018"] #ugf-gmail-thread-actions button svg { fill: #5f6368; width: 18px; height: 18px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-actions, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread > #ugf-gmail-subject { padding-left: 12px; padding-right: 12px; } #ugf-gmail-thread-foot { font-size: 12px; padding: 4px 0 16px 0; } /* danger banner, as Gmail shows on a flagged message */ .ugf-gmail-warn { background: #d93025; color: #fff; padding: 14px 16px; margin: 8px 0; border-radius: 4px; } .ugf-gmail-warn .t { font-size: 16px; font-weight: bold; margin-bottom: 4px; } .ugf-gmail-warn .b { font-size: 13px; } /* ---------- compose ---------- */ #ugf-gmail-compose-form { border: 1px solid #ccc; background: #fff; padding: 10px; margin-bottom: 12px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose-form, #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-form { position: fixed; right: 16px; bottom: 0; width: 500px; max-width: 90vw; box-shadow: 0 8px 24px rgba(0,0,0,.28); border-radius: 8px 8px 0 0; border: 0; padding: 0; z-index: 1200; } #ugf-gmail-compose-head { background: #404040; color: #fff; font-size: 13px; font-weight: bold; padding: 8px 12px; display: none; border-radius: 8px 8px 0 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose-head, #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-head { display: block; } #ugf-gmail-compose-form .field { display: flex; align-items: center; gap: 6px; border-bottom: 1px solid #eee; padding: 6px 12px; } #ugf-gmail-compose-form .field label { width: 60px; color: #777; font-size: 12px; } #ugf-gmail-compose-form input[type="text"] { flex: 1 1 auto; border: 0; outline: none; font: 13px arial, sans-serif; padding: 4px 0; } #ugf-gmail-msgbody { width: 100%; min-height: 220px; border: 0; outline: none; resize: vertical; font: 13px arial, sans-serif; padding: 10px 12px; } #ugf-gmail-compose-actions { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-top: 1px solid #eee; } #ugf-gmail-compose-status { font-size: 12px; color: #666; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose-actions button.send, #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-actions button.send { background: #1a73e8; color: #fff; border: 0; border-radius: 18px; height: 36px; padding: 0 24px; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-actions button.send { background: #d14836; border-radius: 2px; height: 32px; } /* ---------- settings ---------- */ #ugf-gmail-settings-tabs { display: flex; gap: 0; border-bottom: 1px solid #ddd; margin-bottom: 14px; flex-wrap: wrap; } #ugf-gmail-settings-tabs a { font-size: 12px; color: #00c; padding: 6px 10px; border: 1px solid transparent; border-bottom: 0; white-space: nowrap; } #ugf-gmail-settings-tabs a.active { color: #000; font-weight: bold; background: #fff; border-color: #ddd; border-radius: 2px 2px 0 0; margin-bottom: -1px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-settings-tabs a, #ugf-gmail[chrome="m2013"] #ugf-gmail-settings-tabs a { color: #5f6368; border: 0; border-bottom: 3px solid transparent; font-size: 13px; padding: 10px 16px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-settings-tabs a.active { color: #1a73e8; border-bottom-color: #1a73e8; background: none; border-radius: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-settings-tabs a.active { color: #d14836; border-bottom-color: #d14836; background: none; border-radius: 0; } .ugf-gmail-setting { display: flex; align-items: flex-start; gap: 16px; padding: 10px 6px; border-bottom: 1px solid #f1f1f1; font-size: 13px; } .ugf-gmail-setting .name { width: 200px; flex: 0 0 200px; text-align: right; font-weight: bold; color: #333; } .ugf-gmail-setting .value { flex: 1 1 auto; } .ugf-gmail-setting .value label { display: block; padding: 2px 0; } .ugf-gmail-setting .note { display: block; color: #777; font-size: 11px; margin-top: 4px; } #ugf-gmail-settings-actions { padding: 14px 6px; display: flex; gap: 8px; justify-content: center; } /* ---------- footer ---------- */ #ugf-gmail-footer { text-align: center; font-size: 11px; color: #777; padding: 18px 10px 30px 10px; border-top: 1px solid #eee; margin-top: 10px; } #ugf-gmail-footer .links { margin-top: 4px; } #ugf-gmail-footer .bar { width: 200px; height: 8px; background: #e0e0e0; margin: 6px auto 0 auto; border-radius: 1px; overflow: hidden; } #ugf-gmail-footer .bar i { display: block; height: 100%; background: #202124; } #ugf-gmail[chrome="classic"] #ugf-gmail-footer .bar i, #ugf-gmail[chrome="kennedy"] #ugf-gmail-footer .bar i { background: #4d90fe; } /* ---------- first-run notice ---------- */ #ugf-gmail-notice-scrim { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 2000; display: flex; align-items: center; justify-content: center; } #ugf-gmail-notice { background: #fff; width: 460px; max-width: 92vw; max-height: 88vh; overflow: auto; font: 13px arial, sans-serif; color: #222; } #ugf-gmail[chrome="classic"] ~ #ugf-gmail-notice-scrim #ugf-gmail-notice, #ugf-gmail-notice[chrome="classic"] { border: 1px solid #acacac; box-shadow: 0 2px 6px rgba(0,0,0,.4); } #ugf-gmail-notice[chrome="kennedy"] { border: 1px solid #acacac; border-radius: 2px; box-shadow: 0 4px 16px rgba(0,0,0,.2); } #ugf-gmail-notice[chrome="m2013"] { border-radius: 2px; box-shadow: 0 4px 16px rgba(0,0,0,.28); } #ugf-gmail-notice[chrome="m2018"] { border-radius: 8px; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); font-family: "Google Sans", Roboto, arial, sans-serif; } #ugf-gmail-notice .n-title { font-size: 16px; font-weight: bold; padding: 16px 20px 6px 20px; } #ugf-gmail-notice[chrome="m2018"] .n-title { font-weight: 500; font-size: 18px; } #ugf-gmail-notice .n-body { padding: 0 20px 12px 20px; line-height: 1.5; color: #444; } #ugf-gmail-notice .n-box { margin: 0 20px 14px 20px; border: 1px solid #e0e0e0; border-radius: 2px; background: #f8f9fa; } #ugf-gmail-notice[chrome="m2018"] .n-box { border-radius: 8px; } #ugf-gmail-notice .n-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-bottom: 1px solid #e8eaed; } #ugf-gmail-notice .n-row:last-child { border-bottom: 0; } #ugf-gmail-notice .n-row .n-label { flex: 1 1 auto; } #ugf-gmail-notice .n-row .n-label small { display: block; color: #777; font-size: 11px; margin-top: 2px; } #ugf-gmail-notice select { font: 12px arial, sans-serif; max-width: 220px; } #ugf-gmail-notice .n-actions { display: flex; justify-content: center; padding: 4px 20px 18px 20px; } #ugf-gmail-notice .n-close { font: bold 12px arial, sans-serif; padding: 6px 28px; cursor: pointer; background: linear-gradient(#fbfbfb, #e9e9e9); border: 1px solid #b5b5b5; border-radius: 2px; color: #333; } #ugf-gmail-notice[chrome="kennedy"] .n-close { background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; color: #fff; height: 29px; } #ugf-gmail-notice[chrome="m2013"] .n-close { background: #d14836; border: 0; color: #fff; text-transform: uppercase; padding: 8px 28px; } #ugf-gmail-notice[chrome="m2018"] .n-close { background: #1a73e8; border: 0; border-radius: 18px; color: #fff; font: 500 14px "Google Sans", Roboto, arial, sans-serif; padding: 0 28px; height: 36px; } /* the toggle switch in the notice */ .ugf-gmail-switch { position: relative; width: 34px; height: 14px; background: #bdc1c6; border-radius: 7px; cursor: pointer; flex: 0 0 34px; transition: background .15s; } .ugf-gmail-switch i { position: absolute; top: -3px; left: 0; width: 20px; height: 20px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.4); transition: left .15s; } .ugf-gmail-switch.on { background: #a8c7fa; } .ugf-gmail-switch.on i { left: 14px; background: #1a73e8; } /* text buttons in the viewer toolbar (Delete forever / Not spam) */ #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button.txt, #ugf-gmail[chrome="m2018"] #ugf-gmail-thread-bar button.txt, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar button.txt { height: 32px; padding: 0 14px; margin-right: 4px; border: 1px solid #dadce0; border-radius: 4px; background: #fff; color: #3c4043; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; width: auto; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button.txt { font: bold 11px arial, sans-serif; height: 28px; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); } #ugf-gmail #ugf-gmail-thread-bar button.txt:hover { background: #f1f3f4; } /* 2018 read rows carry Gmail's blue-grey, not a flat grey */ #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr { background: #f2f6fc; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr.unread { background: #fff; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo .gmail-line { display: flex; align-items: center; gap: 4px; } #ugf-gmail #ugf-gmail-logo .caret { color: #777; font-size: 11px; } /* settings buttons follow the era, not the browser default */ #ugf-gmail[chrome="kennedy"] #ugf-gmail-settings-actions button, #ugf-gmail[chrome="m2013"] #ugf-gmail-settings-actions button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; border-radius: 2px; height: 29px; padding: 0 14px; cursor: pointer; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-settings-save, #ugf-gmail[chrome="m2013"] #ugf-gmail-settings-save { background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff; } #ugf-gmail[chrome="m2013"] #ugf-gmail-settings-save { background: #d14836; border-color: #b0281a; } #ugf-gmail[chrome="m2018"] #ugf-gmail-settings-actions button { height: 36px; padding: 0 24px; border-radius: 4px; border: 1px solid #dadce0; background: #fff; color: #3c4043; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; } #ugf-gmail[chrome="m2018"] #ugf-gmail-settings-save { background: #1a73e8; border-color: #1a73e8; color: #fff; } /* Gmail only showed the action buttons once something was ticked */ #ugf-gmail-toolbar .sel-only { display: none; align-items: center; gap: 4px; } #ugf-gmail-toolbar.has-sel .sel-only { display: inline-flex; } #ugf-gmail #ugf-gmail-toolbar.has-sel .idle-only { display: none !important; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar { height: 42px; padding: 0 8px; gap: 6px; flex-wrap: nowrap; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar button, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; border-radius: 2px; height: 27px; padding: 0 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar button.sq, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar button.sq { width: 34px; padding: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar button svg, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar button svg { fill: #666; } #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar button:hover, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar button:hover { border-color: #c6c6c6; background: linear-gradient(#f8f8f8, #f1f1f1); box-shadow: 0 1px 1px rgba(0,0,0,.1); } .ugf-gmail-selectall.btn { height: 27px; padding: 0 6px 0 8px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); } #ugf-gmail[chrome="m2013"] #ugf-gmail-count, #ugf-gmail[chrome="kennedy"] #ugf-gmail-count { font-size: 12px; color: #666; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar button, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-actions button, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-actions button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; border-radius: 2px; height: 27px; padding: 0 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button.sq, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar button.sq { width: 34px; padding: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button svg, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar button svg { fill: #666; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar button:hover, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar button:hover, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-actions button:hover, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-actions button:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar { gap: 6px; height: 42px; padding: 0 8px; } /* buttons sit in joined groups on the 2011-2017 skins */ #ugf-gmail[chrome="m2013"] #ugf-gmail-toolbar .grp, #ugf-gmail[chrome="kennedy"] #ugf-gmail-toolbar .grp, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-bar .grp, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-bar .grp, #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-nav .grp, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-nav .grp { display: inline-flex; margin-right: 10px; } #ugf-gmail .grp > button, #ugf-gmail .grp > .ugf-gmail-selectall { border-radius: 0 !important; margin: 0 0 0 -1px !important; } #ugf-gmail .grp > button:first-child, #ugf-gmail .grp > .ugf-gmail-selectall:first-child { border-radius: 2px 0 0 2px !important; margin-left: 0 !important; } #ugf-gmail .grp > button:last-child, #ugf-gmail .grp > .ugf-gmail-selectall:last-child { border-radius: 0 2px 2px 0 !important; } #ugf-gmail .grp > button:only-child, #ugf-gmail .grp > .ugf-gmail-selectall:only-child { border-radius: 2px !important; } #ugf-gmail .grp > button:hover { position: relative; z-index: 1; } #ugf-gmail button .dd { font-style: normal; font-size: 9px; color: #777; margin-left: 5px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-nav, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-nav { gap: 10px; font-size: 12px; color: #666; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-nav b, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-nav b { color: #333; font-weight: normal; } #ugf-gmail[chrome="m2013"] #ugf-gmail-thread-nav b, #ugf-gmail[chrome="kennedy"] #ugf-gmail-thread-nav b { margin-right: 4px; } /* square sender avatar and the joined reply control, as the 2014 template draws them */ .ugf-gmail-avatar.sq, #ugf-gmail[chrome="m2013"] .ugf-gmail-avatar, #ugf-gmail[chrome="kennedy"] .ugf-gmail-avatar { border-radius: 2px; background: #eee; color: #bbb; border: 1px solid #e0e0e0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg { border: 0; border-bottom: 1px solid #ebebeb; margin: 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-head, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-head { border-bottom: 0; padding: 14px 0 4px 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-body, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-body { padding: 8px 0 20px 46px; } .ugf-gmail-msg-right .starout { color: #ccc; font-size: 16px; margin: 0 4px; } #ugf-gmail-replybox { display: flex; align-items: flex-start; gap: 10px; padding: 16px 0 20px 0; } #ugf-gmail-replybox .box { flex: 1 1 auto; border: 1px solid #e0e0e0; border-radius: 2px; padding: 14px 16px; min-height: 74px; color: #999; font-size: 13px; } #ugf-gmail-replybox .box a { color: #999; text-decoration: underline; } #ugf-gmail-replybox .box a:hover { color: #333; } /* the 2014 footer runs in three columns */ #ugf-gmail[chrome="m2013"] #ugf-gmail-footer, #ugf-gmail[chrome="kennedy"] #ugf-gmail-footer { display: flex; justify-content: space-between; align-items: flex-start; text-align: left; border-top: 1px solid #ebebeb; color: #222; font-size: 11px; padding: 14px 16px 30px 30px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-footer .mid, #ugf-gmail[chrome="kennedy"] #ugf-gmail-footer .mid { text-align: center; } #ugf-gmail[chrome="m2013"] #ugf-gmail-footer .right, #ugf-gmail[chrome="kennedy"] #ugf-gmail-footer .right { text-align: right; color: #555; } #ugf-gmail[chrome="m2013"] #ugf-gmail-footer .bar, #ugf-gmail[chrome="kennedy"] #ugf-gmail-footer .bar { display: none; } /* the reply control beside a message wears the same grey button as the toolbar */ #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-right button, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-right button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; height: 27px; padding: 0 8px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-right button.sq, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-right button.sq { width: 34px; padding: 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-right button svg, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-right button svg { fill: #666; } #ugf-gmail[chrome="m2013"] .ugf-gmail-msg-right button:hover, #ugf-gmail[chrome="kennedy"] .ugf-gmail-msg-right button:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); } /* header proportions measured off the 2014 template */ #ugf-gmail[chrome="m2013"] #ugf-gmail-logo img.google-mark { height: 26px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-gmark { padding-left: 30px; height: 46px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose { width: 117px; margin-left: 30px; line-height: 32px; } /* ---------- the Google bar, one variant per era ---------- */ #ugf-gmail-gbar { display: flex; align-items: center; justify-content: space-between; font: 13px arial, sans-serif; } #ugf-gmail-gbar .left, #ugf-gmail-gbar .right { display: flex; align-items: center; } #ugf-gmail-gbar .sepr { color: #ccc; margin: 0 8px; } /* 2007-2009: plain blue links on white */ #ugf-gmail-gbar.plain { background: #fff; border-bottom: 1px solid #e5e5e5; padding: 3px 10px 5px 10px; font-size: 13px; } #ugf-gmail-gbar.plain .left { gap: 11px; } #ugf-gmail-gbar.plain a { color: #00c; text-decoration: underline; } #ugf-gmail-gbar.plain a.here, #ugf-gmail-gbar.g2010 a.here { color: #000; font-weight: bold; text-decoration: none; } #ugf-gmail-gbar.plain .who, #ugf-gmail-gbar.g2010 .who { color: #00c; font-weight: bold; } /* 2010: the white bar with the blue rule over the current product */ #ugf-gmail-gbar.g2010 { background: linear-gradient(#fff, #fafafa); border-bottom: 1px solid #e5e5e5; padding: 0 10px; height: 29px; } #ugf-gmail-gbar.g2010 .left { gap: 13px; height: 29px; } #ugf-gmail-gbar.g2010 a { color: #00c; line-height: 29px; height: 29px; border-top: 3px solid transparent; box-sizing: border-box; } #ugf-gmail-gbar.g2010 a.here { border-top-color: #4d90fe; } #ugf-gmail-gbar.g2010 .gear svg, #ugf-gmail-gbar.plain .gear svg { fill: #444; display: block; margin-left: 8px; } /* Nov 2011 onward: the dark strip */ #ugf-gmail #ugf-gmail-gbar.dark { background: #282828; height: 29px; padding: 0 14px; color: #ccc; justify-content: space-between; } #ugf-gmail #ugf-gmail-gbar.dark .left { gap: 13px; height: 29px; overflow: hidden; } #ugf-gmail #ugf-gmail-gbar.dark a { color: #ccc; font-size: 13px; line-height: 29px; height: 29px; border-top: 3px solid transparent; box-sizing: border-box; white-space: nowrap; } #ugf-gmail #ugf-gmail-gbar.dark a:hover { color: #fff; text-decoration: none; } #ugf-gmail #ugf-gmail-gbar.dark a.here { color: #fff; font-weight: bold; border-top-color: #dd4b39; } #ugf-gmail #ugf-gmail-gbar.dark a.plus { color: #fff; } #ugf-gmail #ugf-gmail-gbar.dark .right { color: #fff; font-size: 13px; gap: 10px; } #ugf-gmail #ugf-gmail-gbar.dark .who { font-weight: bold; cursor: pointer; } #ugf-gmail #ugf-gmail-gbar.dark .gear { cursor: pointer; display: inline-flex; } #ugf-gmail #ugf-gmail-gbar.dark .gear svg { fill: #ccc; display: block; } /* late 2012 to 2015: the +You bar - bold grey links, the current one white */ #ugf-gmail #ugf-gmail-gbar.dark.late { padding: 0 4px; background: #2d2d2d; } #ugf-gmail #ugf-gmail-gbar.dark.late .left { gap: 0; } #ugf-gmail #ugf-gmail-gbar.dark.late a { font-weight: bold; color: #bbb; border-top: 0; padding: 0 9px; } #ugf-gmail #ugf-gmail-gbar.dark.late a.here, #ugf-gmail #ugf-gmail-gbar.dark.late a:hover { color: #fff; } #ugf-gmail #ugf-gmail-gbar.dark.late a.plus { color: #bbb; } /* ---------- compose buttons taken from the reference shots ---------- */ #ugf-gmail-compose.shot { display: block; padding: 0; background: none !important; border: 0 !important; box-shadow: none !important; line-height: 0; width: auto !important; } #ugf-gmail-compose.shot:hover { opacity: .9; text-decoration: none; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose.shot img { height: 29px; width: auto; display: block; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-compose.shot img { height: 26px; width: auto; display: block; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose.shot img { height: 50px; width: auto; display: block; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose.shot { margin: 0 0 16px 30px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-compose.shot { margin: 4px 0 14px 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose.shot { margin: 6px 0 14px 12px; } /* ---------- 2011 header, measured off the screenshot ---------- */ #ugf-gmail[chrome="kennedy"] #ugf-gmail-top { background: #f1f1f1; border-bottom: 1px solid #e5e5e5; align-items: center; padding: 12px 14px; gap: 18px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-logo { flex: 0 0 auto; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-searchrow { flex: 1 1 auto; padding: 0; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k { display: flex; align-items: center; gap: 8px; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k input { width: 300px; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 2px; padding: 0 8px; font-size: 13px; background: #fff; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k button { height: 29px; padding: 0 14px; font: bold 11px arial, sans-serif; letter-spacing: .3px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-account { flex: 0 0 auto; font-size: 11px; line-height: 15px; text-align: left; padding-top: 0; } #ugf-gmail-navtitle { color: #dd4b39; font-weight: bold; font-size: 13px; padding: 0 0 6px 0; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-nav { width: 176px; flex: 0 0 176px; padding: 12px 14px 20px 14px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-nav a.active { background: none; color: #dd4b39; font-weight: bold; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k button { white-space: nowrap; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-searchrow { flex: 0 0 auto; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k .klinks { display: flex; flex-direction: column; margin-left: 6px; line-height: 15px; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k .klinks a { font-size: 11px; white-space: nowrap; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k > * { flex: 0 0 auto; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k input { width: 280px; flex: 0 0 280px; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-top { justify-content: flex-start; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-account:empty { display: none; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k button { width: auto; flex: 0 0 auto; border-radius: 2px; border-left-width: 1px; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k input { border-right: 1px solid #d9d9d9; border-radius: 2px; } #ugf-gmail-account:empty { display: none; } /* ---------- 2014 header/sidebar columns, measured off the template ---------- logo 31, sidebar column 200 wide, search control 202 -> 852 (input + 60px button), COMPOSE and the label text both starting at 31. */ #ugf-gmail[chrome="m2013"] #ugf-gmail-top { justify-content: flex-start; gap: 0; padding: 14px 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo { flex: 0 0 200px; width: 200px; padding-left: 31px; margin: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-searchrow { flex: 0 1 650px; width: 650px; max-width: 650px; margin: 0; padding: 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield { width: 100%; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield input { flex: 1 1 auto; min-width: 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield button { flex: 0 0 60px; width: 60px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-account { flex: 1 1 auto; padding-right: 16px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav { width: 200px; flex: 0 0 200px; padding: 0 0 20px 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-gmark { padding-left: 31px; margin: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose.shot { margin: 0 0 16px 31px !important; } /* 2012-2013 have no Gmail wordmark row above the button, so it sat flush against the top of the sidebar; give it the breathing room it had */ html[layout="2013"] #ugf-gmail[chrome="m2013"] #ugf-gmail-compose.shot, html[layout="2013L"] #ugf-gmail[chrome="m2013"] #ugf-gmail-compose.shot { margin-top: 8px !important; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a { padding: 0 8px 0 26px; border-left: 5px solid transparent; margin: 0; } #ugf-gmail[chrome="m2013"] #ugf-gmail-main { padding: 0 16px 20px 0; margin: 0; } /* the compose anchor lives inside the nav, so it was picking up the label indent */ #ugf-gmail #ugf-gmail-compose.shot { padding: 0 !important; border-left: 0 !important; } #ugf-gmail[chrome="m2013"] #ugf-gmail-nav a#ugf-gmail-compose { padding: 0 !important; } /* the browser's default body margin was shifting every column by 8px */ html[gplex-gmail] body { margin: 0 !important; padding: 0 !important; } /* ---------- search rows, measured off the three reference shots ---------- pre-2011: the field abuts the first button, 10px before the second 2011-12 : ~10px between field, SEARCH MAIL and SEARCH THE WEB 2013-17 : the field carries a caret, and the blue button sits detached to its right */ #ugf-gmail[chrome="classic"] .ugf-gmail-searchfield.c { display: inline-flex; align-items: stretch; gap: 0; } #ugf-gmail[chrome="classic"] .ugf-gmail-searchfield.c input { width: 340px; height: 22px; margin: 0; border: 1px solid #a9a9a9; border-top-color: #7a7a7a; border-right: 0; } #ugf-gmail[chrome="classic"] .ugf-gmail-searchfield.c button { height: 22px; min-height: 22px; margin: 0; white-space: nowrap; } #ugf-gmail[chrome="classic"] .ugf-gmail-searchfield.c button#ugf-gmail-searchweb { margin-left: 10px; } #ugf-gmail[chrome="kennedy"] .ugf-gmail-searchfield.k { gap: 10px; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield { display: flex; align-items: stretch; gap: 16px; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield .box { flex: 1 1 auto; display: flex; align-items: center; background: #fff; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 2px; min-width: 0; height: 32px; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield .box input { flex: 1 1 auto; border: 0 !important; height: 30px; background: none; outline: none; min-width: 0; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield .box .opts { color: #999; font-size: 11px; padding: 0 8px; cursor: pointer; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield .box:focus-within { border-color: #4d90fe; } #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield button { border-radius: 2px; flex: 0 0 60px; width: 60px; height: 32px; } /* ---------- selecting a row ---------- */ .ugf-gmail-check { cursor: pointer; } #ugf-gmail-list tr:hover { background: #f5f5f5; } #ugf-gmail-list tr.unread:hover { background: #fafafa; } #ugf-gmail #ugf-gmail-list tr.checked, #ugf-gmail #ugf-gmail-list tr.checked:hover { background: #fff9c4 !important; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr.checked, #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr.checked:hover { background: #fef7e0 !important; } /* the 2015 search button is far wider than the 2014 template's - matched to the crop */ #ugf-gmail[chrome="m2013"] .ugf-gmail-searchfield button { flex: 0 0 124px; width: 124px; } /* settings tables, labs rows and theme swatches */ .ugf-gmail-labeltable { border-collapse: collapse; width: 100%; max-width: 560px; } .ugf-gmail-labeltable th { text-align: left; font-size: 11px; color: #666; border-bottom: 1px solid #e5e5e5; padding: 4px 6px; font-weight: bold; } .ugf-gmail-labeltable td { padding: 4px 6px; border-bottom: 1px solid #f1f1f1; font-size: 12px; } .ugf-gmail-lab { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 6px 0; border-bottom: 1px solid #f1f1f1; max-width: 560px; } .ugf-gmail-lab span { display: flex; gap: 12px; white-space: nowrap; } .ugf-gmail-lab label { display: inline !important; } .ugf-gmail-themes { display: flex; flex-wrap: wrap; gap: 10px; max-width: 560px; } .ugf-gmail-themes .theme { width: 84px; font-size: 11px; text-align: center; cursor: pointer; } .ugf-gmail-themes .theme i { display: block; height: 52px; border: 1px solid #ccc; background: linear-gradient(#fff, #e8eaed); margin-bottom: 3px; } .ugf-gmail-themes .theme.on i { border: 2px solid #4d90fe; } .ugf-gmail-setting .value select { font: 12px arial, sans-serif; padding: 2px; } .ugf-gmail-setting .value input[type="text"] { font: 12px arial, sans-serif; padding: 3px 5px; border: 1px solid #c0c0c0; } /* ---------- 2018 details taken from the screenshot ---------- */ #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield .box { flex: 1 1 auto; display: flex; align-items: center; min-width: 0; order: 2; } #ugf-gmail[chrome="m2018"] .ugf-gmail-searchfield .box .opts { order: 3; margin-left: auto; color: #5f6368; font-size: 12px; padding: 0 12px; cursor: pointer; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav { background: #f1f3f4; } #ugf-gmail[chrome="m2018"] #ugf-gmail-body { background: #fff; } #ugf-gmail[chrome="m2018"] button.icon.cap { width: auto; padding: 0 6px; border-radius: 18px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-count { margin-left: auto; margin-right: 4px; } /* importance marker */ .ugf-gmail-imp { width: 20px; text-align: center; color: #dadce0; font-size: 15px; } .ugf-gmail-imp.on { color: #f4b400; } /* the action icons Gmail reveals when a row is hovered */ .ugf-gmail-date .hover { display: none; align-items: center; gap: 2px; justify-content: flex-end; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr:hover .ugf-gmail-date .hover { display: flex; } #ugf-gmail[chrome="m2018"] #ugf-gmail-list tr:hover .ugf-gmail-date .d { display: none; } #ugf-gmail[chrome="m2018"] .ugf-gmail-date { width: 180px; } #ugf-gmail[chrome="m2018"] .ugf-gmail-date .hover button.icon { width: 34px; height: 34px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-footer { border-top: 0; color: #5f6368; font-size: 12px; padding-top: 24px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-footer .bar { width: 210px; height: 9px; background: #e0e0e0; border-radius: 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-footer .bar i { background: #202124; } /* the rest of the dark bar: +You, Share, notifications, gear */ #ugf-gmail #ugf-gmail-gbar.dark { justify-content: space-between; } #ugf-gmail #ugf-gmail-gbar.dark .left { gap: 13px; overflow: hidden; } #ugf-gmail #ugf-gmail-gbar.dark a.plus { font-weight: bold; color: #fff; } #ugf-gmail #ugf-gmail-gbar.dark .gbtn { background: #4d90fe; border: 1px solid #3079ed; border-radius: 2px; color: #fff; font-size: 11px; font-weight: bold; padding: 3px 10px; cursor: pointer; } #ugf-gmail #ugf-gmail-gbar.dark .gbell { position: relative; display: inline-flex; align-items: center; background: #5c5c5c; border-radius: 2px; padding: 3px 6px; cursor: pointer; } #ugf-gmail #ugf-gmail-gbar.dark .gbell svg { fill: #ccc; display: block; } #ugf-gmail #ugf-gmail-gbar.dark .gbell .n { font-style: normal; font-size: 10px; color: #fff; margin-left: 4px; } #ugf-gmail #ugf-gmail-gbar.dark .gear { cursor: pointer; display: inline-flex; } #ugf-gmail #ugf-gmail-gbar.dark .who { cursor: pointer; } /* on the 2013 skin the bar sits above the header band */ #ugf-gmail[chrome="m2013"] #ugf-gmail-gbar.dark { padding: 0 14px; } /* ---------- 2004-2008 kept plain square buttons; the bevelled ones came in 2009 ---------- */ #ugf-gmail[skin="g2004"] button, #ugf-gmail[skin="g2006"] button, #ugf-gmail[skin="g2007"] button { background: #e8e8e8 !important; border: 1px solid #b0b0b0 !important; border-top-color: #d8d8d8 !important; border-left-color: #d8d8d8 !important; border-radius: 0 !important; box-shadow: none !important; color: #000 !important; font: 11px arial, sans-serif !important; padding: 1px 7px !important; min-height: 20px; text-shadow: none !important; } #ugf-gmail[skin="g2004"] button:active, #ugf-gmail[skin="g2006"] button:active, #ugf-gmail[skin="g2007"] button:active { border-color: #808080 !important; background: #dcdcdc !important; } #ugf-gmail[skin="g2004"] input[type="text"], #ugf-gmail[skin="g2006"] input[type="text"], #ugf-gmail[skin="g2007"] input[type="text"] { border: 1px solid #7f9db9 !important; border-radius: 0 !important; } #ugf-gmail[skin="g2004"] #ugf-gmail-list tr, #ugf-gmail[skin="g2006"] #ugf-gmail-list tr, #ugf-gmail[skin="g2007"] #ugf-gmail-list tr { background: #f5f5f5; } #ugf-gmail[skin="g2004"] #ugf-gmail-list tr.unread, #ugf-gmail[skin="g2006"] #ugf-gmail-list tr.unread, #ugf-gmail[skin="g2007"] #ugf-gmail-list tr.unread { background: #fff; } /* ---------- the classic header sits left, not pinned to the window edge ---------- */ #ugf-gmail[chrome="classic"] #ugf-gmail-top { justify-content: flex-start; align-items: flex-start; gap: 0; padding: 8px 0 6px 0; } #ugf-gmail[chrome="classic"] #ugf-gmail-logo { flex: 0 0 176px; width: 176px; padding-left: 10px; } #ugf-gmail[chrome="classic"] #ugf-gmail-searchrow { flex: 0 0 auto; padding: 6px 0 0 0; } #ugf-gmail[chrome="classic"] #ugf-gmail-account { flex: 1 1 auto; padding: 6px 12px 0 16px; text-align: right; } #ugf-gmail[chrome="classic"] #ugf-gmail-nav { width: 176px; flex: 0 0 176px; } #ugf-gmail[chrome="classic"] .ugf-gmail-searchlinks { display: inline-flex; flex-direction: column; vertical-align: middle; line-height: 14px; margin-left: 8px; } /* ---------- pager ---------- */ #ugf-gmail-count .pager { margin-left: 12px; display: inline-flex; gap: 10px; align-items: center; } #ugf-gmail-count .pager a { font-size: 11px; white-space: nowrap; } #ugf-gmail-count .pager.grp { gap: 0; margin-left: 8px; } #ugf-gmail-count .pager button[disabled] { opacity: .4; cursor: default; } /* ---------- the account cluster in the header ---------- */ #ugf-gmail-account { display: flex; align-items: center; gap: 10px; justify-content: flex-end; } #ugf-gmail-account .pfp { width: 28px; height: 28px; border-radius: 2px; display: block; object-fit: cover; } #ugf-gmail-account .pfp.letter { background: #c62828; color: #fff; font-size: 15px; display: flex; align-items: center; justify-content: center; text-transform: uppercase; } /* 2012-2014: +Name, a count box, Share, then the photo with a caret */ #ugf-gmail-account .plusname { color: #666; font-size: 13px; } #ugf-gmail-account .nbox { min-width: 26px; height: 26px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #777; font-size: 12px; display: inline-flex; align-items: center; justify-content: center; padding: 0 6px; } #ugf-gmail-account .sharebtn { height: 26px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font-size: 12px; display: inline-flex; align-items: center; gap: 5px; padding: 0 10px; cursor: pointer; } #ugf-gmail-account .sharebtn b { font-size: 14px; font-weight: normal; color: #777; } #ugf-gmail-account .pfpwrap { display: inline-flex; align-items: center; gap: 3px; border: 1px solid #dcdcdc; border-radius: 2px; padding: 1px 4px 1px 1px; background: #fff; cursor: pointer; } #ugf-gmail-account .pfpwrap .car { font-style: normal; color: #777; font-size: 9px; } /* 2015+: the links, the app grid, the round photo */ #ugf-gmail-account .ic { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer; position: relative; } #ugf-gmail-account .ic:hover { background: rgba(0,0,0,.05); } #ugf-gmail-account .ic svg { fill: #5f6368; } #ugf-gmail-account .ic.bell .n { position: absolute; top: 2px; right: 1px; background: #d93025; color: #fff; font-style: normal; font-size: 10px; line-height: 14px; min-width: 14px; text-align: center; border-radius: 7px; } #ugf-gmail[chrome="m2013"] #ugf-gmail-account a { color: #444; font-size: 13px; } #ugf-gmail-account.grid .pfp { border-radius: 50%; width: 32px; height: 32px; } #ugf-gmail-account.g\+ .pfp { border-radius: 1px; width: 24px; height: 24px; } /* 2014: the square app grid in the +Name block, no round hover */ #ugf-gmail-account.g\+ .ic.grid { width: 30px; height: 30px; border-radius: 0; } #ugf-gmail-account.g\+ .ic.grid:hover { background: transparent; } #ugf-gmail-account.g\+ .ic.grid svg { fill: #666; } #ugf-gmail-account.g\+ .ic.grid:hover svg { fill: #333; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-account, #ugf-gmail[chrome="m2013"] #ugf-gmail-account { flex: 1 1 auto; padding-right: 14px; } #ugf-gmail-gmark img { height: 26px; width: auto; display: block; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo img.gmail-mark { height: 40px; } /* ---------- account dropdown ---------- */ #ugf-gmail-accfence { position: fixed; inset: 0; z-index: 1400; } #ugf-gmail-accmenu { position: absolute; width: 300px; z-index: 1401; background: #fff; font: 13px arial, sans-serif; color: #222; border: 1px solid #ccc; box-shadow: 0 2px 10px rgba(0,0,0,.2); } #ugf-gmail-accmenu[chrome="m2018"] { border: 0; border-radius: 12px; box-shadow: 0 4px 16px rgba(0,0,0,.2), 0 0 0 1px rgba(0,0,0,.05); font-family: "Google Sans", Roboto, arial, sans-serif; overflow: hidden; } #ugf-gmail-accmenu[chrome="m2013"] { border-color: #ccc; border-radius: 2px; box-shadow: 0 2px 10px rgba(0,0,0,.2); } #ugf-gmail-accmenu .head { display: flex; gap: 12px; padding: 16px; border-bottom: 1px solid #eee; align-items: flex-start; } #ugf-gmail-accmenu .head img, #ugf-gmail-accmenu .head .letter { width: 64px; height: 64px; border-radius: 2px; flex: 0 0 64px; object-fit: cover; display: block; } #ugf-gmail-accmenu[chrome="m2018"] .head img, #ugf-gmail-accmenu[chrome="m2018"] .head .letter, #ugf-gmail-accmenu[chrome="m2013"] .head img, #ugf-gmail-accmenu[chrome="m2013"] .head .letter { border-radius: 50%; } #ugf-gmail-accmenu .head .letter { background: #c62828; color: #fff; font-size: 30px; display: flex; align-items: center; justify-content: center; text-transform: uppercase; } #ugf-gmail-accmenu .meta { min-width: 0; display: flex; flex-direction: column; gap: 2px; } #ugf-gmail-accmenu .meta b { font-size: 14px; } #ugf-gmail-accmenu .meta span { color: #777; font-size: 12px; overflow: hidden; text-overflow: ellipsis; } #ugf-gmail-accmenu .meta a { font-size: 12px; margin-top: 6px; color: #1a73e8; } #ugf-gmail-accmenu .acts { display: flex; gap: 8px; padding: 12px 16px; background: #fafafa; border-bottom: 1px solid #eee; } #ugf-gmail-accmenu .acts a { flex: 1 1 auto; text-align: center; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px arial, sans-serif; line-height: 25px; text-decoration: none; } #ugf-gmail-accmenu .acts a:hover { border-color: #c6c6c6; text-decoration: none; } #ugf-gmail-accmenu[chrome="m2018"] .acts a { border-radius: 18px; font: 500 13px "Google Sans", Roboto, arial, sans-serif; line-height: 32px; background: #fff; } #ugf-gmail-accmenu .foot { display: flex; gap: 14px; justify-content: center; padding: 10px 16px; font-size: 11px; } #ugf-gmail-accmenu .foot a { color: #777; } #ugf-gmail[skin="g2004"] ~ #ugf-gmail-accmenu, #ugf-gmail-accmenu[chrome="classic"] { border-radius: 0; } /* ---------- the 2014/2015 header was clipping the logo's descender ---------- */ #ugf-gmail[chrome="m2013"] #ugf-gmail-top, #ugf-gmail[chrome="m2013"] #ugf-gmail-logo { overflow: visible; } #ugf-gmail[chrome="m2013"] #ugf-gmail-logo img.google-mark { height: 31px; width: 90px; max-height: none; align-self: center; } #ugf-gmail #ugf-gmail-logo img { max-height: none; } /* ---------- 2018: the whole left column is grey, the pill drawn not cropped ---------- */ #ugf-gmail[chrome="m2018"] #ugf-gmail-top { background: #f1f3f4; } #ugf-gmail[chrome="m2018"] #ugf-gmail-logo { background: #f1f3f4; } #ugf-gmail[chrome="m2018"] #ugf-gmail-body { border-top: 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-nav { background: #f1f3f4; padding-top: 8px; } #ugf-gmail[chrome="m2018"] #ugf-gmail-main { background: #fff; border-left: 0; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose.pill { display: inline-flex; align-items: center; gap: 12px; height: 48px; border-radius: 24px; background: #fff; color: #3c4043; font: 500 14px "Google Sans", Roboto, arial, sans-serif; box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15); padding: 0 24px 0 16px; margin: 6px 0 14px 12px; text-decoration: none; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose.pill:hover { background: #fafafb; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15); text-decoration: none; } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose.pill img.plus { width: 22px; height: 22px; display: block; } /* ---------- compose buttons follow the era ---------- */ #ugf-gmail[chrome="m2018"] #ugf-gmail-compose-actions button, #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-actions button { height: 36px; padding: 0 20px; border-radius: 4px; border: 1px solid #dadce0; background: #fff; color: #3c4043; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; } #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-actions button { border-radius: 2px; font: bold 11px arial, sans-serif; height: 29px; background: linear-gradient(#f5f5f5, #f1f1f1); } #ugf-gmail[chrome="m2018"] #ugf-gmail-compose-actions button:hover, #ugf-gmail[chrome="m2013"] #ugf-gmail-compose-actions button:hover { background: #f1f3f4; } #ugf-gmail[chrome="kennedy"] #ugf-gmail-compose-actions button { font: bold 11px arial, sans-serif; color: #444; background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid #dcdcdc; border-radius: 2px; height: 27px; padding: 0 12px; cursor: pointer; } /* ---------- the app launcher, ported from the google.com grid ---------- */ #ugf-gmail-movemenu { position: fixed; z-index: 1402; min-width: 164px; max-height: 320px; overflow-y: auto; background: #fff; border: 1px solid #ccc; box-shadow: 0 2px 6px rgba(0,0,0,.2); font: 13px arial, sans-serif; padding: 4px 0; } #ugf-gmail-movemenu .head { padding: 4px 14px 6px; color: #777; font-size: 11px; letter-spacing: .04em; text-transform: uppercase; } #ugf-gmail-movemenu a { display: block; padding: 5px 14px; color: #222; text-decoration: none; white-space: nowrap; } #ugf-gmail-movemenu a:hover { background: #eee; } #ugf-gmail-movemenu .none { padding: 6px 14px; color: #888; } #ugf-gmail-movemenu[chrome="classic"] { border: 1px solid #a2bdf0; box-shadow: none; padding: 2px 0; } #ugf-gmail-movemenu[chrome="classic"] .head { color: #666; } #ugf-gmail-movemenu[chrome="classic"] a:hover { background: #c3d9ff; } #ugf-gmail-movemenu[chrome="m2018"] { border: 0; border-radius: 4px; box-shadow: 0 2px 10px rgba(0,0,0,.25); font-family: Roboto, arial, sans-serif; padding: 8px 0; } #ugf-gmail-movemenu[chrome="m2018"] a { padding: 7px 18px; } #ugf-gmail-appsmenu { position: absolute; z-index: 1401; font: 13px arial, sans-serif; } #ugf-gmail-appsmenu #gp-apps-dd-card { scrollbar-width: none; background: #fff; padding: 28px 28px 12px 28px; border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 10px rgba(0,0,0,.2); cursor: auto; overflow-y: auto; overscroll-behavior: contain; /* three 88px columns - the same as google.com's own card */ width: 264px; max-height: 442px; box-sizing: content-box; } #ugf-gmail-appsmenu #gp-apps-dd-card::-webkit-scrollbar { width: 0; } #ugf-gmail-appsmenu[chrome="m2018"] #gp-apps-dd-card { border-radius: 8px; } .sector { display: flex; flex-wrap: wrap; /* centre the rows: the card is wider than three columns on some browsers, and without this the whole grid hugged the left edge */ justify-content: center; } .sector:nth-child(1) { padding-bottom: 28px; border-bottom: 1px solid #ebebeb; } .sector:nth-child(2), .sector:nth-child(3) { padding-top: 28px; } #even-more { color: #737373 !important; font-size: 13px; font-family: arial, sans-serif !important; text-decoration: none !important; margin: 0 auto; } #even-more:hover { text-decoration: underline !important; } .gp-app { width: 86px; height: 100px; font-size: 13px; font-family: arial, sans-serif !important; padding: 1px; } .gp-app-inner { text-decoration: none !important; margin: 7px 0; height: 86px; display: block; border: 1px solid transparent; border-radius: 2px; } .gp-app:hover .gp-app-inner { border: 1px solid #e5e5e5; background: rgba(255,255,255,.9); } .gp-app-icon { background-image: url(https://ssl.gstatic.com/gb/images/v1_76783e20.png); -webkit-background-size: 92px 2541px; background-size: 92px 2541px; } #myaccount .gp-app-icon { background-position: 0 -1451px; } #google-search .gp-app-icon { background-position: -17px -207px; } #maps .gp-app-icon { background-position: 0 -450px; } #youtube .gp-app-icon { background-position: 0 0; } #play .gp-app-icon { background-position: 0 -1779px; } #news .gp-app-icon { background-position: 0 -1990px; } #envelope .gp-app-icon { background-position: 0 -1710px; } #drive .gp-app-icon { background-position: 0 -138px; } #calendar .gp-app-icon { background-position: 0 -2059px; } #plus .gp-app-icon { background-position: 0 -938px; } #translate .gp-app-icon { background-position: 0 -693px; } #photos .gp-app-icon { background-position: 0 -1145px; } #shopping .gp-app-icon { background-position: 0 -1352px; } #wallet .gp-app-icon, #finance .gp-app-icon { background-image: url(https://ssl.gstatic.com/gb/images/p1_a4541be8.png); -webkit-background-size: 64px 2065px; background-size: 64px 2065px; background-position: 0 -966px; } #finance .gp-app-icon { background-position: 0 -1725px; } #docs .gp-app-icon { background-position: 0 -1214px; } #books .gp-app-icon { background-position: 0 -554px; } #blogger .gp-app-icon { background-position: 0 -1007px; } #contacts .gp-app-icon { background-position: 0 -69px; } #hangouts .gp-app-icon { background-position: 0 -2335px; } #chrome .gp-app-icon { background-image: url("${UGF_CHROME_ICON_2011}"); /* the same 64px box as every other icon, with the logo drawn at the sheet's 48px glyph size - a 56px box with an 8px offset left it oversized, and the offset got lost in one copy of this rule, lifting the label out of line */ background-size: 48px 48px; background-position: center; background-repeat: no-repeat; margin-top: 0; width: 64px !important; height: 64px !important; } [layout^="2016"] #chrome .gp-app-icon, [layout^="2018"] #chrome .gp-app-icon, [layout="2019"] #chrome .gp-app-icon, [layout="2022"] #chrome .gp-app-icon { background-image: url("${UGF_CHROME_ICON_2014}"); } .gp-app-icon { margin: 0 auto; height: 64px; width: 64px; } .gp-app-title { width: fit-content; margin: 0 auto; color: #404040 !important; text-decoration: none !important; } #ugf-gmail-appsmenu .gp-app-title { width: fit-content; margin: 0 auto; color: #404040 !important; text-decoration: none !important; text-align: center; } #ugf-gmail-appsmenu .gp-app-icon { margin: 0 auto; height: 64px; width: 64px; } /* late 2012-2013: no name on the bar, text centred, and selection is just the highlight - the red rule over the current product belongs to the 2011 bar */ #ugf-gmail #ugf-gmail-gbar.dark.late a { border-top: 0; line-height: 29px; display: inline-flex; align-items: center; height: 29px; } #ugf-gmail #ugf-gmail-gbar.dark.late a.here { border-top-color: transparent; color: #fff; font-weight: bold; } #ugf-gmail #ugf-gmail-gbar.dark.late .left { align-items: center; } .ugf-gmail-empty td { color: #777; padding: 18px 8px !important; font-style: normal; white-space: normal !important; } /* ---------- the holding screen ---------- */ html[gplex-gmail-loading] body > *:not(#ugf-gmail-loading):not(#ugf-gmail):not(#ugf-gmail-styles):not(script):not(style) { display: none !important; } html[gplex-gmail-loading], html[gplex-gmail-loading] body { background: #fff !important; } #ugf-gmail-loading { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: #fff; display: flex; align-items: center; justify-content: center; z-index: 2147483000; } #ugf-gmail-loading i { width: 28px; height: 28px; border: 3px solid #e8eaed; border-top-color: #9aa0a6; border-radius: 50%; display: block; animation: ugfGmailSpin .8s linear infinite; } @keyframes ugfGmailSpin { to { transform: rotate(360deg); } } /* ---------- take over the page ---------- */ html[gplex-gmail] body > *:not(#ugf-gmail):not(#ugf-gmail-notice-scrim):not(#ugf-gmail-accmenu):not(#ugf-gmail-appsmenu):not(#ugf-gmail-accfence):not(#ugf-gmail-movemenu):not(#ugf-gmail-styles):not(script):not(style) { visibility: hidden !important; position: absolute !important; top: 0 !important; left: 0 !important; /* 100vw counts the scrollbar, so on a browser whose scrollbars take up room (Firefox on Windows, say) every hidden element stuck out by ~15px and put a horizontal scrollbar along the bottom of the page. 100% is the content width. */ width: 100% !important; height: 100vh !important; overflow: hidden !important; pointer-events: none !important; z-index: 0 !important; margin: 0 !important; } #ugf-gmail { position: relative; z-index: 2; background: #fff; min-height: 100vh; } html[gplex-gmail], html[gplex-gmail] body { background: #fff !important; overflow: auto !important; overflow-x: hidden !important; max-width: 100% !important; height: auto !important; min-height: 0 !important; max-height: none !important; position: static !important; } #ugf-gmail { overflow: visible !important; } `; } // ---- Gplex for Gmail ------------------------------------------------------ // The logo bitmaps below are the real Gmail wordmarks, not redrawn copies: // the multicolour "Gmail by Google" mark Gmail carried from 2004 until 2013, // and the red envelope "M" lockup it used from 2013 to 2020. function ugfGmailAssets() { if (!ugfGmailAssets.a) { ugfGmailAssets.a = { byGoogle: "data:image/png;base64,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", m2018: "data:image/png;base64,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", m2020: "data:image/png;base64,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", envelope: "data:image/png;base64,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", plus2018: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABRWlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8XAySDKIAgkFROTiwscAwJ8gEoYYDQq+HaNgRFEX9YFmfU+/av7nKk22j1+68/dMUxWxFSPArhSUouTgfQfIE5PLigqYWBgTAGylctLCkDsDiBbpAjoKCB7DoidDmFvALGTIOwjYDUhQc5A9g0gWyA5IxFoBuMLIFsnCUk8HYkNtRcEeH3cFUJ9QoIcwz1dXAm4l2RQklpRAqKd8wsqizLTM0oUHIGhlKrgmZesp6NgZGBkxsAACnOI6s83wGHJKMaBECsQY2CwmAEUfIgQiwf6YbscAwN/H0JMDehfAS8GhoP7ChKLEuEOYPzGUpxmbARhc29nYGCd9v//53AGBnZNBoa/1////739//+/yxgYmG8xMBz4BgBgYGEo74CVhAAAAMBQTFRFAAAA3VxZ9Pf5Vq1o6/DszTMw46Ei+t+VSnTmLmLnmLL12mhoM5hM+uOo8vX7ZY7ul9Gj6q1W2m1r8/b7ndKlsrz0+cti2mxsaK53Xq1trNj4Ios1rcf42VY27KF8plpkpK2lscjwYbBwus719uKx9OCqZrCP4JySbWylm86mc7iWmc2kca75I2P/O6dsv29vimOOKa0ldbqEeMOHn5Wkaa2NZsxmvy83v38/no9om6/v4IaDAA5xBD3cNImTTXffTvXbbgAAAEB0Uk5TAPgO+PX/9vn7/PcK/Qtc+Pb7paQOBv9XDKAM/vL+Df4LplZcWqb3F/5aEaYLBAUG/xJb//GqBQUE/5xcA/f9q/0MvqUAAAJmSURBVHjarZQJd6IwEIBHwKoICBVaxAPUXTxKL4/t6rb6///VzmSCHOLqe93vPZm8ZL4kEwMATLvdpjD7c19D6nV63j+2eeg3nPNtYXirAFKoXxNeWRg9VgivH/9dGP5LGEnaIzBNsyx4yAzA85IkwWagKJRFzEYz81wAEqIo8hjMzwmjTMhqCBAUAoFClE+3KMB1vifckP9xfQUzrRp/inm6SyzMqFQPQFHSmhX4UQQczhe3D2BKWFPGIuBnkZOAS8BmP87TJaBRJCeEG10fDAY6Ih76QEOqBJEfhjlBvyw4jrgYdQjDt42eo9ORwkMRxxkOOX8+75QQBtzdOSkyfyjzm3larVZTGCgUQWFYw/3MRVKBJpVRJdTCt/P8ry8UqleoienFJqQk4iXhDvczL22eQ4trkOVyzRR2vP9UEOcjW0Io/Q8Pzm4Hc7yUlHY8Qkf8B3DsiAbeDtCKNBo7VTUOh0Mcx1v09jipvseoa9pgjPevLGj2BgUkjtUe3muL+qZJMqVo0fU+E2KRryK9dwCrq2ldfPMVihZ9ArpFBkLo9w0pKFZX5KURpygyRkFNBaB3zbLo25JGauUJFls1EyZy2EzTKl7xSY92nwo+d34+P3MjOXdYMFhYLT+59yR4wQXB4BXKAn5rS/n+apsX/IpNp+W6Lj0jIRjGqQYaicjz8EREBad8IbirnjwlIxPcLC0nRLzCRAr9TIj8XxXH+kK9AMuyQEMv7xWlpMJpS+oVwWfBXTzFa1JUPlYeqhKWvisF27Ype72OnxaunKxCiKKcgGusMUjBXV4V7Di2bxQCFphK4S+JCGJYbiZdrwAAAABJRU5ErkJggg==", compose2011: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAA0CAMAAACHB5U/AAABRmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8XAySDKwM+gzCCYmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsisPL2/qzhe/I3YZ++98avCnxBM9SiAKyW1OBlI/wHi9OSCohIGBsYUIFu5vKQAxO4AskWKgI4CsueA2OkQ9gYQOwnCPgJWExLkDGTfALIFkjMSgWYwvgCydZKQxNOR2FB7QYDXx10h1CckyDHc08WVgHtJBiWpFSUg2jm/oLIoMz2jRMERGEqpCp55yXo6CkYGRmYMDKAwh6j+fAMcloxiHAixAjEGBosZQMGHCLF4oB+2yzEw8PchxNSA/hXwYmA4uK8gsSgR7gDGbyzFacZGEDb3dgYG1mn//38OZ2Bg12Rg+Hv9///f2////7uMgYH5FgPDgW8A1YdiBEH53y0AAAEgUExURdJeYt6aneaVbeza4tmm1c5ql8wnJLksIvnbpLtMSc05VtdYMr1HNrwlSL9bgtRCNctAM/39/co1J9E4KfXa1/7658s7NMgnGPTo+dtyaNtnWtE8M8ssIsVjWNdYRrQoGvzp2OrW58lVR9NEKt2058xISf722u3V1fbXx+WHZdNYVeumhOfl/ObY+NWGpebG1dmXuem4ttZTOfjo5fXFmfTHp8pYVuBzae3Sy9JJR9imu/fVt9N3pPe2fNF2mduk2tur4uV4R/S3ic1DLP7puLcrI+y3ltmnw+3EuNNZgfTKt/vXqMkzHs12ov71tc1LUch4dttkSezGyPPNycs4RtApGeN2VemGWNloadJnhtRurNp2V+eTZ+m3qOW7xvfCilXTZCwAAAjRSURBVHja7ZdrV+JIE4C7E64y7yZ0SFAuEcGQAKPIRQbEdVcRZFBXYRzUBfX//4ut6gRI0NmZo+55d89QHyBd6arup7tTVU2isU9fFeknEeXrp1iUrJBXyCvkFfJ/Fzn+8yDHV8gr5BXyCvk/jbzxMyFv/ACyMpPkMw1Xud86j0nFLcmXrL7hZabx2nh8u954n/nfOyGnGPgLMMWrkRTG7MmyVCrFcHxAxUeGyClH7E7PrLD9lWm8rcy9PLd57pu/yClLvZjCx1zsy6uRk0pST9zdEbKRSOgSHzppa4SNDdQoUquYABnq0Ffij6C2dQmnJXEzl1UOzgH2gbbtWPJY2BpprvX6xlkl+Qt3r6Hewj9dSv4gMvsmcoDQRzEGYu0L1YDCNbujGBeLHkcU434PmlZd0NlFkZZBPZiO7/fg4QuIFRuUxhJbssohgv+g7LSFas6YW4CNNRCIpMFOtp77FiIAlVwjFJ7puArHJAe9yla9QPy+WFvQ//5ss+8iJ5OElqOOtAuwhjiaONNkYPatSx8+5uuJVOqO91V/LexuR+ciniRyitdqXFW0u7OPTlsdFKqOl5k8CZIm55Srw+1l3yfHsBja2uEONE5hKTTohbZ/lD77QbdP3oisKMW9rfk81HZpmAqQg4UmWts/1o9svHMSCNxvvYAcFYVIkux5rSRCXY73Seto24N87EZ2+z45rjLF8PvW+VIMU5oEvdzIgbchJ2/8MJBq9SuVMo7YHgducH3VGGgqZZHjHf22HrXfrR3yaWWEwi7qMqNKZVSDPvVb4l+yGnMr64HSRxN63sLCoUX/AXpURg+FoYQR2Dh85psjF3ftI9Mew54qxtHv6+ppifwpwuIl3rTLuZxBcDXbQjZL/HsfcQ2Tfj5VIdvIZq99oDqle/a0xFuJ+PhMMrDLv6/DoRBkGfuoodKR7yUrdV/oMHLwEc5B4ggt9ieanEWRZX7GYJeXfNcQmSWcjyIzhS9bgROyrsIu/7nFkdkbkBWF4JD5nhyMp/5HDsymUNV3RZgarQbj8YBM4Tlv7fnsaQnH9/bTDLmeDQYbAJgP1c+2X7JS29OqDB95hY4Thxw5AciGAcSaF3nuG5G1AHHii70A5D2Ri3s7UfVUqMaZphkNko6wIuwJaiApXmh+3EKLzkCnu9tu5CgAXGHwy5/XyzsYbFxW7V20ylhf+v0+TXRyDUSGg01phVb6pSEezwXywjdHxkOuZsqwdBjAWPFdkREwJAw1LCHim934haPB5CC11uALzbedg63WT87sL2yGnKGUluE//yQ87nitIGDdP67PAviGdGFcbq8volemkPMgL3xD+MrdYPASe37fDgaweOAdkWH9zvie6rxKuogz0MAnDQhVDTQ3mCryA0SuQZQ6HYjQu7Y+RwZtzQ5nkwOPFUytnoCJO2mrFutFpCM3sgrIsgzh6xIidsbtW4W0eHUIcSo0XfOLPLAFGpdu5NS7IWuSXtRzCiKrmDWhUtAwDqsc2bKANAMzypuwCjNkZ8t6kay9UDMriL11ooWpr2lu8UXJC0MMXxDTLRMlNHYhe3yr9YjSsE8awRguFnKBK/97H2xA1mQpWaS0UFUaZ3w4HSdvYBRVLURu97f4luWtsgdZVWt9OmTOJB0rislko0iESfqa+rb4cbUtLCFNhOvra5K1xzf82/DZu32rTySJwUvNW6NyzT7ohhuZ/H2V/V3kxp6I1ROGrxvyaD4UJNzlaB4oQAxMWBxZbT+UMW2op4PHBXKmQukDFcjFReNsZ9kKX5FOMMxLknyohJkctjC4GURh+Ak4yOdu3+rTMT8l808AguKNC7mux1M4CtPk7yLLz4VBKYfJBSqauIZTw1qLx+f2beQilSK44zx8qec9H1aA9r+DDDtpZNOQYxm7ottLVmJZrGWehE4wztuhHuXIUiCQioOk4FOSmYPs8X0ydtLVjLmue5EDEHLglqXJL8n3kDs5u7DLlIh+d4hPvCRAzcltosj3Rz3tAR5M54xXTyelgx0MX5TnZT48k6WZn4XVeUjEfa8XWtIG5qxze5fbQhFvSHcJvSrJC2Svb56uarFm0zQxELSJ5EIefNKLzoXrNciypN0c4QQzg8qjidHlfJJaO8LSMWNVKo9bqBImWO7BwcT4GxMKDvJv4vyQufzMrPKCQPEakRk80Ed88zTlJWrtS6XS749Gg9ItRPccIq/nPb5FYQq/qtgj4TTx4/JZt8NFwck9jCpfLEowAL4CmSXdlwj1fKrDwfReK0jWD5MPlXjKydxODsT5t3zuhBLwoy1bye5rBYStxKXnWiHadyTjctm3elIy8TQLLLjZDf4i2su1uFa4M/trkOVkUnNNrS1EZE25IZfza6Dam3QMbP4hEMySFmlByYA3KR+//zAMi+hH0TxWQgQWYX55jOZLEcN7eRR/dV0LPb4preEpicDxiad44Q31OvQS6We/6xvPvxZZkqCepaJpxmJmsy/ImObnmlis+TDpQATeKzdDBfKZxkyqr8G7/jQBl3YzVNLxVC/5AaveBGposDsoc4U5goW7AS+m2TSbtvSmcLDll3xDRWqaDySXa7UkBYKp2ayXjij0goV5jNn2o+boYZJj30GWvyGapmXJtR9SDUlnNYyjqElfX1NQpTEay0YjnSZZDf+ysqan8c9oNMLhrJzU3H4WVtBEO0JAcY0KjZsvhIAKzVrLvuEqxgfo8KuelEWrbLbRgF6G20VD7rzI8wPIELdZKhgOf/gQ3ITYC5OFAMwYaMIfgt0uxiblYnOzyzoM/oKwM1CKBzXGNrHlOjtLVjh6qtv9EA4Hu5tdcKqgxVy6TpJ55nsziD9dZyk13mA4Gv7G3Q7ktyBDXodd4endrdEcjZP5Ucvslt2beXPjkpXTU3YcS8wr2qKP17fXs9uk43XwBmR5UcY810jzpqOcNWRP/xetlh17yyS3kcf3C1Px9HrW4zXIr5NvDfr/lX8U+d8pK+QV8gp5hbxCXiGvkFfIK+QV8gr5H0D+C65g9z26UEAIAAAAAElFTkSuQmCC", compose2014: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAAA6CAMAAACAn5UpAAABIFBMVEXbZpry3d3jopjxoWPcXCvKWmbWptHFPoz60ZDZSDDURi7+/v7EQSvx4/n/+tvygyrwtq3FQzDu5fr+5bj4wXzkSTD6493kRi/peyXZe7nMZVTjueD82ajop5z+6sbYR3ToaSznjILqnpLjrKPt2PXyfCvZR1rlmKLkrdXjttjZt93pyur3uXT52cn//OjEQHfVRWzcdWPxnnHxqZ71uGv22Nz45OvGPpvZRaXXXEnZhLriXkrmc2PphWvihJPhlG7iqcvs0O3ztpbwu7P1y6fxxMv817TDP37Ehr/aRojaRZTUiIragK/Xk5bZmMHWpb7dq9ndt8vpfFfljKHtlFDjnMruqXvvxNjv8//wayzyjVf0rXz5w4n0xJv2w7b+4q9oE2SSAAADdUlEQVR42u2b+1fTMBTHuw3QPNqtG3vgVhiOjZcMxpCHvBQEn/hABRXU//+/MLlJ2nStP+E5LWsuZ6U3yTcnn97kJt05swiYN0BjbQNPcFpw3UNjb3sB7hBlwIY+7n4WcA98XJQJM7gG1+AaXINrcA2uwTW4BtfgGlyDe2fcxae1Wu13w/e/nLGCtU1VWyqVTgv8zjpltydVKGFlJe8wXoFQLw9dtpVeWSF5XMsW3wOR8yr476VLnJ/gQ7XD615AcREpASH9YpwCPSdal0FrQiqJ4z4LBjPLmT5oo5v2cUmXhcyO4EJ5RPEt8Fspw30jxmGrwb4V/jaRaGq4Wwjtkhjcyr8UtW35OPTWraRxV3kHN5Su22LKLnD/F6X0I8Tbx634U1TgNiidXABJRDHHizHrUjxB2RrMTRh3AyJHKaI7fKx1CPYT5mP6WgZL4KonoeHSB7zciig4Lrli/gqvCeEmnZlnIBL8DueP2cMPfITLYnrLyVjcIDpuV4mtiKIn2q2dtAGQt76ZBztMA67MH5iPbYn5f2TdSgh3elcuUIGbn188g6jHKD6ppVq7ckOpyqmnBxeMDz4n75s+bp99KrzqOpKqHsYo8KpffR7GraYMd1nzA1yHjd/Jsc/yKO6sG6PA1MqpBrdpje5RYQR/NcCVO2lraQT3JY1T8HVB8zlbZHT+7+sjsImk1y7oYRQ8n6614dDxA6kCllhRWaVfQgpTgFuWALCzRBV8wyrwPDwF87ccZGY3adyev/nzSdmvzqndVh4Z2yK6VYHbboY2IthYooqmjDfegfmr8ngqXhEgi85eTl5L7hVYY5voyFYPgke3DmvRQU0/ukW/h4hiBrahS7RoAzdvffJY2GHSuL2ylmZZLDe+a36/LnGrUwIlDjeiwHqXt0j37pKr/gsuXg+Gs8X9V4HvwDshRHdX1MfhRhU72pHaTRcuy6LL8kzQcIX/2U+7ULDAowtvQw1Y4F04TXb1HkYUeF3tQy2K1NkzJbh817joePkJdaJl/ruO1zlWiRTDDYbEpF9DPYQUrGDyotPJD3wlTckrghouMzzi08Bz467RHuioT/X71OCar+bSjItRFv5MdE10TXTve3QzwWuia6Jronvfo5sJy2p0Taoa51S1l4Uz5MDH9bKA6wU/rMnAby/2td8RkeHBeMMeDAXnX/8mKx/ISphIAAAAAElFTkSuQmCC", compose2018: "data:image/png;base64,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", google2013: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAA+CAMAAAC1OMG+AAABgFBMVEXx8fEHZu/aRSn/uAAAmFLTPCAAo1vm5ur+wQFHie+Tt++yye8YcPPiUzwueu/L2e92pe9kmu8AX+rs19TcUjrgTDM6gfDotq7jh3hWk/HaWkXmlorpw73v6+LnpJr324/y58vry8XPOR/keWjnraT14rHiWUTcZlThZVH51G37zEz9xyyCrfDehnkstHr70Vbh6uYAp2AlpGrcemzV4PDljoD6zmL23qKgv/Kz2Me70PFXtYik073C3tLD4dQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlr7aOAAAAgHRSTlMA////////Ov////////////////////////////////////////////////////9G//////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJlBkk4AAAYFSURBVHja1Zppd6JKEIZF47SAYRHjhhtxN5rJTLaZucv//1m3F7qp7i4ymHOPh6lPCWLXQ1HL22CjYdqLfxq7A4ea67onz2/U3sIocAzrjj1yJe9Pj9++fRH2WPlLv8aSlAYZgsfhtZhz6MenqlEed7sUMDjJjAi9uHtN7Mcv0iozR11qzljPYeKpdPGukiEC+t9qJxOXMQdI2Z1krK8IXTE1BozZRSsuvCLzJdBhwJjHJV2CXI/5AugZbxVuaWe7HvMF0LzTBS+ln1+PuTq097vucD3mytCEd7WgHiO5KnTEA/3jj4Imog2TukDfUKuY0eOaKLabm0rQwSeH9DRd7be3/f4qHeInbA7HDrPjYYO12R+Rq8vJQQl0sl7tb2/721Wa6PPOuVA2kzkFZtZntrexZ4eOtFar1VmYoj0yFbAzICh0km4LT6sEZodzGfOaXvo2HWZZlm77/WazuU/0ExaM9uuG2oFBt1oPSy0lqTSLfN8v5FjObEHPKfFqnWXD1z53JMITXw5NRvTCR0T+02TWh8GefWXIM/kPp4bBZoJS3FoSQ2IbOqXM6zzke+6I+3GLfKrKvKLMgHHeLFYTmA+UGTAuOHVrAZlVDRnUOvQr9ZSpRJlwP4mqQ/cCaMacwgN5rFWGMOYDPEHEupVnyC+mgYsOy7ejToRBz6mnebHMkPtZcTF04TxkK221rk5ECHb5v7wEZ1pVirzu5JRMUBYf+oIgtKET01NThtq5MKeTO2qpfkyEoCmSb9kxA60niO/A7FAJGtvQI+ppBIMj3KSXQ7OV7jLjoAj1ROZCp2N2ZhDqyBwLHqwqAG2Eh8y5l9FUXWflPs1XujNnfl6LbL0lx5s10FBvpA72bB1hQc+ZJ1neU144kzkBN6fyRBR41qUI6FeFZ54gLqV1kJWvqQYXh16xJfk9JcO9CjLQeJW1xwqFbuzY0TYrxSMKnefHg6z8wJaZFvSWrUmbRzJiU2WSEjOjnC7ekgfapA3ylWzoV4pMTdFZJxxa8rjosS/mfj+woEXViSCvhsheG88Pk5nIrmPp2GG7nUO30JxuvCto13J3wrtHU9okTexda9l4QZgbRcXpks+AtnTdRkF7Vn7EoBPY0CtMRObi46P+Adq/WGhunWJAL6wTFPSLdWcDUFMW9Bol8stDrUODlUY4dF/BHcuh87oLQlhVAaI99iWuwPD/KNQAeg/GiAX9zIQHnNgm9APIum5O7XeLv+2WhxS9FmqHVIBOxUoZCj0v2sQShV7AWumeKGoYa8pUGy4f5YecL+UJAqAzPD8SDp0UY+SITpf8Uoi+b4nxPWI+sSZ4LEPnNw9G4ZydoE1vKLNDNmqz6b3rVxJGRWdyyza2+2LOlm7Iy6kh9FpJLWhnynyfQJlh6LwjljORXUsQeto0txfIt0up+Uc9OLHFBgKIRgp9lnsAJKtn7Mgbnpel0NKVXUF6swadyIDu9XRxtNP0KmVWuZdntdZA3tAx6X6cHtSVaP9tbS4kUyvWTkQw6F5PSW5x19qgFteQWU2/o6FMZ/jTWjpYiq/+I6B/6oO23d4p0OwZePKdcmzO7ICNilgokftxnVkJjU6eITM8zoVPdXufvgvo73//lBUksfuj9XS6Pk/uNU8kLrDdyM8/Cv0oDnqMGWxusp1YaDScTqk6pzV4Nhpc3kKO75vN5g3NZz0rPY1ZgAtX/XZh99SejYiGsYMaQw4irV7WcK32s6XCZA/J7bi0+6wXw8dinBoy/6UefTQBch/pJOANXIEM4g4sS3d8tcl5jXf/5SGf6MeFlRm+HZ4Ptk7D844j787TskcxfjR2g/ytbRx5/v//1lNEZhDztVUt1folfMhnYaRiQVwg12tqfPoOQmS0efWNM/bk0Lv40dx1LUA1sPeJx81XTo64RB3XFXpc0if8OkOXNTdSe2gP/8CtNfQYbyperZuHE6K7kNoOlwgffiEVZfUd4yG6P2LMcaO+5tm/PiMRVZJ1ZgY7/4AqSGriZXPUqLf5QbG56Ik9kVv/34bSnUavp4BppvwBP2cVe63I5RZ96ge4/wG5omZZ3suczgAAAABJRU5ErkJggg==", favicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABgFBMVEXi2trf3Nfc4+TkmJLmpZ7i6+vhenX2YV3/v3/igHzkp57jtK///wAAAAD+/v7X1dfKNzTa2drJaWXT1NXr6OjMSETOU0/Kysu1tbbSurl/f3+1ODO6Gxfi5eW5ZGHUnZnP1dbk5uWrIh3i4+Tu+vvY19jU1NPZ2dnQ1tbb5er/AACwKiXMQT7Oy8vRzM24XVm4lpHGKCXJcm/IiYR///+6R0OqqqrOYV7GmZXStrTTycfMyMnS4+XO/Pz/f3/yenXup6Pvt7Li2tm2Yl24eXO4qaa0tLjRqabWubnxlZHxzMzp1dR/f/+5bmm/v7+7vLqq///MmZnSl5PLqKTf3+Pa4+XS4+bR/P/nX1vxjIf/qqrtwb3h2dnm6ubo9/i/Pz+5WlayZFy5enS+gHu3gXq/jIizr6+4yMy8ycrBIRzPXFrNYl7PbWjRfXjegH3Cg37bjIrSkI3Co53eo57AoZ7aoZ3NqabJurTawrzQwL7GxL/Uz8/azMzYzs/d3ejb2+KE+Q+SAAAAgHRSTlPgK1ip1KGr/wT+Ol0BAAaM+3D48A/9/vZB/gL+/ITV9dUv/kwqDTRRtHQB/vwH0/r89vr6Av4D+0ZqLlBMFgP/7+9R1/76P/0P+w2YAv0E+AMHbFRJkKws//sDnTBqdATJ/TDN/DxAQfv/wtC8oaf/wJZcn8T0YrIqfvR3g7gXJFf7xQQAAAJQSURBVHjajZMHU9tAEIXPBtJvpZPvJGyRYCHJEnLFFRwb24TeIfSW3nvvyV/PSuAEPAzJG2nvRu+bt3szOkL/IUKp58HpHngeAoG5gxUA6OHiCzej7YR0etnmgdJwtOHctnl6uVwGIPXVc109dToLYC9CGjgH7pfQNK3PvewaoWSucL7R2q1TepgIi9TGNrco3Xs3s9V4bROiDMli5k3Iop59NGx5hVLj0ouGPCQ/NYmmyEKk1BYJ0ekyXMGMHRiFKpmRfV1bJ9GKrgpZqBe7E5RewIzZWUrD3YpAW9dvXCVRJVkqiZQsGs/nDqg3veLR/d1nWxgvSnoyAJ6I8YKaErLabI3557/c3EZbVvqzyUOgT0xpuawQQlaaH6ufV7dVtMXCUmQhmbwWAGq/G4/eFynsk281K/5w2VxkY0TRB9qAtK5puTs4l6pUsJZeRV334AQQ/hF/PDGuiuBslZxGpO/hL8eBQUnKRJZyagq75yfiG0xi1omEQcakjKZNjAu18NWVJMaYNdyREBDaVFRzcXsagMpocdft8d1aeMy62dkCjW+SXyU2VjP2YLgTYAYHH5OY45hGAh4cA1x/BoP/BMNBxDSdNcPpTHAMg9sG8DXGTF9/ZtAQ+MCsULr9L3PL8v9aTu8qet/tfZLJ98n9klX9ZSQCVROO41xHhd5mB/R7JjHf5/NTkXgmjopE8MUaiGiFbOGTQYDhFy3QkdNekXENTihs1h71ntQkPpMPe2vhTbw4sbOvJmBCrFgchSJADDU/H/uron8DyX/c7rP1G+NCeLHqDWQRAAAAAElFTkSuQmCC", faviconClassic: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABgFBMVEXippje3NLe3eHgt6jdqKXfcWXgoY7k09Xy3tDeh3brlnvfzb7Lyb3/f1XufmL2dlbatm3Uyb8AAADn5dba19X+/v34+e/TNirvaE7MKibm28v/f3/0dVfX1sri4eHGGRXYRjblWUWyAQPDCw63t7jrk4nLIxy8MTPZk5HjSTboqZbmhXDvybrryLjx9+y6urrap5L608/u7eDVhnPcmovwxrf0+/O1FhbANjbWVEXTeGnc5dPpUzr//3+1tbW5yszddWTWmInYtKXzspv0uqn/1Kro8N33/PT4+fHXaFvXZ1jGiHLZoZLZybTY2Nb8gmbmuKji3t7t6Nq6LC7RWU/LfXXLiITatrbMzMTL1dbleWTiiIX1s5bvs532uLjnva7tyrjvyLfj49/k5OTx7uLx7eLs9+h/AACRAAC+IB++NzG2bUi4aGi/d2+5i4u2kZGurq61r6y/v7+ysrK1v8C22tq60tTBHRzAIRzUKirSS0PeUT7abUjabW3Ta2vBcmBZUk1dAAAAgHRSTlMY1CJg8niUR6l4/3TsBrjbBxgA/UsC+/39/f0C/f5C+/7+9f7S6v7WB/v70Zf9c+z+Cfj9/M6P/NX//P76AqbP03j6/f0G/FnN0/8id/4v/sNBidbSIP8HLYb/xgp0C5sOukEKcLO6Agf//wf/IAsHm7EMndQH0LxzBvn/BwfVHZkiIqcAAAI9SURBVHjajZNpV9pAFIYngIpLNwZmMzETrKmJDUVQlKXQAgVqcW3rvi/d933vX++dIGL7ofqcnDMf7nPfmzs5QZEzQGcLsUHgpmLwXx4PxkBAmxd+Xl5ZGVfcAdDoMa+ff/0xeo4RsaFgV+9W//Vjdna6m83bQG8z2PWlqyeA0GRVn69gsTepWFhY8IQQnucJz7VstvEKjV6c15le2ULbm7u72+PjVx4RgnGK1JLfTNP8jNDqmM6AS1omFokcNhoNjLHI12ZzHOrD0z0oOqYDTO+rhmORJQLtAoyJrG2a8ExHQWBMKQU20p2pH0I9hb00NW3Ozanha0rwRzCdFeZFOJCBiPIMtylMmJoanm4Jlu5LBcfdQw2clpxSm9NnHUFPJtctwHGYW81RgJtyIv00bh4LrJKfTVsFy5KSZVXdNte7gyM83noHZjEX52f7so60JPXrPIcTT9rCLVZgrsB5IzkjqZSScjtbwSRzryM4lgur43w5J/32mTLcZqIjWCAILOB+BmABLtNYWz0iiYenhO9+AhaGkcxKF9cMLXUq4a5FZVIJhiEI9rz+DME1TBIvTwSnJQgDQjAhS2GSgrMzQgkTKl/VfQW+Nmzxuy08cCgFwcBtUkSRQEq4rwRqK0GcCH596SAY4vE4CIENy1RCp/+onqjXAxGVwH9F0ZxWzS2XDUMz2gy8LxbfFItvQ8svQqE59G5NK5VKV09zo8WH0idtLYAiHwOLi0N/0bMfVcfifnTu4Fz/5n85O+EPU6OLo3WxZJYAAAAASUVORK5CYII=" }; } return ugfGmailAssets.a; } function ugfGmailCategoriesOn() { let v = null; try { v = window.localStorage.getItem("UGF_GMAIL_CATS"); } catch (e) {} if (v === null || v === undefined) { v = ugfGmailShared("UGF_GMAIL_CATS") || null; } return String(v) === "true"; } function ugfGmailSetCategories(on) { const v = on ? "true" : "false"; try { window.localStorage.setItem("UGF_GMAIL_CATS", v); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_GMAIL_CATS", v); } } catch (e) {} } function ugfGmailEnabled() { let v = null; try { if (typeof GM_getValue === "function") { v = GM_getValue("UGF_GMAIL_ON", null); } } catch (e) {} if (v === null || v === undefined) { try { v = window.localStorage.getItem("UGF_GMAIL_ON"); } catch (e) {} } return String(v) !== "false"; } function ugfGmailSetEnabled(on) { const v = on ? "true" : "false"; try { window.localStorage.setItem("UGF_GMAIL_ON", v); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_GMAIL_ON", v); } } catch (e) {} } // Gmail launched 1 Apr 2004, so anything older than that borrows the 2004 skin. function ugfGmailEra() { const l = String(layout || ""); if (l === "2019" || l === "2022") { return "g2018"; } if (["2013", "2013L", "2014", "2015", "2015L", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(l) > -1) { return "g2013"; } if (l === "2011" || l === "2012") { return "g2011"; } if (l === "2010" || l === "2010N") { return "g2010"; } if (l === "2009") { return "g2009"; } if (l === "2007" || l === "2008") { return "g2007"; } if (l === "2006") { return "g2006"; } return "g2004"; } function ugfGmailChrome(era) { if (era === "g2018") { return "m2018"; } if (era === "g2013") { return "m2013"; } if (era === "g2011") { return "kennedy"; } return "classic"; } // Where a Google wordmark shows up in the Gmail header, it is the one that // belongs to the layout the user picked on google.com. function ugfGmailGoogleLogo() { const l = String(layout || ""); if (["2016", "2016C", "2016L", "2017", "2018", "2018M", "2019", "2022"].indexOf(l) > -1) { return "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"; } // 2010-2015 wore the wordmark this one was lifted from, so it is inlined rather than fetched return ugfGmailAssets().google2013; } // Dated from Google's own posts: launch Apr 2004; chat Feb 2006; Delete button 2006; Move to/Labels // 3 Feb 2009; labels in the sidebar 1 Jul 2009; beta ends 7 Jul 2009; Buzz Feb 2010; Priority Inbox // 30 Aug 2010; new look 1 Nov 2011; bottom-right compose 30 Oct 2012; category tabs 29 May 2013; // Material, snooze and Advanced-instead-of-Labs Apr 2018. function ugfGmailFeatures(era) { const base = { g2004: { beta: true, chat: false, del: false, moveLabels: false, tasks: false, priority: false, buzz: false, tabs: false, snooze: false, compose: "page", saveLabel: "Save Draft", year: "2004", storage: "1000 MB", used: "36 MB (4%)", pct: 4, selectRow: true, searchLinks: true, navIcons: false, sidebar: ["Inbox", "Starred", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash", "Contacts"], settings: ["General", "Accounts", "Labels", "Filters", "Forwarding and POP"] }, g2006: { beta: true, chat: true, del: true, moveLabels: false, tasks: false, priority: false, buzz: false, tabs: false, snooze: false, compose: "page", saveLabel: "Save Now", year: "2006", storage: "2700 MB", used: "212 MB (8%)", pct: 8, selectRow: true, searchLinks: true, navIcons: false, sidebar: ["Inbox", "Starred", "Chats", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash", "Contacts"], settings: ["General", "Accounts", "Labels", "Filters", "Forwarding and POP", "Chat", "Web Clips"] }, g2007: { beta: true, chat: true, del: true, moveLabels: false, tasks: false, priority: false, buzz: false, tabs: false, snooze: false, compose: "page", saveLabel: "Save Now", year: "2008", storage: "2800 MB", used: "412 MB (14%)", pct: 14, selectRow: true, searchLinks: true, navIcons: false, sidebar: ["Inbox", "Starred", "Chats", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash", "Contacts"], settings: ["General", "Accounts", "Labels", "Filters", "Forwarding and POP/IMAP", "Chat", "Web Clips"] }, g2009: { beta: false, chat: true, del: true, moveLabels: true, tasks: true, priority: false, buzz: false, tabs: false, snooze: false, compose: "page", saveLabel: "Save Now", year: "2009", storage: "7400 MB", used: "1204 MB (16%)", pct: 16, selectRow: true, searchLinks: true, navIcons: false, sidebar: ["Inbox", "Starred", "Chats", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash", "Contacts", "Tasks"], settings: ["General", "Accounts and Import", "Labels", "Filters", "Forwarding and POP/IMAP", "Chat", "Web Clips", "Labs", "Offline", "Themes"] }, g2010: { beta: false, chat: true, del: true, moveLabels: true, tasks: true, priority: true, buzz: true, tabs: false, snooze: false, compose: "page", saveLabel: "Save Now", year: "2010", storage: "7600 MB", used: "1890 MB (24%)", pct: 24, selectRow: true, searchLinks: true, navIcons: false, sidebar: ["Inbox", "Buzz", "Priority Inbox", "Starred", "Important", "Chats", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash", "Contacts", "Tasks"], settings: ["General", "Accounts and Import", "Labels", "Filters", "Forwarding and POP/IMAP", "Chat", "Web Clips", "Priority Inbox", "Labs", "Offline", "Themes"] }, g2011: { beta: false, chat: true, del: true, moveLabels: true, tasks: true, priority: true, buzz: false, tabs: false, snooze: false, compose: "page", saveLabel: "Save Now", year: "2012", storage: "10 GB", used: "2.4 GB (24%)", pct: 24, selectRow: false, searchLinks: false, navIcons: false, sidebar: ["Inbox", "Priority Inbox", "Starred", "Important", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash"], settings: ["General", "Labels", "Inbox", "Accounts and Import", "Filters", "Forwarding and POP/IMAP", "Chat", "Web Clips", "Labs", "Offline", "Themes"] }, g2013: { beta: false, chat: true, del: true, moveLabels: true, tasks: true, priority: true, buzz: false, tabs: true, snooze: false, compose: "box", saveLabel: "", year: "2014", storage: "15 GB", used: "4.1 GB (27%)", pct: 27, selectRow: false, searchLinks: false, navIcons: false, sidebar: ["Inbox", "Starred", "Important", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash"], settings: ["General", "Labels", "Inbox", "Accounts and Import", "Filters and Blocked Addresses", "Forwarding and POP/IMAP", "Chat", "Labs", "Offline", "Themes"] }, g2018: { beta: false, chat: true, del: true, moveLabels: true, tasks: true, priority: false, buzz: false, tabs: true, snooze: true, compose: "box", saveLabel: "", year: "2018", storage: "19 GB", used: "10.74 GB (56%)", pct: 56, selectRow: false, searchLinks: false, navIcons: true, sidebar: ["Inbox", "Starred", "Snoozed", "Important", "Sent", "Drafts", "Categories", "More"], settings: ["General", "Labels", "Inbox", "Accounts and Import", "Filters and Blocked Addresses", "Forwarding and POP/IMAP", "Add-ons", "Chat", "Advanced", "Offline", "Themes"] } }; return base[era] || base.g2013; } function ugfGmailIcon(name, size) { const s = size || 18; const p = { archive: '', spam: '', "delete": '', move: '', labels: '', unread: '', more: '', refresh: '', snooze: '', search: '', gear: '', back: '', print: '', popout: '', reply: '', forward: '', star: '', prev: '', next: '', inbox: '', starout: '', clock: '', important: '', sent: '', draft: '', allmail: '', trash: '', chat: '', people: '', tag: '', info: '', forum: '', expand: '', density: '', keyboard: '', apps: '', bell: '' }; return '"; } function ugfGmailNavIcon(name) { const map = { "Inbox": "inbox", "Priority Inbox": "inbox", "Starred": "starout", "Snoozed": "clock", "Important": "important", "Sent": "sent", "Sent Mail": "sent", "Drafts": "draft", "All Mail": "allmail", "Spam": "spam", "Trash": "trash", "Chats": "chat", "Contacts": "people", "Categories": "tag", "Tasks": "draft", "Buzz": "forum", "More": "expand" }; return ugfGmailIcon(map[name] || "tag", 20); } // Gmail does not throw away the mailbox you just left, or the compose window you // just closed - it parks them with display:none and builds a fresh one. Gplex hides // Gmail with visibility:hidden, which keeps layout boxes, so "has a box" separates // what is live from what is parked. Without this, querySelector kept handing back // the parked copy: the old mailbox's mail under the new mailbox's name, and a dead // compose window that swallowed the message. // ---- languages ------------------------------------------------------------- // Two separate things: Gplex's own text follows the browser language, exactly as // it does on google.com; Gmail's controls are found in whatever language Gmail // itself is set to, which need not be the same one. function ugfGmailUiLang() { const l = String((document.documentElement && document.documentElement.getAttribute("lang")) || "").toLowerCase(); if (!l) { return ""; } if (l.indexOf("zh") === 0) { return /-(tw|hk|mo)\b|hant/.test(l) ? "zh-TW" : "zh-CN"; } return l.split("-")[0]; } // Every language Gplex knows Gmail's wording in, likeliest first: Gmail's own, then // the browser's, then the rest - so a Gmail whose language could not be read // still works. English always goes ahead of all of them. function ugfGmailWordLangs() { const out = []; [ugfGmailUiLang(), UGF_LANG].concat(Object.keys(UGF_GMAIL_WORDS)).forEach(function(l) { if (l && UGF_GMAIL_WORDS[l] && out.indexOf(l) === -1) { out.push(l); } }); return out; } // just the languages actually in play, for loose matches where a word from some // other language could be a false positive function ugfGmailNearLangs() { const out = []; [ugfGmailUiLang(), UGF_LANG].forEach(function(l) { if (l && UGF_GMAIL_WORDS[l] && out.indexOf(l) === -1) { out.push(l); } }); return out; } // "Delete" -> ["Delete", "Löschen", "Eliminar", ...], in priority order function ugfGmailAlt(names) { const out = []; const add = function(v) { if (v && out.indexOf(v) === -1) { out.push(v); } }; names.forEach(add); ugfGmailWordLangs().forEach(function(l) { names.forEach(function(n) { (UGF_GMAIL_WORDS[l][n] || []).forEach(add); }); }); return out; } function ugfGmailWordRe(key, english, near) { const parts = english.slice(); (near ? ugfGmailNearLangs() : ugfGmailWordLangs()).forEach(function(l) { (UGF_GMAIL_WORDS[l][key] || []).forEach(function(w) { // _empty entries are patterns already; the rest are plain words parts.push(key === "_empty" ? w : w.replace(/[.*+?^$|()[\]{}\\]/g, "\\$&")); }); }); return new RegExp(parts.join("|"), "i"); } // a selector for Gmail controls by tooltip or label, in every language tried function ugfGmailLabelSel(names) { const out = []; ugfGmailAlt(names).forEach(function(n) { const v = String(n).replace(/\\/g, "\\\\").replace(/"/g, '\\"'); out.push('[data-tooltip="' + v + '"]', '[aria-label="' + v + '"]'); }); return out.join(", "); } // Gplex's own elements: the shell and the menus it hangs off function ugfGmailOurs(el) { return !!(el && el.closest && el.closest('#ugf-gmail, [id^="ugf-gmail-"]')); } // ---- Gplex's own text in the interface language ---------------------------- // Only what Gplex writes is translated. Mail - senders, subjects, snippets, dates, // message bodies - and the person's own labels, name and address stay exactly as // they are. function ugfGmailI18nSkip() { return "script, style, textarea, [data-ugf-raw], " + ".ugf-gmail-from, .ugf-gmail-subject, .ugf-gmail-date .d, .ugf-gmail-msg-body, " + ".ugf-gmail-msg-from, .ugf-gmail-msg-addr, .ugf-gmail-msg-to, .ugf-gmail-msg-right > span:first-child, " + ".ugf-gmail-avatar, .labelchip, .ugf-gmail-warn .b, .who, .plusname, #ugf-gmail-gbar .plus, " + ".pfp, .wordmark, #ugf-gmail-accmenu .meta b, #ugf-gmail-accmenu .meta > span"; } function ugfGmailI18nOk(el, isText) { if (!el || !ugfGmailOurs(el) || el.closest(ugfGmailI18nSkip())) { return false; } // the subject line itself (the buttons beside it are Gplex's) return !(isText && el.id === "ugf-gmail-subject"); } function ugfGmailT(text) { const t = ugfT(text); if (t !== text) { return t; } // arrows, carets and dashes hang off Gplex's buttons and links: "Move to ▾", // "« Newer", "of your 15 GB. – " const m = String(text).match(/^([\s«‹»›▾▼|–—-]*)([\s\S]*?)([\s«‹»›▾▼|–—-]*)$/); if (m && m[2] && (m[1].trim() || m[3].trim())) { const c = ugfT(m[2]); if (c !== m[2]) { return m[1] + c + m[3]; } } // a mailbox with its unread count: "Inbox (3)" const n = String(text).match(/^(\s*)(.+?)( \([\d,.]+\))(\s*)$/); if (n) { const c = ugfT(n[2]); if (c !== n[2]) { return n[1] + c + n[3] + n[4]; } } return text; } function ugfGmailI18nText(node) { // our own write coming back round through the observer if (node.__ugfT !== undefined && node.nodeValue === node.__ugfT) { return; } if (!ugfGmailI18nOk(node.parentElement, true)) { return; } const v = node.nodeValue; const t = ugfGmailT(v); if (t !== v) { node.__ugfT = t; node.nodeValue = t; } } function ugfGmailI18nAttrs(el) { if (!el || el.nodeType !== 1 || !ugfGmailI18nOk(el, false)) { return; } ["placeholder", "title", "aria-label"].forEach(function(a) { const v = el.getAttribute(a); if (v) { const t = ugfGmailT(v); if (t !== v) { el.setAttribute(a, t); } } }); if (el.tagName === "INPUT" && /^(submit|button|reset)$/i.test(el.type || "")) { const v = el.getAttribute("value"); if (v) { const t = ugfGmailT(v); if (t !== v) { el.setAttribute("value", t); el.value = t; } } } } function ugfGmailI18nTree(root) { if (!root) { return; } if (root.nodeType === 3) { ugfGmailI18nText(root); return; } if (root.nodeType !== 1) { return; } ugfGmailI18nAttrs(root); root.querySelectorAll("[placeholder], [title], [aria-label], input").forEach(ugfGmailI18nAttrs); const w = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); let n; while ((n = w.nextNode())) { ugfGmailI18nText(n); } } // The page-wide translator never runs on Gmail - Gmail's own markup is mail - so // this one watches only Gplex's shell and the menus it opens. function ugfGmailI18nStart() { if (UGF_LANG === "en" || ugfGmailI18nStart.on) { return; } if (!document.body) { setTimeout(ugfGmailI18nStart, 200); return; } ugfGmailI18nStart.on = true; document.documentElement.setAttribute("ugf-lang", UGF_LANG); const opts = { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ["placeholder", "title", "aria-label", "value"] }; const handle = function(muts) { muts.forEach(function(m) { if (m.type === "childList") { m.addedNodes.forEach(ugfGmailI18nTree); } else if (m.type === "characterData") { ugfGmailI18nText(m.target); } else if (m.type === "attributes") { ugfGmailI18nAttrs(m.target); } }); }; const inner = new MutationObserver(handle); const watch = function(el) { ugfGmailI18nTree(el); inner.observe(el, opts); }; new MutationObserver(function(muts) { muts.forEach(function(m) { m.addedNodes.forEach(function(n) { if (n.nodeType === 1 && n.id && n.id.indexOf("ugf-gmail") === 0) { watch(n); } }); }); }).observe(document.body, { childList: true }); [].forEach.call(document.body.children, function(n) { if (n.id && n.id.indexOf("ugf-gmail") === 0) { watch(n); } }); console.log("[Gplex] Gmail: interface language " + UGF_LANG + (ugfGmailUiLang() ? " (Gmail itself is in " + ugfGmailUiLang() + ")" : "")); } function ugfGmailShown(el) { return !!(el && el.getClientRects && el.getClientRects().length); } function ugfGmailPick(sel) { const all = document.querySelectorAll(sel); let fallback = null; for (let i = 0; i < all.length; i++) { if (all[i].closest("#ugf-gmail")) { continue; } if (ugfGmailShown(all[i])) { return all[i]; } if (!fallback) { fallback = all[i]; } } return fallback; } function ugfGmailRows() { const out = []; const panes = new Map(); document.querySelectorAll("tr.zA").forEach(function(tr) { if (tr.closest("#ugf-gmail")) { return; } const from = tr.querySelector(".yW span[email], .yW span[name], .yX span, .yW span"); const subj = tr.querySelector(".bog span, .bog"); const snip = tr.querySelector(".y2"); const date = tr.querySelector(".xW span, td.xW"); const star = tr.querySelector(".T-KT"); const holder = tr.querySelector("[data-legacy-thread-id], [data-thread-id]") || tr; out.push({ row: tr, pane: tr.closest(".ae4, .Cp, div[role=\"main\"]") || tr.parentElement || tr, tid: holder.getAttribute("data-legacy-thread-id") || holder.getAttribute("data-thread-id") || "", rowId: tr.id || "", from: from ? (from.getAttribute("name") || from.textContent || "").trim() : "", subject: subj ? (subj.textContent || "").trim() : ugfT("(no subject)"), snippet: snip ? (snip.textContent || "").replace(/^\s*-\s*/, "").trim() : "", date: date ? (date.textContent || "").trim() : "", unread: tr.classList.contains("zE"), starred: !!(star && star.classList.contains("T-KT-Jp")) }); }); const live = out.filter(function(it) { let v = panes.get(it.pane); if (v === undefined) { v = ugfGmailShown(it.pane); panes.set(it.pane, v); } return v; }); if (live.length) { return live; } // nothing live: only report empty if we can see a live list pane at all, // otherwise fall back rather than guess let mainShown = false; document.querySelectorAll('div[role="main"]').forEach(function(m) { if (ugfGmailShown(m)) { mainShown = true; } }); return mainShown ? live : out; } // Gmail rebuilds its list as it syncs, so a captured goes stale within seconds. // Everything that acts on a row looks it up again first. function ugfGmailLiveRow(item) { if (item.row && item.row.isConnected) { return item.row; } if (item.rowId) { const byId = document.getElementById(item.rowId); if (byId) { item.row = byId; return byId; } } let found = null; document.querySelectorAll("tr.zA").forEach(function(tr) { if (found || tr.closest("#ugf-gmail")) { return; } const subj = tr.querySelector(".bog span, .bog"); if (subj && (subj.textContent || "").trim() === item.subject) { found = tr; } }); if (found) { item.row = found; } return found; } function ugfGmailRealClick(el) { if (!el) { return false; } // A userscript sandbox hands out a wrapped window, and Firefox rejects that as // a MouseEvent "view" with a TypeError - which threw out of every click Gplex // made, so nothing it asked Gmail to do ever happened. The member is optional; // leaving it out is both correct and portable. Each dispatch is guarded so one // unsupported event type cannot take the rest down with it. let sent = 0; try { if (el.focus) { el.focus(); } } catch (e) {} [ ["mouseover", "MouseEvent"], ["pointerdown", "PointerEvent"], ["mousedown", "MouseEvent"], ["pointerup", "PointerEvent"], ["mouseup", "MouseEvent"], ["click", "MouseEvent"] ].forEach(function(pair) { const Ctor = window[pair[1]]; if (typeof Ctor !== "function") { return; } try { el.dispatchEvent(new Ctor(pair[0], { bubbles: true, cancelable: true, composed: true, button: 0 })); sent++; } catch (e) {} }); if (!sent) { // last resort if the constructors are unusable in this sandbox try { el.click(); sent++; } catch (e) {} } return sent > 0; } function ugfGmailOpenRow(item) { // (6.5.5) remembered, so a conversation that doesn't open that way can be clicked open instead ugfGmailOpenRow.last = { item: item, at: Date.now(), clicked: false }; // the reliable route is Gmail's own URL for the conversation if (item.tid) { const base = (window.location.hash || "#inbox").split("/")[0] || "#inbox"; window.location.hash = base + "/" + item.tid; return true; } const row = ugfGmailLiveRow(item); if (!row) { return false; } const target = row.querySelector(".bog span") || row.querySelector(".bog") || row.querySelector(".xT") || row.querySelector(".y6") || row; return ugfGmailRealClick(target); } function ugfGmailLabels() { const out = []; const seen = {}; document.querySelectorAll('div[role="navigation"] a[href*="#"]').forEach(function(a) { // Gmail appends the unread count to the link text ("Inbox 42"), which stopped // these matching the era's own sidebar names const name = (a.textContent || "").replace(/\s+/g, " ").replace(/\s*[\d,]+\s*$/, "").trim(); const href = a.getAttribute("href") || ""; const hash = href.indexOf("#") > -1 ? href.slice(href.indexOf("#")) : ""; if (!name || !hash || name.length > 24 || seen[name] || out.length > 20) { return; } seen[name] = true; out.push({ name: name, hash: hash, el: a }); }); return out; } // "Sent Mail" is #sent, "All Mail" is #all, "Important" is #imp - guessing the hash // from the label text is what broke switching mailboxes. function ugfGmailHashFor(name) { const map = { "inbox": "#inbox", "priority inbox": "#priority", "starred": "#starred", "snoozed": "#snoozed", "important": "#imp", "chats": "#chats", "sent": "#sent", "sent mail": "#sent", "sent items": "#sent", "drafts": "#drafts", "all mail": "#all", "spam": "#spam", "trash": "#trash", "buzz": "#buzz", "contacts": "#contacts", "tasks": "#tasks", "categories": "#category", "scheduled": "#scheduled" }; return map[String(name || "").toLowerCase().trim()] || ""; } // https://mail.google.com/mail/u/0/#inbox and friends - keeping the account index // the person is actually on rather than assuming 0 // Gmail puts the mailbox in the page title, which is how we can tell an arrival // from a switch that quietly did not happen. function ugfGmailArrived(target) { // deliberately generous: failing to confirm costs nothing, while a wrong // answer here costs a page load const names = { "#inbox": ["inbox"], "#starred": ["starred"], "#snoozed": ["snoozed"], "#sent": ["sent"], "#drafts": ["draft"], "#imp": ["important", "imp"], "#all": ["all mail", "all"], "#spam": ["spam"], "#trash": ["trash", "bin"] }; const want = names[String(target || "").split("/")[0]]; const title = (document.title || "").toLowerCase(); const gl = ugfGmailUiLang(); if (gl && gl !== "en") { return true; // the title is in Gmail's language, not these words } if (!want || !title || title.indexOf("gmail") === -1) { return true; // cannot tell - never second-guess it } return want.some(function(w) { return title.indexOf(w) > -1; }); } // The footer year is the layout's own year - 2014 on 2014, 2015 on 2015 - rather // than one year standing in for the whole era. function ugfGmailYear(feat) { if (UGF_LATE2015) { return "2015"; } const m = String(layout || "").match(/(\d{4})/); return m ? m[1] : ((feat && feat.year) || ""); } // Used by both the list toolbar and the message viewer. It lived as a local in // the list render, which threw the moment the viewer tried to use it. function ugfGmailDelLabel() { return /^#trash|^#spam/.test(window.location.hash || "") ? "Delete forever" : "Delete"; } function ugfGmailMailUrl(hash) { const m = (window.location.pathname || "").match(/^\/mail\/u\/(\d+)\//); return "https://mail.google.com/mail/u/" + (m ? m[1] : "0") + "/" + (hash || "#inbox"); } function ugfGmailAccount() { const a = document.querySelector('a[aria-label*="@"], [aria-label*="Google Account"]'); const label = a ? (a.getAttribute("aria-label") || "") : ""; const m = label.match(/[\w.+-]+@[\w.-]+/); return m ? m[0] : ""; } // Gmail keeps the real range and total in its pager; use that rather than // counting the rows we happen to have scraped. function ugfGmailCount() { // the parked pane keeps its own counter, so take the live one const el = ugfGmailPick(".Dj, .ts") || ugfGmailPick("[aria-label*='of']"); // any dash-like separator, and any flavour of space, between the two numbers const txt = el ? (el.textContent || "").replace(/[\s\u00a0\u202f]+/g, " ").trim() : ""; if (!txt || !/\d/.test(txt)) { return null; } // No words are relied on here, so this reads "1\u201350 of 234", "1\u201350 de 1.234", // "\u7b2c 1-50 \u884c\uff0c\u5171 234 \u884c" and "234 \u4ef6\u4e2d 1\uff5e50 \u4ef6" alike: the range is the pair of // figures joined by a dash, and the total is whatever other figure there is. // (a figure may carry a space as its thousands separator: "1 234") const NUM = "\\d[\\d,.]*(?: \\d{3})*"; const range = txt.match(new RegExp("(" + NUM + ") ?[-\u2010\u2011\u2012\u2013\u2014\u2212~\uff5e\u301c] ?(" + NUM + ")")); if (range) { const rest = txt.slice(0, range.index) + " | " + txt.slice(range.index + range[0].length); const tot = rest.match(new RegExp(NUM)); if (tot) { return { from: range[1], to: range[2], total: tot[0], text: txt }; } // On a big mailbox Gmail does not count at all - it says "1-50 of many". // Reporting the rows we happen to have loaded instead ("43") is a lie, and // it also capped paging at one page. return { from: range[1], to: range[2], total: "many", unknown: true, text: txt }; } // a single figure, as Gmail writes on an empty view: "0 of many", "0 of 0" const nums = txt.match(new RegExp(NUM, "g")) || []; if (nums.length >= 2) { return { from: nums[0], to: nums[0], total: nums[1], text: txt }; } if (nums.length === 1 && /[^\d\s,.:;()|-]/.test(txt.replace(nums[0], ""))) { return { from: nums[0], to: nums[0], total: "many", unknown: true, text: txt }; } return null; } // Gmail prints the true figures in its footer; use those instead of a per-era guess // textContent glues elements together - "15 GBManage" reads as // "15 GBManage", which hides the figure from any pattern that expects the unit to // end a word. Walking the nodes and spacing them apart keeps the words separate. function ugfGmailFlatText(el) { let out = ""; const walk = function(n) { if (!n) { return; } if (n.nodeType === 3) { out += " " + n.nodeValue; return; } if (n.nodeType !== 1) { return; } for (let c = n.firstChild; c; c = c.nextSibling) { walk(c); } out += " "; }; walk(el); return out.replace(/[\s\u00a0]+/g, " ").trim(); } // Read at most every 1.5s: this walks subtrees, and it is asked for on every // repaint tick as part of the fingerprint. function ugfGmailStorage() { const now = Date.now(); if (ugfGmailStorage.at && (now - ugfGmailStorage.at) < 1500) { return ugfGmailStorage.val; } let v = null; try { v = ugfGmailStorageRead(); } catch (e) { v = null; } ugfGmailStorage.at = now; ugfGmailStorage.val = v; return v; } function ugfGmailStorageRead() { // Gmail has worded this several ways over the years - "Using 4.1 GB of your // 15 GB", "4.53 GB of 15 GB used", "0.28 GB of 15 GB" - and only the oldest of // those used to match, which is why the era's placeholder figure kept showing. // Other languages move the words and even the units around: "0,43 Go sur 15 Go" // in French, "Использовано 0,43 ГБ из 15 ГБ", and Japanese and Korean give the // quota first ("15 GB 中 0.43 GB を使用中"). So: two sizes a few characters apart, // in either order - the smaller one is what is used. const UNIT = "(B|KB|MB|GB|TB|bytes|octets|o|Ko|Mo|Go|To|Б|КБ|МБ|ГБ|ТБ)(?![A-Za-zЀ-ӿ])"; const pat = new RegExp("(\\d[\\d.,]*)\\s*" + UNIT + "\\s*(?:\\(\\s*([\\d.,]+)\\s*%\\s*\\))?[^\\d]{0,24}?(\\d[\\d.,]*)\\s*" + UNIT, "i"); const unitRank = function(u) { const k = String(u).toUpperCase(); const r = { B: 0, BYTES: 0, O: 0, OCTETS: 0, "Б": 0, KB: 1, KO: 1, "КБ": 1, MB: 2, MO: 2, "МБ": 2, GB: 3, GO: 3, "ГБ": 3, TB: 4, TO: 4, "ТБ": 4 }; return r[k] || 0; }; const usedWord = ugfGmailWordRe("_used", ["\\b(used|using|storage|quota)"], false); let txt = ""; const looksRight = function(t) { const m = String(t).match(pat); if (!m) { return false; } // two figures in the same unit and the same amount is not a storage line const u = parseFloat(String(m[1]).replace(/,/g, ".")); const q = parseFloat(String(m[4]).replace(/,/g, ".")); return isFinite(u) && isFinite(q) && (u !== q || unitRank(m[2]) !== unitRank(m[5]) || u === 0); }; // needWord is for the open scan, where the wording is the only thing telling a // storage line apart from any other pair of sizes on the page. Anchored on the // storage link we already know what we are reading, and Gmail often writes just // "0.43 GB of 15 GB" with the word only in the link beside it. const scan = function(v, needWord) { if (!v) { return ""; } const t = String(v).replace(/[\s\u00a0]+/g, " ").trim(); if (t.length > 200) { return ""; } // no boundary demanded after the word: joined-up markup gives "usedManage" if (needWord && !usedWord.test(t)) { return ""; } return looksRight(t) ? t : ""; }; const look = function(v, best) { const t = scan(v, true); if (!t) { return best; } return (!best || t.length < best.length) ? t : best; }; // Gmail marks this line with a link to the storage page. Starting there and // walking outwards finds the figure however many spans it is chopped into - // the old scan only looked at elements with a handful of children, and modern // Gmail splits "0.43 GB of 15 GB used" across more than that. document.querySelectorAll('a[href*="one.google.com/storage"], a[href*="/settings/storage"], ' + 'a[href*="quota"], a[href*="storage"]').forEach(function(a) { if (txt || a.closest("#ugf-gmail")) { return; } let n = a.parentElement; for (let up = 0; n && up < 5; up++, n = n.parentElement) { // never widen past the footer itself: body's text takes in the whole // mailbox, and a message that happens to talk about storage with it if (n === document.body || n === document.documentElement || n.querySelector("tr.zA, .ii")) { break; } const hit = scan(ugfGmailFlatText(n), false); if (hit) { txt = hit; return; } } }); document.querySelectorAll("div, span, a, td, p").forEach(function(el) { if (el.closest("#ugf-gmail") || el.children.length > 12) { return; } const raw = el.textContent || ""; if (raw.length > 400 || !/\d/.test(raw)) { return; // cheap skip before walking the subtree } let hit = look(ugfGmailFlatText(el), ""); hit = look(el.getAttribute("aria-label"), hit); hit = look(el.getAttribute("title"), hit); if (!hit) { return; } // Only worth checking once something matched: a message that happens to // mention "200 GB of 400 GB used" is not the storage footer, whether the // text is the row itself or a container holding it. if (el.closest("tr.zA, .ii, .adn") || el.querySelector("tr.zA, .ii")) { return; } // the tightest element wrapping the figure, not an outer container if (!txt || hit.length < txt.length) { txt = hit; } }); if (!txt) { // last resort: Gmail sometimes keeps this in a frame of its own const frames = document.querySelectorAll("iframe"); for (let i = 0; i < frames.length && !txt; i++) { let doc = null; try { doc = frames[i].contentDocument; } catch (e) { doc = null; // another origin: nothing to read } if (!doc || !doc.body) { continue; } try { doc.querySelectorAll('a[href*="storage"], a[href*="quota"]').forEach(function(a) { let n = a.parentElement; for (let up = 0; n && up < 5 && !txt; up++, n = n.parentElement) { const hit = scan(ugfGmailFlatText(n), false); if (hit) { txt = hit; } } }); if (!txt) { doc.querySelectorAll("div, span, td, p").forEach(function(el) { if (txt || el.children.length > 12) { return; } const hit = scan(ugfGmailFlatText(el), true); if (hit) { txt = hit; } }); } } catch (e) {} } } if (!txt) { return null; } const m = txt.match(pat); if (!m) { return null; } const num = function(v, unit) { let raw = String(v); // "4,53 GB" is a decimal comma; "1,024" is a thousands separator raw = /^\d{1,3},\d{1,2}$/.test(raw) ? raw.replace(",", ".") : raw.replace(/,/g, ""); const f = parseFloat(raw); const mult = [1 / (1024 * 1024), 1 / 1024, 1, 1024, 1024 * 1024]; return f * mult[unitRank(unit)]; }; let usedMB = num(m[1], m[2]); let totalMB = num(m[4], m[5]); let usedAt = 1; let totalAt = 4; if (usedMB > totalMB) { // quota first, as Japanese and Korean put it const t = usedMB; usedMB = totalMB; totalMB = t; usedAt = 4; totalAt = 1; } // work the share out from the real figures rather than trusting a printed one let pct = isFinite(usedMB) && totalMB > 0 ? (usedMB / totalMB) * 100 : parseFloat(m[3] || "0"); if (!isFinite(pct) || pct < 0) { pct = 0; } const tidy = function(n, u) { // the ASCII units as Gmail writes them in English; anything else as printed return String(n).trim() + " " + (/^[kmgt]?b$/i.test(u) ? String(u).toUpperCase() : String(u)); }; return { used: tidy(m[usedAt], m[usedAt + 1]), total: tidy(m[totalAt], m[totalAt + 1]), pct: Math.min(100, pct), text: txt }; } // Gmail pages through the URL: #all/p3, #inbox/p2, #search/foo/p4. Driving that // is far more dependable than clicking its pager, which lives in hidden markup. function ugfGmailPageInfo() { const h = window.location.hash || "#inbox"; const m = h.match(/^(.*?)\/p(\d+)$/); if (m) { return { base: m[1], page: parseInt(m[2], 10) || 1 }; } return { base: h, page: 1 }; } function ugfGmailPageSize() { const c = ugfGmailCount(); if (!c) { return 50; } const from = parseInt(String(c.from).replace(/[^\d]/g, ""), 10); const to = parseInt(String(c.to).replace(/[^\d]/g, ""), 10); const n = (to - from) + 1; return n > 0 ? n : 50; } function ugfGmailLastPage() { const c = ugfGmailCount(); if (!c || c.unknown) { // unknown total ("of many"): the only thing we know is where the mail ran // out, if we have already been that far return ugfGmailPageCap(ugfGmailPageInfo().base); } const total = parseInt(String(c.total).replace(/[^\d]/g, ""), 10); if (!total) { return 0; } return Math.max(1, Math.ceil(total / ugfGmailPageSize())); } // Gmail's own router sometimes never answers. Rather than sit there waiting, // put the URL where it should be and let the browser load it for real. The // cooldown is what stops that turning into a reload loop. // Gmail lets people hide system labels, and a hidden one simply ignores its URL - // a reload cannot help, since Gmail refuses it on a fresh load too. A search always // works, and these give exactly the same mail as the view they stand in for. // (a function, not a const: Gmail code can run before a const this far down exists) function ugfGmailViewQueries() { return { "#imp": "is:important", "#starred": "is:starred", "#snoozed": "is:snoozed", "#sent": "in:sent", "#drafts": "in:drafts", "#chats": "in:chats", "#scheduled": "in:scheduled", // the whole inbox, every category (see ugfGmailWholeInbox) "#inbox": "in:inbox" }; } // Gmail's inbox with category tabs shows one tab at a time (Primary), so mail it files // under Promotions, Social or Updates never reached Gplex's list. Every layout Gplex // draws without tabs had one inbox of everything, so with Gplex's tabs off the inbox is // opened as Gmail's own "in:inbox" search, which lists all of it (and still refreshes). function ugfGmailHasCategoryTabs() { let hit = false; document.querySelectorAll('[role="tablist"] [role="tab"], table.aKk [role="tab"]').forEach(function(t) { if (!hit && !ugfGmailOurs(t) && t.closest('div[role="main"]')) { hit = true; } }); return hit; } function ugfGmailWholeInbox() { const h = window.location.hash || ""; if ((h === "" || h === "#inbox") && !ugfGmailCategoriesOn() && ugfGmailHasCategoryTabs()) { if (!ugfGmailWholeInbox.said) { ugfGmailWholeInbox.said = true; console.log("[Gplex] Gmail: your inbox has category tabs; showing all of it (every category), as the inbox of this layout did"); } window.location.replace(window.location.pathname + window.location.search + "#search/in%3Ainbox"); return true; } return false; } function ugfGmailViewSearch(target) { const q = ugfGmailViewQueries()[String(target || "").split("/")[0]]; return q ? "#search/" + encodeURIComponent(q).replace(/%20/g, "+") : ""; } // The mailbox a hash really shows: a stand-in search counts as its mailbox, so the // sidebar keeps it selected and the search box does not fill with "is:important". function ugfGmailViewFromHash(hash) { const h = String(hash || window.location.hash || "#inbox"); const m = h.match(/^#search\/([^/]+)/); if (m) { let q = ""; try { q = decodeURIComponent(m[1].replace(/\+/g, " ")).trim().toLowerCase(); } catch (e) {} const map = ugfGmailViewQueries(); for (const k in map) { if (map[k] === q) { return k; } } return "#search"; } return h.split("/")[0] || "#inbox"; } function ugfGmailIsRealSearch() { return ugfGmailViewFromHash(window.location.hash) === "#search"; } // Called when a switch to target did not take. Prefer the stand-in search; reload // only for views that have none. function ugfGmailStuck(target, why) { const alt = ugfGmailViewSearch(target); const now = window.location.hash || "#inbox"; if (alt && now === alt) { return true; // already showing it through search } if (alt && now.split("/")[0] === String(target).split("/")[0]) { if (ugfGmailAfterNav.iv) { clearInterval(ugfGmailAfterNav.iv); ugfGmailAfterNav.iv = null; } console.log("[Gplex] Gmail: Gmail would not open " + target + " (" + why + ") - it may be hidden in Gmail's label settings; showing it through search instead"); window.location.hash = alt; return true; } return ugfGmailHardNav(target, why); } function ugfGmailHardNav(target, why) { if (!target) { return false; } const now = Date.now(); let prev = { t: 0, h: "" }; try { prev = JSON.parse(sessionStorage.getItem("UGF_GMAIL_HARDNAV") || '{"t":0,"h":""}'); } catch (e) {} // only the same destination is rate limited - reloading for inbox must not // stop a load for spam a second later if (prev.h === target && (now - prev.t) < 20000) { console.log("[Gplex] Gmail: already forced a load of " + target + " just now"); return false; } // and never two loads back to back for different mailboxes either - a page // that keeps reloading itself is worse than one that is slow to switch if ((now - prev.t) < 10000) { console.log("[Gplex] Gmail: not forcing another load so soon (" + (why || target) + ")"); return false; } try { sessionStorage.setItem("UGF_GMAIL_HARDNAV", JSON.stringify({ t: now, h: target })); sessionStorage.setItem("UGF_GMAIL_RELOADED", JSON.stringify({ t: now, h: target, why: why || "Gmail did not respond to the switch" })); } catch (e) {} if (window.location.hash !== target) { window.location.hash = target; } console.log("[Gplex] Gmail: router stalled, loading " + target + " directly"); window.location.reload(); return true; } function ugfGmailGoPage(n) { const info = ugfGmailPageInfo(); const page = Math.max(1, n); const target = page <= 1 ? info.base : info.base + "/p" + page; if (window.location.hash === target) { return false; } const before = ugfGmailStamp(); window.location.hash = target; ugfGmailAfterNav(before, function() { // no forced load here: asking for a page past the end does not change the // list, which looked like a stall and reloaded the page onto an empty one ugfGmailRender(); }); ugfGmailPageEndGuard(page); return true; } // An empty page you paged onto is not an empty mailbox, it is the end of the mail. // This watches the page it landed on, waits for the view to hold still - straight // after a page change Gmail's counter still reads the page just left - and then // steps back to where the mail actually stops. function ugfGmailPageEndGuard(page) { const hash = window.location.hash || ""; if (page <= 1 || ugfGmailPageEndGuard.on === hash) { return; } ugfGmailPageEndGuard.on = hash; let tries = 0; const check = function() { if ((window.location.hash || "") !== hash) { ugfGmailPageEndGuard.on = null; // moved on by itself return; } tries++; if (ugfGmailRows().length) { ugfGmailPageEndGuard.on = null; // mail turned up after all return; } if (!ugfGmailListSettled() && tries < 8) { setTimeout(check, 600); return; } ugfGmailPageEndGuard.on = null; const info = ugfGmailPageInfo(); ugfGmailPageCapSet(info.base, page - 1); console.log("[Gplex] Gmail: page " + page + " is past the end, going back to page " + (page - 1)); ugfGmailGoPage(page - 1); }; setTimeout(check, 1400); } // Where the mail actually stops, learned by walking off the end of it. function ugfGmailPageCapSet(base, page) { ugfGmailPageCapSet.v = ugfGmailPageCapSet.v || {}; ugfGmailPageCapSet.v[base] = page; } function ugfGmailPageCap(base) { return (ugfGmailPageCapSet.v || {})[base] || 0; } function ugfGmailPagerBtn(which) { const want = which === "older" ? /^(older|next page|next)$/i : /^(newer|previous page|previous)$/i; let found = null; document.querySelectorAll('[aria-label], [data-tooltip], [title]').forEach(function(el) { if (found || el.closest("#ugf-gmail")) { return; } const lab = (el.getAttribute("aria-label") || el.getAttribute("data-tooltip") || el.getAttribute("title") || "").trim(); if (!want.test(lab)) { return; } // no visibility test here: Gplex has already hidden Gmail's own chrome, // so every real control measures as zero-sized if (el.getAttribute("aria-disabled") === "true" || el.classList.contains("aoM") || el.hasAttribute("disabled")) { return; } found = el; }); return found; } function ugfGmailPage(which) { const info = ugfGmailPageInfo(); if (which === "older") { return ugfGmailGoPage(info.page + 1); } if (which === "newer") { return info.page > 1 ? ugfGmailGoPage(info.page - 1) : false; } if (which === "newest") { return ugfGmailGoPage(1); } if (which === "oldest") { const last = ugfGmailLastPage(); return last ? ugfGmailGoPage(last) : false; } return false; } function ugfGmailThreadOpen() { const h = window.location.hash || ""; // "#all/p3" is page three, not a conversation - it only looks like one if (/\/p\d+$/.test(h)) { return false; } if (/^#label\/[^/]+$/.test(h)) { return false; } if (/^#search\/[^/]+$/.test(h)) { return false; } return /#[^/]+\/[^/]+/.test(h); } function ugfGmailState() { if (!ugfGmailState.s) { ugfGmailState.s = { settings: false, tab: "General", notice: false }; } return ugfGmailState.s; } function ugfGmailSettingsOpen() { return /^#ugfsettings/.test(window.location.hash || "") || ugfGmailState().settings; } function ugfGmailClickReal(sel) { const el = ugfGmailPick(sel); if (!el) { return false; } try { el.click(); return true; } catch (e) { // never let a click throw out of here: callers may have Gmail's layer // armed, and an escaping error would leave it on screen console.log("[Gplex] Gmail: click on " + sel + " failed - " + e); return ugfGmailRealClick(el); } } function ugfGmailSetField(el, value) { if (!el) { return; } if (el.tagName === "INPUT" || el.tagName === "TEXTAREA") { el.focus(); // Gmail watches the native value setter, so assigning .value directly can go // unnoticed - poke the prototype setter it actually listens to. const proto = el.tagName === "INPUT" ? window.HTMLInputElement : window.HTMLTextAreaElement; const desc = Object.getOwnPropertyDescriptor(proto.prototype, "value"); if (desc && desc.set) { desc.set.call(el, value); } else { el.value = value; } el.dispatchEvent(new Event("input", { bubbles: true })); el.dispatchEvent(new Event("change", { bubbles: true })); } else { el.focus(); el.innerHTML = trusted_policy.createHTML(ugfEscapeHtml(value).replace(/\n/g, "
")); el.dispatchEvent(new Event("input", { bubbles: true })); } } // A typed address only becomes a recipient once Gmail turns it into a chip, which // it does on Enter/Tab/comma or on blur. Skipping this is why Send did nothing. function ugfGmailCommitTo(el) { if (!el) { return; } [ { key: "Enter", code: "Enter", keyCode: 13 }, { key: "Tab", code: "Tab", keyCode: 9 } ].forEach(function(k) { ["keydown", "keypress", "keyup"].forEach(function(type) { el.dispatchEvent(new KeyboardEvent(type, { key: k.key, code: k.code, keyCode: k.keyCode, which: k.keyCode, bubbles: true, cancelable: true })); }); }); el.dispatchEvent(new Event("blur", { bubbles: false })); if (el.blur) { el.blur(); } } // Gplex hides Gmail with visibility:hidden, and a hidden element cannot take // focus and is not hit-tested. Gmail's compose needs focus for the recipient // chip, for the message body and for Ctrl+Enter, so every send quietly turned // into a draft; its toolbar buttons ignored clicks for the same reason. // So: while we drive Gmail, put its layer back to being real - parked far // off-screen, where nothing of it can be seen - and undo that straight after. // Inline !important is deliberate; it is the only thing that outranks the // takeover rule. function ugfGmailArm() { const props = { visibility: "visible", "pointer-events": "auto", left: "-30000px", top: "0px", width: "1280px", height: "900px", overflow: "visible", "z-index": "1" }; const hosts = []; [].forEach.call(document.body.children, function(n) { if (!n.tagName || n.tagName === "SCRIPT" || n.tagName === "STYLE") { return; } if (n.id && n.id.indexOf("ugf-gmail") === 0) { return; // Gplex's own shell and menus } Object.keys(props).forEach(function(k) { n.style.setProperty(k, props[k], "important"); }); hosts.push(n); }); // nothing should be able to scroll to where we parked it document.body.style.setProperty("overflow", "hidden", "important"); let done = false; const off = function() { if (done) { return; } done = true; hosts.forEach(function(n) { Object.keys(props).forEach(function(k) { n.style.removeProperty(k); }); }); document.body.style.removeProperty("overflow"); }; setTimeout(off, 20000); // never leave Gmail armed return off; } // Gmail announces what it did in a small notice - "Message sent" against // "Draft saved". That is the only honest way to tell a send from a draft. function ugfGmailToast() { let txt = ""; const any = ugfGmailToastRe(); document.querySelectorAll('.bAq, .vh, [role="alert"], .b8, .aT').forEach(function(el) { if (txt || ugfGmailOurs(el) || el.children.length > 3) { return; } const t = (el.textContent || "").replace(/\s+/g, " ").trim(); if (t && t.length < 120 && (any.sent.test(t) || any.draft.test(t))) { txt = t; } }); return txt; } // the notice's wording in English and every language Gplex knows Gmail in function ugfGmailToastRe() { if (!ugfGmailToastRe.c) { ugfGmailToastRe.c = { sent: ugfGmailWordRe("_sent", ["message sent", "sending"], false), draft: ugfGmailWordRe("_draft", ["draft saved", "saved to drafts", "draft"], false) }; } return ugfGmailToastRe.c; } // what a notice (or the "View message" link Gmail adds after a send) says happened function ugfGmailSendOutcome() { const toast = ugfGmailToast(); const re = ugfGmailToastRe(); if (toast && re.sent.test(toast)) { return "sent"; } if (toast && re.draft.test(toast)) { return "draft"; } const vsm = document.getElementById("link_vsm"); if (vsm && !ugfGmailOurs(vsm)) { return "sent"; } return ""; } // Gmail's own send shortcut. Its Send button does not always take a synthetic // click, and when it does not Gmail just files the message as a draft. function ugfGmailSendKey(el) { const t = el || document.body; if (t.focus) { t.focus(); } [{ ctrlKey: true }, { metaKey: true }].forEach(function(mod) { ["keydown", "keypress", "keyup"].forEach(function(type) { const init = { key: "Enter", code: "Enter", keyCode: 13, which: 13, bubbles: true, cancelable: true }; if (mod.ctrlKey) { init.ctrlKey = true; } if (mod.metaKey) { init.metaKey = true; } t.dispatchEvent(new KeyboardEvent(type, init)); }); }); } // The Send button of the compose window that holds this subject box. Looked for // from the window outwards, never page-wide: in some languages Send and the Sent // mailbox begin with the same word (Italian Invia / Inviati, Japanese 送信 / 送信済み). function ugfGmailFindSend(anchor, sel) { let n = anchor; for (let up = 0; n && up < 25; up++, n = n.parentElement) { if (n === document.body || n === document.documentElement) { break; } const hit = n.querySelector('div[role="button"].aoO') || n.querySelector(sel); if (hit && !ugfGmailOurs(hit)) { return hit; } } return null; } // Sending drives Gmail's own compose window, so the mail really is sent by Gmail. function ugfGmailSend(data, status) { // make Gmail real before opening compose, so the window can hold focus const disarm = ugfGmailArm(); if (!ugfGmailClickReal('div[role="button"][gh="cm"], .T-I.T-I-KE')) { disarm(); status("Could not open Gmail's compose window."); return; } const failSafe = function(e, msg) { disarm(); console.log("[Gplex] Gmail: " + msg + " - " + e); status(msg); }; const toSel = 'textarea[name="to"], input[name="to"], input[peoplekit-id]'; const subjSel = 'input[name="subjectbox"]'; const bodySel = 'div[aria-label="Message Body"], div[g_editable="true"]'; // .aoO is Gmail's Send button in any language; the labels are the backup const sendSel = 'div[role="button"].aoO, ' + ugfGmailAlt(["Send"]).map(function(w) { const v = String(w).replace(/"/g, '\\"'); return 'div[role="button"][data-tooltip^="' + v + '"], div[aria-label^="' + v + '"]'; }).join(", "); let tries = 0; const iv = setInterval(function() { try { step(); } catch (e) { clearInterval(iv); failSafe(e, "Could not drive Gmail's compose window."); } }, 250); function step() { tries++; const to = ugfGmailPick(toSel); const subject = ugfGmailPick(subjSel); const body = ugfGmailPick(bodySel); const send = subject ? ugfGmailFindSend(subject, sendSel) : null; // wait for the window Gmail just opened, not one it parked earlier if (to && subject && body && send && ugfGmailShown(send)) { clearInterval(iv); try { ugfGmailSetField(to, data.to); ugfGmailCommitTo(to); ugfGmailSetField(subject, data.subject); ugfGmailSetField(body, data.body); } catch (e) { disarm(); console.log("[Gplex] Gmail: could not fill the compose window - " + e); status("Could not fill Gmail's compose window."); return; } status("Sending\u2026"); setTimeout(function() { ugfGmailRealClick(send); let waited = 0; let nudged = false; const finish = function(msg) { disarm(); status(msg); setTimeout(function() { const form = document.querySelector("#ugf-gmail-compose-form"); if (form) { form.remove(); } ugfGmailRender(); }, 900); }; const check = setInterval(function() { waited++; try { tick(); } catch (e) { clearInterval(check); disarm(); console.log("[Gplex] Gmail: send check failed - " + e); status("Gmail did not accept the message."); } }, 300); function tick() { const outcome = ugfGmailSendOutcome(); if (outcome === "sent") { clearInterval(check); finish("Message sent."); return; } if (outcome === "draft") { clearInterval(check); disarm(); console.log("[Gplex] Gmail: the message was filed as a draft, not sent"); status("Gmail saved it as a draft instead of sending it."); return; } const still = ugfGmailPick(subjSel); const open = still && ugfGmailShown(still); if (open && !nudged && waited >= 3) { // the click did not take - use Gmail's own send shortcut nudged = true; console.log("[Gplex] Gmail: Send button did not respond, using Ctrl+Enter"); ugfGmailSendKey(ugfGmailPick(bodySel) || still); return; } if (!open) { // compose gone and no notice yet - give the notice a moment, // since a silent close is how a draft save looks if (waited >= 10) { clearInterval(check); finish("Message sent."); } return; } if (waited > 26) { clearInterval(check); disarm(); const alert = ugfGmailPick('div[role="alertdialog"], .Kj-JD-Jz'); const why = alert && ugfGmailShown(alert) && (alert.textContent || "").trim().slice(0, 120); console.log("[Gplex] Gmail: send did not complete" + (why ? " - " + why : "")); status(why || "Gmail did not accept the message. Its compose window is still open."); } } }, 500); } else if (tries > 40) { clearInterval(iv); disarm(); status("Gmail's compose window did not open in time."); } } } function ugfGmailCompose(prefill) { const shell = document.querySelector("#ugf-gmail"); if (!shell) { return; } const era = ugfGmailEra(); const feat = ugfGmailFeatures(era); const chrome = ugfGmailChrome(era); const esc = ugfEscapeHtml; const old = shell.querySelector("#ugf-gmail-compose-form"); if (old) { old.remove(); } const box = document.createElement("div"); box.id = "ugf-gmail-compose-form"; box.innerHTML = trusted_policy.createHTML( '
New Message×
' + '
' + '
' + '" + '
' + '' + (feat.saveLabel ? '" : "") + '' + '' + "
"); if (chrome === "m2013" || chrome === "m2018") { shell.appendChild(box); } else { const main = shell.querySelector("#ugf-gmail-main"); main.insertBefore(box, main.firstChild); } const status = function(t) { const s = box.querySelector("#ugf-gmail-compose-status"); if (s) { s.textContent = t; } }; const close = function() { box.remove(); ugfGmailRender(); }; box.querySelector("#ugf-gmail-do-send").addEventListener("click", function() { ugfGmailSend({ to: box.querySelector("#ugf-gmail-to").value, subject: box.querySelector("#ugf-gmail-subj").value, body: box.querySelector("#ugf-gmail-msgbody").value }, status); }); box.querySelector("#ugf-gmail-do-discard").addEventListener("click", close); const x = box.querySelector("#ugf-gmail-compose-x"); if (x) { x.addEventListener("click", close); } const save = box.querySelector("#ugf-gmail-do-save"); if (save) { save.addEventListener("click", function() { status("Draft saved at " + new Date().toLocaleTimeString() + "."); }); } box.querySelector("#ugf-gmail-to").focus(); } // ---- the message viewer -------------------------------------------------- // (6.5.7) When Gmail can't open a conversation itself (it no longer works fully in old browsers such // as Firefox 52), Gplex reads the conversation from Gmail's print view: an ordinary page of Gmail's, // opened with the browser's normal session, that lists every message as plain HTML. function ugfGmailPrintTid() { const last = String(window.location.hash || "").split("/").pop(); if (/^[0-9a-f]{12,20}$/.test(last)) { return last; } const o = ugfGmailOpenRow.last; return o && o.item && /^[0-9a-f]{12,20}$/.test(o.item.tid || "") ? o.item.tid : ""; } function ugfGmailIk() { try { const g = (typeof unsafeWindow !== "undefined" ? unsafeWindow : window).GLOBALS; if (g && g[9] && /^[0-9a-f]{6,16}$/.test(String(g[9]))) { return String(g[9]); } } catch (e) {} let found = ""; document.querySelectorAll("script:not([src])").forEach(function(sc) { if (found) { return; } const m = /[?&]ik=([0-9a-f]{6,16})\b/.exec(sc.textContent || "") || /"ik"\s*:\s*"([0-9a-f]{6,16})"/.exec(sc.textContent || ""); if (m) { found = m[1]; } }); return found; } function ugfGmailPrintFetch(tid) { ugfGmailPrintFetch.cache = ugfGmailPrintFetch.cache || {}; if (!tid || ugfGmailPrintFetch.cache[tid]) { return; } ugfGmailPrintFetch.cache[tid] = { loading: true, msgs: [] }; const m = /^\/mail\/u\/\d+\//.exec(window.location.pathname || ""); const ik = ugfGmailIk(); const url = (m ? m[0] : "/mail/u/0/") + "?ui=2" + (ik ? "&ik=" + ik : "") + "&view=pt&search=all&th=" + tid; const xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onload = function() { const out = { loading: false, msgs: [], subject: "", chips: [], counter: "", danger: "" }; try { const doc = new DOMParser().parseFromString(ugfTT(xhr.responseText), "text/html"); const subj = doc.querySelector("font[size='+1'] b, .maincontent font b, h2, title"); out.subject = subj ? (subj.textContent || "").trim().replace(/^Gmail - /, "") : ""; doc.querySelectorAll("table.message").forEach(function(t) { const rows = t.rows || []; const head = rows[0] ? rows[0].cells : []; const who = head[0] ? (head[0].textContent || "").replace(/\s+/g, " ").trim() : ""; const em = /<([^>]+@[^>]+)>/.exec(who); const date = head[1] ? (head[1].textContent || "").replace(/\s+/g, " ").trim() : ""; const rcp = t.querySelector(".recipient"); let body = null, bodyLen = -1; for (let i = 1; i < rows.length; i++) { rows[i].querySelectorAll("div, td").forEach(function(n) { if (n.classList && n.classList.contains("recipient")) { return; } if (n.closest && n.closest(".recipient")) { return; } const len = (n.textContent || "").length; // (the innermost of equal length: the message itself, not the tables around it) if (len >= bodyLen && len > 0 && !n.querySelector("table.message")) { body = n; bodyLen = len; } }); } out.msgs.push({ from: em ? who.slice(0, who.indexOf("<")).trim() : who, email: em ? em[1].trim() : "", to: rcp ? (rcp.textContent || "").replace(/\s+/g, " ").trim().replace(/^To:\s*/i, "") : ugfT("to me"), date: date, html: body ? body.innerHTML : "" }); }); } catch (e) { console.log("[Gplex] Gmail print view could not be read", e); } ugfGmailPrintFetch.cache[tid] = out; ugfGmailRender(); }; xhr.onerror = function() { ugfGmailPrintFetch.cache[tid] = { loading: false, msgs: [] }; }; xhr.send(); } function ugfGmailThread() { const t = ugfGmailThreadLive(); if (!t.msgs.length && ugfGmailPrintFetch.cache) { const got = ugfGmailPrintFetch.cache[ugfGmailPrintTid()]; if (got && got.msgs && got.msgs.length) { return { subject: got.subject || t.subject, msgs: got.msgs, chips: t.chips, counter: t.counter, danger: t.danger }; } } return t; } function ugfGmailThreadLive() { const subject = document.querySelector("h2.hP, h2[data-thread-perm-id], .ha h2, [data-legacy-thread-id] h2"); const msgs = []; let scope = [].slice.call(document.querySelectorAll("div.adn, div.gs")); if (!scope.length) { scope = [].slice.call(document.querySelectorAll("[data-message-id], .h7, .kv")); } // Each message matched twice - Gmail's .gs sits inside its .adn - and a thread // opened earlier stays parked in the page, so keep one element per message, // from the conversation actually on screen. scope = scope.filter(function(m) { return !m.closest("#ugf-gmail") && !scope.some(function(o) { return o !== m && o.contains(m); }); }); const live = scope.filter(function(m) { return m.getClientRects().length; }); if (live.length) { scope = live; } const seenMsg = {}; scope.forEach(function(m) { const holder = m.closest("[data-message-id], [data-legacy-message-id]") || m.querySelector("[data-message-id], [data-legacy-message-id]"); const id = holder ? (holder.getAttribute("data-message-id") || holder.getAttribute("data-legacy-message-id") || "") : ""; if (id) { if (seenMsg[id]) { return; } seenMsg[id] = true; } const sender = m.querySelector(".gD"); const when = m.querySelector(".g3, .gK span[title], span.g3"); const body = m.querySelector(".a3s.aiL, .ii.gt div, .ii.gt, .a3s, [dir] > div"); const to = m.querySelector(".hb, .g2, span.hb"); if (!body && !sender) { return; } msgs.push({ from: sender ? (sender.getAttribute("name") || sender.textContent || "").trim() : "", email: sender ? (sender.getAttribute("email") || "") : "", to: to ? (to.textContent || "").trim() : ugfT("to me"), date: when ? (when.getAttribute("title") || when.textContent || "").trim() : "", html: body ? body.innerHTML : "" }); }); // the label chips Gmail puts beside the subject, and its "n of m" counter const chips = []; document.querySelectorAll("h2.hP ~ div .hN, .ha .hN, .qh").forEach(function(c) { const t = (c.textContent || "").trim(); if (t && t.length < 24 && chips.indexOf(t) === -1) { chips.push(t); } }); const counter = document.querySelector(".Dj, .ts"); const danger = document.querySelector(".Ln, .aA6, div[data-phishing-warning]"); return { subject: subject ? subject.textContent.trim() : "", msgs: msgs, chips: chips, counter: counter ? (counter.textContent || "").replace(/\s+/g, " ").trim() : "", danger: danger ? (danger.textContent || "").replace(/\s+/g, " ").trim().slice(0, 240) : "" }; } // The list a conversation was opened from: its address minus the conversation id function ugfGmailListHash() { const parts = String(window.location.hash || "#inbox").split("/"); if (parts.length > 1 && /^[A-Za-z0-9_-]{16,}$/.test(parts[parts.length - 1])) { parts.pop(); } const h = parts.join("/"); return h && h !== "#" ? h : "#inbox"; } function ugfGmailThreadLabel() { const h = window.location.hash || "#inbox"; const m = h.match(/^#(label\/)?([^/?]+)/); let name = m ? decodeURIComponent(m[2]) : "Inbox"; if (/^(inbox|all|starred|sent|drafts|spam|trash|imp|snoozed)$/i.test(name)) { const map = { inbox: "Inbox", all: "All Mail", starred: "Starred", sent: "Sent Mail", drafts: "Drafts", spam: "Spam", trash: "Trash", imp: "Important", snoozed: "Snoozed" }; name = map[name.toLowerCase()] || name; } return name; } function ugfGmailRenderThread(shell, era, feat) { const t = ugfGmailThread(); if (!t.msgs.length) { return false; } const chrome = ugfGmailChrome(era); const classic = chrome === "classic"; const esc = ugfEscapeHtml; const label = t.chips.length ? t.chips[0] : ugfGmailThreadLabel(); const spam = /^#spam\b/.test(window.location.hash || "") || /spam/i.test(label) || ugfGmailAlt(["Spam"]).some(function(w) { return String(label).toLowerCase() === String(w).toLowerCase(); }); let bar; if (classic) { bar = '« Back to ' + esc(label) + "" + '' + '' + '' + (feat.del ? '" : "") + (feat.moveLabels ? '' : "") + ''; } else if (chrome === "m2013" || chrome === "kennedy") { bar = '" + (spam ? '' + '' : (chrome === "kennedy" ? '' + '' + '" : '" + '" + '")) + (chrome === "kennedy" ? '' + '' : '' + '') + ''; } else { bar = '" + (spam ? '' : '" + '" + '") + '' + '" + (feat.snooze ? '" : "") + '" + '" + '"; } const counter = t.counter || "1 of " + Math.max(1, ugfGmailRows().length); const nav = classic ? '
« Newer ' + esc(counter) + ' Older »
' : (chrome === "m2018" ? '
' + esc(counter) + "" + '" + '" + '
" : '
' + esc(counter) + "" + '" + '" + '
'); let html = '
' + '
' + bar + nav + "
" + '

' + esc(t.subject || ugfT("(no subject)")) + '' + esc(label) + ' ×' + (classic || chrome === "kennedy" ? "" : '' + '" + '") + "

"; if (t.danger) { html += '
This message seems dangerous
' + '
' + esc(t.danger) + "
"; } t.msgs.forEach(function(m) { const initial = (m.from || m.email || "?").trim().charAt(0) || "?"; html += '
' + '' + esc(initial) + "" + '' + esc(m.from || m.email) + "" + (m.email ? ' <' + esc(m.email) + ">" : "") + '' + esc(m.to || ugfT("to me")) + " ▾" + '' + esc(m.date) + "" + (chrome === "kennedy" || chrome === "m2013" ? '☆' + '" + '' : "") + (classic || chrome === "kennedy" || chrome === "m2013" ? "" : '" + '" + '") + "
" + '
' + m.html + "
"; }); if (chrome === "kennedy" || chrome === "m2013") { html += '
' + '
Click here to Reply or Forward
'; } else { html += '
' + '" + '" + "
"; } if (classic) { html += '"; } html += "
"; const main = shell.querySelector("#ugf-gmail-main"); main.innerHTML = trusted_policy.createHTML(html); // history.back() went nowhere when the conversation was opened straight from // a link, and elsewhere when Gmail had put its own steps in the history. The // mailbox is in the address itself: #trash/ -> #trash. const goBack = function(ev) { if (ev) { ev.preventDefault(); } const to = ugfGmailListHash(); if (window.location.hash !== to) { window.location.hash = to; } setTimeout(ugfGmailRender, 900); }; main.querySelector("#ugf-gmail-back").addEventListener("click", goBack); const foot = main.querySelector("[data-back]"); if (foot) { foot.addEventListener("click", goBack); } main.querySelectorAll("[data-msg]").forEach(function(b) { b.addEventListener("click", function() { const last = t.msgs[t.msgs.length - 1]; if (b.getAttribute("data-msg") === "reply") { ugfGmailCompose({ to: last.email, subject: /^re:/i.test(t.subject) ? t.subject : "Re: " + t.subject, body: "\n\n---------- On " + last.date + ", " + (last.from || last.email) + " wrote: ----------\n" }); } else { ugfGmailCompose({ to: "", subject: "Fwd: " + t.subject }); } }); }); main.querySelectorAll("[data-nav]").forEach(function(b) { b.addEventListener("click", function(ev) { ev.preventDefault(); const which = b.getAttribute("data-nav") === "prev" ? "Newer" : "Older"; if (!ugfGmailClickReal(ugfGmailLabelSel([which]))) { goBack(); } setTimeout(ugfGmailRender, 900); }); }); main.querySelectorAll("#ugf-gmail-thread [data-act]").forEach(function(b) { b.addEventListener("click", function() { const act = b.getAttribute("data-act"); if (act === "settings") { ugfGmailState().settings = true; ugfGmailRender(); return; } if (act === "print") { window.print(); return; } if (act === "delete") { const inBin = /^#trash|^#spam/.test(window.location.hash || ""); const disarm = ugfGmailArm(); let btn = null; try { btn = ugfGmailActionBtn(inBin ? ["Delete forever", "Delete"] : ["Delete", "Move to Trash", "Delete forever"]); } catch (e) {} if (!btn) { disarm(); console.log("[Gplex] Gmail: Gmail did not offer Delete on this conversation"); return; } const listHash = ugfGmailListHash(); ugfGmailRealClick(btn); ugfGmailConfirm(function() { setTimeout(disarm, 400); setTimeout(function() { if (/^#[^/]+\/.+/.test(window.location.hash || "") && window.location.hash !== listHash) { window.location.hash = listHash; } ugfGmailRender(); }, 700); }); return; } // Gmail's own words for each, in whatever language Gmail is set to const map = { archive: ugfGmailLabelSel(["Archive"]), spam: ugfGmailLabelSel(["Report spam"]), notspam: ugfGmailLabelSel(["Not spam"]), "delete": ugfGmailLabelSel(["Delete", "Delete forever"]), unread: ugfGmailLabelSel(["Mark as unread"]), snooze: ugfGmailLabelSel(["Snooze"]), move: ugfGmailLabelSel(["Move to"]), labels: ugfGmailLabelSel(["Labels"]), more: ugfGmailLabelSel(["More"]), star: '[aria-label*="Star"], .T-KT', popout: ugfGmailLabelSel(["In new window"]) }; if (!map[act] || !ugfGmailClickReal(map[act])) { return; } setTimeout(ugfGmailRender, 1200); }); }); return true; } // ---- settings, with the tabs and rows each era actually had ---- function ugfGmailGeneralRows(era) { const rows = [ ["Language", 'Gmail display language: English (US)Show all language options'], ["Maximum page size", "Show 50 conversations per page"], ["Keyboard shortcuts", '' + ''], ["Personal level indicators", '' + ''], ["Snippets", '' + ''], ["Vacation responder", '' + ''], ["Signature", ''] ]; if (era === "g2009" || era === "g2010" || era === "g2011" || era === "g2013" || era === "g2018") { rows.splice(3, 0, ["Browser connection", '' + '']); rows.push(["My picture", "Select a picture that everyone will see when you email them."]); } if (era === "g2011" || era === "g2013" || era === "g2018") { rows.splice(3, 0, ["Button labels", '' + '']); } if (era === "g2013" || era === "g2018") { rows.splice(2, 0, ["Hover actions", '' + '']); rows.push(["Stars", "1 star   4 stars   all stars"]); } if (era === "g2018") { rows.splice(2, 0, ["Nudges", '' + '']); rows.push(["Smart Compose", '' + '']); } return rows; } // Every settings tab is rendered here rather than handed back to modern Gmail, // with the options each era actually offered. function ugfGmailTabRows(tab, era, feat) { const esc = ugfEscapeHtml; const radio = function(group, opts) { let h = ""; opts.forEach(function(o, i) { h += '"; }); return h; }; const check = function(opts) { let h = ""; opts.forEach(function(o) { h += '"; }); return h; }; const imap = feat.settings.join("|").indexOf("IMAP") > -1; if (tab === "Accounts" || tab === "Accounts and Import") { const rows = []; if (tab === "Accounts and Import") { rows.push(["Import mail and contacts", 'Import from Yahoo!, Hotmail, AOL, or other webmail or POP3 accounts.' + 'Import mail and contacts']); } rows.push(["Change account settings", 'Google Account settings' + 'Change password  ·  Change password recovery options']); rows.push(["Send mail as", esc(ugfGmailAccount() || "you@gmail.com") + " (default)" + 'Add another email address you own']); rows.push(["Check mail from other accounts", 'You have no other accounts set up.' + 'Add a mail account']); rows.push(["Grant access to your account", "No accounts have access." + 'Add another account']); if (era === "g2013" || era === "g2018" || era === "g2011") { // what this account really uses, or no figure at all const st = ugfGmailStorage(); rows.push(["Add additional storage", (st ? "You are currently using " + esc(st.used + " (" + Math.round(st.pct) + "%)") + " of your " + esc(st.total) + "." : "") + 'Buy more storage']); } return rows; } if (tab === "Labels") { const system = ["Inbox", "Starred", "Important", "Chats", "Sent Mail", "Drafts", "All Mail", "Spam", "Trash"]; let h = '' + (imap ? "" : "") + ""; system.forEach(function(n) { h += "' + (imap ? '' : "") + ""; }); // the person's own labels are the #label/ ones - comparing names only worked // while Gmail was in English const mine = ugfGmailLabels().filter(function(l) { return String(l.hash).indexOf("#label/") === 0 && system.indexOf(l.name) === -1; }).slice(0, 12); if (mine.length) { h += ''; mine.forEach(function(l) { h += "' + (imap ? '' : "") + ''; }); } h += "
LabelShow in label listShow in IMAP
" + esc(n) + 'show | hide
Labels
" + esc(l.name) + 'show | hideedit | remove
"; return [["Labels", h + 'Create new label']]; } if (tab === "Filters" || tab === "Filters and Blocked Addresses") { const rows = [["Filters", "You have no filters." + 'Create a new filter  ·  Import filters']]; if (tab === "Filters and Blocked Addresses") { rows.push(["Blocked addresses", "You currently have no blocked addresses."]); } return rows; } if (tab.indexOf("Forwarding") === 0) { const rows = [["Forwarding", radio("ugffwd", ["Disable forwarding", 'Forward a copy of incoming mail to ']) + 'Add a forwarding address'], ["POP Download", radio("ugfpop", ["Enable POP for all mail", "Enable POP for mail that arrives from now on", "Disable POP"]) + '1. Status: POP is disabled']]; if (imap) { rows.push(["IMAP Access", radio("ugfimap", ["Enable IMAP", "Disable IMAP"]) + 'Status: IMAP is disabled  ·  Configuration instructions']); } return rows; } if (tab === "Chat") { const rows = [["Chat", radio("ugfchat", ["Chat on", "Chat off"])], ["Auto-add suggested contacts", radio("ugfcontacts", [ "Automatically allow people I communicate with often to chat with me", "Only allow people that I've explicitly approved to chat with me"])], ["Sounds", radio("ugfsound", ["Play a sound when a new chat message arrives", "Do not play sounds"])], ["Chat history", radio("ugfhist", ["Save chat history in my Gmail account", "Never save chat history"])]]; if (era !== "g2004" && era !== "g2006") { rows.push(["Voice and video chat", 'Voice and video chat is installed.Learn more']); } return rows; } if (tab === "Web Clips") { return [["My clips", check([["Show my web clips above the Inbox", true]]) + 'Web clips show news headlines, blog posts, ads and other items above your messages.'], ["Search for clips", ' ']]; } if (tab === "Labs") { const labs = { g2009: ["Canned Responses", "Custom keyboard shortcuts", "Google Calendar gadget", "Mark as Read Button", "Pictures in chat", "Quick Links", "Right-side chat", "Signature tweaks", "Superstars", "Undo Send"], g2010: ["Canned Responses", "Custom keyboard shortcuts", "Google Calendar gadget", "Inbox preview", "Mark as Read Button", "Message sneak peek", "Nested Labels", "Right-side chat", "Smart Labels", "Undo Send"], g2011: ["Auto-advance", "Canned Responses", "Default 'Reply to all'", "Google Calendar gadget", "Multiple Inboxes", "Preview Pane", "Quote selected text", "Right-side chat", "Undo Send", "Unread message icon"], g2013: ["Auto-advance", "Canned Responses", "Custom keyboard shortcuts", "Multiple Inboxes", "Preview Pane", "Quote selected text", "Right-side chat", "Unread message icon"], g2018: ["Custom keyboard shortcuts", "Multiple Inboxes", "Preview Pane", "Right-side chat", "Unread message icon"] }; const list = labs[era] || labs.g2013; let h = ""; list.forEach(function(n, i) { h += '
' + esc(n) + "" + '' + '
'; }); return [["Labs", 'Labs are experimental features that may change, break or disappear at any time.' + h]]; } if (tab === "Offline") { if (era === "g2013" || era === "g2018") { return [["Offline Mail", radio("ugfoff", ["Enable offline mail", "Disable offline mail"]) + 'Store the last 30 days of mail on this computer so you can read it without a connection.']]; } return [["Offline Mail", radio("ugfoff", ["Enable Offline Mail for this computer", "Disable Offline Mail for this computer"]) + 'Offline Mail uses Gears to store your mail on this computer.']]; } if (tab === "Themes") { const themes = era === "g2018" ? ["Default", "Dark", "Soft Grey", "High Contrast", "Terminal", "Mountains", "Beach", "Tree"] : ["Classic", "Shiny", "Soft Grey", "High Contrast", "Ninja", "Tree", "Beach", "Planets"]; let h = '
'; themes.forEach(function(t, i) { h += '' + esc(t) + ""; }); h += "
"; return [["Choose a theme", h]]; } if (tab === "Inbox") { const rows = [["Inbox type", ''], ["Categories", check([["Primary", true], ["Social", true], ["Promotions", true], ["Updates", false], ["Forums", false]]) + 'Choose which message categories to show as inbox tabs.'], ["Importance markers", radio("ugfimp", ["Show markers", "No markers"])], ["Filtered mail", check([["Override filters - include important messages in the inbox", false]])]]; if (era === "g2018") { rows.push(["Reading pane", radio("ugfrp", ["No split", "Right of inbox", "Below inbox"])]); } return rows; } if (tab === "Priority Inbox") { return [["Priority Inbox sections", ''], ["Importance markers", radio("ugfpim", ["Show markers", "No markers"])], ["Filtered mail", check([["Override filters", false]])]]; } if (tab === "Add-ons") { return [["Installed add-ons", "No add-ons are installed." + 'Get add-ons']]; } if (tab === "Advanced") { const items = ["Auto-advance", "Templates", "Custom keyboard shortcuts", "Right-side chat", "Unread message icon", "Multiple Inboxes", "Preview Pane"]; let h = ""; items.forEach(function(n, i) { h += '
' + esc(n) + "" + '' + '
'; }); return [["Advanced", h]]; } return [[tab, "There is nothing to configure here on the " + esc(era.replace("g", "")) + " skin."]]; } function ugfGmailRenderSettings(shell, era, feat) { const esc = ugfEscapeHtml; let tabs = ""; feat.settings.forEach(function(name) { tabs += '" + esc(name) + ""; }); let body = ""; if (ugfGmailState().tab === "General") { ugfGmailGeneralRows(era).forEach(function(r) { body += '
' + esc(r[0]) + ':
' + r[1] + "
"; }); body += '
Categories:
' + '" + '" + 'Very buggy, not recommended. The category tabs often do not match what Gmail ' + "actually shows, so they are off unless you turn them on here.
" + '
Gplex for Gmail:
' + '" + '" + 'The layout itself is picked in Gplex settings on google.com. ' + 'Open this page without Gplex once.
'; } else { ugfGmailTabRows(ugfGmailState().tab, era, feat).forEach(function(r) { body += '
' + esc(r[0]) + ':
' + r[1] + "
"; }); } const main = shell.querySelector("#ugf-gmail-main"); main.innerHTML = trusted_policy.createHTML( '

Settings

' + '
' + tabs + "
" + '
' + body + "
" + '
' + '
'); main.querySelectorAll("#ugf-gmail-settings-tabs a").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailState().tab = a.getAttribute("data-tab"); ugfGmailRender(); }); }); main.querySelectorAll('input[name="ugfcats"]').forEach(function(r) { r.addEventListener("change", function() { ugfGmailSetCategories(r.value === "true"); ugfGmailRender(); }); }); main.querySelectorAll('input[name="ugfgplex"]').forEach(function(r) { r.addEventListener("change", function() { ugfGmailSetEnabled(r.value === "true"); if (r.value !== "true") { ugfGmailHide(); window.location.reload(); } }); }); const back = function() { ugfGmailState().settings = false; ugfGmailState().tab = "General"; if (/^#ugfsettings/.test(window.location.hash || "")) { window.location.hash = "#inbox"; } ugfGmailRender(); }; main.querySelector("#ugf-gmail-settings-cancel").addEventListener("click", back); main.querySelector("#ugf-gmail-settings-save").addEventListener("click", back); const real = main.querySelector("#ugf-gmail-realsettings"); if (real) { real.addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailHide(); ugfGmailClickReal('[aria-label="Settings"], [data-tooltip="Settings"]'); }); } return true; } // ---- the notice shown the first time Gmail is opened with Gplex on ---- function ugfGmailNoticeSeen() { let v = null; try { v = window.localStorage.getItem("UGF_GMAIL_NOTICE"); } catch (e) {} if (v === null || v === undefined) { try { if (typeof GM_getValue === "function") { v = GM_getValue("UGF_GMAIL_NOTICE", null); } } catch (e) {} } return String(v) === "1"; } function ugfGmailNoticeMarkSeen() { try { window.localStorage.setItem("UGF_GMAIL_NOTICE", "1"); } catch (e) {} try { if (typeof GM_setValue === "function") { GM_setValue("UGF_GMAIL_NOTICE", "1"); } } catch (e) {} } function ugfGmailNotice(era) { if (document.querySelector("#ugf-gmail-notice-scrim")) { return; } const esc = ugfEscapeHtml; const chrome = ugfGmailChrome(era); let opts = ""; Object.keys(UImessages).forEach(function(k) { if (k.indexOf("l") !== 0 || !/^l\d{4}/.test(k)) { return; } const value = k.slice(1); opts += '"; }); const scrim = document.createElement("div"); scrim.id = "ugf-gmail-notice-scrim"; scrim.innerHTML = trusted_policy.createHTML( '
' + '
Gplex for Gmail is active
' + '
Gmail is being shown in the layout you picked in Gplex. ' + "If you find that it impacts productivity, go to Gplex settings and turn it off.
" + '
' + '
Gplex for GmailTheme mail.google.com to match the layout' + '
' + '
LayoutUsed by both Google and Gmail' + '
" + "
" + '
' + "
"); document.body.appendChild(scrim); const toggle = scrim.querySelector("#ugf-gmail-notice-toggle"); toggle.classList.toggle("on", ugfGmailEnabled()); toggle.addEventListener("click", function() { const on = !toggle.classList.contains("on"); toggle.classList.toggle("on", on); ugfGmailSetEnabled(on); }); scrim.querySelector("#ugf-gmail-notice-layout").addEventListener("change", function(ev) { ugfSaveLayout(ev.target.value); layout = ugfRuntimeLayout(ev.target.value); ugfGmailRender(); ugfGmailSetFavicon(); const n = document.querySelector("#ugf-gmail-notice"); if (n) { n.setAttribute("chrome", ugfGmailChrome(ugfGmailEra())); } }); scrim.querySelector("#ugf-gmail-notice-close").addEventListener("click", function() { ugfGmailNoticeMarkSeen(); scrim.remove(); if (!ugfGmailEnabled()) { ugfGmailHide(); window.location.reload(); } }); } // ---- favicon, matched to the layout the way google.com already does ---- function ugfGmailSetFavicon() { const a = ugfGmailAssets(); const era = ugfGmailEra(); // Gmail kept the multicolour envelope "m" until the 2013 redesign brought the red M const href = (era === "g2013" || era === "g2018") ? a.favicon : a.faviconClassic; if (!href) { return; } ugfApplyFavicon(href); let ticks = 0; if (ugfGmailSetFavicon.iv) { clearInterval(ugfGmailSetFavicon.iv); } ugfKeepFavicon(function() { return href; }); ugfGmailSetFavicon.iv = setInterval(function() { ugfApplyFavicon(href); if (++ticks > 20) { clearInterval(ugfGmailSetFavicon.iv); } }, 500); } // The Google bar: plain blue links on the 2004-2010 skins, the dark strip from // Nov 2011, and nothing from 2013 on, when the app launcher replaced it. // The name shown on the bar follows the "Display name" option in Gplex settings. function ugfGmailShared(key) { try { if (typeof GM_getValue === "function") { const v = GM_getValue(key, ""); return v ? String(v) : ""; } } catch (e) {} return ""; } function ugfGmailIdentity() { if (ugfGmailIdentity.c) { return ugfGmailIdentity.c; } let name = ""; let mail = ""; let photo = ""; const a = document.querySelector('a[aria-label*="Google Account"], a[aria-label*="@"], [aria-label*="Account Information"]'); const label = a ? (a.getAttribute("aria-label") || a.getAttribute("title") || "") : ""; const m = label.match(/[\w.+-]+@[\w.-]+/); if (m) { mail = m[0]; } const parts = label.split(": "); if (parts.length > 1) { name = parts[1].split("\n")[0].split("(")[0].trim(); } const img = document.querySelector("[aria-label*='Google Account'] img, a[aria-label*='@'] img, img.gb_p, img[alt*='Profile']"); if (img && img.getAttribute("src")) { photo = img.getAttribute("src"); } // (6.5.5) keep what Gmail's own account button says, for Google pages that have none to read // (the lightweight pages old browsers get) if (name && mail) { try { if (typeof GM_setValue === "function") { GM_setValue("UGF_USERNAME", name); GM_setValue("UGF_EMAIL", mail); if (photo && !/^data:/.test(photo)) { GM_setValue("UGF_PFP", photo); } } } catch (e) {} } // whatever Gmail did not give us, take from what google.com parsed name = name || ugfGmailShared("UGF_USERNAME"); mail = mail || ugfGmailShared("UGF_EMAIL"); photo = photo || ugfGmailShared("UGF_PFP"); const out = { name: name, first: name.split(" ")[0] || "", email: mail, photo: photo }; if (name || mail) { ugfGmailIdentity.c = out; } return out; } // the +You control never said "+account"; with the name hidden it just said "You" function ugfGmailPlusName() { const n = ugfGmailDisplayName(); return n === "account" ? "You" : n; } function ugfGmailNameMode() { // re-read each time: the choice may have been changed on google.com since load const shared = ugfGmailShared("UGF_NAME_EMAIL"); return shared || nameEmail || "name"; } function ugfGmailDisplayName() { const id = ugfGmailIdentity(); const mode = ugfGmailNameMode(); if (mode === "email") { return id.email || "account"; } if (mode === "none") { return "account"; } return id.first || id.email || "account"; } // One bar per era, matching the ones Gplex already draws on google.com: // 2007-2009 plain white links, 2010 the white bar with the blue rule, // 2011 the dark bar, 2012 onward the dark bar with +Name. function ugfGmailGbar(era, chrome) { // The legacy (old browser) layouts carry the Late 2011-2012 bar, as they do on // google.com: Google kept serving that bar to old browsers long after the // modern pages had moved on. const legacy = ugfGmailLegacy(); // the bar arrived in 2007 and was dropped in late 2013, when the app // launcher took over - so 2014 onward has none if (!legacy && (chrome === "m2018" || era === "g2004" || era === "g2006")) { return ""; } // late 2012 to 2015 carry the +You bar const lay = String(layout || ""); if (!legacy && era === "g2013" && !ugfGmailPre2014()) { return ""; } const esc = ugfEscapeHtml; const who = ugfGmailDisplayName(); const href = { Web: "https://www.google.com/", Search: "https://www.google.com/", Images: "https://www.google.com/imghp", Video: "https://www.google.com/videohp", Videos: "https://www.google.com/videohp", Maps: "https://www.google.com/maps", News: "https://news.google.com/", Shopping: "https://www.google.com/shopping", Gmail: "https://mail.google.com/", Play: "https://play.google.com/", YouTube: "https://www.youtube.com/", Drive: "https://drive.google.com/", Calendar: "https://calendar.google.com/", Documents: "https://docs.google.com/document/", Docs: "https://docs.google.com/document/" }; const dark = legacy || era === "g2011" || era === "g2013"; // +You arrived in 2012; the legacy 2010/2011 values predate it. It always // carried the name, whatever the display-name option says for the right side. const plus = dark && !legacy && ugfGmailPlusEra(); const apps = dark ? ["Search", "Images", "Maps", "Play", "YouTube", "News", "Gmail", ugfDocsLabel(), "Drive", "Calendar"].filter(ugfDvGbarKeep) : (era === "g2010" ? ["Web", "Images", "Videos", "Maps", "News", "Shopping", "Gmail", ugfDocsLabel()] : ["Web", "Images", "Video", "Maps", "News", "Shopping", "Gmail", ugfDocsLabel()]); let links = plus ? '+' + esc(ugfGmailPlusName()) + "" : ""; apps.forEach(function(name) { links += '" + esc(name) + ""; }); links += '' + (dark ? "More" : "more") + " ▾"; const late = era === "g2013" && !legacy; // the +You bar (late 2012 to 2015) has nothing on the right const right = dark ? (late ? "" : '' + esc(who) + "" + '' + ugfGmailIcon("gear", 16) + "") : 'iGoogle|' + 'Search settings|' + '' + esc(who) + "" + (era === "g2010" ? '' + ugfGmailIcon("gear", 15) + "" : ""); return '
' + links + "
" + '
' + right + "
"; } // 2012 and 2013 are the +You years: the dark bar carries +Name and the header // carries the name / count / Share / photo block. 2014 on has the app launcher. function ugfGmailPlusEra() { // "Late 2012-2013" is layout 2013; layout 2012 is "Late 2011-Early 2012" return ["2013", "2013L"].indexOf(String(layout || "")) > -1; } function ugfGmailEraGroup() { const l = String(layout || ""); // the legacy layouts keep the name and settings on the Google bar instead, the // way google.com hides its personal buttons on them if (ugfGmailLegacy()) { return ""; } // 2014 kept the name / count / Share / photo block even after the dark bar went if (ugfGmailPlusEra() || l === "2014") { return "g+"; } if (["2015", "2015L", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(l) > -1) { return "grid"; } return ""; } function ugfGmailAvatar() { const id = ugfGmailIdentity(); if (id.photo) { return '' + ugfEscapeHtml(id.name) + ''; } return '' + ugfEscapeHtml((id.first || id.email || "?").charAt(0)) + ""; } function ugfGmailPre2014() { return ["2013", "2013L"].indexOf(String(layout || "")) > -1; } // the "Legacy/old browser version" layouts function ugfGmailLegacy() { return ["2013L", "2015L", "2016L"].indexOf(String(layout || "")) > -1; } // The account dropdown, so the name and photo do something here the way they // do on the search pages. // Gmail labels its buttons with the keyboard shortcut appended ("Delete (#)"), // and the mailbox you left keeps a toolbar of its own, so match on the leading // words and insist the button is one that is actually live. // The wanted names come in English and are widened to Gmail's own words in the // other languages; the likelier wording wins when more than one control matches. function ugfGmailActionBtn(wanted) { const alts = ugfGmailAlt(wanted).map(function(w) { return String(w).toLowerCase(); }); let best = null; let bestRank = Infinity; let bestLive = false; // Trash and Spam put "Delete forever" (and "Not spam") on text-only buttons // with no label attribute at all, so the button's own words count too document.querySelectorAll('[aria-label], [data-tooltip], [title], [role="button"], button').forEach(function(el) { if (ugfGmailOurs(el)) { return; } let raw = (el.getAttribute("data-tooltip") || el.getAttribute("aria-label") || el.getAttribute("title") || "").trim(); if (!raw && (el.tagName === "BUTTON" || el.getAttribute("role") === "button")) { const txt = (el.textContent || "").replace(/\s+/g, " ").trim(); raw = txt.length < 40 ? txt : ""; } const lab = raw.replace(/[\u202a-\u202e]/g, "").replace(/\s*[([\uff08].*$/, "").trim().toLowerCase(); const rank = alts.indexOf(lab); if (rank === -1 || el.getAttribute("aria-disabled") === "true") { return; } // a live control beats one in a parked pane; then the likelier wording const live = ugfGmailShown(el); if (!best || (live && !bestLive) || (live === bestLive && rank < bestRank)) { best = el; bestRank = rank; bestLive = live; } }); return best; } function ugfGmailSay(msg) { const shell = document.querySelector("#ugf-gmail"); const count = shell && shell.querySelector("#ugf-gmail-count"); if (count) { count.textContent = msg; } } // Where to send a conversation. Spam and Trash have buttons of their own on // every layout; anything else goes through Gmail's move menu. function ugfGmailMovePlans(dest) { const d = String(dest || "").toLowerCase(); if (d === "spam") { return [ { buttons: ["Report spam", "Report as spam", "Mark as spam"] }, { buttons: ["Move to"], menuItem: ugfGmailBoxNames("Spam") } ]; } if (d === "trash") { return [ { buttons: ["Delete", "Move to Trash"] }, { buttons: ["Move to"], menuItem: ugfGmailBoxNames("Trash") } ]; } if (d === "important") { // Important is a marker, not a folder: Gmail sets it with "Mark as // important", which lives in the More menu (a toolbar button on some views) return [ { buttons: ["Mark as important"] }, { buttons: ["More", "More options", "More actions"], menuItem: ugfGmailAlt(["Mark as important"]) } ]; } if (d === "inbox") { return [ { buttons: ["Move to Inbox"] }, { buttons: ["Move to"], menuItem: ugfGmailBoxNames("Inbox") } ]; } // one of the person's own labels: its name is the same in every language return [{ buttons: ["Move to"], menuItem: [dest] }]; } // What a standard mailbox is called in Gmail's move menu: the English, the name // Gmail's own sidebar gives it right now (so whatever language Gmail is in), then // Gmail's usual words for it in the other languages. function ugfGmailBoxNames(name) { const out = [name]; const hash = ugfGmailHashFor(name); ugfGmailLabels().forEach(function(l) { if (hash && l.hash.split("/")[0] === hash && out.indexOf(l.name) === -1) { out.push(l.name); } }); ugfGmailAlt([name]).forEach(function(w) { if (out.indexOf(w) === -1) { out.push(w); } }); return out; } // Ticks Gmail's own checkboxes and works through the plans until one of them // finds a live control. Gmail is armed throughout and put back afterwards. function ugfGmailRunAction(picked, plans) { const disarm = ugfGmailArm(); let ticked = 0; try { picked.forEach(function(p) { const live = ugfGmailLiveRow(p); const cb = live ? live.querySelector('div[role="checkbox"], .oZ-jc, [role="checkbox"]') : null; if (cb) { if (cb.getAttribute("aria-checked") !== "true") { ugfGmailRealClick(cb); } ticked++; } }); } catch (e) { disarm(); console.log("[Gplex] Gmail: could not select those conversations - " + e); return; } const before = ugfGmailStamp(); const settle = function() { // Deleting out of Trash is permanent, and Gmail asks first - answer that // while its layer is still live, or the mail never actually goes. ugfGmailConfirm(function() { setTimeout(disarm, 400); ugfGmailAfterNav(before, function() { ugfGmailRender(); }); }); }; const attempt = function(i) { const plan = plans[i]; if (!plan) { disarm(); ugfGmailSay(ticked ? "Gmail did not offer that action" : "Could not select those conversations"); return; } let waits = 0; const go = setInterval(function() { waits++; let btn = null; try { btn = ugfGmailActionBtn(plan.buttons); } catch (e) { clearInterval(go); disarm(); console.log("[Gplex] Gmail: could not reach that button - " + e); return; } if (btn) { clearInterval(go); ugfGmailRealClick(btn); if (plan.menuItem) { ugfGmailMenuPick(plan.menuItem, function(ok) { if (ok) { settle(); } else { attempt(i + 1); } }); } else { settle(); } return; } if (waits > 14) { clearInterval(go); attempt(i + 1); } }, 150); }; attempt(0); } // Gmail puts up a confirmation for anything irreversible ("This will delete the // conversation forever"). Click through it if one appears; carry on if not. function ugfGmailConfirm(done) { let n = 0; const okWords = ["ok", "okay", "yes", "confirm", "delete", "delete forever"].concat( ugfGmailAlt(["OK", "Delete", "Delete forever"]).map(function(w) { return String(w).toLowerCase(); })); const sel = '[role="alertdialog"] button, [role="dialog"] button, ' + '[role="alertdialog"] [role="button"], [role="dialog"] [role="button"], ' + 'button[name="ok"], .Kj-JD button, .Kj-JD [role="button"]'; const iv = setInterval(function() { n++; let hit = null; try { document.querySelectorAll(sel).forEach(function(el) { if (hit || el.closest("#ugf-gmail")) { return; } const t = (el.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); if (okWords.indexOf(t) > -1 && ugfGmailShown(el)) { hit = el; } }); } catch (e) {} if (hit) { clearInterval(iv); console.log("[Gplex] Gmail: confirming - " + (hit.textContent || "").trim()); ugfGmailRealClick(hit); done(true); return; } if (n > 7) { clearInterval(iv); // no dialog: nothing to confirm done(false); } }, 150); } // After Gmail's "Move to" opens, pick the destination out of its menu. // text is a name or a list of names, likeliest first function ugfGmailMenuPick(text, done) { let n = 0; const wants = (Array.isArray(text) ? text : [text]).map(function(w) { return String(w).toLowerCase(); }); const iv = setInterval(function() { n++; let hit = null; let rank = Infinity; document.querySelectorAll('[role="menuitem"], .J-N, .J-LC .J-N').forEach(function(el) { if (ugfGmailOurs(el)) { return; } const t = (el.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); const r = wants.indexOf(t); if (r > -1 && r < rank && ugfGmailShown(el)) { hit = el; rank = r; } }); if (hit) { clearInterval(iv); ugfGmailRealClick(hit); done(true); return; } if (n > 16) { clearInterval(iv); done(false); } }, 150); } // Everywhere a conversation can go: the standard mailboxes plus the person's // own labels, minus wherever they already are. function ugfGmailMoveDests() { const out = []; const seen = {}; const here = ugfGmailViewFromHash(window.location.hash); const push = function(n) { const k = String(n || "").toLowerCase(); if (!k || seen[k]) { return; } seen[k] = true; out.push(n); }; ["Inbox", "Important", "Spam", "Trash"].forEach(function(n) { if (ugfGmailHashFor(n) !== here) { push(n); } }); ugfGmailLabels().forEach(function(l) { if (String(l.hash).indexOf("#label/") === 0 && l.hash !== here) { push(l.name); } }); return out; } function ugfGmailMoveMenu(anchor, chrome, onPick) { const shell = document.querySelector("#ugf-gmail"); if (!shell || !anchor) { return; } if (document.querySelector("#ugf-gmail-movemenu")) { ugfGmailCloseMenus(); return; } ugfGmailCloseMenus(); const esc = ugfEscapeHtml; const dests = ugfGmailMoveDests(); const menu = document.createElement("div"); menu.id = "ugf-gmail-movemenu"; menu.setAttribute("chrome", chrome || ""); menu.innerHTML = trusted_policy.createHTML( '
Move to
' + (dests.length ? dests.map(function(d, i) { const own = ["Inbox", "Important", "Spam", "Trash"].indexOf(d) === -1; return '" + esc(d) + ""; }).join("") : '
No other mailboxes
')); // outside the shell: a repaint rebuilds that, and took the menu with it document.body.appendChild(menu); const r = anchor.getBoundingClientRect(); menu.style.left = Math.round(r.left) + "px"; menu.style.top = Math.round(r.bottom + 2) + "px"; const box = menu.getBoundingClientRect(); if (box.right > window.innerWidth - 8) { menu.style.left = Math.max(8, Math.round(window.innerWidth - box.width - 8)) + "px"; } menu.querySelectorAll("a[data-d]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const d = dests[parseInt(a.getAttribute("data-d"), 10)]; ugfGmailCloseMenus(); if (d) { ugfGmailSay("Moving to " + d + "\u2026"); onPick(d); } }); }); const away = function(ev) { if (!menu.contains(ev.target)) { ugfGmailCloseMenus(); document.removeEventListener("mousedown", away); } }; const esckey = function(ev) { if (ev.key === "Escape") { ugfGmailCloseMenus(); document.removeEventListener("keydown", esckey); } }; setTimeout(function() { document.addEventListener("mousedown", away); document.addEventListener("keydown", esckey); }, 0); } function ugfGmailCloseMenus() { document.querySelectorAll("#ugf-gmail-accmenu, #ugf-gmail-appsmenu, #ugf-gmail-accfence, #ugf-gmail-movemenu").forEach(function(el) { el.remove(); }); } function ugfGmailAccountMenu(anchor, chrome) { if (document.querySelector("#ugf-gmail-accmenu")) { ugfGmailCloseMenus(); return; } const esc = ugfEscapeHtml; const id = ugfGmailIdentity(); const photo = id.photo ? '' : '' + esc((id.first || id.email || "?").charAt(0)) + ""; const fence = document.createElement("div"); fence.id = "ugf-gmail-accfence"; const menu = document.createElement("div"); menu.id = "ugf-gmail-accmenu"; menu.setAttribute("chrome", chrome); menu.innerHTML = trusted_policy.createHTML( '
' + photo + '
' + esc(id.name || id.first || "Account") + "" + '' + esc(id.email) + "" + 'Google Account settings
' + '
' + 'Add account' + 'Sign out' + "
" + ''); document.body.appendChild(fence); document.body.appendChild(menu); const r = anchor.getBoundingClientRect(); const w = 300; let left = r.right - w; if (left < 8) { left = 8; } if (left + w > window.innerWidth - 8) { left = window.innerWidth - w - 8; } menu.style.left = left + "px"; menu.style.top = (r.bottom + window.scrollY + 4) + "px"; fence.addEventListener("click", ugfGmailCloseMenus); } // the app launcher, with the same set google.com's grid offers // The launcher is the same grid google.com gets, ported across with its ids so // the sprite icons and sector layout come along unchanged. function ugfGmailAppsList() { return [ [["myaccount", "https://myaccount.google.com/", "My Account"], ["google-search", "https://www.google.com", "Search"], ["maps", "https://maps.google.com", "Maps"], ["youtube", "https://youtube.com", "YouTube"], ["play", "https://play.google.com", "Play"], ["news", "https://news.google.com", "News"], ["envelope", "https://mail.google.com", "Gmail"], ["drive", "https://drive.google.com", "Drive"], ["calendar", "https://google.com/calendar", "Calendar"], ["plus", gPlusLink || "https://plus.google.com/", "Google+"], ["translate", "https://translate.google.com", "Translate"], ["photos", "https://photos.google.com", "Photos"], // Docs, Sheets and Slides: a row of their own ["gp-docs", "https://docs.google.com/document/u/0/", "Docs"], ["gp-sheets", "https://docs.google.com/spreadsheets/u/0/", "Sheets"], ["gp-slides", "https://docs.google.com/presentation/u/0/", "Slides"]], [["shopping", "https://www.google.com/shopping", "Shopping"], ["wallet", "https://wallet.google.com", "Wallet"], ["finance", "https://www.google.com/finance", "Finance"], ["books", "https://books.google.com", "Books"], ["blogger", "https://www.blogger.com", "Blogger"], ["contacts", "https://www.google.com/contacts", "Contacts"], ["hangouts", "https://hangouts.google.com", "Hangouts"], ["chrome", "https://www.google.com/chrome/", "Chrome"]] ]; } // The sheet the grid already uses is Google's Material-era artwork, which is the // right generation for 2015-2019. 2020 is when Google redrew part of the set - and // only part of it, which is why the rest still comes from the same place Google // serves it from today. Earlier generations are not reachable from here. function ugfGmailGridArt() { const lay = String(layout || ""); // The four-colour capital G arrived in September 2015, so early 2015 still // belongs to the old set - 2015L is the one that gets the new mark. if (["2012", "2013", "2013L", "2014", "2015"].indexOf(lay) > -1) { // Before the 2015 rebrand Google was a lowercase "g", not the four-colour // capital, and Google+ was a red square. Both are carried inline. Books and // Contacts still have their pre-2015 artwork on Google's own legacy path. return { "google-search": UGF_G_2011, plus: UGF_GPLUS_2011, books: UGF_BOOKS_2011, contacts: UGF_CONTACTS_2011, translate: UGF_TRANSLATE_2011, // the sheet's has a capital G on it maps: UGF_MAPS_2011 // and so does the sheet's Maps mark }; } if (lay !== "2022") { return null; // keep the era's own sheet } const p2 = "https://www.gstatic.com/images/branding/product/2x/"; const q4 = function(n) { return p2 + n + "_2020q4_48dp.png"; }; const std = function(n) { return p2 + n + "_48dp.png"; }; return { // redrawn in the 2020 refresh envelope: q4("gmail"), drive: q4("drive"), calendar: q4("calendar"), docs: q4("docs"), maps: "https://www.gstatic.com/images/branding/productlogos/maps/v7/192px.svg", // untouched by it, so these are still the current artwork "google-search": std("googleg"), youtube: std("youtube"), play: std("play_prism"), news: std("news"), photos: std("photos"), translate: std("translate"), contacts: std("contacts"), shopping: std("shopping"), finance: std("finance"), blogger: std("blogger") }; } // Docs, Sheets and Slides in the app launcher: Google's product icons (the folded- // corner pages, the same as in the Docs menu), the 2020 redraw for 2020-2022 function ugfLauncherTrio(which) { const lay = String(layout || ""); return { url: "https://www.gstatic.com/images/branding/product/2x/" + which + (lay === "2022" ? "_2020q4" : "") + "_48dp.png", inline: false }; } function ugfLauncherTrioStyle(which) { const t = ugfLauncherTrio(which); return "background-image: url(" + t.url + ") !important; background-size: " + (t.inline ? "64px 64px" : "48px 48px") + " !important; background-position: " + (t.inline ? "0 0" : "center") + " !important; background-repeat: no-repeat !important;"; } function ugfGmailAppsMenu(anchor, chrome) { if (document.querySelector("#ugf-gmail-appsmenu")) { ugfGmailCloseMenus(); return; } const esc = ugfEscapeHtml; let html = ""; ugfGmailAppsList().forEach(function(sector) { html += '
'; sector.forEach(function(a) { html += '"; }); html += "
"; }); html += '"; const fence = document.createElement("div"); fence.id = "ugf-gmail-accfence"; const menu = document.createElement("div"); menu.id = "ugf-gmail-appsmenu"; menu.setAttribute("chrome", chrome); menu.innerHTML = trusted_policy.createHTML('
' + html + "
"); document.body.appendChild(fence); document.body.appendChild(menu); const r = anchor.getBoundingClientRect(); let left = r.right - 322; if (left < 8) { left = 8; } menu.style.left = left + "px"; menu.style.top = (r.bottom + window.scrollY + 6) + "px"; const art = ugfGmailGridArt(); if (art) { menu.querySelectorAll(".gp-app").forEach(function(el) { const url = art[el.id]; const ic = url && el.querySelector(".gp-app-icon"); if (!ic) { return; // no period artwork for this one: leave the sheet alone } ic.style.setProperty("background-image", 'url("' + url + '")', "important"); const inline = url.indexOf("data:") === 0; // the inline ones are already trimmed to 44px inside a 64px cell, the // same as the sheet; anything fetched gets centred at 48px instead ic.style.setProperty("background-size", inline ? "64px 64px" : "48px 48px", "important"); ic.style.setProperty("background-position", inline ? "0 0" : "center", "important"); ic.style.setProperty("background-repeat", "no-repeat", "important"); }); } ["docs", "sheets", "slides"].forEach(function(w) { const ic = menu.querySelector("#gp-" + w + " .gp-app-icon"); if (ic) { ic.setAttribute("style", ugfLauncherTrioStyle(w)); } }); fence.addEventListener("click", ugfGmailCloseMenus); } function ugfGmailWireAccount(shell, chrome) { const apps = shell.querySelector("#ugf-gmail-apps"); if (apps) { apps.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAppsMenu(apps, chrome); }); } // The name on the Google bar (late 2011-2012 and earlier, and the legacy layouts // that keep that bar) goes to the Google Account page, as it does on Search - the // dropdown only arrived with the late 2012 header block. shell.querySelectorAll("#ugf-gmail-gbar .who").forEach(function(el) { el.style.cursor = "pointer"; el.setAttribute("title", "Google Account"); el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); if (ev.ctrlKey || ev.metaKey || ev.button === 1) { window.open("https://myaccount.google.com/", "_blank"); } else { window.location.href = "https://myaccount.google.com/"; } }); }); const targets = []; shell.querySelectorAll("#ugf-gmail-account .pfpwrap, #ugf-gmail-account .pfp, #ugf-gmail-account .plusname").forEach(function(el) { if (targets.indexOf(el) === -1) { targets.push(el); } }); targets.forEach(function(el) { el.style.cursor = "pointer"; el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAccountMenu(el, chrome); }); }); } function ugfGmailLogoHTML(era, feat) { const esc = ugfEscapeHtml; const a = ugfGmailAssets(); let html = ""; if (era === "g2018") { // 2019 through 2021 keep the red envelope M; the four-colour lockup only // arrives with 2022. Both are Gmail's own artwork, carried inline so the // header does not depend on fetching anything. const fourColour = String(layout || "") === "2022"; html = '' + 'Gmail'; } else if (era === "g2013" && !ugfGmailPre2014()) { // from 2014 the Google wordmark of the day sits here, with the Gmail // mark down in the sidebar column html = 'Google'; } else { html = 'Gmail by Google'; } if (feat.beta) { html += 'BETA'; } return html; } function ugfGmailSyncSel(shell) { const bar = shell.querySelector("#ugf-gmail-toolbar"); if (!bar) { return; } let n = 0; shell.querySelectorAll("#ugf-gmail-list tr input").forEach(function(i) { if (i.checked) { n++; } }); bar.classList.toggle("has-sel", n > 0); } function ugfGmailRender() { const era = ugfGmailEra(); const feat = ugfGmailFeatures(era); const chrome = ugfGmailChrome(era); const settingsView = ugfGmailSettingsOpen(); const threadView = !settingsView && ugfGmailThreadOpen(); const rows = (threadView || settingsView) ? [] : ugfGmailRows(); const hereHash = (window.location.hash || "#inbox").split("/")[0]; const shellNow = document.querySelector("#ugf-gmail"); if (!threadView && !settingsView && !rows.length && !/^#search/.test(window.location.hash || "")) { ugfGmailPageEndGuard(ugfGmailPageInfo().page); } if (!threadView && !settingsView && !rows.length && !ugfGmailListSettled()) { // Only hold off while the first list is still arriving. Once a shell is up // and the view has moved on, showing the previous mailbox would be a lie - // render the empty state instead. if (!shellNow || shellNow.getAttribute("data-view") === hereHash) { return false; } } // Gmail fills a thread in asynchronously. Until its messages are readable, // leave the page as it is rather than swapping in an empty shell, and give up // altogether if they never arrive so the real message stays on screen. // (6.5.5) On a slow computer or an old browser Gmail can take a good while to open a message: wait // up to 30 seconds behind the loading screen (not Gmail's own page), and if Gmail hasn't opened // it from the address after 6 seconds, click the conversation in Gmail's list as well. if (threadView && !ugfGmailThread().msgs.length) { const now = Date.now(); if (!ugfGmailRender.waitSince) { ugfGmailRender.waitSince = now; } ugfGmailLoadingStart(); const last = ugfGmailOpenRow.last; if (last && !last.clicked && now - last.at > 6000) { last.clicked = true; const liveRow = ugfGmailLiveRow(last.item); if (liveRow) { ugfGmailRealClick(liveRow.querySelector(".bog span") || liveRow.querySelector(".bog") || liveRow.querySelector(".xT") || liveRow); } } // still nothing after 8 seconds: read it from Gmail's print view instead if (now - ugfGmailRender.waitSince > 8000) { ugfGmailPrintFetch(ugfGmailPrintTid()); } if (!ugfGmailRender.waitIv) { ugfGmailRender.waitIv = setInterval(function() { ugfGmailRender(); }, 1000); } if (now - ugfGmailRender.waitSince > 30000) { clearInterval(ugfGmailRender.waitIv); ugfGmailRender.waitIv = null; ugfGmailRender.waitSince = 0; ugfGmailHide(); } return false; } ugfGmailRender.waitSince = 0; if (ugfGmailRender.waitIv) { clearInterval(ugfGmailRender.waitIv); ugfGmailRender.waitIv = null; } const esc = ugfEscapeHtml; const h = document.querySelector("html"); let shell = document.querySelector("#ugf-gmail"); if (!shell) { shell = document.createElement("div"); shell.id = "ugf-gmail"; document.body.insertBefore(shell, document.body.firstChild); } ugfGmailLoadingDone(); shell.setAttribute("data-view", hereHash); shell.setAttribute("skin", era); shell.setAttribute("chrome", chrome); h.setAttribute("gplex-gmail", era); // the ported grid styles key off [layout], which only google.com was setting h.setAttribute("layout", String(layout || "")); const realLabels = ugfGmailLabels(); const account = ugfGmailAccount(); const unread = rows.filter(function(r) { return r.unread; }).length; const logoHTML = ugfGmailLogoHTML(era, feat); let listHTML = ""; rows.forEach(function(r, i) { listHTML += '' + '' + '★' + (feat.tabs ? '»' : "") + '' + esc(r.from) + "" + '' + esc(r.subject) + (r.snippet ? ' - ' + esc(r.snippet) + "" : "") + "" + '' + esc(r.date) + "" + (chrome === "m2018" ? '" + '" + '" + '" : "") + ""; }); // sidebar: the era's own list, matched against Gmail's real links where the names line up // the compose control is the real button out of each era's reference shot const A = ugfGmailAssets(); let navHTML; if (chrome === "m2013") { navHTML = (ugfGmailPre2014() ? "" : '
Gmail▾
') + 'Compose'; } else if (chrome === "kennedy") { navHTML = '
Mail
' + 'Compose Mail'; } else if (chrome === "m2018") { navHTML = 'Compose'; } else { navHTML = 'Compose Mail'; } const navItems = []; feat.sidebar.forEach(function(name) { let match = null; realLabels.forEach(function(l) { const norm = function(v) { return String(v).toLowerCase().replace(/\s+/g, "").replace(/mail$/, ""); }; if (!match && (norm(l.name) === norm(name) || (ugfGmailHashFor(name) && l.hash === ugfGmailHashFor(name)))) { match = l; } }); navItems.push({ name: name, real: match }); }); realLabels.forEach(function(l) { let known = false; navItems.forEach(function(n) { if (n.real === l || n.name.toLowerCase() === l.name.toLowerCase()) { known = true; } }); if (!known && navItems.length < 24) { navItems.push({ name: l.name, real: l, custom: true }); } }); let customStarted = false; navItems.forEach(function(n, i) { if (n.custom && !customStarted) { customStarted = true; navHTML += '
Labels
'; } const hash = ugfGmailHashFor(n.name) || (n.real ? n.real.hash : "") || ("#" + n.name.toLowerCase().replace(/\s+/g, "")); const here = ugfGmailViewFromHash(window.location.hash); const active = here === hash.split("/")[0]; const count = n.name === "Inbox" && unread ? unread : 0; navHTML += '" + (feat.navIcons ? ugfGmailNavIcon(n.name) : "") + // the person's own labels keep their names; Gmail's system ones do not "" + esc(n.name) + (count && !feat.navIcons ? " (" + count + ")" : "") + "" + (count && feat.navIcons ? '' + count + "" : "") + ""; }); if (feat.chat && chrome !== "m2018") { navHTML += '
Chat
Set status here
'; } // toolbar // In Trash and Spam the button really does destroy the mail, so it says so - // as Gmail's own does. let toolbarHTML; if (chrome === "classic") { toolbarHTML = '' + '' + (feat.del ? '" : "") + (feat.moveLabels ? '' : "") + '' + ''; } else if (chrome === "m2013" || chrome === "kennedy") { // 2011-2017: grey Kennedy buttons, and the actions only appear once // something is ticked, exactly as Gmail did it toolbarHTML = '' + '" + '' + '' + (chrome === "kennedy" ? '' + '' + '" : '" + '" + '") + (chrome === "kennedy" ? '' + '' : '' + '') + '' + ""; } else { toolbarHTML = '' + '" + '" + '' + '" + '" + '" + '' + '" + (feat.snooze ? '" : "") + '" + '" + '"; } const gbarHTML = ugfGmailGbar(era, chrome); const store = ugfGmailStorage(); // No era stand-in here any more: the figure is whatever this account really // uses, on every layout, or it is left out. A made-up number is worse than none. const used = store ? store.used + " (" + Math.round(store.pct) + "%)" : ""; const quota = store ? store.total : ""; const pct = store ? store.pct : 0; if (!ugfGmailStorage.said) { ugfGmailStorage.said = true; console.log(store ? '[Gplex] Gmail: storage read from Gmail - "' + store.text + '"' : "[Gplex] Gmail: could not read the storage figure; leaving it blank"); } else if (store && !ugfGmailStorage.saidOk) { ugfGmailStorage.saidOk = true; console.log('[Gplex] Gmail: storage read from Gmail - "' + store.text + '"'); } const cnt = ugfGmailCount(); const from = cnt ? cnt.from : (rows.length ? "1" : "0"); const to = cnt ? cnt.to : String(rows.length); const total = cnt ? cnt.total : String(rows.length); const pinfo = ugfGmailPageInfo(); const lastPage = ugfGmailLastPage(); const canOlder = !lastPage || pinfo.page < lastPage; const canNewer = pinfo.page > 1; let countHTML; if (chrome === "classic") { countHTML = "" + esc(from) + " - " + esc(to) + " of " + esc(total) + "" + '' + (canNewer ? '‹ Newer« Newest' : "") + (canOlder ? 'Older ›Oldest »' : "") + ""; } else { countHTML = esc(from) + "–" + esc(to) + " of " + esc(total) + (chrome === "m2018" ? "" : '' + '" + '"); } const selectHTML = feat.selectRow ? '
Select: All, None, ' + 'Read, Unread, ' + 'Starred, Unstarred
' : ""; let tabsHTML = ""; if (feat.tabs && ugfGmailCategoriesOn()) { const tabs = [["Primary", "inbox"], ["Social", "people"], ["Promotions", "tag"], ["Updates", "info"], ["Forums", "forum"]]; tabsHTML = '
'; tabs.forEach(function(t, i) { tabsHTML += '' + ugfGmailIcon(t[1], 18) + "" + t[0] + ""; }); tabsHTML += "
"; } const searchHTML = chrome === "classic" ? '
' + '" + '
' + (feat.searchLinks ? 'Show search optionsCreate a filter' : "") : (chrome === "kennedy" ? '
' + '' + '' + 'Show search options' + 'Create a filter
' : '
' + '▾' + '
"); const who = ugfGmailDisplayName(); const group = ugfGmailEraGroup(); let accountHTML; if (chrome === "m2018") { // 2019+ keeps the launcher, the notification bell and the avatar accountHTML = '' + ugfGmailIcon("apps", 20) + "" + '' + ugfGmailIcon("bell", 20) + '1' + ugfGmailAvatar(); } else if (group === "grid") { // Gmail and Images belong to the google.com header, not to Gmail's own accountHTML = '' + ugfGmailIcon("apps", 20) + "" + ugfGmailAvatar(); } else if (group === "g+") { // 2012-2014: +Name, the notification count, Share, then the photo accountHTML = '' + (ugfGmailNameMode() === "name" ? "+" + esc(ugfGmailPlusName()) : esc(who)) + "" + // 2014: the app grid joined the block, between the name and the count (String(layout || "") === "2014" ? '' + ugfGmailIcon("apps", 20) + "" : "") + '0' + '' + '' + ugfGmailAvatar() + '▾'; } else if (gbarHTML) { accountHTML = ""; } else { accountHTML = esc(account) + ' | Settings' + ' | Help' + ' | Sign out'; } // the footer changed shape over the years: one centred line, then three columns let footerHTML; if (chrome === "m2013" || chrome === "kennedy") { footerHTML = ''; } else { footerHTML = ''; } shell.innerHTML = trusted_policy.createHTML( gbarHTML + '
' + '" + '
' + searchHTML + "
" + '
' + accountHTML + "
" + "
" + '
' + '
' + navHTML + "
" + '
' + '
' + toolbarHTML + '' + countHTML + "" + (chrome === "m2018" ? '" + '" + '' + '' : "") + (chrome === "classic" ? "" : '") + "
" + selectHTML + tabsHTML + '' + (listHTML || '") + "
' + (ugfGmailIsRealSearch() ? (ugfGmailListSettled() ? "No conversations matched your search." : "Searching\u2026") : (ugfGmailListSettled() ? "0 Messages" : "Loading\u2026")) + "
" + "
" + "
" + footerHTML); if (settingsView) { ugfGmailRenderSettings(shell, era, feat); } else if (threadView) { ugfGmailRenderThread(shell, era, feat); } // if a logo bitmap ever fails, fall back to the red wordmark rather than nothing const gLogo = shell.querySelector("#ugf-gmail-logo img.google-mark"); if (gLogo) { gLogo.addEventListener("error", function() { gLogo.remove(); }); } const logoImg = shell.querySelector("#ugf-gmail-logo img.gmail-mark"); if (logoImg) { logoImg.addEventListener("error", function() { const fb = logoImg.getAttribute("data-fallback"); if (fb) { logoImg.removeAttribute("data-fallback"); logoImg.src = fb; return; } if (!logoImg.parentElement.querySelector(".wordmark")) { const span = document.createElement("span"); span.className = "wordmark"; span.textContent = "Gmail"; logoImg.parentElement.insertBefore(span, logoImg); } logoImg.remove(); }); } ugfGmailWireAccount(shell, chrome); const gbarSet = shell.querySelector("#ugf-gmail-gbar-settings"); if (gbarSet) { gbarSet.addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailState().settings = true; ugfGmailRender(); }); } const settingsLink = shell.querySelector("#ugf-gmail-settings-link"); if (settingsLink) { settingsLink.addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailState().settings = true; ugfGmailRender(); }); } shell.querySelectorAll("#ugf-gmail-list tr").forEach(function(tr) { tr.addEventListener("click", function(ev) { const cell = ev.target && ev.target.closest ? ev.target.closest(".ugf-gmail-check") : null; if (cell) { const box = cell.querySelector("input"); if (ev.target !== box) { box.checked = !box.checked; } tr.classList.toggle("checked", box.checked); ugfGmailSyncSel(shell); // mirror it onto Gmail's own checkbox so the toolbar acts on the right rows const item0 = rows[parseInt(tr.getAttribute("data-i"), 10)]; const live0 = item0 ? ugfGmailLiveRow(item0) : null; const real = live0 ? live0.querySelector('div[role="checkbox"], .oZ-jc, [role="checkbox"]') : null; if (real && (real.getAttribute("aria-checked") === "true") !== box.checked) { ugfGmailRealClick(real); } return; } const item = rows[parseInt(tr.getAttribute("data-i"), 10)]; if (!item) { return; } if (ev.target && ev.target.closest(".ugf-gmail-star")) { const live = ugfGmailLiveRow(item); ev.target.closest(".ugf-gmail-star").classList.toggle("on"); if (live) { ugfGmailRealClick(live.querySelector(".T-KT, [aria-label*='Star']")); } return; } if (!ugfGmailOpenRow(item)) { const count = shell.querySelector("#ugf-gmail-count"); if (count) { count.textContent = "Could not open that conversation"; } return; } setTimeout(ugfGmailRender, 700); setTimeout(ugfGmailRender, 1600); }); }); shell.querySelectorAll("[data-page]").forEach(function(b) { b.addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailPage(b.getAttribute("data-page")); }); }); shell.querySelectorAll("#ugf-gmail-list [data-row]").forEach(function(b) { b.addEventListener("click", function(ev) { ev.stopPropagation(); const tr = b.closest("tr"); const item = rows[parseInt(tr.getAttribute("data-i"), 10)]; const live = item ? ugfGmailLiveRow(item) : null; if (!live) { return; } const act = b.getAttribute("data-row"); const rowSel = ugfGmailLabelSel([act === "unread" ? "Mark as unread" : act === "archive" ? "Archive" : act === "snooze" ? "Snooze" : "Delete"]); const inRow = live.querySelector(rowSel); if (inRow) { ugfGmailRealClick(inRow); } else { const cb = live.querySelector('div[role="checkbox"], .oZ-jc'); if (cb) { ugfGmailRealClick(cb); } setTimeout(function() { ugfGmailClickReal(rowSel); }, 200); } setTimeout(ugfGmailRender, 1200); }); }); shell.querySelectorAll("#ugf-gmail-nav a[data-n]").forEach(function(a) { a.addEventListener("click", function(ev) { const n = navItems[parseInt(a.getAttribute("data-n"), 10)]; if (!n) { return; } // ctrl/cmd/shift-click is the person asking for a new tab - the href is a // real mailbox URL, so let the browser handle it if (ev.ctrlKey || ev.metaKey || ev.shiftKey) { return; } const target = a.getAttribute("data-hash") || ugfGmailHashFor(n.name) || (n.real ? n.real.hash : ""); if (!target) { return; } ev.preventDefault(); const before = ugfGmailStamp(); const titleBefore = document.title; // Only the URL. Clicking Gmail's own nav link at the same time meant two // navigations racing, and going back to a mailbox could hang between them. if (window.location.hash !== target) { window.location.hash = target; } else { // Clicking the mailbox you are already in just redraws it. Only a // title that plainly names another mailbox justifies a load. if (!ugfGmailArrived(target)) { ugfGmailHardNav(target, "the page was showing another mailbox"); } else { ugfGmailRender(); } return; } shell.querySelectorAll("#ugf-gmail-nav a[data-n]").forEach(function(o) { o.classList.toggle("active", o === a); }); ugfGmailAfterNav(before, function() { if (ugfGmailLooksArrived(target, titleBefore) || !ugfGmailStuck(target, "the list did not change within 3.6s")) { ugfGmailRender(); } }); // The list changing is not proof we arrived: Gmail can swap in something // that is not the mailbox asked for. Check the title shortly after and // load the URL properly if we are still somewhere else. setTimeout(function() { if ((window.location.hash || "#inbox").split("/")[0] !== target.split("/")[0]) { return; } // The title alone is not evidence: Gmail does not always name a view // after its mailbox (Important often shows the inbox's title), and a // reload on that basis threw people out of Important. Only step in if // the mail on screen is still exactly what was there before the click. if (!ugfGmailArrived(target) && ugfGmailStamp() === before && !ugfGmailLooksArrived(target, titleBefore)) { console.log("[Gplex] Gmail: " + target + " never actually opened"); ugfGmailStuck(target, "the list was still showing the previous mailbox"); } }, 3000); }); }); shell.querySelector("#ugf-gmail-compose").addEventListener("click", function(ev) { ev.preventDefault(); ugfGmailCompose({}); }); const doSearch = function() { const q = String(shell.querySelector("#ugf-gmail-q").value || "").trim(); if (!q) { return; } ugfGmailSearchGo(q); }; const hashNow = window.location.hash || ""; if (/^#search\//.test(hashNow) && ugfGmailIsRealSearch()) { try { shell.querySelector("#ugf-gmail-q").value = decodeURIComponent(hashNow.slice(8).replace(/\+/g, " ")); } catch (e) {} } shell.querySelector("#ugf-gmail-search").addEventListener("click", doSearch); shell.querySelector("#ugf-gmail-q").addEventListener("keydown", function(ev) { if (ev.key === "Enter") { doSearch(); } }); const webBtn = shell.querySelector("#ugf-gmail-searchweb"); if (webBtn) { webBtn.addEventListener("click", function() { window.location = "https://www.google.com/search?q=" + encodeURIComponent(shell.querySelector("#ugf-gmail-q").value); }); } const selAll = shell.querySelector("#ugf-gmail-selall"); if (selAll) { selAll.addEventListener("change", function() { shell.querySelectorAll("#ugf-gmail-list tr").forEach(function(tr) { const box = tr.querySelector("input"); if (!box) { return; } box.checked = selAll.checked; tr.classList.toggle("checked", selAll.checked); }); ugfGmailSyncSel(shell); }); } shell.querySelectorAll("#ugf-gmail-select a[data-sel]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const how = a.getAttribute("data-sel"); shell.querySelectorAll("#ugf-gmail-list tr").forEach(function(tr) { const r = rows[parseInt(tr.getAttribute("data-i"), 10)]; const box = tr.querySelector("input"); if (!r || !box) { return; } const on = how === "all" || (how === "read" && !r.unread) || (how === "unread" && r.unread) || (how === "starred" && r.starred) || (how === "unstarred" && !r.starred); box.checked = on; tr.classList.toggle("checked", on); }); ugfGmailSyncSel(shell); }); }); shell.querySelectorAll("#ugf-gmail-toolbar button[data-act]").forEach(function(b) { b.addEventListener("click", function() { const act = b.getAttribute("data-act"); if (act === "refresh") { // ask Gmail itself to check for new mail, then repaint from what it has if (!ugfGmailFetchNew("Refresh")) { ugfGmailRender(); } return; } if (act === "prev" || act === "next") { ugfGmailPage(act === "prev" ? "newer" : "older"); return; } if (act === "density" || act === "tools") { return; } if (act === "settings") { ugfGmailState().settings = true; ugfGmailRender(); return; } const picked = []; shell.querySelectorAll("#ugf-gmail-list tr").forEach(function(tr) { const box = tr.querySelector("input"); if (box && box.checked) { picked.push(rows[parseInt(tr.getAttribute("data-i"), 10)]); } }); if (!picked.length) { const count = shell.querySelector("#ugf-gmail-count"); if (count) { count.textContent = "Select a conversation first"; } return; } // Gmail's own move menu lives in the layer we hide, so the person could // never see it. Offer the destinations ourselves. On the oldest layouts // there is no Move to button - moving lived under More actions - so that // is where it belongs there. if (act === "move" || (act === "more" && chrome === "classic" && !shell.querySelector('#ugf-gmail-toolbar [data-act="move"]'))) { ugfGmailMoveMenu(b, chrome, function(dest) { ugfGmailRunAction(picked, ugfGmailMovePlans(dest)); }); return; } const labels = { archive: ["Archive"], spam: ["Report spam", "Report as spam", "Mark as spam", "Spam"], "delete": /^#trash|^#spam/.test(window.location.hash || "") ? ["Delete forever", "Delete"] : ["Delete", "Delete forever", "Move to Trash", "Trash"], unread: ["Mark as unread"], snooze: ["Snooze"], labels: ["Labels", "Label as"], more: ["More", "More options"] }; const plans = [{ buttons: labels[act] || [act] }]; if (act === "spam") { // older layouts often only reach Spam through the move menu plans.push({ buttons: ["Move to", "Move to Inbox"], menuItem: ugfGmailBoxNames("Spam") }); } if (act === "delete" && !/^#trash/.test(window.location.hash || "")) { // in Trash there is nothing below Trash to fall back to plans.push({ buttons: ["Move to"], menuItem: ugfGmailBoxNames("Trash") }); } ugfGmailRunAction(picked, plans); }); }); if (!ugfGmailNoticeSeen() && !ugfGmailState().notice) { ugfGmailState().notice = true; ugfGmailNotice(era); } return true; } // Gmail's own search box lives inside the markup Gplex hides, and its hashchange // handler does not always fire for a script-set hash. So: drive the real box, // set the canonical search hash, and if neither moved the list, reload at that // URL, which Gmail always honours. function ugfGmailSearchHash(q) { return "#search/" + encodeURIComponent(q).replace(/%20/g, "+"); } function ugfGmailSearchGo(q) { const target = ugfGmailSearchHash(q); // Setting the hash alone is not enough: Gmail's router often ignores a // script-set hash, and its own search box is inside the markup we hide. // Loading the search URL for real is the one route it always honours. if (window.location.hash !== target) { window.location.hash = target; } window.location.reload(); } // An empty mailbox and a list that has not loaded yet look identical from the // outside - both have no rows. Treating them the same is what made Gplex give // up on empty mailboxes, so work out which one it is. function ugfGmailSettleClock() { const v = window.location.hash || "#inbox"; if (ugfGmailSettleClock.v !== v) { ugfGmailSettleClock.v = v; ugfGmailSettleClock.t = Date.now(); } return ugfGmailSettleClock.t || Date.now(); } function ugfGmailEmptyText() { const scope = document.querySelector('div[role="main"]') || document.body; if (!scope) { return false; } let hit = false; // English plus the languages actually in play - Gmail's and the browser's const empty = ugfGmailWordRe("_empty", ["no (new )?(mail|messages|conversations)", "no spam here", "nothing in", "is empty"], true); scope.querySelectorAll("td, div, span, p").forEach(function(el) { if (hit || el.children.length || ugfGmailOurs(el)) { return; } const t = (el.textContent || "").trim(); if (t.length < 80 && empty.test(t)) { hit = true; } }); return hit; } function ugfGmailListSettled() { if (ugfGmailRows().length) { return true; } const c = ugfGmailCount(); if (c && (String(c.total).replace(/[^\d]/g, "") === "0" || String(c.to).replace(/[^\d]/g, "") === "0")) { return true; // Gmail itself is saying there is nothing here } if (ugfGmailEmptyText()) { return true; } // otherwise call it settled once the view has held still for a moment return !!document.querySelector('div[role="main"]') && (Date.now() - ugfGmailSettleClock()) > 6000; } // Two empty mailboxes (Spam and Trash, say) look identical from the list, so an // unchanged list is not proof the switch failed. Count it as arrived when the // title moved to the mailbox asked for, or the mailbox says it is empty. function ugfGmailLooksArrived(target, titleBefore) { if ((window.location.hash || "#inbox").split("/")[0] !== String(target).split("/")[0]) { return true; // the person has gone somewhere else since - leave it alone } if (document.title !== titleBefore && ugfGmailArrived(target)) { return true; } if (!ugfGmailRows().length) { const c = ugfGmailCount(); if (ugfGmailEmptyText() || (c && (String(c.total).replace(/[^\d]/g, "") === "0" || String(c.to).replace(/[^\d]/g, "") === "0"))) { return true; } } return false; } function ugfGmailStamp() { const list = ugfGmailRows(); const cnt = ugfGmailCount(); return list.length + "|" + (list[0] ? list[0].subject + list[0].date : "") + "|" + (list[list.length - 1] ? list[list.length - 1].subject : "") + "|" + (cnt ? cnt.from + "-" + cnt.to + "/" + cnt.total : ""); } // Waits for the view to actually become something else. An emptied list does // not count as success - that was the flaw that let mailbox switches silently // do nothing. onFail runs if nothing happened inside the window. function ugfGmailAfterNav(before, onFail) { let n = 0; if (ugfGmailAfterNav.iv) { clearInterval(ugfGmailAfterNav.iv); } ugfGmailAfterNav.iv = setInterval(function() { n++; const now = ugfGmailStamp(); if (now !== before && (ugfGmailRows().length || ugfGmailListSettled())) { clearInterval(ugfGmailAfterNav.iv); ugfGmailAfterNav.iv = null; ugfGmailRender(); return; } // deliberately no repaint while waiting: repainting every poll wiped any // selection the user had just made if (n >= 9) { clearInterval(ugfGmailAfterNav.iv); ugfGmailAfterNav.iv = null; if (typeof onFail === "function") { onFail(); } } }, 400); } // Gmail fetches asynchronously, so after a search, a mailbox switch or a page // turn we repaint a few times rather than guessing one delay. function ugfGmailRepaint() { let n = 0; if (ugfGmailRepaint.iv) { clearInterval(ugfGmailRepaint.iv); } ugfGmailRepaint.iv = setInterval(function() { ugfGmailRender(); if (++n > 8) { clearInterval(ugfGmailRepaint.iv); ugfGmailRepaint.iv = null; } }, 450); } // Until the skin is ready, cover Gmail with a plain white screen and a spinner. // No branding of any kind on it - not Gmail's, not ours. function ugfGmailLoadingStart() { const h = document.querySelector("html"); h.setAttribute("gplex-gmail-loading", ""); if (document.querySelector("#ugf-gmail-loading")) { return; } const veil = document.createElement("div"); veil.id = "ugf-gmail-loading"; veil.innerHTML = trusted_policy.createHTML(''); (document.body || document.documentElement).appendChild(veil); } function ugfGmailLoadingDone() { const veil = document.querySelector("#ugf-gmail-loading"); if (veil) { veil.remove(); } document.querySelector("html").removeAttribute("gplex-gmail-loading"); } function ugfGmailHide() { ugfGmailLoadingDone(); const shell = document.querySelector("#ugf-gmail"); if (shell) { shell.remove(); } const scrim = document.querySelector("#ugf-gmail-notice-scrim"); if (scrim) { scrim.remove(); } ugfGmailCloseMenus(); document.querySelector("html").removeAttribute("gplex-gmail"); } // New mail: Gmail only adds it to the list it is holding when it checks, and with its own // page out of sight it does not always check on its own. Press Gmail's own Refresh (the // one in its hidden toolbar), then repaint a few times as the new rows come in. function ugfGmailFetchNew(why) { let btn = null; try { btn = ugfGmailPick(ugfGmailLabelSel(["Refresh"])); } catch (e) {} if (!btn) { return false; } ugfGmailFetchNew.t = Date.now(); const had = document.activeElement; try { ugfGmailRealClick(btn); } catch (e) { return false; } try { if (had && had !== document.activeElement && had.focus && had.closest && had.closest("#ugf-gmail")) { had.focus(); } else if (document.activeElement === btn && btn.blur) { btn.blur(); } } catch (e) {} if (why) { console.log("[Gplex] Gmail: checking for new mail (" + why + ")"); } setTimeout(ugfGmailRepaint, 700); return true; } // quietly, only when nothing is in progress: a list on screen, nothing ticked, no // compose window, menu or settings open, the tab in front function ugfGmailCanFetch() { const shell = document.querySelector("#ugf-gmail"); if (!shell || document.visibilityState !== "visible" || ugfGmailThreadOpen() || ugfGmailState().settings || document.querySelector("#ugf-gmail-compose-form, #ugf-gmail-movemenu, #ugf-gmail-accmenu, #ugf-gmail-appsmenu")) { return false; } // not while typing (pressing Gmail's button moves the keyboard to it) const act = document.activeElement; if (act && (act.tagName === "INPUT" || act.tagName === "TEXTAREA" || act.isContentEditable)) { return false; } return ![].some.call(shell.querySelectorAll("#ugf-gmail-list input[type='checkbox']"), function(b) { return b.checked; }); } function ugfGmailMain() { if (!ugfGmailEnabled()) { console.log("[Gplex] Gmail theming is switched off in Gplex settings"); return; } const styles = document.createElement("style"); styles.id = "ugf-gmail-styles"; styles.textContent = ugfGmailCss(); (document.head || document.documentElement).appendChild(styles); ugfGmailSetFavicon(); ugfGmailLoadingStart(); ugfGmailI18nStart(); // if the skin never comes up, give the real Gmail back rather than // leaving the user on a spinner setTimeout(function() { if (!document.querySelector("#ugf-gmail")) { ugfGmailLoadingDone(); } }, 20000); let tries = 0; let lastKey = ""; let stale = 0; const tick = function() { if (document.querySelector("#ugf-gmail-compose-form") || ugfGmailState().settings) { return; } if (ugfGmailWholeInbox()) { return; } const msgs = ugfGmailThreadOpen() ? ugfGmailThread().msgs.length : 0; const list = ugfGmailRows(); const cnt = ugfGmailCount(); // fingerprint the contents, not just how many there are const stamp = list.length + "|" + (list[0] ? list[0].subject + list[0].date : "") + "|" + (list[list.length - 1] ? list[list.length - 1].subject : "") + "|" + (cnt ? cnt.from + "-" + cnt.to + "/" + cnt.total : ""); const store = ugfGmailStorage(); const key = (window.location.hash || "") + "|" + stamp + "|" + msgs + "|" + (store ? store.used + "/" + store.total : ""); if (ugfGmailThreadOpen() && !msgs) { lastKey = ""; } const shellNow = document.querySelector("#ugf-gmail"); const here = (window.location.hash || "#inbox").split("/")[0]; // Self-heal: if what is on screen belongs to a different view than the // one we are on, keep trying no matter what the key says. if (shellNow && shellNow.getAttribute("data-view") !== here) { stale++; if (stale > 2) { lastKey = ""; } } else { stale = 0; } if (key !== lastKey) { let ok = false; try { ok = ugfGmailRender(); } catch (e) { console.log("[Gplex] Gmail render failed: " + (e && e.message)); } // Only remember the key once the render actually landed. Committing it // first meant a single failed or skipped render froze the view for good, // because the key never changed again. if (ok) { lastKey = key; } } }; // Independent of the key logic above: if the list we painted no longer matches // the list Gmail is holding, repaint. This recovers from any stuck state, // including ones the fingerprint cannot see. setInterval(function() { const shell = document.querySelector("#ugf-gmail"); if (!shell || document.querySelector("#ugf-gmail-compose-form") || ugfGmailState().settings || ugfGmailThreadOpen()) { return; } const live = ugfGmailRows(); const here0 = (window.location.hash || "#inbox").split("/")[0]; if (!live.length) { // an empty mailbox still has to be shown as the mailbox you picked if (shell.getAttribute("data-view") !== here0 && ugfGmailListSettled()) { console.log("[Gplex] Gmail: empty view was out of step, repainting"); lastKey = ""; try { ugfGmailRender(); } catch (e) {} } return; } const painted = shell.querySelector("#ugf-gmail-list .ugf-gmail-subject"); const shown = painted ? (painted.textContent || "").trim() : ""; const want = (live[0].subject || "").trim(); const here = (window.location.hash || "#inbox").split("/")[0]; if ((shown && want && shown.indexOf(want) !== 0) || shell.getAttribute("data-view") !== here) { console.log("[Gplex] Gmail: view was out of step, repainting"); lastKey = ""; try { ugfGmailRender(); } catch (e) {} } }, 1500); setInterval(function() { tries++; tick(); if (tries === 30 && !document.querySelector("#ugf-gmail")) { // show Gmail rather than hold a spinner, but keep watching: giving up // here is what left the page un-themed after a reload ugfGmailLoadingDone(); console.log("[Gplex] Gmail: still waiting for the message list"); } }, 500); window.addEventListener("hashchange", function() { setTimeout(tick, 600); }); // check for new mail every minute, and on coming back to the tab setInterval(function() { if (ugfGmailCanFetch() && Date.now() - (ugfGmailFetchNew.t || 0) > 55000) { ugfGmailFetchNew(""); } }, 60000); const back = function() { if (ugfGmailCanFetch() && Date.now() - (ugfGmailFetchNew.t || 0) > 20000) { ugfGmailFetchNew(""); } }; window.addEventListener("focus", back); document.addEventListener("visibilitychange", back); } // ---- Gplex for Google Docs (5.0) ------------------------------------------------ // The documents list is drawn by Gplex from what Google's own page lists; the // editor is Google's, re-dressed in the period's header, menus and toolbar so that // typing, saving, sharing and every menu keep working exactly as they do today. function ugfDocsArt() { if (!ugfDocsArt.a) { ugfDocsArt.a = {"logo2008":"data:image/gif;base64,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","logoSm":"data:image/gif;base64,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","logoSmBeta":"data:image/gif;base64,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","logo2010":"data:image/gif;base64,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","logo2007":"data:image/gif;base64,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","google2011":"data:image/png;base64,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","square2013":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAC20lEQVR42s1ZzWoTURT+zrn3TmZCrFLdtYi4FQqCWxHEgC/gQgs+gRvBRX0AsQvBp4gufAExqyL4AFYQFwWRFClULTVkJpk797hIRqqLmcn8MDkwZHfmm/N95zvn3hAA3HopF3R4+lSE70OwCSJCGyEiIIyI3GsbrD3fe0wndGdXzosL3+gg6MdhCIhDq0EMEwSwYTgkDu4x3GRHB0F/NhnHkETQdkgis8k41kHQh5vsaCey7aLIEaCBlqj9t4REEB1HkYPItgbJBlzCwApgOwMSLiGQbDCEGKsaQqxzv2Wu22be74A80es8cNYB0bSZ3vENQXM2yEyA1gFrAeH6FQWR+loozXVw5HAaChSXAMgMjKeCG1cVXjzwG6ngk1cR3n+xWAsIzlWgOFk8qiYtprmsy/eOQk3CC51wTQDTXEUUows4EgiArrGT01xFNE23n40lS8wdA1zsNWPiP8aCaZwNVOdVL4qBr8cCQr5nFZ4Ti1xGAUwVKVYMdHQjBYR1c5bKGzUBsQV+RYImStjzCUZng9RZ4GYW2Fxn3N3ScJJPR9FIc739aDH66eBlgMwEOI0FG+uEhzdNIxTvjxIcHAk6hpYHeJbiOGnGqGObbzWFmsSo+VNXpLmKfHAhm/l+Io1UMIrzK5hp1KlZJw2doxTXQDFRvfT+P5Orz+KKS4KTfDOuvFGHUfk3+CbfjEsBZAYmU8G1TYVHfW9po04EUAQMPsTY+2xxLmMpLV3BdOXfulxehO8+Wdik/KE2n+JkPvKWtRnr5nvfzFY7y+g8i9EK8EpsM97it6MbahIRwGjg+LdguG9La/DbsWQuA5U26nQWjyuci7seoWMa6OKzVbxkyosoadIHU5C2xUu51b04+guQ2r5SzeoQcQyhQ7By1ZRS+xohYOUgdMhMNDC+zwLY1QApIoA1vs9MNGBwd9eG4dDr9gxItX/NSoq8bs/YMByCu7sErPbfEH8AR1lN3cdfDn4AAAAASUVORK5CYII=","icon2014":"data:image/png;base64,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","icon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAyElEQVR4AWIY7GAUODT8Z3Fq/Vrv1PrlMhD/pwaWTL+YTzcPOLd+zoZZTD0PXAKwUwcWAIAAEEX3H6NVWilBIEBIKOcHPw5AvbjjEOvnowAOsS4OAwAEAAAQACCA4AEAAgAACAQQQPAAAgEAAMQOgCNAwDkCBKSOgFdAqSMROyDAFRLgClliAViJBXxeITsg4DICBAgQIKC3X4+fcmz9epgaMTB/oDzg3PIZsHAqLDV4xQM0rByI79PR8e+dWr50g5Y5MAxyMAoAmGbb/H6oTR0AAAAASUVORK5CYII=","drive48":"data:image/png;base64,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","blankTile":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAIFBAMAAAAO0raSAAAAGFBMVEX////qQzX7vAXFcVhChfTFcVfFclg0qFP06zrOAAABGklEQVR4Ae3PoQHCMBQFwKKwVCQeBBMwwh8hI2QAHOvj6orP426D2/4RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJf9cNsWJCIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi8jh33w+vOrdSpFVIZIREWoVERkikVUhkhERahURGSKRVSGSERHqFRGZIpFdIZIZEeoVEZkikV0hkhkR6hURmSORZK0V+uH4O721JIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDiC6bMXHl42ox+AAAAAElFTkSuQmCC","fav2007":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAA5AQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAQBJREFUeJxjPHLu9n8GAsDaUIURp+SRc7f/4wIwua5Z6/7///+fARtmImQ7AwMDQ2lqIEP37PVYXQo34Oj5OyiYWENYkPyJ1XZkw45fvIshz4JNIcxAdEN7sVjAeOTc7f+4bGdMX45VHAb+z4xkZGFgYGD485eB4eQlhAss9FUYWDKXMzQGO+A1gDF9+X8WBgYGhn//GBhMdRCu+PsXoejag3t4DYEbcPbaHQZjLRU4jQxWpFljaIyYdRRhwN9/UJvRaHTFOF3w9x8Dg66aCgpNlgtwAYIuSKrswSIljdUF6IYx/v+PPTMypi//3xjsgDcWVp59hNsAmCE4JRkgCQkAu0Gk8R5Q7mMAAAAASUVORK5CYII=","fav2008":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAA5AQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAQBJREFUeJxjPHLu9n8GAsDaUIURp+SRc7f/4wIwua5Z6/7///+fARtmImQ7AwMDQ2lqIEP37PVYXQo34Oj5OyiYWENYkPyJ1XZkw45fvIshz4JNIcxAdEN7sVjAeOTc7f+4bGdMX45VHAb+z4xkZGFgYGD485eB4eQlhAss9FUYWDKXMzQGO+A1gDF9+X8WBgYGhn//GBhMdRCu+PsXoejag3t4DYEbcPbaHQZjLRU4jQxWpFljaIyYdRRhwN9/UJvRaHTFOF3w9x8Dg66aCgpNlgtwAYIuSKrswSIljdUF6IYx/v+PPTMypi//3xjsgDcWVp59hNsAmCE4JRkgCQkAu0Gk8R5Q7mMAAAAASUVORK5CYII=","fav2010":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAA5AQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAQBJREFUeJxjPHLu9n8GAsDaUIURp+SRc7f/4wIwua5Z6/7///+fARtmImQ7AwMDQ2lqIEP37PVYXQo34Oj5OyiYWENYkPyJ1XZkw45fvIshz4JNIcxAdEN7sVjAeOTc7f+4bGdMX45VHAb+z4xkZGFgYGD485eB4eQlhAss9FUYWDKXMzQGO+A1gDF9+X8WBgYGhn//GBhMdRCu+PsXoejag3t4DYEbcPbaHQZjLRU4jQxWpFljaIyYdRRhwN9/UJvRaHTFOF3w9x8Dg66aCgpNlgtwAYIuSKrswSIljdUF6IYx/v+PPTMypi//3xjsgDcWVp59hNsAmCE4JRkgCQkAu0Gk8R5Q7mMAAAAASUVORK5CYII=","fav2011":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACMAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAFNJREFUeJxjYKAQMHZueP//ybu/JGuUEWJmKA8QZGQiRzMDAwMDTB8TWbqRAAsyZ1KiMEENefPf4jYAXXLUBcPGBYQMpdgFFCdlJhkhZrI0wvQBAHsBJhQMAcHiAAAAAElFTkSuQmCC","fav2014":"data:image/x-icon;base64,AAABAAMAEBAAAAAAIACiAAAANgAAABgYAAAAACAA2wAAANgAAAAgIAAAAAAgAAQBAACzAQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaUlEQVR4nGN0afuS+O8/Qx8DA4MAA2ngAxMjQxGjU+uX92RoRhhCgWYGBgYGARZk3t4qbqJ0Obd9hbOZKLCdgYGBgQHFBcgmEwuo64LRMMAdBvhcNjjC4AMFDvjAxMTEWEymIR+YGBmKAFW7HPsAxrw9AAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAoklEQVR4nO2WMQrDMBAE94RwIbf5USoV6fwJfyEPSJXeT1GVZ+kKNZvGhpAIEoSOgPGUV6xulwWdXO48adEFQCQ5ogMikgGkMITZa9GF5NRDeGNddNKicABiT/E3ousVSw2So7MS3/C14ePaZup8yx8zcwf/iahmtZWdRnS06JWjRV9pbtGvMe40oq4tWj9oE0QkOwDJ6gEAyYchzFoUMDpbnqKVOWItbqdAAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAy0lEQVR4nO2UMQrCQBREZ/4GXPAy8QyG3ClCqoC5k6x9ylxG2CYZC7ER00jcbfaXu8V7zP8MAaAZY6N1GQTUgDz+OowEZprrQ+cDmzE2q5YbJP4X/OlBGV1baV0GIDEcACRKy2AgTsnhbwegNkmHXAKAvOWDv6ba+rhfjruCztfH1/fsCRSBzRvY2tnekz2BIlB6oAiUHigCu/bAL3eTPYEiUHrAAMZ8eEYjMGfDA7PRXA9S6ekUzfUWOh+MriU4pVkHI8HJ6NrQ+fAEf65BoOSvt7YAAAAASUVORK5CYII=","fav2016":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIACuAAAAJgAAACAgAAAAACAACwEAANQAAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAB1SURBVHicY3Ru+x7///+fCQwMjAIMpIEHjIzMDYxObV/uM/xnUCBRMwx8YKJAMwMDA4MACzJvXzUPIzG6nFq//IexmSiwnYGBgYGBEdk0cgDFLhgNAxLCAJdLB0cYfKBA/wMmBgaGQgZGhgek6/3/gYGBoREAgrYm2r5KALIAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAADSSURBVHic7ZQxDoJAFERnPmhCYsEROAJcwYrSK3gDLYm1ofQIXAE7K8MN9AgcgcLERIRvY2WkMEF+s1PuFu9ldjMEgDS/R612harGAEP8OSTLGWV7yoKaaX6PHv3zMgX4I81cvERafR4M4AAQttoVosqVARwAoIpYrODvhNYC8IcuzrsFxwQt9zf9dm7egBPg0NtMFfMGnIDbASfgdsAJjL4Dv/4p8wacgNsBAdCYCpC4WsEVepSO3homLWij4m+kyoK6Fy8BWU4FJlH14idVFtQvuypHVkvw6L0AAAAASUVORK5CYII=","fav2020":"data:image/x-icon;base64,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","sprite_editortoolbar":"data:image/png;base64,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","sprite_icons8":"data:image/png;base64,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","sprite_jfk":"data:image/png;base64,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","toolbarBg":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAMAAAAMEmfoAAAAOVBMVEX4+Pju7u7z8/Po6Oj6+vr19fX29vb39/fx8fHv7+/5+fny8vLr6+vq6urp6ent7e3n5+fm5ubl5eVZ3nZKAAAAKElEQVR4XiXBhQ0AIAAEscNd9x+WT2jxVL5EJGC1kSkYXXQGE6ebw30MQwCyGO3OOwAAAABJRU5ErkJggg==","buttonBg":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAH0CAMAAADG/cfiAAAAwFBMVEX////g3+Do6Oj+/v7a2dnj5OPv7+/Ix8fv7/DHx8fe3t78/P3b29v29/b29vff39/h4eH9/fzZ2dr////4+Pnt7e3q6ury8fK9vL3Ozs7Kysq/v7/09PTX19fExMTk4+TBwcHl5ebn6Ojg4ODm5eXm5ubh4uH39vf39/b+/f7c3Nvm5ebb3Nzf4ODR0dHi4uHZ2dnc29va2tnk5OTl5ubIyMfb3Nvj4+Tm5uXw7++7u7vi4eHi4eLU1NT9/P36+/skQGk+AAAAAXRSTlMAQObYZgAAAJRJREFUeF7txVUOQlEUQ9He526ou7u7zH9WQJowBj7O6k6KHGGi69/gp6mfPn28CHlCOA6jMBqhTigRLOviWI6DAqFI0DSt+xn6nfNg1tnDNM3W7tTCMEmS++oGtVBxTyl4nhd/wj8RQgghhBBCCCGu9PsyoUZoE5oE++C6tmujSqgQloQHoUEwDGObrTMEwXwzDY5vEeYYeevpRXQAAAAASUVORK5CYII=","dl2007":"data:image/gif;base64,R0lGODlhEAAQAPUAAP////7+//v9//z9//n8//n7//f6//T5//T4//L4//X29vD2/+71/+31//Hz9uvz/+v0/+jy/+bx/+3v897t9ubo69vk7trh6cjf7MLV6sTO28LM2b7N3a3O5MLJz66/1a+5xI+716OwxJyqu3Oqy1yl0Iqarliaw0WQvUGLvGR8mlFriwBmpv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC0ALAAAAAAQABAAAAZ/wJZmSByKWsikEMBsOj4jJVLTbE4sGZOUWgUoLhzVSsntVjygcbLcZaqnXZZ8Loc35ZhOiHRC1csFLBghJYUlKSksQgMDBgYsHSVdiUKOBgsshIaFlBoJCQ0NLCSSTRSdDAwRESwnm5yKGiuzKiwoKU2HlFJyiL6JilItdHQtQQA7","dl2008":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////z9//b6//H4/+71/+jz/+Dt/9fo/7vw/9Pe7MTO24nF4oO/3qOwxJyqu3at0oqarmGiyleZxDGCt1FriwBmpv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAVqoKWM5NhYaCoCbJsQjooqrSsQkEzXQALcudSuligmKKphbVAwIIW8inQqndUqiAXjEZFIJpVVq7J4eM9gMWBQYUh46R2zYj574wGmodKFhxV6BxV2aH8UhxSDbyx3YTIVE5GSkY6PVFMWIQA7","dl2010":"data:image/gif;base64,R0lGODlhEAAQAKUiAABmplFrizGCt2+GoVeZxIGWsmGiyoqarnat0pyqu5yrvaOwxIO/3onF4sTO29Pe7Lvw/9zp/+Ht/+Lu/+jx/+jy/+ny/+71/+/2//P4//T4//P5//b5//f6//j7//n7//v8//z9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAD8ALAAAAAAQABAAAAaCQIdwKFwsfsikQ8RsPi6JpLLp7FwO0t+SKHqIrArpktp9mAdiETH04WAohXQzBALY73atWugBQBoMCAYEBAIAYyEeGgANCISPhlseDhcADARkkSEOGQ4VAI6PhJEeGRcWEgCDmYcbpxMRAKKQhwG2trKYTKMAWT8AAsHCwb2+eHg/QQA7","dl2011":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAoSURBVCjPY/j//z8DuZiBYs1myXP+k4qpo5lUMOrsQels2moekIwBABNfzrt5bjyVAAAAAElFTkSuQmCC","dl2012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVDjLY8ie9/88EP8nA5////8/AwOZmsGYJgYwEIFHXTAyXUDflEiWAZTlRhBBCQYAgc/cUg2HY7YAAAAASUVORK5CYII=","dl2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKklEQVQ4jWNwav2yAIj/k4kXMFCgGYwHmQHEglEXDIQLhlBCGjADKMrOANM35etLmvf0AAAAAElFTkSuQmCC","dl2016":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiUlEQVR4AWNw6PiW79T65T0Q/ycZt30pYAAxKMDvKTXgP4oBhYu//19w6Cc+DFKD0wCwAgIApAa3AWlzvv3v3PQDHwarQdZD3TCYuvvn/xfv/+HDIDV4DNj18//zD//wYZAair1AciCiRx3p0Xj+4R+KEhLIFciaqB8G7ykzoOVLAXmaP78H6QUAWXHvS4c1KsgAAAAASUVORK5CYII=","folder2007":"data:image/gif;base64,R0lGODlhEAAQAPYAAIJKDt3Ej96aPJ17WfvamLaeh62CSvDZopVtQb6bacuGLZtsO87Ct+e4btK3hfHVl7eQWv7vvLJsGe7EfMezoMWWUuirUqVhE7CUe6+LXMyqdMq8sP/qsb2toNvSy9ioXv/3xbJ7NaBiHtWQNb6SUt69jO7NjPbdopt0Sey/dP3lrKRpJKiIZ/fcnsiodaWCWOemSNvKmdGSPdLJwuK7eOeyYbukj6yFU/nkq+/VmreVYeq7b+OUK8Krlv//zMV3F6N2QfbOiKCBYe/erPHLhf/2v6peCt29gsiqd5d0TffercijadaHIuavXKuOcK+JUqF7Tf/vtMSzpd7GkqaHYvTVlvbZnfG8aL+XXLWUe++9e6qJYb6nkoROFe7cps/FvO/GgL2wo71/MuCYNKNtLerRnNPLw/fOlMise////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAGkALAAAAAAQABAAAAfBgGmCg4SFgl82TgNmhoQeNzFDXkkdBSwvGU89g0JDPiAgUy5TBypRDxSDWyARrUVFHDlHSwYILwlAW1FROCUaEE83OkgBJyotUFQ4OAY6aFNDrRHHBCRhQi1HOp8gvCdVVUQNKGkYJlgO08dVJmApVyEMaTY0BmU4VuETOzUWI+RpuFQw0OIMkRQNmsAQwOPCDEEUyGAJglDhGCY/jAwYtKHLhysWBCiQIGIBBimFAMgQs8IkykZpEAiR4gGmzZuBAAA7","folder2010":"data:image/gif;base64,R0lGODlhEAAQAMQdAP/ddP/std6+fdq1bf/xy//xyf/01f/11v/00v/hjf/wxP/yzv/yzf/11f/z0P/xx//xxf/z0f/01P/ggv/ijf/ggf/bcP/YYf/ll//deP/ZaP/ootatXP///wAAAAAAACH5BAEAAB0ALAAAAAAQABAAAAVZYCeOZCkKXJoK5jgEMDy0HQrct6pzHXc0Bgki4lgwCIUHRJHaOJ9QaApDrVqtKYp2y9UmKKmKeDwZm1OZtHq9Tlne8Hg8panb7/fUZc/v9zkoO4IrNIWGJSEAOw==","sprite_doclist2008":"data:image/png;base64,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","sprite_doclist2011":"data:image/png;base64,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","p_sheets_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAECklEQVR42o2VW4hVZRTHf+vbe86cuagzI3TDqCBqoFDU8KGQmgcJ86kXETIogkyLLoj11vGAVEYWEc2DUZAWhIgP0UPhw9BL0J0iNPIldEgC5zDO9Zy997f+PZw9o3Npxg8237dZe6//t/7rv9Yyllk7ThzsUTVNJ3qrGgAa19nWTjVtojWjH578YKKmWqhb3Vlh2fypVgvU677l9MFnM8tfV+5V4UiYEBLIpChXd2dX8tgtm+tHH3rq/VM6ley23XFlAGEY2nhib0+rY+0lOpN+Zfm8STguAUbhBdW0k/2bdmFT2fMvP/D4cG1kJK0PDRXLAYTrX6Zmu1PJA1khnEiUK0ZXdCfKie4muRcxZs2WV9Z2ffj296f314eGitrISLoqQOjuFCZhmCRTO0JD7V3I5JhB8Bgty/JY7esZngN5eKSWrggAIMdc5RkhCS3+BhGSYDgh5rl39/cOv/PLmf3fDtWLmmphBYBG6cxxfN65SqcIghnNmPHzPxfUarVsdqZpU5OTTkcyfGjko1fqVpckWzbJd598Yq2s5yKJrVN0n7MvjsQRHiPd00YyE4m4hyQJQq2xvOOmsdc+mSz/1RLOtGBXedACepAIScL0GseCY5mbcHN5U1W3eQcGSwAcx2RI7foJZvNMGsIFZla+B2JPBZICi8LcjEViXRpBu6LmLzGZN4lyVEpJgKtNWWKBalqBasAKRy1bItNlKTJr85xawtCt97OmowvDaBYZAjqTFCEmsll+uHKBTAXWkbSJzHz1CIQoVNCbVnlv29N2bvySxlvTbBy40wB+a/ytvkoP9/VtsEe+rmk2y0hDgsINRaCSgjbXM3nGG7+f4dz4KEe37gXg1Z8+Y7DvNj5+8ABmVuqgnXwGboSico/uVJKEFwZ3MtaaZPP6uwA4smUPA5VeKknavsycupaU5CKABlAtEygJMyPzguE/v+H81VHe2roXIQ7/+gX3rtvA8YHnykJxIFnG/TIRMF+5EOVUQsqBwUdptCbZNHAHAg5v3sP6yho6QlJ22UW3XF2mwuVYSdOxP77k/PhF3t32TDsHP37KYN/tfL79JYJdk66vRtFcG5hrn4U7uSInt79omQq6kgoCvtv1plVCSk6kcF8Ut62qIknCCEwVTXaePaLEAoYRFcvqDoDI3ZnOmwSsnWxbGsICAM1kRqVquJdT0rmaTaMFvaiksVyJBdpTtT3yNJvZ/wJU6c8LZjx0dpiyIsECqYUF/W6ubWNzXbasgUqKmnms9s/mS+eBIWq1cHnf8ZngHFIeRz3qiudxLGax4Vlx7cmLhhflnseG8jimGK8oK0bddejyvq9mqNUCJV22nExvPrijJ7unL7VmRdzAUjWzyl/jxb/Hzk4vtv0HOGuDEaJUFOIAAAAASUVORK5CYII=","p_slides_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADXUlEQVR42o2WT2skVRTFf/dVpVPdnUwmiaggKAoKRkS/gURwIziz8xOI4OAfXMzCjW0Pjhs3CsZv4EZXboRZSHSrG1EzILhxXAyok0yS7nRXV717XHTVpLunk56CR1W9uu+ed885770y5ly3b7zSfnRzP6VMNPvt4DiaF4d66NU/j6ROMOs651xWP6hDsC7e/+HpNxth9GFRKBMOkoFAApPwqKXlduIXL1/LXvj8M+nrxOz1eC6AhJmh2zceaV9Ikr9bTdYHAycxcS8542KkEkuaNJ55j96R3l7d+mBHu53UtrvlPIAw+bJ8OErBw2AguYhFNC8iU62UeVF6LIejuLK2/MXRb90rtt0ttdtJFwL4igmhYLKKGquqrFrdbyGWHspRGVc32jv9vetv2Xa33N19KT0XoFLDajpm6TkNcUISzN1CLMrYWs++7N/85Mr29o+l1AmLAMZJ5RPJJ0EC+JDhPz8p5gMbnQzC8LjvWct3Dn9+933oSpLNFfm/7zYuNJPkVpKwVkb5qcsmxQZwYnR6Ry3yXgDck9SCSXnfy4effePOcZ0znVvB1H3W0QKMNElYW+8zSiHmWGKy6D5s0bTJUQ8A4BVdTNElCSzQWDXKBIgGEfNin8UAOhUTa0CSAXFGeAMfgoakLYMCYi68YAFAPVgRrIGe/8bU2hons3AKEDKsfxP7/bIUc9JGQAgGG8D+eRX42CmKkCyj9haka6AVZuemlS2wDHQCGJYINh+Ioop3DIq72B/viPKgCtcYfGkNPfXxtMvuM8aZFE06J2IH30PxL9hSBVCidAOevFbF1Gtncvs8b6FNzWrGUejeHHRm3EKb1i0CAa2/TE3R2K0FpBcrM2jCwiwGkFQ1r7heR1tfGSpRTQcaD413K63qPl8EsA80T50UB9DbQ+3nxs+TNk0yrLc3dpDZmRqkc46gcaQZKMd+fU0Wson9qKYjgA9AeSVldeKdV0HoYay4udfZDDyHeHLqlilBQ9XvcpkQFvqcvRetZxQ94e0mNhiShFDXnE6LqGnXuEMzc/onioOM4j4AM6QOwS5xcvQtV0e5PlIkK8p7J9kZ62TMVwhSnjNE1nnskk7UIZiNFbd51vrlU9qPP0HqOWLzjN+FOxPULmO3/qJ88Sr92bD/AdUyAgQAGjbNAAAAAElFTkSuQmCC","p_forms_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAD6klEQVR42oVUS2hdVRRd+5z7kpe8NDWxKFaQKCLVoII4EhwELEiV4qhFrA6sFErxU6VTLw8c+Jmo1YAFRYI66KwqxWIhg0AnGmoCCn6g2oZGSvJM+n73c85eDu697+XzmnfgcM7d57DX3WutfQQ9xgdHLlT88O1Bu+lYxMYB1AAMVerSvpqy+sOBm2FIU62KYochxSZEaKqoanh47piqedslaVnB7A4JEiCE9MrycNlOPjFaff7Nhz86e5b20CHxfQAogPCt/Rcqdrh0rWSGxlIXdY6peSEEnFcMDAZ46vD9iLV+4tkX903PhrPBVHXK9QIwGz/qXA+oMKmLCKpXelV1qvSdmR04HyeRjgyOfvrdl78en6pOudlwNugLMBiMUAgKRBSQrDJkkxAyjwmMeidJkvhKeWz63OcZSNgDxGwNKCAEMz4IMN+C3TtUwhgrEDWpi3V0ZHz6/Mwfx6vVKReGNDsCdATVzcmzhRAB0kTx12+rjKJU2q1Y6o2GGpSnZ967fLJaBUlKT5Ffffr86IAZvGrE7FZ6BSEbkxdCUwGvHs7GSL0DlWqsNULEri13fHHpuXqRc7swRR7tBrjhjPmHNRaiQ1Dv4LwKnBGvPoqdlY3pgh4MQcFOWpHtGkByugCUgwAJFCRghIJ0c77tACCk8D+BNFIEAyYDdoQUFsgBRYDACJQC77f3244UBSWDvfdW8O8/LRgRDOwy0NwEheVazRRQwIoBxGIcir4UQYAkVuy9r4Jj707KhycW+MBjt+HAyxPSWEsgRmCsIGo6fHJykVHDwZYAEelfAUlQidKAwfUrTXz82gLXVmJc+n4Zc+euZ/5jLj2zKsVKx9bSl6LctC5R7Lm7jP0v3CPffnaFdz40jEef3CNRy0Ek+9s08bj4zRKTSGEttjjhFo1WNFe2Sodvah4sHCXdLTc0aH+RNbOptYK1GxEufn2VzZsp/rwc4/ef/6NIkTBbg5LACHomv4UGCgOLJPaYeHAXjr4zKadfX+C+x8fwzNEJqa8nEOmKfPqNRbYbDkHQk6EtADUAlcyipQGD5b9beP+VecYtxU8/3sAvcyukdpuABJK2h8lLYI8ygu0MScEAvCOa6w7GCnykiFpuW78Y221KUljbUsYmgNg3pMTdQiol18zY7O9EAGtz0UU2VJF5Nn+DpeIbO71F5RSkluyQpBpZk5ts0zMkmx9AEUChKJkyEtfyQDntYVNhiNCcmT/YUtVTqSZL6rmS+nTV+bTmNZ8+qTmf1IqY82nN+XSVnivOJUtQnjozf7AVIjTIqZZe1jryyExluHRXMGhTos+oAaj4krTSZffV4kvNref/A1MEgV4FHXxPAAAAAElFTkSuQmCC","p_drive_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAE+UlEQVR42qVWW2hdRRRde8+Zm3tvcxNNI2KwwTcmRXy00B9R1CI+6o9yxBdoFQRFEBW06sc1FFooRQWLoig+EJR7oT9FG7BawQ8taq1VC9KqtU3rs02ax815zV5+3KRNbUkFNwwMZ2bWOrPX2jMDzBeE4BTBU8yJ5l0tIHlv+dDurtLCMMXjxtwCAZCKvJTOB6En/VqvKwnBy2tPf3erbl9of45YPrUfxcQI8vER5Ef2I/9tBMnBb/jTU90khPW6/meCePFiEQEHen9/csNEbeDAkVDTKO8GQhc0dEFCN/Kshm4MYHLPUyIgFu+SkyfhhKTWFTLEKzeuunAsHNnxd8qOuzunuf78IxpM6GgzK0kIBZAU1Z5Lcf5be4C6iAzZ/Dto7hIBeDidXJNHUaVLzTaOlXXbqBfnTIu2qAJCYTAs0Aomx9aIgGieuIvjCRqxw+3NsLT5+HWFs1uLqTSAcJkj1h+ssshpqpgjNh0m8gDP2/j9HdfK7c3ARuxOTkAIfhjkg1+96sez1rogFIAsSFSV+KxVwsbRqmoHtDADjvII4UyQT63jVw96xE3Ote4xgmasGBqybT/vXFlU9IqQ5IGAIwAjrKPq8OKB8h4ktlsrCsAMBEA6tIqAmi6BP3SfCAzNWI8nqNcVcdOuH673TOZ5vUhytovIABgCDeWSyOcTnQ/B28PqVY4lim2rJDnB5DnufOh0xE2bta22bblLIODew388HSqujyEEgmoASAapeJeNp1v04Q1bZPEHW8JovgULIgexcPRHcwZ0ah+Kkafn2lZmbXn5e49ePGqt7YFFSQgAIm1lhKIakHLZ3pWvfysA0m03XVqqyjaYOdiMq0BCCIhmkMrluGTjj0BddNaWY2F6TShJmUYzQkiCNJNK5JCG135d+foOaTSUjVg7ln24w9LwGjq9A2EgAVJgMFSkjDxZO2tbAYCB9x9ZPoH0I0vzIIBCBAKYRM5JIYcXZn2XXLA//nvi8D658AKg56x+3t/3Sm9fdd934tHDLAQAShIiNCl7N530LK8teftjuXprvfOnkX1bzetSJCFA2roIxFAWaYVf7hy9a2vjpCfp7v4Ysuh9JIHgrCPNUFGHNHyJwb3XynlvP3DTdGQfMCsoqm1oChiZ+OnO5LK/nnjeV87MDQbhrDoUAPCa+VvO3vSYc6HCMHO4k6ARvqMkWRZuljM2xJ1aLX8qFX8Fk8JE1QkF5jL0/bIci6K74HpKQMDcEm73CRwaA4xguyQAEuY6oEkL27eP4BoBgLPfvOeGvMNvZhqCiDrTDAvGF/GcPXdCKz2F7+qmOAeS/2KAOAkRZsFBAGrOl5ymf9246Zn+YUUcu5GV7w6zlW/WcuRAC2oOvQeXwbnTQGEU0sSD8DKnAfAAosIcCnMo6BAsCvA1l7SSzZue6R+OYzpFY5AA4CNdZZllhU+ldugi65wcYOFBQGl5oIWCFKEBNIAzqZ7JCgjCICqhSDNqtAoABhugQoYMjdgduO+dnRaSN0pRr/YevFKlXFONvIrzKt4rjQo4FYkUEik0UpltEikhLqpUXUiTNz55trYzbtANiVj7Tv5hkCCkNbx7df/XV60oZYtOK8q5aaEiSggJswAlIKoA/yU4QRHVdGJ81Gu+GqQMPteecsIFsWLFgeqf505FUTnMweg91eMCRVVEx1v5Fy/0T8//jvjfweMw/gH2Da+czD1pegAAAABJRU5ErkJggg==","p_sheets_2020q4_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADaUlEQVR42p2WTWhcVRTHf+feN29mkplOvmwTP0hahRmqVCu6CCKlSFVQ3NRx48dClC5c+FVdKDIGF9YvUHCh4EpFkHEhWiHqppWiVBC3VkFTMGiwyaTtNMm8vHuPi5m0Y/LedPA8LryPe8//3f/5/897QkLsfrdayG/H2laojG56uAhuPJJdDZr1B+qOWs0wM+NJCbl4VsMwg7/l04OHjTXPOuczeBWkaw6A4m02I+f+Ofv73K8L96+99fNpqlVLve7SARRB0D0fHhgMM8V5m8+UfORAZMsCVcVaw9nGeRZPL56yob3r75d+SAUx3ReZVQ1URHwUqzr1GntNHF7Vr8axCW0Z1dnxV6Ynqdcd1artCWAHAhVQRASQ1AMEQ6CtOLZhUPkPSK1mUgHabCH0EeoU7zVYb7ZiFam4KJ7NHipPdQouqQB9JfdKrpBjeGKIoYnhoDRUiEcnxypTe3d+ft07d2e75wa9EgXGpiBAoThIsVQEFOedxYr3sS97lnNAa0M4qQCKcmZ1Ga8eRdvb7ajKq9K5hTWGUqaIUWO80zUbB3rZHagqWZPhqZseoZAZxBqDILRcBEDWhiiK857m+gU++eVLIuJ26TezkGQMr57Qhjyx50HOrDVYXF0GoDy8E4BTjT8AGM0PMZYb5rPfvmbNRZiEkgYpFONRLqyv8PR3r/LV3HE8jo8OvAHAw98+h8Fyz9Q+3tv/MpdIpD+ADZUJhkd3H+SOa6YBuHGsAsDbt78IwGTxyi5WpH8A6eohlZFruaqwAwFGciUAbpvYiwLFsNDpM+nmCdIUtLHl50+8ztG54yiOj+98E4CHvjmMYLl3ah/v759BO2uSYIJebXYgyPP49dUORcqt22/oUPQCIOzadjUDQb6n9RMBjBicOo7Nn+SK/Ag7BsYA4c/mAgDT4zcDSuxjjs2fxKnDiCGp0kGSgowIa3HEMydew6trGwuw0na2U3fReEYsFoMJBJ+A0LNVWDFYSdK23fpWKfG/ml2Pumk/TvaoXhJGnw0WVRSMW4klFSBohRoFDEgYCJGTpE9mcnoVE1p0NW4pufWtFElbxN8/9kVThSN+3S1455d87Ja8c43LjCXvddE7v6SiR346dHSFWs10ciZLuPzBfcXCtqxJ/G1JCNeMxP51Xn98cvbc5mf/Agt+n62gNFCHAAAAAElFTkSuQmCC","p_slides_2020q4_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACj0lEQVR42p2Wv2sUQRTHP29m9u6S3BGi4cAfYCMkhdhY+B8oNmIh6awUrEUtrA5BMJ2NYGNnF5tUEg3+ETaCIqIhElGTkOSS29ubnWexd0nW27tcfLDNvh/f+b75vpkRCkwXqDKFpYb2OTeAOsIlmiKk2sDIYwIDTPaLdgOT9+6BcdzHE6kiqgcxWSDBVhC/Hr6ufwk3Tz/kuy5gZY50IIAqIoKuvWXipHU/ojEmtQ1iiugBBmgGdlfCpyTi6ok7g0FyJcpbOAGhjfqU0OmgRZ8PaGsXP1ZmpgRLG885J3OkuoAdChCqKIIiCCAiAz4QBLcT48dLzJbLLG28zEAajXxNV9ACYRQLICluu4mvVZgNMUubT7k29YhvvZYXA4xgGsCMC1HdIAYXB3y1zmwcs/j5TbgMJIMZ5CTgDgstpztbBVfrAXqL1eDGmJkOoSJCu8diCIBCElMwCfvuAIiAOguIIRCHTj7DDe5BBXP+HkSTXSZFcR46W6Qrz4AYxPQJ2xWPRg/gCcSraLLWD6IeKZ2CylnS1Rege9CvUoa3yG+TfryN/nqXReqhNXiQ+hXsxdcM7uMom2wqYAyYEmh3UMWCSTKfDC9xtEzVZ3uinQMAQvefPzL9CADN9BjVwJbzDKSd+Ya0ZwQAwV54la2+b8AVJDqShSs+Li2kLdIPN8BWBi9SgDSGtAXGFrIpZiAC2kH/LI92dhib5RyvRQKuPBpASP9zDzQ99jk4CkBAUUBVj1E4izUmyqshB6AJSolxSohLkMIrs/joEsqge7RbLTp9ACKoZvdY0y/rfPByNwQiQnZfDxWyoApqPGIkzJ+5zp42MCLZS6Mw+fcitekJTOGzpcA2d5Cpn6jcYvtf318sDBxq0Mcd8wAAAABJRU5ErkJggg==","p_forms_2020q4_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADSklEQVR42tWWT2hcVRTGv3PfvfOmd2YyHZuJSCJpk2oSqXQRWqgbcVHalYh0REQ3XQoiWF0PQ10UxI3uXJSuKtMntAuJI5ouFKKCVFFcVKFDqKUGTdqmySQz795zXEwnJp1541i68YPLe3DfPd85v/vuH0IPvf7shWzOFIKGjqVXv82N0Cxm116KyJfLZVWpVBgJos5LGWVVQYXfOl57OyBzyoszAEhE6L4RbFSa7mzcvHb99vcn5n54f7FUKgVRFPk+BkIAyatHP88UA7kRapt3vglAdQ0QCBQFWN/8C0t3f7saanPs/DfvJJrsiGDljiYhil1TWDyzxNKribA0XcMZFU55VrUXj5wej6LIl0qloK9BqLMCghARtaujhAYiIu18y2mVmjZsa68ceW88iiJfLpdVosE9BoQBJOLBEutmvOYImG45Vzt28M297Qn/Z94UHkAijLQZQiH7OAqZUZ0Nh91IbnJ6vHD40hvH58Lt3+p+gYgIpAD2AqWoDQcEgSCj88hSAcICZgkUafYST92NkQao2flxdHJwoLXpELcYNmewvtqC27EsBAIgTAdI2wCeRYn4zVCz/GsFpAib6x5PzhaxdyaPy9U6njuxD8UxC5G2eed59coyfl5Ygs0YeMddyHVS9j5mjIxZPHVoGJerdYzuH8Lk0wU4x1CKwF5gUgrLNzfgY7mHr1s9DdgLbD6Fry8u4suPr2HokRDn3v0RruUhsm2FEiFtNbJ5A3YyuEEbkcPUoSL2zeQxX63j6MsTKI7Zrclnbmf965Vl/LSwBJvRgBvUgAAXMx4ds5g5PIz5ah2jTwxh8kAB3jHoYSDK5FP46uIivuggOv1/Q+QdozhqMTW7B/PVOh6byGHiwG54J1AEeBaYVIA/bzTg3QMg2pU1+O6z3/Ht3HUEWuGTD36BCLYQdRJRimCzGuz/A6KtjSqgrSMj0P22LUmOgYcpEhmkApY2COmXWdcGC4EIqaY3lGiwvtqS3bldVqsUeW7RoAUKmIwK0eRGE+mNuAciEkDo7MILawDOeHZLLLzC4lY8x7f6NRa3wuKXvbgVpdSZjz59vtE+1Uh23Cq26+Qzl3JFm1FJ15aua4wz1NB/yIe111bv7/sb1l3Pj4uF8zkAAAAASUVORK5CYII=","p_drive_2020q4_48dp":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAE1ElEQVR42pVWS4xUVRA9Vfe+/k87MHxmxoyfiKKguIANKmA04kZjjHm48kOiLPxEEiKfBH10iKImRqNuiAsTjVGnF+5QEkNiNIjhl/gBFUhERgmiCA70dPd7t46LdoBhhhErqc297546t07VrQdMboIk0YttklD5T4BLsJmr5pXTSsFJyRMA2Mgkj5Adre1pAJz07MTsCEECXbFrRXTD5rs3SVfpUA4yFI2EX6NG+DWCDKn6g1s/7FlPQpMESk5MduIA9VhRg+058Oezlw30rM2XcjMp6IJql/fSdQZR16Kpw31Lr/lrY3Orf6JWg6E+Mda4xYSJIq7bzR88eBUVa2wks+q0agBBMWOagVVJue6KoYAmTTye41bMQAxjMh5PL6IMvaUbfTGqhlbGQqXgKt1lEaMMm5NH+o/LvMuGXWvEMV/BjEyj50RAzB2fprELcexQr4f578e3aR6fMzMAEBGR0M5w+NDvnOFa2LZgn0zPtZGZ0CsoDmmWZgvzd2EvCRWBjb8BIZgzh/Fg7CDhZfGqJAlASEOU96z0VLn6yiHrLTSZmcIJxAhqDnnQvzQR7bMB4nqsqNXs5xAe8uXcLWEkNRFx/26bRU5mTivtfrT/+D541+mCDpbLGgi5Epamn7n7RWD8CG5sgCTRely3Je/c102RmqWBImOr1oP4Ju1ZCW9r4FTceWkgITAQlBe5CyV8D46WbSfA3H0CARsFv9qXoyusHQwQ7Rxm8KVI283s4+bDb2+X2+WT9mnb5ktwBEJHJGjagvkuXB9O+qfkvLLVhIliWd0WDMazofJMNpJRVEZTR3Eq1swa4orrRlnlvKwObbRVIBxtZYGEEZDCtfwUA4hhJPQsENOwSYu+xGA2KhON5kuRMuVbu5a9/+Oy+qBykE7uSHeHtrzjyqJkJ1UCaMhgviRTMvE1EfCs3vM/eGCpy7utoR1MzglvmvMa2mGoGHLzvvzp2lMAwA01bNgArL612Bu59BvvpSdLaQIoCYqA4kELfnHuzuZ2SQj9pH7vFikU7g6NNOBs5dC0IFnaaj22d9mW9y7sTgPAz/AkSngtbXoV0P0reIgqcKFpdbeED8r8zZujE4en7IQW5yHLCOncwECU8tGR/vzt3zKoh4A4VzgQUjLn+Nrx+MbZp/b3N7XQyQrBnANThC+6ew/cIQAwc/mB17VUeYatvwKgo0xwVd/l6J5SgRHjXmWF4bRXLDy0Dev3rkLTFSE0GBl6cpH7sxE29u3Y8XynFLv+2CTh2B+ao4pvGXUEU7ojdJUF7eawZc3TIWuP9XarEQpn/rYdA4vw1cBiVNwpWB5WLEFPutYv+YH01Q6RmO73NxYeo/EFcUWhwbyLMK3aA1IgUBURJ7jAO2tKE3x49eMYdlU4yxiJCoMkU+u7TzGOnQAUJJBZJw5EZ9rNnXSFm6ZXCq3e7mmaWYDI5ANRGXDaV7Hih1fC8iPvFo6isr1v6teLMQdEDVRACAAH37yulYb2k8VcdKKvdyDvSsUoV6lEUXkyL0e+XI0qRURb5qws7C/PPtbTbjwtdQn1fZAO+9FBk1BrNbFbkuMLioXqPWRKkpc0s9UAcyrTh4/WBzfN+m4Ua/yXk/xBXKolFwyx8QwT6vz+c8/t/7F7ftsQarXaGOb/AKv3Wqxk6sXXAAAAAElFTkSuQmCC","google2010":"data:image/png;base64,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","ln2013docs":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADwklEQVR42u1aTWgbRxT+3uzsrrRq1CZtwD6oVFAotA4NuSSQQ0+hOPSU0qaH0LuvPZQW6pMDufWSBN+DLwkkx5hgCPhgmrqlhNqpC3FwkWjt/rn5saVIszMvB3nBp0ayZ5cRng/mIlZP8755P9+8FeDh4eHh4eHh4XEwQf0/SQAzRo6fr9dOTnz9yuh7H1NYPuKCE6zam1vrD242v5++tHH/+lq2V7sEAHj7w6nx+plvbpu0C9bKrZMMQggZYW3u4tnVO5Oz1iNg5Pinbx27cH1NtZ92QRCCAukSAYZ1CoYJy9VoaeZ8feP+jd/6+Z7o9wdqpyYmjeoYF50HAEGBBEEY1TG1UxOTfX+v3wcro2Pn2KROOr+bBDapqIyOnbNOgJDl14alsg+yV4EDDqvhTAQIynfDhvvucMUSQAR0FdDq8iBteFAZgiQiRKE9+9Km82++QRirSTD3PrMqdnZsLjc1Gv+wNRKsECAI2O4wTtQlvhiPc02Bb2c7WPldoRQRNDuWAh0FpKa3pOXymtnsKLvRZb+n866Vh11XuwAzEIeADHrL+kZ3bMahg13AMJDEhKWGwdW5Lgzbb4eZzaWGQRITjEtdIDv91T8Nfm7qXItgEpHVKLCeAkmUrxLSrgqh3bXqQEphIqCbAs9VvhSUQkIkHUsBIYBnLcYH70pcOB1CGyCwrAMymzMLCvO/pDiUEIxxRQoDUBo4WiUcqwW5RsDRagqlB5zlFZUCKgVMzkpQpQ4rQaJeOgQ7aWETmU3bl6xcuoDJYdKSh01rBGgDVMuE+ZUUi4/yFULtLqNaJmjjYA14roBWJ982KIRdmW01BQICpAWL/9fjGQ7XAM1Amu4/ksJ8O2k+BBgGKjHh1WTnmPYYpqkG/n7K1qt9rgQEAniyxRh/X+LLj/Y3Emv8a/DZ5RYqFq+8haVANrLeixDK7vtKo1BYJYC550i2BiUAANgMKQHMQCR76bCXi1BW9w6VqdArtbTp/B//Mb57qKG51xIHtUEEbDwxkKK4uYK1mWClRFh8pDG/sr8+KARQLZH1N0uFpEAcAmULIzFthrAGZCToIZuJHfjX456Avgtd2n48LE4Nste+CdheX75FQhrDOnXWcdYpCWm215dvWSegeW96SoSxAMNJErK/yYkwFs1701ODCrCXYmvjwWNBcvH1d858TiBRuGZ92UnKWMg4CdbmLp5tLFz50ToBIMLm6t3V1l+/XitVRpIoOVynICy74Dyr9uaz5k8zD2e/+qSxcPmHwu7SHh4eHh4eHh4eQ4wXEu96dBTYIOEAAAAASUVORK5CYII=","ln2013sheets":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEYUlEQVR42u2aT2gcVRzHv7/33szsbnZpU7EFjSQFgygo6akiWKk9KAFpse1V/HOwNwWhiNCD5CB407sI4kHBtiBiJYcccrG2xWIOSk2gXVuMaWKzuwnZ3dl5v5+H3SRtk62zs5N2ad53mdObmd+8z/v93u/33j7AycnJycnJyclpe4o6ulMA//nBIf/Q8EdqoP8o+XpXL3RCQnuLbyyeDiemPwl/Ll5d/dZ0AQDIHHn2YOb4yIQ0LGC5t4ZSK5CnUTs7NVr77rdzqXuAP/L4ntz7L/0j1kawYGjyYxkgAt1lRoTjDlAHbsARhJj6fH/l88m94fnitTiPqbjv9155+pQADBbE7jwI9aiBpcYKlhrV1rWCSLgz14tlTBlAlNQt+y8Pn4r7mIl7oxrYcQTMCkqpuJ2POMJg4VE8kilApOlvBOBqZQ6VRhWGVLqeoJQBM/QT/a8DeCddAIHu7+RrjdIoVRdx8sV38dZTh+5oe+3cGH4oXsSuoAArWzCX+Hpn6h4AIpXAL1GLQlhhRGwBAgzpVggQekHxAQhUotAkgiYFJgERoEn1SNc7nAR76qsfDABR2xsA1HYH8HCqgyxwJywCwSjdvnBSGp4yUJskD9Nq85SBSiENRmwhCSsKk+QhAqHBEUrV0j18ywDL81huVDc0zVfLCJcXMBfVgRQA9AV5eMokgtAxACJC3YYYzO/Gey+8DRaBItoktgi1qIaDAyPNtQqptUzy4b5jKD55AIH2E48cgDXbn019j+Lyzeb7RLYYAAghR9iT24kTz7waf7K5DdLhof2pxvE3M5OYrvyNjA46BtpVCDTYwgo3R7dN9aRJb/CQSGxrpLorLlZtNzhKXFma5OYJ1FrcELWpnKQ9wDSKq3XbyV+UCIBAYEjBkIYh3XH1ePt80FUKa9lurirvUxZgYWR1gJnyLEZ//Bgim3uAJo1yrYIP9h3F4aH9iJjX1gInz3+JX+b+RMHLgZE8C6zaninPIqsDcIKMYpKRV6g0qvjpr1+BNhtwvvZQX17AseEDa16zqgs3pzFZvAQTFGDFdhkEgj4vk3hvIWEINCH0B/l7FEIGC0ENgfY2tOW9LEyQR3/Ql8p+AHexxZZ4EpTWLNw27QnDCm+al7nVtnq5tYAD4AA4AA6AA+AAOAAOgAPgADgADoADcH9lttqAiMAKr+3WECj94zG9C0CQMT40KWi97mzd7OE9OAChLXVy8iJii3xQwKeXT+OLP8Y3HJHJe9lEe3ixvzVtAPb64hk9vPtNRBFDKfP/Yy8wyqC4NI+ZyizWt4EFGe2nfz4IAJgjGKPs9YUzqU+C4cT0GAVaAcQQjuIFgCAwHgpeDgUv27pyW9N54QggpkCrcGJ6LO5jOrYH3CiXQHTBe+6xNwBS6OA/OLnrtzXBrBVlPF07OzVaH79yKXUAICD6fW6GZ8tfqR2ZHPUFe0mrbC9MZBLaW3zt369r314+Xh+/cvFhPc7j5OTk5OTk5OSUpv4Dw3mtTrDwk/IAAAAASUVORK5CYII=","ln2013slides":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACdUlEQVR42u2aQWsTQRSAv5ndbExtwRYKgkgp3rwJ/gHFQ8EWBBEV7MVT/QdSiZdQvHooVPDgoQVRqBaaiwehP6DqpQpWMJHgKVCDRGM2yYyHbCyIh212babkfbC37L55377Z2XkbEARBEARBEIYTFfuHCqyFmxc5szDH4tkpruQCJlxI4meTvQ9l1lc2efBsi1JvrKkKAFi6zeXFWxTDEFptt+5kxocggMIqM/ef8Cr1CrhxgemneT5/rxMC2tP4LgnoGNpKYcZGCK4XmH6+RTnOeTpugIU58s0mxsXkATyNby26GWLuzJJPvQKq63zLHeMEFrdR0PhFbfIq46lWQC57BJIHsNFYY6IZckSACBhyEixnCrQjq6Fpd59+hyrAWmyj5cbKFxz0nTaJAKWgY1HHT5M9twTWgBrQTIpihx/vYX9UwDvAJqD/CugGUcEk/ql5JyqgVXqIrVeiMrCHNQVa0dEB5Q2oAqLYtv+pmOwhqDLdhWRQAv7EVkmuIO8BIkAEiAARIAJEgAgQASJABIiA4SPBbtDub4cxg9sOYyDBB4v+BajM/jEoerETjMHv684rsGGV9tdVJ1piNqxGLYGDV0LsTkK9+NfVLdjQjXn8r6bo6Gy83BJMAYXKDXNbHAvGjba4LIMiQASIgP8uoNGklqD9fohrYjTWtAW8/8JLX2M6hraruXcMbV9jdkq8SF3Ao00K2Swa3JTQ+5tcNkCvFCnEPS/2N62dMrXAY/vSeeYVaGPcEpDNoEdyeIU1ZpY3eJO6AKXg9Ts+7VZYOznB6PgYUxmPnAvJN0L23u6ydvcx15Y32FZH4VklCIIgCIIgDJjfWJm+Pq+0G6YAAAAASUVORK5CYII=","fFav2008":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABnAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAS5JREFUeJzFkr9PwkAYhp9ri1E3XYwbTGqYZGBzNODqSGQ1rCwuRgZH/gLSGRgZRcMoM04MOtgF0gChhzHSFoc6tfyuJpr4JZe73N3zfu+9OfjvEv6iXG95P4UuzhIBpxX1mnd1eS4AUsno3EVFUYhoGqqqAILtrU0q909/6+DXFeqgKbOhcCnTFsLPoFxvebMZ3DycAJBP6wzsLkOnQ982+HBN5OeI3qsZ7qAps+TTOt3xC4+9ylxnVUQYu+9YhkTzNxeDyVXj3sDuLsEA18d33LZOAaYCqxwMnc4SXEg0AHAnDgBKUa8FYCoZDQZA3zYoJBoB5M9+928zODw44o1RAC7C5rPJ2g+Rq8a9vdg+ysbU+izsThwsQ4YLAOzGdlaeW4acf0KYyLoqZdriC21viOQMsN0SAAAAAElFTkSuQmCC","fFav2012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPUlEQVQ4jWPgnxuxAIj/k4kXMFCgGYwHmQE268v/P/r8GkyTZQBIMwiAaBAfF6CdC0bDYDAkpAEzgKLsDAB84C4R6boiMgAAAABJRU5ErkJggg==","fFav2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWUlEQVR4nGNMt9p+gIGBwZ6BPHCAiQLNDAwMDA5MFGhmYGBgYKDYABZkzoyjHgwMDAwMGdY74GxsIMN6B/VcwJhutf0/JQaMemEweGHgkzITAwPDAQr07wEANIMeOlkzirwAAAAASUVORK5CYII=","fFav2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA9ElEQVR4AWMYtKDYY7d7kceO2UA8n1icaDsnhSqWF3nuDC/y2PmfVBxrPe1PqHlXPsUOABq2nSwHWE39H2bW9Z9iRxR67NpPgQPgjhhQByAcQX8HYDiCDg5AJEKIxZiOoIsD0hyWngY64hsoJFDxtJ9JtnMTKHIA5XjHfIocMOqA+sgDIAxnTy07jQ9T3wF3Lr4FYTB7ec/l/wQA9R3QkXoEhMHstqTDIEfgw8M0DVQG7hnYNHD52Ev6pIHRNDBaDoymgVEHjDqg2GPnbho4YDYJPaNd6dR2AKivSbQDGhz2s4AcAQoJUHRQgkHdPFBfk2GwAgBtliBNIpfVqAAAAABJRU5ErkJggg==","fDl2010":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABnAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAS5JREFUeJzFkr9PwkAYhp9ri1E3XYwbTGqYZGBzNODqSGQ1rCwuRgZH/gLSGRgZRcMoM04MOtgF0gChhzHSFoc6tfyuJpr4JZe73N3zfu+9OfjvEv6iXG95P4UuzhIBpxX1mnd1eS4AUsno3EVFUYhoGqqqAILtrU0q909/6+DXFeqgKbOhcCnTFsLPoFxvebMZ3DycAJBP6wzsLkOnQ982+HBN5OeI3qsZ7qAps+TTOt3xC4+9ylxnVUQYu+9YhkTzNxeDyVXj3sDuLsEA18d33LZOAaYCqxwMnc4SXEg0AHAnDgBKUa8FYCoZDQZA3zYoJBoB5M9+928zODw44o1RAC7C5rPJ2g+Rq8a9vdg+ysbU+izsThwsQ4YLAOzGdlaeW4acf0KYyLoqZdriC21viOQMsN0SAAAAAElFTkSuQmCC","fDl2012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPUlEQVQ4jWPgnxuxAIj/k4kXMFCgGYwHmQE268v/P/r8GkyTZQBIMwiAaBAfF6CdC0bDYDAkpAEzgKLsDAB84C4R6boiMgAAAABJRU5ErkJggg==","fDl2016":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoElEQVR4AWMoVd+TX6a+532Z+u7/pOMdBQwgBgX4PaUG/EcxYEbsmf+7Jt/93x9w4v/KiqsgNjoGqcFpAFgBEIA13z357j8WAFKD24AJ/sfBmtudDoNsArHRMVgNsh7qhsGm1pv/3z35/n9h9sX/V3a/BLHRMUgNcQacXveMeAPIwIQDcWHWBVyBSHE0UpyQqB8G7ykyoER9dwG5ORGICwDFNZ39XLvMXwAAAABJRU5ErkJggg==","fIcon2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADfklEQVR4AWIY7GAU/P//n7Ez/URIQ+ShKzWhAN7MQsdtIAig/9XgMfMJyxQqMzMzMzNzG7vMzMzfcPABk3q8N5JPq53LKlNLeibRe85syI8AmddJPPSZ29FHu2JOm2J22wNFq2JWywM4vOJTKtSANWOeds5svg/IjKZ7ikbF9CANd32m1XvUKabWKqbU3lHU3AHn2N/Cua2f20MLmNv+4GOxASjPBUyuuesHOEf/Fq7s/9wQSgAKk7wpAOWLC7gDFOAe/wuXD72vDyNAk5cIQNxjIUSg6MDy9gGhRZCwJk/w8nwA8T8jDOLWd58LyB9REZcOvKsTD9CkWXn2LVQF6PIEnstHGKTt5AMBl/f8MgZQxPl9guNEoro4L48E5ZFJ1Xdg+6zXbABxbMPrDuEAEraUDwRM9gIm1t2GjdOeFi7u+Y6iRm4c/lvYPe95puQAlGTEreSRSVV3YEKlA6PKL8Dw+CkYFj8JQ2InFFHiOAyNnoRhkTMgGECy1vIUoKjqi6hyIZW8DqPil3xGeoyIXSRgJBK9LBBQx4nbyiMUcRsmeqSTDoxN3IAxcZ3R0euSASTKiFvIIxMrFdkyB1LxfD/Gxm4gpQeQJCtuL08BigqMcD1xBwmGyAaQJC9uL09kEy6k445H3icVEwhgpHlxXl4LmFB+yyebdCCTyCMYIRDAyIrKE2W3IJd0IRN3EIEAC2lbeSIoj4zHiISLIyUQwAnX3IVDy94jeIzCJcpTAEXcLD0ARU2geE9PbwE5uPQ9idO1ojDJI+OStwQCUMoASgcD6G7bBHDy0gE61SoCwW+a/MgYFi0jLxKAMjTPPJo4L8/deUJiDbDC9AoseQ8TvcgBxG3l5QJQiPZBUJxmGY+VuM0a6Ckw8jIBAWE24AAGVNgE9Phw8rm4RECFYSyQyjuA4ggea6NClDFjw8jLBfCgpLU4Ly8YwIp61w4seofgMUlbiDPyUgEoZQLFaab3e8ckHJhzje7u/jDyMgEoZGK/IYAR1zCJI9mYKx/Aj4jduAwgLxPAyDHSFuKMfKgBKMmL28tnogIBKMEjLU7yIQTwwrw4Ly8YgAKMICNdgjgRkQqQkyZxXj5CSCzixM23vJCYuCafjbhvBNbAjcawxZE0Bgy6LvMseWzUi4jlP2aiDhSJJ5BHNFL/ZoWGLVFxKhCnW2y5kGwGdPwQAKMAAKefSY4UvSk3AAAAAElFTkSuQmCC","fIcon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAVFBMVEUAAACAQL9ySLlySblySLlVN4pyR7pWNop9Vr7OwOf///+9qd64o9z29Pvn3/OihtHVyOqXeMuVdstySLlySLhySLhySblqQL9ySbhySLlyR7lySLnL12KQAAAAHHRSTlMABH/T/29r////////////////88OfVwx33++Ly1gcIQAAAHZJREFUeAHt0EEOQDAURVF4oAAA9r9P0ya/XtNJE9I7P5Mb+StOUogyAnIYKohIjYAImIEUHJgEB1JwQAQBQhBABAFCEEAELP0alI6gUjXQKC0LaFXnBvphBKZG6xOXwqVwyT8IYAZtEWDlYBNgP068dt1x5K0HY4kam/eIJf4AAAAASUVORK5CYII=","fBlankTile":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsBAMAAAAfmfjxAAAAGFBMVEX////qQzX7vAXFcVhChfTFcVfFclg0qFP06zrOAAAA8ElEQVR4Ae3PoRnCMBQGwKKwVCQeBBMwwhshI2QAHOvj6lqf/7vb4LY0AAAAAAAAAAAAAAAAAAAAANz2w0NERERERERERERERERERERERERERERERERERERERERERERERERERERERGTFyOvccz986txKkVYhkRESaRUSGSGRViGRERJpFRIZIZFWIZEREukVEpkhkV4hkRkS6RUSmSGRXiGRGRLpFRKZIZF3rRS5cP8dvts5ERERERERERERERERERERERERERERERERERERERERERERERERERERERERAAAAAAAAAAAAAAAAAAAAAEL8AYK/XHlHi4FIAAAAAElFTkSuQmCC","pFav2007":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACPAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAVZJREFUeJylk79KA0EQh7/ZXDCgRFBQCIiNhVXMC9lI3sAX8EEsrC2tLS1SirWgwSpKJF483du727W4bG4vfxBxYNkp5vv9ZpZZcc7xn4gA3OONAxA9AjMFEy+f1N8f0H8RL6D+DANcHszbjkSPysxMcbfnADw8K7odi6SzqhTIoEiEwURx2FI075pu/yoTVbrW4eEw4u01Wpp3MFGMkwZDbQF4Ot1wESauKgx0OxbI2du2NXcy6LUd9xQcb0Fu/SN6AVPpnOwGcBAt5ei1QVshs0LhhFoHEgI+n7mHkVshc4ILO/gNLoygrdTc6yOEAln9DuHQvRRI4zq0kC/BgXu9g4U5C1MWLcLaKsLlj/x2ecCHtpXAOhhA+b32TtoKk1yhrfCZK75zxVehVsICiP+NSb/hNncsSabmBcaWebbmw8bvjUoAYHwWOWDecgmXj7ZK4+jimh816v++XXGz6QAAAABJRU5ErkJggg==","pFav2010":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACFAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAExJREFUeJxjfOBlf56BgcGAgXRwQWHbQUMmMjUzwPQxkakZDig2gAXGUNh2kJFYTQ+87P9TzQWjBlAzGpGjhq4uoIoBF8jUS64+VAAAiccNiiu/F3kAAAAASUVORK5CYII=","pFav2011":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACLAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAFJJREFUeJxjYKAQML7qbPr/5+ljkjWySMsyiJXXMTKRo5mBgYEBpo+JLN1IgGIDWGAMyYmziNb0PD+Nei4YNYCa0YgcNXR1AeUGsEjLkqURpg8ARrkR3s0H1QUAAAAASUVORK5CYII=","pFav2012":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACWAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAF1JREFUeJztkSEOgEAMBKcXHIYf8QBMn4o4PP1T0eDISeg1KOoqZjLJilcmYAVm3p0BKl7ZA/AtEa+cQRiA0gMDDO0zLs9ijk3yCn5B9oztPJ8VpAisg7cCaFBigF7S/hI4M+ZIYwAAAABJRU5ErkJggg==","pFav2014":"data:image/x-icon;base64,AAABAAMAEBAAAAAAIACcAAAANgAAABgYAAAAACAAyQAAANIAAAAgIAAAAAAgAPgAAACbAQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAY0lEQVR4nO2SsQ2AMAwEzxYdBezFFoyQQdgmzGUkUpsq6RNLiAJX39zppbeUk92dA2eh7wwhyZ2xAbhJNAADrBqAAZhqmDfvAksWAMINfsEXBO0P6q6vN1CEK8CbipAGJYaQHvsUFjhgqUnpAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAkElEQVR4nO2WMQ7CMAxF348yNSuHQmKES/RGvUiVsZfCXs0ARYU5GSL1T/Hynm3JUhQbF3cW4BpBoUEkjKBOhTm7s0RwbwHe82n04QaylWerzv8jYakXHN6TpF7wPeML8rEot2gCtVXf9/grOgWnYADBzyUfL7BVxl9Rf4GE9YJLWCKovQQENU+F2R3R6dvyAmlWLsLdfhmYAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAv0lEQVR4nO3XIQ7CQBCF4f9tSWjCZcBxAYqgVyqCOxUB9RRFDwNJSUgGUwQQcNsx+9yueV9mxWQFcN1TyNgBczOmRIxED3SZUeUljfqa1cM4xCz9AbHMKHSrOZmxHBswINoALDzKh8xD7Df/FzPy4FX+SgK4AyafF7ONRS281Xo7u08gARIgARIgARLgaxt+bqvYcZ9AAvgDJO5e5RJ9AC5eAKALGWw9mofPaRXyDUcCa4nzGM8h0Uu0mVHkJc0TxtktiJ9rEhgAAAAASUVORK5CYII=","pFav2016":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIACoAAAAJgAAACAgAAAAACAA7AAAAM4AAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAABvSURBVHic7dGxDcIwEAXQdw4lRUZgIHZgBjYIGzBMJMbBI7iIRJMoqTyA5QIKfnXN+/rSxefltm6ewagteRhMsczeuDTimpI6MIypA4NTPc5X0QKX2Q7dC/4Fv1AQ9Z9fW5BQOnxOwh25Ve4U4XEAvosVLiw5LRUAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAACzSURBVHic7daxDcJADEDR73OaSBQZISOQMSKxBBvAJIyQFYKElJYNYISMcAVSmlyOiiZ9Ygq7dPOfLJ10AjAN1CnRZTgKVGw8IvQhcC1bRpkG6jnx2iO8mqhKE+aFm0EcoEqJTj4PskH8NzEYxgEqawAOMAcU68XhhGwZXL868ws4wAEOcIADHGD9J7S/gAP+AhCtAW+reIZ7UOWMwRUyxEK5hLJlVKURod8rDDwLpSlbxi/vmCn/0XPpTwAAAABJRU5ErkJggg==","pFav2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA6klEQVR4Ae3XgQbCQBzH8ZutpwnQI4QeISAEAQLQYwSoIS0BATBsLCBJgEBACJCqNWq3rvsTAtztd2O4P1+A28fmdo7VdvLI6/DY9WUz1dKl22MmRi7WzWNP6JYunOttyoYwQC4WlgIEjrhPmEARBEgQAIzAASACByAIAPAMnBc9FEBggGzl7iQiozfxF8EetEUBAB79JyygNIBvW4Lv23ptmuYAn8ta6E5xnpsH8ENfqaoAyt/bAiwAB9RtGxanMSG0Ko4jexZYgAVAgKgCgK8MeMeNgWkA3TWVASJh3g8RyRKwkO6arK7zBYE337jCy0xPAAAAAElFTkSuQmCC","pDl2007":"data:image/gif;base64,R0lGODlhEAAQAPUAAP////7+/vz9//r8//f7//n7/vX5//P4//L4//D3//D2//X2+Ovz/+ny/+/x9ebx/+jr8N/k6tvj7dbg7fLUxdHY4cTO27vO6O29pOWmgd6OY4iaseeARn2QqXmPqXeMp9d5RXSIo9NrM9RnLGR8mlFrjGdnZ71WG1Fri2ZnZ2ZmZ2VmZ2NlZ2RlZ////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC4ALAAAAAAQABAAAAaKQFfFQiwaLR2X0LIIOJ9PSGjjsjgAgAt2qwVEStWteAwAW7CmtFo9GJjR67XB8AasT/g8PmxP4ykYGRogInhnfSYngByMHCMjJ4crkycYjACNkBYFnAgIJxmXmI6REgcHFwwnGqKYmh8TDLInIKKMkC4eKLskJyIjHKOPJ0rFLniPyZDExkp6ei5BADs=","pDl2008":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////7+/vr8//j7//T5//P5//H4//X2+Ovz/+jr8PnWqs/Z5cTO2/Oode2TX+mFUOd7RuJdHL1WG1Fri1hYWERERP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAV5oLUwZGkyiyUmR+C+75FMFnMAAIPvOnDQvZ1QCMRVjkikQFAEVCjQKJRAaD6hkqw2WzNiFY2G4wGBRCS9q0Rcbp/T2EYZ4EYP7gaDxDGnm9EHBQUMCBJkEDt/CywIjRJtOGVnFhOVlY9zdSqbFhIRn6CfEpybW1sWIQA7","pDl2010":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////7+/vr8//j7//T5//P5//H4//X2+Ovz/+jr8PnWqs/Z5cTO2/Oode2TX+mFUOd7RuJdHL1WG1Fri1hYWERERP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAV5oLUwZGkyiyUmR+C+75FMFnMAAIPvOnDQvZ1QCMRVjkikQFAEVCjQKJRAaD6hkqw2WzNiFY2G4wGBRCS9q0Rcbp/T2EYZ4EYP7gaDxDGnm9EHBQUMCBJkEDt/CywIjRJtOGVnFhOVlY9zdSqbFhIRn6CfEpybW1sWIQA7","pDl2011":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVCiRY/j//z8DuZjhTBrDf2IxAwNYPRgPIs0MRAC8mol1xahmcjRjiYqhoJmSXAUAaQzFr2MQFNMAAAAASUVORK5CYII=","pDl2012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAwSURBVDjLY3jgZX8eiP+Tgc////+fgYFMzWA8+AxgIAGPGjBoDRjCKZGy3AgiKMEAQeIstyyBWPoAAAAASUVORK5CYII=","pDl2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAANklEQVQ4T2P4soVBAIgPAPF/EjFIjwADmZrhhjAQoQgvpq4BxIJRAwa1AeTgwWEAxZmJouwMAHyj/qlKsKWPAAAAAElFTkSuQmCC","pDl2016":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAUElEQVR4AWP4tpUh/8sWhvdA/J8MXMAAYlCA31NqwH/qGPB1r8L/nzcbSMLfgHrgBnw/7vCfRADWQ7kBowZQLxoHPiW+p9SAAnI0foZYXAAAgsoZPYZLeQMAAAAASUVORK5CYII=","pIcon2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADIklEQVR4AeyYNRhUMRCEZ3OGu1uJa0dFhUMHJSXaoRXu7l5R49o3uHuPuzsnGdzywdsXEpw593/e7kQO//WLJVBEUp4f7jFInt+eRpTb462IL27pPE54PVu/16h81w3rEUlZKHq+t/sgFi9vYgKwC5topEabdc9OT7pbrcusLYggA0Us3ZiMtCJTvZytXn3zvVNzBv4UA2CxE94qCY7wVY0aZtftY7MHxDagA5KII0rtOma3biK4Ai68a4oIkGIiVgVIFz7BqG4spgkDL9EBI3QxdTvdOjqzf4ABDZrQc0GtFRO+h1KnbmaPbiK8Agnwej5YfoIEvTWht1NwBdxcpMuHCFG6fx56O2HP3UPjBsevAKkEWs9H+f4+Prp0AOXik8SWq9mg3uYH+4eMCl5KgEwZTqbKR9aUYJ/t5e0jB/HiGWC/OCaECABaGAPkjF0NYG2IAQVah3clAuSzRJ1GJTy7n0HlJfFB/MwsAWSECKqA/xIi3aQnAmQNUbN+GS8fAbYoXw2+gFAUuwIKvBtqEFVqAcWngC26b1Pg41fAA95RvrpFCYJKCYCo8FErkABGr7bKVSfkGWArzv4hcgU8wFV4R0S2GlB+AbCMaBVQYOEJr8/YmQJhRcBKrAwo0Gw1XmzT4YDJw0u2CHNtHeTSfLrDqMlb2JIANnAm1pcWhG06zBv+PSVssxEA+AX8B5kcgaz9CRkwBShSP8tvtJjJILaB+KKSD91AJMnlxUyfHYKtJogyAEQMsYgaZnN5mfvjiY8rrSYo8LHmAf2LPMA92oZRW4gAxHMPrMOT0OHjhZixwD3gGcuABP0LwZDlRriB+OAR4OOvRm2LMak/Rw0+fgupcsZ1hytg8xNsgCR8pYO7Cp4HAmRfglL4vgraYgB8pBaSa+vAZqMAyUP/jLucXhNpHgiQXJzLzMW5LrQCQy0TPz/E/uDaUQ9roXBgHTwAPt5qVIMOBP95q1HlBxmQi3ADJwF2g5cYJRckTwRv6u2LzFT/zb4j8hvtwsTH9qVRf1sAXY+2VRsoqMxmhp0iVEGvQAVnCHm1av7gv1sZBjkYBQA2OTgNksFANAAAAABJRU5ErkJggg==","pIcon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAPFBMVEUAAAD/vwD7vQT7vQT7vATxmgD6vAXymQD////+7sD93YH7vAT7vAT8vAP8vAP/vwD7vQT8vAP7vAT7uwRUHylwAAAAFHRSTlMABH/T/29r//////PDn1cMd9/vi1mgMSUAAABwSURBVHgB7NOxEkAwFAVReJAA/v9nlSZzn9VkKGT7U271XnXTmtQB6M1pANG6AIT5QAUDVzAQwQAEABEAQAAQAQCEGVfABUan3CDEpPAIoiXFT0ABUm4QnX6+aAGTYbOAhcEqYNsPu+2ckDAjA90AAOtdGTZEZ6mUAAAAAElFTkSuQmCC","pSquare2013":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAABzUlEQVR42u2ZsW4TQRCGv9ndnOOciQgSovAT0PEEVBHUNEi8CeEBSF4kSkHrhgiJV0hHj3CBKIjMGcvO7QzFXRwlDgEJcXvF/uXppPlu5nb231kBOJ+wtyUcmPLKYCyCkEZqxlSNE40c7r3gXL5/5P5gwbthyf6iAjWSygkMR7CsOB0UvHRhzsFwxP78B6uoJMaDqFg142Iw4tnPFa+lmvDZe8Z1jSQs7TWZYSFgMTINBuMYcdILtEYiSIyIwdgJOHoqAddbuPWiyYD/qLBZeJeQW8H0D4C1YqppFoUD/O8yKAFb1RSP3+AfPgeLIL6jxtfEit/es/r0FikCWH0zgwIGbvcJ/sHTNA16+ZVmL5O7SjxvvshqkNARWRurnv/lIhEPWHclvowlLvfBDJgBM2AGzIDZsJq2ZiFecxX/3W4hG2b1dsBQthu37y5Nl7FCeReggYDOzoiDR0kMq87O2qJdDTikmtwYd8RbM90Dy79+4pBeH5pMmxdzm8mAHQFan364zaOUOoGp96hZ+unqGsww71GBqTM42S5xIlz0AbJlqLd3cCIcu7rkcFHxobxH4V36EbB3yGiXrWXF6U7BkUB/riHMMIQvqlfXEL8AkzO31nTsYp8AAAAASUVORK5CYII=","dFav2010":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAC/AQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAYZJREFUeJyVkj0sw0EYxn9XFZSYBUNFJFIxVGLq0FgIBmGTWIlUky42Em1iEhIGNUkkho5IMHQRTSza1NDYuqJD61ul+v87izv+/fDxJJe7933vee55L6+IJdOSf2Bte5+DzXmhYjuAx+38u0BJbFOHaDxDIBQhEIrouNJehlgyLU1pSFMaMl+U0h/clf7grs6VrrG5VUvLFgcAoyMD/3JgV4fB/hbA5Oj45Fts3QtGTZmAiCXT0uN2Eo1nNHljaZJoPEN7wlW570/0+h6FdqDIKwtTgEl7wkXX8A5G9hyAYiGHzF9rsnl/SSqMtH1X3Fia5PTiSls1sucUCzne7lKaXNs2RP3AoeZYBAKhiO5ZQRGFo5WmviAOl89StwEUjBr9+2oOlG2Fxu4ZREMLr4lFi4AdoM5u4nW34XVPlb0uHK00e7Z4z9/wdDYLQH2pwIR/nVIs93z26xzHzF3wnAyW3QEQFbNAKtwsO6cfqpV52esgk739GqRql35DVQfKxU/1Xt+j+ACMWb1JU70B6AAAAABJRU5ErkJggg==","dFav2011":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACvAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAHZJREFUeJzVkbsRgCAQBRfHkMBStARzyqUPKIWAXCMYdPgb+TI4du/mEF5jgJ3xWKk4lkmYwK3hJBUi98prrpplmez+c4H7InDAmV7EX2htO8BSYb0enyDC70KPoAj3CKpwS9CEIVliJhtg0oWVJqh2qGSWe+YGKO0d2EIbVfMAAAAASUVORK5CYII=","dFav2013":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAD2AAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAL1JREFUeJxjvO1ivoCBgSGegTywkPG2i/l/MjUzMDAwMDBRopmBgYGBBcU0Hl4GycYuBk49QwYGBgaGPy9fMLye3s/w9ehB4lwgXloL18zAwMDAIi7BINnQycAqLkmcAdxWdlgV8bp7E2cAOQAlDP68fMHAIi4B599xtSDNgNfT+xkkGzpRFKjsPoGhCdlgFAO+Hj3I8DAmEK+f8bqAgYGB4ffL5wzvFs0h2gCKA5FiAwY+LzAxMDAspED/QgAUYipSI0HPdAAAAABJRU5ErkJggg==","dFav2016":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIADOAQAAJgAAABgYAAAAACAAzQIAAPQBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAGVSURBVHiclZNNaxRBEEBf9fSsMOhuED8SD7s7gop6EYke9bBgBM/Bk+BPCPh7lEgg/0FhD171pGCMa2IEySbxg7AhmGSmpyuHkVkmO6tJQUN3Nf14Vd0tAIOZzte6tTGqHCtE+OHc0sVX3ZuyMdNZOnuQXAkEe7zTeThwB2Htu5m09npxWAT668jVa3D6DLq1CcZUAizYehjEttAWQdoxpvsmX6vC9jbu7m2k2azWUCjw2u9jns+X6mRigmBhEZJkbCkFwNy7X7FrkOk76O9f/wfo5gaVt7C/DzYcCxh2fnUFBgOo14eNU8U/fYK4FPrreS7LoNUG78sGTE7hpm+h796Cc7C7i388i3nxkuDTCsHyaj6+fCsZDQ28R1ot/LO5vOYwhCTFNBoj2tKO0d7yEYO/ytRqyNQl5Nx5YMzLVF9Mq1/JCeLfgMyP5lRLBqKPHmj2Z28M3oC1SDseXrEq+uE9RBFBFGF3XLZ2CpoWghGA95AkaO9zOR9FpKrZz9T1BGDrYefjhcDeOMl33kndWuN19/IhjheV4HrrcXkAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAGAAAABgIBgAAAOB3PfgAAAKUSURBVHic1ZZPaxNBGMZ/7+xgk4ZibW3S3PRkbTQHERUteBAV8axY8B8FQfwAgt/Em6KCB79AVQTRYlsVBFttxXoTkxrxD2iS2p15PSRop2ntGr34wB6WmX1+8z7vzO4KYI/19aUubx8c60mntjnvjIgobcqIUKrXn5+dfjV0Z35+QQ7lcpnb+3Z9/f7pc2zASrvOTSngUN/R3W2Oj012ybsD+5/1eFe0iPlL70Ae4i8iL20+nSrG36qhuQjUalAuoZ0ZWKhDKo3094NziQACdmM6XTDeK0Es1qJv5pCTp4mmZrHTs9iZOaIr19C3b0GTtUcA570Rd+Sg03q9UYEY9M1rotF7yJYtDTPTLM57MAa3owi9vYkqkVTKh9FUv2EuXkIGBhoxmSXDxoBzRPfuo3OvE1UBEAB0vow5daax2pUURbChBykU2gOQzkBXV7jyFSSDhcTNDp0W6rC4uHYj31fWXMSKAMl0ok+frA5oRucfPmj0KIFscNeXxY2cxs7M/dw1gbkx+FPDIILOl1vMRAzk80F8IcB7pD9PvKOIHb0L2dyvMVX8yWHkxDD2+s3WKkVg4hHxuRGkL7sKoDlRenuJd+9ECgVk6yBUKo1YIou9cfOX4XLt2duyA1sBAM4hmzdDtYo+ngRjkE2b0HK5NbqlUoXwvbAKYKmiaMnDf65/+gb9HwD6+wMm0pgTABIeGAAxBp0Yb7I0vAAdHyf4bokgevRwHFerUSJMFKGlEqhn+W4BDQ6aAjbT6e2HWu1Fl1KwQrQmwDkkm11zDoD36ku1+nNzYWpmX8eG9ZFDfdu/EkEdEINb19Ntzk7PDglgD+VyHVe3DYzl06mi98ryRiU2VyQyxn+sVafPT80O3apU6j8AXsICvkpooukAAAAASUVORK5CYII=","dSquare2013":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAFUUlEQVR42u2ZS2yUVRTHf+feO52BdqYtyAJa0GBi0I2LGjQarYrxHZfGjaIBHwvjglijUfFBjImJe6s8NNGNO6NE65MSSGAFJopRdANoF6WDdpB5fN+9x8Xt0EFmpqUMEBNvcjKTme8733/O43/+944AfAz2QfDTd98xXPLphqWq96IUuEhLQEPQUtGazxfb7Lb+sbFddUzy3fCwu218PJ1+4N6XFiXJiy74nNYSlIu7BJBMhsTaaqXLvVH45PMt3w0POwEo3n/35n70tfTk34pqEGPsRcYXAxKCFxGxPd3mhLB5yadjW2Tyvrtu7fP+WyqVgIgIGC7hUgioquay5i/L7aZWLj/lNIjGMM8NTgSsBefiq0inU20UyKhKcip50i2FO7SWICKt06oKmQx4D9UqVCqoTxHnIJuDXC4CTdOOABYRSy3RfjF3OkQKqkpbt11dMDWFeo+sWoWsvhJZvBhKJ9HfDqPHjiHZLPT3Q5J0pGECiAh5N2c6RdBjR5GbbsGuX4/ccGNMbX0lNXR8nLBjG3rwADIwECPZqZRX1g3XMiFktBW4iQnMpmcxGx4/M+WN1wF4T3j7LcL7O5DBwfMGKUBiTGJa1pyz6MQfmGdHIrgQojWAbwSHMZjnXsA8sh6d+CM2UQdWc4AuA8eLyE03Yx7bOFv8pkWTWxt/lPeYkeeRq9ZAabr19ecNMHjUp5iNT8QHN0arpSdzGqzZ+AQ6PT0LvKMAjUC1ilx+BTJ03WyE5uUtupO11yPLV0C5fN5RPPtuMVCpIKtXzx/Yv1dvLwwMQvnUBQDIDOF2d8+kZwEpcg5yWfDhvInbNJ2GGQel0ozzBTwgSWJ6L0gNhgC5HHr4F6jVFjDtFf48AUeOxCzUqaljAFXjfP39GOzdE6Po/fy8hZjSsHscnZyMM1q1rvbOtHmm3rQccdksfuto8+nRBhxJgm59DynkoVadIXh/tqVp9DlHIzYH6D30L4HvDxLeevMMIkb1bJuZJBhDeOZpOPwzLLkMjI0qqJnlchH88eNtO921LfQVA4Qd2yFNMSPPR8etJsnJk4SRTfDrb9hvd8NlyyBNIm01KyMRCIGw7V30ow+jEmpSr63FQoM41YkJZM0azGMbkbVroa8/UkmSQHEK3b2b8MF29NCPuD37YMXAOTWCf/Rh+OkQ5POnQdbFgpuzI9MUWb4cjh7Fj2yK7wcGI8+dKsPRI+jkJFLII1dfA31986cWDSAGWbkKPXggEvy/ojg/yZGm0NODFApRUR/6IZKws7C4GxlcCUkNKtVZYVFP41wtIBLvFWk6E+aviUKIzeBcTHEdRAiRLzWAMwubHG3ucefsqN61Z31+YXZ5l3SL+T/A/yjABRRjG1rqHEDVmZF1jl0cQltZ5joWNWOgWomjrU4/c6npOrhyGaxpGv3ORdA5dLpEePed2fObxu1pM7MW3b8P3bsHevuayjqprhuuuVaz+Jwr2kCxCNdei6xcCUnaIuUzMqtUIuzfh2Qy8XilIc31WSzldcNTuRD6006dU1kL09NordqawIXTWlAKvbMDoKHNLFATmXJF9MsVXZmHtFrzbU+45i1NPOTziOltUNNtQNY15hn9pl6yWVtMk69Ml8uMpiJB6oeHnVghRNHgPfi0udW/b3KAKUAqkMktGjXLxr7Z9bd1r7qebiuqaAheLxEpawheVHE93bbk7CvLdo7tMqNDQ5m+nWNbSmI2h0W5xOWy1jbf5lxQM4DLZW1YlEtKxr685LMvXx8dGspI498QJ+5ad+sp7zcsRe8RJa8L2hQvlOe1VLRmZ966bYUvvh6vY/oHWBxvDmVPngsAAAAASUVORK5CYII=","dIcon2014":"data:image/png;base64,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","pBlankTile":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADhBAMAAAAUmP4vAAAAElBMVEX////qQzX7vAXEclhChfQ0qFMwK+Q3AAAAtElEQVR4Ae3PMQ3EMBAEwFB4HYPHcBCOQvhTSeMmkrtUXs0wmIsvAAAAAAAAAAAAAAAA+C0ibyIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIv+N9ajZODHSIZGakEiHRGpCIh0SqQmJdEikJiTSIZGakEiHRGpCIh0SqQmJ9ImRnXu5TiciIiIiIiIiIiIiIiIiIiIiInIIEREREREREREREREAAAAAAAAAAAAAAADgAe5PE+AjYLHrAAAAAElFTkSuQmCC","pPresent":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAXklEQVQ4y2P4//8/A7Uxw9A01NjYeD0Q/ycD78dn6H9y8YAbGgDyGlUNRRIHGf6eqoZC5QSAuJ+qhiKpMQDi81Q1FEnt/cHpUqqHKVVjH4gTqJ5OB3U2pX4pNfJKfgBk1wisS/AnMwAAAABJRU5ErkJggg==","sFav2008":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","sFav2010":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","sFav2011":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4y2PgnxuxAIj/k4kXMFCgGYypawCxAK8B2Ni41NDGgFEvDHkvDFheoCg7AwAXsnQNqnNJuAAAAABJRU5ErkJggg==","sFav2014":"data:image/x-icon;base64,AAABAAMAEBAAAAAAIADmAAAANgAAABgYAAAAACAA8QAAABwBAAAgIAAAAAAgACcBAAANAgAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAArUlEQVR4nO2TMQ6CUBBE3xJr+VpZewRPYmEBVoYbiGew5gRgSeMBPIVHoKCywEgM/VoghKgxfrF0qs1OZna2GDG75QrVSFUNFhCREgjFjb0zMLYRd00chNEjUQYpZZAyHU7eGqiqcVDkm+sNnD5iAHFjT6GObQOT+L9JMGiG2X7dLo+LCID5YUteFZ8ZZNfTE5lXxct9F71f+BuAmMS/2DaxFddl0s29mtZiILwB87oyHY+LO1wAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAGAAAABgIBgAAAOB3PfgAAAC4SURBVHic7ZaxCsIwFEXvDR1KK1hw9IvqbMEuDm79IHGy4OQn5Lcc0lKU8lxCKSqiNhksPVOGcM/j5YWEy9N2YdrbgcBKRGI4gGQFQEchisC01z0EmbhItthC13VDKIKpw+xH0kAEs3c7Lrtzt07K/Kt0EYkVKPytuM9QEHgWeMa7gPPjppvQ/oEOoT8MI2vRK4bcA2AMLZoEk+APBEzK3Lh67J/CyUoB0D7CLTqIQhR1QwBIfXxb7uCwOXkt4WetAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA7klEQVR4nO2XPWrDQBBG3ze4cCr7KCrTmoDOkJ9O91CT+Bo2SaNcQuld+ihWp0aaFIIQ2WAMlndd7OsWFr7H7M4uI4DF59sTfbcGZbjPuSVSC74HK5uiqrX8el151//g6KbBJyI4WG50/h48HBgy+w/DPQse/oeymYsH/LLth+J7tF5uX67Ld58brvDl/4chjywQGYvSASOByEQX0GLzPGrC41abmuPWjV6BJHByB84x+VPMHVQgCSSBJJAEksAdCEhttHSpnQ2DIo+X7J/i9xvjewMrh0ExMMNwWlpTVDVYjtgFOQ6pRezA8qao6l9luUNPAVY5SwAAAABJRU5ErkJggg==","sFav2016":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIACaAQAAJgAAABgYAAAAACAAcwIAAMABAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFhSURBVHiczZK/L0NRFMc/9/a9JygJkfixoImhupAQK91sFnNJahP+BoPBKLEajBYTo8QgERKjWkQTTQ1CIo9G8t679xgeraQv1cTiO93hnM/3nO89CoCzwj1d7jiW9qSAWlgif5BTnBZKvH5MoJUDoII3hr00TyiiVhArEf2dFU3azX43I5a92U2qS4f0WdN6Cq0cur1xBxEUChEDNkIrBYCjXbBh4vxKpxAErCV2Dnx2Z9bxlMP8QA6ArekiVppD6dAuqxc70NEbGwEMeWk2Mov1IiPC2mg+cXJB2L874dx/aACeUQweLYN22J5aoziWJ3u8gm+bYzTW8GJD0E4DEAJPOgUSYb7+0reGxwRAHKDTeCZXtK9/CFB/BbhfR5mSXy6xbnhVFKpvdXcJfOYGcly/lol+pJ2okR40tbCMie0EwOvl0q/83mzE8B7cxiufFW7odCdjQhvSCmpBmYWDzCemYHrqqCfibwAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAYAAAAGAgGAAAA4Hc9+AAAAjpJREFUeJztlc1rE1EUxX/3zctXMzUipF/YsWIRobbVfRciWrp0IaJLBVfiPyC49Q8QpMWNy4I7Ny4UsrFxK02NBStYqJC2uFCblnzMe89F2mlDYk2y7oEZ3sycN+dyz733CaCZmEjybHKJIf8yoVEgjl4RU1DaLfA0N0NhqyrMDqZ5cafMylaIiD7gCeCcaywat85hnGV6UHEr1y+8ufeJup3CQx3lqLDCeX+IGMLXcgmrk92JWBfiqS+KYb/l5wAX+rJ8m1tgdW6e0b4suC6zpkQz7E8oQtP60RmCTBA9jmcCoAdb6kbpg31Rzp0DHDUbRryqCcHZ/2qI8nBHSSLu0NSwQtCXZTwTUDUh05lzEe/q6TEEUPJvs1M6wbuNPDpxirqzhxrkHxi2y+pS8gyrc/NNm4y1OHFo8Y4PfR97pkp68Sb4I40XA2kbmVtvY6LrskRVG+5+ioTvu5tcfPuQIBNQsyFXMmM8n7oPwOPCK5Z/raOkpdgipHSc3EYe7Y8Sclg4kQdWJ1mr/WFtuwCuySqWf6/z4WcRjvEAgLgPNFelbmYIiAeYptZQCIhqXF2i+x0nAicCHQukdDxaJ704PU1T2nc3iEduI0/F1NgzVd7/+LjfH91D43ltQ7OJDKnFGwDE+s9ij0zIjhHzUJR2ihjXcuqEzjSmoj/SNH47hnGWUrkgXMv6vLy7Q2HL4vUwC9rBYpgc8Lj92hdAMzuY4NH1JYbTU9R7iDaCE7S2bO585snKDMVi5S+GkMLZHjcneQAAAABJRU5ErkJggg==","sFav2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABC0lEQVR4AWMYtMBoZbC76Yqg2cYrgucTi5UnuMRRxXLT5UHhJiuC/5OK5brtP4s3mudT7ACTlSHbyXGAfJf9f4kGi/8UOwJo2H4KHAB3xIA6AOEI+jsAwxH0dMA3iMWYjqCLA9SnuZ8EOQIUEkgYnDtAWZQCB1COQeUE2Q4YdUDUjuL/6fvqSMIh2/Ko54AzL6/8JxVsvreP+g5oODEZBb//8en//Y9P0MVp5gCMeH325SVIDl2cZg7AiOc339//v/n+Pro4zAHDKA2MpoHRNJB7oBkUtyThlD3VQ7suGHXAqAN2U9sBoG4eCQ4ISae2A0B9TaId4LDfgQXqiN2g6KAEg7p5oL4mw2AFAJfG0Q0JdG7vAAAAAElFTkSuQmCC","sDl2007":"data:image/gif;base64,R0lGODlhEAAQAPQAAP////7+//7///z+//v9//z9//r8//n8//f7//j7//X5//P4//T4//D2/9nuxcTlqr7kn7HdjpvUbZDNVKS3zoHNRH/HRHrHPIqarmimK2R8mlFri////wAAAAAAAAAAACH5BAEHABwALAAAAAAQABAAAAVvICaOJMlxGKBSKsC225mu7avGKKXvvI7PrloL8BPSVIZfj5JpOpsoYdPxiEgmliaQMsg4IJVwBXDJYHqZhzhMNhPeFEYmIgaMyxiEntLISOp3ZhuDGxoZE2OJbSeMHBkWioGNJ00XlpdQk45PThwhADs=","sDl2008":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","sDl2010":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","sDl2011":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAsSURBVCjPY/j//z8DuZiBYs0VM9T+I2MGIEAXQ8eDQDOpYDj4eSRqHpCMAQDUEwD+6xAD6AAAAABJRU5ErkJggg==","sDl2012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVDjLYxBbnnoeiP+jYQYsYuj4/P///xlwKSTGgP/DyACy8WggjhqAbABluRFEUIIB5xoeIOjKcLkAAAAASUVORK5CYII=","sDl2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4y2PgnxuxAIj/k4kXMFCgGYypawCxAK8B2Ni41NDGgFEvDHkvDFheoCg7AwAXsnQNqnNJuAAAAABJRU5ErkJggg==","sDl2016":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAjklEQVQ4y2Pgmx+Vzz838j3/3Ij/pGK+uZEFDNg0667M/e+9tfG/3OIkAoZEvmfAJrH01oH/IAAyiJArBokBNuvL/y+9fQCOH35+BTZgy8PTKOLIGGY42ABQgJEKvLc2oXoBZCIMb3lwGq4IWRwZw2JokATiqAGYmQmUsGDxTNAAgdnhBeRkZZDFArMjCwA+4lDxL9arHQAAAABJRU5ErkJggg==","sIcon2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADm0lEQVR4AWIYYDAKGAkp+P//P6P7ltrg9z+/Nfz+/1cLLIaQhamB8SA0HnE7Ka2MmbY5s+jmAecNNSFPvgOIMWsoqYIoiNb7I7iHxLjH5LhDgpPhEOLu7hIS4u4Z7m6zCe7uNjP9WGl0+lMcug/U+racW/3ky7P1FuAXcAAO6FgjAoxs3Elevn3XY2rLXpsQQBGIHn5+NQFcP4LGy5T9qF654sZ5J9a3/ycGsvlsE3uacMs1xuOdLF9+x9zDG9uFN0ABFSGkMJKqktrJTXgbcMOr8tNnMlBuwtOAlTrhreI6zh+bSHITvgZgId2dhxY2kVoTsw9vaBvcgGohOCy86/R5IrrnGjWSrpLeRUx4RsB+MHiFxp7+28+f4JQ1kaqc2jXz8Lp2fgYItIWLh485fYVB5vkdKEmndOX0rtEH13RH+BrQH8Fd8CT3BcceX9VTNzL48OHDb+fWqlpt44D9CweBKAkOTXI6Ft7ZlXJQHH2R0RM3LiP6mAWMrS+xUVYpWx8BJpKVAFb7GHBDU3gyPynI1Uwh8VqBz8ZRT/YnBP4R4FdoAu8uao2AXPUUorc5IGvsDLFzhLRpYoAAszTj8D+06HylJKL3eUjOfB+06yRMBJTVB4HnaZWvmEDiA6C5PCD85LkBDuwG5/Cx1498hQTkI4C8wY8RCtmF/LoRjZxCy0eQTwoxdtzPAIeFJ7w61pl0BMkCMAoIuIGA0H8F71pnUlFZURtvAxx4SL028VD8moBlmd3uTpaMAGNCdiG3BtdrLfBQsQGNjZhIwCImWlm0T6G/RKd+GwGAFZm9BZsMtWM83bgBb5VB7ikwXmwAALD81zEohtoxDh+giAWA+l8rXClJ4DVMBBRcVzovFsToWpcl7jEOH8iAKkQk9nRZnhenUEGiD2vQVqAcPkQR09SwkHAYgB0rWD+sflsKryFrgG9ILmwORF/4QDXA87yo6zJxbaTwgw/2PPBjnkNhZfMcwLJrewrQi1NIGLyqBroScxVD7gaAgjy3V9sCKDvmgCfg/ldiLuX78JoI/khJiIu6LBP3kBaPLRVfeI8UIlKSdkQe8GEiUHfrcLUAxCE5dQe8/q8a4OD81P2vA/7AHJzD+xsg96ME2gfc/zpAcPgsDv5PngfkHKAtwEQACLhzrRE5620gMslJJspu9yl2Du6OUvQ5MQlEAi7UXtW7Qy4pMwxME+/3qBwcYuRiZPLjng7ZsAtfNsjBKAAAG6XiQbV1DX4AAAAASUVORK5CYII=","sIcon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAQlBMVEUAAABAv0A0qVI0qFM0qFMXgTc0p1MYgDj////M6dSZ06mz3r5nvn40qFM0p1IzqFM1p1IrqlUzp1QzqFM0qFMzqVMK26WfAAAAFnRSTlMABH/T/29r////////88OfVwx33++LNqg1+gAAAH1JREFUeAHs0wMWgEAABNBs3/+u2c2bzZ6MX0vpvMiKqk2iE2BoICYRKgREaBAQgQERGBCBAREEIEEAEAQQgQERmiA/6IAFsjewnSKuZbnliS0ETnn0LMsrT5zzwd9Kt2wlB+Sf0+8CvkYTTEDIQTQBcZJNGLdyEVFGBroBAFU8Gqrx7I4FAAAAAElFTkSuQmCC","sSquare2013":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAADcUlEQVR42u2ZTYhbVRTHf+fe+/KSvHSSaYNQ6xdod+7E5YDrIuimWNSNKFgE6bZ7F3ZbRFBQRHDsQnBjV46CjO666EJRod2MreDnOKOO8eXdd46LTkLSzNhMMmFGzIUbSPJy7/+ej//53xMBaL7zRAutncd4GuweRISDGGYGctOwS+Krr24+9+6GcPHltJn9/KEcSU/ZVhfMONAhgtQTrFOsuG487VunHzwv9eRF63QLFIdwR+sF5/Hi+hMEY58OZhhFjFJPT4oqQbHnpRsVJYwDDuDXziaY9t8nISVLqrc8NLUFEUyCdXI15ZkgcDeluXGgCUK0yGtLZ2lXF4haEpzn8toVPri+SqOSUQ4AnwqkIoidCIDfy2/VjGdPPkYrzfqf/djZYPnbT3Bpg3JfQ1icw9hzxv6S/07Ukr+KnKglW0UOM0r8wATrBvEE51EzgvO4GbKSAxMO8XAz883+ATzcI8BwFMrA607ZL3f4TpjGIaN0H25/JJqiu3CZIHS1GFmkNMW0oKsFhZaTu7NfmQb2bL59xnrl67fOJheXzvL4/Y/2SXinM96btQnOYxiCsJFvsZ7/gZPJImaQ8M99/gaLtSZx+6Bh0LVqyvH6UR44ctfYhA/QSrMh4p50HK8fRU2HgmTExZ2Y0y3jv1qw4ofLdmlK1HLi+Ovt1Yn5jkkyqMdYTBtUfKDiw9gbeHF4Pzkh9PZaTBsjci8M1thqUuXS9VW+XF9DTUdiSrat9dLDp2htCwMvji9++IZPb1ylnlQpJ1A0vb2+Wl+jmlTRgTXCoJt6ALUsdo06yi5PPbREq5IRVfHe8fGNq7yy+jpkx2CaLPYJC5X6kCIKtyvuViXbtbb2aCZsW7b3VCOpkWRt2vXWVDSjZiNybSTQStNdJZMgFFqO8KCaUmik0HIqgP/JUjcHOAc4BzgHOAc4B/g/uNXtXQFbSdRb04kM6bdDAbCdLhCc718JsiSdWeMz3Gr0jX8dcyK8d+2zofbblZ+uUQmVGVjSVJpvnfkOzwnK8W/dm/mfs2tg9m5mHqPke+ccy1JLHWJx3D7usVqTdn2xPxtJbX/BiUWppc45lh1FecE63RXJ0mTcPlrcVs69qfvRVR2IIcnSxDrdFYrygv/78td59clHPrI8d2LcB7ZwoH9DGDetG98Ul57beOH9zX8ARmaWztm3SgAAAAAASUVORK5CYII=","sBlankTile":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsBAMAAAAfmfjxAAAAGFBMVEX////qQzX7vAXFcVhChfTFcVfFclg0qFP06zrOAAAA8ElEQVR4Ae3PoRnCMBQGwKKwVCQeBBMwwhshI2QAHOvj6lqf/7vb4LY0AAAAAAAAAAAAAAAAAAAAANz2w0NERERERERERERERERERERERERERERERERERERERERERERERERERERERGTFyOvccz986txKkVYhkRESaRUSGSGRViGRERJpFRIZIZFWIZEREukVEpkhkV4hkRkS6RUSmSGRXiGRGRLpFRKZIZF3rRS5cP8dvts5ERERERERERERERERERERERERERERERERERERERERERERERERERERERERAAAAAAAAAAAAAAAAAAAAAEL8AYK/XHlHi4FIAAAAAElFTkSuQmCC","feSprite":"data:image/png;base64,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","fe_mi":{"palette":"","palette_o":"","visibility":"","visibility_o":"","settings":"","settings_o":"","more_vert":"","more_vert_o":"","content_copy":"","content_copy_o":"","delete":"","delete_o":"","image":"","image_o":"","add_circle_outline":"","add_circle_outline_o":"","title":"","title_o":"","smart_display":"","smart_display_o":"","view_agenda":"","view_agenda_o":"","drag_indicator":"","drag_indicator_o":"","radio_button_checked":"","radio_button_checked_o":"","radio_button_unchecked":"","radio_button_unchecked_o":"","check_box":"","check_box_o":"","check_box_outline_blank":"","check_box_outline_blank_o":"","short_text":"","short_text_o":"","subject":"","subject_o":"","arrow_drop_down":"","arrow_drop_down_o":"","arrow_drop_down_circle":"","arrow_drop_down_circle_o":"","linear_scale":"","linear_scale_o":"","apps":"","apps_o":"","event":"","event_o":"","schedule":"","schedule_o":"","cloud_upload":"","cloud_upload_o":"","star_border":"","star_border_o":"","star":"","star_o":"","arrow_back":"","arrow_back_o":"","close":"","close_o":"","grid_on":"","grid_on_o":"","folder":"","folder_o":"","edit":"","edit_o":"","upload_file":"","upload_file_o":"","drive_folder_upload":"","drive_folder_upload_o":"","create_new_folder":"","create_new_folder_o":"","insert_drive_file":"","insert_drive_file_o":"","people":"","people_o":"","person_add":"","person_add_o":"","link":"","link_o":"","info":"","info_o":"","delete_outline":"","delete_outline_o":"","restore":"","restore_o":"","list":"","list_o":"","grid_view":"","grid_view_o":"","search":"","search_o":"","view_list":"","view_list_o":"","view_module":"","view_module_o":"","drive_file_move":"","drive_file_move_o":"","drive_file_rename_outline":"","drive_file_rename_outline_o":"","file_download":"","file_download_o":"","add":"","add_o":"","menu":"","menu_o":"","history":"","history_o":"","computer":"","computer_o":"","folder_shared":"","folder_shared_o":"","access_time":"","access_time_o":"","cloud_queue":"","cloud_queue_o":"","check":"","check_o":"","expand_more":"","expand_more_o":"","chevron_right":"","chevron_right_o":"","arrow_upward":"","arrow_upward_o":"","arrow_downward":"","arrow_downward_o":"","lock":"","lock_o":"","public":"","public_o":"","group":"","group_o":"","add_to_drive":"","add_to_drive_o":"","photo":"","photo_o":"","print":"","print_o":"","remove":"","remove_o":"","zoom_in":"","zoom_in_o":"","photo_library":"","photo_library_o":"","photo_album":"","photo_album_o":"","collections":"","collections_o":"","check_circle":"","check_circle_o":"","chevron_left":"","chevron_left_o":"","zoom_out":"","zoom_out_o":"","slideshow":"","slideshow_o":"","play_arrow":"","play_arrow_o":"","play_circle":"","play_circle_o":"","label":"","label_o":"","insert_photo":"","insert_photo_o":"","add_photo_alternate":"","add_photo_alternate_o":"","star_outline":"","star_outline_o":"","picture_as_pdf":"","picture_as_pdf_o":"","description":"","description_o":"","text_snippet":"","text_snippet_o":"","movie":"","movie_o":"","audiotrack":"","audiotrack_o":"","archive":"","archive_o":"","settings_applications":"","settings_applications_o":"","help_outline":"","help_outline_o":"","error_outline":"","error_outline_o":"","open_in_new":"","open_in_new_o":""},"dvFav2012":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABfAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAiZJREFUeJylk01LVXEQxn8zc86519csKEoibou2kVTYKhSCoI9gFl6oZeDd9xECo22Flwi3fYAWSrSL0DbSJhSjyCiUFpr3nP9Mi6uS4iYaGBiGmYfnmRf4T5PDieLpxKVXZ74sjh/bARFEFBHZjWWkdu3N0t/1egTozMP1EyQXVDPUMsRyVDNEbOZw8QGA2rOJKREZWy7rvPzRj6ghmnWbLUcsGyvf3Zg6UkJ9dnJIYBGkIR4Mbu/w/uIGp3qtCyRABOFpNSJG8quvNw8wEJVpMW2YKVmesWU5j74NIJp13XLEDEQaENMHGPS8uNMQZEVNMBRF0J2EOqtfL2+gog0RiKiIVOKpIiKdr40urO4xmBEVVAW1rlueYWpN0GYEuCfCnYiAbmIGQOrtyTFRmTdVLFNUFAtBO7Hw/e7zcYCfb2/Nm6QxEyfThJIIT4Sn8QyPWQQiAnfv6nIgeXNPZ3jZ7KS0UpUVVUoU5hSZkxuzUnt+e0NUhvYlIJz98IAeTpLnNYp6PyCc6/1EwS+qlEhlhXvCJG1mEdHCmQVwh/71K9jvQegxrOhD1RBR1rYvUFaJTllRlhVlWUJESzv35trhseTJoVMw+Pk6ktWQYoBAAUW1OxvYP2kElj4+GW7vbaFFwPG1myiDSN5HOHgEyZ2UnOSBRxABAYhIa/+QOvfnFoqt4fbA5ihi9d0Gp6qcTpXYKROdqiIl7w46or38+PTCEX/07/YHuo72tzR8MW8AAAAASUVORK5CYII=","dvFav2014":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIACoAQAAJgAAACAgAAAAACAAOAMAAM4BAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFvSURBVHicpZMxT8JQFIW/FlqgIFZhYDGim4OR2LhD2PgVGH+A4NYwIBObMLhjXBnYukmYJcSJhZgAiQ5GBwLBpUAdBAK1MSSc5A7vvHvOO+/mPcGyLLaBYCc0Q48evPe71diHfWsAHEkXT4NVUnQwrbyyQ+1NtvMqULKTawaaoceBuKjIFNsKI/NPwLTZTMb/S1ABcCkeRqbAY9frEHA9xdJAM/QMEAUQPRIA9x1Hg5jZTN6uGWiGrgL51S530AfQmJcd12YzGV1NkOd3SEu4FA/A5bzsUBdXETRDjwJdh6ZyK1XMAtTuzkpBvzsTCctEQjJBv3vRk3AzH5wNA6Cwsi4Mx5P0cDxRO/1vFK+L0K5EWJUqgmboa0/RmlnMno+Rvk6QlH28e4cO/kv0RNtJzD6FTcUABREozyNjTaaI7fNNxb16LvAgtlLFAZAFmPb9+MTTTcQski/faqx68xJoX8VkaSNxo54LJACEbb/zDzkiZRBD3W01AAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC/0lEQVR4nOWXv2tTURTHP+9XfpOkjUJAwag4VWskZG/JIsHB/ge6udm6xQ5tpm7Woas0dC7YoWRLCLoZou0kDS2JYFHU2tBqi80vh+Y98+OludEHHTwQyLk5734/99xz7n2Rms0m52nyuaoDkmjgzReP3q3f2AlfcjZEwpNaNDMvEiiUgUg68UD1ucJPN9wi4QBz1XwsZAlAJJ3wA4uKy86bPZU3e6ooxLIlAMA04AdQXHaebgpnYaKaj93/J4BIOhEC5nRfcdvZPZJZKdlFIZar+Zj/rwGAxY5g16nwUtHJYVWofv20LWAogEg6MQHcbx9TWgCHVYmlolMEAGC6mo+Fhwaga/UAqveP6ErJzu6x8DHSM9eZAJF04gEQNn3Arhnfh2jLiWo+Ni0EoLddv5n0bQCGaUk4PRv8AwFoaztTAHdHByRbHxHzY7KwjlJutV3prFlqB8f8fP8RoAJcfX9vn9YzfkGQSS2ayelOdwb6pl63tgzMbCdXK1o0UwFmBMV7NAwAs7YzM0mRkVRlYzu5mtLHtGgmBWwIAoSr+dh8D0A32VnmjVzrWfH6628z2fw+m8UffN47GTTFY/2yksBoO6HLA1grxBemzH54+ez2S9qyGAzYCAbsBHwaTkdPva9p0cyU1Gq7YYroaiG+UO4DEKJPEXvdKsELNoIBG1630b6TMgParsuS/cQBpp5slunTlgc/axQ/HPHqbQV9q3a//FqWIumE0Eth7dsJWj6OVLcZY5prFMfIFUF2UyvLQG5QVLPRRN66ZbU4QFIGHg6Kqn9UUfevWy1ezs56UnJrT5/3i2rW6ijbtw3f5rlohTi0akVucypmUfUdP8pREADHyBXsvstWiOeys56UAVCIL1Qwqd7G8Qla+Y4hrrlGrRCnXav7MioBId2vFy6jfRq3WjyXnfVM6k738WQUZO17De3rGM7ANSvFoSvTHQCF+EIOyDUbTZStcdyjY6gOn5XiqeysJ9cXoGUPG5+deJW7yJrwi6eo9dSZ9N//O/4NTWDlY8KWUWQAAAAASUVORK5CYII=","dvFav2017":"data:image/x-icon;base64,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","dvFav2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADBklEQVR4AWIgFYwC8QYrHYkGCwcAbeUAZFcMQNHMdG3btlmu7fe3tm3btu32o7Zt27ZtpslMs3z5yerOnPF758ZimA6KdAEVleCVgofX3OQ9SASVcXSt/la4D1iUqzxqUWONEJlwC/HbZmRVqlwyyQv+2q2COVS+o5dKeiE5xPguTPspJrcZEg7vbtH6hgtgfu+uVK9c5KGKXAsk/oSABIdxUcUK9JrjTEZPeAT3AY2yj14mLCJiQsDSTGg5JF/uNjwEvtmuQcT57FEZVCZ5kCwnAgvFcJ0an1dg8TKLP1gowrdv+zQcSj/9MuEYrUCwNOe79fAqsMZYf/hjlwqtAPy5W1VaSrmkHk1O8F2Qeun2Zu0bREZll0rVEsm9Fbk6IXLhEZYwWIcEpxCQwSm4D6jwj14qGcYh/xakyHXBo2PIyVI045JHSLMc8M9ZBdD+GEW+wevMUeIZ3AcMACshshwpx+if4WUi36Af2+AdzyyxR2WUcrlUEsUhh8FyoREoEnzmOWbh1/d96i7i9/2+KBX083McBU4BkeBbD99+HCU2UUaf04xn9PhyApSg+78WQ06OZSIomIB1WQZo7V8xC0iFZYAR/BJy7IVrhY4lXlOeYxe+PMcGMPJzp2oI5yxEARKXwQsGuwxd+Mp58DIoyrAFT0PHb1wTM+LzIh6WD+2/6WN3h6cfOjvBYnRx+vmxp/3ddz2cGwMSi5aXUi1bXYQ07Npdg+jHPxCQh6Shb97fS4yGL2NDqTxPCPEBeRm8TwWJrtEKhPR7wS0nTG457w9N/io2dBcoGsvW5xPF5C4db4pLGCQOf/fnYnqWWIFfZPTFgoTbCsqtWl2CVQa9pYsYdO+yq/jo40JmAVps2l52QeJfpIBnt3tsEYO9klYFC7x7FxWg/D2wanVhHJZbt7kMawz/+KOsBWr1v/P1WVzE/wIh7QArpm2v6Fi2unQoqM/zx9wiBvOaTXr0MjZsFYyK+jdY4UPYEY4tn6qcWr5sdmz7sp8S7NT6eX147b0csOWDEYwCAJuJN71tqVZWAAAAAElFTkSuQmCC","dvIcon2014":"data:image/png;base64,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","dvIcon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAERUlEQVR4Ae2WA5BcSxiFuyrLZ79lbCfD52XMwVNs27ZtG6vYySK2bZuLyax3O/3HGVz8o2BO1VdcfKer76kmzjjjjGUpFqn9wm/Y7/29+itPMnQMysXP/RXxjKOVxhdvS7cSF4fLS8NUO4vMrHge5MSwf+XXFzJiXKIcWkIarl7JoJIwdZbf0N8Fy9ccV4wy+RdEu4xziLwsTBMM8q8oPqeKIHm/AQp6Zs0XWSD/koy0zW6F7SofsDXAhUmfBPG3yTXqL94CnabnA2lDNtr56miagbAhpRdWp94DzMsXHCyl9zd6gLAx0S7l7SJfemWNb5hsPAibosCEELMFpi/wBVmTZEbnuGiXD5pJTgJRc0iWqKjPoN+M5H8bUZqmRLuCLBedbCovWaouzCQzQJSLItMqGBWIjvoeBPmIp1uJly1PPxoE+ZCEq7P9h72Z1X/GFwE5QWTG5Jhlm9MPU1UGOaGUmFc19dVsXl/vmQpyAslI3+Ja2hazeRHExJB3bGD88Lm57oOYSHZa+fQ13cTKA5Iw1cnUaBdMAbhK/1hFXhap9eKYTW7CVI0yYl0GIQtcpVuJh+UFwlWzEPLAUbh6TOILJnQXU4KV72WRvDxMLUXKU0mk9nfyMuw0a4EQghS6lfgRbOCpjCugCiMGYTJ7MSXSY1wXIV+bqn+Qp5+iDKuRmxgkPdpVCUIY4HfFzea8+h7SCPVNTAH2zB5EzAROE1nioLirE6Hqh5GH0lCemAk8E5iMDrlK9QTJKxar/OAaoE4/XFOL8ASWBYQQ3IVFI3yBDxAnr95LBAS2HTYeOavDCFdg+rCzCZNLBIa9/dXYWU3d6p6f67V5ECEPr895RGSYzFZkiZXWnk0dPDeIyMCLE16eVptVaYRmI6YAPPQILnCVpmEKwO8RwxQbN3hd4VEjbxYcPjGr0PCJlJvxaYXHjLhacvLguKChjwYFDdH3w1Bj+M0R9yYU2q0f4X1ZN8A/Lam/P+VCN8g3/ukor7P60T/PMSrg3ezEVgYVwy99H18JGvKUWkLftquuPgiWUZHMMy7Q/EQzMfL52l0EAYsJGZKUdbSqWlSB+yHy8kYFcte/6uHV9MRFIfI+zU7S3/o9yQYBa9ChY5yIAvKdxFy8mp6sLKRA0U7XOIRwRGtbCimQ8SBUVppwBK5SNJe8b4tTNGBQktUL/N/rPL0bouQrMIvw5efmx4sz0QxzBcr0uMMjg2dug1Fc8vEPAmReREjYtzDJlHyu1mdp4BCdzQpUHXCPXq4QYrLAw2BZJyI0uesf/YYJxxsWUPR5KEIIx+BWEcYFQuQXaUCAC+EO96wWaH8JJYSY1ewD1f/jn03e9N/q4t3s+FGQ92l+kv4xIDENIYSiWbcD+rcKrCXY/NjytBcrcLZk11sPcDJ4ltfqFQ+b/yCg2BfgYlGJgMG6xeyPptivgF73b58rEzjkP5Y444wzzwBU1GHMLo7wbgAAAABJRU5ErkJggg==","dv":{"mt":{"document":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiUlEQVR4AWNw6PiW79T65T0Q/ycZt30pYAAxKMDvKTXgP4oBhYu//19w6Cc+DFKD0wCwAgIApAa3AWlzvv3v3PQDHwarQdZD3TCYuvvn/xfv/+HDIDV4DNj18//zD//wYZAair1AciCiRx3p0Xj+4R+KEhLIFciaqB8G7ykzoOVLAXmaP78H6QUAWXHvS4c1KsgAAAAASUVORK5CYII=","spreadsheet":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAjklEQVQ4y2Pgmx+Vzz838j3/3Ij/pGK+uZEFDNg0667M/e+9tfG/3OIkAoZEvmfAJrH01oH/IAAyiJArBokBNuvL/y+9fQCOH35+BTZgy8PTKOLIGGY42ABQgJEKvLc2oXoBZCIMb3lwGq4IWRwZw2JokATiqAGYmQmUsGDxTNAAgdnhBeRkZZDFArMjCwA+4lDxL9arHQAAAABJRU5ErkJggg==","presentation":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAUElEQVR4AWP4tpUh/8sWhvdA/J8MXMAAYlCA31NqwH/qGPB1r8L/nzcbSMLfgHrgBnw/7vCfRADWQ7kBowZQLxoHPiW+p9SAAnI0foZYXAAAgsoZPYZLeQMAAAAASUVORK5CYII=","form":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoElEQVR4AWMoVd+TX6a+532Z+u7/pOMdBQwgBgX4PaUG/EcxYEbsmf+7Jt/93x9w4v/KiqsgNjoGqcFpAFgBEIA13z357j8WAFKD24AJ/sfBmtudDoNsArHRMVgNsh7qhsGm1pv/3z35/n9h9sX/V3a/BLHRMUgNcQacXveMeAPIwIQDcWHWBVyBSHE0UpyQqB8G7ykyoER9dwG5ORGICwDFNZ39XLvMXwAAAABJRU5ErkJggg==","drawing":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAp0lEQVR4AWO4ZaCef9NA9T0Q/ycV3zBQL2AAMSjA7zEMeJwc8//N9En/n9eW/7/r5UDQEGQDwBqRwa+nT/4/CPclZADCZmzg6+kThAxA2I4L3LY1ImzAq65WrJr/fvpIlAuAthgDFX/CMODd0vnEB+I9YKj/uHENpA9s2JsZWL0FjiFMAxAY2c8kGoDAw8mA53Vl6BgliTOQmRMRBtwwUCkgNyeC9AIANZyb2ubsZkMAAAAASUVORK5CYII=","pdf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4y2P4//8/AyUYK/jtoz8fiN8DsQEDDkDIgPNQ7ECuAfeB+D8lBqwHGcCABxAyoAEUBpQYsB7qhQCSDQBqUoBqXg8NCwFSDQA5/z5abAgQZQBIITT+E6DsAKhrQGL7kXABLgMakJwP0zQfKWHdh7roP4YBsJCH0gY4AtcB6roAuAFQp56H2cxAJEA2ABZQ73GFOCED/hPKOHgNoDQ7AwBumz3O3xjXtQAAAABJRU5ErkJggg==","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAl0lEQVR4AWO4ZaCef9NA9T0Q/ycV3zBQL2AAMSjA7yk14D+9DBg14J6Xw//3S+YTZ8Dj5Jj/d70cUDT/fvrkPwg8ry3DZwBC8fcb1/7ftjUCi33Zt/s/DPz99BFkOG4DfgA1wsCHjWv/v5k+6T8agBmOYQBCMWEADQ+EAUATjf8/rysjBYNcATfgPUXReMNApYDcnAjSCwBJsmdF1uQl/gAAAABJRU5ErkJggg==","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZUlEQVR4AWMYeHDbQK3+poHq/+d1Zf9B4O+nj/9v2xoR5AP1gDEDiIDh30+fgBW9mT6JEB/TALJcgTAAgR+nRIMwSAEhPsIAMvGgMmDUgPcUGPAeaIBywC0Dlf3k4OsGqgkUZ0YAwtfo3VASQvEAAAAASUVORK5CYII=","audio":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA5UlEQVR4AWO4ZaCef9NA9T0Q/ycV3zBQL2AAMSjA73EacNvW6P/TgkwwvuvlgNMQDAPuARV/PX3iPzr4uHEtVoMY0DX/fvoErOEb0JA30yeB8Y8b18Fiv4ByCEMwDQDbAgJvZkxCtwksBgQg16EbgLAdCIC2XcPlX5jXQOGDacDTgiyQHMjJuAwAywEBUG0GpgHP68qJNuB5bTlWA+Ch/Tg5BtmZIDZIDCRHyAAEeJwSDVME1gwFNDTgUUo0sQZgBiI8JgozgS4pA2GUBHPb1hgmDjMYYQCZORFhwA0DlQJycyJILwD2S5GJyNwkVQAAAABJRU5ErkJggg==","word":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA+ElEQVR4AWLw6XiW793+5D0Q/ycVe7Y9KWAAsEqVWggFQfQv6dDpdDokHCIJl/YaLo2Gu7s7y7vI4M6cszvuA+KH1/01AKMAAlmFGb19JjbUSSlzd5jU3CJeqKzubEQ8vhsAoOW6pKz3VqzGvyOv5XowuV8BXiw/Y1xsTNmOIFLWdrJgYgqbxwHs0SFlRPnp+oJ/S6oKNGweBpCa2wwgkFeQDcZ4qIpaxEweBjg3Qv8SY3P3RtM1MAV/FIDKREbAMehotuErmqCl+2u8ngPgfFigAdC9CoDh0Tqv1ofWXgZAydfHguO6ltH7yyl3fwuwHTBLkpsTQXoBsdvoQReZL9oAAAAASUVORK5CYII=","excel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUOn1oPnVkPnVgOnVlau4yHzqseo2ItqW1pwZfw+fWW1Lal2sD///88r3iHzqzS7ODD5tXD59Xh8+pLtYI8r3dpwpYQm1cQm1kuRwGdAAAAGHRSTlNv7/9w////////////////////////cHBsC8XEAAAAYElEQVR4AVzIQRJEQBREwfbGV4MCcP+rirBo3XKZKTWUfola8w2eaKMDxT+H+gFGKwfhSZ55g2Xddso4bFUh+6hi39aljLBOxxvyCEOvHFcIumhzwD0kpzOiC4ihelYcAPk0A+QUWRDnAAAAAElFTkSuQmCC","powerpoint":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVR4AWP4X+qQ/7fE8f3fUsf/JOMyhwIGEIMC/J5SA/5jGjC94P+/XQsQeNOU/38X1BJtAFgTGNw9D8FPb0P4757//1vrS7QBqGKH14DF/m2cQp4Bf/tTQUIgOTIMqPWFi/1b0UG0AZjgznnSAvHf9AIEbosgPRbQxOllACIhEW0A5UkZlBMpMuBXiUMBuTkRpBcA2M3XNTYmHEwAAAAASUVORK5CYII=","archive":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAOklEQVQ4jWNgGH6guLj4Py5MHwMoBsPDC+dxuOA8sQYIYDEExBcgxRUKQPweqhlEG5DjFQOyNQ8tAAAXFG8XqmcJnQAAAABJRU5ErkJggg==","text":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAkklEQVR4AWOAAamSl/VSxS/+48RFL+sZ8AF8mhPnv4cbQpYBx+78/N+78zPcELIMAAIUQ8gxAMUQyaIXBUQbULfh0/+Vp77BsWvv2/+SxS/2YxhAAqadAQg/YwKw8wkbgPAzBi5Y/pFOXph16CvIG+gYFoWEDZh9ELsB9Rs+wdQMymgsed5AvAEv30sWPw0A6QMAtygMBvoVA3UAAAAASUVORK5CYII=","folder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAMElEQVQoz2Po7+8/A8T/ceDNQMyADzPg0UyUIcQYgA+fodSA/6MGjBoAM+AMJSkRAEsGG4pVhgimAAAAAElFTkSuQmCC","sharedfolder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAMElEQVQoz2Po7+8/A8T/ceDNQMyADzPg0UyUIcQYgA+fodSA/6MGjBoAM+AMJSkRAEsGG4pVhgimAAAAAElFTkSuQmCC","generic":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAa0lEQVR4AWOAAamSl/VSxS/+48RFL+sZ8AF8mhPnv4cbQpYBx+78/N+78zPcELIMAAIUQ8gxAMUQyaIXBUQbULfh0/+Vp77BsWvv2/+SxS/2YxhAAsZhwKgBowaUPG8g3oCX7yWLnwaA9AEAaontjwxMAIoAAAAASUVORK5CYII=","sites":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcklEQVR4AWPwi9uV7xu7+71v7K7/pOMdBQwgBgX4PaUG/IcbkFd9/P+ydXeIwSC1mAb0z7ryn1gwAaiW+gYkFx7+X9V2migckb4f1QDyMWEvgORAtqJ7YfgYQDghwWIIPSFRNxbeU2jAjgJyc6J39I4CAEau0IvammGMAAAAAElFTkSuQmCC","map":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAP1BMVEXqkor++/r0x8PbRTjngnndUET53tz42NXkc2nzwr7mfHPjb2XcSDv99/beVkrupp/hZFrngXjngHf////bRDcIoZ1jAAAAWElEQVQYV13IRxbAIAhFUey9JLD/taaYg9E3gX/hoCUNtDWghlJCnZAt3tnMEPEtMsAAYPADPINyz3aKgbpAFJ0mUENs9AcjhFmApKQVgJ/vprQBB+e69QWDaBH4RqqHkwAAAABJRU5ErkJggg==","script":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVR4AWOQLH6VL1388r1U8Yv/pGLJohcFDDDNZGGgXgYQgxKM1wCN6leUGXD0zs//5i2vyTfg8bs//x+9/QMyBL8Brr1v/h8D2oaOoQBmCG4Dgqe9/Y8XIAyhwIB3YANI88LHb/+QNZMZiAjNpBtwDBKNdEhIlGBwZqLIAMmiZwXk5kTJkhcFALZ/q6e35S1kAAAAAElFTkSuQmCC"},"dl07":{"document":"data:image/gif;base64,R0lGODlhEAAQAPUAAP////7+//v9//z9//n8//n7//f6//T5//T4//L4//X29vD2/+71/+31//Hz9uvz/+v0/+jy/+bx/+3v897t9ubo69vk7trh6cjf7MLV6sTO28LM2b7N3a3O5MLJz66/1a+5xI+716OwxJyqu3Oqy1yl0Iqarliaw0WQvUGLvGR8mlFriwBmpv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC0ALAAAAAAQABAAAAZ/wJZmSByKWsikEMBsOj4jJVLTbE4sGZOUWgUoLhzVSsntVjygcbLcZaqnXZZ8Loc35ZhOiHRC1csFLBghJYUlKSksQgMDBgYsHSVdiUKOBgsshIaFlBoJCQ0NLCSSTRSdDAwRESwnm5yKGiuzKiwoKU2HlFJyiL6JilItdHQtQQA7","spreadsheet":"data:image/gif;base64,R0lGODlhEAAQAPQAAP////7+//7///z+//v9//z9//r8//n8//f7//j7//X5//P4//T4//D2/9nuxcTlqr7kn7HdjpvUbZDNVKS3zoHNRH/HRHrHPIqarmimK2R8mlFri////wAAAAAAAAAAACH5BAEHABwALAAAAAAQABAAAAVvICaOJMlxGKBSKsC225mu7avGKKXvvI7PrloL8BPSVIZfj5JpOpsoYdPxiEgmliaQMsg4IJVwBXDJYHqZhzhMNhPeFEYmIgaMyxiEntLISOp3ZhuDGxoZE2OJbSeMHBkWioGNJ00XlpdQk45PThwhADs=","presentation":"data:image/gif;base64,R0lGODlhEAAQAPUAAP////7+/vz9//r8//f7//n7/vX5//P4//L4//D3//D2//X2+Ovz/+ny/+/x9ebx/+jr8N/k6tvj7dbg7fLUxdHY4cTO27vO6O29pOWmgd6OY4iaseeARn2QqXmPqXeMp9d5RXSIo9NrM9RnLGR8mlFrjGdnZ71WG1Fri2ZnZ2ZmZ2VmZ2NlZ2RlZ////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC4ALAAAAAAQABAAAAaKQFfFQiwaLR2X0LIIOJ9PSGjjsjgAgAt2qwVEStWteAwAW7CmtFo9GJjR67XB8AasT/g8PmxP4ykYGRogInhnfSYngByMHCMjJ4crkycYjACNkBYFnAgIJxmXmI6REgcHFwwnGqKYmh8TDLInIKKMkC4eKLskJyIjHKOPJ0rFLniPyZDExkp6ei5BADs=","pdf":"data:image/gif;base64,R0lGODlhEAAQANUAAP/////9/fz9//r8/vj7//b6//P5//T5/+71/+z1/+/0/efx/ebw+uvt9+js+eHt/ePt+/fl6dvp/uHm+NTl/Nvj9u7f6NLi+//Y2Orc6M7h/NPe7Mfd/MDY+/3IydfR57vV/MTO2/+0tPqcnfmbnfebn6OwxNygofSZnpyqu+eSnvSMjf+KioqarvxhYe5UVVFri/cjJvYSFfsICacCA6cBAosCBIsBA////wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHADgALAAAAAAQABAAAAaTQFxoSCSacMhkCMBsAjaIVBK5dDI3BUQreXp5vbLYE5Dd4sCy9Mz23LhhyFdaPaMBDocEA46T3f43NYIGBnoPfEJOKxF5DA8SiFVMLiwKC48UkQKbHiIYLhkTFRqRBKYjIiwsLjIuKpF4ES4WEBIUFB8nkQOyDZgaHB0gkSQvIr/BIMNKJSUOtsDCypEw1dbX1UhBADs=","folder":"data:image/gif;base64,R0lGODlhEAAQAPYAAIJKDt3Ej96aPJ17WfvamLaeh62CSvDZopVtQb6bacuGLZtsO87Ct+e4btK3hfHVl7eQWv7vvLJsGe7EfMezoMWWUuirUqVhE7CUe6+LXMyqdMq8sP/qsb2toNvSy9ioXv/3xbJ7NaBiHtWQNb6SUt69jO7NjPbdopt0Sey/dP3lrKRpJKiIZ/fcnsiodaWCWOemSNvKmdGSPdLJwuK7eOeyYbukj6yFU/nkq+/VmreVYeq7b+OUK8Krlv//zMV3F6N2QfbOiKCBYe/erPHLhf/2v6peCt29gsiqd5d0TffercijadaHIuavXKuOcK+JUqF7Tf/vtMSzpd7GkqaHYvTVlvbZnfG8aL+XXLWUe++9e6qJYb6nkoROFe7cps/FvO/GgL2wo71/MuCYNKNtLerRnNPLw/fOlMise////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAGkALAAAAAAQABAAAAfBgGmCg4SFgl82TgNmhoQeNzFDXkkdBSwvGU89g0JDPiAgUy5TBypRDxSDWyARrUVFHDlHSwYILwlAW1FROCUaEE83OkgBJyotUFQ4OAY6aFNDrRHHBCRhQi1HOp8gvCdVVUQNKGkYJlgO08dVJmApVyEMaTY0BmU4VuETOzUWI+RpuFQw0OIMkRQNmsAQwOPCDEEUyGAJglDhGCY/jAwYtKHLhysWBCiQIGIBBimFAMgQs8IkykZpEAiR4gGmzZuBAAA7","sharedfolder":"data:image/gif;base64,R0lGODlhEAAQAPYAAIJKDt3Ej96aPJ17WfvamLaeh62CSvDZopVtQb6bacuGLZtsO87Ct+e4btK3hfHVl7eQWv7vvLJsGe7EfMezoMWWUuirUqVhE7CUe6+LXMyqdMq8sP/qsb2toNvSy9ioXv/3xbJ7NaBiHtWQNb6SUt69jO7NjPbdopt0Sey/dP3lrKRpJKiIZ/fcnsiodaWCWOemSNvKmdGSPdLJwuK7eOeyYbukj6yFU/nkq+/VmreVYeq7b+OUK8Krlv//zMV3F6N2QfbOiKCBYe/erPHLhf/2v6peCt29gsiqd5d0TffercijadaHIuavXKuOcK+JUqF7Tf/vtMSzpd7GkqaHYvTVlvbZnfG8aL+XXLWUe++9e6qJYb6nkoROFe7cps/FvO/GgL2wo71/MuCYNKNtLerRnNPLw/fOlMise////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAGkALAAAAAAQABAAAAfBgGmCg4SFgl82TgNmhoQeNzFDXkkdBSwvGU89g0JDPiAgUy5TBypRDxSDWyARrUVFHDlHSwYILwlAW1FROCUaEE83OkgBJyotUFQ4OAY6aFNDrRHHBCRhQi1HOp8gvCdVVUQNKGkYJlgO08dVJmApVyEMaTY0BmU4VuETOzUWI+RpuFQw0OIMkRQNmsAQwOPCDEEUyGAJglDhGCY/jAwYtKHLhysWBCiQIGIBBimFAMgQs8IkykZpEAiR4gGmzZuBAAA7","generic":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////z9//b6//H4/+71/+jz/+Dt/9fo/8/j/9Pe7Mfe/77Y/7XT/8TO263O/6XJ/6OwxJyqu4qarlFri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABQALAAAAAAQABAAAAVaINWMJAlRaNoAbAskRJSiq8smAiHNtZ0AuR3NdksYJyoia1AwIIdEpuHwFEWbB0S1t8QiFFuXNKtYhLvT74JxHqsZjm3AXYY/tvS143FXeet7fFsThIWGhCghADs=","image":"data:image/gif;base64,R0lGODlhEAAQAOYAAClWlMXR4ru7u2ah2X2750x4qZrR83K15f///3iVxEJnlWyErJu70pazzYifxDpppbPQ4GOn326RuYC25Ky90bng90FxrjZclV18pnyVt5fC4XOUw67W8JGpxanI6kttnLrT6meq4M7Z6Xq04lh6q4OixTBZlnKLsEBroY+z1KPU87XQ7GGCr4O75qfD1LHC10BgjoSevVV2oFB7tJ2vzE11rX2axDNcm5/S8c3f7UholHKs3nu45m2Qvkdup2iHtqrX9ClZkJy1zm+n27vc9ZKuzL7Z8Fh9snOMtUpzs////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAEoALAAAAAAQABAAAAeUgEqCg4SFSgKIiYqLiAiOj5CQjQSUExMtLSM7O0MDCI0HBzyjB5ShIRGfAggVKjgGQERGHBwaIyOqCCsgHjkiAS82KRAuDLkbyDQJJQ4/JxkMxo1FGzYUND0WBQsLMQ25R0cSHRJJMzUfGCcYuQ8PJCwPPj4oOjoyOrlBJiYAN/8XYNhTkCuSQUeMEioyxLChQ0GBAAA7","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABuklEQVR42pWSvUuCYRDARWipwSwQGvrAoYKiEO1j0CFoChwcLEoaohxaJBqSoKko/CtCBYUiKmyQcHMQIpegIQQ1GhoVHFocfnnv9fEmRXXwcHcPd7/7eB4Lb2KxWL7ov4oRXS6XjcRYLGZo8f8FEIlGo0ZyMBikVqvhdDoNX/R7Z8ViEbvd/j1Akt6DRCRR7iQhl8v9DjBX+QkgI/4J8N0Ibrfb8NuX/L+V/7jEiwsYHoaeXhgakHIwPQ2zszDY8icmYGkJYkeQz8PdHZyemgB9ffDw8IkdGYHubpkJGg2YnFRbigy0gCcnsLNjAkjFjg5NXljQ4/fD1BRUKpDJwMxMq8MeSKdhbAx8PhPA4wGrFV5etPrzMxwfw/U1JBJQr6sdj8PTE1SrGv+lg64uaDbVLhTg8BCSSTg7g1BIdTYLpZJ8XbDZ2gCdnXx0c3sL29uQSsHlJayvw9UV3NzoMnd35aOYAF7vJ0Bg9/dqC0BaFzk/h709tR8fweEwAVZXYXwc5uZgdFSfb35en8/lgkBAbWk7HIb+flhZaftIBwewuQmRCKytwfKyBslZXISNDdja0nH29z/SXgHZZBpn8gkfIAAAAABJRU5ErkJggg==","form":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABnAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAS5JREFUeJzFkr9PwkAYhp9ri1E3XYwbTGqYZGBzNODqSGQ1rCwuRgZH/gLSGRgZRcMoM04MOtgF0gChhzHSFoc6tfyuJpr4JZe73N3zfu+9OfjvEv6iXG95P4UuzhIBpxX1mnd1eS4AUsno3EVFUYhoGqqqAILtrU0q909/6+DXFeqgKbOhcCnTFsLPoFxvebMZ3DycAJBP6wzsLkOnQ982+HBN5OeI3qsZ7qAps+TTOt3xC4+9ylxnVUQYu+9YhkTzNxeDyVXj3sDuLsEA18d33LZOAaYCqxwMnc4SXEg0AHAnDgBKUa8FYCoZDQZA3zYoJBoB5M9+928zODw44o1RAC7C5rPJ2g+Rq8a9vdg+ysbU+izsThwsQ4YLAOzGdlaeW4acf0KYyLoqZdriC21viOQMsN0SAAAAAElFTkSuQmCC"},"dl09":{"document":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////z9//b6//H4/+71/+jz/+Dt/9fo/7vw/9Pe7MTO24nF4oO/3qOwxJyqu3at0oqarmGiyleZxDGCt1FriwBmpv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAVqoKWM5NhYaCoCbJsQjooqrSsQkEzXQALcudSuligmKKphbVAwIIW8inQqndUqiAXjEZFIJpVVq7J4eM9gMWBQYUh46R2zYj574wGmodKFhxV6BxV2aH8UhxSDbyx3YTIVE5GSkY6PVFMWIQA7","spreadsheet":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","presentation":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////7+/vr8//j7//T5//P5//H4//X2+Ovz/+jr8PnWqs/Z5cTO2/Oode2TX+mFUOd7RuJdHL1WG1Fri1hYWERERP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAV5oLUwZGkyiyUmR+C+75FMFnMAAIPvOnDQvZ1QCMRVjkikQFAEVCjQKJRAaD6hkqw2WzNiFY2G4wGBRCS9q0Rcbp/T2EYZ4EYP7gaDxDGnm9EHBQUMCBJkEDt/CywIjRJtOGVnFhOVlY9zdSqbFhIRn6CfEpybW1sWIQA7","pdf":"data:image/gif;base64,R0lGODlhEAAQANUAAP/////9/fz9//r8/vj7//b6//P5//T5/+71/+z1/+/0/efx/ebw+uvt9+js+eHt/ePt+/fl6dvp/uHm+NTl/Nvj9u7f6NLi+//Y2Orc6M7h/NPe7Mfd/MDY+/3IydfR57vV/MTO2/+0tPqcnfmbnfebn6OwxNygofSZnpyqu+eSnvSMjf+KioqarvxhYe5UVVFri/cjJvYSFfsICacCA6cBAosCBIsBA////wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHADgALAAAAAAQABAAAAaTQFxoSCSacMhkCMBsAjaIVBK5dDI3BUQreXp5vbLYE5Dd4sCy9Mz23LhhyFdaPaMBDocEA46T3f43NYIGBnoPfEJOKxF5DA8SiFVMLiwKC48UkQKbHiIYLhkTFRqRBKYjIiwsLjIuKpF4ES4WEBIUFB8nkQOyDZgaHB0gkSQvIr/BIMNKJSUOtsDCypEw1dbX1UhBADs=","folder":"data:image/gif;base64,R0lGODlhEAAQAMQdAP/ddP/std6+fdq1bf/xy//xyf/01f/11v/00v/hjf/wxP/yzv/yzf/11f/z0P/xx//xxf/z0f/01P/ggv/ijf/ggf/bcP/YYf/ll//deP/ZaP/ootatXP///wAAAAAAACH5BAEAAB0ALAAAAAAQABAAAAVZYCeOZCkKXJoK5jgEMDy0HQrct6pzHXc0Bgki4lgwCIUHRJHaOJ9QaApDrVqtKYp2y9UmKKmKeDwZm1OZtHq9Tlne8Hg8panb7/fUZc/v9zkoO4IrNIWGJSEAOw==","sharedfolder":"data:image/gif;base64,R0lGODlhEAAQANU6AP/YYf/ddP/stejs8625zm6FtO7w996+fU5qo0tmnOTo71t1qlZwp83V4qW0ykNbjHSKt5enwtq1bbO/0mF6rdPZ5LvH3J2sxOTn7nCHtf/01f/z0fL1+f/xx7zF09Ta5f/00v/xxZKivP/yztze4//11khiljdKcjpPev/wxP/11f/01LbE1dzf6//z0Nzh7cPN2z5Ugv/ll//ijf/ggf/ZaP/deP/oov/bcNatXP///wAAAAAAAAAAAAAAAAAAACH5BAEAADoALAAAAAAQABAAAAacQJ1wSCwKD7lk8mAcSgRQqKSpQwauV6U2p8uVVJoVaOMaQQqUTiiVvLnft4xhYGC4k7K8HjLgzF8IMkkzhIVyAwoYGAkzSTSPkAWICh8VJjRJNpqbNgstJBUJmkk4paalCwwMpkk1rq8FCw0wMAgINUkAuroFDbMeEwQECDlISgW0MCzCDhcRD0UUFhbBDs0RIjFFCQ8x3t7dKCdBADs=","generic":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////z9//b6//H4/+71/+jz/+Dt/9fo/8/j/9Pe7Mfe/77Y/7XT/8TO263O/6XJ/6OwxJyqu4qarlFri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABQALAAAAAAQABAAAAVaINWMJAlRaNoAbAskRJSiq8smAiHNtZ0AuR3NdksYJyoia1AwIIdEpuHwFEWbB0S1t8QiFFuXNKtYhLvT74JxHqsZjm3AXYY/tvS143FXeet7fFsThIWGhCghADs=","image":"data:image/gif;base64,R0lGODlhEAAQAOYAAClWlMXR4ru7u2ah2X2750x4qZrR83K15f///3iVxEJnlWyErJu70pazzYifxDpppbPQ4GOn326RuYC25Ky90bng90FxrjZclV18pnyVt5fC4XOUw67W8JGpxanI6kttnLrT6meq4M7Z6Xq04lh6q4OixTBZlnKLsEBroY+z1KPU87XQ7GGCr4O75qfD1LHC10BgjoSevVV2oFB7tJ2vzE11rX2axDNcm5/S8c3f7UholHKs3nu45m2Qvkdup2iHtqrX9ClZkJy1zm+n27vc9ZKuzL7Z8Fh9snOMtUpzs////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAEoALAAAAAAQABAAAAeUgEqCg4SFSgKIiYqLiAiOj5CQjQSUExMtLSM7O0MDCI0HBzyjB5ShIRGfAggVKjgGQERGHBwaIyOqCCsgHjkiAS82KRAuDLkbyDQJJQ4/JxkMxo1FGzYUND0WBQsLMQ25R0cSHRJJMzUfGCcYuQ8PJCwPPj4oOjoyOrlBJiYAN/8XYNhTkCuSQUeMEioyxLChQ0GBAAA7","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABuklEQVR42pWSvUuCYRDARWipwSwQGvrAoYKiEO1j0CFoChwcLEoaohxaJBqSoKko/CtCBYUiKmyQcHMQIpegIQQ1GhoVHFocfnnv9fEmRXXwcHcPd7/7eB4Lb2KxWL7ov4oRXS6XjcRYLGZo8f8FEIlGo0ZyMBikVqvhdDoNX/R7Z8ViEbvd/j1Akt6DRCRR7iQhl8v9DjBX+QkgI/4J8N0Ibrfb8NuX/L+V/7jEiwsYHoaeXhgakHIwPQ2zszDY8icmYGkJYkeQz8PdHZyemgB9ffDw8IkdGYHubpkJGg2YnFRbigy0gCcnsLNjAkjFjg5NXljQ4/fD1BRUKpDJwMxMq8MeSKdhbAx8PhPA4wGrFV5etPrzMxwfw/U1JBJQr6sdj8PTE1SrGv+lg64uaDbVLhTg8BCSSTg7g1BIdTYLpZJ8XbDZ2gCdnXx0c3sL29uQSsHlJayvw9UV3NzoMnd35aOYAF7vJ0Bg9/dqC0BaFzk/h709tR8fweEwAVZXYXwc5uZgdFSfb35en8/lgkBAbWk7HIb+flhZaftIBwewuQmRCKytwfKyBslZXISNDdja0nH29z/SXgHZZBpn8gkfIAAAAABJRU5ErkJggg==","word":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKJQTFRFx938/P3/wNj77vX/5vD69Pn/OWvO7PX/ipqu5/H99vr/M2bRM2atM2aiM2aWM2bDM2bPeZzAOWrOM2a4nbnWxtfrTnnQV4GnOGqcM2aUOWucjKbB8/n//v7+M2aXWILXOWqYo7DEOWvRM2aVVICr+vz+U33PsMTrnKq7rsLru9X8zuH81OX8097s4e392+n+xM7bUWuLM2aZM2bM////AAAARI6QQQAAADZ0Uk5T//////////////////////////////////////////////////////////////////////8AoY9OMQAAAJhJREFUeNpcztkWgiAUhWEI0Cwtm+dsHqxQOfD+r9YBbNxrcfF/61xAjDHla1sMYkH7PdjlD1qs+Qsa5Q0rBFz1uaBULENeEQA46SDQdDdXIZd4AVCeAeh1oHpcFh5ShHSmIlncHYwTgCxRI+ybg+4E3/pgm1hodwQ+5bphIV4cIVZD17mFfSn6m6nv3H+MRbLuGqqvPQUYAB9vJ9N3EbvMAAAAAElFTkSuQmCC","excel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5QTFRF1OX8zuH82+n+wNj7x9385/H98/n/7PX/5vD69vr/ipqu/v7+o7DE+vz+nKq7u9X89Pn/4e397vX/097sxM7bUWuLcbdsMm8M////AAAAQqobMQAAABp0Uk5T/////////////////////////////////wAUIgDaAAAAc0lEQVR42lzM2RZAMBAD0LHvWqWl//+jkg4O8pY7i8QYtzsjihAOzermH3Su/8IBeWAAIF52BD0gtm5aLzEJe42+AJJwbtFzgspkXbXkkiBQtGcErF9XkpUA/lNBL7yE8Ai6ST823lMKc4H+w/wG/8opwAC45hMxbjBWwwAAAABJRU5ErkJggg==","powerpoint":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhQTFRF6fL/4+7/4u7/+Pv/9Pj/0OP/6PH/3Ov/y+D/3er/ipqu+fv/1ub/xd3//P3/9/r/1+f/7/X/8/j/o7DE3Or/1uf/7/b/yuD/6PL//P7/wNr/8/n/0eP/3ev/nKq77vX/vUkb/ufbkTozxM7bUWuL8KZ0////AAAAb5pE0QAAACh0Uk5T////////////////////////////////////////////////////AL6qLhgAAACLSURBVHjaXM3XFoMgEEVRELDEGtMrSpH//8PcAbOWyX07+2GGhRDsdwcEI1jSrH7/Qa93v7BACCYsAuYA0zwbH6WrRwAaQHKrpXaMmsCbTshzvgUx6jwDGBqB3DNeAPw6g36dcNSsrRmvBkVvTeorPw6qJAh0RLOsaFTZRrDiga6a56W9J3CbfQQYAB7aHkgVESipAAAAAElFTkSuQmCC","form":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABnAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAS5JREFUeJzFkr9PwkAYhp9ri1E3XYwbTGqYZGBzNODqSGQ1rCwuRgZH/gLSGRgZRcMoM04MOtgF0gChhzHSFoc6tfyuJpr4JZe73N3zfu+9OfjvEv6iXG95P4UuzhIBpxX1mnd1eS4AUsno3EVFUYhoGqqqAILtrU0q909/6+DXFeqgKbOhcCnTFsLPoFxvebMZ3DycAJBP6wzsLkOnQ982+HBN5OeI3qsZ7qAps+TTOt3xC4+9ylxnVUQYu+9YhkTzNxeDyVXj3sDuLsEA18d33LZOAaYCqxwMnc4SXEg0AHAnDgBKUa8FYCoZDQZA3zYoJBoB5M9+928zODw44o1RAC7C5rPJ2g+Rq8a9vdg+ysbU+izsThwsQ4YLAOzGdlaeW4acf0KYyLoqZdriC21viOQMsN0SAAAAAElFTkSuQmCC"},"dl10":{"document":"data:image/gif;base64,R0lGODlhEAAQAKUiAABmplFrizGCt2+GoVeZxIGWsmGiyoqarnat0pyqu5yrvaOwxIO/3onF4sTO29Pe7Lvw/9zp/+Ht/+Lu/+jx/+jy/+ny/+71/+/2//P4//T4//P5//b5//f6//j7//n7//v8//z9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAD8ALAAAAAAQABAAAAaCQIdwKFwsfsikQ8RsPi6JpLLp7FwO0t+SKHqIrArpktp9mAdiETH04WAohXQzBALY73atWugBQBoMCAYEBAIAYyEeGgANCISPhlseDhcADARkkSEOGQ4VAI6PhJEeGRcWEgCDmYcbpxMRAKKQhwG2trKYTKMAWT8AAsHCwb2+eHg/QQA7","spreadsheet":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////3+//v9//r8//j7//T5//D2/9//p63lc5naXYvSTqS3zoHNRGXCGoqarmimK1Fri////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABEALAAAAAAQABAAAAVroCOOpAhFqAOsywq065m68OvKkbPsfL/gKhbthsoNhYAB0Ld4OJ9Oo/BxQCASCgaj8Qi+Ao+rVgvg6nrhMdksaC8Kj8QYwCh3CfiF4ZEl180QgYEPfnR2RUWEdYuHiBEPDZGSkQ+OKFBQESEAOw==","presentation":"data:image/gif;base64,R0lGODlhEAAQAMQAAP////7+/vr8//j7//T5//P5//H4//X2+Ovz/+jr8PnWqs/Z5cTO2/Oode2TX+mFUOd7RuJdHL1WG1Fri1hYWERERP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHABYALAAAAAAQABAAAAV5oLUwZGkyiyUmR+C+75FMFnMAAIPvOnDQvZ1QCMRVjkikQFAEVCjQKJRAaD6hkqw2WzNiFY2G4wGBRCS9q0Rcbp/T2EYZ4EYP7gaDxDGnm9EHBQUMCBJkEDt/CywIjRJtOGVnFhOVlY9zdSqbFhIRn6CfEpybW1sWIQA7","pdf":"data:image/gif;base64,R0lGODlhEAAQANUAAP/////9/fz9//r8/vj7//b6//P5//T5/+71/+z1/+/0/efx/ebw+uvt9+js+eHt/ePt+/fl6dvp/uHm+NTl/Nvj9u7f6NLi+//Y2Orc6M7h/NPe7Mfd/MDY+/3IydfR57vV/MTO2/+0tPqcnfmbnfebn6OwxNygofSZnpyqu+eSnvSMjf+KioqarvxhYe5UVVFri/cjJvYSFfsICacCA6cBAosCBIsBA////wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHADgALAAAAAAQABAAAAaTQFxoSCSacMhkCMBsAjaIVBK5dDI3BUQreXp5vbLYE5Dd4sCy9Mz23LhhyFdaPaMBDocEA46T3f43NYIGBnoPfEJOKxF5DA8SiFVMLiwKC48UkQKbHiIYLhkTFRqRBKYjIiwsLjIuKpF4ES4WEBIUFB8nkQOyDZgaHB0gkSQvIr/BIMNKJSUOtsDCypEw1dbX1UhBADs=","folder":"data:image/gif;base64,R0lGODlhEAAQAMQdAP/ddP/std6+fdq1bf/xy//xyf/01f/11v/00v/hjf/wxP/yzv/yzf/11f/z0P/xx//xxf/z0f/01P/ggv/ijf/ggf/bcP/YYf/ll//deP/ZaP/ootatXP///wAAAAAAACH5BAEAAB0ALAAAAAAQABAAAAVZYCeOZCkKXJoK5jgEMDy0HQrct6pzHXc0Bgki4lgwCIUHRJHaOJ9QaApDrVqtKYp2y9UmKKmKeDwZm1OZtHq9Tlne8Hg8panb7/fUZc/v9zkoO4IrNIWGJSEAOw==","sharedfolder":"data:image/gif;base64,R0lGODlhEAAQANU6AP/YYf/ddP/stejs8625zm6FtO7w996+fU5qo0tmnOTo71t1qlZwp83V4qW0ykNbjHSKt5enwtq1bbO/0mF6rdPZ5LvH3J2sxOTn7nCHtf/01f/z0fL1+f/xx7zF09Ta5f/00v/xxZKivP/yztze4//11khiljdKcjpPev/wxP/11f/01LbE1dzf6//z0Nzh7cPN2z5Ugv/ll//ijf/ggf/ZaP/deP/oov/bcNatXP///wAAAAAAAAAAAAAAAAAAACH5BAEAADoALAAAAAAQABAAAAacQJ1wSCwKD7lk8mAcSgRQqKSpQwauV6U2p8uVVJoVaOMaQQqUTiiVvLnft4xhYGC4k7K8HjLgzF8IMkkzhIVyAwoYGAkzSTSPkAWICh8VJjRJNpqbNgstJBUJmkk4paalCwwMpkk1rq8FCw0wMAgINUkAuroFDbMeEwQECDlISgW0MCzCDhcRD0UUFhbBDs0RIjFFCQ8x3t7dKCdBADs=","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAThQTFRF7vX/x938wNj78/n/AIM57PX/5vD6z8/PpN3/5/H9np2cwsXHqKmqysjIruL/3vL/9Pn/Aog1ipquvry99vr/AHo1qqOl4uLi1tXUpZ6gnKq71ez31evm8fr63+2mEZM7AIQ2ra+vtq2wwL6/vd+wteLr6PP5qd/+y8rKBIs78ff7o7DEvOLDnNjp/P3/2Oh+Paw+ubGzPaaAotz40dDQvLS32evQ2djYquD3V7SI3NzcHpdUM6NG4vH52+/iNaZCNKJr//Zrtbi5H5dDpKSke8qeyMfGkNLYAIA/AHw5J5xEPqpHWLhT9Pn8QahxsqqtAIRAkpGRveb9otzy7Pf/KZxZI5o5AHQ1r931eMRm7/n/2Ozar6epvOHuu9X81OX8zuH82+n+4e39097sxM7bUWuL////AAAA4YIzxgAAAGh0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAf7P1LAAAAyklEQVR42mJIT09PgQFtIIcBJJAGAckMUmgCIgxCqAJpQBEGcXMrCXZeXjdh7rRkIEhlEPfVUrOVlomN4NYTYGZlS2WQkI0K4bdzlONzYgbyk1IZ2M2i+YNU9XU4FAWA/ESggEqkq7oxB0cwDwNnUmJ8KoOJj4G3O5+uXygPiJ+QyqBhbxNmaeEgqOAC4jOmMih7OctbG7EEeHCB+EypDMKagiwsop6i4Vwgflwqg6mhkn+MmJgkVyCIDxQAOR1sPpgPFUhFAgABBgBoTkHNkTEKJQAAAABJRU5ErkJggg==","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVQTFRFx9387vX/wNj77PX/b6j/8/n/5vD65/H9VZj/RI7//5WVO4n/9Pn/ipqu/56e9vr//0ND/21t/319o7DESZH/nKq7QIz//0hIDA0N/0xM/1FRFBQV/1VV/1RU/09PPYr//2Vl/1xc/4CADAwN/1hY/zs7/P3//0VFExMU/1JSNYX/R5D/u9X81OX8zuH82+n+4e39097sxM7bUWuLFxgY////AAAAaiuerwAAADd0Uk5T////////////////////////////////////////////////////////////////////////ABBZnYsAAACNSURBVHjaXI7ZEoIwDABTBW0B8b7v+xYwtP//aSYoTnT7tDuZNOCce5Z0SYCDfZOp/l9oqsZvsFQg/2IzAsHm5TtEfrWGYsInTxE8Ty+3cbxZTyLyhII2g1MQrBYzVU+TO4I2veu00z7Pd+wPBHMJw9GwtT+O2UEuZa/Ib9lvcoKdAp9e7C/8E1DwEmAADRcodUJir08AAAAASUVORK5CYII=","audio":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJxQTFRFx9387vX/wNj75/H9en2A5vD68/n/7PX/r6+v9Pn/PT5AgICA9vr/ipquPz9AxsrP0Nbfo7DER0pPtru/+Pv/PD1A29zeDA0OfH6AHB4gnKq7+vz+QEBAUFBQHx8gEBAQYGBgfn+Av7+/sr3O3+bvLi8wSExPICAgu9X8zuH81OX8097s2+n+4e39/P3/xM7bUWuLAAAA////AAAAMn7xXwAAADR0Uk5T////////////////////////////////////////////////////////////////////AEtXImUAAACPSURBVHjaXMzpEoIwDEbRVisC7vsu7qKFSML7v5spKQ7j9++eTqPKsvzUm3AoBySzevsHfT1owIUssXgITwmS5RUCiHh4QhR0Ox72IcEw4M499AggjrizGgB2sW7n2VsAzrAcLVy/BObrGZ91rSpY3Y1B3LhuOeBHc3tMr65TgeO4+s+dyg39aw9FY18BBgBIjia0/TMPYAAAAABJRU5ErkJggg==","word":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKJQTFRFx938/P3/wNj77vX/5vD69Pn/OWvO7PX/ipqu5/H99vr/M2bRM2atM2aiM2aWM2bDM2bPeZzAOWrOM2a4nbnWxtfrTnnQV4GnOGqcM2aUOWucjKbB8/n//v7+M2aXWILXOWqYo7DEOWvRM2aVVICr+vz+U33PsMTrnKq7rsLru9X8zuH81OX8097s4e392+n+xM7bUWuLM2aZM2bM////AAAARI6QQQAAADZ0Uk5T//////////////////////////////////////////////////////////////////////8AoY9OMQAAAJhJREFUeNpcztkWgiAUhWEI0Cwtm+dsHqxQOfD+r9YBbNxrcfF/61xAjDHla1sMYkH7PdjlD1qs+Qsa5Q0rBFz1uaBULENeEQA46SDQdDdXIZd4AVCeAeh1oHpcFh5ShHSmIlncHYwTgCxRI+ybg+4E3/pgm1hodwQ+5bphIV4cIVZD17mFfSn6m6nv3H+MRbLuGqqvPQUYAB9vJ9N3EbvMAAAAAElFTkSuQmCC","excel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5QTFRF1OX8zuH82+n+wNj7x9385/H98/n/7PX/5vD69vr/ipqu/v7+o7DE+vz+nKq7u9X89Pn/4e397vX/097sxM7bUWuLcbdsMm8M////AAAAQqobMQAAABp0Uk5T/////////////////////////////////wAUIgDaAAAAc0lEQVR42lzM2RZAMBAD0LHvWqWl//+jkg4O8pY7i8QYtzsjihAOzermH3Su/8IBeWAAIF52BD0gtm5aLzEJe42+AJJwbtFzgspkXbXkkiBQtGcErF9XkpUA/lNBL7yE8Ai6ST823lMKc4H+w/wG/8opwAC45hMxbjBWwwAAAABJRU5ErkJggg==","powerpoint":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhQTFRF6fL/4+7/4u7/+Pv/9Pj/0OP/6PH/3Ov/y+D/3er/ipqu+fv/1ub/xd3//P3/9/r/1+f/7/X/8/j/o7DE3Or/1uf/7/b/yuD/6PL//P7/wNr/8/n/0eP/3ev/nKq77vX/vUkb/ufbkTozxM7bUWuL8KZ0////AAAAb5pE0QAAACh0Uk5T////////////////////////////////////////////////////AL6qLhgAAACLSURBVHjaXM3XFoMgEEVRELDEGtMrSpH//8PcAbOWyX07+2GGhRDsdwcEI1jSrH7/Qa93v7BACCYsAuYA0zwbH6WrRwAaQHKrpXaMmsCbTshzvgUx6jwDGBqB3DNeAPw6g36dcNSsrRmvBkVvTeorPw6qJAh0RLOsaFTZRrDiga6a56W9J3CbfQQYAB7aHkgVESipAAAAAElFTkSuQmCC","drawing":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAAXNSR0IArs4c6QAAADBQTFRFAAAAT2uMbICjt8rkws7c05YO66og7rpL78Rl89WS9Mt49vv/+N+u+uzL+/Xj/f/8MAzDIwAAAAF0Uk5TAEDm2GYAAABzSURBVAjXY3ABAwEGBv//IABiGOnb29uDGL+VoCLWRlCR/0CR3xA1pqGhoQEM/kr7Y1a1l6cy+OtbR7WXzwYylH5Hlff+TmXwNtKOKL+3Giiye3d4//PqVAZHQcHIt+VABhBE7969G8wIS0tLAzNYQQYCADqrMQxBubfBAAAAAElFTkSuQmCC","generic":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMBQTFRF3er9+vz/5vD+6/P+3er+z+L99vr/4u3+7/X+6/L+y9/92ef94e3+7vX/5/D+wNj8z+H99/r+y978ipqu8/j+2Of97/X/1OT91OT+9Pf+5+/+9Pj/7/b+6vL/nKq7/f7+4ez+8/j//P7/w9v8x9390+T9xt387/b/x9z95u/+4e39/P7+o7DE2Oj+w9r89vn/w9v9xtz84u390+X92Of+8/f+2ej+/f3+9/r/vdb80+T+097sUWuLxM7b////AAAAa7IgjwAAAEB0Uk5T////////////////////////////////////////////////////////////////////////////////////AMJ7sUQAAACaSURBVHjaXMvnEoIwEEbRDSSE3qTbe+9dEd7/rYyzMiPef3u+WSjL8lW1Egd8oMCeVucPFKtRh0JIDUR5BVfipa12ZlbQJbezKksmfGFJlDSSbQ4nhAHxmmJf0DBGIEoQaRKnxtFF2Pan2twEY8x0hECV7QO9xK4/QRD/nIYJ00c7BC3jYDyYPts4CFIP1gnz90PnjpD/9BZgAPlAKxFv8GbaAAAAAElFTkSuQmCC","form":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABnAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAS5JREFUeJzFkr9PwkAYhp9ri1E3XYwbTGqYZGBzNODqSGQ1rCwuRgZH/gLSGRgZRcMoM04MOtgF0gChhzHSFoc6tfyuJpr4JZe73N3zfu+9OfjvEv6iXG95P4UuzhIBpxX1mnd1eS4AUsno3EVFUYhoGqqqAILtrU0q909/6+DXFeqgKbOhcCnTFsLPoFxvebMZ3DycAJBP6wzsLkOnQ982+HBN5OeI3qsZ7qAps+TTOt3xC4+9ylxnVUQYu+9YhkTzNxeDyVXj3sDuLsEA18d33LZOAaYCqxwMnc4SXEg0AHAnDgBKUa8FYCoZDQZA3zYoJBoB5M9+928zODw44o1RAC7C5rPJ2g+Rq8a9vdg+ysbU+izsThwsQ4YLAOzGdlaeW4acf0KYyLoqZdriC21viOQMsN0SAAAAAElFTkSuQmCC"},"dl11":{"document":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAoSURBVCjPY/j//z8DuZiBYs1myXP+k4qpo5lUMOrsQels2moekIwBABNfzrt5bjyVAAAAAElFTkSuQmCC","spreadsheet":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAsSURBVCjPY/j//z8DuZiBYs0VM9T+I2MGIEAXQ8eDQDOpYDj4eSRqHpCMAQDUEwD+6xAD6AAAAABJRU5ErkJggg==","presentation":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVCiRY/j//z8DuZjhTBrDf2IxAwNYPRgPIs0MRAC8mol1xahmcjRjiYqhoJmSXAUAaQzFr2MQFNMAAAAASUVORK5CYII=","pdf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiuO1i3gDE/5kYGBjqheJSGAACiBHEYwCBl11N/0EAIIAQIlDAxIAGAAKICBUgg0CMO64WYAEWGAMGAAIIwwwMAFLw7cLZ/z/u3AK7C8SGib1dNBvsBYbvl84xPM6IhbiCh5cBJvZu0RwGglYABBAhBY1MDPhBPSEFDAzoLof5BuQDWESguJxdWRXMFopNQYQtzIsgwVfdzQzIQUvQmwQdCRBghOOCAGBioBSAXAADv188+w9KjITEYAAejOAgvHiO4feL5wygtA0D7xbPYfi0ayuDWGktA7I6kDg8gcIloKkHGXDqGYHpPy+fM+BSN/CBCDKgkQL9jQCMRMcgIYCQQAAAAABJRU5ErkJggg==","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABHSURBVCiRY/j//z8DuRgM9s5h+E8qJlsj3IBhpJnYsMBQxIAESNLMgAXgcxEDPo3IBiCxGUjSjGYQpuYBiSpyDWAgO0eBMACBTNYaUR7HzAAAAABJRU5ErkJggg==","generic":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAA8SURBVChTY/j//z8DCJ85c+Y/PsyABGB6GJA14wLoBpClGWYA2Zqh6ojXjAxGNY9gzSCAnpJwYQzN5GAAbisBXSLA9XcAAAAASUVORK5CYII=","folder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABKSURBVCjPY/j//z8DuZhh//79/+vr61EwSIwBB8DQjA0TpRnZxoaGBgxX4MJgC4hVjA2PaiaA0WODvs5Gth1r8iQ6kVCUMSjRDADDiTNHXS+ylgAAAABJRU5ErkJggg==","sharedfolder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABKSURBVCjPY/j//z8DuZhh//79/+vr61EwSIwBB8DQjA0TpRnZxoaGBgxX4MJgC4hVjA2PaiaA0WODvs5Gth1r8iQ6kVCUMSjRDADDiTNHXS+ylgAAAABJRU5ErkJggg==","word":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAMAAACecocUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFGUyyVnzHaovNOGS8kKjaKFi3o7fgws/qssPl8PP64Of1R3DB0dvwM2bM////////MYbcQAAAABB0Uk5T////////////////////AOAjXRkAAABESURBVHjaZI1bCsAgEAOzL1/t6v1vK7WIovM1hJCg+aTB68QPRyzgSvq5JDKOMnJi04fCcIYmyN9Xyy/CvbN8++0CDABWSwU5jSC2XAAAAABJRU5ErkJggg==","excel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAMAAACecocUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRF2eXZgqyCz9/PlbmV7PLseaV5qcWpjLKMxdnF9fn1n7+fb59vZplm////////yz7rTgAAAA90Uk5T//////////////////8A1NyYoQAAAEBJREFUeNpi4OOBAT4GHl4Y4EFns/EwMXCzQ9ic3Nw8XDA1zDyMMDVcPIw8DGA2JxcPBws3KyemOXA2kr0AAQYAaiAFebcupcoAAAAASUVORK5CYII=","drawing":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAAXNSR0IArs4c6QAAADBQTFRFAAAAT2uMbICjt8rkws7c05YO66og7rpL78Rl89WS9Mt49vv/+N+u+uzL+/Xj/f/8MAzDIwAAAAF0Uk5TAEDm2GYAAABzSURBVAjXY3ABAwEGBv//IABiGOnb29uDGL+VoCLWRlCR/0CR3xA1pqGhoQEM/kr7Y1a1l6cy+OtbR7WXzwYylH5Hlff+TmXwNtKOKL+3Giiye3d4//PqVAZHQcHIt+VABhBE7969G8wIS0tLAzNYQQYCADqrMQxBubfBAAAAAElFTkSuQmCC","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVQTFRFx9387vX/wNj77PX/b6j/8/n/5vD65/H9VZj/RI7//5WVO4n/9Pn/ipqu/56e9vr//0ND/21t/319o7DESZH/nKq7QIz//0hIDA0N/0xM/1FRFBQV/1VV/1RU/09PPYr//2Vl/1xc/4CADAwN/1hY/zs7/P3//0VFExMU/1JSNYX/R5D/u9X81OX8zuH82+n+4e39097sxM7bUWuLFxgY////AAAAaiuerwAAADd0Uk5T////////////////////////////////////////////////////////////////////////ABBZnYsAAACNSURBVHjaXI7ZEoIwDABTBW0B8b7v+xYwtP//aSYoTnT7tDuZNOCce5Z0SYCDfZOp/l9oqsZvsFQg/2IzAsHm5TtEfrWGYsInTxE8Ty+3cbxZTyLyhII2g1MQrBYzVU+TO4I2veu00z7Pd+wPBHMJw9GwtT+O2UEuZa/Ib9lvcoKdAp9e7C/8E1DwEmAADRcodUJir08AAAAASUVORK5CYII=","audio":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJxQTFRFx9387vX/wNj75/H9en2A5vD68/n/7PX/r6+v9Pn/PT5AgICA9vr/ipquPz9AxsrP0Nbfo7DER0pPtru/+Pv/PD1A29zeDA0OfH6AHB4gnKq7+vz+QEBAUFBQHx8gEBAQYGBgfn+Av7+/sr3O3+bvLi8wSExPICAgu9X8zuH81OX8097s2+n+4e39/P3/xM7bUWuLAAAA////AAAAMn7xXwAAADR0Uk5T////////////////////////////////////////////////////////////////////AEtXImUAAACPSURBVHjaXMzpEoIwDEbRVisC7vsu7qKFSML7v5spKQ7j9++eTqPKsvzUm3AoBySzevsHfT1owIUssXgITwmS5RUCiHh4QhR0Ox72IcEw4M499AggjrizGgB2sW7n2VsAzrAcLVy/BObrGZ91rSpY3Y1B3LhuOeBHc3tMr65TgeO4+s+dyg39aw9FY18BBgBIjia0/TMPYAAAAABJRU5ErkJggg==","powerpoint":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhQTFRF6fL/4+7/4u7/+Pv/9Pj/0OP/6PH/3Ov/y+D/3er/ipqu+fv/1ub/xd3//P3/9/r/1+f/7/X/8/j/o7DE3Or/1uf/7/b/yuD/6PL//P7/wNr/8/n/0eP/3ev/nKq77vX/vUkb/ufbkTozxM7bUWuL8KZ0////AAAAb5pE0QAAACh0Uk5T////////////////////////////////////////////////////AL6qLhgAAACLSURBVHjaXM3XFoMgEEVRELDEGtMrSpH//8PcAbOWyX07+2GGhRDsdwcEI1jSrH7/Qa93v7BACCYsAuYA0zwbH6WrRwAaQHKrpXaMmsCbTshzvgUx6jwDGBqB3DNeAPw6g36dcNSsrRmvBkVvTeorPw6qJAh0RLOsaFTZRrDiga6a56W9J3CbfQQYAB7aHkgVESipAAAAAElFTkSuQmCC","form":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPUlEQVQ4jWPgnxuxAIj/k4kXMFCgGYwHmQE268v/P/r8GkyTZQBIMwiAaBAfF6CdC0bDYDAkpAEzgKLsDAB84C4R6boiMgAAAABJRU5ErkJggg=="},"dv12":{"document":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVDjLY8ie9/88EP8nA5////8/AwOZmsGYJgYwEIFHXTAyXUDflEiWAZTlRhBBCQYAgc/cUg2HY7YAAAAASUVORK5CYII=","spreadsheet":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAzSURBVDjLYxBbnnoeiP+jYQYsYuj4/P///xlwKSTGgP/DyACy8WggjhqAbABluRFEUIIB5xoeIOjKcLkAAAAASUVORK5CYII=","presentation":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAwSURBVDjLY3jgZX8eiP+Tgc////+fgYFMzWA8+AxgIAGPGjBoDRjCKZGy3AgiKMEAQeIstyyBWPoAAAAASUVORK5CYII=","pdf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiuO1i3gDE/5kYGBjqheJSGAACiBHEYwCBl11N/0EAIIAQIlDAxIAGAAKICBUgg0CMO64WYAEWGAMGAAIIwwwMAFLw7cLZ/z/u3AK7C8SGib1dNBvsBYbvl84xPM6IhbiCh5cBJvZu0RwGglYABBAhBY1MDPhBPSEFDAzoLof5BuQDWESguJxdWRXMFopNQYQtzIsgwVfdzQzIQUvQmwQdCRBghOOCAGBioBSAXAADv188+w9KjITEYAAejOAgvHiO4feL5wygtA0D7xbPYfi0ayuDWGktA7I6kDg8gcIloKkHGXDqGYHpPy+fM+BSN/CBCDKgkQL9jQCMRMcgIYCQQAAAAABJRU5ErkJggg==","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABaSURBVDjLY2BgYMgA4gYycMb///8ZGMjUDMajBuA3oIASAwIYICCAkKHYDMhgQAUJUPEIbIaiGwDSzIFmAAdUEwcSPwOXAeiacQEOXAaQAgZZOqAsN4IISjAAAWm6BHV+IMUAAAAASUVORK5CYII=","generic":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAA9SURBVDhPY/j//z8DJRjBYGDowYGbgTicAQmQaoAUuiGkGsCAbgg5BqAYQq4BcENINQADjxowagBOA8jFAGxie72V/cnbAAAAAElFTkSuQmCC","folder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAMElEQVQoz2Po7+8/A8T/ceDNQMyADzPg0UyUIcQYgA+fodSA/6MGjBoAM+AMJSkRAEsGG4pVhgimAAAAAElFTkSuQmCC","sharedfolder":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAMElEQVQoz2Po7+8/A8T/ceDNQMyADzPg0UyUIcQYgA+fodSA/6MGjBoAM+AMJSkRAEsGG4pVhgimAAAAAElFTkSuQmCC","word":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA+ElEQVR4AWLw6XiW793+5D0Q/ycVe7Y9KWAAsEqVWggFQfQv6dDpdDokHCIJl/YaLo2Gu7s7y7vI4M6cszvuA+KH1/01AKMAAlmFGb19JjbUSSlzd5jU3CJeqKzubEQ8vhsAoOW6pKz3VqzGvyOv5XowuV8BXiw/Y1xsTNmOIFLWdrJgYgqbxwHs0SFlRPnp+oJ/S6oKNGweBpCa2wwgkFeQDcZ4qIpaxEweBjg3Qv8SY3P3RtM1MAV/FIDKREbAMehotuErmqCl+2u8ngPgfFigAdC9CoDh0Tqv1ofWXgZAydfHguO6ltH7yyl3fwuwHTBLkpsTQXoBsdvoQReZL9oAAAAASUVORK5CYII=","excel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUOn1oPnVkPnVgOnVlau4yHzqseo2ItqW1pwZfw+fWW1Lal2sD///88r3iHzqzS7ODD5tXD59Xh8+pLtYI8r3dpwpYQm1cQm1kuRwGdAAAAGHRSTlNv7/9w////////////////////////cHBsC8XEAAAAYElEQVR4AVzIQRJEQBREwfbGV4MCcP+rirBo3XKZKTWUfola8w2eaKMDxT+H+gFGKwfhSZ55g2Xddso4bFUh+6hi39aljLBOxxvyCEOvHFcIumhzwD0kpzOiC4ihelYcAPk0A+QUWRDnAAAAAElFTkSuQmCC","powerpoint":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlUlEQVR4AWP4X+qQ/7fE8f3fUsf/JOMyhwIGEIMC/J5SA/5jGjC94P+/XQsQeNOU/38X1BJtAFgTGNw9D8FPb0P4757//1vrS7QBqGKH14DF/m2cQp4Bf/tTQUIgOTIMqPWFi/1b0UG0AZjgznnSAvHf9AIEbosgPRbQxOllACIhEW0A5UkZlBMpMuBXiUMBuTkRpBcA2M3XNTYmHEwAAAAASUVORK5CYII=","drawing":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAp0lEQVR4AWO4ZaCef9NA9T0Q/ycV3zBQL2AAMSjA7zEMeJwc8//N9En/n9eW/7/r5UDQEGQDwBqRwa+nT/4/CPclZADCZmzg6+kThAxA2I4L3LY1ImzAq65WrJr/fvpIlAuAthgDFX/CMODd0vnEB+I9YKj/uHENpA9s2JsZWL0FjiFMAxAY2c8kGoDAw8mA53Vl6BgliTOQmRMRBtwwUCkgNyeC9AIANZyb2ubsZkMAAAAASUVORK5CYII=","video":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZUlEQVR4AWMYeHDbQK3+poHq/+d1Zf9B4O+nj/9v2xoR5AP1gDEDiIDh30+fgBW9mT6JEB/TALJcgTAAgR+nRIMwSAEhPsIAMvGgMmDUgPcUGPAeaIBywC0Dlf3k4OsGqgkUZ0YAwtfo3VASQvEAAAAASUVORK5CYII=","audio":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA5UlEQVR4AWO4ZaCef9NA9T0Q/ycV3zBQL2AAMSjA73EacNvW6P/TgkwwvuvlgNMQDAPuARV/PX3iPzr4uHEtVoMY0DX/fvoErOEb0JA30yeB8Y8b18Fiv4ByCEMwDQDbAgJvZkxCtwksBgQg16EbgLAdCIC2XcPlX5jXQOGDacDTgiyQHMjJuAwAywEBUG0GpgHP68qJNuB5bTlWA+Ch/Tg5BtmZIDZIDCRHyAAEeJwSDVME1gwFNDTgUUo0sQZgBiI8JgozgS4pA2GUBHPb1hgmDjMYYQCZORFhwA0DlQJycyJILwD2S5GJyNwkVQAAAABJRU5ErkJggg==","archive":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAOklEQVQ4jWNgGH6guLj4Py5MHwMoBsPDC+dxuOA8sQYIYDEExBcgxRUKQPweqhlEG5DjFQOyNQ8tAAAXFG8XqmcJnQAAAABJRU5ErkJggg==","text":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAkklEQVR4AWOAAamSl/VSxS/+48RFL+sZ8AF8mhPnv4cbQpYBx+78/N+78zPcELIMAAIUQ8gxAMUQyaIXBUQbULfh0/+Vp77BsWvv2/+SxS/2YxhAAqadAQg/YwKw8wkbgPAzBi5Y/pFOXph16CvIG+gYFoWEDZh9ELsB9Rs+wdQMymgsed5AvAEv30sWPw0A6QMAtygMBvoVA3UAAAAASUVORK5CYII=","sites":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcklEQVR4AWPwi9uV7xu7+71v7K7/pOMdBQwgBgX4PaUG/IcbkFd9/P+ydXeIwSC1mAb0z7ryn1gwAaiW+gYkFx7+X9V2migckb4f1QDyMWEvgORAtqJ7YfgYQDghwWIIPSFRNxbeU2jAjgJyc6J39I4CAEau0IvammGMAAAAAElFTkSuQmCC","map":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAP1BMVEXqkor++/r0x8PbRTjngnndUET53tz42NXkc2nzwr7mfHPjb2XcSDv99/beVkrupp/hZFrngXjngHf////bRDcIoZ1jAAAAWElEQVQYV13IRxbAIAhFUey9JLD/taaYg9E3gX/hoCUNtDWghlJCnZAt3tnMEPEtMsAAYPADPINyz3aKgbpAFJ0mUENs9AcjhFmApKQVgJ/vprQBB+e69QWDaBH4RqqHkwAAAABJRU5ErkJggg==","script":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVR4AWOQLH6VL1388r1U8Yv/pGLJohcFDDDNZGGgXgYQgxKM1wCN6leUGXD0zs//5i2vyTfg8bs//x+9/QMyBL8Brr1v/h8D2oaOoQBmCG4Dgqe9/Y8XIAyhwIB3YANI88LHb/+QNZMZiAjNpBtwDBKNdEhIlGBwZqLIAMmiZwXk5kTJkhcFALZ/q6e35S1kAAAAAElFTkSuQmCC","form":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAPUlEQVQ4jWPgnxuxAIj/k4kXMFCgGYwHmQE268v/P/r8GkyTZQBIMwiAaBAfF6CdC0bDYDAkpAEzgKLsDAB84C4R6boiMgAAAABJRU5ErkJggg=="}},"phPicasaLogo":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAAAoCAYAAAA8AZ5fAAAgSElEQVR4nO2be3hcdZ3wP99zmcnkOkmTtE1KCpQWSMqlbVqkxYJcLNstlMV3RlfB1V1s3fW1KvqKi6+bEy+4rI/gVleXyK6g8OLOuCtgoQaRi0DvASlNWkp6oZe0SXOfmczMmXPO7/3jzEySAq7PvvqI+/J9nvPMOWd+9+/9ckQpxW8LEkenvNewVj+Y645Y8u5ZGJfHMEyXyrBJWJ0Il1SHRkMj6XA6sGw09f25jOxvJJe6m4n4o+cGObXa5K5jyVhPhB56nDbV5v3Wk78DvxOQqQgXEXmrhhaWWMoSNp9jPDDcG7zxYyz00nUrDZJ1AAYSBrPCJRXQKbMhlwBwUKMp7G3eMvflui+ee4K1rqwiYHTSk0ThKpT7+97kOzAJ2tSHXbswYkS0GDEzRkQjpjRiSrtLUVLzScv8gHyzIbJ6qGR4O9l0Wm8swV6swzKd0Hku9gwdCWtUmjoSVqgFCrVAh2WVBDaEd9Tcba8d+tAl3ETnvavg0lXlzH+8ZvcsKbsbCQmixyWqy+beoCB6V5eYf6hD+e8Mb+DwGDET4m40FoPy+Yb6k155VU6Z/8bxqz28NQc43r2EKx+6cmbZ+Jx+fXUZlVcaeDNgIgOlJYWxXFIBjUrTwDMdsiENNTuHPLKWs7721Ud66gA2rL331NaFh8rYs38wBnZExc2uLtzWg8ojIrzD/b97mMbhSinVY0WdqIoXkR2XLaUP0/8xRehjQtnsxVy4MsuhP3+1/19L71fuJi808iMH+6iP7FyicOmU2R7jOQctZxBMe8gJoSQLUBtg8QX9fPqRh25p4br3ZVi4oPbTDfEgG1BL7s+vKf7b2xbvwG8PxtSHri4xK9sw2PyaF/mT+eoH0lnfi3w4gLmikhIbvGHwCBFYfJBlBCX10D+rspf+ojntle8tuV4nN8ehPGWQDcBERkcy4JY46GVACOCvuBdYjh7m3TUa5w0sWnxnPS929f2se7Z82+yDeIaNor3D3b8fmMbhS5ao3Gc24O2qn+8tl9SMXio/rCi9opISWyebBHDx0jb6WICyhVkO/XmpHJhT06O2Dc0e+VGGcI9BNuAQtCdHnch4jOcmn/fphTvlUVdt0zZw4eLzuOjmLPMnzmTF9eXgE9/vd+v/f4LR3i7TkN62UWUPytaaU+z+S0XpFXWEUzrZpI0+Bh5VTOQAJggmdELzRklfd48c/NnHYd+pZadcdtTdaODMneT0nAlgEEynMMajV/+TPZBgBJsEASq8DE3VJfzDwJr3fb5+++P7FmRX1+0XDm3CUndGRI/FfE4XEVF5g6PgTajTfMrf5GX8v8Dp8/wxg9HdTfGQbrsNbf160c9mz0cU7hV1hFPgDbuYnIbsTAVlmQQpQG88wkD073n04brt1+87dcmp/6jaUXulh3uRQ9A2AB3TBkoBSDd60IWUkFEeFVolI944TZUeH9z5zdXfWvrFGxwapabtWNuQSLcejUpBInhTkQ4w5b8CvOPX/yegReIR4jGIf/QcA2BOx7YLh5lYAaCTTerkAi6ZEfARnSI0rtBsgArKMiZ6rpKKNACbXzPqvtJ5fGzZ4FMa+suT00xkHLQcQOyFG0pSFVQX/7JJGIox0bi+fiuXc83KDOM7ZhyW95QAxGLKjcfxIhFf/YiIoNAiCvO229DicbxYTLnxiEL9BrAsxLKQSATNHyuiAUy9h4gWI6IViUqhKaXUVMkhIiIS1f3Lfy8iIkwS39T20ajoBSlaUFNT2wK0S7tWGK/Q93RiLvwncXTwg2BTr7ea+3Spp/XQogB21fd6n2y9tyKDulYnWOlzN7iYNgRKwM4UOlUSKnLSGBPbw4R+9oXYdfs2bp4Pq+7N1H1OHeitHXwkxfhTvj6fdNe+yZFsWYKR4goCVBRuG+awdmDZrWczd6n7wQXPzFAq5oqIRCI+YgvIA7itC7VpEy5gyvJra/jHtaVy2doKkWhILltbIde0VhV/RQJtbcpra1NedXVhrJirlFItLSilYu66dRgWLSpK3BORgFJKRaLTVUk0Krq/gpirVMyNRNBEov47lCsiUkCUf9hRPRZTblub8kREOjpAJKpPbSsi4kcc456FJUopFY2KHo/7Em0qwiIRNKLiiUR1FcGNxAWi4qkIrkhUP51IYjHlvoFgAblLUbKyC2dT6ysrsnhfBJhFqB/A1912xkTPKTS7gOxx0to4yZf28stdn9v12ZMdHdBxwznaxs29bFjTaeCe7SRX/104S2xlFdp1OmWzUphPlV+6uGNgQ2dLjcmXlUcdgDaG5ghV5giuXcVjJc9+6GvsGK3gtccOALlIBC0WU2406uv0aFT06mq0qzsiXjT03BL0zBpcN0Qg4GHbGoGAT5C27XOupg1gVD7NQ0+9EvnBfCcej0Dz4ToOHTA33jI8sGEjjtWO6utDHxnx1UJLC0XV0d2NxGI+kgoHOPV3/Xox77lH5bq6xFyyROWiUdFvuw2ttRXHwhIAC6s4XiwvUQrM1ky39NCiCm0KYxcI3f+NYFlxZVmowvvCeFPXUkTsac8FMFC+qDzYuqWiBFmcxK0OUXEAFMMks+VUTeswTlrLkhnN4hyqZP62H6uLB26UmH410HHDIvZk53uHVn3d3cnfqI9GHhrcezG/evaLUIWKmDiVlA266JQVB7RJAFWGYgwoN1K0RJ5+UIvX3GBDWTWkBgrUDpEi5YqI10CLYD5dR85dgaanUd4opgHK8y1808jhefUgIbzkcm5e+cP4zMhjrMgG2XPwM5jqzA33NX5JbTy2vx1f7La0oNasQT/YGvEKCIljeQUEAG7hIJVSqr1dtAKRbNqE29EhJuDdeacvkUSimlIxt1m69cJ4PaAsLGXRMiluLQuLoj3lz5tHdsFwXb9ezHXris1Vwf5qbxdlWRCNSrHtVM6eRggo9F1daI+3brswiXa7TrDSJTsewhgFKKcqA2DiJgAGGEoECfWcz8SzEbV84tsbUBu+HXFoRo/1RFjKd7Wd/I23lO9qZ1EndN6ikdmgDa3tvTZIzTy4+gcTsYcW1WjcpjzqsEloaaoc8SnLHME9MMLnPnjHe7furOgOkTh+GCi6dQWRF4lHiKiYK1V1f4qX+xS68RK2+e/MWZJgcLdORVBhlIRIDlfjusvIZi5HiY1X8mUevr+b6M03Y6fngblRTQwdFUS32lFWG4L4yJpK6FPF4lQObIlbqjtiSeGgT28/6VlEdYh7vp0AERV7Q5yhvV20gjRpl3atTbUVCF1Tb9K+IPFOn3MqkZzO6QZxBWcLipImD29uKSUDE2SLgyYZKyknNAo6Cs0OEup5P41PnqvqciJ4Gz+J3KXigVs3n+NFV8cV4MEz0BzxRc6qe6H5wtwH0X/5g9k9e9534qrcIzw0ueoAFaQnH5VG1Rln8h5jwRMvcKIRwuHSyDWjiYIOB9+buJO4F5m6e8MYZ+Gyver5RxKnH4wsv7aL3dtshOvR0pfz5X/aS/OiGL/eWVZA9rr1aFYHjmpTHgpkzo0zKB8I4tg63/4/A0qpLPhcJiJOHuleTLUpaEOWX1vD2HAAN6DxasOIUiotcXS5prWcVK2u1M+HfR0bJxJTrsTRufvaKsaGAwBUz06p51VC4uhvhWxZfm0NA8NlBMnBmcOqW9kiUZ1Lx6vYWpkGMnmG8G2FNyESg/Je4zsPEDor/yJLxgTSHhXlGolknsNLwM3ZbH3u/Vy77bzHL7UjoGLEeDIb9ToEFeMOoo/fLqzuVfs4FTzv65fB2lez+zhlnHfrHaHOW+LJhhMkSa2t5bFbUCeZoD6PkDEcE4ZyYWYA6DZNW92lGtUjJkdGg/E4Y1NFlGXh3nYbOjC5IdfVV73QaxY5rwVlWRRE77BU1O1A3OW4bj0nB0MM9a5Cc2eJlP9QKdUvHeKL4Mo5CzCdldjZJpJ6EIBI62DYGOsqK2NbXx/pvLGGUsqV8y5rYPDgJbi5C1DKV1Vlewalce4Wvvy+vbx47EbsA01y3mX/zKucUEopmTu/hWTiUuxsU9H2OPJaVqrqtrNs7vNtateYLxEiKBVz5ZxlZzD0+hU49nx0PYhta5gH+qR85i/p/NEBboz+FZW6w3jl/XGJjsWUb2/k9z5NUhkA+7/13kAD6Wbw9zeLmfoItjOVw0dxfm7x6PbPq5sVT3Qa8Sdg7QOr9I6bIrlLaDGjxHMNt/RKHxF1ZUOd2/DX0Lfi+uB5/BX8gBxXLwnx5Nk2Xz2aS62kutqmBgCbhKqiSvp9ca40kBwV31uxs/avf9qYYl5zwLp5p7S3i1gWtLUpr73d34zv5tQWN9OJ7SilVFyiRGbFzTW7ioZNDj2Uwknko3e5IDm7FU1rIlTxLNCvlFIys/EaVOp9ZGUOnhtCZBxPmXheaExVt46lzAVcfcZDsdiuMQAJzzwb1/4IisWnyRRIJi7i1vu7cL0z0aSJxNGzlFJ9Uj7zQjT70zjuXDQ9jaaD44KoAK6zmB2H54nMvw96E0opJeGmVpzEzcA8RAVwXBtNB9c7H82+gPff/DSathyloKn+icjrsbwk8fdecGMLoWqD1bc7TawK9jFaU8tMAE7S7wapxqOivBJt0GPLz63mR7fQEycq1SEuvUunbNB95Mlq4CVzOy9BeDDYNxGG8C/omwj7+37hGY3GqwRgUahLqyetdwLOc7g0+9Y5UCVjOJRAwS7WXMIzE5Qx6+IMAzvNvj70e+5RRT1uWai2tsJzHbieTlB3Gxp6HSjqR3dJ4fg39waR7PmIChAMJjACLoaewfOgOuD7xuGmVlT6L4B6YC/h8p9QPec1Xn+9Hi27ClddDvYadh1NicgDUFZPVcl6XLcV0ziBGD8D2YlnGpjOShz7CpRaiSYgpEiprIgECNfegMN8YBuVoUe5wHuVA01Bhl6/Ajd3Izl7LZWjBxjncbngz+bhJG7Gcxeia68RLO0kPGcXuZFKRkeuQnnvwc3diKdMdBktnE9B/RX0d3u7KNqmcDiAhjEZDAEcJmoCuEc8uh++jUef56FbGlntjHP8GYetBxzCgxqI4tJ5BlsPOIzWev670+D4LxXAGfVog8wR4icVUdBPUkbBsw8SntYng3HB+TSwhyE80+joQBoaRGtrU3mOjWgiMmlY6ZqL6+p9oaUz5JpWk1TtpD86kDBIHL4IL7cK19PR6KKmPMNJQLBJqWy7tGuUJ67Hdc5GN55k7vzvYu04pSK4wEkR2UdV3RHszDq83Coa/+xxMtuWk51YhGmcIBfcSPrdXVN05n4pnb0bM7sh7yWMUFsFl9hhttqLQKWhLK76+nYUlimbe2PcdFkQJ/eXmPrF3PuZrXzuweUIi9H0F9ED/6gG+w7GJapH1I6jsrm3l49cvpd0+m/w3BC6UUS4Zb11lNmgGZ2eyRc53GowqgcZ2H0uJ3/c+MDN29n35Aq+786lWj2z9s6RU0du+hTh0Zi2KNKjx0cG7TcdeSq8N2QcPTjuhQZ8NyLgESaD4SR8l1AbmZbESUg11PyUI4UXDQ0YbW3Kbm8XzbJQaoqOAvCtb3cBgwf/J4MAhydHc50q4GyQEMHgLzh/yVa0YA7HLUGTALVVWN73z8FjMaZ5EFX6gOrecRJ8KzgSj6CUsqW6upNAqBohRcmxUsbSi3DdcoKl32P8si7Liqup8QGlTuyQ6pmdeNmbEfENs8TFDmwfAanFtFdITdMENbPGqK9JqS0/H5bqeY/ivFpKQHuJpwdK8XJrEBmkNLRJ9R8/GJeoDhD3DbKsDPQ9S1X9PHT1IX/8rIAfNyAvL0V8VVgAjR70I3ROmuVAP73HzuXkQ59XNz93U+/uiznm3EKGC6HFvuCzuGFiRiUn3NvjlW6Rm8KDGqO1vzGWvWVeEiKzpr1zBvyomyQpK1xOAu3Z8zDIvlokhNOTPIWAhr8LyeGqMK6z6A2XkjnAQYxABzMW/LPa8vNhvKyJ504SqmTnIyqAGdjLT/71uIjI+vViRuKR4txqZGSUxsv/VY30/4jB101ELsA0j+K4LysVc7u7kUKw5uQn477krFu6C9FSgMnQGJEtnUk0sxNUGs+7ETf5JQZea+eV7Z+WGbNuoX//+VSsfFD19T3H1pdn4XnVeOoIFWe+DBAlPi2SppSy8cLd+DEMk4pg0X+fGiuY2sfg8Zc8Vp+NhzNygtdma8hOYesdn1d37ZAvzb6aY323ECpfQi71ONfM8CrvvsLt5EU+8ulxufRb97J17+c8wnkOfTORDrAja1OLyYE9DvGTOv8DnASa5lAeqKFcklMCMQnKHZt9AAyN6xik+/oias2auJ4PpfrFlLG2gloC5ZXheS+jBzehtBGqSioYsXOEJci4O0bT3IGCiPYlQ6WfnRd8pJtmgKwTIuck+My9ORTawg1oPVbctSzUxiECXV3i0ZOPB8yor2HgaBmeHGHu3Il8eNUtBGGGW/LegzeQBDUCUkaZBGMoW8bkp8ye3UcifQ2KC3DcWnRtDnbmXSixGX5yr1TO+T4VehAlNoae4W8vcQDWrUOdDMaN4RnkCtE9jPQINqAIFI4jEkFrl3ZlYSEioJDCWWkAW977Mg7OcQ3ZOZ+mr2zYdfdL8uH7PsDg8P8mVF6wfWBgrpz5yWcU1Dv33RdmK3/vMFrrRUZFvSl3hzVvOe8yVo02aKHe98py3mUUONyoeOvMVjrA0D0/XXWSmfX5TcRd8C10gEhcsHpETeP60tJRku/ZoZL9u9Xx119QEyd2qL6+51Syf7fq3nFyEtmRyT6FQ8rlbFzXxnWCVGeDVjvquZM4lhURYkpb/hf+Wg9xhe/GjIxl0LQRdJnB0b5K/Pi7rFmTT2IUZKhWX46IT8wjdt7IPKeEf/nVDi5a+Q0amj9B3cwNlJZ9A83YlDe8FqNnP4Dj+NlFxy3hGztK8gjnuY2o7jaMhoY8UWVyfrsC8eJz+NRQrtXOlMDL6kXacsZYiOrsYevzf/fIl/b/3X2dH0YZt5MEpiDmkgcv5MEHCC6c1Rva841wduHXekN7Nq3KxbfinM7di2pHTYB07RNqi1pucP21JsDC8sUOCfBGqJzG2QAJygG8E3QPo7IMjcFYKrVunb/gvA6n2YrQE2+hTbV51l11fl/X1bn6YABIt0u7Vjh0y0JZWIKv/L24RImGNQ+le3gezD2Woz9w1HeROJ/dXbPbnlf729tFi8SRnh5RSyIqJ5etrSC87QbC9Ta1Z25h8OBhXHc5Qa9FKbVfRKS1FSdGRCuaRAM7LsTzqtG0ATQvI+GmViqSX+Smyx5TQyfvBRJAH9C9fr0807GpqYtk4q/JOcuomfU4mXQKRROJo2cBfZtaLfe2XZYOsKRNebK5N0hIXYhNFTDKSDonm+cHGxp8wuteYWVVTHkiQne3n5Axdu2KO63vX4574MWj2y/tMej46jrMiU9gelUEw6MkshrJcaG2lO0ffrp0+02RIa4+KJeMXqe2P/2zDFsPqAhDEs9zeIQhX7eOVtvjzPYpvnGmXHp3pbP1nAb9g4uAeTCW5NcVYc4BX48bGR/5TgmpiSYO7Hy6O+QLID3X0IC7aVPRB9eixL1pcWjX06cXaxUNF5TyN4yFv2nwGK3UCLkahgEvVpikju6makY3dvbdaMm1ct5lD6p9qq+gM6QlGuD41tXYmY9gGieor/kFg4dfBHc52YlVUj7zAPBKXl+6Eke3ymdeiO5ch+vpQJJA0MMJhXBGKxGukMo5v1Ljx/YX1nvPPSrXMXf+aHEDpeeMIANP49kfYmw8KuGZJ5TqPwh+LX80KjrPNqzEsa/BdW1E9zn8/em5fTLj2ioZ2hN/8owBKZ0xRmfncDx6y/nwrm7jziUIZ2Wz2/92zOCBi1dja1/G9iBMhuS4f6imV4WjZvLi6+lDnFI8WZHN8gmTJz9REBXqK5NnPdVI8KXD8fxTLzl6T/E5Fvzbd5eNPDM2HUfkjqJ/RfB+2UAOTatBI9PQMF5MyxZE+DSDzTQDeDlfvO06MJmZik9bRyH+7a9n3kKDvlf8P8okqEaVLY1zH8XzFuDk/ozB3oA0NPwKs2wYoyTE0EArnrPKx775vNry82FpWfYsh/a1glqBYX+aytp/l5qm16kIKsbGFqLlVuGpegxjHKEcO6uRCr5Mmb6HXG4pWuoTMrNxE2l5HS3nUKo3MmGvwVNzEZ6myhsgu/RZ+rdchqcW49ifkoq6/6AmPAjAeP1i3PSNOE4lmp5GJIACtJyDbZ8xpte+DNnLMAnx0Y/twB2/mXmHv2ZUr0c98JEu9eSuLu8+bpuOAdOblir7wJ4arvvaM1V7Fhkt7J2d4T+BpjGn7EiVkWoac4qi+0j6EoEFxE9vXL/db3P/Dbvp/lWOsBNiNNu/JkKukBIEaIlbqk21eQUXxQcJ4TjG6VwOebcEyw845bNblrXHoUwPoLwyVE4DUMdff0Gq6sKY/DkTqT8lq1+OZFJ4ykSoApXGDDxC86JYPqBxUmqa7iczCop34WRvBXeQkWQApWpRjFFS8izZzBl4MoeqkgqVfG1c5l3wIwaOBnGdpUykzkfTBlBAIluP65ZjGPvwAj/J5wT2SkPDPSTTHwUW42YXMjo0iCKAk5uJaR4lEIrj2GtQefU4VjlImN3MmHuQodebUOoyUqlZaFo1QXJGQ4fl3tRhZSJUhzjn8k4aR/6dpHsTlPlcDjBKCWXw43POz7DIuIBUyZdoegssj+fjs8CRcP631JkM6iRfLn1Dn7FMkDHA49C5Vzz8yfSe5vSR6qS3qPFEpqODYqLCwpLuiCXt7ZbWnE+VknEPIKobI/gaDZdPQP4rGaxi3riZbrEsEERTbcq1rGga/ZeHyeVsRrOHIV/cMKYek7nzDzM6chWe04xQjS4pNH0HgcBW5rduU88/kvDj3Lhq+MgeOWfZRgYP70KxHJiFYKN4msrQL0inX0EPfgA7nSA08wiAOvDKLgnPHCYgV2JnWoFywETkGIHSHXjmUyrpi/o8YT0nlXP6CTgr8+2rEWxKyx6jrOJhGuedYG9XvU/wqQEIgVI2A30hlHcEQ9+P0gZwnUF6XrUNAMvCsayR9KHef8ieZVz/L1ww9085mKpmqk11aMi+u/cG444Jp/YUegvp9AxKHL9yRconK0wrgYzrW78qF8ANKnQEL1+MEMz7hSkgWeRD/8cMPHRuLHv0JU4sIFHa3w+p05L7CtpobxctomKuz+UD+5i39GvU16TYGs/FJapbxKd5AH4eOo7VjlrfJ6aFlbXGO++n+bwAPWeeapd2rcWiME+3iLzGuStqcWxfigy9llD9p0YLSIhE/LIkC0sppY5KS/Sn9HT+gpBRlt9jQvX15dtXxcAzObBzoLAPNdp/UFqix8gefxRyQfoOQNq2ab5mRHXHbPDVVySCRKOCGlf7RaJHaT68iSwmfQfggktGC5lBkarvABAbS2BFdfp+0Uni1ERDA8f6wktfpcFLcygY5EDjmGEpXx+u60Pd+NQzFdx54kU6vnoH8I3iiQ2nQlR45T+mb1KMhkqSqCRIhUfG8SjRNTLudFfLDU7qUcf0SOtT/k/rlE9BulLb2Rr++qPZQBNVpFeNVQxWXnt8WkBoKvj63FJKxWzgqL/xqB4lXowj+8Mq1S7tYlkoFNquLjjY0S1KjQ1D3qePtlPIrOV9ahvfep42X3c3EiNCNB73InRrxJTkQ7w2MJy/iuCP5c/TLu1aM91SsCPyfQZO31ehaiYfUfQKNXFKqTRMTSQXiU9TSg0XzySK09amRvNNbGBiavvip0YiIg0NhDa7yIc2UL7n3zZ+ATP8qeLotvGTS15ZeuvBn8xffkpVfYeMUwFM1eMlTAVH87k+O+HgGOY0ZDvpScJJ4iP7mHHrqh9edWpbVWfTzPkc3r+LY/lDedvCW5URvZ1hmu+8YgXZi7Jh88GNJLm45HtUeA+/aa+MY6JyAaAER6vA0fxCREczi1cuJ0VkA4RcjWBaJ/gmyK7mHyJPOsd72DF7zGs8tj+8ZOjtjmz446xXn4bweByPlpXuV3Vm3JFeN0KT/QVs4ycATORqz+JROXUoH16ccDRSGR+pelZIuwFyOSletgLbC+DZUrxgUncXkD3D+Oyq/9X87La+6rlHq8tHLk20D9J3dvr02Pk78LuBaYcaiaCp5x9JxM+6fuT2TTUld6TXjfDKxz9ObvQfKTUHfzz/qXIAbSjlYiuFZppopkkmP4ytJi/PFrSAQgsoUlC8Cjq7WnuAGcZnl3/2yt4eTrQcPbsxzVJ74DNUJumJ5yZToX94eMtc4x8hFBGulF+jHY2KzqcemeCsq/pfeoHQ9fXj5vLdm75OpuoOtNGxYBlzi709W3sDkqdy89T7yYm2BxvVraGX3NtXffaqgaPsPPfo2Y1psvMP8UT/aERFtUIl7dsJTq8R/2OF6d+Hx9EjEdGJ4rbELWU1dxv0dJYvaB0PX9SHc6zv3uTWb378PJT6uGa4q70SbUaxs32aPktNuTdCLjXazmA2GTuzh+drnuDE/P2fafxh+Y9CSPAEemogNtox0UOPU6ms4K1gv1nl6B8KptaIT1ah/vEZbHA6whE9AjpR3NgsDDaqrGzuDXLXB0ouPdJVfnx/c3gmc8Z3zhuBj+9sDZYxN9sfnEuTeQm2U00y//1YORMEjBFG0r2lZe7BiSQv83j44NKnlw33c6zyyOyRGiaMNHaqv6F6eOhbfZFsRMXcQqlw4UuNt8uBTqlJ563Kf/9YQE5f89TNFSAWU65snh/kK/PK+PXOMoxQaFViodcZ2pklYJhUVYaYN2hwRnIyina0fIJdZWm0nNM0Vhsqxwz0hPpNAqaH542jpwYYvSYx9XMimJ68fzvA6fXof8i1/C7gDQiHNzdSlFKqUL/9ekdzxTBzynZW/dpHdiIrTSMV6kiTTdORAEfKBvXm1Oyi+9VTNayjkSGTGiPoJRgdnQByU8Xj1Hl+P1v9r8HbeW3/FXhTDn+zhpaFrFmDvmkTrtWshGgUVmRLeeEZE1yTUNAPpwYMc9XYIq2z6iUP28mRztqEzWxD6aj9hffhbvg2duHrEZgUkW9X+O+G8P8L4OmvfoZGkqAAAAAASUVORK5CYII=","phPicasaFav":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAnFBMVEX///8AAADgSj+RQZb/0k3gSj9Dh/3gSj+RQZZDh/1Dh/1Dh/3/0k0NqWBDh/2hQ4X/0k3gSj/gSj+RQZb/0k3/0k2RQZaRQZaRQZb3sErgSj+RQZb/0k2BT6vgSj/gSj9Dh/3/0k1Dh/2RQZaRQZZDh/3gSj9Dh/1Dh/0NqWANqWANqWANqWAomK8NqWD/0k1Dh/2RQZbgSj8NqWBhW4oYAAAAL3RSTlMAAK+AjzDP74+PQK/fQHBQEM9wr69AUL8gQEDvMFAQj4Bwn0CfIGDvMM+fcI9Ar6qiDDIAAACKSURBVHheZchFgsQwDAXR/g52qJmZcUZycv+7tWRnl9rV63UDEJlaMmsADtKBgDb0kFobjBN5E4YKFytdo1Fd3wuaCUwUAuwPyYpoKiC7mUMLicjBYglX0UJQPZ76W/Kwy5mPCqcWzswcow0CGUu3xlcKoC9Qvdy/oaASf/S/8IAs57+m+S8h0OkHd10UZIrhpCAAAAAASUVORK5CYII=","phPicasa48":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABgFBMVEXw7eLu7OCWtpfw4KnvyrvMarYNpPTp5tnpZEhhpXf+wxT/21H/ywO21bPJqraZ0ObEw7bl4dL9/fv8uCpYs93hUDrlqtT7sTnzpo722m3q6Nry7+X29ewJnerUcb3uh2z/0ycpp0XThXb6+fbo5dcAkzo4rEns6t3cicf/zgzam8bdRzPbecXz8ufepJXoytiWu8XlWkLd28v19Ors6tzztlQCmTn+1jv/0RjQbrrxdlXn5NXT0cMKnDzm3Mzl15tqwu3Merf+xwzYxpMeo0IumFjtbE4AjDzLjrjfunvhcl7y8enr6dzYdsLb1LTu1N/39u3s6dzx5rnls6PWdMDu58zm49T39vFzs34Il+H44Yf9vh7yyjG/2batzq2u0a/Y1sgQnj7W1cnR4uEWoD/efcg8tfT5+PLi39E8m2Hu7N/t69719O34+O+8zMnQzsLy5OA0n9EMm0E9pV/C3OGyvKnN38Hf3c/w2MnOub/gkMvj4NTIwa3LybrlmIL////ER32wAAAAgHRSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ADgFS2cAAAQtSURBVEjHfZb9Q9NGGMcvlPYQKDZRUO5KKyYs4looFJWSzg0EQXoVIpAi6NaJ2krqYC+Msa32X9/zXF4aLOP7az+fe5Lr89yFdHqi6Y10Ot0qFtM1vfdX8jXdKBbzGM45gVQa1wr6drHoCdwXFEVJa/8naJ/T6R7h2HXdxpWC1tje7gr9/V3BNLnWK2iffZ70380+fz4wMDe3md0xpLBgm/rXAvIonN5dWlpCHoS50dEZYqIgBKtdFgKeZ5cuCfeVvYM90xaMBQaJ8qe8+FcWeU8YBeH41fh4TApU7wo+P/ZhjBedbKQACkNDQwdSYFooNHz+Q+5vkqdfooKLwtABClQJBA1oj8/lHmzl+Zfwib4F4QlmHHhqtHxB8luSr1ZzW3myExQIhXsHwBtUk4KO2899fnc3M8v5TkS45+UVCEZFCrJ/xnKSr+5mMpkxzvsHJA9CDOnFxcUnIFhQgnQ05E9zwfqZTKn0kJOnm55gxhZlpqe/B8FqgdDwC1RDvhSfJUTdBB6FaS/DbxwQTBCQJ9VqhC/FL6DtzPuBMOzlpWU5jkY07M1ZiYf8RhkHwZyRwnCQcRRqREdhbLeLl+IjJ9Tr65m5EbsrvGmCUCENFB4g7S9fGjlxsQAMjnk+HxFW6o6j2iSNQogDf1GXvBycBVsEwsrKyksptHAYPRjw+PJFXQ6y5LGvYytBBp85quqQFozvbIDHl1PNS3wgDGJAcFRS5L4AeHyj3fQfJ+BZbNDL4eHhM1W1QIAKp3EvG23qLx/yLHYY5JYnVPBw8HjYTsQv8Z5wS6atqobAlyZk2ePNmx+PEI/wNObBdyAgUEFqBISHwF+8M39IJAoevhDwNHYnyKOy6hgVopM8US5gO98pwKOAy4c83XsUCC/qqgGt0VE4UehG6px+TKAQWV6OpfH0hZ9/mypTNdLJE3Ls/nN+JHkQFuxLvGE05/2oDqM4Dy53XfFHwksB8D/fyiQxP2F+hCThb6ZWBUdUIcTF900kJiYmCkLsfyMzObm6+v7n7x4/npqaWl9fX4MCQsUR7bSghHmENArsrY8HvC/01VVmKPIQ0KA7bftmVJjs4W+0VYM53jHTadj8WIjbyL8GYdLHo/yn1LkjHB4cldzkJqO3X0MKLCnxCA/C2tm8CpvWPYyFQgQz0CjQ5KqPd/lPZ/ACzNG7x73OFGIzoyCF90B7uM/fSMH6TG1FL5QaGCalv/xaMJJIh/jU+lpfG54/4MMrq0ZN4lLjvEyTHh3g+6kyNHXIdy9FndmKYkMnOPu//+bja/tnqXLTEoI6rSuuXYW6yjEzrGb9JNUHOUu1y/OqxUxhUf3Ki71FmQsHHjMcOE8wDtCmMOT+X/npoFUMKuQEYbMK6HSTWY6iXfNxorWYYzBmI2szaqm0ol3/NQNOrWILfCQhKjWt5+f/AAM5MD8cFZSNAAAAAElFTkSuQmCC","phGplusFav":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACSAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAVlJREFUeJylk7FKA0EQhr/Zu0IhR84X0EqwtEwjmMo0FkHSWPgEaYJYqCBYeY8SUl8RnyHYCr6CB8ba292x0F1zHkbEgyt2bvabf/6fE1XlP08KUBXFTVUUtwBnp0+Nhof9g6/mWnjergDY2Lu+2tw9vxNV5THPo4x1gORNqHaqeN46fhFRVXq9niZJgjHmV8nee5xzOOdYLBaSAmRZxl8A1lqstQAYgJ+MLMuSsizXAtMACK+IxI9hShiw2hdqaZDlvUdEvgEcQKypauz13jcVBMBsNlsB1ABMp9NYGw6HbYBzLk6pa7t255BACwCQJAn9/mFMYz6/B2AwOMJ7j6qS53mMMgKstdGYPM8xxiAi1PXHCuFSiDCoaCgIPhhjImC5fP1cq26Y11IQAKtmigij0QkA3W63lUCI0QCMx+NL51xDnrWWLMvodDqxFsxTVSaTyQWA/Pd3fgfj1BrwGE377wAAAABJRU5ErkJggg==","phGplus32":"data:image/png;base64,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","phFav":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIABmAQAAJgAAACAgAAAAACAAnAIAAIwBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAEtSURBVHicnZM9TsNAEIXfZDdlIqhoww0sBajNT0HpiAougS9g2TlBlCPQQAVxjy27RiDgAAg6FFGQLhJr71BgS5hdKyiv252Zb95odoEVmh8OvfdjZ9AW76wCEDozobqvH0e7k7UAtZjhzw/2orUBAEDE560AlcpQJeJTJZJVIh+LRHgWxoYVoFI5ASMCqE5wGDRTt9JtZDOeDMAywwAM3+4ZYaOeaGwAuqVwrMU/qhxwXhLvb6V3sdnDop0rzwWJEIDbf7lopWsmz9jC8PLEA4ms7s5A3koovp4NABE359ZszF3dT/No8818B0TO72Me9HKt9YirDTB4Ac3jLOj5ACAt8AX+7DsP+jGA2ObEdMA8tSW2yQDcn95ErPFviPUvPJxd+wWX20wYrQJ8Az4GaWy0/7WXAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACY0lEQVR4nMWXPW/TUBSGn2MnLCmVsxSxpb8AC8GMIxArDRISTG1/Ad0rRBjY6S9oOqAuoJQNgcC3K2XwH0B4hsVCiELt3MPQplI/Yt+0Vf2O955z3ud+nGsZapact8CPu7fXATzE5M297evvk/SyAfRIQeHV7yJ/MW+SzCXfOy/Acamy0mo04+9RGNQCsE9B2PKbw/oA9hX9jG5FdQIw8r2VWgE89EZVTOO0wfxjI0J4qqKhqHRAM5BE0EHj3mhjCoZOVcCRNtSYoBg1hkA0OUFTa73elft5Aifb8JiyuU877TKAwyPQmKAoGnGZOYAiHfE03vvQDMviDpRUBRwCFLbxHMGlKEDgeXaoMUFZkCIDJ4DdmA7KiqP5uHjnX9FcmjivpNc+fam8Lx6An/vRNOZj+aIPJrhnYum51PAAtOLcSxSe9CbFSnfO7CQuBU5twykUHLhmCAnI1h/b2pg3JnMtMNXXMFxfCPyWvyiWBYVQIJj9Ns2zcMR68Hm1tey8A+HrR6Hv26HY/cdlTK6QCeXdUCanp/jAPJbTX7bkLMZW1DgD+L4dTlqlKO/OAsBevu0EcHPz4dKElQNgi3ygkE7jrVbXTL+dOgF4Iotl86bfzhR6CpmTOSQ6KvqH9R1ywqoAszqTKHSrdkIVo3neNf12Nh5z6YLAIQazOpMA89HLX0ui3iKioSABkKKSWLVr5tlVczyvEkAhLbsDJ0FmB8DANb76CPRsbXZhAIKs1Qrw9ckbA5jaAACK3VEP1aQ2gGR5Kyv+2q5aLvw4pv43DDcXOh5e5IvcAdh5/Hb5oqEuVf8BTrjb/IGDWNcAAAAASUVORK5CYII=","phIcon2020":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACq0lEQVR4Ae2XAWQbURjHj2YEARRBUABaIHfpAK/JgMKWtGIgAyAIIIAETWeDACAYMktaAAguMxyCIIACDodwNWF32VjK2/+jHotok3sf26t+/CVI3O+X773vvVjP9dQrLDkNxA9LBQ+vvdtXhVNfiLRJAnJDAgjVpBApQwVURqE4zBgsgBSdG5IwVEBlRMvJZAGkUDNaAAloOpksIGnEGi2A9AwXKHjsAPKblbkb71V/j1/0V+PUBO99Ct57eO3duXun+EyaqQM+J3ga0A2ALhD5SALI1PCdlKZAwAWfBdQUkTtmRB3TEJhwwOcAMkdkonxN3ZBEoilUcvra6x0Qs6Twa51IJehAVUsAv16LADhCe2JHgQXdiXTXfYRIpgQ0CHYQaFg6hYlTZwJXoRG7JfxU+xqBB7rsAjgntoCfh8LJWrpFLUckc7xH4GffxXHO4ihecNUBfzN4Ibot2i3WPzIrN9XlFkD+OmUx592wZNdZlgx3HV6fZ5xBuWoPKn1nWJnkhxXfHlZksROzp9SJG2zg4tO7NIAbgF0gcj288CoBC7xzfZ4F5FQBbxK4iOf8HYj070zHn8s5AM4R+VBOOkuPWwDpa693wM0ehldLqMnegYtI785kX5Vb28BTxPtfB3joilFgIdphRnfdR9sKWKjiZdz9byYQxmSdwHYREO0f+3i4zwA/FW2Z1hIAlLurAJXoREfFzjJKLIBpJj7G+gegfVUJkggoCXQiwS8/Ex9+8tyZCCqpgFpO2BPbbexlhLS0Ni2zgKr76dSkc2LtsAtOLmMXh1V9fclwCcwZBP5d2YOyZ7RAfnDWNFrg5eD1AcBWZgqofXDWNVog/+XtPv1hMVNAdeHNEQAjUwWUBHXCVAG1nO73xMo4gfXpRCOWzgl12EHMeuL1XH8Axh6xGu6zB5YAAAAASUVORK5CYII=","phIcon":"data:image/png;base64,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","phFav2015":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIAD1AQAAJgAAACAgAAAAACAAbAQAABsCAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAG8SURBVHictZFPSFRRFMa/e988wxyLFmERgUO2czG7hAZyF+JCCFsFUbmwttWmEt7CpUS76A8yRbZQV+ZKmCjyQdMiUKJlQ+RYYQj5pxnnvnvP1yJHmt4bkqDf5sL9zvnuPd8B/jels6cnGAS6md5UqMPInSu9K+abmfzVAABgo/OlxXA8ySTV8BoDXZmbGU6tVI5oawCSn2a3RecuvH39vgDgaaIBGWgTPplsbY8GN1axsE+qWVB2CpfKHeHa+t5DiSOQgd56+Xi6xasNAoL0UZfd0KkFaB/K81D+fDBcW92To5CJI1TnH021+uYMBFAAoIC2Tj+72XJpKTrZZdcXX+RIC4iLxaP+vDj2cGjUeBxJQeF6d+9HlHs592F/xlJDCJD4dQofFG61D8dSdb6q0SMybZWiqc12Tr/6kfm+/PWNdQ6y3Szk/cLN9OWdDBq+5EOO+9Vi3+GtHsDAWCKy7kSl/KVI5wDhvec30legFBu2UOfUgc3l7nStRysBtAIiO2Kt8Y0A+LZyN7zTNVFvTsyAhLodDoxrjYsgcTX3LFbzO/ERFHgtNzMkInkitrXdQ0KNzffn/91hl/wEYcHPjAjvm7AAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAQzSURBVHicxZbPTxtHFMe/Mzu7tsEQKD/WqCCi0PxArUpVWlOVCuUSqSRqbjn2WvWQQ6tcKlX5Fyr12HOKKuWYSy+tmkYFFeiPkATbAhWB61+BBmJ7sb2/5vWwa0AxNsaO2mfNwTvz3vfz3pvZWeB/NtZuALp7QwHgtgxAd2+0BbD+XT4XiIyNA9hrxV8kf+pvC0CRu7qZXY8Hhs63BMHbUgcAxqAQ6WZ2PQ6g978H8E2RUjczp4cQL0WdeXtZIVevpNfiWu/wJQDPmwKQpdJLYfBJICB1a28rofWONgVxYgVGv+zutlfWRkjapFUfSocAwFJtSn/bWRtUQrf+2UxkjLNnAVQaAmxu1p985+vCoJ17EJNEm0GzMgkiAASQBEAIVAjA28f6ptKR9bLZqQPYagiwv12bAQDMzG0MaIVETBOyTw6hr5BUV7odc8KDaGBESKYj88Vn2gci3HgpUOcUzMxtDAT3Y3FNdfvACIwTOodposi1lXqi1eoks/p84Zk2fbJ0HYCZuY2BoPEkripuH0gCRGCMwBVCxwhNFCFWvDb47Thif2f1+cJOsGnxGoCZO6v9odLjmCrcPi84AZAAJBgncEHoGMVEwVUfAQTSesHDXQCATG5wPr8TnAaRz3ZCq14EmLmz2h8qJ+KCyX4vMaoZjBO4CnSew5tFrj10h2cRnIwindUXdrc98dOaAIBrsR3FepCIKxz9JP0grM5FSQRoZxCY/PCtSuSmGXg1SB2p7983fngIe884zJ4I0nROJGL3zn3ScMHtL8Tru6z05EAfQI8WxpXhN3Bz4lqFrC669xsLLW8pMEwcFO+A45j/0nFS0/aZUQBS/P7xNw0B1NBnDpP8QJwByKOEP3M/L68O2u8++uMj/PjYWgy8MjgFRQEDaygO6aYc2xy/j20JAOI+thsCSCEdcvzs/R6PqfbSbMSKJo1lLMSuwLYw5eYyS6HBoSiEqNs+Jt2UbVfGARjVZ03dhkTkDV/8aqQcFQpgu0UUyl52jmTR8tPsknQcSEk12UM6NeJNAZhmxT+MhDHVWroaKUcVQeBcgrHqfvMqYxOL7mcyS9J1QFUIVMXNGvGmKyBJ4kKg8mtVXIEvjsPKVDN2GY/up7KL5DrenFtfvCkAy3XoQsBemI2Y7wnFEwf3xHFE+Gi5JWdTxtPUom3a6UbiQBPX8afjPVnXXhvjTAVnBPDDDUYgsILxGlxTuE6JA4BjS2JcJUXtkH+pRgpAuVF8Nvx58iQG3Lp+u8dRdhJC0fQjna2+btv6tGdf/XK9uYV2b4+jbCcUruoH+v5UOwC89o1//JDq3nPXDF+UsHKH92Cz3vUHP81iNVTJO+WuS5KsnH8G2v7x0zqIUDnvVnyI6odIG0O0dIUGS/likV0Mh2T81M4vxiJHtuQYDrGCcTk60jaAcTnajn9r9EfsX3BSvG30plZdAAAAAElFTkSuQmCC"}; } return ugfDocsArt.a; } function ugfDocsEsc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } // Which of the editors this is: Docs (/document) or Sheets (/spreadsheets). Both // are the same Google editor frame underneath, so one module dresses both; what // differs (names, icons, the toolbar, the sheet tabs) goes by this. function ugfDocsApp() { const p = window.location.pathname || ""; return /^\/spreadsheets(\/|$)/.test(p) ? "sheets" : /^\/presentation(\/|$)/.test(p) ? "slides" : /^\/forms(\/|$)/.test(p) ? "forms" : /^\/drawings(\/|$)/.test(p) ? "drawings" : "docs"; } // Google Drawings (April 2010 on) is Slides' editor underneath, without the slides function ugfDocsIsDrawings() { return ugfDocsApp() === "drawings"; } function ugfDocsIsSlides() { return ugfDocsApp() === "slides"; } function ugfDocsIsSheets() { return ugfDocsApp() === "sheets"; } // the words that change between the two function ugfDocsWords() { if (ugfDocsIsDrawings()) { return { path: "drawings", app: "Drawings", product: "Google Drawings", noun: "drawing", nouns: "drawings", Noun: "Drawing", on: "UGF_DRAWINGS_ON" }; } if (ugfDocsApp() === "forms") { return { path: "forms", app: "Forms", product: "Google Forms", noun: "form", nouns: "forms", Noun: "Form", on: "UGF_FORMS_ON" }; } if (ugfDocsIsSlides()) { return { path: "presentation", app: "Slides", product: "Google Slides", noun: "presentation", nouns: "presentations", Noun: "Presentation", on: "UGF_SLIDES_ON" }; } return ugfDocsIsSheets() ? { path: "spreadsheets", app: "Sheets", product: "Google Sheets", noun: "spreadsheet", nouns: "spreadsheets", Noun: "Spreadsheet", on: "UGF_SHEETS_ON" } : { path: "document", app: "Docs", product: "Google Docs", noun: "document", nouns: "documents", Noun: "Document", on: "UGF_DOCS_ON" }; } // where on docs.google.com we are: the list, a document, or somewhere Gplex leaves alone function ugfDocsPlace() { const p = window.location.pathname || "/"; // Forms: the list, the form being made, and the form as the people filling it in see it if (/^\/forms(\/|$)/.test(p)) { if (/^\/forms(\/u\/\d+)?\/d\/(e\/)?[\w-]{20,}\/(viewform|formResponse|closedform)\b/.test(p)) { return "viewform"; } if (/^\/forms(\/u\/\d+)?\/d\/[\w-]{20,}\/edit\b/.test(p) || /^\/forms(\/u\/\d+)?\/create\b/.test(p)) { return "editor"; } if (/^\/forms(\/u\/\d+)?\/?$/.test(p)) { return "home"; } return ""; } // Drawings never had a list of its own (they lived in the Docs list, then Drive): // only its editor is dressed if (/^\/drawings(\/|$)/.test(p)) { if (/^\/drawings(\/u\/\d+)?\/create\b/.test(p) || (/^\/drawings(\/u\/\d+)?\/d\/[\w-]{20,}\/edit\b/.test(p) && !/\/(pub|preview|export|copy|embed|image)\b/.test(p))) { return "editor"; } return ""; } const k = "(document|spreadsheets|presentation)"; // a new document opens on /create and becomes /d//edit in place if (new RegExp("^\\/" + k + "(\\/u\\/\\d+)?\\/create\\b").test(p)) { return "editor"; } if (new RegExp("^\\/" + k + "(\\/u\\/\\d+)?\\/d\\/[\\w-]{20,}").test(p)) { // printing, publishing, the plain viewers and embeds stay Google's // (and a slideshow being given) if (/\/(pub|pubhtml|preview|mobilebasic|htmlview|htmlembed|htmlpresent|export|copy|template|gviz|embed|present)\b/.test(p)) { return ""; } return "editor"; } if (new RegExp("^\\/" + k + "(\\/u\\/\\d+)?\\/?$").test(p)) { return "home"; } return ""; } function ugfDocsWanted() { if (window.location.host !== "docs.google.com" || !ugfNtTopFrame()) { return false; } if (!ugfDocsPlace()) { return false; } return ugfNtOn(ugfDocsWords().on); } // Google Docs by period: // d2007 Google Docs & Spreadsheets (to the end of 2007; Docs did not exist before // late 2006, so the earlier layouts get the first one there was) // d2009 Google Docs 2008 - early 2010: the blue documents list, the first editor // d2010 the new editor of April 2010 and the documents list of 2010-2011 // d2011 the Kennedy look of autumn 2011, kept through 2013 // d2014 the coloured app square in the header (late 2013) and the 2014 home screen // d2017 the Material editor and template gallery of 2016-2018 // d2019 the Google Material theme of 2018 on function ugfDocsEra() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "d2019"; } if (l === "2017" || l === "2018" || l === "2018M") { return "d2017"; } if (["2014", "2015", "2015L", "2016", "2016C", "2016L"].indexOf(l) > -1) { return "d2014"; } if (["2011", "2012", "2013", "2013L"].indexOf(l) > -1) { return "d2011"; } if (l === "2010" || l === "2010N") { return "d2010"; } if (l === "2009" || l === "2009L") { return "d2009"; } return "d2007"; } // the tab icon Docs had in each period function ugfDocsFav(era) { const A = ugfDocsArt(); const l = String(layout || ""); if (ugfDocsIsDrawings()) { // the page and pencil of April 2010, the flat yellow of the Kennedy period, // the red of the 2012 Drive icons, and the rounded red square from 2016 // (which Drawings kept: it never got a 2020 icon) if (era === "d2017" || era === "d2019" || ["2016", "2016C", "2016L"].indexOf(l) > -1) { return A.dFav2016; } if (era === "d2014" || (era === "d2011" && (l === "2013" || l === "2013L"))) { return A.dFav2013; } return era === "d2011" ? A.dFav2011 : A.dFav2010; } if (ugfDocsApp() === "forms") { if (l === "2022") { return A.fFav2020; } if (era === "d2007" || era === "d2009" || era === "d2010" || (era === "d2011" && l === "2011")) { return A.fFav2008; } return era === "d2011" ? A.fFav2012 : A.fFav2014; } if (ugfDocsIsSlides()) { if (era === "d2019") { return l === "2022" ? A.pFav2020 : A.pFav2016; } return { d2017: A.pFav2016, d2014: A.pFav2014, d2011: (l === "2013" || l === "2013L") ? A.pFav2012 : A.pFav2011, d2010: A.pFav2010, d2009: A.pFav2007, d2007: A.pFav2007 }[era] || A.pFav2014; } if (ugfDocsIsSheets()) { if (era === "d2019") { return l === "2022" ? A.sFav2020 : A.sFav2016; } return { d2017: A.sFav2016, d2014: A.sFav2014, d2011: (l === "2013" || l === "2013L") ? A.sFav2014 : A.sFav2011, d2010: A.sFav2010, d2009: A.sFav2008, d2007: A.sFav2008 }[era] || A.sFav2014; } if (era === "d2019") { return l === "2022" ? A.fav2020 : A.fav2016; } return { d2017: A.fav2016, d2014: A.fav2014, d2011: A.fav2011, d2010: A.fav2010, d2009: A.fav2008, d2007: A.fav2007 }[era] || A.fav2014; } function ugfDocsWho() { return ugfCalWho(); } function ugfDocsBase() { const m = (window.location.pathname || "").match(/^\/(?:document|spreadsheets|presentation|forms|drawings)(\/u\/\d+)?/); return "https://docs.google.com/" + ugfDocsWords().path + (m && m[1] ? m[1] : "/u/0"); } // Start Gplex for Docs now, or as soon as Google's page moves to an address it // handles (Docs changes its address without reloading, e.g. while making a new document) function ugfDocsStart() { if (ugfDocsWanted()) { ugfDocsMain(); return; } if (window.location.host !== "docs.google.com" || !ugfNtTopFrame() || !ugfNtOn(ugfDocsWords().on)) { return; } const t = setInterval(function() { if (ugfDocsWanted()) { clearInterval(t); ugfDocsMain(); } }, 400); } function ugfDocsMain() { // Drawings began with the new editor of April 2010: the layouts before that get // the first Drawings there was const era = ugfDocsIsDrawings() && (ugfDocsEra() === "d2007" || ugfDocsEra() === "d2009") ? "d2010" : ugfDocsEra(); const place = ugfDocsPlace(); console.log("[Gplex] " + ugfDocsWords().app + ": layout " + layout + " (" + era + ", " + place + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); const fav = ugfDocsFav(era); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); if (ugfDocsApp() === "forms") { if (place === "viewform") { ugfFormsView(ugfFormsEra()); } else if (place === "editor") { ugfFormsFullEditor(ugfFeKind()); } else { // There was no Forms list before February 2016: forms lived in Drive. For // 2014 to late 2015 that is the new Drive of 2014, which Gplex draws on // drive.google.com, so go there with Drive's own "Forms" filter. (Drawing // the list here gave the 2012 Drive under a 2015 header.) Late 2012-2013 // keeps the stand-in below, which is the Drive of that time. const l = String(layout || ""); const newDrive = era === "d2014" && (["2014", "2015", "2015L"].indexOf(l) > -1 || UGF_LATE2015); if (newDrive && ugfNtOn("UGF_DRIVE_ON")) { const au = ((window.location.pathname || "").match(/\/u\/(\d+)(\/|$)/) || ["", "0"])[1]; window.location.replace("https://drive.google.com/drive/u/" + au + "/search?q=" + encodeURIComponent("type:form")); return; } ugfDocsHome(newDrive ? "d2011" : era); } return; } if (place === "editor") { ugfDocsEditor(era); } else { ugfDocsHome(era); } } // ---- the editor: Google's own, in the period's clothes -------------------------- // Toolbar icon per period: [left, top] in that period's sprite, keyed by the name // Google gives the icon today (docs-icon--20) function ugfDocsIconMap(era) { if (era === "d2007" || era === "d2009") { // the Closure editor toolbar Docs used until April 2010 return { size: 16, sprite: "editortoolbar", map: { "undo": [0, 0], "redo": [16, 0], "bold": [32, 0], "italic": [48, 0], "underline": [64, 0], "text-color": [80, 0], "format-ink-highlighter": [96, 0], "image-type": [112, 0], "indent": [128, 0], "outdent": [144, 0], "list-bullet": [160, 0], "list-number": [176, 0], "align-left": [192, 0], "align-center": [208, 0], "align-right": [224, 0], "align-justify": [480, 0], "format-clear": [256, 0], "spellcheck": [272, 0], // Sheets: the bucket and the struck "ABC" are on this sheet; the printer, the // borders grid and the chart come from the Docs sheet of 2010 "fill-color": [320, 0], "strikethrough": [544, 0], "print": [16, 0, "icons8"], "border-all": [624, 0, "icons8"], "insert-chart": [656, 0, "icons8"], // Slides: the text box, the shapes and the line of the 2010 sheet "insert-text": [528, 0, "icons8"], "shapes": [544, 0, "icons8"], "add-comment": [640, 0, "icons8"] } }; } if (era === "d2010") { // the icons of the April 2010 editor return { size: 16, sprite: "icons8", map: { "print": [16, 0], "undo": [32, 0], "redo": [48, 0], "paint-format": [976, 0], "bold": [256, 0], "italic": [272, 0], "underline": [496, 0], "text-color": [288, 0], "format-ink-highlighter": [512, 0], "link": [864, 0], "add-comment": [640, 0], "image-type": [224, 0], "align-left": [304, 0], "align-center": [320, 0], "align-right": [336, 0], "align-justify": [352, 0], "line-spacing": [480, 0], "list-number": [416, 0], "list-bullet": [432, 0], "indent": [448, 0], "outdent": [464, 0], "format-clear": [848, 0], "spellcheck": [832, 0], "fill-color": [592, 0], "strikethrough": [832, 0], "border-all": [624, 0], "insert-chart": [656, 0], "insert-text": [528, 0], "shapes": [544, 0] } }; } // Kennedy and after: Google's single-colour icon sheet of the time const j = { "print": 1618, "undo": 378, "redo": 630, "paint-format": 924, "bold": 798, "italic": 693, "underline": 1134, "text-color": 337, "format-ink-highlighter": 1764, "link": 2268, "add-comment": 1828, "image-type": 294, "align-left": 315, "align-center": 105, "align-right": 1974, "align-justify": 2205, "line-spacing": 2122, "list-number": 442, "list-bullet": 1848, "outdent": 1470, "indent": 1449, "format-clear": 2059, // Sheets' own, on the same sheet "fill-color": 1260, "border-all": 126, "cell-merge": 1743, "format-text-overflow": 1573, "format-text-wrap": 1573, "format-text-clip": 1573, "filter-alt": 1386, "function": 2225, "insert-function": 2225, "insert-chart": 1953, "valign-bottom": 1008, "valign-middle": 1890, "valign-top": 1931, // Slides' own "arrow-selector-tool": 503, "insert-text": 903, "shapes": 2036, "line-style": 1218, "zoom-in": 545, "add": 2100 }; const map = {}; Object.keys(j).forEach(function(k) { map[k] = [0, j[k]]; }); return { size: 21, sprite: "jfk", map: map }; } // which of Google's toolbar buttons the period had, by icon name; the rest are hidden function ugfDocsToolbarKeep(era) { const base = ["undo", "redo", "bold", "italic", "underline", "text-color", "format-ink-highlighter", "list-number", "list-bullet", "indent", "outdent", "align-left", "align-center", "align-right", "align-justify"]; if (era === "d2007" || era === "d2009") { return base.concat(["format-clear", "spellcheck", "image-type"]); } if (era === "d2010") { return base.concat(["print", "paint-format", "link", "line-spacing", "format-clear"]); } if (era === "d2011") { return base.concat(["print", "paint-format", "link", "image-type", "line-spacing", "format-clear"]); } return base.concat(["print", "paint-format", "link", "add-comment", "image-type", "line-spacing", "format-clear"] .concat(era === "d2019" ? ["spellcheck", "checklist"] : [])); } // Sheets' toolbar, by the button's own id (t-bold, t-num-fmt-currency...): what the // period had. Anything newer is hidden. function ugfSheetsKey(btn) { const id = btn.id || ""; if (/docs-font-family/.test(id)) { return "font"; } if (/fontSize/i.test(id)) { return "size"; } const m = id.match(/^t-(.+)$/); if (!m) { return ""; } return ({ "num-fmt-currency": "currency", "num-fmt-percent": "percent", "num-fmt-decimal-decrease": "decimal", "num-fmt-decimal-increase": "decimal", "num-fmt-other": "numfmt", "merge-button": "merge", "merge-menu": "merge", "autofilter-toggle": "filter", "autofilter-menu": "filter", "cell-color": "fill", "textwrap": "wrap", "text-rotation": "rotation", "formula": "functions", "insert-chart": "chart", "insert-doco": "comment", "insert-link": "link", "paintformat": "paint-format" })[m[1]] || m[1]; } function ugfSheetsToolbarKeep(era) { const base = ["undo", "redo", "currency", "percent", "numfmt", "size", "bold", "strikethrough", "text-color", "fill", "border", "align", "functions"]; if (era === "d2007" || era === "d2009") { return base.concat(["print", "wrap", "merge"]); } if (era === "d2010") { return base.concat(["print", "italic", "wrap", "merge", "chart", "filter"]); } if (era === "d2011") { return base.concat(["print", "paint-format", "italic", "wrap", "merge", "chart", "filter", "comment"]); } const y2014 = base.concat(["print", "paint-format", "italic", "decimal", "font", "valign", "wrap", "merge", "comment", "chart", "filter"]); if (era === "d2014") { return y2014; } return y2014.concat(["zoom", "link", "rotation"]); } // Slides' toolbar, by the button's id (undoButton, newSlideButton, zoomSelect...) function ugfSlidesKey(btn) { const id = btn.id || ""; if (/docs-font-family/.test(id)) { return "font"; } if (/fontSize/i.test(id)) { return "size"; } if (id === "zoomSelect") { return "zoom"; } const m = id.match(/^([a-z][A-Za-z]*?)(Menu)?Button$/); return m ? m[1] : ""; } function ugfSlidesToolbarKeep(era) { const base = ["newSlide", "undo", "redo", "select", "textbox", "image", "insertImage", "shape", "line", "bold", "italic", "underline", "textColor", "fillColor", "lineColor", "lineWidth", "lineDashing", "align", "numberedListPreset", "bulletedListPreset", "indent", "outdent", "font", "size", "insertLink", "zoom", "more"]; if (era === "d2007" || era === "d2009") { return base; } if (era === "d2010") { return base.concat(["print", "insertComment", "lineSpacing"]); } const kennedy = base.concat(["print", "paintFormat", "insertComment", "lineSpacing", "clearFormatting", "bgColor", "slideLayout", "slideTheme", "slideTransition"]); if (era === "d2011" || era === "d2014") { return kennedy; } return kennedy.concat(["formatOptions", "animation"]); } // the save state, in the words of the period function ugfDocsSavedText(era, state, since) { const ago = function() { const s = Math.max(0, Math.round((Date.now() - since) / 1000)); if (s < 60) { return "seconds ago"; } const m = Math.round(s / 60); if (m < 60) { return m + (m === 1 ? " minute ago" : " minutes ago"); } const h = Math.round(m / 60); return h + (h === 1 ? " hour ago" : " hours ago"); }; if (state === "saving") { return era === "d2007" || era === "d2009" ? "Saving..." : "Saving..."; } if (state === "offline") { return era === "d2019" || era === "d2017" ? "Trying to connect..." : "Trying to connect..."; } if (era === "d2007") { return "Saved " + ago(); } if (era === "d2009") { return "Saved " + ago(); } if (era === "d2010") { return "Saved " + ago(); } if (era === "d2011") { return "All changes saved"; } if (era === "d2014" || era === "d2017") { return "All changes saved in Drive"; } return "Last edit was " + ago(); } function ugfDocsEditor(era) { const A = ugfDocsArt(); const esc = ugfDocsEsc; const l = String(layout || ""); const html = document.documentElement; const sheets = ugfDocsIsSheets(); const slides = ugfDocsIsSlides(); // Drawings is Slides' editor (Punch) with one canvas and no slides const drawings = ugfDocsIsDrawings(); const punch = slides || drawings; html.setAttribute("gplex-docs", era); html.setAttribute("gplex-docs-layout", l); html.setAttribute("gplex-docs-app", ugfDocsApp()); const style = document.createElement("style"); style.id = "ugf-docs-styles"; style.textContent = ugfDocsEditorCss(era, A).concat(sheets ? ugfSheetsEditorCss(era, A) : []).concat(punch ? ugfSlidesEditorCss(era, A, ugfDocsApp()) : []).join("\n") + "\n" + // the account menu (the same one as Gmail's), above the editor ugfMapsMenuCss() + "\n" + "html[gplex-docs] #ugf-gmail-accfence { position: fixed; inset: 0; z-index: 2147483600 !important; }\n" + "html[gplex-docs] #ugf-gmail-accmenu, html[gplex-docs] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; letter-spacing: normal; }\n" + "html[gplex-docs] #ugf-gmail-accmenu a, html[gplex-docs] #ugf-gmail-appsmenu a { text-decoration: none; }\n" + "html[gplex-docs] #ugf-docs-acct .me { cursor: pointer; }\n" + // the holding screen: white, with Gplex's Gmail spinner, over Google's page while // it is dressed and its pop-ups are shut (the page keeps its size underneath, so // the editor lays itself out as normal) "#ugf-docs-loading { position: fixed; inset: 0; background: #fff; display: flex; align-items: center; justify-content: center; z-index: 2147483646; }\n" + "#ugf-docs-loading i { width: 28px; height: 28px; border: 3px solid #e8eaed; border-top-color: #9aa0a6; border-radius: 50%; display: block; animation: ugfDocsSpin .8s linear infinite; }\n" + "@keyframes ugfDocsSpin { to { transform: rotate(360deg); } }"; (document.head || document.documentElement).appendChild(style); // cover the page until it is dressed const loadStart = Date.now(); if (!document.getElementById("ugf-docs-loading")) { const veil = document.createElement("div"); veil.id = "ugf-docs-loading"; veil.innerHTML = trusted_policy.createHTML(""); (document.body || document.documentElement).appendChild(veil); } // a new file is where Google puts up its welcome pop-ups: wait a little longer for them const fresh = /\/create\b/.test(window.location.pathname) || /^(Untitled (document|spreadsheet|presentation|drawing))/.test(document.title || ""); let lastAi = 0; let placed = false; const giveKeys = function() { const a = document.activeElement; if (a && a !== document.body && a !== document.documentElement) { return; } const f = document.querySelector(".docs-texteventtarget-iframe"); if (!f) { return; } try { f.contentWindow.focus(); const t = f.contentDocument && (f.contentDocument.querySelector("[contenteditable='true']") || f.contentDocument.body); if (t) { t.focus(); } } catch (e) {} }; const veilCheck = setInterval(function() { const now = Date.now(); const aiUp = [].some.call(document.querySelectorAll("[role='dialog'], [role='alertdialog'], .modal-dialog"), function(d) { return d.offsetWidth > 0 && !d.hasAttribute("ugf-ai-dlg") && /\bGemini\b|start creating|Ready to create|Nano Banana/i.test((d.textContent || "").slice(0, 1500)); }); if (aiUp) { lastAi = now; } // ready once the header is dressed and the document itself is on the page (a // page of the document, the grid, the slide): not the page's whole "load", // which on Google can take many seconds of background fetching const body = document.querySelector(".kix-appview-editor .kix-page, .kix-page-paginated, .kix-rotatingtilemanager, #waffle-grid-container, .grid-container canvas, #filmstrip .punch-filmstrip-thumbnail, #workspace-container svg" + (drawings ? ", #canvas-container, #workspace-container, #docs-editor-container #docs-editor" : "")); const ready = placed && document.readyState !== "loading" && !!body && body.getBoundingClientRect().height > 0; const wait = fresh ? 2200 : 700; if ((ready && now - loadStart > wait && now - lastAi > 500) || now - loadStart > 8000) { clearInterval(veilCheck); const v = document.getElementById("ugf-docs-loading"); if (v) { v.remove(); } // and the one put up before the page was drawn const e = document.getElementById("ugf-early-veil"); if (e) { e.remove(); } // the keyboard back to the editor, if Google's page lost it while covered setTimeout(giveKeys, 50); } }, 100); const who = ugfDocsWho(); // before 2014 a spreadsheet's way home was the Docs list // a drawing's way home: the Docs list to 2013, Drive after (there was never a Drawings list) const home = drawings ? (["d2007", "d2009", "d2010", "d2011"].indexOf(era) > -1 ? "https://docs.google.com/document/u/0/" : "https://drive.google.com/") : ((sheets || slides) && ["d2007", "d2009", "d2010", "d2011"].indexOf(era) > -1 ? "https://docs.google.com/document/u/0" : ugfDocsBase()) + "/"; // what goes into Google's header, per period const logo = function() { if (era === "d2007") { return ''; } if (era === "d2009") { // the spreadsheets of 2008-2010 still carried the "Google Docs BETA" mark return ''; } if (era === "d2010") { return ''; } // the app's square beside the title came with Drive in April 2012 if (era === "d2014" || (era === "d2011" && (l === "2013" || l === "2013L"))) { return ''; } if (era === "d2017" || era === "d2019") { return ''; } return ""; }; const account = function() { const signedIn = !!(who.email || who.name); if (era === "d2007" || era === "d2009") { return '"; } if (era === "d2010" || era === "d2011" || era === "d2014") { return '"; } return '
' + (signedIn ? '' + ugfGmailAvatar() + "" : '') + "
"; }; let saveState = "saved"; let savedAt = Date.now(); const saved = function() { return '' + esc(ugfDocsSavedText(era, saveState, savedAt)) + ""; }; // the Google bar across the top, as the layout's own pages had it const gbar = function() { if (l === "2007") { return ugfNtGbar("classic", ugfDocsLabel(), "2007"); } if (l === "2009" || l === "2009L") { return ugfNtGbar("classic", ugfDocsLabel(), "2009"); } if (l === "2010N") { return ugfNtGbar("classic", ugfDocsLabel(), "2010"); } if (l === "2012" || l === "2013" || l === "2013L") { return ugfNtGbar("dark", ugfDocsHere(), "2011"); } return ""; }; const place = function() { const titlebar = document.getElementById("docs-titlebar"); const header = document.getElementById("docs-header"); if (!titlebar || !header) { return false; } const chrome = document.getElementById("docs-chrome"); if (chrome && gbar() && !document.getElementById("ugf-docs-gbar")) { const g = document.createElement("div"); g.id = "ugf-docs-gbar"; g.innerHTML = trusted_policy.createHTML(gbar()); chrome.insertBefore(g, chrome.firstChild); html.setAttribute("gplex-docs-gbar", ""); relaid = 0; relayout(); } if (!document.getElementById("ugf-docs-logo") && logo()) { const wrap = document.createElement("div"); wrap.innerHTML = trusted_policy.createHTML(logo()); header.insertBefore(wrap.firstChild, header.firstChild); } if (!document.getElementById("ugf-docs-acct")) { const wrap = document.createElement("div"); wrap.innerHTML = trusted_policy.createHTML(account()); header.appendChild(wrap.firstChild); } if (!document.getElementById("ugf-docs-saved")) { const wrap = document.createElement("div"); wrap.innerHTML = trusted_policy.createHTML(saved()); const bars = document.getElementById("docs-menubars"); // the save state sat after the menus from 2011, and by the title before if ((era === "d2011" || era === "d2014" || era === "d2017" || era === "d2019") && bars) { bars.appendChild(wrap.firstChild); } else { // on the title's own row, after it const outer = titlebar.querySelector(".docs-title-outer"); (outer || titlebar).appendChild(wrap.firstChild); } } return true; }; // Google's save badge tells us when it is saving; the period's words follow it const watchSave = function() { const el = document.getElementById("docs-save-indicator-container") || document.getElementById("docs-save-indicator-badge"); const out = document.getElementById("ugf-docs-saved"); if (!out) { return; } let state = "saved"; if (el) { const t = ((el.getAttribute("aria-label") || "") + " " + (el.textContent || "") + " " + ((el.querySelector("[aria-label]") || {}).getAttribute ? el.querySelector("[aria-label]").getAttribute("aria-label") : "") + " " + ((el.querySelector("[data-tooltip]") || {}).getAttribute ? el.querySelector("[data-tooltip]").getAttribute("data-tooltip") : "")).toLowerCase(); if (/saving/.test(t)) { state = "saving"; } else if (/offline|connect|reconnect/.test(t)) { state = "offline"; } } if (state === "saving" && saveState !== "saving") { saveState = "saving"; } else if (state !== "saving" && saveState === "saving") { saveState = state; savedAt = Date.now(); } else { saveState = state === "offline" ? "offline" : saveState === "offline" ? "saved" : saveState; } const text = ugfDocsSavedText(era, saveState, savedAt); if (out.textContent !== text) { out.textContent = text; } }; // the toolbar: mark the buttons the period did not have, so they are hidden const keep = drawings ? null : slides ? ugfSlidesToolbarKeep(era) : sheets ? ugfSheetsToolbarKeep(era) : ugfDocsToolbarKeep(era); // Drawings' toolbar is almost all drawing tools (lines, shapes, arrows, word art, // arrange, rotate...), which it had from the start: rather than a list of what to // keep, only what came later goes const drawingsLater = ["formatOptions", "animation", "slideTransition", "slideLayout", "slideTheme", "newSlide", "viewMode"] .concat(era === "d2010" ? ["paintFormat", "clearFormatting", "insertComment"] : []); const tidySheets = function() { document.querySelectorAll(".docs-main-toolbars .goog-toolbar-button, .docs-main-toolbars .goog-toolbar-menu-button, .docs-main-toolbars .goog-toolbar-combo-button, .docs-main-toolbars .goog-toolbar-toggle-button").forEach(function(btn) { if (btn.hasAttribute("ugf-seen")) { return; } const key = punch ? ugfSlidesKey(btn) : ugfSheetsKey(btn); btn.setAttribute("ugf-seen", ""); btn.setAttribute("ugf-icon", key); // (a Drawings control Gplex cannot name is left alone unless it is Google's AI) const unnamed = !key && (!drawings || /gemini|help me|\bAI\b/i.test((btn.getAttribute("aria-label") || "") + " " + (btn.getAttribute("data-tooltip") || ""))); if (unnamed || (key && (keep ? keep.indexOf(key) < 0 : drawingsLater.indexOf(key) > -1))) { btn.setAttribute("ugf-hide", ""); } }); // separators left with nothing between them document.querySelectorAll(".docs-main-toolbars .goog-toolbar-separator").forEach(function(sep) { let prev = sep.previousElementSibling; while (prev && (prev.hasAttribute("ugf-hide") || getComputedStyle(prev).display === "none")) { prev = prev.previousElementSibling; } const hide = !prev || prev.classList.contains("goog-toolbar-separator"); if (hide !== sep.hasAttribute("ugf-hide")) { if (hide) { sep.setAttribute("ugf-hide", ""); } else { sep.removeAttribute("ugf-hide"); } } }); }; const tidyToolbar = sheets || punch ? tidySheets : function() { document.querySelectorAll(".docs-main-toolbars .goog-toolbar-button, .docs-main-toolbars .goog-toolbar-menu-button, .docs-main-toolbars .goog-toolbar-combo-button").forEach(function(btn) { if (btn.hasAttribute("ugf-seen")) { return; } const icon = btn.querySelector("[class*='docs-icon-']:not(.docs-icon):not(.docs-icon-img-container)") || btn.querySelector(".docs-icon-img"); let name = ""; if (icon) { const m = String(icon.className).match(/docs-icon-([a-z-]+?)-(20|24|18)(x\d+)?\b/); name = m ? m[1] : ""; } const id = btn.id || ""; // the drop-downs by what they are if (/zoomSelect/.test(id)) { name = "zoom"; } else if (/headingStyleSelect/.test(id)) { name = "styles"; } else if (/docs-font-family/.test(id)) { name = "font"; } else if (/fontSize/.test(id)) { name = "size"; } btn.setAttribute("ugf-seen", ""); btn.setAttribute("ugf-icon", name); const always = ["styles", "font", "size"]; const zoomOk = era === "d2014" || era === "d2017" || era === "d2019"; if (!name) { // unknown controls (the Gemini ones, modes, new features) were never there if (!/fontSize/.test(id)) { btn.setAttribute("ugf-hide", ""); } } else if (always.indexOf(name) < 0 && keep.indexOf(name) < 0 && !(name === "zoom" && zoomOk)) { btn.setAttribute("ugf-hide", ""); } }); }; // Slides: "Slideshow" was "Start presentation" and then "Present" const presentBtn = function() { if (!slides) { return; } const b = document.getElementById("punch-start-presentation-left"); if (!b) { return; } const word = era === "d2007" || era === "d2009" || era === "d2010" || (era === "d2011" && l !== "2013" && l !== "2013L") ? "Start presentation" : "Present"; let t = null; [].some.call(b.childNodes, function(n) { if (n.nodeType === 3 && n.nodeValue.trim()) { t = n; return true; } return false; }); if (t && t.nodeValue.trim() !== word) { t.nodeValue = word; } b.setAttribute("data-tooltip", word + " (Ctrl+F5)"); b.setAttribute("aria-label", word + " (Ctrl+F5)"); }; // Sheets: "Add Sheet" and the tabs, in the period's words const sheetBar = function() { if (!sheets) { return; } const add = document.querySelector("#grid-bottom-bar .docs-sheet-add-button"); if (add && (era === "d2007" || era === "d2009") && !add.hasAttribute("ugf-label")) { add.setAttribute("ugf-label", ""); add.setAttribute("title", "Add Sheet"); } }; // Google's AI: the "Tables" panel Sheets opens by itself on a new spreadsheet (its // "AI enhanced tables"), the Gemini and "Help me..." panels. Closed with their own // close button, so the grid takes the room back; hidden as well in case they return. const aiWords = /\bGemini\b|AI[- ]enhanced|\bHelp me (create|organi[sz]e|write|analy[sz]e|visuali[sz]e)|\bAI (function|summary|summaries|features?)\b|\bSmart fill\b/i; const noAi = function() { document.querySelectorAll(".waffle-sidebar-container, .docs-sidebar-container, #docs-sidebar-container, .docs-tiled-sidebar, .waffle-gm-sidebar").forEach(function(p) { const ai = p.querySelector(".building-blocks-sidebar, [class*='inline-assistant'], [class*='chip-extraction'], [class*='gemini' i]") || aiWords.test((p.textContent || "").slice(0, 3000)); if (!ai) { // the same frame is used for the ordinary sidebars too: let those be p.removeAttribute("ugf-ai-closed"); return; } if (p.hasAttribute("ugf-ai-closed")) { return; } p.setAttribute("ugf-ai-closed", ""); const x = p.querySelector(".waffle-sidebar-title-close, [aria-label='Close' i], [aria-label^='Close' i], [data-tooltip^='Close' i]"); if (x) { ["mousedown", "mouseup", "click"].forEach(function(t) { x.dispatchEvent(new MouseEvent(t, { bubbles: true, cancelable: true })); }); } relaid = 0; relayout(); }); // AI chips, promos and buttons wherever else they turn up document.querySelectorAll("[aria-label*='Gemini' i], [data-tooltip*='Gemini' i], [aria-label*='Help me ' i], [data-tooltip*='Help me ' i], .waffle-ai-promo, [class*='smart-summary']").forEach(function(e) { if (!e.hasAttribute("ugf-hide") && !e.closest("#ugf-docs-home")) { e.setAttribute("ugf-hide", ""); } }); }; // Google's Gemini welcome ("Hello ..., Ready to create with Gemini?") and other AI // pop-ups: shut with their own "No thanks"/close button the moment they appear, // and the grey veil behind them taken away with them const aiDialogWords = /\bGemini\b|Ready to create|start creating|Nano Banana|from simple text prompts|Create polished slides|Help me (create|write|organi[sz]e|visuali[sz]e|analy[sz]e)|\bAI[- ]enhanced\b/i; const dialogSel = "[role='dialog'], [role='alertdialog'], .modal-dialog, .docs-material-gm-dialog, .mdc-dialog, [class*='gm-dialog']"; const veilSel = ".modal-dialog-bg, [class*='dialog-bg'], [class*='scrim' i], [class*='Scrim']"; const shutAiDialog = function(dlg) { if (!dlg || dlg.hasAttribute("ugf-ai-dlg") || dlg.closest("#ugf-docs-home, #ugf-gmail-accmenu")) { return false; } const txt = (dlg.getAttribute("aria-label") || "") + " " + (dlg.textContent || "").slice(0, 2000); if (!aiDialogWords.test(txt)) { return false; } dlg.setAttribute("ugf-ai-dlg", ""); const out = [].filter.call(dlg.querySelectorAll("button, [role='button']"), function(b) { return /no,? thanks|not now|dismiss|close|maybe later|skip|got it|cancel/i.test((b.textContent || "") + " " + (b.getAttribute("aria-label") || "")); })[0]; if (out) { pressIt(out); } else { [dlg, document].forEach(function(t) { try { t.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, cancelable: true, key: "Escape", code: "Escape", keyCode: 27, which: 27 })); } catch (e) {} }); } return true; }; const liftVeils = function() { const open = [].some.call(document.querySelectorAll(dialogSel), function(d) { return !d.hasAttribute("ugf-ai-dlg") && !d.closest("[ugf-ai-dlg]") && d.offsetWidth > 0 && getComputedStyle(d).visibility !== "hidden"; }); document.querySelectorAll(veilSel).forEach(function(v) { if (v.closest("#ugf-docs-home")) { return; } if (open) { v.removeAttribute("ugf-ai-bg"); } else if (v.offsetWidth > 0 || v.hasAttribute("ugf-ai-bg")) { v.setAttribute("ugf-ai-bg", ""); } }); }; let veilUntil = 0; const noAiDialogs = function(nodes) { let hit = false; (nodes || [document]).forEach(function(n) { if (n.nodeType !== 1 && n !== document) { return; } if (n !== document && n.matches && n.matches(dialogSel)) { hit = shutAiDialog(n) || hit; } // its words often arrive after the dialog itself: look at the dialog they // were put into const host = n !== document && n.parentElement && n.parentElement.closest ? n.parentElement.closest(dialogSel) : null; if (host) { hit = shutAiDialog(host) || hit; } if (n.querySelectorAll) { n.querySelectorAll(dialogSel).forEach(function(d) { hit = shutAiDialog(d) || hit; }); } }); if (hit) { veilUntil = Date.now() + 8000; } // the veil goes only while an AI pop-up has just been shut if (Date.now() < veilUntil) { liftVeils(); } else { document.querySelectorAll("[ugf-ai-bg]").forEach(function(v) { if ([].some.call(document.querySelectorAll(dialogSel), function(d) { return !d.hasAttribute("ugf-ai-dlg") && d.offsetWidth > 0; })) { v.removeAttribute("ugf-ai-bg"); } }); } }; // Google's AI in the menus: "Turn into video", the wand at the top of Insert, // "Create a slide", "Help me...", Gemini. Taken out as the menu is built. const aiMenuWords = /Turn into video|Create a slide|Help me (create|write|organi[sz]e|visuali[sz]e|analy[sz]e|design)|Gemini|Beautify|Smart fill|Smart summar|Summari[sz]e|Generate (an? )?(image|slide|video|table)|Ask AI|Nano Banana/i; const aiMenuIcon = /docs-icon-(ai-|image-generation|video-generation|smart-summary|sparkle|magic|wand|gemini|generative)|generative|sparkle|gemini/i; const tidyMenus = function(root) { const items = []; if (root.matches && root.matches(".goog-menuitem, .goog-submenu")) { items.push(root); } if (root.querySelectorAll) { root.querySelectorAll(".goog-menuitem, .goog-submenu").forEach(function(i) { items.push(i); }); } const menus = new Set(); items.forEach(function(it) { if (it.hasAttribute("ugf-mi")) { return; } const text = (it.textContent || "").replace(/\s+/g, " ").trim(); if (!text && !it.querySelector("[class*='docs-icon']")) { return; // not filled in yet: look again later } it.setAttribute("ugf-mi", ""); const label = it.getAttribute("aria-label") || ""; let iconCls = ""; it.querySelectorAll("[class*='docs-icon'], [class*='icon' i]").forEach(function(x) { iconCls += " " + String(x.className && x.className.baseVal !== undefined ? x.className.baseVal : x.className); }); const nameless = !text.replace(/[\u25b6\u25ba\u203a>]/g, "").trim(); if (aiMenuWords.test(text + " " + label) || aiMenuIcon.test(iconCls) || (nameless && /docs-icon/.test(iconCls) && !/separator/.test(it.className))) { it.setAttribute("ugf-hide", ""); const m = it.closest(".goog-menu"); if (m) { menus.add(m); } } }); // separators left side by side, or at the top or bottom menus.forEach(function(m) { let prevSep = true; let lastSep = null; [].forEach.call(m.children, function(c) { if (c.hasAttribute("ugf-hide") && !c.hasAttribute("ugf-sep")) { return; } const sep = c.classList.contains("goog-menuseparator") || c.getAttribute("role") === "separator"; if (sep) { if (prevSep) { c.setAttribute("ugf-hide", ""); c.setAttribute("ugf-sep", ""); } else { c.removeAttribute("ugf-hide"); lastSep = c; } prevSep = true; } else if (getComputedStyle(c).display !== "none") { prevSep = false; lastSep = null; } }); if (lastSep) { lastSep.setAttribute("ugf-hide", ""); lastSep.setAttribute("ugf-sep", ""); } }); }; // watch the page for them as they are added, so they are gone before they are drawn new MutationObserver(function(list) { const added = []; list.forEach(function(m) { m.addedNodes.forEach(function(n) { if (n.nodeType === 1) { added.push(n); } }); }); if (added.length) { noAiDialogs(added); added.forEach(function(n) { if (n.matches && (n.matches(".goog-menu, .goog-menuitem, .goog-submenu") || n.querySelector(".goog-menuitem"))) { tidyMenus(n); } }); } }).observe(document.body || document.documentElement, { childList: true, subtree: true }); // the document outline (2017 on) and the tabs pane (2024) were not there before; // close it once, the way the pane's own close button does let outlineClosed = false; const closeOutline = function() { if (outlineClosed) { return; } const side = document.querySelector(".left-sidebar-container"); if (!side) { return; } const btn = side.querySelector(".navigation-widget-hat-close, [aria-label*='Close' i], [aria-label*='Hide' i]"); if (btn) { ["mousedown", "mouseup", "click"].forEach(function(t) { btn.dispatchEvent(new MouseEvent(t, { bubbles: true, cancelable: true })); }); outlineClosed = true; } }; let relaid = 0; const relayout = function() { if (relaid < 6) { relaid++; window.dispatchEvent(new Event("resize")); } }; const menus = function() { const ext = document.getElementById("docs-extensions-menu"); if (!ext) { return; } if (era === "d2007" || era === "d2009" || era === "d2010" || era === "d2011") { ext.setAttribute("ugf-hide", ""); } else if (!(era === "d2019" && l === "2022") && ext.firstChild && ext.firstChild.nodeType === 3 && ext.firstChild.nodeValue !== "Add-ons") { ext.firstChild.nodeValue = "Add-ons"; } }; // the "Templates / Meeting notes / Email draft / More" pills Google puts on an // empty page (2024 on) const pills = function() { const root = document.getElementById("docs-editor-container"); if (!root) { return; } root.querySelectorAll("button, [role='button']").forEach(function(b) { const t = (b.textContent || "").trim(); if (t !== "Meeting notes" && t !== "Email draft" && t !== "Templates") { return; } let box = b.parentElement; while (box && box !== root && box.querySelectorAll("button, [role='button']").length < 3) { box = box.parentElement; } if (box && box !== root && !box.hasAttribute("ugf-hide")) { box.setAttribute("ugf-hide", ""); } }); }; // the row of starter chips a new, empty document shows ("Templates", "Meeting // notes", "Email draft", "More"): not a thing of any period Gplex draws const starterWords = /^(Templates|Meeting notes|Email draft|Project roadmap|Product requirements|Custom building blocks|Building blocks)$/; const noStarters = function() { // The chips are looked for by their words wherever they are - in the page's // text, in shadow roots, or only in their labels - and each chip is the // pill-sized box around its words. Their row is hidden when it is a row of its // own; otherwise each chip is, with the "More" beside them. const words = ["templates", "meeting notes", "email draft", "project roadmap", "product requirements", "custom building blocks", "building blocks", "proposal", "brochure"]; const norm = function(t) { return String(t || "").replace(/[\s\u00a0\u200b]+/g, " ").trim().toLowerCase(); }; const skip = function(el) { return !!el.closest("#docs-chrome, #docs-menubar, #docs-toolbar-wrapper, .ugf-lb, [role='menu'], [role='menubar'], [role='dialog'], [role='listbox'], .goog-menu, #ugf-gmail-accmenu, #ugf-docs-gbar, [ugf-starter], .docs-explore-sidebar, " + ".kix-lineview, .kix-paragraphrenderer, .kix-canvas-tile-content, .kix-wordhtmlgenerator-word-node, [contenteditable='true'], .waffle, .cell-input, .punch-viewer-content, .punch-filmstrip, .punch-viewer-svgpage, #ugf-docs-home"); }; const hits = []; const consider = function(el) { if (el && el.nodeType === 1 && hits.indexOf(el) < 0 && !skip(el)) { hits.push(el); } }; const roots = [document.body]; // (and Google's own frames on the page, where they can be read) document.querySelectorAll("iframe").forEach(function(f) { try { if (f.contentDocument && f.contentDocument.body && !/texteventtarget/.test(f.className)) { roots.push(f.contentDocument.body); } } catch (e) {} }); for (let r = 0; r < roots.length && r < 60; r++) { const root = roots[r]; const tw = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT); let n = tw.currentNode; let count = 0; while (n && count < 60000) { count++; if (n.nodeType === 3) { const v = n.nodeValue; if (v && v.length < 40 && words.indexOf(norm(v)) > -1) { consider(n.parentElement || (n.parentNode && n.parentNode.host)); } } else if (n.nodeType === 1) { if (n.shadowRoot) { roots.push(n.shadowRoot); } const al = n.getAttribute("aria-label") || n.getAttribute("data-tooltip") || n.getAttribute("title"); if (al && al.length < 40 && words.indexOf(norm(al)) > -1) { consider(n); } } n = tw.nextNode(); } } if (hits.length < 2) { return; } const up = function(x) { return x.parentElement || (x.parentNode && x.parentNode.host) || null; }; const holds = function(anc, node) { for (let x = node; x; x = up(x)) { if (x === anc) { return true; } } return false; }; const big = "html, body, .kix-appview-editor, .kix-appview-editor-container, .kix-page-paginated, .kix-rotatingtilemanager, .kix-rotatingtilemanager-content, #docs-editor, #docs-editor-container"; // each chip: the largest box around its words holding no other chip's words; // the chips sharing a parent are one row const rows = []; hits.forEach(function(h) { let chip = h; for (let p2 = up(chip); p2 && !p2.matches(big) && !hits.some(function(o) { return o !== h && holds(p2, o); }); p2 = up(chip)) { chip = p2; } const row = up(chip); if (!row) { return; } let g = null; rows.forEach(function(x) { if (x.row === row) { g = x; } }); if (!g) { g = { row: row, chips: [] }; rows.push(g); } if (g.chips.indexOf(chip) < 0) { g.chips.push(chip); } }); const hide = function(el) { el.setAttribute("ugf-starter", ""); el.style.setProperty("display", "none", "important"); }; rows.forEach(function(g) { // (drawn as a picture of the page, the text of a document could carry the // same words: three of them in one row, then, before anything is hidden) const inSvg = g.chips.some(function(c) { return c.closest && c.closest("svg"); }); if (g.chips.length < (inSvg ? 3 : 2)) { return; } const rr = g.row.getBoundingClientRect(); if (!g.row.matches(big) && rr.height <= 80) { hide(g.row); return; } // no row of their own: the chips one by one, and the "More" among them g.chips.forEach(hide); [].forEach.call(g.row.children, function(el) { if (norm(el.textContent) === "more" && el.getBoundingClientRect().height <= 64) { hide(el); } }); }); }; // Docs now draws the page on a canvas, and the chips of a new document with it // (they are not elements of the page at all). They are found by their colour - a // row of three or more light blue-grey pills near the top of the first page - and // covered with white paper. The paper stays where they were while that part of // the first line is blank, so when a document is emptied and Google draws them // again they never show; it goes the moment anything is written there. While the // chips are under it, it takes their clicks and puts the cursor in the document. let cover = null; let coverScratch = null; const coverSays = {}; let coverHit = null; let coverState = ""; const isPill = function(d, i) { const r = d[i]; const g = d[i + 1]; const b = d[i + 2]; return r >= 222 && r <= 244 && g >= 228 && g <= 248 && b >= 238 && b <= 253 && b - r >= 5 && b - r <= 16; }; // a part of a canvas, read through a copy (Google's canvas itself is never touched) const readCanvas = function(cv, sx0, sy0, sw, sh) { const tmp = coverScratch || (coverScratch = document.createElement("canvas")); if (tmp.width < sw || tmp.height < sh) { tmp.width = Math.max(tmp.width, sw); tmp.height = Math.max(tmp.height, sh); } const tctx = tmp.getContext("2d", { willReadFrequently: true }); tctx.clearRect(0, 0, sw, sh); tctx.drawImage(cv, sx0, sy0, sw, sh, 0, 0, sw, sh); return tctx.getImageData(0, 0, sw, sh).data; }; // looking for the row of chips over the tops of the canvases on show const findStarters = function() { const ed = document.querySelector(".kix-appview-editor") || document.body; let hit = null; [].some.call(ed.querySelectorAll("canvas"), function(cv) { const r = cv.getBoundingClientRect(); if (r.width < 300 || r.height < 60 || r.bottom < 0 || r.top > window.innerHeight || !cv.width || !cv.height) { return false; } const sx = cv.width / r.width; const sy = cv.height / r.height; const h = Math.min(cv.height, Math.round(300 * sy)); let data; try { data = readCanvas(cv, 0, 0, cv.width, h); } catch (e) { coverSays.err = String(e && e.name || e); return false; } const W = cv.width; const TW = W; const cols = new Uint16Array(W); let y0 = h; let y1 = -1; for (let y = 0; y < h; y += 2) { let rowHits = 0; for (let x = 0; x < W; x += 1) { if (isPill(data, (y * TW + x) * 4)) { cols[x]++; rowHits++; } } if (rowHits > 20 * sx) { y0 = Math.min(y0, y); y1 = Math.max(y1, y); } } if (y1 < 0) { return false; } const runs = []; let start = -1; for (let x = 0; x <= W; x++) { const on = x < W && cols[x] >= 4; if (on && start < 0) { start = x; } else if (!on && start > -1) { if (x - start >= 40 * sx && x - start <= 320 * sx) { runs.push([start, x]); } start = -1; } } const hh = (y1 - y0) / sy; if (runs.length < 3 || hh < 16 || hh > 64) { return false; } hit = { cv: cv, x0: runs[0][0] / sx - 4, x1: runs[runs.length - 1][1] / sx + 4, y0: y0 / sy - 4, y1: y1 / sy + 6 }; return true; }); return hit; }; // what is under the paper now: the chips, nothing, or writing const underCover = function() { const hc = coverHit; if (!hc || !hc.cv.isConnected) { return ""; } const r = hc.cv.getBoundingClientRect(); if (!r.width || !hc.cv.width) { return ""; } const sx = hc.cv.width / r.width; const sy = hc.cv.height / r.height; const x0 = Math.max(0, Math.floor(hc.x0 * sx)); const y0 = Math.max(0, Math.floor(hc.y0 * sy)); const w = Math.min(hc.cv.width - x0, Math.ceil((hc.x1 - hc.x0) * sx)); const h = Math.min(hc.cv.height - y0, Math.ceil((hc.y1 - hc.y0) * sy)); if (w < 4 || h < 4) { return ""; } let data; try { data = readCanvas(hc.cv, x0, y0, w, h); } catch (e) { return ""; } const TW = w; let pill = 0; let ink = 0; let n = 0; // every pixel: a single letter under the paper must be enough to lift it for (let y = 0; y < h; y++) { for (let x = 0; x < w; x++) { const i = (y * TW + x) * 4; n++; if (data[i + 3] < 8) { continue; } if (isPill(data, i)) { pill++; } else if (Math.min(data[i], data[i + 1], data[i + 2]) < 215) { ink++; } } } if (pill > n * 0.12) { return "chips"; } return ink >= 2 ? "text" : "blank"; }; const placeCover = function() { if (!cover) { return; } if (!coverHit || !coverHit.cv.isConnected || !coverState || coverState === "text") { cover.style.display = "none"; return; } const cr = coverHit.cv.getBoundingClientRect(); // (not over the header when the page is scrolled up under it) const chrome = document.getElementById("docs-chrome"); const minTop = chrome ? chrome.getBoundingClientRect().bottom : 0; const top = cr.top + coverHit.y0; if (top < minTop || top > window.innerHeight) { cover.style.display = "none"; return; } cover.style.display = "block"; cover.style.pointerEvents = coverState === "chips" ? "auto" : "none"; cover.style.left = Math.floor(cr.left + coverHit.x0) + "px"; cover.style.top = Math.floor(top) + "px"; cover.style.width = Math.ceil(coverHit.x1 - coverHit.x0) + "px"; cover.style.height = Math.ceil(coverHit.y1 - coverHit.y0) + "px"; }; const coverStarters = function() { if (ugfDocsIsSheets() || ugfDocsIsSlides() || ugfDocsIsDrawings()) { return false; } if (!cover) { cover = document.createElement("div"); cover.id = "ugf-docs-starter-cover"; cover.style.cssText = "position: fixed; background: #fff; z-index: 999; pointer-events: none; display: none; cursor: text;"; document.body.appendChild(cover); } coverState = underCover(); // not known yet (or the page has moved, or been zoomed): look for the chips // (the whole top of the page is read at most every 1.5 s once the document is // open, so typing is never slowed; the paper's own spot is checked every time) const since = Date.now() - (coverSays.lastFind || 0); if ((!coverState || coverState === "text") && since > (Date.now() - coverStart < 15000 ? 140 : 1500)) { coverSays.lastFind = Date.now(); const hit = findStarters(); if (hit) { coverHit = hit; coverState = "chips"; if (!coverSays.seen) { coverSays.seen = true; console.log("[Gplex] Docs: new-document chips covered (" + Math.round(hit.x1 - hit.x0) + "x" + Math.round(hit.y1 - hit.y0) + ")"); } } else if (!coverSays.none && Date.now() - coverStart > 6000 && !coverHit) { coverSays.none = true; console.log("[Gplex] Docs: new-document chips: none found" + (coverSays.err ? " (" + coverSays.err + ")" : "")); } } placeCover(); return coverState === "chips"; }; document.addEventListener("scroll", function() { if (cover && cover.style.display !== "none") { placeCover(); } }, true); // the chips' clicks: kept from Google's page (whose listeners on the window would // otherwise still see them), and turned into a click at the start of the line ["pointerdown", "mousedown", "pointerup", "mouseup", "click", "dblclick", "contextmenu"].forEach(function(t) { window.addEventListener(t, function(ev) { if (!cover || ev.target !== cover) { return; } ev.stopImmediatePropagation(); ev.preventDefault(); if (t !== "mousedown") { return; } const cr = cover.getBoundingClientRect(); const x = Math.max(0, cr.left - 12); const y = cr.top + cr.height / 2; const under = document.elementFromPoint(x, y); if (under && under !== cover) { const at = { bubbles: true, cancelable: true, button: 0, buttons: 1, clientX: x, clientY: y, detail: 1 }; ["pointerdown", "mousedown", "pointerup", "mouseup", "click"].forEach(function(k) { if (/up|click/.test(k)) { at.buttons = 0; } try { under.dispatchEvent(/^pointer/.test(k) && typeof PointerEvent === "function" ? new PointerEvent(k, Object.assign({ pointerType: "mouse", isPrimary: true }, at)) : new MouseEvent(k, at)); } catch (e) {} }); } setTimeout(giveKeys, 30); }, true); }); // looked at again straight after every key and edit, frame by frame, so the paper // comes off as soon as anything is written under it (and the chips never flash) let coverFrames = 0; const coverFrame = function() { try { coverStarters(); } catch (e) {} if (--coverFrames > 0) { requestAnimationFrame(coverFrame); } }; const coverSoon = function() { const was = coverFrames; coverFrames = 20; if (was <= 0) { requestAnimationFrame(coverFrame); } }; const hookKeys = function() { const f = document.querySelector(".docs-texteventtarget-iframe"); let doc = null; try { doc = f && f.contentDocument; } catch (e) {} [document, doc].forEach(function(d) { if (d && !d.ugfCoverHooked) { d.ugfCoverHooked = true; ["keydown", "keyup", "input", "paste", "cut", "drop", "mouseup"].forEach(function(t) { d.addEventListener(t, coverSoon, true); }); } }); }; let coverSeen = 0; const coverLoop = function() { let up = false; try { hookKeys(); up = coverStarters(); } catch (e) {} if (up) { coverSeen = Date.now(); } const known = !!coverHit && coverState && coverState !== "text"; const fast = up || known || Date.now() - coverStart < 15000 || Date.now() - coverSeen < 4000; setTimeout(coverLoop, fast ? 150 : 1500); }; const coverStart = Date.now(); const tick = function() { menus(); pills(); noStarters(); sheetBar(); presentBtn(); noAi(); noAiDialogs(); tidyMenus(document); if (place()) { placed = true; relayout(); } tidyToolbar(); watchSave(); closeOutline(); }; // ---- the link bubble: "Go to link: ... - Change - Remove", as it read until the // 2019 redesign, in place of today's rounded preview card with its globe and chips. // It is drawn inside Google's own bubble, so hovering it keeps the bubble open. const findLink = function(root, depth) { if (!root || depth > 4) { return ""; } const a = root.querySelector ? root.querySelector("a[href^='http'], a[href^='mailto:'], a[href^='/'], a[href^='#']") : null; if (a && !a.closest(".ugf-lb")) { return a.href; } let found = ""; if (root.querySelectorAll) { [].some.call(root.querySelectorAll("*"), function(el) { if (el.shadowRoot) { found = findLink(el.shadowRoot, depth + 1); } return !!found; }); } if (!found && root.textContent) { const m = root.textContent.match(/https?:\/\/[^\s"'<>]+/); found = m && m[0].indexOf("…") < 0 ? m[0] : ""; } return found; }; const findButton = function(root, re) { let hit = null; const look = function(r, d) { if (!r || d > 4 || hit) { return; } [].some.call(r.querySelectorAll ? r.querySelectorAll("[role='button'], button, [aria-label], [data-tooltip]") : [], function(b) { const t = (b.getAttribute("aria-label") || "") + " " + (b.getAttribute("data-tooltip") || ""); if (re.test(t) && !b.closest(".ugf-lb")) { hit = b; return true; } return false; }); if (!hit && r.querySelectorAll) { [].some.call(r.querySelectorAll("*"), function(el) { if (el.shadowRoot) { look(el.shadowRoot, d + 1); } return !!hit; }); } }; look(root, 0); return hit; }; const pressIt = function(b) { ["mousedown", "mouseup", "click"].forEach(function(t) { try { b.dispatchEvent(new MouseEvent(t, { bubbles: true, cancelable: true })); } catch (e) {} }); }; const linkBubble = function() { if (era === "d2019") { return; } document.querySelectorAll(".docs-linkbubble-bubble, .docs-bubble.appsElementsLinkPreview, .docs-multi-linkbubble-bubble").forEach(function(bub) { // the outermost bubble only const outer = bub.parentElement && bub.parentElement.closest(".docs-linkbubble-bubble, .docs-multi-linkbubble-bubble, .docs-bubble.appsElementsLinkPreview"); if (outer || !bub.offsetWidth) { return; } const url = findLink(bub, 0); let mine = bub.querySelector(":scope > .ugf-lb"); if (!url) { if (mine) { mine.remove(); bub.removeAttribute("ugf-lb"); } return; } if (mine && mine.getAttribute("data-url") === url) { return; } if (!mine) { mine = document.createElement("div"); mine.className = "ugf-lb"; bub.appendChild(mine); } mine.setAttribute("data-url", url); const edit = findButton(bub, /edit link|change link|^\s*edit\b/i); const remove = findButton(bub, /remove link|unlink/i); const shown = url.replace(/^mailto:/, ""); mine.innerHTML = trusted_policy.createHTML('Go to link: ' + (edit ? ' - Change' : "") + (remove ? ' - Remove' : "")); const go = mine.querySelector(".go"); go.href = url; go.textContent = shown.length > 60 ? shown.slice(0, 57) + "..." : shown; go.title = url; const ch = mine.querySelector(".ch"); if (ch) { ch.addEventListener("click", function(ev) { ev.preventDefault(); pressIt(edit); }); } const rm = mine.querySelector(".rm"); if (rm) { rm.addEventListener("click", function(ev) { ev.preventDefault(); pressIt(remove); }); } bub.setAttribute("ugf-lb", ""); }); }; setInterval(linkBubble, 200); // the email (or photo) at the top right opens the account menu; taken on the window // before the editor's own handlers can swallow the click const onAcct = function(ev) { const t = ev.target && ev.target.closest ? ev.target : null; if (!t) { return; } const me = t.closest("#ugf-docs-acct .me"); if (me) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailAccountMenu(me, ugfMenusRounded() ? "m2018" : "m2013"); } return; } if (t.closest("#ugf-gmail-accfence")) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailCloseMenus(); } } }; window.addEventListener("mousedown", onAcct, true); window.addEventListener("click", onAcct, true); tick(); var mo = new MutationObserver(function() { if (mo.busy) { return; } mo.busy = true; requestAnimationFrame(function() { mo.busy = false; tick(); }); }); // Google's header and toolbar live in #docs-chrome; the document itself is left be let watched = null; const watch = function() { const chrome = document.getElementById("docs-chrome"); if (chrome && chrome !== watched) { mo.disconnect(); mo.observe(chrome, { childList: true, subtree: true }); watched = chrome; } }; watch(); setInterval(watch, 2000); setInterval(tick, 1000); // the starter chips come with the document: looked for often while it loads const early = setInterval(noStarters, 150); setTimeout(function() { clearInterval(early); }, 12000); // and whenever the page changes in the first minute (they are drawn again as the // document settles), so that they are never seen let starterT = 0; const starterMo = new MutationObserver(function() { if (!starterT) { starterT = setTimeout(function() { starterT = 0; noStarters(); }, 150); } }); starterMo.observe(document.body, { childList: true, subtree: true }); setTimeout(function() { starterMo.disconnect(); }, 60000); coverLoop(); [300, 1200, 3000].forEach(function(ms) { setTimeout(function() { relaid = 0; relayout(); }, ms); }); } // ---- the documents list --------------------------------------------------------- // Google's own list stays underneath, hidden; what it lists is read from it and drawn // again in the period's list. function ugfDocsHarvest() { const out = []; const seen = {}; const txt = function(root, sel, attr) { const e = root.querySelector(sel); if (!e) { return ""; } return ((attr && e.getAttribute(attr)) || e.textContent || "").replace(/\s+/g, " ").trim(); }; // each document of Google's list; the id is in its thumbnail's address document.querySelectorAll(".docs-homescreen-grid-item, .docs-homescreen-list-item, [class*='docs-homescreen-list-item '], [class$='docs-homescreen-list-item']").forEach(function(el) { if (el.closest("#ugf-docs-home")) { return; } const th = el.querySelector("[class*='thumbnail']"); const bg = th ? (th.getAttribute("style") || "") + " " + ((th.querySelector("img") || {}).src || "") : ""; let m = bg.match(/\/d\/([\w-]{25,})/) || String(el.getAttribute("data-id") || "").match(/^([\w-]{25,})$/); if (!m) { // Sheets often has no thumbnail yet: look for the id on the entry's links, // images and data attributes instead [].some.call(el.querySelectorAll("a[href], img[src], [style*='/d/'], [data-id], [data-docid], [data-item-id]"), function(x) { const v = (x.getAttribute("href") || "") + " " + (x.getAttribute("src") || "") + " " + (x.getAttribute("style") || "") + " " + (x.getAttribute("data-id") || "") + " " + (x.getAttribute("data-docid") || "") + " " + (x.getAttribute("data-item-id") || ""); m = v.match(/\/d\/([\w-]{25,})/) || v.match(/(?:^|\s)([\w-]{40,})(?:\s|$)/); return !!m; }); } const id = m ? m[1] : ""; const title = txt(el, "[class*='item-title']", "title") || (el.getAttribute("aria-label") || "").replace(/ Google (Docs|Sheets|Slides|Forms)$/, ""); const key = id || title + "|" + out.length; if (!title || seen[key]) { return; } seen[key] = true; const thumb = (bg.match(/url\(["']?([^"')]+)/) || [])[1] || ""; out.push({ id: id, el: el, title: title, date: txt(el, "[class*='item-time']:not([class*='container'])"), owner: txt(el, "[class*='owner']"), thumb: thumb, shared: /shared/.test(el.className) }); }); return out; } // the templates Google offers at the top of its list (2016 on) function ugfDocsTemplates() { const out = []; document.querySelectorAll(".docs-homescreen-templates-templateview").forEach(function(el) { if (el.closest("#ugf-docs-home") || out.length >= 5) { return; } const img = el.querySelector("img"); const title = ((el.querySelector("[class*='templateview-title']") || {}).textContent || "").trim(); if (!title || out.some(function(t) { return t.title === title; })) { return; } out.push({ el: el, title: title, style: ((el.querySelector("[class*='templateview-style']") || {}).textContent || "").trim(), img: img ? img.src : "" }); }); return out; } // open a document or template the way a click on Google's own entry does function ugfDocsPress(el, title) { if ((!el || !el.isConnected) && title) { [].some.call(document.querySelectorAll(".docs-homescreen-grid-item, .docs-homescreen-list-item, .docs-homescreen-templates-templateview"), function(x) { if (x.closest("#ugf-docs-home")) { return false; } const t = x.querySelector("[class*='item-title'], [class*='templateview-title']"); const name = ((t && (t.getAttribute("title") || t.textContent)) || "").replace(/\s+/g, " ").trim(); if (name === title) { el = x; return true; } return false; }); } if (!el) { return; } const r = el.getBoundingClientRect(); const at = { bubbles: true, cancelable: true, button: 0, buttons: 1, clientX: r.left + 20, clientY: r.top + 20 }; try { el.focus(); } catch (e) {} // (no "view" in these: in Firefox the script's window is not the page's, and the // event constructors refuse it) const fire = function(t) { try { el.dispatchEvent(/^pointer/.test(t) && typeof PointerEvent === "function" ? new PointerEvent(t, Object.assign({ pointerType: "mouse", isPrimary: true }, at)) : new MouseEvent(t, at)); } catch (e) { try { el.dispatchEvent(new MouseEvent(/^pointer/.test(t) ? t.replace("pointer", "mouse") : t, { bubbles: true, cancelable: true })); } catch (e2) {} } }; ["pointerdown", "mousedown"].forEach(fire); at.buttons = 0; ["pointerup", "mouseup", "click"].forEach(fire); // and the keyboard's way in, which the list also answers setTimeout(function() { if (document.visibilityState === "visible" && /\/(document|spreadsheets)(\/u\/\d+)?\/?$/.test(window.location.pathname)) { ["keydown", "keyup"].forEach(function(t) { try { el.dispatchEvent(new KeyboardEvent(t, { bubbles: true, cancelable: true, key: "Enter", code: "Enter", keyCode: 13, which: 13 })); } catch (e) {} }); } }, 400); } function ugfDocsHome(era) { const A = ugfDocsArt(); const esc = ugfDocsEsc; const l = String(layout || ""); const W = ugfDocsWords(); const sheets = ugfDocsIsSheets(); const slides = ugfDocsIsSlides(); const forms = ugfDocsApp() === "forms"; const drive = era === "d2011" && (l === "2013" || l === "2013L" || (forms && (["2014", "2015", "2015L"].indexOf(l) > -1 || UGF_LATE2015))); const material = era === "d2014" || era === "d2017" || era === "d2019"; const base = ugfDocsBase(); const q = new URLSearchParams(window.location.search).get("q") || ""; const who = ugfDocsWho(); const signedIn = !!(who.email || who.name); const html = document.documentElement; html.setAttribute("gplex-nt", era); html.setAttribute("gplex-docs-home", era); const style = document.createElement("style"); style.id = "ugf-nt-styles"; style.textContent = ugfNtBaseCss("ugf-docs-home").concat(ugfDocsHomeCss(era, A)).join("\n"); (document.head || document.documentElement).appendChild(style); // Sheets had no list of its own until 2014: before that it was the Docs list document.title = drive ? "My Drive - Google Drive" : (material ? W.product : "Google Docs"); const shell = document.createElement("div"); shell.id = "ugf-docs-home"; shell.setAttribute("era", era); shell.setAttribute("app", ugfDocsApp()); document.body.appendChild(shell); const state = { items: [], templates: [], sort: "date", starred: {}, checked: {}, loaded: false, view: "grid" }; const create = "https://docs.google.com/" + W.path + "/create"; const open = function(id) { return id ? "https://docs.google.com/" + W.path + "/d/" + id + "/edit" : "#"; }; const byIndex = function(i) { return sorted()[+i] || null; }; const icon = function() { if (forms) { return ''; } if (slides) { return ''; } if (sheets) { return ''; } return ''; }; const appIcon = function(q4) { return forms ? (q4 ? A.fIcon2020 : A.fIcon2014) : slides ? (q4 ? A.pIcon2020 : A.pIcon2014) : sheets ? (q4 ? A.sIcon2020 : A.sIcon2014) : (q4 ? A.icon2020 : A.icon2014); }; // the "Mail Calendar Documents ..." links the list had before the black bar const topLinks = function() { const apps = era === "d2007" ? [["Mail", "https://mail.google.com/"], ["Calendar", "https://calendar.google.com/"], ["Documents", ""], ["Photos", "https://photos.google.com/"], ["Groups", "https://groups.google.com/"], ["Web", "https://www.google.com/"]] : [["Gmail", "https://mail.google.com/"], ["Calendar", "https://calendar.google.com/"], ["Documents", ""], [era === "d2010" ? "Sites" : "Reader", era === "d2010" ? "https://sites.google.com/" : "https://www.google.com/reader/"], ["Web", "https://www.google.com/"]]; let left = ""; apps.forEach(function(a) { left += a[1] ? '' + esc(a[0]) + "" : "" + esc(a[0]) + ""; }); left += 'more ▼'; const right = (signedIn ? "" + esc(who.email || who.name) + " | " : "") + 'Settings' + (era === "d2007" ? "" : " ▾") + " | " + 'Help | ' + (signedIn ? 'Sign out' : 'Sign in'); return '"; }; // the Google bar of 2010 (as on google.com in that layout) const gbar2010 = function() { const links = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Videos", "https://www.google.com/videohp"], ["Maps", "https://maps.google.com/"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"]]; let left = ""; links.forEach(function(a) { left += '' + esc(a[0]) + ""; }); left += "Documents"; left += 'more ▾'; const right = 'iGoogle|Search settings|' + (signedIn ? '' + esc(who.first || who.name || who.email) + "" : 'Sign in') + '' + ugfNtIcon("settings", 18) + ""; return '
' + left + '
' + right + "
"; }; // the drawer behind the menu button (2014 on) const drawer = function() { const q4 = l === "2022"; const pic = function(n) { return ''; }; const docsHome = sheets || slides || forms ? "https://docs.google.com/document/u/0/" : base + "/"; const sheetsHome = sheets ? base + "/" : "https://docs.google.com/spreadsheets/u/0/"; const slidesHome = slides ? base + "/" : "https://docs.google.com/presentation/u/0/"; const formsHome = forms ? base + "/" : "https://docs.google.com/forms/u/0/"; const item = function(n, label, href, on) { return '' + pic(n) + "" + label + ""; }; // Forms joined the apps menu with the new Forms (the default from February 2016) const formsShown = ["2014", "2015", "2015L"].indexOf(l) < 0 && !UGF_LATE2015; return '
-1 ? ugfGmailAssets().google2013 : ugfNtArt().glogo92) + '" alt="Google">' + W.app + '
' + item("docs", "Docs", docsHome, !sheets && !slides && !forms) + item("sheets", "Sheets", sheetsHome, sheets) + item("slides", "Slides", slidesHome, slides) + (formsShown || forms ? item("forms", "Forms", formsHome, forms) : "") + '
SettingsHelp & feedback' + '
' + item("drive", "Drive", "https://drive.google.com/") + "
"; }; const byDate = function(a, b) { return 0; }; const sorted = function() { let list = state.items.slice(); if (q) { const qq = q.toLowerCase(); list = list.filter(function(it) { return it.title.toLowerCase().indexOf(qq) > -1; }); } if (state.sort === "title") { list.sort(function(a, b) { return a.title.localeCompare(b.title); }); } else { list.sort(byDate); } return list; }; const empty = function() { if (!state.loaded) { return '
Loading...
'; } return '
' + (q ? "No " + W.nouns + " match " + esc(q) + "." : "No " + W.nouns + " yet. " + 'Create a new ' + W.noun + "") + "
"; }; // the list as a table (2007 to 2013) const table = function() { const list = sorted(); let rows = ""; list.forEach(function(it) { const star = state.starred[it.id]; rows += '' + '' + '' + icon() + '' + esc(it.title) + "" + (it.shared && (era === "d2010" || era === "d2011") ? ' Shared' : "") + "" + (era === "d2007" || era === "d2009" ? '' + esc(it.owner || "me") + "" : '' + esc(it.owner || "me") + "") + '' + esc(String(it.date || "").replace(/^(opened|modified|edited)\s+/i, "")) + ""; }); const head = era === "d2007" || era === "d2009" ? 'NameFolders / SharingDate' : '' + (drive ? "TITLE" : "Title") + '' + (drive ? "OWNER" : "Owner") + '' + (drive ? "LAST MODIFIED" : "Last modified") + ""; return '' + head + "" + rows + "
" + (list.length ? "" : empty()); }; // the three buttons at the right: grid or list, sort, and "Open a file" const viewIcons = function() { return '' + ugfNtIcon(state.view === "grid" ? "view_list" : "view_module", 24) + "" + '' + ugfNtIcon("sort_by_alpha", 24) + "" + '' + ugfNtIcon("folder", 24) + ""; }; // the list view of 2014 on: one row a file const rowsView = function() { const list = sorted(); let out = '
NameOwner' + (state.sort === "title" ? "Last opened by me" : "Last opened by me ↓") + "
"; list.forEach(function(it) { out += '' + icon() + '' + esc(it.title) + '' + esc(it.owner || "me") + '' + esc(String(it.date || "").replace(/^(opened|modified|edited)\s+/i, "")) + '' + ugfNtIcon("more_vert", 20) + ""; }); return list.length ? '
' + out + "
" : empty(); }; // the list as cards (2014 on) const cards = function() { if (state.view === "list") { return rowsView(); } const list = sorted(); let out = ""; list.forEach(function(it) { out += '
' + (it.thumb ? '' : "") + '
' + esc(it.title) + "
" + '
' + icon() + "" + esc(it.date ? (/^(opened|modified|edited)\b/i.test(it.date) ? it.date : "Opened " + it.date) : "") + "" + '' + ugfNtIcon("more_vert", 20) + "
"; }); return list.length ? '
' + out + "
" : empty(); }; const searchBox = function(cls, ph) { return '
'; }; const draw = function() { let h = ""; if (era === "d2007") { h = topLinks() + '
' + searchBox("srch") + '
' + '
New ▾Upload' + 'Add to folder ▾DeleteMore actions ▾
' + '
All items
Created by me
Starred
Trash
' + '
All folders
Items not in folders
Items by type
Shared with...
' + '
' + table() + "
" + '
Select: All ' + sorted().length + ', NoneShowing items 1-' + sorted().length + " of " + sorted().length + "
"; } else if (era === "d2009") { h = topLinks() + '
' + searchBox("srch") + ' Show search options
' + '
' + '
' + '
' + (q ? "Search results" : "All items") + '
Share ▾Folders ▾DeleteRenameMore actions ▾
' + table() + "
"; } else if (era === "d2010") { h = gbar2010() + '
' + searchBox("srch") + ' Browse template gallery
' + '
' + '
' + '
' + (q ? "Search results" : "All items") + '
Documents ▾Images & videos ▾More options ▾
' + '
Actions ▾
' + table() + "
"; } else if (era === "d2011") { const bar = ugfNtGbar("dark", ugfDocsHere(), "2011"); h = bar + '
' + searchBox("ksrch", "") + '" + ugfNtHeadCorner() + "
" + '
' + (drive ? "Drive" : "Docs") + '
Actions ▾' + (drive ? "" : 'Narrow by ▾') + 'Sort ▾«
' + '
' + '
' + table() + "
"; } else if (era === "d2014") { const newLogo = ["2016", "2016C", "2016L"].indexOf(l) > -1; const plusRow = l === "2014"; h = '
" + searchBox("gsrch", "") + '" + '' + (plusRow && signedIn ? '+' + esc(ugfGmailPlusName()) + "" : "") + '' + ugfNtIcon("apps", 24) + "" + (plusRow && signedIn ? '' + ugfNtIcon("notifications", 24) + '' : "") + (signedIn ? '' + ugfGmailAvatar() + "" : 'Sign in') + "
" + '
' + ugfNtIcon("menu", 24) + '' + W.app + '' + viewIcons() + "
" + drawer() + '
' + (q ? "Search results" : "Recent " + W.nouns) + "
" + cards() + '
' + ugfNtIcon("add", 24) + ""; } else { const gm = era === "d2019"; h = '
' + ugfNtIcon("menu", 24) + '' + W.app + '' + searchBox("msrch", "Search") + '' + ugfNtIcon("search", 24) + "" + '' + ugfNtIcon("apps", 24) + "" + (signedIn ? '' + ugfGmailAvatar() + "" : 'Sign in') + "
" + drawer() + (q ? "" : '
" + '
Blank' + state.templates.filter(function(t) { return !/^blank/i.test(t.title); }).slice(0, 4).map(function(t, i) { return '' + (t.img ? '' : "") + '' + esc(t.title) + "" + (t.style ? '' + esc(t.style) + "" : "") + ""; }).join("") + "
") + '
' + (q ? "Search results" : "Recent " + W.nouns) + 'Owned by anyone ' + ugfNtIcon("arrow_drop_down", 20) + "" + viewIcons() + "
" + cards() + "
"; } shell.innerHTML = trusted_policy.createHTML(h); wire(); }; const wire = function() { ugfNtMenus(shell, ugfMenusRounded()); shell.querySelectorAll("tr[data-id]").forEach(function(tr) { const id = tr.getAttribute("data-id"); tr.addEventListener("click", function(ev) { if (ev.target.closest("input, a, .star")) { return; } shell.querySelectorAll("tr.hl").forEach(function(r) { r.classList.remove("hl"); }); tr.classList.add("hl"); }); tr.addEventListener("dblclick", function() { const it = byIndex(tr.getAttribute("data-i")); if (id) { window.location.href = open(id); } else if (it) { ugfDocsPress(it.el, it.title); } }); const cb = tr.querySelector("input"); if (cb) { cb.addEventListener("change", function() { state.checked[id] = cb.checked; tr.classList.toggle("ck", cb.checked); }); } const st = tr.querySelector(".star"); if (st) { st.addEventListener("click", function() { state.starred[id] = !state.starred[id]; st.classList.toggle("on", !!state.starred[id]); }); } }); shell.querySelectorAll("a.op, a.card, a.lrow").forEach(function(a) { a.addEventListener("click", function(ev) { if (a.getAttribute("href") !== "#") { return; } ev.preventDefault(); const row = a.closest("[data-i]"); const it = row ? byIndex(row.getAttribute("data-i")) : null; if (it) { ugfDocsPress(it.el, it.title); } }); }); shell.querySelectorAll("a.tplt").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const t = state.templates.filter(function(x) { return !/^blank/i.test(x.title); })[+a.getAttribute("data-t")]; if (t) { ugfDocsPress(t.el, t.title); } }); }); shell.querySelectorAll("[data-sort]").forEach(function(th) { th.addEventListener("click", function() { state.sort = th.getAttribute("data-sort"); draw(); }); }); shell.querySelectorAll(".web").forEach(function(b) { b.addEventListener("click", function() { const v = (shell.querySelector("form input[name=q]") || {}).value || ""; window.location.href = "https://www.google.com/search?q=" + encodeURIComponent(v); }); }); shell.querySelectorAll(".foot .all, .foot .none").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const on = a.classList.contains("all"); sorted().forEach(function(it) { state.checked[it.id] = on; }); draw(); }); }); }; // ---- "Open a file": the picker behind the folder button (2014 on) const picker = function() { const old = shell.querySelector(".ugf-pick"); if (old) { old.remove(); } const box = document.createElement("div"); box.className = "ugf-pick"; const tabs = [["drive", "My Drive"], ["shared", "Shared with me"], ["starred", "Starred"], ["recent", "Recent"], ["upload", "Upload"]]; let tab = "recent"; let sel = -1; let find = ""; box.innerHTML = trusted_policy.createHTML('
'); shell.appendChild(box); const body = box.querySelector(".pbody"); const openBtn = box.querySelector(".popen"); const pick = function() { let list = state.items.slice(); if (tab === "drive") { list = list.filter(function(it) { return !it.owner || /^me$/i.test(it.owner); }); } else if (tab === "shared") { list = list.filter(function(it) { return it.shared || (it.owner && !/^me$/i.test(it.owner)); }); } else if (tab === "starred") { list = list.filter(function(it) { return state.starred[it.id]; }); } if (find) { const f = find.toLowerCase(); list = list.filter(function(it) { return it.title.toLowerCase().indexOf(f) > -1; }); } return list; }; const paint = function() { box.querySelectorAll(".ptab").forEach(function(t) { t.classList.toggle("on", t.getAttribute("data-t") === tab); }); sel = -1; openBtn.disabled = true; if (tab === "upload") { body.innerHTML = trusted_policy.createHTML('
Drag a file here
Or, if you prefer...
' + 'Select a file from your computer' + '
Uploads go through Google Drive; the file then opens from your list.
'); return; } const list = pick(); if (!list.length) { body.innerHTML = trusted_policy.createHTML('
' + (find ? "No files match “" + esc(find) + "”." : tab === "starred" ? "No starred files." : "No files.") + (tab === "drive" || tab === "shared" ? ' Open in Google Drive' : "") + "
"); return; } body.innerHTML = trusted_policy.createHTML('
' + list.map(function(it, i) { return '
' + icon() + '' + esc(it.title) + '' + esc(String(it.date || "").replace(/^(opened|modified|edited)\s+/i, "")) + "
"; }).join("") + "
" + (tab === "drive" || tab === "shared" ? '' : "")); body.querySelectorAll(".prow").forEach(function(r) { r.addEventListener("click", function() { body.querySelectorAll(".prow.on").forEach(function(o) { o.classList.remove("on"); }); r.classList.add("on"); sel = +r.getAttribute("data-i"); openBtn.disabled = false; }); r.addEventListener("dblclick", function() { go(list[+r.getAttribute("data-i")]); }); }); openBtn.onclick = function() { if (sel > -1) { go(list[sel]); } }; }; const go = function(it) { if (!it) { return; } if (it.id) { window.location.href = open(it.id); } else { ugfDocsPress(it.el, it.title); } }; const close = function() { box.remove(); document.removeEventListener("keydown", onKey, true); }; const onKey = function(ev) { if (ev.key === "Escape") { ev.preventDefault(); close(); } }; document.addEventListener("keydown", onKey, true); box.querySelectorAll(".ptab").forEach(function(t) { t.addEventListener("click", function() { tab = t.getAttribute("data-t"); paint(); }); }); box.querySelector(".psrch").addEventListener("submit", function(ev) { ev.preventDefault(); find = box.querySelector(".psrch input").value.trim(); if (tab === "upload") { tab = "recent"; } paint(); }); box.querySelector(".psrch input").addEventListener("input", function(ev) { find = ev.target.value.trim(); if (tab !== "upload") { paint(); } }); box.querySelectorAll(".px, .pcancel, .pfence").forEach(function(b) { b.addEventListener("click", close); }); paint(); box.querySelector(".psrch input").focus(); }; // the sort menu behind A-Z (2014 on) const sortMenu = function(anchor) { const old = shell.querySelector(".ugf-sortmenu"); if (old) { old.remove(); return; } const m = document.createElement("div"); m.className = "ugf-sortmenu"; m.innerHTML = trusted_policy.createHTML([["date", "Last opened by me"], ["title", "Title"]].map(function(o) { return '" + o[1] + ""; }).join("")); const r = anchor.getBoundingClientRect(); m.style.top = (r.bottom + 4) + "px"; m.style.right = Math.max(8, window.innerWidth - r.right) + "px"; shell.appendChild(m); m.querySelectorAll("a").forEach(function(a) { a.addEventListener("click", function() { state.sort = a.getAttribute("data-s"); m.remove(); draw(); }); }); }; // the menu button, the drawer's backdrop and the three icons are handled here, on // the window before anything of Google's page underneath can take the click window.addEventListener("click", function(ev) { const t = ev.target && ev.target.closest ? ev.target : null; if (!t || !shell.contains(t)) { const sm = shell.querySelector(".ugf-sortmenu"); if (sm) { sm.remove(); } return; } const hit = t.closest(".ham, .dfence, .vt, .sort, .fold"); if (!hit) { if (!t.closest(".ugf-sortmenu")) { const sm = shell.querySelector(".ugf-sortmenu"); if (sm) { sm.remove(); } } return; } ev.preventDefault(); ev.stopPropagation(); if (hit.matches(".ham, .dfence")) { shell.classList.toggle("dopen"); } else if (hit.matches(".vt")) { state.view = state.view === "grid" ? "list" : "grid"; draw(); } else if (hit.matches(".sort")) { if (material) { sortMenu(hit); } else { state.sort = state.sort === "title" ? "date" : "title"; draw(); } } else if (hit.matches(".fold")) { picker(); } }, true); // keep reading Google's list: it arrives after the page and grows as it scrolls let lastKey = ""; const harvest = function() { const items = ugfDocsHarvest(); const tpls = ugfDocsTemplates(); const key = items.map(function(i) { return i.id + i.title + i.date + (i.thumb ? 1 : 0); }).join("|") + "#" + tpls.map(function(t) { return t.title + (t.img ? 1 : 0); }).join("|"); if (key !== lastKey) { lastKey = key; state.items = items; state.templates = tpls; state.loaded = state.loaded || items.length > 0; draw(); } }; draw(); harvest(); setTimeout(function() { state.loaded = true; if (!state.items.length) { draw(); } }, 9000); setInterval(harvest, 1500); } // ---- the editor's look per period ------------------------------------------------ function ugfDocsEditorCss(era, A) { const P = 'html[gplex-docs="' + era + '"]'; const old = era === "d2007" || era === "d2009"; const kennedy = era === "d2011" || era === "d2014"; const material = era === "d2017" || era === "d2019"; const font = material ? "Roboto, RobotoDraft, Helvetica, Arial, sans-serif" : "Arial, sans-serif"; const css = []; // the Google bar over the editor (2007 to 2013) ugfNtBaseCss("ugf-docs-gbar").forEach(function(r) { if (r.indexOf(".ugf-nt-gbar") > -1 || r.indexOf(" .mi") > -1) { css.push(r); } }); css.push("#ugf-docs-gbar { position: relative; z-index: 1003; font: 13px arial, sans-serif; text-align: left; background: #fff; }", "#ugf-docs-gbar a { text-decoration: none; } #ugf-docs-gbar .ugf-nt-gbar.classic a { text-decoration: underline; }"); if (String(layout || "") !== "2013") { css.push("html[gplex-docs-gbar] #ugf-docs-acct { display: none !important; }"); } const add = function(sel, body) { css.push(sel.split(",").map(function(s) { return P + " " + s.trim(); }).join(", ") + " { " + body + " }"); }; // ---- what no period had: gone in all of them add(".onegoogle-material-minibar, #docs-omnibox-toolbar, .docs-companion-app-switcher-container, #docs-side-toolbar, " + "#docs-gemini-menu, [id*='gemini' i], [class*='gemini' i], .docs-gm3-meet-button, [aria-label^='Join a call' i], " + "#docs-recommendation-banner-container, .docs-titlebar-badges .docs-activity-indicator-container, " + "#docs-save-indicator-container, .navigation-widget-floating-navigation-button, .left-sidebar-container, " + "[ugf-hide], #fontSizeIncrement, #fontSizeDecrement, #docs-toolbar-mode-switcher, .docs-titlebar-badges .docs-folder-container, " + "#docs-revisions-appbarbutton, #docs-presence-container .docs-presence-plus-widget, [class*='MiniChapterSwitcher'], " + "#workspace-onegoogle-pep-container, #docs-sidekick-gen-ai-promo-button-container, #titlebar-mode-indicator-container, #docs-chat, " + ".appsElementsSidekickEntryPointRoot, #docs-extensions-menu[ugf-hide], #docs-toolbar-accessibility-menu, #docs-access-level-indicator", "display: none !important;"); if (material) { // the outline pane arrived in 2017; let it be, but in the period's flat grey css.pop(); add(".onegoogle-material-minibar, #docs-omnibox-toolbar, .docs-companion-app-switcher-container, #docs-side-toolbar, " + "#docs-gemini-menu, [id*='gemini' i], [class*='gemini' i], .docs-gm3-meet-button, [aria-label^='Join a call' i], " + "#docs-recommendation-banner-container, .docs-titlebar-badges .docs-activity-indicator-container, #docs-save-indicator-container, " + ".left-sidebar-container, .navigation-widget-floating-navigation-button, [class*='MiniChapterSwitcher'], [ugf-hide], #fontSizeIncrement, #fontSizeDecrement, " + "#workspace-onegoogle-pep-container, #docs-sidekick-gen-ai-promo-button-container, #titlebar-mode-indicator-container, #docs-chat, .appsElementsSidekickEntryPointRoot, #docs-access-level-indicator" + (era === "d2017" ? ", #docs-revisions-appbarbutton" : ""), "display: none !important;"); } add("[ugf-ai-closed], [ugf-ai-dlg], [ugf-ai-bg]", "display: none !important;"); // Google's AI nudges: "Beautify this slide", the Gemini buttons on the canvas and in // the toolbars, "suggested" pills add("[class*='GenerativeaiNudges'], [class*='GenerativeAiNudge'], [class*='appsSketchyGenerativeai'], [class*='appsElementsGenerativeAi'], " + "[class*='appsDocsAiGenerativeai'], [class*='suggestionNudgeView'], [class*='CanvasNudge']", "display: none !important;"); add("*", "letter-spacing: normal !important;"); add("body, #docs-chrome, .goog-menu, .goog-toolbar, .docs-menubar, .modal-dialog", "font-family: " + font + " !important;"); // ---- the header add("#docs-chrome", "background: #fff !important; border: 0 !important; box-shadow: none !important;"); add("#docs-header", "position: relative !important; background: #fff !important;"); add("#docs-header-container, #docs-chrome > div:has(> #docs-header-container)", "height: auto !important;"); add("#docs-menubars", "margin-top: 0 !important;"); add("#docs-titlebar-container, #docs-titlebar", "background: transparent !important;"); add(".docs-title-input-label, .docs-title-input, .docs-title-input-label-inner", "font-family: " + font + " !important;"); add(".docs-title-input-label, .docs-title-input-label-inner", "color: #000 !important;"); add(".docs-title-input:not(:focus)", "color: transparent !important;"); add(".docs-title-input:focus", "color: #000 !important; background: #fff !important;"); add(".docs-title-input", "border-radius: 0 !important;"); add("#ugf-docs-saved", "color: #999; font-size: 12px; white-space: nowrap; font-family: " + font + ";"); add("#ugf-docs-acct", "position: absolute; right: 12px; top: 4px; z-index: 1003; font: 13px " + font + "; color: #000; white-space: nowrap;"); add("#ugf-docs-acct a", "color: #00c; text-decoration: underline;"); add("#ugf-docs-acct.mail a", "color: #666; text-decoration: none; font-size: 12px;"); add("#ugf-docs-acct.round", "top: 10px;"); add("#ugf-docs-acct.round .pfp", "width: 32px; height: 32px; border-radius: 50%; display: block; object-fit: cover;"); add("#ugf-docs-acct.round .pfp.letter", "background: #c62828; color: #fff; display: flex; align-items: center; justify-content: center; font: 16px Roboto, Arial, sans-serif; text-transform: uppercase;"); add("#ugf-docs-acct .signin", "display: inline-block; background: #4285f4; color: #fff !important; text-decoration: none !important; padding: 7px 14px; border-radius: 2px; font-weight: 500;"); // Google's own sign-in / request-access buttons for people not signed in: the // period's plain text link instead add(".titlebar-request-access-button", "background: transparent !important; border: 0 !important; box-shadow: none !important; color: #15c !important; height: auto !important; padding: 0 6px !important; font-size: 12px !important;"); add(".titlebar-request-access-button .docs-material-button-content", "font: 12px " + font + " !important; color: #15c !important; text-decoration: underline;"); // ---- the menu bar add("#docs-menubar .menu-button", "font: 13px " + font + " !important; color: #000 !important; border-radius: 0 !important; letter-spacing: normal !important;"); // ---- the page and what is around it add("#docs-editor, .kix-appview-editor, .kix-appview-editor-container, #docs-editor-container", "background: " + (old ? "#fff" : era === "d2010" ? "#ebebeb" : kennedy ? "#ebebeb" : era === "d2017" ? "#eee" : "#f8f9fa") + " !important;"); // ---- menus (Google's own, opened from the period's menu bar) add(".goog-menu", "font: 13px " + font + " !important; color: #000 !important; letter-spacing: normal !important;"); add(".goog-menu .goog-menuitem, .goog-menu .goog-menuitem-content", "font: 13px " + font + " !important; letter-spacing: normal !important;"); // ---- the toolbar icons: the period's own sheet in place of today's const icons = ugfDocsIconMap(era); if (!material) { const s = icons.size; // only the icons the period's sheet has are swapped; any other the period had // keeps Google's drawing (in grey), so a button never goes blank const named = function(k, pre) { return [pre + ".docs-icon-" + k + "-20", pre + ".docs-icon-" + k + "-24", pre + ".docs-icon-" + k + "-20x20"].join(", "); }; add(".docs-main-toolbars .docs-icon-img", "filter: grayscale(1) !important;"); Object.keys(icons.map).forEach(function(k) { const pos = icons.map[k]; const sheet = A["sprite_" + (pos[2] || icons.sprite)]; add(".docs-main-toolbars .docs-icon:has(> .docs-icon-" + k + "-20), .docs-main-toolbars .docs-icon:has(> .docs-icon-" + k + "-24), .docs-main-toolbars .docs-icon:has(> .docs-icon-" + k + "-20x20)", "width: " + s + "px !important; height: " + s + "px !important; margin: 0 !important; position: relative !important; overflow: hidden !important;"); add(named(k, ".docs-main-toolbars "), "content: normal !important; position: absolute !important; left: 0 !important; top: 0 !important; width: " + s + "px !important; height: " + s + "px !important; background: url(" + sheet + ") no-repeat !important; -webkit-mask: none !important; mask: none !important; opacity: " + ((pos[2] || icons.sprite) === "jfk" ? ".7" : "1") + " !important; filter: none !important;"); add(named(k, ".docs-main-toolbars ") .split(", ").map(function(x) { return x + "::before, " + x + "::after"; }).join(", "), "content: none !important; display: none !important;"); }); // the little arrow of the drop-downs const jfkArrow = icons.sprite === "jfk"; add(".docs-main-toolbars .docs-icon:has(> .docs-icon-arrow-dropdown), .docs-main-toolbars .goog-toolbar-menu-button-dropdown .docs-icon, .docs-main-toolbars .goog-toolbar-combo-button-dropdown .docs-icon", "width: 9px !important; height: 16px !important; margin: 0 !important; position: relative !important; overflow: hidden !important;"); add(".docs-main-toolbars .docs-icon-arrow-dropdown::before, .docs-main-toolbars .docs-icon-arrow-dropdown::after", "content: none !important; display: none !important;"); add(".docs-main-toolbars .docs-icon-arrow-dropdown", "content: normal !important; position: absolute !important; left: 0 !important; top: 0 !important; -webkit-mask: none !important; mask: none !important; filter: none !important; opacity: 1 !important; width: 9px !important; height: 16px !important; background: url(" + (jfkArrow ? A.sprite_jfk : A.sprite_editortoolbar) + ") no-repeat " + (jfkArrow ? "-6px -66px" : "-387px 0") + " !important;"); add(".docs-main-toolbars .goog-toolbar-menu-button-dropdown, .docs-main-toolbars .goog-toolbar-combo-button-dropdown", "width: 9px !important; margin: 0 0 0 2px !important; padding: 0 !important; vertical-align: middle !important;"); // the font size: a plain drop-down, not today's boxed number add("#fontSizeSelect .goog-toolbar-combo-button-input", "border: 0 !important; background: transparent !important; box-shadow: none !important; width: 26px !important; padding: 0 2px !important; text-align: left !important; font: " + (old || era === "d2010" ? "12px" : "11px") + " Arial, sans-serif !important; color: #333 !important; height: 18px !important;"); add("#fontSizeSelect .goog-toolbar-combo-button-caption", "display: inline-flex !important; align-items: center !important; height: 18px !important; margin: 0 !important; padding: 0 !important; vertical-align: middle !important;"); // today's number box sits on a taller row with its own offsets, which left the // number a few pixels below "Title" and "Arial": centre every layer of it instead add("#fontSizeSelect#fontSizeSelect", "vertical-align: middle !important; margin-top: 0 !important; margin-bottom: 0 !important; height: auto !important;"); add("#fontSizeSelect .goog-toolbar-combo-button-outer-box, #fontSizeSelect .goog-toolbar-combo-button-inner-box", "display: inline-flex !important; align-items: center !important; height: auto !important; margin: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; vertical-align: middle !important;"); add("#fontSizeSelect input.goog-toolbar-combo-button-input", "line-height: 18px !important; margin: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; vertical-align: middle !important; box-sizing: border-box !important; top: 0 !important; position: static !important;"); add("#fontSizeSelect .goog-toolbar-combo-button-caption::after", "content: ''; flex: 0 0 9px; width: 9px; height: 16px; background: url(" + (jfkArrow ? A.sprite_jfk : A.sprite_editortoolbar) + ") no-repeat " + (jfkArrow ? "-6px -66px" : "-387px 0") + ";"); add("#fontSizeSelect#fontSizeSelect.goog-toolbar-combo-button, #fontSizeSelect#fontSizeSelect.goog-toolbar-combo-button-hover, #fontSizeSelect#fontSizeSelect.goog-toolbar-combo-button-open, #fontSizeSelect .goog-toolbar-combo-button-outer-box, #fontSizeSelect .goog-toolbar-combo-button-inner-box", "border: 1px solid transparent !important; background: transparent !important; box-shadow: none !important; border-radius: " + (kennedy ? "2px" : "0") + " !important; width: auto !important;"); add("#fontSizeSelect#fontSizeSelect.goog-toolbar-combo-button-hover", "border-color: " + (kennedy ? "#c6c6c6" : "#a1badf") + " !important;"); // today's toolbar paints every button pale blue-grey: the period's were flat until pointed at add("#docs-toolbar .goog-toolbar-button, #docs-toolbar .goog-toolbar-menu-button, #docs-toolbar .goog-toolbar-combo-button, #docs-toolbar .goog-toolbar-toggle-button", "background-color: transparent !important;" + (kennedy ? "" : " border-radius: 0 !important; border: 1px solid transparent !important;")); if (!kennedy) { add("#docs-toolbar .goog-toolbar-button-hover, #docs-toolbar .goog-toolbar-menu-button-hover, #docs-toolbar .goog-toolbar-combo-button-hover", "border-color: #a1badf !important; background-color: transparent !important;"); add("#docs-toolbar .goog-toolbar-button-checked, #docs-toolbar .goog-toolbar-button-active, #docs-toolbar .goog-toolbar-menu-button-open, #docs-toolbar .goog-toolbar-menu-button-active", "border-color: #729bd1 !important; background-color: #dde1eb !important;"); add("#docs-toolbar .goog-toolbar-separator", "border-left: 1px solid #d6d6d6 !important; border-right: 1px solid #f7f7f7 !important; height: 20px !important; margin: 0 3px !important; background: none !important; width: 0 !important;"); add("#docs-toolbar .goog-toolbar-menu-button-caption, #docs-toolbar .goog-toolbar-combo-button-input", "font: 12px Arial, sans-serif !important; color: #000 !important;"); } Object.keys(icons.map).forEach(function(k) { const p = icons.map[k]; add(".docs-main-toolbars .docs-icon-" + k + "-20, .docs-main-toolbars .docs-icon-" + k + "-24, .docs-main-toolbars .docs-icon-" + k + "-20x20", "background-position: " + (-p[0]) + "px " + (-p[1]) + "px !important;"); }); } // ---- per period if (old) { // 2007-2010: logo, title and the save time on one white row, the account links on // the right; the menus on a pale blue bar, the toolbar under them; no ruler, no page add("#docs-branding-container, .docs-titlebar-badges", "display: none !important;"); add("#docs-header", "height: 52px !important;"); add("#ugf-docs-logo", "position: absolute; left: 8px; top: 9px; z-index: 5; line-height: 0;"); add("#ugf-docs-logo img", era === "d2007" ? "height: 36px; width: auto;" : "height: 30px; width: auto;"); add("#docs-titlebar-container", "margin-left: " + (era === "d2007" ? "162" : "136") + "px !important; position: static !important;"); add("#docs-titlebar", "height: 52px !important; padding: 0 !important;"); add(".docs-title-outer", "margin: 0 !important; padding: 22px 0 0 0 !important; align-items: flex-end !important;"); add(".docs-title-input-label, .docs-title-input-label-inner, .docs-title-input", "font-size: 17px !important; font-weight: bold !important; line-height: 22px !important;"); add("#ugf-docs-saved", "margin: 0 0 3px 10px; color: #666; align-self: flex-end;"); add(".docs-titlebar-buttons", "position: absolute !important; right: 8px !important; top: 24px !important; height: auto !important; padding: 0 !important; display: flex !important; align-items: center !important; gap: 6px !important; background: transparent !important;"); add("#docs-bars", "background: #e8eef7 !important; border-top: 1px solid #c3d9ff !important; border-bottom: 1px solid #c3d9ff !important;"); add("#docs-menubars, #docs-menubar", "height: 24px !important; margin: 0 !important; padding: 0 0 0 4px !important; background: transparent !important;"); add("#docs-menubar .menu-button", "padding: 4px 7px !important; margin: 0 !important; height: auto !important; line-height: 16px !important;"); add("#docs-menubar .menu-button.goog-control-hover, #docs-menubar .menu-button.goog-control-open", "background: #c3d9ff !important; color: #000 !important;"); add("#docs-toolbar-wrapper", "background: #fff !important; border: 0 !important; border-bottom: 1px solid #c3d9ff !important; border-radius: 0 !important; margin: 0 !important; padding: 2px 4px !important; box-shadow: none !important;"); add("#kix-horizontal-ruler-container, #kix-vertical-ruler-container", "display: none !important;"); add(".kix-page-paginated, .kix-page", "box-shadow: none !important; border: 0 !important;"); // the grey buttons of the time add("#docs-titlebar-share-client-button .jfk-button, #scb-quick-actions-menu-button, #docs-docos-commentsbutton", "background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; border-radius: 2px !important; color: #000 !important; height: 22px !important; min-width: 0 !important; padding: 0 8px !important; box-shadow: none !important; font: 13px Arial, sans-serif !important;"); add("#docs-titlebar-share-client-button .scb-button-icon", "display: none !important;"); add("#docs-docos-commentsbutton", "display: none !important;"); add("#ugf-docs-acct.links", "font-size: 13px;"); // Share and the arrow beside it are one split button; today's arrow is placed for a // 36px button, so in this short one it fell to the bottom edge - centre it add("#docs-titlebar-share-client-button", "display: inline-flex !important; align-items: stretch !important; vertical-align: middle !important;"); add("#docs-titlebar-share-client-button .jfk-button", "border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; display: inline-flex !important; align-items: center !important; line-height: normal !important; margin: 0 !important;"); add("#scb-quick-actions-menu-button", "position: relative !important; width: 18px !important; box-sizing: border-box !important; padding: 0 !important; margin: 0 0 0 -1px !important; border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; line-height: normal !important;"); add("#scb-quick-actions-menu-button .goog-flat-menu-button-caption", "display: none !important;"); add("#scb-quick-actions-menu-button .goog-flat-menu-button-dropdown", "position: absolute !important; top: 50% !important; left: 50% !important; right: auto !important; bottom: auto !important; margin: -2px 0 0 -4px !important; width: 0 !important; height: 0 !important; border-style: solid !important; border-width: 4px 4px 0 !important; border-color: #444 transparent !important; background: none !important;"); } if (era === "d2010") { // April 2010: the "Google docs" logo, the title and the save state on one row, the // menus on a lilac bar, the toolbar with its grey gradient, the page on grey add("#docs-branding-container, .docs-titlebar-badges", "display: none !important;"); add("#docs-header", "height: 44px !important;"); add("#ugf-docs-logo", "position: absolute; left: 6px; top: 7px; z-index: 5; line-height: 0;"); add("#ugf-docs-logo img", "height: 30px; width: auto;"); add("#docs-titlebar-container", "margin-left: 134px !important; position: static !important;"); add("#docs-titlebar", "height: 44px !important; padding: 0 !important;"); add(".docs-title-outer", "margin: 0 !important; padding: 9px 0 0 0 !important;"); add(".docs-title-input-label, .docs-title-input-label-inner, .docs-title-input", "font-size: 15px !important; font-weight: normal !important; line-height: 21px !important;"); add(".docs-titlebar-buttons", "position: absolute !important; right: 8px !important; top: 10px !important; height: auto !important; padding: 0 !important; display: flex !important; align-items: center !important; gap: 8px !important; background: transparent !important;"); add("#ugf-docs-saved", "position: absolute; right: 150px; top: 15px; color: #999; font-size: 12px;"); add("#ugf-docs-acct", "display: none;"); add("#docs-bars", "background: #e3e9ff !important; border-top: 2px solid #bcf !important;"); add("#docs-menubars, #docs-menubar", "height: auto !important; margin: 0 !important; padding: 0 !important; background: transparent !important;"); add("#docs-menubar .menu-button", "padding: 5px 8px !important; margin: 0 !important; height: auto !important; line-height: 16px !important; border: 0 !important;"); add("#docs-menubar .menu-button.goog-control-hover, #docs-menubar .menu-button.goog-control-open", "background: #68e !important; color: #fff !important;"); add("#docs-toolbar-wrapper", "background: #fafafa url(" + A.toolbarBg + ") repeat-x bottom left !important; border: 0 !important; border-top: 1px solid #fff !important; border-bottom: 1px solid #ccc !important; border-radius: 0 !important; margin: 0 !important; padding: 2px !important; box-shadow: none !important;"); add("#docs-titlebar-share-client-button .jfk-button, #scb-quick-actions-menu-button, #docs-docos-commentsbutton", "background: linear-gradient(#f9f9f9, #eee 60%, #e3e3e3) !important; border: 1px solid #bbb !important; border-radius: 2px !important; color: #222 !important; height: 24px !important; min-width: 0 !important; padding: 0 6px !important; box-shadow: none !important; font: bold 13px Arial, sans-serif !important;"); add("#docs-titlebar-share-client-button .jfk-button:hover, #scb-quick-actions-menu-button:hover", "border-color: #000 !important;"); add("#docs-docos-commentsbutton", "display: none !important;"); add("#docs-titlebar-share-client-button .scb-button-icon", "display: none !important;"); // Share and the arrow beside it are one split button; today's arrow is placed for a // 36px button, so in this short one it fell to the bottom edge - centre it add("#docs-titlebar-share-client-button", "display: inline-flex !important; align-items: stretch !important; vertical-align: middle !important;"); add("#docs-titlebar-share-client-button .jfk-button", "border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; display: inline-flex !important; align-items: center !important; line-height: normal !important; margin: 0 !important;"); add("#scb-quick-actions-menu-button", "position: relative !important; width: 18px !important; box-sizing: border-box !important; padding: 0 !important; margin: 0 0 0 -1px !important; border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; line-height: normal !important;"); add("#scb-quick-actions-menu-button .goog-flat-menu-button-caption", "display: none !important;"); add("#scb-quick-actions-menu-button .goog-flat-menu-button-dropdown", "position: absolute !important; top: 50% !important; left: 50% !important; right: auto !important; bottom: auto !important; margin: -2px 0 0 -4px !important; width: 0 !important; height: 0 !important; border-style: solid !important; border-width: 4px 4px 0 !important; border-color: #444 transparent !important; background: none !important;"); add(".kix-page-paginated, .kix-page", "box-shadow: 0 0 0 1px #d3d3d3 !important;"); } if (kennedy) { // autumn 2011 on: the title large on its own row with its star, the menus under it // with the save state after them, Comments and the blue Share on the right, the grey toolbar // (the app's square beside the title from April 2012) const lay = String(layout || ""); const sq = era === "d2014" || lay === "2013" || lay === "2013L"; add("#docs-branding-container", "display: none !important;"); add("#docs-header", "height: " + (sq ? 38 : 40) + "px !important;"); add("#ugf-docs-logo.square", "position: absolute; left: 16px; top: 12px; z-index: 5; line-height: 0;"); add("#ugf-docs-logo.square img", "width: 40px; height: 40px;"); add("#docs-titlebar-container", "margin-left: " + (sq ? 70 : 32) + "px !important; position: static !important;"); add("#docs-titlebar", "height: " + (sq ? 38 : 40) + "px !important; padding: 0 !important;"); add(".docs-title-outer", "margin: 0 !important; padding: " + (sq ? 10 : 12) + "px 0 0 0 !important;"); add(".docs-title-input-label, .docs-title-input-label-inner, .docs-title-input", "font-size: " + (sq ? 18 : 20) + "px !important; line-height: 26px !important; font-weight: normal !important;"); add(".docs-titlebar-badges", "margin: 0 0 0 6px !important;"); add(".docs-titlebar-buttons", "position: absolute !important; right: 16px !important; top: " + (sq ? 30 : 28) + "px !important; height: auto !important; padding: 0 !important; display: flex !important; align-items: center !important; gap: 8px !important; background: transparent !important;"); add("#ugf-docs-acct.mail", "top: 7px; right: 18px;"); add("#docs-bars", "background: #fff !important; border: 0 !important;"); add("#docs-menubars", "height: 29px !important; margin: 0 0 0 " + (sq ? 66 : 28) + "px !important; padding: 0 !important; display: flex !important; align-items: center !important; background: transparent !important;"); add("#docs-menubar", "margin: 0 !important; padding: 0 !important; height: 29px !important; display: flex !important; align-items: center !important;"); add("#docs-menubar .menu-button", "padding: 5px 9px 6px !important; margin: 0 !important; height: auto !important; line-height: 16px !important; border: 1px solid transparent !important;"); add("#docs-menubar .menu-button.goog-control-hover", "background: #eee !important; border-color: #eee !important;"); add("#docs-menubar .menu-button.goog-control-open", "background: #fff !important; border-color: #ccc !important; border-bottom-color: #fff !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important; z-index: 1002 !important;"); add("#ugf-docs-saved", "margin-left: 14px; font-size: 13px; color: #999;"); add("#docs-toolbar-wrapper", "background: #f5f5f5 !important; border: 0 !important; border-top: 1px solid #e5e5e5 !important; border-bottom: 1px solid #e5e5e5 !important; border-radius: 0 !important; margin: 0 !important; padding: 0 0 0 " + (sq ? 12 : 24) + "px !important; box-shadow: none !important; height: 35px !important;"); // the grey Comments button and the blue Share button add("#docs-docos-commentsbutton", "background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; border-radius: 2px !important; color: #444 !important; height: 27px !important; min-width: 54px !important; width: auto !important; padding: 0 8px !important; box-shadow: none !important; font: bold 11px Arial, sans-serif !important; display: inline-flex !important; align-items: center !important;"); add("#docs-docos-commentsbutton .docs-icon, #docs-docos-commentsbutton .docs-docos-commentsbutton-badge", "display: none !important;"); add("#docs-docos-commentsbutton::after", "content: 'Comments'; color: #444;"); add("#docs-docos-commentsbutton:hover", "border-color: #c6c6c6 !important; color: #222 !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); add("#docs-titlebar-share-client-button .jfk-button", "background: linear-gradient(#4d90fe, #4787ed) !important; border: 1px solid #3079ed !important; border-radius: 2px !important; color: #fff !important; height: 27px !important; min-width: 72px !important; padding: 0 12px !important; box-shadow: none !important; font: bold 11px Arial, sans-serif !important;"); add("#docs-titlebar-share-client-button .jfk-button:hover", "background: linear-gradient(#4d90fe, #357ae8) !important; border-color: #2f5bb7 !important;"); add("#docs-titlebar-share-client-button .scb-button-icon", "display: none !important;"); add("#scb-quick-actions-menu-button", "display: none !important;"); add(".kix-page-paginated, .kix-page", "box-shadow: 0 0 0 1px #d6d6d6, 0 2px 3px rgba(0,0,0,.1) !important;"); // the toolbar buttons: square, grey on hover, pressed darker add(".docs-main-toolbars .goog-toolbar-button, .docs-main-toolbars .goog-toolbar-menu-button", "border-radius: 2px !important; border: 1px solid transparent !important; background: transparent !important; margin: 0 1px !important; height: 27px !important; min-width: 0 !important; color: #444 !important; font: 11px Arial, sans-serif !important;"); add(".docs-main-toolbars .goog-toolbar-button-hover, .docs-main-toolbars .goog-toolbar-menu-button-hover", "border-color: #c6c6c6 !important; background: linear-gradient(#f8f8f8, #f1f1f1) !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); add(".docs-main-toolbars .goog-toolbar-button-checked, .docs-main-toolbars .goog-toolbar-button-active, .docs-main-toolbars .goog-toolbar-menu-button-open", "border-color: #ccc !important; background: linear-gradient(#eee, #e0e0e0) !important; box-shadow: inset 0 1px 2px rgba(0,0,0,.1) !important;"); add(".docs-main-toolbars .goog-toolbar-separator", "border-left: 1px solid #ddd !important; height: 21px !important; margin: 0 6px !important; background: none !important;"); } if (material) { // 2016 on: the app icon beside the title, the flat header, the white toolbar add("#docs-branding-container", "display: none !important;"); add("#ugf-docs-logo.mat", "position: absolute; left: 16px; top: 12px; z-index: 5; line-height: 0;"); add("#ugf-docs-logo.mat img", "width: 40px; height: 40px;"); add("#docs-titlebar-container, #docs-menubar", "margin-left: 64px !important;"); add(".docs-title-input-label, .docs-title-input-label-inner", "font-size: 18px !important; line-height: 24px !important;" + (era === "d2019" ? " font-family: 'Google Sans', Roboto, Arial, sans-serif !important;" : "")); add("#docs-menubar .menu-button", "font: 14px " + (era === "d2019" ? "'Google Sans', Roboto" : "Roboto") + ", Arial, sans-serif !important; padding: 2px 7px !important; border-radius: " + (era === "d2019" ? "4px" : "0") + " !important;"); add("#docs-menubar .menu-button.goog-control-hover, #docs-menubar .menu-button.goog-control-open", "background: " + (era === "d2019" ? "#f1f3f4" : "#eee") + " !important;"); add("#ugf-docs-saved", "margin-left: 12px; font-size: 14px; color: #777; text-decoration: " + (era === "d2019" ? "underline" : "none") + ";"); add("#docs-menubars", "display: flex !important; align-items: center !important;"); add("#docs-toolbar-wrapper", "background: " + (era === "d2019" ? "#fff" : "#eee") + " !important; border: 0 !important; border-top: 1px solid " + (era === "d2019" ? "#dadce0" : "#e0e0e0") + " !important; border-bottom: 1px solid " + (era === "d2019" ? "#dadce0" : "#ccc") + " !important; border-radius: 0 !important; margin: 0 !important; box-shadow: " + (era === "d2019" ? "0 1px 2px rgba(60,64,67,.15)" : "none") + " !important;"); add(".docs-main-toolbars .goog-toolbar-button, .docs-main-toolbars .goog-toolbar-menu-button", "border-radius: " + (era === "d2019" ? "4px" : "2px") + " !important; background: transparent !important;"); add(".docs-main-toolbars .goog-toolbar-button-hover, .docs-main-toolbars .goog-toolbar-menu-button-hover", "background: " + (era === "d2019" ? "#f1f3f4" : "#ddd") + " !important;"); add(".docs-main-toolbars .goog-toolbar-button-checked, .docs-main-toolbars .goog-toolbar-menu-button-open", "background: " + (era === "d2019" ? "#e8f0fe" : "#ccc") + " !important;"); add(".docs-main-toolbars .docs-icon-img", "filter: grayscale(1) brightness(.75) !important;"); add("#docs-titlebar-share-client-button .jfk-button", "background: " + (era === "d2019" ? "#1a73e8" : "#4285f4") + " !important; border: 0 !important; border-radius: " + (era === "d2019" ? "4px" : "2px") + " !important; color: #fff !important; height: 36px !important; padding: 0 16px !important; box-shadow: " + (era === "d2019" ? "none" : "0 1px 2px rgba(0,0,0,.25)") + " !important; font: 500 14px " + (era === "d2019" ? "'Google Sans', Roboto" : "Roboto") + ", Arial, sans-serif !important; text-transform: " + (era === "d2017" ? "uppercase" : "none") + " !important;"); add("#docs-titlebar-share-client-button .scb-button-icon", "filter: brightness(0) invert(1) !important;"); add("#scb-quick-actions-menu-button", "display: none !important;"); add("#docs-docos-commentsbutton", "background: #fff !important; border: 1px solid " + (era === "d2019" ? "#dadce0" : "#ccc") + " !important; border-radius: " + (era === "d2019" ? "4px" : "2px") + " !important; color: #444 !important; height: 36px !important; box-shadow: none !important;" + (era === "d2017" ? " width: auto !important; padding: 0 12px !important; display: inline-flex !important; align-items: center !important;" : "")); if (era === "d2017") { add("#docs-docos-commentsbutton .docs-icon, #docs-docos-commentsbutton .docs-docos-commentsbutton-badge", "display: none !important;"); add("#docs-docos-commentsbutton::after", "content: 'Comments'; font: 500 14px Roboto, Arial, sans-serif; color: #444;"); } add(".docs-titlebar-buttons", "padding-right: 0 !important; margin-right: 60px !important; background: transparent !important;"); add(".kix-page-paginated, .kix-page", "box-shadow: 0 1px 3px 1px rgba(60,64,67,.15) !important; border: 0 !important;"); } // ---- the menus that open from the bar, per period if (old) { add(".goog-menu", "background: #fff !important; border: 1px solid #8cacbb !important; border-radius: 0 !important; box-shadow: 2px 2px 3px rgba(0,0,0,.2) !important; padding: 2px 0 !important;"); add(".goog-menu .goog-menuitem-highlight, .goog-menu .goog-menuitem-hover", "background: #d6e9f8 !important; border: 0 !important; border-radius: 0 !important;"); add(".goog-menu .goog-menuitem-icon, .goog-menu .docs-icon", "visibility: hidden !important;"); add(".goog-menu .goog-menuitem", "padding: 4px 7em 4px 28px !important; min-height: 0 !important; line-height: 16px !important;"); } else if (era === "d2010") { add(".goog-menu", "background: #fff !important; border: 1px solid #aaa !important; border-radius: 0 !important; box-shadow: 1px 1px 3px rgba(0,0,0,.25) !important; padding: 2px 0 !important;"); add(".goog-menu .goog-menuitem-highlight, .goog-menu .goog-menuitem-hover", "background: #e0ecff !important; border: 0 !important; border-radius: 0 !important;"); add(".goog-menu .goog-menuitem-icon, .goog-menu .docs-icon", "visibility: hidden !important;"); add(".goog-menu .goog-menuitem", "padding: 4px 7em 4px 28px !important; min-height: 0 !important; line-height: 16px !important;"); } else if (kennedy) { add(".goog-menu", "background: #fff !important; border: 1px solid rgba(0,0,0,.2) !important; border-radius: 0 !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important; padding: 6px 0 !important;"); add(".goog-menu .goog-menuitem-highlight, .goog-menu .goog-menuitem-hover", "background: #eee !important; border-color: #eee !important; border-radius: 0 !important;"); add(".goog-menu .goog-menuitem", "padding: 6px 7em 6px 30px !important; min-height: 0 !important; line-height: 17px !important; color: #333 !important;"); add(".goog-menu .goog-menuitem-icon .docs-icon-img", "opacity: .7 !important;"); } else { add(".goog-menu", "background: #fff !important; border: 0 !important; border-radius: " + (era === "d2019" ? "4px" : "0") + " !important; box-shadow: 0 2px 6px 2px rgba(60,64,67,.15) !important;"); add(".goog-menu .goog-menuitem-highlight, .goog-menu .goog-menuitem-hover", "background: " + (era === "d2019" ? "#f1f3f4" : "#eee") + " !important; border-radius: 0 !important;"); add(".goog-menu .goog-menuitem, .goog-menu .goog-menuitem-content", "font-size: 14px !important;"); } // (6.5.6) Docs before 2019 was square everywhere: today's rounded menus, bubbles (the Edit / wrap // bar over a selected drawing or image), dialogs, toolbars and chips are squared, keeping what // was always round (radio buttons, switches, colour swatches, people's pictures). The "Premium", // "New" and "Updated" pills and dots in the menus are today's, not the period's: hidden. if (era !== "d2019") { const keep = ':not([class*="radio"]):not([role="radio"]):not([class*="avatar"]):not([class*="Avatar"])' + ':not(img):not([class*="switch"]):not([class*="Switch"]):not([class*="swatch"]):not([class*="palette-cell"])' + ':not([class*="colormenuitems"]):not([class*="color-menu-cell"]):not([class*="presence"])'; const scopes = [".goog-menu", "[class*=\"ubble\"]", "[role=\"menu\"]", "[role=\"dialog\"]", "[role=\"toolbar\"]", "[role=\"listbox\"]", ".modal-dialog", ".goog-modalpopup", ".docs-material-gm-dialog", ".jfk-bubble", ".docs-bubble"]; add(scopes.map(function(x) { return x + keep + ", " + x + " *" + keep; }).join(", ") + ", .jfk-button, .goog-toolbar-button, .goog-toolbar-menu-button, .goog-flat-menu-button, .docs-omnibox-input, .docs-gm3-button, [class*=\"FabView\"], [class*=\"chip\"]" + keep, "border-radius: 0 !important;"); add(".docs-new-badge, .docs-premium-badge, .docs-default-badge, .docs-action-updated-dot, .goog-menu [class*=\"-badge\"]:not(.docs-action-badge)", "display: none !important;"); } // ---- the comments pane (and the comment boxes beside the page): square, flat, in // the period's type and buttons, as the comment stream of before 2019 was if (era !== "d2019") { const SB = ".docs-docos-activity-sidebar"; const blue = old || era === "d2010" ? "linear-gradient(#5b8ae8, #3e6fd8) !important; border: 1px solid #2f5bb7" : kennedy ? "linear-gradient(#4d90fe, #4787ed) !important; border: 1px solid #3079ed" : "#4285f4 !important; border: 0"; add(SB + ", " + SB + " *, .docos-anchoreddocoview, .docos-anchoreddocoview *, .docs-docos-activitybox, .docs-docos-activitybox *", "border-radius: 0 !important;"); add(SB + ", .docs-docos-activitybox", "background: #fff !important; border: 1px solid " + (kennedy ? "rgba(0,0,0,.2)" : "#ccc") + " !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important; margin: 0 !important; font-family: " + font + " !important;"); add(SB + " *", "font-family: " + font + " !important; letter-spacing: normal !important;"); add(SB + " .docs-docos-activity-sidebar-header, " + SB + " .docos-streampane-header", "background: " + (kennedy ? "#f5f5f5" : "#fff") + " !important; border-bottom: 1px solid #e5e5e5 !important; min-height: 44px !important;"); add(SB + " .docs-docos-activity-sidebar-header-title", "font: " + (material ? "500 16px Roboto, Arial" : "bold 13px Arial") + ", sans-serif !important; color: #222 !important;"); // the "All comments / For you" tabs: plain text, the open one underlined add(SB + " [role='tab']", "background: transparent !important; color: #666 !important; box-shadow: none !important; font-size: 13px !important; font-weight: " + (kennedy || old ? "bold" : "500") + " !important;"); add(SB + " [role='tab'][aria-selected='true']", "color: " + (kennedy ? "#dd4b39" : "#222") + " !important; border-bottom: 2px solid " + (kennedy ? "#dd4b39" : "#4285f4") + " !important;"); add(SB + " [role='tab'] *, " + SB + " [role='tablist'] *", "background: transparent !important;"); add(SB + " [role='tablist']", "border-bottom: 1px solid #e5e5e5 !important;"); // the filter drop-downs and the plain buttons: the period's grey button add(SB + " .goog-flat-menu-button, " + SB + " [role='listbox'], " + SB + " button:not(.jfk-button-action):not([class*='close']):not([aria-label*='Close' i]):not([aria-label*='Search' i]):not([aria-label*='otification' i])", (old ? "background: linear-gradient(#fff, #ddd) !important; border: 1px solid #aaa !important; color: #000 !important;" : kennedy || era === "d2010" ? "background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; color: #444 !important;" : "background: #fff !important; border: 1px solid #ddd !important; color: #444 !important;") + " box-shadow: none !important; font-size: " + (material ? "13px" : "11px") + " !important; font-weight: bold !important; height: auto !important; min-height: 27px !important; padding: 0 10px !important;"); // "Add comment" / "Comment": the period's blue add(SB + " .jfk-button-action, " + SB + " [class*='filled'], " + SB + " .docos-input-buttons-post", "background: " + blue + " !important; color: #fff !important; box-shadow: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; font: bold " + (material ? "13px Roboto, Arial" : "11px Arial") + ", sans-serif !important; height: " + (material ? "32px" : "27px") + " !important; min-width: 72px !important; padding: 0 12px !important; text-transform: " + (era === "d2017" ? "uppercase" : "none") + " !important;"); add(SB + " .jfk-button-action *, " + SB + " [class*='filled'] *", "color: #fff !important; background: transparent !important;"); // each comment: a square box, yellow when pointed at, as it was add(SB + " .docos-streamdocoview, .docos-anchoreddocoview", "border: 1px solid #ddd !important; box-shadow: none !important; outline: 0 !important; margin: 8px !important; background: #fff !important;"); add(SB + " .docos-streamdocoview:hover, .docos-anchoreddocoview:hover", "background: #fff9d1 !important; border-color: #e5e1b7 !important; box-shadow: none !important;"); add(SB + " .docos-input-textarea, .docos-anchoreddocoview .docos-input-textarea", "border-radius: 0 !important; border: 1px solid #d9d9d9 !important; border-top-color: #c0c0c0 !important; background: #fff !important; font: 13px " + font + " !important;"); add(SB + " a", "color: #15c !important;"); } // ---- the link bubble (drawn by Gplex inside Google's) if (era !== "d2019") { add("[ugf-lb]", "border-radius: 0 !important; outline: 0 !important; padding: 0 !important; min-width: 0 !important; width: auto !important; height: auto !important; max-width: 520px !important; background: #fff !important; " + (old ? "border: 1px solid #999 !important; box-shadow: none !important;" : era === "d2010" ? "border: 1px solid #aaa !important; box-shadow: 1px 1px 3px rgba(0,0,0,.25) !important;" : kennedy ? "border: 1px solid rgba(0,0,0,.2) !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important;" : "border: 1px solid #ccc !important; box-shadow: 0 2px 4px rgba(0,0,0,.2) !important;")); add("[ugf-lb] > :not(.ugf-lb)", "display: none !important;"); add("[ugf-lb] .ugf-lb", "display: block; padding: " + (old || era === "d2010" ? "4px 7px" : "7px 10px") + "; font: 13px " + font + "; color: #222; white-space: nowrap; line-height: 17px; letter-spacing: normal; text-align: left;"); add("[ugf-lb] .ugf-lb .lbl", "color: " + (old || era === "d2010" ? "#000" : "#222") + ";"); add("[ugf-lb] .ugf-lb a", "display: inline !important; max-width: none !important; color: #15c !important; text-decoration: underline !important; cursor: pointer; font: inherit !important;"); add("[ugf-lb] .ugf-lb a.go", "color: " + (old ? "#00c" : "#15c") + " !important;"); add("[ugf-lb] .ugf-lb .sep", "color: #666;"); } // ---- dialogs if (old || era === "d2010") { add(".modal-dialog", "border: 1px solid #6b90da !important; border-radius: 0 !important; box-shadow: 3px 3px 6px rgba(0,0,0,.3) !important; padding: 0 !important; background: #fff !important;"); add(".modal-dialog-title", "background: #e0edfe !important; color: #000 !important; font: bold 13px Arial, sans-serif !important; padding: 6px 30px 6px 10px !important; border-bottom: 1px solid #6b90da !important;"); add(".modal-dialog-content", "padding: 10px !important; font: 13px Arial, sans-serif !important;"); } else if (kennedy) { add(".modal-dialog", "border: 1px solid #acacac !important; border-radius: 0 !important; box-shadow: 0 4px 16px rgba(0,0,0,.2) !important; padding: 30px 42px !important; background: #fff !important;"); add(".modal-dialog-title", "font: 16px Arial, sans-serif !important; color: #222 !important; background: transparent !important;"); add(".modal-dialog-buttons button, .modal-dialog-buttons .goog-buttonset-default", "border-radius: 2px !important; font: bold 11px Arial, sans-serif !important; height: 29px !important; padding: 0 8px !important;"); } return css; } // ---- Sheets: the formula bar, the sheet tabs and the grid's frame, per period ------ function ugfSheetsEditorCss(era, A) { const P = 'html[gplex-docs="' + era + '"][gplex-docs-app="sheets"]'; const old = era === "d2007" || era === "d2009"; const kennedy = era === "d2011" || era === "d2014"; const material = era === "d2017" || era === "d2019"; const gm = era === "d2019"; const font = material ? "Roboto, RobotoDraft, Helvetica, Arial, sans-serif" : "Arial, sans-serif"; const css = []; const add = function(sel, body) { css.push(sel.split(",").map(function(x) { return P + " " + x.trim(); }).join(", ") + " { " + body + " }"); }; // what the periods did not have: the view-only chip, the find-in-menus box, // the previous/next arrows, Explore and the side panels add("#viewModeButton, #docs-toolbar-iterator-previous, #docs-toolbar-iterator-next, .docs-sheet-canvas-button, " + "#waffle-explore-button, .waffle-assistant-entry, [class*='explore-button'], .docs-sheet-status-container-avs, " + // Google's AI: the "Tables" panel, the assistant, the chip extraction, Gemini ".building-blocks-sidebar, .waffle-sidebar-container:has(.building-blocks-sidebar), [class*='waffle-inline-assistant'], " + ".waffle-sidebar-container:has([class*='inline-assistant']), .waffle-sidebar-container:has([class*='chip-extraction']), [class*='smart-summary'], " + (gm ? "" : ".waffle-name-box-container, #t-name-box-dropdown, .name-box-dropdown, #formula-bar-name-box-wrapper > .formula-bar-separator, ") + "#t-formula-bar-columnsmith-text", "display: none !important;"); // ---- the $ % 123 buttons: text, as they always were add("#t-num-fmt-currency, #t-num-fmt-percent, #t-num-fmt-other, #t-num-fmt-currency *, #t-num-fmt-percent *, #t-num-fmt-other *", "font-family: " + font + " !important; color: " + (old || era === "d2010" ? "#000" : "#444") + " !important; letter-spacing: normal !important;"); add("#t-num-fmt-currency, #t-num-fmt-percent, #t-num-fmt-other", "font-weight: bold !important; font-size: " + (old || era === "d2010" ? "12px" : "11px") + " !important;"); // ---- the formula bar add(".formula-bar-separator-container, #formula-bar .formula-bar-separator", "display: none !important;"); add("#formula-bar, #formula-bar-container, .formula-bar-container", "border-radius: 0 !important; box-shadow: none !important; margin: 0 !important;"); add("#formula-bar", "background: #fff !important; border: 0 !important; " + (old ? "border-bottom: 1px solid #c3d9ff !important;" : era === "d2010" ? "border-bottom: 1px solid #ccc !important;" : "border-bottom: 1px solid " + (gm ? "#e0e0e0" : "#d4d4d4") + " !important;")); add("#t-formula-bar-input, #t-formula-bar-input .cell-input", "font: 13px " + (gm ? "Roboto, Arial" : "Arial") + ", sans-serif !important; color: #000 !important;"); add("#t-formula-bar-input-container", "border-radius: 0 !important; background: #fff !important;"); if (old || era === "d2010") { // "Formula:" and a plain box, as in 2010 (and the boxed cell text before it) add("#t-formula-bar-label .docs-icon", "display: none !important;"); add("#t-formula-bar-label", "width: auto !important; padding: 0 6px 0 8px !important; display: flex !important; align-items: center !important; background: " + (old ? "#e8eef7" : "#fff") + " !important;"); add("#t-formula-bar-label::before", "content: 'Formula:'; font: 13px Arial, sans-serif; color: #333; white-space: nowrap;"); add("#t-formula-bar-input-container", "border: 1px solid #bbb !important; border-top-color: #999 !important; margin: 2px 4px 2px 0 !important;"); add("#formula-bar", "background: " + (old ? "#e8eef7" : "#fff") + " !important;"); } else { add("#t-formula-bar-label", "opacity: .6 !important; background: transparent !important;"); add("#t-formula-bar-label .docs-icon-img", "filter: grayscale(1) !important;"); } // ---- the tabs under the grid add("#grid-bottom-bar", "background: " + (old ? "#fff" : era === "d2010" ? "#ebebeb" : gm ? "#f8f9fa" : "#f1f1f1") + " !important; border-top: 1px solid " + (old ? "#c3d9ff" : era === "d2010" ? "#bbb" : "#ccc") + " !important; box-shadow: none !important;"); add(".docs-sheet-tab, .docs-sheet-tab .docs-sheet-tab-outer-box, .docs-sheet-tab .docs-sheet-tab-inner-box", "border-radius: 0 !important;"); add(".docs-sheet-tab", "box-shadow: none !important; font-family: " + (gm ? "'Google Sans', Roboto, Arial" : material ? "Roboto, Arial" : "Arial") + ", sans-serif !important; letter-spacing: normal !important;"); add(".docs-sheet-tab-name", "font-family: inherit !important; letter-spacing: normal !important;"); add(".docs-sheet-button, .docs-sheet-button .docs-sheet-button-outer-box, .docs-sheet-button .docs-sheet-button-inner-box", "border-radius: 0 !important;"); if (old) { // 2008-2010: "Add Sheet", then the sheets as links; the one open boxed in blue add(".docs-sheet-tab", "background: transparent !important; border: 1px solid transparent !important; color: #00c !important; text-decoration: underline !important; font-size: 12px !important; margin: 2px 4px !important; height: auto !important;"); add(".docs-sheet-tab *", "color: #00c !important;"); add(".docs-sheet-active-tab", "background: #e8eef7 !important; border-color: #c3d9ff !important; text-decoration: none !important; font-weight: bold !important;"); add(".docs-sheet-add-button", "display: inline-flex !important; align-items: center !important; width: auto !important; height: 20px !important; padding: 0 8px !important; margin: 2px 6px 2px 0 !important; background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; border-radius: 2px !important;"); add(".docs-sheet-add-button[aria-hidden='true']", "display: none !important;"); add(".docs-sheet-add-button .docs-icon", "display: none !important;"); add(".docs-sheet-add-button::after", "content: 'Add Sheet'; font: 12px Arial, sans-serif; color: #000;"); add(".docs-sheet-all-button", "display: none !important;"); } else if (era === "d2010") { add(".docs-sheet-tab", "background: #ddd !important; border: 1px solid #bbb !important; border-top: 0 !important; color: #333 !important; font-size: 12px !important; margin: 0 1px !important;"); add(".docs-sheet-active-tab", "background: #fff !important; color: #000 !important; font-weight: bold !important;"); add(".docs-sheet-button", "background: linear-gradient(#f9f9f9, #e3e3e3) !important; border: 1px solid #bbb !important;"); } else if (kennedy) { add(".docs-sheet-tab", "background: #f1f1f1 !important; border: 1px solid transparent !important; border-top: 0 !important; color: #444 !important; font-size: 12px !important;"); add(".docs-sheet-tab-hover", "background: #e5e5e5 !important;"); add(".docs-sheet-active-tab", "background: #fff !important; border-color: #ccc !important; color: #222 !important; font-weight: bold !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); add(".docs-sheet-button", "background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; margin: 0 2px !important;"); add(".docs-sheet-button-hover", "border-color: #c6c6c6 !important; box-shadow: 0 1px 1px rgba(0,0,0,.1) !important;"); } else { add(".docs-sheet-tab", "background: transparent !important; border: 0 !important; color: " + (gm ? "#5f6368" : "#666") + " !important; font-size: " + (gm ? "14px" : "13px") + " !important;"); add(".docs-sheet-tab-hover", "background: " + (gm ? "#f1f3f4" : "#e5e5e5") + " !important;"); add(".docs-sheet-active-tab", "background: #fff !important; color: " + (gm ? "#188038" : "#222") + " !important; font-weight: " + (gm ? "500" : "bold") + " !important; box-shadow: 0 1px 3px rgba(0,0,0,.2) !important;"); add(".docs-sheet-active-tab *", "color: inherit !important;"); add(".docs-sheet-button", "background: transparent !important; border: 0 !important;"); } add(".docs-sheet-active-tab .docs-sheet-tab-name", "color: inherit !important;"); return css; } // ---- Slides: the Present button, the slide strip, the notes and the canvas --------- function ugfSlidesEditorCss(era, A, app) { // Slides, and Drawings (the same editor: the Present button and the strip of // slides are simply not there) const P = 'html[gplex-docs="' + era + '"][gplex-docs-app="' + (app === "drawings" ? "drawings" : "slides") + '"]'; const old = era === "d2007" || era === "d2009"; const kennedy = era === "d2011" || era === "d2014"; const material = era === "d2017" || era === "d2019"; const gm = era === "d2019"; const font = material ? "Roboto, RobotoDraft, Helvetica, Arial, sans-serif" : "Arial, sans-serif"; const css = []; const add = function(sel, body) { css.push(sel.split(",").map(function(x) { return P + " " + x.trim(); }).join(", ") + " { " + body + " }"); }; if (gm) { // 2019-2022: rounded is right; only the word "Slideshow" goes (done in the script) return css; } add("#viewModeButton, #slide-library-container, .punch-filmstrip-thumbnail-recently-modified-indicator-container", "display: none !important;"); // ---- the Present button add("#punch-start-presentation-left, #punch-start-presentation-right", "border-radius: 0 !important; font: " + (old || era === "d2010" ? "13px Arial" : kennedy ? "bold 11px Arial" : "500 14px Roboto, Arial") + ", sans-serif !important; letter-spacing: normal !important; box-shadow: none !important; height: " + (kennedy ? "27px" : old || era === "d2010" ? "24px" : "36px") + " !important; line-height: " + (kennedy ? "25px" : old || era === "d2010" ? "22px" : "34px") + " !important; padding-bottom: 0 !important; vertical-align: middle !important;"); add("#punch-start-presentation-left", "padding: 0 " + (kennedy ? "10px" : "12px") + " !important; text-transform: " + (era === "d2017" ? "uppercase" : "none") + " !important;"); add("#punch-start-presentation-left, #punch-start-presentation-right", old ? "background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; color: #000 !important;" : era === "d2010" ? "background: linear-gradient(#f9f9f9, #eee 60%, #e3e3e3) !important; border: 1px solid #bbb !important; color: #222 !important;" : kennedy ? "background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; color: #444 !important;" : "background: #fff !important; border: 1px solid #ccc !important; color: #444 !important;"); add(".punch-start-presentation-container", "border-radius: 0 !important;"); if (era !== "d2007" && era !== "d2009" && era !== "d2010") { // the play arrow (Google's own present.png of 2012-2018) before the word add("#punch-start-presentation-left::before", "content: ''; display: inline-block; width: 21px; height: 21px; margin: 0 6px 0 -4px; vertical-align: middle; background: url(" + A.pPresent + ") no-repeat center; opacity: .65; position: relative; top: -1px;"); add("#punch-start-presentation-left .docs-icon, #punch-start-presentation-left .punch-start-presentation-icon", "display: none !important;"); } add("#punch-start-presentation-right", "width: 22px !important; min-width: 0 !important; padding: 0 !important; margin-left: -1px !important;"); add("#punch-start-presentation-right .goog-flat-menu-button-dropdown", "border-color: #777 transparent !important; top: 50% !important; right: 7px !important; margin-top: -2px !important;"); // ---- the canvas, the strip of slides, the notes const bg = old ? "#fff" : era === "d2010" ? "#ebebeb" : kennedy ? "#e5e5e5" : "#eee"; add("#workspace-container, #filmstrip-controls, .filmstrip, #speakernotes-dragger, .punch-filmstrip-visibility-toggle-icon-container, .two-panel-layout", "background: " + bg + " !important;"); add(".filmstrip, .punch-filmstrip-scroll", "background: " + (old || era === "d2010" ? "#fff" : kennedy ? "#fff" : "#f5f5f5") + " !important;"); add(".punch-filmstrip-scroll", "border-right: 1px solid " + (old ? "#c3d9ff" : "#ccc") + " !important;"); add(".punch-filmstrip-thumbnail-background, .punch-filmstrip-thumbnail-border, .punch-filmstrip-thumbnail-border-inner, .punch-filmstrip-thumbnail-drag-overlay, #filmstrip clipPath rect, #pages clipPath rect", "rx: 0 !important; ry: 0 !important;"); add(".punch-filmstrip-thumbnail-border", "stroke: " + (old ? "#c3d9ff" : "#bbb") + " !important; stroke-width: 1px !important;"); // the slide you are on: a thick border in the period's colour add(".punch-filmstrip-thumbnail-border[style*='stroke']", "stroke: " + (old ? "#3366cc" : era === "d2010" ? "#3366cc" : kennedy ? "#f1c232" : "#f4b400") + " !important; stroke-width: " + (kennedy || material ? "3px" : "2px") + " !important;"); add(".punch-filmstrip-thumbnail-pagenumber, .punch-filmstrip-selected-thumbnail-pagenumber", "font-family: " + font + " !important; font-size: 11px !important; font-weight: normal !important; fill: #777 !important;"); add("#speakernotes", "border-radius: 0 !important; margin: 0 !important; background: #fff !important; border-top: 1px solid #ccc !important;"); add("#speakernotes-workspace, #speakernotes.speakernotes-editing, #speakernotes.speakernotes-editing #speakernotes-workspace, #speakernotes:hover, #speakernotes-workspace:hover", "background: #fff !important;"); add("#speakernotes-dragger", "padding-bottom: 0 !important; height: 6px !important; border-top: 1px solid #ccc !important;"); add(".speakernotes-dragger-thumb", "border-radius: 0 !important; background: #bbb !important; height: 1px !important;"); add("#speakernotes-bottom-spacer", "height: 0 !important;"); if (era === "d2017") { add("#filmstrip-controls", "border-top: 1px solid #ddd !important;"); add(".punch-filmstrip-controls-view-tab-bar .goog-tab, #grid-view-toggle, .punch-filmstrip-visibility-toggle-icon-container, .punch-filmstrip-controls-size-buttons, .punch-filmstrip-controls-size-buttons .goog-flat-button", "border-radius: 0 !important;"); add("#grid-view-toggle", "background: transparent !important; box-shadow: none !important;"); add(".punch-filmstrip-controls-grid-view-toggle-text", "display: none !important;"); } else { // the grid view and the strip's own controls came in 2016 add("#filmstrip-controls, #filmstrip-grid-view-controls-container, #filmstrip-visibility-controls-container", "display: none !important;"); } return css; } // ---- the documents list per period ------------------------------------------------ function ugfDocsHomeCss(era, A) { const H = "#ugf-docs-home"; const c = []; const add = function(sel, body) { c.push(sel.split(",").map(function(s) { return H + " " + s.trim(); }).join(", ") + " { " + body + " }"); }; c.push(H + " { display: flex; flex-direction: column; overflow: hidden; }"); add("a", "cursor: pointer;"); add(".body", "flex: 1; display: flex; min-height: 0;"); add(".side", "flex: 0 0 auto; overflow: auto;"); add(".main", "flex: 1; overflow: auto; min-width: 0;"); add("form", "display: flex; align-items: center; margin: 0;"); add(".sp", "flex: 1;"); add(".empty", "padding: 24px; color: #666; font-size: 13px;"); add("table.list", "width: 100%; border-collapse: collapse; table-layout: fixed;"); add("table.list td, table.list th", "white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: left; font-weight: normal;"); add("table.list .cb", "width: 26px;"); add("table.list .st", "width: 22px;"); add("table.list .ow, table.list .fs", "width: 24%;"); add("table.list .dt", "width: 17%;"); add("table.list .fi", "width: 16px; height: 16px; vertical-align: -3px; margin-right: 6px;"); add("table.list tr[data-id]", "cursor: default;"); add(".star", "display: inline-block; width: 15px; height: 15px; cursor: pointer; vertical-align: middle;"); // the classic links above everything add(".toplinks", "display: flex; justify-content: space-between; padding: 3px 8px 0; height: 24px; font-size: 13px;"); add(".toplinks .left > *", "margin-right: 8px;"); add(".toplinks a", "color: #00c;"); add(".toplinks .more small", "font-size: 9px;"); if (era === "d2007" || era === "d2009" || era === "d2010") { add(".hdr", "display: flex; align-items: center; gap: 10px; padding: 8px 8px 10px;"); add(".hdr .logo img", "display: block;"); add(".srch input", "width: 290px; height: 22px; font-size: 13px; padding: 1px 3px; border: 1px solid; border-color: #999 #ccc #ccc #999;"); add(".srch button", "margin-left: 5px; font-size: 13px; padding: 2px 6px;"); add(".srch .opts, .srch .tpl", "margin-left: 8px; font-size: 11px; color: #00c;"); add(".star", "width: 16px; height: 16px; background: url(" + (era === "d2010" ? A.sprite_doclist2011 : A.sprite_doclist2008) + ") no-repeat -304px 0;"); add(".star.on", "background-position: -240px 0;"); } if (era === "d2010") { add(".gb10", "display: flex; justify-content: space-between; align-items: center; height: 30px; padding: 0 8px 0 10px; font: 13px Arial, sans-serif;"); add(".gb10 .left a", "color: #11c; margin-right: 11px; text-decoration: none;"); add(".gb10 .left b", "margin-right: 11px; color: #000;"); add(".gb10 .left a:hover, .gb10 .right a:hover", "text-decoration: underline;"); add(".gb10 .left .more small", "font-size: 8px; color: #777;"); add(".gb10 .right", "display: flex; align-items: center;"); add(".gb10 .right a", "color: #11c; text-decoration: none;"); add(".gb10 .right .bar", "color: #999; margin: 0 12px;"); add(".gb10 .right .who", "font-weight: bold;"); add(".gb10 .gear", "display: inline-flex; margin-left: 6px; color: #36c;"); add(".hdr .logo.g10", "display: flex; align-items: flex-end; text-decoration: none;"); add(".hdr .logo.g10 img", "height: 40px; width: auto;"); add(".hdr .logo.g10 .dw", "font: 26px Arial, sans-serif; color: #3a66cc; margin: 0 0 3px 3px; line-height: 1;"); } if (era === "d2007") { add(".hdr .logo img", "height: 55px;"); add(".bar", "display: flex; gap: 22px; align-items: center; margin: 0 10px; height: 33px; padding: 0 12px; background: #5b9bd5; background: linear-gradient(#78aee4, #4a8bd0); color: #fff; font-size: 14px; border-radius: 4px 4px 0 0;"); add(".bar a, .bar span", "color: #fff; text-decoration: none; cursor: pointer;"); add(".body", "margin: 0 10px; border: 1px solid #a9c4e8; border-top: 0;"); add(".side", "width: 210px; background: #fff; border-right: 3px solid #c3d9ff; padding: 4px 0; font-size: 13px;"); add(".side > div", "padding: 3px 10px;"); add(".side .in", "padding-left: 34px;"); add(".side .sel", "background: #c3d9ff;"); add("table.list thead th", "background: #e8eef7; border-bottom: 1px solid #c3d9ff; height: 24px; font-weight: bold; color: #333; padding: 0 4px;"); add("table.list td", "height: 23px; border-bottom: 1px solid #eee; padding: 0 4px;"); add("table.list td.nm a", "color: #000; font-weight: bold; text-decoration: none;"); add("table.list td.fs, table.list td.dt", "color: #666;"); add("tr.hl td, tr.ck td", "background: #ffc;"); add(".foot", "display: flex; justify-content: space-between; margin: 0 10px 6px; padding: 4px 8px; background: #e8eef7; font-size: 13px;"); } if (era === "d2009") { add(".side", "width: 190px; padding: 0 0 0 8px; font-size: 13px;"); add(".btns", "display: flex; gap: 6px; margin: 2px 0 10px;"); add(".gbtn", "display: inline-block; padding: 2px 8px; border: 1px solid; border-color: #bbb #999 #999 #bbb; border-radius: 2px; background: linear-gradient(#fff, #ddd); color: #000; text-decoration: none; font-size: 13px; cursor: pointer;"); add(".nav > div", "padding: 3px 6px; cursor: pointer;"); add(".nav .sel", "background: #c3d9ff; font-weight: bold;"); add(".nav .grp", "margin-top: 6px;"); add(".nav .in", "padding-left: 20px; color: #666;"); add(".main", "margin: 0 8px; border: 1px solid #c3d9ff;"); add(".mhead", "background: #c3d9ff; padding: 5px 8px; font-size: 14px;"); add(".acts", "display: flex; gap: 4px; padding: 5px 6px; background: #e8eef7; border-bottom: 1px solid #c3d9ff;"); add("table.list thead th", "height: 22px; color: #666; font-size: 12px; padding: 0 4px; border-bottom: 1px solid #ddd;"); add("table.list td", "height: 24px; border-bottom: 1px solid #eee; padding: 0 4px;"); add("table.list td.nm a", "color: #000; text-decoration: none;"); add("table.list td.fs, table.list td.dt", "color: #666; font-size: 12px;"); add("tr.hl td, tr.ck td", "background: #e8eef7;"); } if (era === "d2010") { add(".side", "width: 200px; padding: 0 0 0 8px; font-size: 13px;"); add(".btns", "display: flex; gap: 6px; margin: 2px 0 12px;"); add(".gbtn", "display: inline-block; padding: 3px 8px; border: 1px solid #bbb; border-radius: 2px; background: linear-gradient(#f9f9f9, #eee 60%, #e3e3e3); color: #222; text-decoration: none; font: bold 13px Arial, sans-serif; cursor: pointer;"); add(".nav > div", "padding: 3px 6px; cursor: pointer;"); add(".nav .sel", "background: #e0ecff; font-weight: bold;"); add(".nav .grp", "margin-top: 8px;"); add(".main", "margin: 0 8px 0 4px;"); add(".mhead", "font-size: 18px; padding: 2px 4px 6px;"); add(".acts", "display: flex; gap: 14px; padding: 5px 8px; font-size: 13px;"); add(".acts.blue", "background: #c3d9ff; color: #000;"); add("table.list thead th", "height: 24px; color: #666; font-size: 12px; padding: 0 4px; border-bottom: 1px solid #ddd;"); add("table.list td", "height: 25px; border-bottom: 1px solid #ebebeb; padding: 0 4px;"); add("table.list td.nm a", "color: #000; text-decoration: none;"); add("table.list .tag", "color: #999; font-size: 11px;"); add("table.list td.ow, table.list td.dt", "color: #666; font-size: 12px;"); add("tr.hl td, tr.ck td", "background: #ffc;"); } if (era === "d2011") { add(".khead", "display: flex; align-items: center; height: 72px; padding: 0 16px 0 20px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5;"); add(".glogo img", "display: block; width: 117px; height: 44px;"); add(".ksrch", "margin-left: 78px;"); add(".ksrch input", "width: 460px; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 0 8px; font-size: 13px; background: #fff;"); add(".kbtn", "display: inline-flex; align-items: center; justify-content: center; height: 29px; min-width: 54px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif; text-decoration: none; cursor: default; margin-right: 8px;"); add(".kbtn.blue", "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff; margin: 0 0 0 8px; width: 72px;"); add(".kbtn.red", "background: linear-gradient(#dd4b39, #d14836); border-color: #c6322a; color: #fff; min-width: 0; padding: 0 12px;"); add(".kbtn.red.up", "font-size: 16px; padding: 0 9px;"); add(".kbtn .mi svg", "fill: #fff;"); add(".ktool", "display: flex; align-items: center; height: 57px; padding: 0 16px 0 0; border-bottom: 1px solid #ebebeb;"); add(".ktool .app", "width: 214px; padding-left: 20px; font-size: 20px; color: #dd4b39;"); add(".side", "width: 214px; padding: 16px 0 0 0;"); add(".btns", "display: flex; padding-left: 20px; margin-bottom: 16px;"); add(".nav > div", "padding: 0 0 0 20px; line-height: 24px; color: #222; cursor: pointer; font-size: 13px;"); add(".nav .sel", "color: #dd4b39; font-weight: bold;"); add(".nav .grp", "padding-left: 8px; margin-top: 8px;"); add(".main", "padding: 0 16px 0 0;"); add("table.list thead th", "height: 34px; color: #666; font-size: 13px; padding: 0 4px; border-bottom: 1px solid #ebebeb;"); add("table.list thead th.on", "color: #dd4b39;"); add("table.list td", "height: 34px; border-bottom: 1px solid #ebebeb; padding: 0 4px;"); add("table.list td.nm a", "color: #222; text-decoration: none;"); add("table.list td.nm a:hover", "text-decoration: underline;"); add("table.list .tag", "color: #777; font-size: 11px;"); add("table.list td.ow, table.list td.dt", "color: #222;"); add(".star", "opacity: .35; background: url(" + A.sprite_jfk + ") no-repeat 0 -672px; width: 21px; height: 21px;"); add(".star.on", "opacity: 1; filter: sepia(1) saturate(8) hue-rotate(5deg);"); add("tr.hl td, tr.ck td", "background: #ffc;"); add("tr[data-id]:hover td", "background: #f5f5f5;"); } if (era === "d2014" || era === "d2017" || era === "d2019") { const gm = era === "d2019"; const f = gm ? "'Google Sans', Roboto, Arial, sans-serif" : "Roboto, RobotoDraft, Helvetica, Arial, sans-serif"; c.push(H + " { font-family: " + f + "; background: " + (era === "d2014" ? "#eee" : "#fff") + "; }"); add(".appbar", "display: flex; align-items: center; height: 64px; padding: 0 8px; flex: 0 0 auto; " + (era === "d2014" ? "background: #4285f4; color: #fff; box-shadow: 0 2px 4px rgba(0,0,0,.25);" : "background: #fff; color: #5f6368; border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";")); add(".appbar .ib", era === "d2014" ? "color: #fff;" : ""); add(".appbar .ham", "margin-right: 4px;"); add(".appbar .dicon", "width: 40px; height: 40px; margin: 0 4px;"); add(".appbar .name", "font-size: 22px; " + (era === "d2014" ? "color: #fff; font-size: 20px; margin-left: 12px;" : "color: #5f6368; margin-left: 4px;") + " min-width: 150px;"); add(".msrch", "position: relative; flex: 0 1 720px; margin: 0 auto 0 " + (era === "d2014" ? "40" : "30") + "px;"); add(".msrch input", "width: 100%; height: " + (gm ? "48px" : "40px") + "; border: 0; border-radius: " + (gm ? "8px" : "2px") + "; padding: 0 16px 0 56px; font: 16px " + f + "; outline: none; " + (era === "d2014" ? "background: rgba(255,255,255,.2); color: #fff;" : "background: #f1f3f4; color: #202124;")); add(".msrch input::placeholder", era === "d2014" ? "color: rgba(255,255,255,.8);" : "color: #5f6368;"); add(".msrch .sic", "position: absolute; left: 16px; top: 50%; transform: translateY(-50%); display: inline-flex; " + (era === "d2014" ? "color: #fff;" : "color: #5f6368;")); add(".corner", "display: flex; align-items: center; margin-left: 12px;"); add(".content", "flex: 1; overflow: auto; padding: 16px " + (era === "d2014" ? "24px" : "calc(50% - 480px)") + " 80px;"); add(".rhead", "display: flex; align-items: center; height: 48px; color: #202124; font-size: 16px; font-weight: 500; " + (era === "d2014" ? "color: #666;" : "")); add(".rhead .ib", "color: #5f6368;"); add(".rhead .own", "display: inline-flex; align-items: center; font-size: 14px; color: #5f6368; margin-right: 16px;"); add(".cards", "display: grid; grid-template-columns: repeat(auto-fill, 208px); gap: 16px; justify-content: " + (era === "d2014" ? "start" : "space-between") + ";"); add(".card", "display: block; width: 208px; background: #fff; border: 1px solid " + (era === "d2014" ? "transparent" : "#dfe1e5") + "; border-radius: " + (gm ? "4px" : "2px") + "; color: #202124; text-decoration: none; overflow: hidden; " + (era === "d2014" ? "box-shadow: 0 1px 2px rgba(0,0,0,.25);" : "")); add(".card:hover", "border-color: " + (gm ? "#b8d0f8" : "#aaa") + ";"); add(".card .th", "height: 208px; background: #fff; border-bottom: 1px solid #e2e2e2; overflow: hidden; display: flex; justify-content: center;"); add(".card .th img", "width: 100%; height: auto; min-height: 100%; object-fit: cover; object-position: top;"); add(".card .ft", "padding: 14px 8px 8px 16px;"); add(".card .t", "font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 6px;"); add(".card .m", "display: flex; align-items: center; gap: 8px; font-size: 12px; color: #5f6368;"); add(".card .m .fi", "width: 16px; height: 16px;"); add(".card .m span:not(.dots)", "flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".card .dots", "display: inline-flex; color: #5f6368;"); add(".fab", "position: fixed; right: 32px; bottom: 32px; width: 56px; height: 56px; border-radius: 50%; background: #4285f4; color: #fff; display: flex; align-items: center; justify-content: center; box-shadow: 0 3px 6px rgba(0,0,0,.3); z-index: 5;"); // the drawer behind the menu button: square-cornered until 2019 add(".dfence", "display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 20;"); add(".drawer", "position: fixed; left: 0; top: 0; bottom: 0; width: 280px; background: #fff; z-index: 21; transform: translateX(-290px); transition: transform .2s; box-shadow: 0 0 16px rgba(0,0,0,.28); overflow: auto; font-family: " + f + ";"); c.push(H + ".dopen .dfence { display: block; } " + H + ".dopen .drawer { transform: none; }"); add(".dhead", "display: flex; align-items: center; gap: 8px; height: 64px; padding: 0 24px; border-bottom: 1px solid #e0e0e0; font-size: 22px; color: #666;"); add(".dhead img", "height: 24px; width: auto;"); add(".di", "display: flex; align-items: center; gap: 32px; height: 48px; padding: 0 24px; color: #212121; text-decoration: none; font-size: 14px; font-weight: 500;" + (gm ? " border-radius: 0 24px 24px 0; margin-right: 8px;" : "")); add(".di img", "width: 24px; height: 24px;"); add(".di:hover", "background: #eee;"); add(".di.on", "background: " + (gm ? "#e8f0fe; color: #1967d2" : "#eee") + ";"); add(".dt", "display: block; padding: 0 24px; line-height: 40px; color: #212121; text-decoration: none; font-size: 14px;"); add(".dt:hover", "background: #eee;"); add(".dsep", "height: 1px; background: #e0e0e0; margin: 8px 0;"); if (era === "d2014") { // Google's bar on top: logo, search and the account; the blue Docs bar under it add(".gtop", "display: flex; align-items: center; height: 60px; padding: 0 16px 0 24px; background: #fff; flex: 0 0 auto;"); add(".gtop .glogo img", "display: block; height: 30px; width: auto;"); add(".gtop .glogo img.n", "height: 30px;"); add(".gsrch", "margin-left: 40px; flex: 0 1 490px; display: flex;"); add(".gsrch input", "flex: 1; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; padding: 0 8px; font: 16px Arial, sans-serif; outline: none; background: #fff; color: #222;"); add(".gsrch input:focus", "border-color: #4d90fe;"); add(".gsrch .gbtn", "width: 60px; height: 29px; border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; border-radius: 0 2px 2px 0; padding: 0;"); add(".gsrch .gbtn svg", "fill: #fff;"); add(".gtop .corner", "margin-left: auto; gap: 14px;"); add(".gtop .plusname", "color: #404040; font: 13px Arial, sans-serif; text-decoration: none; margin-right: 4px;"); add(".gtop .plusname:hover", "text-decoration: underline;"); add(".gtop .ib", "color: #666; border-radius: 0; width: 30px; height: 30px;"); add(".gtop .ib:hover", "background: transparent; color: #333;"); add(".gtop .sharebtn", "display: inline-flex; align-items: center; height: 29px; padding: 0 12px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif; cursor: default;"); add(".gtop .ksignin", "display: inline-flex; align-items: center; height: 29px; padding: 0 12px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff; font: bold 11px Arial, sans-serif; text-decoration: none;"); add(".appbar", "height: 64px !important; box-shadow: 0 2px 5px rgba(0,0,0,.26) !important; position: relative; z-index: 2;"); add(".appbar .name", "font: 20px Roboto, Arial, sans-serif; min-width: 0;"); add(".appbar .ib", "color: #fff; border-radius: 0;"); add(".appbar .ib:hover", "background: rgba(255,255,255,.1);"); add(".content", "padding: 24px calc(50% - 440px) 90px;"); add(".rhead", "height: 32px; font-size: 14px; color: #666; font-weight: 500;"); add(".cards", "justify-content: start;"); } // the list view add(".lview", "background: #fff; " + (era === "d2014" ? "box-shadow: 0 1px 2px rgba(0,0,0,.25);" : "border-top: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";")); add(".lhead, .lrow", "display: flex; align-items: center; gap: 16px; height: 48px; padding: 0 8px 0 16px; border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + "; color: #202124; text-decoration: none; font-size: 14px;"); add(".lhead", "height: 40px; color: #5f6368; font-size: 13px; font-weight: 500;"); add(".lrow:hover", "background: " + (gm ? "#e8f0fe" : "#f5f5f5") + ";"); add(".lrow .fi", "width: 16px; height: 16px; flex: 0 0 16px;"); add(".lhead .lt", "margin-left: 32px;"); add(".lt", "flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: 500;"); add(".lhead .lt", "font-weight: 500;"); add(".lo", "width: 140px; color: #5f6368; white-space: nowrap; overflow: hidden;"); add(".ld", "width: 180px; color: #5f6368; white-space: nowrap;"); add(".lm", "width: 24px; display: inline-flex; color: #5f6368;"); // the sort menu (square until 2019, like every menu then) add(".ugf-sortmenu", "position: fixed; z-index: 30; background: #fff; min-width: 200px; padding: 8px 0; box-shadow: 0 2px 6px 2px rgba(60,64,67,.15); border-radius: " + (gm ? "4px" : "0") + "; font-family: " + f + ";"); add(".ugf-sortmenu a", "display: block; padding: 0 16px 0 40px; line-height: 32px; color: #202124; text-decoration: none; font-size: 14px; position: relative;"); add(".ugf-sortmenu a:hover", "background: #eee;"); add(".ugf-sortmenu a.on::before", "content: '\\2713'; position: absolute; left: 14px; color: #5f6368;"); // "Open a file" add(".ugf-pick", "position: fixed; inset: 0; z-index: 40; display: flex; align-items: center; justify-content: center; font-family: " + (era === "d2014" ? "Arial, sans-serif" : f) + ";"); add(".pfence", "position: absolute; inset: 0; background: " + (era === "d2014" ? "rgba(255,255,255,.75)" : "rgba(0,0,0,.5)") + ";"); add(".pdlg", "position: relative; width: min(1050px, calc(100% - 64px)); height: min(640px, calc(100% - 64px)); background: #fff; display: flex; flex-direction: column; " + (era === "d2014" ? "border: 1px solid #acacac; box-shadow: 0 4px 16px rgba(0,0,0,.2);" : "box-shadow: 0 4px 16px rgba(0,0,0,.28);") + " border-radius: " + (gm ? "8px" : "0") + "; overflow: hidden;"); add(".phead", "display: flex; align-items: center; gap: 16px; padding: 18px 16px 10px 24px;"); add(".pt", "font-size: " + (era === "d2014" ? "20px" : "22px") + "; color: #222; flex: 0 0 auto;"); add(".psrch", "flex: 0 1 420px; margin-left: auto; display: flex;"); add(".psrch input", "flex: 1; height: " + (era === "d2014" ? "29px" : "36px") + "; border: 1px solid " + (era === "d2014" ? "#d9d9d9; border-top-color: #c0c0c0" : "transparent") + "; background: " + (era === "d2014" ? "#fff" : "#f1f3f4") + "; padding: 0 10px; font-size: 14px; font-family: inherit; outline: none; border-radius: " + (gm ? "4px 0 0 4px" : "0") + ";"); add(".psb", "width: " + (era === "d2014" ? "40px" : "44px") + "; border: " + (era === "d2014" ? "1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff" : "0; background: #f1f3f4; color: #5f6368") + "; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; border-radius: " + (gm ? "0 4px 4px 0" : "0") + ";"); add(".psb svg", era === "d2014" ? "fill: #fff;" : "fill: #5f6368;"); add(".px", "display: inline-flex; color: #777; cursor: pointer; padding: 4px;"); add(".px:hover", "color: #222;"); add(".ptabs", "display: flex; gap: 4px; padding: 0 16px; border-bottom: 1px solid #e5e5e5;"); add(".ptab", "padding: 12px 12px 10px; color: #666; font-size: 13px; " + (era === "d2014" ? "font-weight: bold;" : "font-weight: 500; text-transform: " + (era === "d2017" ? "uppercase" : "none") + ";") + " border-bottom: 3px solid transparent; cursor: pointer; text-decoration: none;"); add(".ptab:hover", "color: #222;"); add(".ptab.on", "color: " + (era === "d2014" ? "#dd4b39; border-bottom-color: #dd4b39" : gm ? "#1a73e8; border-bottom-color: #1a73e8" : "#4285f4; border-bottom-color: #4285f4") + ";"); add(".pbody", "flex: 1; overflow: auto; padding: 8px 0;"); add(".prow", "display: flex; align-items: center; gap: 14px; height: 40px; padding: 0 24px; cursor: default; font-size: 13px; color: #222;"); add(".prow:hover", "background: #f5f5f5;"); add(".prow.on", "background: " + (era === "d2014" ? "#e1ecfe" : gm ? "#e8f0fe" : "#e3f2fd") + ";"); add(".prow .fi", "width: 16px; height: 16px;"); add(".prow .pn", "flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".prow .pd", "width: 180px; color: #777;"); add(".pempty, .pmore", "padding: 24px; color: #666; font-size: 13px;"); add(".pempty a, .pmore a", "color: #15c;"); add(".pup", "height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; margin: 0 24px; border: 2px dashed #ddd; color: #999;"); add(".pdrop", "font-size: 28px; color: #bbb;"); add(".por", "font-size: 13px;"); add(".pbtn", "display: inline-flex; align-items: center; height: 32px; padding: 0 16px; color: #fff; text-decoration: none; font-size: 13px; font-weight: bold; " + (era === "d2014" ? "background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; border-radius: 2px;" : "background: " + (gm ? "#1a73e8" : "#4285f4") + "; border-radius: " + (gm ? "4px" : "2px") + ";")); add(".pnote", "font-size: 12px; color: #999;"); add(".pfoot", "display: flex; gap: 10px; padding: 12px 24px 18px; border-top: 1px solid #e5e5e5;"); add(".pfoot button", "height: " + (era === "d2014" ? "29px" : "36px") + "; min-width: 72px; padding: 0 16px; font-size: 13px; font-weight: bold; font-family: inherit; cursor: pointer; border-radius: " + (gm ? "4px" : "2px") + ";"); add(".popen", era === "d2014" ? "background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; color: #fff;" : "background: " + (gm ? "#1a73e8" : "#4285f4") + "; border: 0; color: #fff;"); add(".popen:disabled", "opacity: .5; cursor: default;"); add(".pcancel", era === "d2014" ? "background: linear-gradient(#f5f5f5, #f1f1f1); border: 1px solid rgba(0,0,0,.1); color: #444;" : "background: #fff; border: 1px solid " + (gm ? "#dadce0" : "#ccc") + "; color: #444;"); c.push(H + '[app="sheets"] .ptab.on { ' + (era === "d2014" ? "" : "color: #0f9d58; border-bottom-color: #0f9d58;") + " }"); add(".fab svg", "fill: #fff;"); // Sheets: green where Docs is blue c.push(H + '[app="sheets"] .fab { background: ' + (gm ? "#188038" : "#0f9d58") + "; }"); if (era === "d2014") { c.push(H + '[app="sheets"] .appbar { background: #0f9d58; }'); } c.push(H + '[app="sheets"] .di.on { ' + (gm ? "background: #e6f4ea; color: #137333;" : "background: #eee;") + " }"); c.push(H + '[app="sheets"] .blank:hover .pg { border-color: #0f9d58; }'); c.push(H + '[app="sheets"] .blank { width: 164px; } ' + H + '[app="sheets"] .blank .pg { width: 164px; height: 123px; }'); // Forms: purple c.push(H + '[app="forms"] .fab { background: #673ab7; }'); if (era === "d2014") { c.push(H + '[app="forms"] .appbar { background: #673ab7; }'); } c.push(H + '[app="forms"] .di.on { ' + (gm ? "background: #f3e8fd; color: #7627bb;" : "background: #eee;") + " }"); c.push(H + '[app="forms"] .blank:hover .pg { border-color: #673ab7; }'); c.push(H + '[app="forms"] .blank { width: 164px; } ' + H + '[app="forms"] .blank .pg { width: 164px; height: 123px; }'); c.push(H + '[app="forms"] .ptab.on { ' + (era === "d2014" ? "" : "color: #673ab7; border-bottom-color: #673ab7;") + " }"); // Slides: yellow c.push(H + '[app="slides"] .fab { background: ' + (gm ? "#f4b400" : "#f4b400") + "; }"); if (era === "d2014") { c.push(H + '[app="slides"] .appbar { background: #f4b400; }'); } c.push(H + '[app="slides"] .di.on { ' + (gm ? "background: #fef7e0; color: #b06000;" : "background: #eee;") + " }"); c.push(H + '[app="slides"] .blank:hover .pg { border-color: #f4b400; }'); c.push(H + '[app="slides"] .blank { width: 164px; } ' + H + '[app="slides"] .blank .pg { width: 164px; height: 92px; }'); c.push(H + '[app="slides"] .ptab.on { ' + (era === "d2014" ? "" : "color: #f4b400; border-bottom-color: #f4b400;") + " }"); add(".tpl", "background: #f1f3f4; flex: 0 0 auto;"); add(".tin", "width: 960px; max-width: calc(100% - 48px); margin: 0 auto; padding: 12px 0 18px;"); add(".thead", "display: flex; align-items: center; height: 40px; font-size: 16px; color: #202124;"); add(".thead .gal", "display: inline-flex; align-items: center; color: #202124; text-decoration: none; font-size: 14px; font-weight: 500; " + (gm ? "" : "letter-spacing: .5px;")); add(".tiles", "display: flex; gap: 16px;"); add(".blank", "display: inline-block; text-decoration: none; color: #202124; width: 144px;"); add(".blank .st2", "display: block; font-size: 12px; color: #5f6368; margin-top: 2px;"); add(".blank .pg", "display: flex; width: 144px; height: 186px; border: 1px solid #dadce0; border-radius: " + (gm ? "4px" : "2px") + "; background: #fff; overflow: hidden;"); add(".blank .pg img", "width: 100%; height: 100%; object-fit: cover;"); add(".blank:hover .pg", "border-color: #4285f4;"); add(".blank .lb", "display: block; margin-top: 8px; font-size: 14px; font-weight: 500;"); } return c; } // ---- Google Forms (5.3) --------------------------------------------------------- // The form as people fill it in is dressed per period; the list is the Docs list's // Forms version; the form editor is Google's own, dressed with the period's pieces. // fc the forms of 2008-2012: a plain page, "Powered by Google Docs" // fk the new Forms of 2013-2015: a themed page, the Kennedy blue Submit // fm the Material forms of 2016-2018: cards, the colour bar, SUBMIT // fg 2019 on: Google's own, less its AI function ugfFormsEra() { // Late 2015 still had the old Forms: the new one was opt-in from September 2015 // and only became the default on 10 February 2016 const l = UGF_LATE2015 ? "2015" : String(layout || "2015"); if (l === "2019" || l === "2022") { return "fg"; } if (["2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(l) > -1) { return "fm"; } if (["2013", "2013L", "2014", "2015", "2015L"].indexOf(l) > -1) { return "fk"; } return "fc"; } function ugfFormsView(fe) { const html = document.documentElement; html.setAttribute("gplex-forms", fe); const style = document.createElement("style"); style.id = "ugf-forms-styles"; style.textContent = ugfFormsViewCss(fe).join("\n"); (document.head || document.documentElement).appendChild(style); if (fe === "fg") { return; } // the buttons' words and the small print at the foot, in the period's wording const words = function() { const say = function(jsname, word) { document.querySelectorAll("[jsname='" + jsname + "'] .NPEfkd, [jsname='" + jsname + "'] span span").forEach(function(s) { if (s.children.length === 0 && s.textContent !== word) { s.textContent = word; } }); }; if (fe === "fc" || fe === "fk") { say("OCpkoe", "Continue »"); say("GeGHKb", "« Back"); say("M2UYVd", "Submit"); } else { say("OCpkoe", "NEXT"); say("GeGHKb", "BACK"); say("M2UYVd", "SUBMIT"); } const foot = document.querySelector(".I3zNcc"); if (foot && !document.getElementById("ugf-forms-foot")) { const f = document.createElement("div"); f.id = "ugf-forms-foot"; const abuse = (document.querySelector("a[href*='/abuse']") || {}).href || "https://docs.google.com/forms/about/"; f.innerHTML = trusted_policy.createHTML(fe === "fm" ? 'This content is neither created nor endorsed by Google. Report Abuse - Terms of Service' : '" + '
This content is neither created nor endorsed by Google.
Report Abuse - Terms of Service - Additional Terms
'); foot.parentNode.insertBefore(f, foot); } }; words(); new MutationObserver(function() { words(); }).observe(document.body || document.documentElement, { childList: true, subtree: true }); } function ugfFormsViewCss(fe) { const P = 'html[gplex-forms="' + fe + '"]'; const css = []; const add = function(sel, body) { css.push(sel.split(",").map(function(x) { return P + " " + x.trim(); }).join(", ") + " { " + body + " }"); }; // Google's AI and the help button of today, in every period add("[class*='GenerativeAi'], [class*='Generativeai'], [aria-label*='Gemini' i], [jsname='LW2oUc']", "display: none !important;"); if (fe === "fg") { return css; } const card = ".m7w29c, [role='listitem'] > div, .OxAavc, .geS5n"; add(card + ", .JH79cc, [role='button'], [role='progressbar'], [role='progressbar'] > div", "border-radius: 0 !important;"); add("[jsname='X5DuWc']", "display: none !important;"); // "Clear form" came in 2021 add(".v1CNvb", "display: none !important;"); // "This form was created inside of..." if (fe === "fm") { // 2016-2018: raised cards (no outline), the colour bar, the filled SUBMIT const f = "Roboto, Arial, sans-serif"; add("body, body *", "font-family: " + f + " !important; letter-spacing: normal !important;"); add(card, "border: 0 !important; border-radius: 2px !important; box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12) !important;"); add(".JH79cc", "border-radius: 2px 2px 0 0 !important;"); add("[role='heading'][aria-level='1']", "font-size: 32px !important; font-weight: 400 !important; line-height: 40px !important;"); add("[jsname='OCpkoe'], [jsname='M2UYVd'], [jsname='GeGHKb']", "border-radius: 2px !important; text-transform: uppercase !important; font-weight: 500 !important; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2) !important;"); add("[jsname='M2UYVd']", "background: #673ab7 !important; color: #fff !important;"); add("[jsname='M2UYVd'] *", "color: #fff !important;"); add("[role='progressbar']", "height: 6px !important;"); add("#ugf-forms-foot", "text-align: center; font-size: 12px; color: rgba(0,0,0,.66); margin: 16px 0 8px;"); add("#ugf-forms-foot a", "color: rgba(0,0,0,.66) !important; text-decoration: underline;"); return css; } // 2008-2015: no cards: one white page with the questions down it, Arial throughout const kennedy = fe === "fk"; add("body, body *", "font-family: Arial, sans-serif !important; letter-spacing: normal !important;"); add("body, .Uc2NEf, .teQAzf, .vnFTpb", "background: " + (kennedy ? "#f1f1f1" : "#fff") + " !important;"); add(".JH79cc, .ErmvL", "display: none !important;"); // the colour bar add(".RH5hzf, form#mG61Hd", "background: #fff !important;"); add("form#mG61Hd", "max-width: 640px; margin: " + (kennedy ? "20px auto" : "10px auto") + " !important; padding: 0 0 10px !important;" + (kennedy ? " border: 1px solid #ddd !important; box-shadow: 0 1px 3px rgba(0,0,0,.1) !important;" : "")); add(card, "border: 0 !important; box-shadow: none !important; background: transparent !important; margin: 0 !important; padding-top: 12px !important; padding-bottom: 12px !important;"); add("[role='listitem']", "margin: 0 !important; border-top: " + (kennedy ? "1px solid #eee" : "0") + " !important;"); add(".m7w29c", kennedy ? "background: #fff !important; border-bottom: 1px solid #eee !important;" : ""); add("[role='heading'][aria-level='1']", "font-size: " + (kennedy ? "24px" : "22px") + " !important; font-weight: bold !important; color: #000 !important; line-height: 1.3 !important;"); add("[role='heading'][aria-level='2'], [role='heading'][aria-level='3'], [role='heading'][aria-level='3'] *", "font-size: 13px !important; font-weight: bold !important; color: #000 !important;"); add(".md0UAd", "color: #c43b1d !important; font-size: 12px !important;"); // "* Required" add(".vnumgf", "color: #c43b1d !important;"); add(".OIC90c, .aDTYNe", "font-size: 13px !important; color: #222 !important;"); add(".nUvMO", "font-size: 11px !important; color: #666 !important;"); add(".DqBBlb .Oh1Vtf, .kesdnc", "font-size: 12px !important; color: #666 !important;"); // the buttons of the time add("[jsname='OCpkoe'], [jsname='M2UYVd'], [jsname='GeGHKb']", "min-width: 0 !important; height: " + (kennedy ? "29px" : "22px") + " !important; padding: 0 " + (kennedy ? "12px" : "8px") + " !important; box-shadow: none !important; " + (kennedy ? "background: linear-gradient(#f5f5f5, #f1f1f1) !important; border: 1px solid rgba(0,0,0,.1) !important; color: #444 !important;" : "background: linear-gradient(#fff, #ddd) !important; border: 1px solid !important; border-color: #bbb #999 #999 #bbb !important; color: #000 !important;")); add("[jsname='OCpkoe'] *, [jsname='M2UYVd'] *, [jsname='GeGHKb'] *", "font-size: " + (kennedy ? "11px" : "13px") + " !important; font-weight: " + (kennedy ? "bold" : "normal") + " !important; color: inherit !important; text-transform: none !important;"); if (kennedy) { add("[jsname='M2UYVd']", "background: linear-gradient(#4d90fe, #4787ed) !important; border-color: #3079ed !important; color: #fff !important;"); } add("[role='progressbar']", "height: 8px !important; background: #eee !important; border: 1px solid #ccc !important;"); add("[role='progressbar'] > div", "background: " + (kennedy ? "#4d90fe" : "#6fa8dc") + " !important;"); add(".T2dutf", "font-size: 11px !important; color: #777 !important; padding: 0 16px !important;"); add(".I3zNcc", "display: none !important;"); // today's "Google Forms" mark add("#ugf-forms-foot", "max-width: 640px; margin: 8px auto 20px; font-size: 11px; color: #777; text-align: " + (kennedy ? "center" : "left") + ";"); add("#ugf-forms-foot .pw", "font-size: 12px; margin-bottom: 6px; color: #333;"); add("#ugf-forms-foot a", "color: #15c !important;"); // radio buttons and ticks: small and plain add("[role='radio'] .AB7Lab, [role='radio'] .vd3tt", "transform: scale(.75); transform-origin: center;"); return css; } // the form editor. Google's editor keeps working; around it the period's frame: the // purple Forms mark, SEND instead of Publish, QUESTIONS / RESPONSES (Settings was a // gear until 2020), none of the 2023-2025 buttons (undo, redo, responder link, add // collaborators), square corners, the period's type, Gplex's own account menu. // Found by what the controls say (their labels), not by Google's coded class names. // The form editor. Google's own keeps running; around it, the period's pieces: // its Forms mark, the purple of the Forms of 2016-2024 in place of the 2025 blue, // Send in place of Publish, a gear for the settings until the Settings tab of 2021, // and none of the controls added since (undo, the responder link, sharing, AI). // the editor of 2016 looked like 2015's (the Material editor with the purple bar // and the grey SEND is 2017-2018) function ugfFormsEditorEra() { const l = String(layout || ""); return ["2016", "2016C", "2016L"].indexOf(l) > -1 ? "fk" : ugfFormsEra(); } function ugfFormsEditor(fe) { const html = document.documentElement; html.setAttribute("gplex-forms-ed", fe); const A = ugfDocsArt(); const P = 'html[gplex-forms-ed="' + fe + '"]'; const lay = String(layout || ""); const f = fe === "fc" || fe === "fk" ? "Arial, sans-serif" : "Roboto, Arial, sans-serif"; const settingsTab = lay === "2022"; const css = [ // AI, everywhere P + " [class*='GenerativeAi'], " + P + " [class*='Generativeai'], " + P + " [aria-label*='Gemini' i], " + P + " [data-tooltip*='Gemini' i], " + P + " [aria-label*='Help me ' i], " + P + " [data-tooltip*='Help me ' i] { display: none !important; }", "#ugf-gmail-accfence { position: fixed; inset: 0; z-index: 2147483600 !important; }", "#ugf-gmail-accmenu, #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }", "#ugf-gmail-accmenu a, #ugf-gmail-appsmenu a { text-decoration: none; }", ugfMapsMenuCss(), // the controls of 2023-2025 P + " [aria-label='Undo' i], " + P + " [aria-label='Redo' i], " + P + " [data-tooltip='Undo' i], " + P + " [data-tooltip='Redo' i], " + P + " [aria-label*='responder link' i], " + P + " [data-tooltip*='responder link' i], " + P + " [aria-label*='collaborator' i], " + P + " [data-tooltip*='collaborator' i], " + P + " [ugf-hide] { display: none !important; }", "#ugf-forms-mark { display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; flex: 0 0 auto; cursor: pointer; }", "#ugf-forms-mark img { width: 40px; height: 40px; display: block; }", "#ugf-forms-gear { display: inline-flex; align-self: center; align-items: center; justify-content: center; width: 48px; height: 48px; flex: 0 0 auto; cursor: pointer; color: #5f6368; border-radius: 50%; }", "#ugf-forms-gear:hover { background: rgba(95,99,104,.08); } #ugf-forms-gear svg { width: 24px; height: 24px; fill: currentColor; display: block; }", P + " [ugf-send] { box-shadow: none !important; }" ]; if (fe === "fg") { css.push(P + " [ugf-send] { background: #673ab7 !important; color: #fff !important; border-radius: 4px !important; }"); } else { css.push( P + " *:not(img):not([class*='avatar' i]):not([class*='Avatar']):not([role='radio']):not([role='radio'] *):not([role='switch'] *):not([aria-label^='Google Account' i]):not([aria-label^='Google Account' i] *):not(#ugf-forms-gear) { border-radius: 0 !important; }", P + " body, " + P + " body *:not([class*='material-icons']):not([class*='google-symbols']) { font-family: " + f + " !important; letter-spacing: normal !important; }", P + " [role='tab'] { text-transform: " + (fe === "fm" ? "uppercase" : "none") + " !important; font-weight: 500 !important; }", P + " [ugf-send] { text-transform: " + (fe === "fm" ? "uppercase" : "none") + " !important; font-weight: " + (fe === "fk" || fe === "fc" ? "bold" : "500") + " !important; }" ); if (fe === "fc" || fe === "fk") { css.push(P + " [ugf-send] { background: linear-gradient(#4d90fe, #4787ed) !important; border: 1px solid #3079ed !important; color: #fff !important; font-size: 11px !important; height: 29px !important; line-height: 27px !important; padding: 0 12px !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; margin-top: 4px !important; }"); } else { // the Material "raised" button of the 2017-2018 Forms: light grey, purple // letters, a small shadow, square corners css.push( P + " [ugf-send] { background: #f1f1f1 !important; color: #673ab7 !important; border: 0 !important; border-radius: 2px !important; height: 36px !important; width: auto !important; min-width: 88px !important; box-sizing: border-box !important; padding: 0 16px !important; " + "display: inline-flex !important; align-items: center !important; justify-content: center !important; font: 500 14px Roboto, Arial, sans-serif !important; letter-spacing: .5px !important; text-transform: uppercase !important; " + "box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2) !important; }", P + " [ugf-send]:hover { background: #e6e6e6 !important; }", P + " [ugf-send] * { background: transparent !important; color: #673ab7 !important; font: inherit !important; box-shadow: none !important; border: 0 !important; padding: 0 !important; min-width: 0 !important; width: auto !important; }" ); } } const style = document.createElement("style"); style.id = "ugf-forms-styles"; style.textContent = css.join("\n"); (document.head || document.documentElement).appendChild(style); const sendWord = fe === "fm" ? "SEND" : fe === "fg" ? "Send" : "Send form"; // the default colours of a new form: Google's 2025 blue-violet back to the purple // of 2016-2024 (a colour you picked for the form is left as it is) const tints = [["87, 70, 227", "103, 58, 183"], ["238, 237, 252", "237, 231, 246"], ["221, 218, 249", "209, 196, 233"], ["#5746e3", "#673ab7"], ["#5746E3", "#673ab7"], ["#EEEDFC", "#ede7f6"], ["#eeedfc", "#ede7f6"]]; const retint = function() { document.querySelectorAll("head style:not([id^='ugf'])").forEach(function(st) { const t = st.textContent || ""; if (st.getAttribute("ugf-tint") === t || !/87, 70, 227|5746e3|238, 237, 252/i.test(t)) { return; } let n = t; tints.forEach(function(x) { n = n.split(x[0]).join(x[1]); }); st.textContent = n; st.setAttribute("ugf-tint", n); }); }; const gearSvg = ''; const press = function(el) { ["mousedown", "mouseup", "click"].forEach(function(k) { try { el.dispatchEvent(new MouseEvent(k, { bubbles: true, cancelable: true, button: 0 })); } catch (e) {} }); }; const tidy = function() { retint(); // Publish -> Send document.querySelectorAll("button, [role='button']").forEach(function(b) { if (b.hasAttribute("ugf-send") || b.closest("#ugf-gmail-accmenu")) { return; } const t = (b.textContent || "").trim(); if (t === "Publish" || t === "Published" || t === "Send" || t === "Republish") { b.setAttribute("ugf-send", ""); const walk = document.createTreeWalker(b, NodeFilter.SHOW_TEXT); let n; while ((n = walk.nextNode())) { if (n.nodeValue.trim()) { n.nodeValue = sendWord; break; } } } }); // sharing moved to the top bar in 2025: it lived in the ⋮ menu before document.querySelectorAll("[aria-label='Share'][role='button'], div[aria-label='Share'], [data-tooltip='Share']").forEach(function(b) { if (!b.hasAttribute("ugf-hide") && !b.closest("#ugf-gmail-accmenu")) { b.setAttribute("ugf-hide", ""); } }); // the Settings tab (a gear by Send until 2021) let setTab = null; document.querySelectorAll("[role='tab']").forEach(function(t) { if (/^\s*Settings\s*$/i.test(t.textContent || "")) { setTab = t; if (!settingsTab && !t.hasAttribute("ugf-hide")) { t.setAttribute("ugf-hide", ""); } } }); const send = Array.prototype.slice.call(document.querySelectorAll("[ugf-send]")).filter(function(x) { return x.getBoundingClientRect().width > 0; })[0]; // beside Send, in the row of icons Send sits in (once Google's styles have laid it out) let at = send; let row = false; for (let i = 0; at && i < 6 && at.parentElement && at.parentElement !== document.body; i++) { if (window.getComputedStyle(at.parentElement).display.indexOf("flex") > -1) { row = true; break; } at = at.parentElement; } if (!settingsTab && setTab && send && row && !document.getElementById("ugf-forms-gear")) { const g = document.createElement("span"); g.id = "ugf-forms-gear"; g.setAttribute("role", "button"); g.setAttribute("title", "Settings"); g.setAttribute("aria-label", "Settings"); g.innerHTML = trusted_policy.createHTML(gearSvg); at.parentNode.insertBefore(g, at); g.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); const tab = Array.prototype.slice.call(document.querySelectorAll("[role='tab']")).filter(function(t) { return /^\s*Settings\s*$/i.test(t.textContent || ""); })[0]; if (tab) { press(tab); } }); } // the Forms mark at the top left: the period's own if (!document.getElementById("ugf-forms-mark")) { const home = document.querySelector("[aria-label='Forms Home'], [aria-label*='Forms home' i], [data-tooltip*='Forms home' i], a[href*='/forms/u/'][aria-label], a[title*='Forms home' i], a[href$='/forms/u/0/']"); if (home) { const m = document.createElement("span"); m.id = "ugf-forms-mark"; m.setAttribute("title", "Forms home"); m.innerHTML = trusted_policy.createHTML('Forms'); home.style.setProperty("display", "none", "important"); home.parentNode.insertBefore(m, home); m.addEventListener("click", function() { window.location.href = "https://docs.google.com/forms/u/0/"; }); } } }; tidy(); setInterval(tidy, 800); let queued = false; new MutationObserver(function() { if (!queued) { queued = true; requestAnimationFrame(function() { queued = false; tidy(); }); } }).observe(document.documentElement, { childList: true, subtree: true, characterData: true }); // the photo at the top right opens Gplex's account menu, square until 2019 const onAcct = function(ev) { const t = ev.target && ev.target.closest ? ev.target : null; const me = t && t.closest("a[aria-label^='Google Account' i], [aria-label^='Google Account:' i]"); if (me) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailAccountMenu(me, ugfMenusRounded() ? "m2018" : "m2013"); } return; } if (t && t.closest("#ugf-gmail-accfence")) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailCloseMenus(); } } }; window.addEventListener("mousedown", onAcct, true); window.addEventListener("click", onAcct, true); } // ---- the Forms editor, Gplex's own (5.5) ----------------------------------------- // Gplex draws the editor of the layout's period itself: the old "Edit form" page of // 2008-2012, the new Forms of 2013, and the card editors of 2014 on. The form is // read from the data Google's page loads with, and every change is made in Google's // own editor, kept running under Gplex's page, the way a person would make it there: // the card is opened, the field typed into, the button pressed - and then checked. // // Which editor a layout gets: // o08 2008-2009: the forms of Google Spreadsheets // o10 late 2009-2010: the same, under the Google bar of 2010 // o11 late 2011-early 2012: the same in the grey Google look, under the black bar // o13 late 2012-2013: the new Forms of February 2013 // fk 2014-2016: the card editor, white bar and blue "Send form" // fm 2017-2018: the card editor under the coloured bar, grey SEND // fg 2019 on: Google Material 2 function ugfFeKind() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "fg"; } if (l === "2017" || l === "2018" || l === "2018M") { return "fm"; } if (["2014", "2015", "2015L", "2016", "2016C", "2016L"].indexOf(l) > -1) { return "fk"; } if (l === "2013" || l === "2013L") { return "o13"; } if (l === "2012") { return "o11"; } if (l === "2009L" || l === "2010N") { return "o10"; } return "o08"; } // the question types, Gplex's names for them and Google's function ugfFeTypes() { return { text: { g: "Short answer", old: "Text", mi: "short_text" }, paragraph: { g: "Paragraph", old: "Paragraph text", mi: "subject" }, mc: { g: "Multiple choice", old: "Multiple choice", mi: "radio_button_checked" }, checkbox: { g: "Checkboxes", old: "Checkboxes", mi: "check_box" }, list: { g: "Dropdown", old: "Choose from a list", mi: "arrow_drop_down_circle" }, file: { g: "File upload", old: "File upload", mi: "cloud_upload" }, scale: { g: "Linear scale", old: "Scale", mi: "linear_scale" }, rating: { g: "Rating", old: "Rating", mi: "star_border" }, grid: { g: "Multiple choice grid", old: "Grid", mi: "grid_on" }, cbgrid: { g: "Checkbox grid", old: "Checkbox grid", mi: "apps" }, date: { g: "Date", old: "Date", mi: "event" }, time: { g: "Time", old: "Time", mi: "schedule" } }; } // the types each period offered, in its order function ugfFeTypesFor(kind) { if (kind === "o08" || kind === "o10" || kind === "o11") { return ["text", "paragraph", "mc", "checkbox", "list", "scale", "grid"]; } if (kind === "o13") { return ["text", "paragraph", "mc", "checkbox", "list", "scale", "grid", "date", "time"]; } if (kind === "fk") { return ["text", "paragraph", "mc", "checkbox", "list", "scale", "grid", "date", "time"]; } if (kind === "fm") { return ["text", "paragraph", "mc", "checkbox", "list", "file", "scale", "grid", "cbgrid", "date", "time"]; } return ["text", "paragraph", "mc", "checkbox", "list", "file", "scale", "grid", "cbgrid", "date", "time"]; } function ugfFeChoice(t) { return t === "mc" || t === "checkbox" || t === "list"; } // ---- reading the form --------------------------------------------------------- // Google's page carries the whole form in FB_LOAD_DATA_; the array is cut out of // the page's script and read as JSON function ugfFeRaw() { let raw = null; const cut = function(t, at) { let i = t.indexOf("[", at); if (i < 0) { return null; } let depth = 0; let str = false; for (let k = i; k < t.length; k++) { const c = t[k]; if (str) { if (c === "\\") { k++; } else if (c === '"') { str = false; } continue; } if (c === '"') { str = true; } else if (c === "[") { depth++; } else if (c === "]") { depth--; if (!depth) { return t.slice(i, k + 1); } } } return null; }; document.querySelectorAll("script").forEach(function(s) { if (raw) { return; } const t = s.textContent || ""; const at = t.indexOf("FB_LOAD_DATA_"); if (at > -1) { try { raw = JSON.parse(cut(t, at)); } catch (e) {} } }); if (!raw) { try { const w = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; if (w.FB_LOAD_DATA_) { raw = JSON.parse(JSON.stringify(w.FB_LOAD_DATA_)); } } catch (e) {} } return raw; } function ugfFeParse() { const raw = ugfFeRaw(); if (!raw || !raw[0]) { return null; } const d = raw[0]; const info = d[1] || []; const T = { 0: "text", 1: "paragraph", 2: "mc", 3: "list", 4: "checkbox", 5: "scale", 6: "header", 7: "grid", 8: "page", 9: "date", 10: "time", 11: "image", 12: "video", 13: "file", 18: "rating" }; let respKey = ""; const hunt = function(a, depth) { if (respKey || depth > 3 || !Array.isArray(a)) { return; } a.forEach(function(x) { if (typeof x === "string" && /^e\/1FAIpQL/.test(x)) { respKey = x.slice(2); } else if (Array.isArray(x)) { hunt(x, depth + 1); } }); }; hunt(d, 0); const items = (info[1] || []).map(function(r) { const it = { id: String(r[0]), title: r[1] || "", help: r[2] || "", type: T[r[3]] || "other", code: r[3], required: false, options: [], other: false, lo: 1, hi: 5, loLabel: "", hiLabel: "", rows: [], cols: [] }; const en = Array.isArray(r[4]) ? r[4] : []; const e0 = en[0] || []; it.required = !!e0[2]; if (ugfFeChoice(it.type)) { (e0[1] || []).forEach(function(o) { if (o && o[4]) { it.other = true; } else if (o) { it.options.push(String(o[0] == null ? "" : o[0])); } }); } else if (it.type === "scale") { const o = e0[1] || []; if (o.length) { it.lo = parseInt(o[0][0], 10) || 0; it.hi = parseInt(o[o.length - 1][0], 10) || 5; } const lb = e0[3] || []; it.loLabel = lb[0] || ""; it.hiLabel = lb[1] || ""; } else if (it.type === "grid") { it.cols = (e0[1] || []).map(function(o) { return String(o[0]); }); it.rows = en.map(function(e) { return String((e[3] && e[3][0]) || ""); }); if (e0[11] && e0[11][0]) { it.type = "cbgrid"; } } return it; }); return { title: info[8] || d[3] || "Untitled form", docTitle: d[3] || "Untitled form", desc: info[0] || "", items: items, respKey: respKey, viewUrl: respKey ? "https://docs.google.com/forms/d/e/" + respKey + "/viewform" : "" }; } // the id of the form file, from the address function ugfFeFileId() { return ((window.location.pathname || "").match(/\/forms\/(?:u\/\d+\/)?d\/([\w-]{20,})/) || ["", ""])[1]; } // ---- changing the form, in Google's editor ---------------------------------------- // One change at a time, each waiting for Google's editor to show it. onState(state, // detail): "saving", "saved" or "error". function ugfFeDriver(onState, isBusyTyping) { const Q = []; let busy = false; const sleep = function(ms) { return new Promise(function(r) { setTimeout(r, ms); }); }; const wait = function(test, ms) { const t0 = Date.now(); return new Promise(function(resolve, reject) { const tick = function() { let v = null; try { v = test(); } catch (e) {} if (v) { resolve(v); } else if (Date.now() - t0 > (ms || 4000)) { reject(new Error("timeout")); } else { setTimeout(tick, 60); } }; tick(); }); }; const mine = function(el) { return !!(el && el.closest && el.closest("#ugf-fe, [id^='ugf-gmail']")); }; const seen = function(el) { if (!el || mine(el)) { return false; } const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; }; const all = function(root, sel) { return Array.prototype.slice.call((root || document).querySelectorAll(sel)).filter(function(e) { return !mine(e); }); }; const shown = function(root, sel) { return all(root, sel).filter(seen); }; const fire = function(el, types, x, y) { types.forEach(function(t) { const at = { bubbles: true, cancelable: true, composed: true, button: 0, buttons: /down/.test(t) ? 1 : 0, clientX: x || 0, clientY: y || 0 }; let ev = null; try { ev = /^pointer/.test(t) && typeof PointerEvent === "function" ? new PointerEvent(t, Object.assign({ pointerType: "mouse", isPrimary: true, pointerId: 1 }, at)) : new MouseEvent(t, at); } catch (e) { ev = new MouseEvent(t.replace("pointer", "mouse"), { bubbles: true, cancelable: true }); } try { el.dispatchEvent(ev); } catch (e) {} }); }; // a press, as a mouse makes it, on the middle of the element const press = function(el) { if (!el) { throw new Error("nothing to press"); } try { el.scrollIntoView({ block: "center" }); } catch (e) {} const r = el.getBoundingClientRect(); const x = r.left + Math.min(r.width / 2, 40); const y = r.top + r.height / 2; fire(el, ["pointerover", "mouseover", "pointerdown", "mousedown"], x, y); try { el.focus({ preventScroll: true }); } catch (e) {} fire(el, ["pointerup", "mouseup", "click"], x, y); }; const key = function(el, k, code) { ["keydown", "keypress", "keyup"].forEach(function(t) { try { el.dispatchEvent(new KeyboardEvent(t, { bubbles: true, cancelable: true, key: k, code: k, keyCode: code, which: code })); } catch (e) {} }); }; const textOf = function(el) { if (!el) { return ""; } const v = el.isContentEditable || el.getAttribute("role") === "textbox" && !("value" in el) ? el.innerText || el.textContent || "" : el.value; return String(v || "").replace(/ /g, " ").replace(/\s+$/, ""); }; // type into one of Google's fields: all of it replaced by the new text const type = async function(el, text) { text = String(text == null ? "" : text); if (textOf(el) === text) { return; } if (!el.isContentEditable && !("value" in el)) { press(el); await wait(function() { return el.isContentEditable || el.querySelector("[contenteditable='true']"); }, 2500).catch(function() {}); if (!el.isContentEditable) { el = el.querySelector("[contenteditable='true']") || el; } } try { el.focus({ preventScroll: true }); } catch (e) {} let done = false; try { if (el.isContentEditable) { const sel = window.getSelection(); const rg = document.createRange(); rg.selectNodeContents(el); sel.removeAllRanges(); sel.addRange(rg); } else { el.select(); } done = text ? document.execCommand("insertText", false, text) : document.execCommand("delete", false, null); } catch (e) { done = false; } if (!done || textOf(el) !== text) { if (el.isContentEditable) { el.textContent = text; } else { try { Object.getOwnPropertyDescriptor(el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype, "value").set.call(el, text); } catch (e) { el.value = text; } } el.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: text })); } el.dispatchEvent(new Event("change", { bubbles: true })); await sleep(60); if (textOf(el) !== text) { throw new Error("the text did not stay"); } }; const leave = function(el) { try { el.dispatchEvent(new FocusEvent("focusout", { bubbles: true })); el.blur(); } catch (e) {} }; // ---- Google's cards const cards = function() { const out = []; const got = {}; all(document, "[data-item-id]").forEach(function(e) { const id = e.getAttribute("data-item-id"); if (id && id !== "-1" && !got[id] && e.hasAttribute("data-observe-id")) { got[id] = true; out.push(e); } }); return out; }; const card = function(id) { return cards().filter(function(e) { return e.getAttribute("data-item-id") === String(id); })[0] || null; }; const ids = function() { return cards().map(function(e) { return e.getAttribute("data-item-id"); }); }; const isOpen = function(c) { return !!(c && (shown(c, "[aria-label='Question types']").length || shown(c, "[aria-label='Duplicate question'], [aria-label^='Delete']").length)); }; // open a card for editing, as a click on it does const open = async function(id) { const c = card(id); if (!c) { throw new Error("no such question"); } if (isOpen(c)) { return c; } try { c.scrollIntoView({ block: "center" }); } catch (e) {} await sleep(40); const r = c.getBoundingClientRect(); // what lies under the card's top right corner, under Gplex's page let target = c; try { const stack = document.elementsFromPoint(r.right - 30, r.top + 22); target = stack.filter(function(e) { return !mine(e) && c.contains(e); })[0] || c; } catch (e) {} fire(target, ["pointerover", "mouseover", "pointerdown", "mousedown", "pointerup", "mouseup", "click"], r.right - 30, r.top + 22); await wait(function() { return isOpen(card(id)); }, 2500).catch(function() {}); if (!isOpen(card(id))) { // the title, then: a click on it opens the card too const t = shown(c, "[aria-label='Question'], [role='textbox']")[0]; if (t) { press(t); await wait(function() { return isOpen(card(id)); }, 2500); } else { throw new Error("the question would not open"); } } return card(id); }; // in a card: the one that shows, else any const inCard = function(c, sel) { return shown(c, sel)[0] || all(c, sel)[0] || null; }; const menuItem = function(re) { return shown(document, "[role='menuitem'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='option']").filter(function(e) { return re.test((e.textContent || "").replace(/\s+/g, " ").trim()); })[0] || null; }; const choose = async function(listbox, label) { if ((listbox.textContent || "").replace(/\s+/g, " ").trim().indexOf(label) === 0 && listbox.getAttribute("aria-expanded") !== "true") { const sel = listbox.querySelector("[role='option'][aria-selected='true']"); if (!sel || (sel.textContent || "").trim() === label) { return; } } press(listbox); const re = new RegExp("^" + label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "$"); const opt = await wait(function() { return shown(document, "[role='option']").filter(function(o) { return re.test((o.textContent || "").replace(/\s+/g, " ").trim()); })[0]; }, 3000); press(opt); await sleep(250); }; const switchOn = function(sw) { return sw.getAttribute("aria-checked") === "true" || sw.classList.contains("N2RpBe") || sw.classList.contains("i9xfbb"); }; const newCard = async function(before) { return wait(function() { return ids().filter(function(x) { return before.indexOf(x) < 0; })[0]; }, 5000); }; const T = ugfFeTypes(); // ---- the changes const ops = { // the form's title and description, on the title card formText: async function(which, text) { const el = shown(document, "[aria-label='" + (which === "title" ? "Form title" : "Form description") + "']")[0] || all(document, "[aria-label='" + (which === "title" ? "Form title" : "Form description") + "']")[0]; if (!el) { throw new Error("no form " + which); } press(el); await sleep(150); await type(el, text); leave(el); }, // the name of the file, in the bar at the top docTitle: async function(text) { const el = all(document, "input[aria-label='Document title'], input[aria-label='Rename']")[0]; if (!el) { throw new Error("no document title"); } press(el); await type(el, text); key(el, "Enter", 13); leave(el); }, title: async function(id, text) { const c = await open(id); const el = inCard(c, "[aria-label='Question']") || inCard(c, "[aria-label='Title']") || inCard(c, "[aria-label*='title' i][role='textbox']") || inCard(c, "[role='textbox']"); if (!el) { throw new Error("no question title"); } await type(el, text); leave(el); }, help: async function(id, text) { const c = await open(id); let el = inCard(c, "[aria-label='Description'], [aria-label='Description (optional)']"); if (!el && text) { const more = shown(c, "[aria-label='More options']").pop(); if (!more) { throw new Error("no menu"); } press(more); const item = await wait(function() { return menuItem(/^Description$/); }, 2500); press(item); el = await wait(function() { return inCard(card(id), "[aria-label='Description'], [aria-label='Description (optional)']"); }, 2500); } if (el) { await type(el, text); leave(el); } }, type: async function(id, t) { const c = await open(id); const lb = inCard(c, "[aria-label='Question types']"); if (!lb || !T[t]) { throw new Error("no type menu"); } await choose(lb, T[t].g); await wait(function() { const l2 = inCard(card(id), "[aria-label='Question types']"); return l2 && (l2.textContent || "").replace(/\s+/g, " ").trim().indexOf(T[t].g) === 0 ? true : l2 && ((l2.querySelector("[aria-selected='true']") || {}).textContent || "").trim() === T[t].g; }, 3000); }, options: async function(id, list) { let c = await open(id); const inputs = function() { return shown(card(id), "input[aria-label='option value']"); }; let now = inputs(); for (let i = 0; i < Math.min(now.length, list.length); i++) { if (now[i].value !== list[i]) { await type(now[i], list[i]); leave(now[i]); } } for (let i = now.length; i < list.length; i++) { const add = inCard(card(id), "input[aria-label='Add option']"); if (!add) { throw new Error("no add option"); } const n = inputs().length; press(add); try { add.focus(); } catch (e) {} await wait(function() { return inputs().length > n; }, 2500); const el = inputs()[n]; await type(el, list[i]); leave(el); } now = inputs(); while (now.length > list.length && now.length > 1) { const row = now[now.length - 1].closest("[role='listitem']") || now[now.length - 1].parentNode; const rm = row && shown(row, "[aria-label='Remove option']")[0]; if (!rm) { throw new Error("no remove option"); } const n = now.length; press(rm); await wait(function() { return inputs().length < n; }, 2500); now = inputs(); } }, other: async function(id, on) { const c = await open(id); const has = !!inCard(c, "input[aria-label='Other option input']"); if (on && !has) { press(await wait(function() { return inCard(card(id), "[aria-label='add \"Other\"']"); }, 2000)); } else if (!on && has) { press(await wait(function() { return inCard(card(id), "[aria-label='Remove other option']"); }, 2000)); } await sleep(200); }, required: async function(id, on) { const c = await open(id); const sw = inCard(c, "[aria-label='Required']"); if (!sw) { throw new Error("no required switch"); } if (switchOn(sw) !== !!on) { press(sw); await wait(function() { return switchOn(sw) === !!on; }, 2000); } }, scale: async function(id, lo, hi, loLabel, hiLabel) { const c = await open(id); const boxes = shown(c, "[role='listbox']").filter(function(b) { return b.getAttribute("aria-label") !== "Question types"; }); if (boxes[0]) { await choose(boxes[0], String(lo)); } if (boxes[1]) { await choose(shown(card(id), "[role='listbox']").filter(function(b) { return b.getAttribute("aria-label") !== "Question types"; })[1], String(hi)); } const labels = shown(card(id), "input[aria-label*='abel' i]"); if (labels[0]) { await type(labels[0], loLabel || ""); leave(labels[0]); } if (labels[1]) { await type(labels[1], hiLabel || ""); leave(labels[1]); } }, grid: async function(id, rows, cols) { await open(id); const setList = async function(word, list) { const inputs = function() { return shown(card(id), "input[aria-label^='" + word + " ']"); }; let now = inputs(); for (let i = 0; i < Math.min(now.length, list.length); i++) { if (now[i].value !== list[i]) { await type(now[i], list[i]); leave(now[i]); } } for (let i = now.length; i < list.length; i++) { const add = inCard(card(id), "input[aria-label='Add " + word.toLowerCase() + "']"); if (!add) { throw new Error("no add " + word); } const n = inputs().length; press(add); try { add.focus(); } catch (e) {} await wait(function() { return inputs().length > n; }, 2500); await type(inputs()[n], list[i]); leave(inputs()[n]); } now = inputs(); while (now.length > list.length && now.length > 1) { const row = now[now.length - 1].closest("[role='listitem']") || now[now.length - 1].parentNode; const rm = row && shown(row, "[aria-label^='Remove']")[0]; if (!rm) { throw new Error("no remove " + word); } const n = now.length; press(rm); await wait(function() { return inputs().length < n; }, 2500); now = inputs(); } }; await setList("Row", rows); await setList("Column", cols); }, duplicate: async function(id) { const c = await open(id); const before = ids(); press(inCard(c, "[aria-label='Duplicate question'], [aria-label^='Duplicate']")); return newCard(before); }, remove: async function(id) { const c = await open(id); const b = inCard(c, "[aria-label='Delete question'], [aria-label^='Delete']"); if (!b) { throw new Error("no delete"); } press(b); await wait(function() { return !card(id); }, 4000); // Google asks before deleting a section with questions in it const ok = menuItem(/^(Delete|OK)$/) || shown(document, "[role='dialog'] [role='button']").filter(function(x) { return /^(Delete|OK)$/i.test((x.textContent || "").trim()); })[0]; if (ok) { press(ok); } }, // a new item after this one (or at the top): a question, a title, a section add: async function(afterId, what) { if (afterId) { await open(afterId); } else { const t = all(document, "[aria-label='Form title']")[0]; if (t) { press(t); await sleep(200); } } const label = { question: "Add question", header: "Add title and description", page: "Add section", image: "Add image", video: "Add video" }[what] || "Add question"; const before = ids(); const btn = shown(document, "[aria-label='" + label + "']")[0] || all(document, "[aria-label='" + label + "']")[0]; if (!btn) { throw new Error("no " + label); } press(btn); return newCard(before); }, // the settings on Google's Settings tab setting: async function(label, on) { const sw = ugfFeFindSwitch(label); if (!sw) { throw new Error("no setting " + label); } if (switchOn(sw) !== !!on) { press(sw); await wait(function() { return switchOn(sw) === !!on; }, 2500); } }, confirmation: async function(text) { let ta = all(document, "textarea[aria-label='Confirmation message']")[0]; const edit = all(document, "[aria-label='Edit confirmation message']")[0]; if (edit && (!ta || !seen(ta))) { press(edit); await sleep(300); ta = all(document, "textarea[aria-label='Confirmation message']")[0]; } if (!ta) { throw new Error("no confirmation message"); } await type(ta, text); leave(ta); const save = shown(document, "[role='button']").filter(function(b) { return /^Save$/i.test((b.textContent || "").trim()); })[0]; if (save) { press(save); } }, emails: async function(how) { const lb = all(document, "[aria-label='Select how to collect responder emails']")[0]; if (!lb) { throw new Error("no email setting"); } await choose(lb, how); }, // Forms since 2025 takes responses only once the form is published publish: async function() { const b = ugfFePublishButton(); if (!b || /Published/i.test(b.textContent || "")) { return true; } press(b); const ok = await wait(function() { return shown(document, "[role='dialog'] [role='button'], [role='alertdialog'] [role='button']").filter(function(x) { return /^Publish$/i.test((x.textContent || "").trim()); })[0]; }, 4000); press(ok); await wait(function() { const b2 = ugfFePublishButton(); return b2 && /Published/i.test(b2.textContent || ""); }, 6000); return true; } }; // keys you press while a change is being typed into Google's editor are held // back from it let held = ""; let heldLeave = false; let failed = false; const hold = function(ev) { if (!busy || !ev.isTrusted || mine(ev.target)) { return; } ev.preventDefault(); ev.stopImmediatePropagation(); if (ev.type === "keydown" && ev.key && ev.key.length === 1 && !ev.ctrlKey && !ev.metaKey && !ev.altKey) { held += ev.key; } else if (ev.type === "keydown" && ev.key === "Backspace") { held = held.slice(0, -1); } else if (ev.type === "keydown" && (ev.key === "Tab" || ev.key === "Enter")) { heldLeave = true; } }; ["keydown", "keypress", "keyup"].forEach(function(t) { window.addEventListener(t, hold, true); }); // the field of Gplex's page you were last in (the page may have been redrawn // since a change began) let lastMine = null; document.addEventListener("focusin", function(ev) { if (mine(ev.target) && /^(INPUT|TEXTAREA)$/.test(ev.target.tagName)) { lastMine = ev.target; } }, true); const run = function() { if (busy || !Q.length) { return; } // not while you are typing in Gplex's page: that would take your cursor away if (isBusyTyping && isBusyTyping()) { setTimeout(run, 500); return; } busy = true; onState("saving"); const job = Q.shift(); const startActive = document.activeElement; const active0 = startActive; const selStart = active0 && "selectionStart" in active0 ? active0.selectionStart : null; const selEnd = active0 && "selectionEnd" in active0 ? active0.selectionEnd : null; const job0 = Date.now(); Promise.resolve().then(function() { // an item of Gplex's page stands for the question in Google's editor it made // (a function stands for the value as it is when the change is made) return job.fn.apply(null, job.args.map(function(a) { if (typeof a === "function") { a = a(); } return a && typeof a === "object" && !Array.isArray(a) && "gid" in a ? a.gid : a; })); }).then(function(res) { if (job.cb) { job.cb(null, res); } }, function(err) { console.log("[Gplex] Forms: " + job.name + " failed - " + (err && err.message)); failed = true; onState("error", job.name); if (job.cb) { job.cb(err); } }).then(function() { busy = false; let active = startActive; if (lastMine && lastMine.isConnected && (!active || !active.isConnected || !mine(active))) { active = lastMine; } // your cursor back where it was if (active && active.isConnected && mine(active) && !mine(document.activeElement)) { api.restoring = true; try { active.focus({ preventScroll: true }); if (selStart !== null) { active.setSelectionRange(selStart, selEnd === null ? selStart : selEnd); } } catch (e) {} api.restoring = false; } // what you typed while Google's field had the cursor goes where you meant it const replay = (held || heldLeave) && active && active.isConnected && mine(active); if (held && replay) { try { active.focus({ preventScroll: true }); document.execCommand("insertText", false, held); } catch (e) {} } held = ""; if (replay) { // what you typed counts as a change of that field; a Tab or Enter // pressed meanwhile leaves the field, as it would have try { active.dispatchEvent(new Event("change", { bubbles: true })); if (heldLeave) { active.blur(); } } catch (e) {} } heldLeave = false; if (!Q.length) { onState(failed ? "error" : "saved"); } run(); }); }; const api = { ops: ops }; // queue a change: api.go("title", [id, "text"], cb) api.go = function(name, args, cb) { // a newer change to the same field replaces one still waiting if (/^(title|help|formText|docTitle|options|scale|grid)$/.test(name)) { for (let i = Q.length - 1; i >= 0; i--) { if (Q[i].name === name && Q[i].args[0] === args[0]) { Q.splice(i, 1); } } } Q.push({ name: name, fn: ops[name], args: args || [], cb: cb }); setTimeout(run, 30); }; api.idle = function() { return !busy && !Q.length; }; return api; } // Google's Publish button, at the top of its editor function ugfFePublishButton() { return Array.prototype.slice.call(document.querySelectorAll("[role='button']")).filter(function(b) { return !b.closest("#ugf-fe") && /^(Publish|Published|Republish)$/i.test((b.textContent || "").replace(/\s+/g, " ").trim()); })[0] || null; } // a switch on Google's Settings tab, by its label or the words beside it function ugfFeFindSwitch(label) { const direct = Array.prototype.slice.call(document.querySelectorAll("[aria-label]")).filter(function(e) { return !e.closest("#ugf-fe") && e.getAttribute("aria-label") === label && (e.getAttribute("role") === "switch" || e.hasAttribute("aria-checked") || e.classList.contains("LsSwGf")); })[0]; if (direct) { return direct; } const words = Array.prototype.slice.call(document.querySelectorAll("div, span")).filter(function(e) { return !e.closest("#ugf-fe") && !e.children.length && (e.textContent || "").trim() === label; })[0]; let up = words; for (let i = 0; up && i < 6; i++) { up = up.parentElement; const sw = up && up.querySelector("[role='switch'], .LsSwGf, [aria-checked]"); if (sw) { return sw; } } return null; } function ugfFeSettingOn(label) { const sw = ugfFeFindSwitch(label); return !!sw && (sw.getAttribute("aria-checked") === "true" || sw.classList.contains("N2RpBe")); } // ---- the responses -------------------------------------------------------------- // Google's own download of the responses (a CSV file, sometimes in a ZIP), read here // for the summary. cb(err, { head: [...], rows: [[...]] }) function ugfFeResponses(cb) { const id = ugfFeFileId(); const url = "https://docs.google.com/forms/d/" + id + "/downloadresponses?tz_offset=" + (-new Date().getTimezoneOffset() * 60000); fetch(url, { credentials: "include" }).then(function(r) { if (!r.ok) { throw new Error("HTTP " + r.status); } return r.arrayBuffer(); }).then(function(buf) { const u8 = new Uint8Array(buf); if (u8[0] === 0x50 && u8[1] === 0x4b) { const entries = ugfTrUnzip(buf).filter(function(e) { return /\.csv$/i.test(e.name); }); if (!entries.length) { throw new Error("no csv"); } return ugfTrEntryText(entries[0]); } return new TextDecoder("utf-8").decode(u8); }).then(function(text) { const rows = ugfFeCsv(text.replace(/^/, "")); cb(null, { head: rows[0] || [], rows: rows.slice(1).filter(function(r) { return r.some(function(c) { return c !== ""; }); }) }); }).catch(function(e) { cb(e); }); } function ugfFeCsv(t) { const rows = []; let row = []; let cell = ""; let q = false; for (let i = 0; i < t.length; i++) { const c = t[i]; if (q) { if (c === '"') { if (t[i + 1] === '"') { cell += '"'; i++; } else { q = false; } } else { cell += c; } } else if (c === '"') { q = true; } else if (c === ",") { row.push(cell); cell = ""; } else if (c === "\n" || c === "\r") { if (c === "\r" && t[i + 1] === "\n") { i++; } row.push(cell); rows.push(row); row = []; cell = ""; } else { cell += c; } } if (cell || row.length) { row.push(cell); rows.push(row); } return rows; } // ---- the Forms editor's page ----------------------------------------------------- function ugfFeIcon(n, size) { const A = ugfDocsArt(); let svg = (A.fe_mi && A.fe_mi[n]) || (ugfNtArt().mi && ugfNtArt().mi[n]) || ""; if (size) { svg = svg.replace(/(]*?)\s(width|height)="\d+"/g, "$1").replace("' + svg + ""; } // Wait for the form's data (it comes late in Google's page), with the page covered // meanwhile so that Google's own editor is never seen function ugfFormsFullEditor(kind) { const veil = document.createElement("div"); veil.id = "ugf-fe-wait"; veil.style.cssText = "position:fixed;inset:0;z-index:2147483001;background:#fff;display:flex;align-items:flex-start;justify-content:center;font:13px arial,sans-serif;color:#666;padding-top:120px;"; veil.textContent = "Loading..."; (document.body || document.documentElement).appendChild(veil); const t0 = Date.now(); let loadedAt = 0; const tick = function() { const model = ugfFeParse(); if (document.readyState !== "loading" && !loadedAt) { loadedAt = Date.now(); } if (model) { veil.remove(); ugfFormsFullEditorBuild(kind, model); return; } if ((loadedAt && Date.now() - loadedAt > 3000) || Date.now() - t0 > 20000) { // not a form Gplex can read: Google's editor, dressed, as before veil.remove(); ugfFormsEditor(ugfFormsEditorEra()); return; } setTimeout(tick, 100); }; tick(); } function ugfFormsFullEditorBuild(kind, model) { const A = ugfDocsArt(); const esc = ugfDocsEsc; const l = String(layout || ""); const old = kind === "o08" || kind === "o10" || kind === "o11"; const cardsUi = kind === "fk" || kind === "fm" || kind === "fg"; const gm2 = kind === "fg"; const T = ugfFeTypes(); const types = ugfFeTypesFor(kind); const who = ugfDocsWho(); const signedIn = !!(who.email || who.name); const html = document.documentElement; html.setAttribute("gplex-fe", kind); console.log("[Gplex] Forms: layout " + layout + " (" + kind + ", Gplex's editor, " + model.items.length + " items)"); // the form's colour (a colour you picked stays; the 2025 default is the purple of 2016-2024) const accent = (function() { let c = ""; document.querySelectorAll("head style").forEach(function(st) { const m = (st.textContent || "").match(/\.kaAt2\.KKjvXb \.KKHx9e \{background-color: ([^;}]+)/); if (m && !c) { c = m[1].trim(); } }); if (!c || /87, 70, 227|103, 58, 183/.test(c)) { return { main: "#673ab7", light: "#ede7f6" }; } const rgb = (c.match(/\d+/g) || []).map(Number); const light = rgb.length === 3 ? "rgb(" + rgb.map(function(v) { return Math.round(v + (255 - v) * 0.88); }).join(", ") + ")" : "#ede7f6"; return { main: c, light: light }; })(); const style = document.createElement("style"); style.id = "ugf-fe-styles"; style.textContent = ugfFeCss(kind, accent); (document.head || document.documentElement).appendChild(style); document.title = (old || kind === "o13" ? "Edit form - " : "") + model.title + (old ? " - Google Docs" : " - Google Forms"); const shell = document.createElement("div"); shell.id = "ugf-fe"; shell.setAttribute("kind", kind); document.body.appendChild(shell); const st = { sel: null, view: "edit", status: "saved", resp: null, respErr: null, published: null, helpShown: {}, n: 0, settingsTab: "general" }; model.items.forEach(function(it) { it.gid = it.id; it.key = "k" + (st.n++); if (it.help) { st.helpShown[it.key] = true; } }); // ---- saving, through Google's editor let lastKey = 0; shell.addEventListener("keydown", function() { lastKey = Date.now(); }, true); const typing = function() { const a = document.activeElement; return !!(a && shell.contains(a) && /^(INPUT|TEXTAREA)$/.test(a.tagName) && Date.now() - lastKey < 1500); }; const drv = ugfFeDriver(function(s, what) { st.status = s; paintStatus(); if (s === "error") { note(old ? "Sorry, your changes could not be saved. Reload the form" : kind === "o13" ? "Some changes could not be saved. Reload" : "Couldn't save your last change. Reload", true); } }, typing); const go = function(name, args, cb) { drv.go(name, args, cb); }; // ---- small helpers const itemByKey = function(k) { return model.items.filter(function(it) { return it.key === k; })[0] || null; }; const idx = function(it) { return model.items.indexOf(it); }; const tname = function(t) { return T[t] ? (old || kind === "o13" ? T[t].old : T[t].g) : (t === "header" ? (old || kind === "o13" ? "Section header" : "Title and description") : t === "page" ? (old || kind === "o13" ? "Page break" : "Section") : t); }; const isQuestion = function(it) { return !!T[it.type]; }; let noteTimer = 0; const note = function(h, stay) { let n = shell.querySelector(".fenote"); if (!n) { n = document.createElement("div"); n.className = "fenote"; shell.appendChild(n); } n.innerHTML = trusted_policy.createHTML(h || ""); n.style.display = h ? "" : "none"; clearTimeout(noteTimer); if (h && !stay) { noteTimer = setTimeout(function() { n.style.display = "none"; }, 6000); } }; const statusText = function() { if (old && st.status === "saved") { return ""; } if (st.status === "saving") { return old ? "Saving..." : "Saving…"; } if (st.status === "error") { return old ? "Not saved" : "Couldn't save"; } return old ? "Saved" : kind === "o13" ? "All changes saved in Drive" : "All changes saved in Drive"; }; const paintStatus = function() { shell.querySelectorAll(".festat").forEach(function(s) { s.textContent = statusText(); s.classList.toggle("err", st.status === "error"); }); const sv = shell.querySelector(".osave"); if (sv) { sv.disabled = st.status !== "saving"; sv.textContent = st.status === "saving" ? "Saving..." : "Saved"; } }; const published = function() { const b = ugfFePublishButton(); return b ? /Published/i.test(b.textContent || "") : true; }; // ---- the bar at the very top, as each period had it const gbar = function() { const mail = who.email || who.name || ""; // the Google bar of the layout's own pages (2007 on), as over the Docs editors if (l === "2007") { return ugfNtGbar("classic", ugfDocsLabel(), "2007"); } if (l === "2009" || l === "2009L") { return ugfNtGbar("classic", ugfDocsLabel(), "2009"); } if (l === "2010N") { return ugfNtGbar("classic", ugfDocsLabel(), "2010"); } if (kind === "o08") { const apps = [["Gmail", "https://mail.google.com/"], ["Calendar", "https://calendar.google.com/"], ["Documents", ""], ["Photos", "https://photos.google.com/"], ["Reader", "https://www.google.com/reader/"], ["Web", "https://www.google.com/"]]; return '
' + apps.map(function(a) { return a[1] ? '' + a[0] + "" : "" + a[0] + ""; }).join("") + 'more ▼
' + (signedIn ? "" + esc(mail) + " | " : "") + 'Settings | Help | ' + (signedIn ? 'Sign out' : 'Sign in') + "
"; } if (kind === "o10") { const links = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Videos", "https://www.google.com/videohp"], ["Maps", "https://maps.google.com/"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"]]; return '
' + links.map(function(a) { return '' + a[0] + ""; }).join("") + 'Documentsmore ▾
' + (signedIn ? "" + esc(mail) + " | " : "") + 'Settings ▾ | Help | ' + (signedIn ? 'Sign out' : 'Sign in') + "
"; } if (kind === "o11" || kind === "o13") { return ugfNtGbar("dark", ugfDocsHere(), "2011"); } return ""; }; const avatar = function() { return signedIn ? '' + ugfGmailAvatar() + "" : ''; }; const formsHome = "https://docs.google.com/forms/u/0/"; // ---- a question as it shows on the form (not being edited) const preview = function(it) { const radio = it.type === "mc" ? "radio" : "checkbox"; if (ugfFeChoice(it.type)) { if (it.type === "list") { return cardsUi ? '
' + it.options.map(function(o, i) { return '
' + (i + 1) + ". " + esc(o) + "
"; }).join("") + "
" : '"; } return '
' + it.options.map(function(o) { return '"; }).join("") + (it.other ? '' : "") + "
"; } if (it.type === "scale") { let h = ''; for (let v = it.lo; v <= it.hi; v++) { h += ""; } h += ""; for (let v = it.lo; v <= it.hi; v++) { h += ''; } return h + "
" + v + "
" + esc(it.loLabel) + "" + esc(it.hiLabel) + "
"; } if (it.type === "grid" || it.type === "cbgrid") { let h = '' + it.cols.map(function(c) { return ""; }).join("") + ""; it.rows.forEach(function(r) { h += "" + it.cols.map(function() { return ''; }).join("") + ""; }); return h + "
" + esc(c) + "
" + esc(r) + "
"; } if (it.type === "paragraph") { return cardsUi ? '
Long answer text
' : ''; } if (it.type === "text") { return cardsUi ? '
Short answer text
' : ''; } if (it.type === "date") { return cardsUi ? '
Month, day, year ' + ugfFeIcon("event", 20) + "
" : ''; } if (it.type === "time") { return cardsUi ? '
Time ' + ugfFeIcon("schedule", 20) + "
" : ''; } if (it.type === "file") { return '
' + ugfFeIcon("cloud_upload", 20) + " Add file
"; } return ""; }; // ---- the editing panel of the old editors (2008-2013) const oldPanel = function(it) { const k = it.key; const lab = kind === "o13" ? ["Question title", "Help text", "Question type"] : ["Question Title", "Help Text", "Question Type"]; if (!isQuestion(it)) { return '' + '
' + (it.type === "page" ? "Page title" : "Header text") + '
' + (it.type === "page" ? "Page description" : "Description") + '
" + '
'; } let h = '' + "' + "
' + lab[0] + '
" + lab[1] + '
" + lab[2] + '
"; h += '
'; if (ugfFeChoice(it.type)) { h += '
' + it.options.map(function(o, i) { return '
' + (it.type === "list" ? (i + 1) + "." : '') + "" + '' + (it.options.length > 1 ? '' : "") + "
"; }).join("") + (it.other ? '
Other:
' : "") + '
' + (it.type === "list" ? (it.options.length + 1) + "." : '') + '' + (it.type !== "list" && !it.other ? ' or add "Other"' : "") + "
"; } else if (it.type === "scale") { const opt = function(from, to, cur) { let s = ""; for (let v = from; v <= to; v++) { s += '"; } return s; }; h += '
Scale to " + '
' + it.lo + ': label (optional)
' + '
' + it.hi + ': label (optional)
'; } else if (it.type === "grid" || it.type === "cbgrid") { const list = function(word, arr, f) { return '
' + word + "" + arr.map(function(v, i) { return '
' + (i + 1) + '.' + (arr.length > 1 ? '' : "") + "
"; }).join("") + '
' + (arr.length + 1) + '.
'; }; h += '
' + list("Rows", it.rows, "row") + list("Columns", it.cols, "col") + "
"; } else { h += '
' + (it.type === "paragraph" ? '' : '') + "
"; } h += "
"; h += '
"; return h; }; const oldItem = function(it, n) { const on = st.sel === it.key; const qn = isQuestion(it); let h = '
'; if (it.type === "page") { h += '
Page break
'; } if (on) { h += '
' + (qn ? esc(tname(it.type)) : esc(tname(it.type))) + "
" + oldPanel(it); } else { h += '
' + '
' + (esc(it.title) || (qn ? "Untitled question" : "")) + (it.required ? ' *' : "") + "
" + (it.help ? '
' + esc(it.help) + "
" : "") + (qn ? preview(it) : ""); } return h + "
"; }; // ---- the add-item menu (every period's list of types) const addMenuItems = function() { const out = types.map(function(t) { return { t: t, label: tname(t) }; }); out.push({ sep: true }); out.push({ t: "header", label: tname("header") }); if (kind !== "o08") { out.push({ t: "page", label: tname("page") }); } return out; }; // ---- a question card (2014 on) const optIcon = function(it, i) { if (it.type === "list") { return '' + (i + 1) + "."; } return ugfFeIcon(it.type === "mc" ? "radio_button_unchecked" : "check_box_outline_blank", 24); }; const cardItem = function(it) { const on = st.sel === it.key; const k = it.key; const qn = isQuestion(it); if (it.type === "page") { const pageNo = model.items.slice(0, idx(it) + 1).filter(function(x) { return x.type === "page"; }).length + 1; return '
Section ' + pageNo + " of " + (model.items.filter(function(x) { return x.type === "page"; }).length + 1) + "
" + '
' + '" + (on ? '" : "") + "
"; } if (!on) { return '
' + (esc(it.title) || (qn ? "Question" : "Untitled Title")) + (it.required ? ' *' : "") + "
" + (it.help ? '
' + esc(it.help) + "
" : "") + (qn ? preview(it) : "") + "
"; } let h = '
' + ugfFeIcon("drag_indicator", 20) + "
"; if (!qn) { h += '' + '" + '
"; return h; } h += '"; if (st.helpShown[k]) { h += '"; } if (ugfFeChoice(it.type)) { h += '
' + it.options.map(function(o, i) { return '
' + optIcon(it, i) + '' + (it.options.length > 1 ? '' + ugfFeIcon("close", 24) + "" : "") + "
"; }).join("") + (it.other ? '
' + optIcon(it, it.options.length) + 'Other...' + ugfFeIcon("close", 24) + "
" : "") + '
' + optIcon(it, it.options.length) + '' + (it.type !== "list" && !it.other ? 'oradd "Other"' : "") + "
"; } else if (it.type === "scale") { const opt = function(from, to, cur) { let s = ""; for (let v = from; v <= to; v++) { s += '"; } return s; }; h += '
to
" + '
' + it.lo + '
' + '
' + it.hi + '
'; } else if (it.type === "grid" || it.type === "cbgrid") { const list = function(word, arr, f) { return '
' + word + "
" + arr.map(function(v, i) { return '
' + (i + 1) + '.' + (arr.length > 1 ? '' + ugfFeIcon("close", 24) + "" : "") + "
"; }).join("") + '
' + (arr.length + 1) + '.
'; }; h += '
' + list("Rows", it.rows, "row") + list("Columns", it.cols, "col") + "
"; } else { h += preview(it); } h += '"; return h; }; // ---- the summary of responses const summary = function() { if (st.respErr) { return '
' + (old ? "Sorry, the responses could not be loaded." : "Couldn't load responses.") + "
"; } if (!st.resp) { return '
' + (old ? "Loading..." : "Loading…") + "
"; } const R = st.resp; const n = R.rows.length; let h = '
' + n + " response" + (n === 1 ? "" : "s") + "
"; if (!published()) { h += '
' + (old ? "This form is not accepting responses. " : "Not accepting responses. ") + '' + (old ? "Start accepting responses" : "Publish the form") + "
"; } if (!n) { return h + '
' + (cardsUi ? "Waiting for responses" : "No responses yet.") + "
"; } model.items.filter(isQuestion).forEach(function(it) { const cols = []; R.head.forEach(function(hd, i) { if (hd === it.title || hd.indexOf(it.title + " [") === 0) { cols.push(i); } }); if (!cols.length) { return; } h += '
' + esc(it.title) + '
'; const vals = []; R.rows.forEach(function(r) { cols.forEach(function(c) { if (r[c]) { vals.push(r[c]); } }); }); h += vals.length + " response" + (vals.length === 1 ? "" : "s") + "
"; if (ugfFeChoice(it.type) || it.type === "scale" || it.type === "grid" || it.type === "cbgrid") { const count = {}; let keys = []; if (ugfFeChoice(it.type)) { keys = it.options.slice(); } else if (it.type === "scale") { for (let v = it.lo; v <= it.hi; v++) { keys.push(String(v)); } } else { keys = it.cols.slice(); } vals.forEach(function(v) { (it.type === "checkbox" || it.type === "cbgrid" ? v.split(/;\s*/) : [v]).forEach(function(x) { if (keys.indexOf(x) < 0) { keys.push(x); } count[x] = (count[x] || 0) + 1; }); }); const max = Math.max.apply(null, keys.map(function(x) { return count[x] || 0; }).concat([1])); h += '' + keys.map(function(x) { const c = count[x] || 0; return '"; }).join("") + "
' + esc(x) + '' + c + (old || kind === "o13" ? " (" + Math.round(c / Math.max(1, n) * 100) + "%)" : "") + "
"; } else { h += '
' + vals.slice(-40).reverse().map(function(v) { return '
' + esc(v) + "
"; }).join("") + "
"; } h += "
"; }); return h + ""; }; const loadResponses = function() { st.resp = null; st.respErr = null; ugfFeResponses(function(err, r) { st.respErr = err; st.resp = r || null; if (st.view === "responses") { draw(); } }); }; // ---- the settings, as each period had them const S = function(label) { return ugfFeSettingOn(label); }; const settingsRows = function(list) { return list.map(function(r) { return '"; }).join(""); }; const confText = function() { const ta = Array.prototype.slice.call(document.querySelectorAll("textarea[aria-label='Confirmation message']")).filter(function(x) { return !x.closest("#ugf-fe"); })[0]; return ta ? ta.value || ta.getAttribute("data-initial-value") || "" : ""; }; // ---- the whole page const titleBlock = function() { if (old) { return '
' + '" + (model.items.some(function(it) { return it.required; }) ? '
* Required
' : "") + "
"; } return ""; }; const draw = function() { const scrollEl = shell.querySelector(".fescroll"); const top = scrollEl ? scrollEl.scrollTop : 0; let h = gbar(); if (old) { const logo = kind === "o08" ? 'Google Docs' : kind === "o10" ? 'Googledocs' : ''; h += '
' + esc(model.title) + 'Edit form
' + 'View published form
' + '
' + '' + '
'; h += '
'; if (st.view === "responses") { h += '' + summary(); } else { h += titleBlock() + '
' + model.items.map(oldItem).join("") + "
" + '
' + (model.viewUrl ? '" : ""); } h += "
"; } else if (kind === "o13") { h += '
Forms
' + esc(model.docTitle) + '☆' + ugfFeIcon("folder", 16) + '
' + 'FileViewInsertResponses' + 'Help
' + avatar() + "
" + '
' + ugfFeIcon("edit", 16) + ' Edit questionsView responsesView live form
'; h += '
'; if (st.view === "responses") { h += '
Summary of responses Download responses (.csv)
' + summary() + "
"; } else { h += '
Form Settings
' + settingsRows([["Show progress bar at the bottom of form pages", "Show progress bar"], ["Shuffle question order", "Shuffle question order"]]) + "
"; h += '
Form title
' + '
Form description
" + '
' + model.items.map(oldItem).join("") + "
" + '
'; h += '
Confirmation Page
" + settingsRows([["Show link to submit another response", "Show link to submit another response"], ["Publish and show a public link to form results to all respondents", "View results summary"]]) + "
" + '
'; } h += "
"; } else { // the card editors const hdrTitle = '' + esc(model.docTitle) + ""; const icons = '' + ugfFeIcon("visibility", 24) + "" + (l === "2022" ? "" : '' + ugfFeIcon("settings", 24) + ""); const send = '"; if (kind === "fm") { h += '
' + ugfFeIcon("arrow_back", 24) + "" + hdrTitle + '' + icons + send + '' + ugfFeIcon("more_vert", 24) + "" + avatar() + "
"; } else { h += '
Forms' + hdrTitle + '' + ugfFeIcon("folder", 20) + '' + ugfFeIcon("star_border", 20) + '' + '' + icons + send + '' + ugfFeIcon("more_vert", 24) + "" + avatar() + "
"; } const tabs = [["edit", gm2 ? "Questions" : kind === "fm" ? "QUESTIONS" : "Questions"], ["responses", gm2 ? "Responses" : kind === "fm" ? "RESPONSES" : "Responses"]]; if (l === "2022") { tabs.push(["settings", "Settings"]); } const tabRow = '
' + tabs.map(function(t) { return '' + t[1] + ""; }).join("") + "
"; h += (kind === "fm" ? "" : tabRow) + '
' + (kind === "fm" ? '
' : "") + '
' + (kind === "fm" ? '
' + tabRow + "
" : ""); if (st.view === "responses") { h += '
' + summary() + "
"; } else if (st.view === "settings") { h += '
Settings
' + '
Responses
' + settingsRows([["Collect email addresses", "Collect email addresses"], ["Allow response editing", "Allow response editing"], ["Limit to 1 response", "Limit to 1 response"]]) + "
" + '
Presentation
' + settingsRows([["Show progress bar", "Show progress bar"], ["Shuffle question order", "Shuffle question order"], ["Show link to submit another response", "Show link to submit another response"], ["View results summary", "View results summary"]]) + '
Confirmation message
"; } else { h += '
' + '
" + model.items.map(cardItem).join(""); } h += "
"; if (st.view === "edit") { h += '"; } h += "
"; } shell.innerHTML = trusted_policy.createHTML(h); ugfNtMenus(shell, ugfMenusRounded()); paintStatus(); placeFab(); const sc = shell.querySelector(".fescroll"); if (sc) { sc.scrollTop = top; sc.addEventListener("scroll", placeFab); } shell.querySelectorAll("textarea").forEach(grow); }; // the card toolbar follows the card being edited (2014 on) const placeFab = function() { const fab = shell.querySelector(".cfab"); if (!fab) { return; } const on = shell.querySelector(".ccard.on") || shell.querySelector(".ccard.ctc"); const body = shell.querySelector(".cbody"); if (!on || !body) { return; } const r = on.getBoundingClientRect(); const b = body.getBoundingClientRect(); const sc = shell.querySelector(".fescroll").getBoundingClientRect(); let y = r.top - b.top; y = Math.max(y, sc.top - b.top + 8); fab.style.top = y + "px"; }; const grow = function(ta) { if (!ta.classList.contains("cqt") && !ta.classList.contains("chelp") && !ta.classList.contains("cfd")) { return; } ta.style.height = "auto"; ta.style.height = ta.scrollHeight + "px"; }; // ---- menus of Gplex's own let menu = null; const closeMenu = function() { if (menu) { menu.remove(); menu = null; } }; const openMenu = function(anchor, items, onPick) { closeMenu(); menu = document.createElement("div"); menu.className = "femenu"; menu.innerHTML = trusted_policy.createHTML(items.map(function(it, i) { if (it.sep) { return '
'; } return '' + (it.icon ? ugfFeIcon(it.icon, 24) : "") + "" + esc(it.label) + ""; }).join("")); shell.appendChild(menu); const r = anchor.getBoundingClientRect(); menu.style.left = Math.min(r.left, window.innerWidth - menu.offsetWidth - 8) + "px"; menu.style.top = Math.min(r.bottom + 2, window.innerHeight - menu.offsetHeight - 8) + "px"; menu.addEventListener("click", function(ev) { const a = ev.target.closest("a[data-i]"); ev.preventDefault(); if (!a || a.classList.contains("dis")) { return; } closeMenu(); onPick(items[+a.getAttribute("data-i")]); }); }; document.addEventListener("mousedown", function(ev) { if (menu && !menu.contains(ev.target) && !ev.target.closest("[data-menu], .ctype, .cmore")) { closeMenu(); } }, true); // ---- dialogs of Gplex's own const dialog = function(title, body, buttons, onButton) { const f = document.createElement("div"); f.className = "fedlgf"; f.innerHTML = trusted_policy.createHTML('"); shell.appendChild(f); const close = function() { f.remove(); }; f.addEventListener("click", function(ev) { if (ev.target.closest(".x")) { ev.preventDefault(); close(); return; } const b = ev.target.closest("button[data-i]"); if (b) { if (onButton(+b.getAttribute("data-i"), f) !== false) { close(); } } }); const first = f.querySelector("input, textarea"); if (first) { first.focus(); } return f; }; // the form's link, and email through your own mail const sendForm = function() { const link = model.viewUrl; const pub = function() { if (!published()) { go("publish", []); } }; if (old) { dialog("Email this form", '
To:
' + '
Subject:
' + '
People can fill out the form at ' + esc(link) + "
", ["Send", "Cancel"], function(i, f) { if (i === 0) { pub(); window.open("mailto:" + encodeURIComponent(f.querySelector(".to").value) + "?subject=" + encodeURIComponent(f.querySelector(".sub").value) + "&body=" + encodeURIComponent("I've invited you to fill out the form " + model.title + ". To fill it out, visit:\n" + link), "_blank"); } }); return; } dialog("Send form", '
Link to share
' + '
Send form via email
' + '
' + (published() ? "" : '
The form will be published so that it accepts responses.
'), [cardsUi ? (kind === "fm" ? "SEND" : "Send") : "Send", kind === "o13" ? "Done" : cardsUi && kind === "fm" ? "COPY LINK" : "Copy link"], function(i, f) { pub(); if (i === 0) { window.open("mailto:" + encodeURIComponent(f.querySelector(".to").value) + "?subject=" + encodeURIComponent(f.querySelector(".sub").value) + "&body=" + encodeURIComponent(f.querySelector(".msg").value + "\n" + link), "_blank"); } else if (navigator.clipboard) { navigator.clipboard.writeText(link).catch(function() {}); note(old ? "Link copied." : "Link copied to clipboard"); } }); const ln = shell.querySelector(".fedlg .lnk"); if (ln) { ln.addEventListener("focus", function() { ln.select(); }); } }; const settingsDialog = function() { const body = '" + '" + '"; const f = dialog("Settings", body, [kind === "fm" ? "SAVE" : "Save", kind === "fm" ? "CANCEL" : "Cancel"], function(i, fence) { if (i === 0) { fence.querySelectorAll("input[data-set]").forEach(function(cb) { const lab = cb.getAttribute("data-set"); if (S(lab) !== cb.checked) { go(lab === "Collect email addresses" ? "emails" : "setting", lab === "Collect email addresses" ? [cb.checked ? "Responder input" : "Do not collect"] : [lab, cb.checked]); } }); const c = fence.querySelector(".conf"); if (c && c.value !== confText()) { go("confirmation", [c.value]); } } }); f.addEventListener("click", function(ev) { const t = ev.target.closest("[data-t]"); if (t) { ev.preventDefault(); st.settingsTab = t.getAttribute("data-t"); f.querySelectorAll("[data-t]").forEach(function(x) { x.classList.toggle("on", x === t); }); f.querySelectorAll(".dpane").forEach(function(p) { p.style.display = p.getAttribute("data-p") === st.settingsTab ? "" : "none"; }); } }); }; // ---- changing things const select = function(k) { if (st.sel === k) { return; } st.sel = k; draw(); const box = shell.querySelector(".oi.on input[data-f='title'], .ccard.on .cqt, .ccard.on .cst"); if (box && !old) { box.focus(); } else if (box && old) { box.focus(); } }; const addItem = function(what, t) { const cur = itemByKey(st.sel); const at = cur ? idx(cur) + 1 : model.items.length; const it = { id: "", gid: "", key: "k" + (st.n++), title: "", help: "", type: what === "question" ? t || "mc" : what, required: false, options: ["Option 1"], other: false, lo: 1, hi: 5, loLabel: "", hiLabel: "", rows: ["Row 1"], cols: ["Column 1"] }; if (what === "question" && !ugfFeChoice(it.type)) { it.options = []; } model.items.splice(at, 0, it); const after = cur ? cur : (at > 0 ? model.items[at - 1] : null); go("add", [after, what], function(err, gid) { if (!err && gid) { it.gid = gid; } }); if (what === "question" && it.type !== "mc") { go("type", [it, it.type]); } st.sel = it.key; draw(); const box = shell.querySelector(".oi.on input[data-f='title'], .ccard.on .cqt, .ccard.on .cst"); if (box) { box.focus(); } }; const commit = function(el) { const f = el.getAttribute("data-f"); const it = itemByKey(el.getAttribute("data-k")); const v = el.type === "checkbox" ? el.checked : el.value; if (f === "ftitle") { model.title = v; go("formText", ["title", function() { return model.title; }]); return; } if (f === "fdesc") { model.desc = v; go("formText", ["desc", function() { return model.desc; }]); return; } if (f === "conf") { go("confirmation", [v]); return; } if (!it) { return; } if (f === "title") { it.title = v; go("title", [it, function() { return it.title; }]); } else if (f === "help") { it.help = v; go("help", [it, function() { return it.help; }]); } else if (f === "opt") { it.options[+el.getAttribute("data-i")] = v; goOptions(it); } else if (f === "row" || f === "col") { (f === "row" ? it.rows : it.cols)[+el.getAttribute("data-i")] = v; goGrid(it); } else if (f === "lo" || f === "hi") { it[f] = +v; go("scale", [it, it.lo, it.hi, it.loLabel, it.hiLabel]); draw(); } else if (f === "loLabel" || f === "hiLabel") { it[f] = v; go("scale", [it, it.lo, it.hi, it.loLabel, it.hiLabel]); } else if (f === "req") { it.required = !!v; go("required", [it, !!v]); } else if (f === "type") { setType(it, v); } }; const goOptions = function(it) { go("options", [it, function() { return it.options.slice(); }]); }; const goGrid = function(it) { go("grid", [it, function() { return it.rows.slice(); }, function() { return it.cols.slice(); }]); }; const setType = function(it, t) { if (it.type === t) { return; } const wasChoice = ugfFeChoice(it.type); it.type = t; if (ugfFeChoice(t) && !wasChoice && !it.options.length) { it.options = ["Option 1"]; } if (t === "list") { it.other = false; } go("type", [it, t]); draw(); }; shell.addEventListener("input", function(ev) { const el = ev.target; const f = el.getAttribute("data-f"); grow(el); if (!f) { return; } const it = itemByKey(el.getAttribute("data-k")); if (f === "title" && it) { it.title = el.value; } else if (f === "help" && it) { it.help = el.value; } else if (f === "opt" && it) { it.options[+el.getAttribute("data-i")] = el.value; } else if ((f === "row" || f === "col") && it) { (f === "row" ? it.rows : it.cols)[+el.getAttribute("data-i")] = el.value; } else if (f === "ftitle") { model.title = el.value; } else if (f === "fdesc") { model.desc = el.value; } }); shell.addEventListener("change", function(ev) { const el = ev.target; if (el.hasAttribute("data-set")) { // the settings on the page itself (2013, and the Settings tab of 2022) if (!el.closest(".fedlg")) { const lab = el.getAttribute("data-set"); go(lab === "Collect email addresses" ? "emails" : "setting", lab === "Collect email addresses" ? [el.checked ? "Responder input" : "Do not collect"] : [lab, el.checked]); } return; } if (el.hasAttribute("data-f")) { commit(el); } }); // a new option: typing in "Click to add option" / "Add option" const addOption = function(el) { const it = itemByKey(el.getAttribute("data-k")); if (!it) { return; } const g = el.getAttribute("data-g"); if (g) { (g === "row" ? it.rows : it.cols).push(el.value || (g === "row" ? "Row " : "Column ") + ((g === "row" ? it.rows : it.cols).length + 1)); goGrid(it); } else { it.options.push(el.value || "Option " + (it.options.length + 1)); goOptions(it); } draw(); const list = shell.querySelectorAll((g ? "[data-f='" + g + "']" : "[data-f='opt']") + "[data-k='" + it.key + "']"); const last = list[list.length - 1]; if (last) { last.focus(); last.select(); } }; shell.addEventListener("focusin", function(ev) { const el = ev.target; if (el.matches(".oadd, .cadd, .oaddg, .caddg") && !drv.restoring) { addOption(el); } }); shell.addEventListener("keydown", function(ev) { const el = ev.target; if (ev.key === "Enter" && el.matches("input[data-f='opt']")) { // Enter in an option starts the next one, as Google's did ev.preventDefault(); el.blur(); const it = itemByKey(el.getAttribute("data-k")); if (it && +el.getAttribute("data-i") === it.options.length - 1) { const add = shell.querySelector(".oadd[data-k='" + it.key + "'], .cadd[data-k='" + it.key + "']"); if (add) { add.focus(); } } } else if (ev.key === "Enter" && el.matches("input[data-f='title'], input[data-f='ftitle'], input[data-f='help']")) { ev.preventDefault(); el.blur(); } }); shell.addEventListener("click", function(ev) { const t = ev.target; const a = t.closest("a, button, [data-menu], [data-view], [data-act], .oi, .ccard"); if (!a || !shell.contains(a)) { return; } if (a.matches("a[href='#'], button, [data-menu], [data-view], [data-act], .ctype, .cmore, [data-add]")) { // handled below } if (a.classList.contains("reload")) { ev.preventDefault(); window.location.reload(); return; } if (a.classList.contains("me")) { return; } const view = a.getAttribute("data-view"); if (view) { ev.preventDefault(); st.view = view; st.sel = null; if (view === "responses") { loadResponses(); } draw(); return; } if (a.classList.contains("toedit")) { ev.preventDefault(); st.view = "edit"; draw(); return; } if (a.classList.contains("dlcsv")) { ev.preventDefault(); window.open("https://docs.google.com/forms/d/" + ugfFeFileId() + "/downloadresponses?tz_offset=" + (-new Date().getTimezoneOffset() * 60000), "_blank"); return; } if (a.classList.contains("dopub")) { ev.preventDefault(); go("publish", [], function() { draw(); }); return; } const act = a.getAttribute("data-act"); if (act === "send" || act === "email") { ev.preventDefault(); sendForm(); return; } if (act === "preview") { ev.preventDefault(); if (model.viewUrl) { window.open(model.viewUrl, "_blank"); } return; } if (act === "settings") { ev.preventDefault(); settingsDialog(); return; } if (act === "rename") { ev.preventDefault(); dialog("Rename form", '', ["OK", "Cancel"], function(i, f) { if (i === 0) { model.docTitle = f.querySelector(".nm").value; go("docTitle", [model.docTitle]); draw(); } }); return; } const m = a.getAttribute("data-menu"); if (m) { ev.preventDefault(); let items = []; let pick = null; if (m === "add" || m === "insert") { items = addMenuItems(); pick = function(x) { if (x.t === "header" || x.t === "page") { addItem(x.t); } else { addItem("question", x.t); } }; } else if (m === "resp") { items = [{ label: old ? "Summary" : "Summary of responses", act: "sum" }, { label: "Download responses (.csv)", act: "csv" }, { sep: true }, { label: published() ? "Accepting responses" : "Start accepting responses", act: "pub", on: published() }]; pick = function(x) { if (x.act === "sum") { st.view = "responses"; loadResponses(); draw(); } else if (x.act === "csv") { window.open("https://docs.google.com/forms/d/" + ugfFeFileId() + "/downloadresponses?tz_offset=" + (-new Date().getTimezoneOffset() * 60000), "_blank"); } else if (x.act === "pub" && !published()) { go("publish", []); } }; } else if (m === "more") { items = [{ label: "Edit confirmation", act: "conf" }, { label: "View published form", act: "live" }, { sep: true }, { label: published() ? "Accepting responses" : "Start accepting responses", act: "pub", on: published() }]; pick = function(x) { if (x.act === "conf") { dialog("Edit confirmation", '
Confirmation message
" + settingsRows([["Show link to submit another response", "Show link to submit another response"], ["Publish response summary", "View results summary"]]), ["Save", "Cancel"], function(i, f) { if (i === 0) { const c = f.querySelector(".conf").value; if (c !== confText()) { go("confirmation", [c]); } f.querySelectorAll("input[data-set]").forEach(function(cb) { if (S(cb.getAttribute("data-set")) !== cb.checked) { go("setting", [cb.getAttribute("data-set"), cb.checked]); } }); } }); } else if (x.act === "live") { window.open(model.viewUrl, "_blank"); } else if (x.act === "pub" && !published()) { go("publish", []); } }; } else if (m === "file") { items = [{ label: "Send form", act: "send" }, { label: "Rename...", act: "rename" }, { sep: true }, { label: "Forms home", act: "home" }]; pick = function(x) { if (x.act === "send") { sendForm(); } else if (x.act === "rename") { shell.querySelector("[data-act='rename']").click(); } else { window.location.href = formsHome; } }; } else if (m === "view") { items = [{ label: "Live form", act: "live" }, { label: "Summary of responses", act: "sum" }]; pick = function(x) { if (x.act === "live") { window.open(model.viewUrl, "_blank"); } else { st.view = "responses"; loadResponses(); draw(); } }; } else if (m === "help") { items = [{ label: "Forms Help", act: "help" }]; pick = function() { window.open("https://support.google.com/docs/topic/9055404", "_blank"); }; } else if (m === "hmore") { items = [{ label: "Forms home", act: "home" }, { label: "Download responses (.csv)", act: "csv" }, { sep: true }, { label: published() ? "Accepting responses" : "Publish form", act: "pub", on: published() }]; pick = function(x) { if (x.act === "home") { window.location.href = formsHome; } else if (x.act === "csv") { window.open("https://docs.google.com/forms/d/" + ugfFeFileId() + "/downloadresponses?tz_offset=" + (-new Date().getTimezoneOffset() * 60000), "_blank"); } else if (!published()) { go("publish", []); } }; } openMenu(a, items, pick); return; } const addWhat = a.getAttribute("data-add"); if (addWhat) { ev.preventDefault(); addItem(addWhat); return; } // the card's type menu (2014 on) if (a.classList.contains("ctype")) { ev.preventDefault(); const it = itemByKey(a.getAttribute("data-k")); const groups = [["text", "paragraph"], ["mc", "checkbox", "list"], ["file"], ["scale", "grid", "cbgrid"], ["date", "time"]]; const items = []; groups.forEach(function(g) { const got = g.filter(function(x) { return types.indexOf(x) > -1; }); if (got.length) { if (items.length) { items.push({ sep: true }); } got.forEach(function(x) { items.push({ t: x, label: tname(x), icon: T[x].mi, on: it && it.type === x }); }); } }); openMenu(a, items, function(x) { setType(it, x.t); }); return; } if (a.classList.contains("cmore")) { ev.preventDefault(); const it = itemByKey(a.getAttribute("data-k")); openMenu(a, [{ label: "Description", act: "desc", on: !!st.helpShown[it.key] }], function() { st.helpShown[it.key] = !st.helpShown[it.key]; if (!st.helpShown[it.key] && it.help) { it.help = ""; go("help", [it, ""]); } draw(); const hb = shell.querySelector(".ccard.on .chelp"); if (hb) { hb.focus(); } }); return; } // an item's own buttons const box = a.closest(".oi, .ccard"); const it = box ? itemByKey(box.getAttribute("data-k")) : null; if (a.matches(".oed")) { ev.preventDefault(); select(it.key); return; } if (a.matches(".odone")) { ev.preventDefault(); st.sel = null; draw(); return; } if (a.matches(".odup, .cdup") && it) { ev.preventDefault(); const copy = JSON.parse(JSON.stringify(it)); copy.key = "k" + (st.n++); copy.gid = ""; model.items.splice(idx(it) + 1, 0, copy); go("duplicate", [it], function(err, gid) { if (!err && gid) { copy.gid = gid; } }); st.sel = copy.key; draw(); return; } if (a.matches(".odel, .cdel") && it) { ev.preventDefault(); model.items.splice(idx(it), 1); go("remove", [it]); st.sel = null; draw(); return; } if (a.matches(".orm, .crm") && it) { ev.preventDefault(); if (a.classList.contains("oth")) { it.other = false; go("other", [it, false]); } else if (a.getAttribute("data-g")) { const arr = a.getAttribute("data-g") === "row" ? it.rows : it.cols; arr.splice(+a.getAttribute("data-i"), 1); goGrid(it); } else { it.options.splice(+a.getAttribute("data-i"), 1); goOptions(it); } draw(); return; } if (a.matches(".oaddother, .caddother") && it) { ev.preventDefault(); it.other = true; go("other", [it, true]); draw(); return; } // a click on an item opens it (a click on the old editors' items too) if (box && it && st.sel !== it.key && !t.closest("input:not([disabled]), textarea:not([disabled]), select:not([disabled]), button")) { select(it.key); } else if (box && box.classList.contains("ctc") && st.sel !== "title") { st.sel = "title"; shell.querySelectorAll(".ccard.on").forEach(function(c) { c.classList.remove("on"); }); box.classList.add("on"); placeFab(); } }); // a click outside the item being edited closes it (the card editors) shell.addEventListener("mousedown", function(ev) { if (!cardsUi || !st.sel || st.sel === "title") { return; } if (!ev.target.closest(".ccard, .cfab, .femenu, .fedlgf, .ctabs, .chead, .mbar")) { st.sel = null; draw(); } }); // the account menu from the photo, square until 2019 const onAcct = function(ev) { const me = ev.target && ev.target.closest ? ev.target.closest("#ugf-fe .me") : null; if (me) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailAccountMenu(me, ugfMenusRounded() ? "m2018" : "m2013"); } return; } if (ev.target && ev.target.closest && ev.target.closest("#ugf-gmail-accfence")) { ev.preventDefault(); ev.stopPropagation(); if (ev.type === "click") { ugfGmailCloseMenus(); } } }; window.addEventListener("mousedown", onAcct, true); window.addEventListener("click", onAcct, true); window.addEventListener("resize", placeFab); // leaving with changes not yet made in Google's editor window.addEventListener("beforeunload", function(ev) { if (!drv.idle()) { ev.preventDefault(); ev.returnValue = ""; } }); draw(); } // ---- how the Forms editor of each period looked ----------------------------------- function ugfFeCss(kind, accent) { const A = ugfDocsArt(); const F = "#ugf-fe"; const spr = 'url("' + A.feSprite + '")'; const old = kind === "o08" || kind === "o10" || kind === "o11"; const kennedy = kind === "o11" || kind === "o13"; const cardsUi = kind === "fk" || kind === "fm" || kind === "fg"; const round = kind === "fg"; // the Google bar and the photo corner, from the shared styles (without their // rule that hides the page underneath: Google's editor must stay usable) const shared = ugfNtBaseCss("ugf-fe").filter(function(r) { return r.indexOf("html[gplex-nt]") !== 0 && r.indexOf(F + " {") !== 0; }); const css = shared.concat([ "html[gplex-fe], html[gplex-fe] body { overflow: hidden !important; }", "#ugf-gmail-accfence { position: fixed; inset: 0; z-index: 2147483600 !important; }", "#ugf-gmail-accmenu, #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }", "#ugf-gmail-accmenu a, #ugf-gmail-appsmenu a { text-decoration: none; }", ugfMapsMenuCss(), F + " { position: fixed; inset: 0; z-index: 2147483000; display: flex; flex-direction: column; background: #fff; color: #000; font: 13px arial, sans-serif; text-align: left; }", F + " * { box-sizing: border-box; }", F + " .mi { display: inline-flex; font-style: normal; } " + F + " .mi svg { display: block; fill: currentColor; }", F + " .sp { flex: 1; }", F + " .fescroll { flex: 1; overflow: auto; min-height: 0; position: relative; }", F + " input, " + F + " textarea, " + F + " select, " + F + " button { font: inherit; color: inherit; }", F + " .w { width: 100%; }", F + " .femenu { position: fixed; z-index: 60; background: #fff; min-width: 180px; padding: 4px 0; }", F + " .femenu a { display: flex; align-items: center; gap: 12px; padding: 5px 24px 5px 16px; color: #222; text-decoration: none; white-space: nowrap; cursor: pointer; }", F + " .femenu a.dis { color: #aaa; cursor: default; } " + F + " .femenu .sep { border-top: 1px solid #ddd; margin: 4px 0; }", F + " .fedlgf { position: fixed; inset: 0; z-index: 70; display: flex; align-items: center; justify-content: center; }", F + " .fedlg { background: #fff; width: 480px; max-width: calc(100vw - 32px); }", F + " .fedlgh { display: flex; justify-content: space-between; align-items: center; } " + F + " .fedlgh .x { text-decoration: none; font-size: 20px; color: #777; }", F + " .fedlg .dr { margin: 0 0 12px 0; } " + F + " .fedlg .dr .w { margin: 4px 0; } " + F + " .fedlg .small { font-size: 12px; color: #666; }", F + " .fedlg .dl { font-weight: bold; margin: 8px 0 4px 0; } " + F + " .fedlg .srow { display: block; margin: 6px 0; }", F + " .fedlgf2 { display: flex; gap: 8px; }", F + " .fenote { position: absolute; left: 50%; transform: translateX(-50%); top: 6px; z-index: 65; }", F + " .festat { color: #666; font-size: 12px; margin: 0 10px; white-space: nowrap; } " + F + " .festat.err { color: #c00; }", // previews of the questions F + " .pv { margin: 6px 0 0 0; } " + F + " .pvo { display: block; margin: 4px 0; } " + F + " .pvother { width: 160px; }", F + " .pvscale td { text-align: center; padding: 2px 8px; } " + F + " .pvscale .lb { color: #666; } " + F + " .pvgrid td { text-align: center; padding: 2px 10px; } " + F + " .pvgrid .rl { text-align: left; }", F + " .pvin { width: 260px; } " + F + " .pvin.short { width: 120px; } " + F + " .pvta { width: 400px; height: 60px; }", // the summary of responses F + " .rsum { padding: 4px 0; } " + F + " .rcount { font-size: 20px; margin: 4px 0 12px 0; } " + F + " .rpub { margin: 0 0 12px 0; } " + F + " .rmsg { color: #666; margin: 12px 0; }", F + " .ritem { margin: 18px 0; } " + F + " .rq { font-weight: bold; } " + F + " .rn { color: #666; font-size: 12px; margin: 2px 0 8px 0; }", F + " .rbars { border-collapse: collapse; } " + F + " .rbars td { padding: 3px 8px 3px 0; } " + F + " .rbars .rl { max-width: 240px; } " + F + " .rbars .rb { width: 320px; } " + F + " .rbars .rb span { display: block; height: 14px; background: #3366cc; min-width: 1px; }", F + " .rtexts .rt { padding: 4px 0; border-bottom: 1px solid #eee; white-space: pre-wrap; }" ]); if (old || kind === "o13") { css.push( // the Google links of 2008-2010 F + " .fetop { display: flex; justify-content: space-between; padding: 3px 8px; font-size: 13px; flex: 0 0 auto; }", F + " .fetop a { color: #00c; margin-right: 7px; } " + F + " .fetop b { margin-right: 7px; } " + F + " .fetop .right a { margin: 0; } " + F + " .fetop small { font-size: 9px; }", F + " .fetop.g10 { border-bottom: 1px solid #c9d7f1; padding: 3px 8px 4px 8px; }", // an item: its tools on hover (the editor's own pencil, copy and bin) F + " .oi { position: relative; margin: 6px 0; padding: 8px 10px; border: 1px solid transparent; cursor: pointer; }", F + " .oi .oitools { position: absolute; right: 8px; top: 6px; display: none; gap: 8px; } " + F + " .oi:hover .oitools { display: flex; }", F + " .oitools a { display: block; background-image: " + spr + "; background-repeat: no-repeat; }", F + " .oitools .oed { width: 13px; height: 13px; background-position: -55px -61px; } " + F + " .oitools .odup { width: 15px; height: 15px; background-position: -71px -59px; }", F + " .oitools .odel { width: 13px; height: 13px; background-position: -87px -60px; }", F + " .oq { font-weight: bold; } " + F + " .ostar { color: #c00; } " + F + " .oh { color: #666; font-size: 12px; margin: 2px 0; }", F + " .oi.on { cursor: default; } " + F + " .oihead { font-size: 11px; color: #666; margin: 0 0 6px 0; }", F + " .oedtab { border-collapse: collapse; } " + F + " .oedtab th { text-align: right; padding: 4px 8px 4px 0; white-space: nowrap; width: 112px; vertical-align: top; }", F + " .oedtab td { padding: 3px 0; } " + F + " .oedtab input.w, " + F + " .oedtab textarea.w { width: 380px; }", F + " .oedbody { margin: 6px 0 0 120px; } " + F + " .oopt { display: flex; align-items: center; gap: 6px; margin: 3px 0; } " + F + " .oopt input[type=text] { width: 300px; }", F + " .oopt .on { width: 22px; text-align: right; color: #666; } " + F + " .oopt.add .oadd, " + F + " .oopt.add .oaddg { color: #999; font-style: italic; }", F + " .orm { display: inline-block; width: 13px; height: 13px; background: " + spr + " -45px -42px no-repeat; }", F + " .oother input { width: 200px; } " + F + " .or { color: #666; } " + F + " .oscale select { margin: 0 4px; } " + F + " .olab { margin: 6px 0; } " + F + " .olab input { width: 200px; }", F + " .ogrid { display: flex; gap: 30px; } " + F + " .ogl b { display: block; margin: 0 0 4px 0; } " + F + " .ogl .oopt input[type=text] { width: 180px; }", F + " .otheir input, " + F + " .otheir textarea { width: 260px; background: #fff; }", F + " .oedfoot { display: flex; align-items: center; gap: 14px; margin: 10px 0 2px 120px; }", F + " .opb { font-size: 11px; color: #666; border-top: 2px dashed #aaa; padding-top: 4px; margin-bottom: 6px; }", F + " .oaddrow { margin: 10px 0; } " + F + " .olink { margin: 20px 0; }" ); } if (old) { const btn = kind === "o11" ? [ F + " .ob { display: inline-flex; align-items: center; height: 29px; padding: 0 10px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px arial, sans-serif; cursor: default; margin-right: 8px; }", F + " .ob:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); color: #222; } " + F + " .ob[disabled] { opacity: .5; }", F + " .odone { height: 29px; padding: 0 14px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff; font: bold 11px arial, sans-serif; }" ] : [ F + " .ob { height: 22px; padding: 0 8px; margin-right: 6px; border: 1px solid #aaa; border-radius: 2px; background: " + spr + " 0 -76px repeat-x #e3e3e3; font: 13px arial, sans-serif; color: #000; cursor: pointer; }", F + " .ob:hover { border-color: #888; } " + F + " .ob[disabled] { color: #888; }", F + " .odone { height: 22px; padding: 0 12px; border: 1px solid #aaa; border-radius: 2px; background: " + spr + " 0 -76px repeat-x #e3e3e3; font: bold 13px arial, sans-serif; cursor: pointer; }" ]; css.push.apply(css, btn); css.push( F + " .ohead { display: flex; align-items: center; gap: 12px; padding: 8px 10px 6px 10px; flex: 0 0 auto; }", F + " .ologo { display: flex; align-items: flex-end; text-decoration: none; } " + F + " .ologo img { display: block; } " + F + " .ologo .g10 { height: 35px; }", F + " .ologo .dw { color: #1c51a8; font: 26px arial, sans-serif; margin: 0 0 1px 3px; letter-spacing: -1px; }", F + " .spr.logo { display: block; width: 105px; height: 23px; background: " + spr + " 0 0 no-repeat; }", F + " .oname b { font-size: 16px; display: block; } " + F + " .oname .osub { color: #666; font-size: 12px; } " + F + " .olive { color: #00c; }", F + " .otool { display: flex; align-items: center; padding: 4px 8px; flex: 0 0 auto; " + (kind === "o11" ? "border-bottom: 1px solid #ebebeb; background: #fff; padding: 8px 10px;" : "background: " + spr + " 0 -96px repeat-x #e5eaf4; border-top: 1px solid #c3d9ff; border-bottom: 1px solid #c3d9ff;") + " }", F + " .ocanvas { padding: 12px 16px 60px 16px; max-width: 820px; }", F + " .oform { margin: 0 0 10px 0; } " + F + " .oft { width: 100%; font: bold 22px arial, sans-serif; border: 1px solid #ccc; padding: 3px 5px; margin: 0 0 6px 0; }", F + " .ofd { width: 100%; font: 13px arial, sans-serif; border: 1px solid #ccc; padding: 3px 5px; resize: vertical; }", F + " .oreq { color: #c00; font-size: 12px; margin: 8px 0 0 0; }", F + " .oi:hover { background: " + (kind === "o11" ? "#f5f5f5" : "#fff9dd") + "; border-color: " + (kind === "o11" ? "#e5e5e5" : "#e8d98b") + "; }", F + " .oi.on, " + F + " .oi.on:hover { background: " + (kind === "o11" ? "#f1f1f1" : "#e8eef7") + "; border-color: " + (kind === "o11" ? "#d8d8d8" : "#c3d9ff") + "; }", F + " .ohead2 { margin: 0 0 10px 0; } " + F + " .ohead2 a { color: #00c; }", F + " .femenu { border: 1px solid " + (kind === "o11" ? "rgba(0,0,0,.2)" : "#999") + "; box-shadow: " + (kind === "o11" ? "0 2px 4px rgba(0,0,0,.2)" : "2px 2px 3px rgba(0,0,0,.25)") + "; }", F + " .femenu a:hover { background: " + (kind === "o11" ? "#eee" : "#e0ecff") + "; }", F + " .fedlgf { background: rgba(255,255,255,.5); }", kind === "o11" ? F + " .fedlg { border: 1px solid rgba(0,0,0,.333); box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 26px 36px; } " + F + " .fedlgh { font-size: 16px; margin: 0 0 16px 0; } " + F + " .fedlgf2 { margin-top: 14px; } " + F + " .fedlgf2 button { height: 29px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); font: bold 11px arial, sans-serif; color: #444; } " + F + " .fedlgf2 .pri { border-color: #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; }" : F + " .fedlg { border: 1px solid #6b90da; border-radius: 4px; box-shadow: 2px 2px 6px rgba(0,0,0,.3); } " + F + " .fedlgh { background: #e0ecff; padding: 6px 10px; font-weight: bold; border-radius: 4px 4px 0 0; } " + F + " .fedlgb { padding: 12px 14px 4px 14px; } " + F + " .fedlgf2 { padding: 4px 14px 12px 14px; } " + F + " .fedlgf2 button { padding: 1px 12px; } " + F + " .fedlgf2 .pri { font-weight: bold; }", F + " .fenote { background: #fad163; padding: 3px 12px; font-weight: bold; border-radius: 3px; top: 34px; } " + F + " .fenote a { color: #00c; }" ); } if (kind === "o13") { css.push( F + " { background: #f1f1f1; }", F + " .khead { display: flex; align-items: center; gap: 10px; padding: 8px 16px 0 16px; background: #fff; flex: 0 0 auto; }", F + " .kicon img { width: 30px; height: 30px; display: block; } " + F + " .ktitle { display: flex; flex-direction: column; }", F + " .kname { display: flex; align-items: center; gap: 8px; font-size: 18px; color: #222; } " + F + " .kn { cursor: pointer; padding: 1px 3px; border: 1px solid transparent; } " + F + " .kn:hover { border-color: #ccc; }", F + " .kstar { color: #999; font-size: 16px; } " + F + " .kfold { color: #999; }", F + " .kmenus { display: flex; align-items: center; margin: 2px 0 4px -6px; } " + F + " .km { padding: 3px 7px; cursor: pointer; color: #222; border: 1px solid transparent; } " + F + " .km:hover { background: #eee; border-color: #ccc; }", F + " .kb { display: inline-flex; align-items: center; gap: 4px; height: 29px; padding: 0 10px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444 !important; font: bold 11px arial, sans-serif; text-decoration: none; cursor: default; margin-right: 8px; }", F + " .kb:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); } " + F + " .kb.on { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); border-color: #ccc; color: #222 !important; }", F + " .kb.blue, " + F + " .odone { border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff !important; height: 29px; padding: 0 14px; border-radius: 2px; font: bold 11px arial, sans-serif; }", F + " .ktabs { display: flex; padding: 8px 16px; background: #fff; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto; }", F + " .kpage { max-width: 880px; margin: 16px auto 60px auto; }", F + " .kbox, " + F + " .kform { background: #fff; border: 1px solid #e5e5e5; padding: 14px 20px; margin: 0 0 14px 0; }", F + " .kboxh { font-weight: bold; font-size: 14px; margin: 0 0 8px 0; display: flex; justify-content: space-between; } " + F + " .kboxh a { color: #15c; font-weight: normal; font-size: 13px; }", F + " .srow { display: block; margin: 6px 0; } " + F + " .kft { margin: 0 0 10px 0; } " + F + " .klab { font-weight: bold; margin: 0 0 4px 0; }", F + " .kform input.w, " + F + " .kbox textarea.w, " + F + " .kform textarea.w { border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 4px 6px; font: 13px arial, sans-serif; }", F + " .kform input[data-f=ftitle] { font-size: 18px; }", F + " .oi:hover { background: #fafafa; border-color: #e5e5e5; } " + F + " .oi.on, " + F + " .oi.on:hover { background: #f7f7f7; border-color: #d8d8d8; }", F + " .oedtab input.w, " + F + " .oopt input[type=text] { border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 3px 5px; }", F + " .ksendrow { margin: 0 0 20px 0; }", F + " .femenu { border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 4px rgba(0,0,0,.2); } " + F + " .femenu a:hover { background: #eee; }", F + " .fedlgf { background: rgba(255,255,255,.75); } " + F + " .fedlg { border: 1px solid rgba(0,0,0,.333); box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 26px 36px; }", F + " .fedlgh { font-size: 16px; margin: 0 0 16px 0; } " + F + " .fedlgf2 { margin-top: 14px; }", F + " .fedlgf2 button { height: 29px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); font: bold 11px arial, sans-serif; color: #444; }", F + " .fedlgf2 .pri { border-color: #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; }", F + " .fenote { background: #f9edbe; border: 1px solid #f0c36d; padding: 4px 14px; font-weight: bold; top: 70px; } " + F + " .fenote a { color: #15c; }", F + " .me { margin-left: 8px; } " + F + " .me img, " + F + " .me .pfp { width: 32px; height: 32px; }" ); } if (cardsUi) { const sq = round ? "8px" : "0"; const blue = round ? "#1a73e8" : "#4285f4"; css.push( F + " { background: " + accent.light + "; font: 14px Roboto, arial, sans-serif; color: #202124; }", F + " a { color: inherit; text-decoration: none; }", F + " .ib { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; color: #5f6368; cursor: pointer; }", F + " .ib:hover { background: rgba(95,99,104,.08); }", F + " .chead { display: flex; align-items: center; height: 64px; padding: 0 8px 0 16px; background: #fff; flex: 0 0 auto; }", F + " .cicon img { width: 40px; height: 40px; display: block; } " + F + " .ctitle { font-size: 18px; margin: 0 8px 0 12px; color: #202124; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 40vw; }", F + " .hfold, " + F + " .hstar { width: 32px; height: 32px; }", F + " .csend { height: 36px; padding: 0 24px; margin: 0 8px; border: 0; cursor: pointer; font: 500 14px Roboto, arial, sans-serif; }", F + " .me { display: inline-flex; margin: 0 8px; } " + F + " .me img, " + F + " .me .pfp { width: 32px; height: 32px; border-radius: 50%; display: block; object-fit: cover; }", F + " .ctabs { display: flex; justify-content: center; background: #fff; height: 42px; flex: 0 0 auto; border-bottom: 1px solid #dadce0; }", F + " .ctabs a { display: flex; align-items: center; padding: 0 8px; margin: 0 10px; font-weight: 500; color: #202124; border-bottom: 3px solid transparent; }", F + " .ctabs a.on { color: " + accent.main + "; border-bottom-color: " + accent.main + "; }", F + " .cbody { position: relative; width: 770px; max-width: calc(100% - 90px); margin: 0 auto; padding: 12px 0 90px 0; }", F + " .ccol { position: relative; }", F + " .ccard { position: relative; background: #fff; border: 1px solid #dadce0; border-radius: " + sq + "; margin: 12px 0 0 0; padding: 22px 24px 24px 24px; }", F + " .ccard.ctc { border-top: 10px solid " + accent.main + "; }", F + " .ccard.on { border-left: 6px solid " + blue + "; padding-left: 19px; box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12); }", F + " .ccard.ctc.on { border-left: 6px solid " + blue + "; }", F + " .cft { width: 100%; font: 32px Roboto, arial, sans-serif; border: 0; border-bottom: 1px solid transparent; padding: 0 0 6px 0; outline: none; color: #202124; background: transparent; }", F + " .cfd { width: 100%; font: 14px Roboto, arial, sans-serif; border: 0; border-bottom: 1px solid transparent; padding: 8px 0 4px 0; outline: none; resize: none; overflow: hidden; background: transparent; color: #202124; }", F + " .ccard.on .cft, " + F + " .ccard.on .cfd { border-bottom-color: #dadce0; } " + F + " .cft:focus, " + F + " .cfd:focus { border-bottom: 2px solid " + accent.main + " !important; }", F + " .cdrag { position: absolute; left: 50%; top: 2px; transform: translateX(-50%) rotate(90deg); color: #dadce0; }", F + " .crow1 { display: flex; gap: 16px; align-items: flex-start; } " + F + " .cqtw { flex: 1; }", F + " .cqt { width: 100%; min-height: 56px; background: #f8f9fa; border: 0; border-bottom: 1px solid #80868b; padding: 16px; font: 16px Roboto, arial, sans-serif; resize: none; overflow: hidden; outline: none; color: #202124; }", F + " .cqt:focus { border-bottom: 2px solid " + accent.main + "; } " + F + " input.cqt.big { min-height: 0; font-size: 20px; padding: 12px 16px; }", F + " .ccard.pg .cst { width: 100%; font: 24px Roboto, arial, sans-serif; border: 0; border-bottom: 1px solid #dadce0; outline: none; padding: 4px 0 6px 0; }", F + " .chelp { display: block; width: 100%; margin: 10px 0 0 0; border: 0; border-bottom: 1px solid #dadce0; padding: 6px 0; font: 14px Roboto, arial, sans-serif; resize: none; overflow: hidden; outline: none; background: transparent; }", F + " .chelp:focus { border-bottom: 2px solid " + accent.main + "; }", F + " .ctype { display: flex; align-items: center; gap: 10px; width: 240px; height: 48px; padding: 0 4px 0 12px; border: 1px solid #dadce0; border-radius: " + (round ? "4px" : "0") + "; color: #202124; }", F + " .ctype span { flex: 1; } " + F + " .ctype .mi { color: #5f6368; }", F + " .copts { margin: 12px 0 0 0; } " + F + " .copt { display: flex; align-items: center; gap: 12px; min-height: 44px; color: #bdc1c6; }", F + " .copt input { flex: 1; border: 0; border-bottom: 1px solid transparent; padding: 6px 0; outline: none; color: #202124; background: transparent; }", F + " .copt input:hover { border-bottom-color: #dadce0; } " + F + " .copt input:focus { border-bottom: 2px solid " + accent.main + "; }", F + " .copt.add input { flex: 0 1 auto; width: 100px; color: #70757a; } " + F + " .copt .onum { color: #202124; width: 24px; text-align: right; }", F + " .cor { color: #202124; } " + F + " .caddother { color: " + blue + " !important; font-weight: 500; } " + F + " .cother { flex: 1; color: #70757a; border-bottom: 1px dotted #dadce0; padding: 6px 0; }", F + " .crm { width: 40px; height: 40px; color: #5f6368; }", F + " .cscale { display: flex; align-items: center; gap: 16px; margin: 16px 0; } " + F + " .cscale select { height: 36px; padding: 0 8px; border: 0; border-bottom: 1px solid #dadce0; background: transparent; }", F + " .clab { display: flex; align-items: center; gap: 16px; margin: 8px 0; } " + F + " .clab span { width: 20px; } " + F + " .clab input { width: 260px; border: 0; border-bottom: 1px solid #dadce0; padding: 6px 0; outline: none; }", F + " .cgrid { display: flex; gap: 24px; margin: 12px 0 0 0; } " + F + " .cgl { flex: 1; } " + F + " .cglh { font-weight: 500; margin: 0 0 4px 0; }", F + " .pvtext { display: inline-flex; align-items: center; gap: 12px; color: #70757a; border-bottom: 1px dotted #bdc1c6; padding: 8px 0; min-width: 50%; margin: 14px 0 0 0; } " + F + " .pvtext.long { min-width: 80%; }", F + " .pvo { display: flex; align-items: center; gap: 12px; margin: 10px 0; color: #202124; } " + F + " .pvl { margin: 8px 0; }", F + " .cqv { font-size: 16px; white-space: pre-wrap; } " + F + " .cstar { color: #d93025; } " + F + " .chv { font-size: 14px; color: #202124; margin: 6px 0 0 0; white-space: pre-wrap; }", F + " .cfoot { display: flex; align-items: center; border-top: 1px solid #dadce0; margin: 20px 0 -8px 0; padding: 8px 0 0 0; }", F + " .csep { width: 1px; height: 32px; background: #dadce0; margin: 0 12px 0 8px; }", F + " .creq { display: flex; align-items: center; gap: 12px; cursor: pointer; } " + F + " .creq input { display: none; }", F + " .csw { position: relative; width: 36px; height: 14px; border-radius: 7px; background: #bdc1c6; }", F + " .csw:after { content: ''; position: absolute; left: -2px; top: -3px; width: 20px; height: 20px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.4); transition: left .15s; }", F + " .creq input:checked + .csw { background: " + accent.light + "; filter: saturate(3) brightness(.9); } " + F + " .creq input:checked + .csw:after { left: 18px; background: " + accent.main + "; }", F + " .csec { margin: 24px 0 0 0; } " + F + " .csectag { display: inline-block; background: " + accent.main + "; color: #fff; font-size: 14px; padding: 8px 16px; border-radius: " + (round ? "8px 8px 0 0" : "0") + "; }", F + " .csec + .ccard { margin-top: 0; border-top: 10px solid " + accent.main + "; }", F + " .cfab { position: absolute; right: -64px; top: 12px; width: 50px; display: flex; flex-direction: column; background: #fff; border: 1px solid #dadce0; border-radius: " + sq + "; box-shadow: 0 1px 2px rgba(0,0,0,.2); transition: top .15s; }", F + " .cfab .ib { border-radius: " + (round ? "50%" : "0") + "; }", F + " .rpub a { color: " + blue + " !important; font-weight: 500; } " + F + " .rcard .rcount { font-size: 28px; } " + F + " .rbars .rb span { background: " + accent.main + "; }", F + " .scard .sh { font-size: 24px; margin: 0 0 12px 0; } " + F + " .ssec { border-top: 1px solid #dadce0; padding: 12px 0; } " + F + " .ssh { font-size: 18px; margin: 0 0 8px 0; }", F + " .srow { display: flex; align-items: center; gap: 10px; margin: 10px 0; } " + F + " .srow input { accent-color: " + accent.main + "; width: 18px; height: 18px; }", F + " .sconf textarea { width: 100%; border: 0; border-bottom: 1px solid #dadce0; padding: 6px 0; outline: none; } " + F + " .ssl { font-weight: 500; margin: 12px 0 4px 0; }", F + " .femenu { box-shadow: 0 2px 4px rgba(0,0,0,.2), 0 8px 16px rgba(0,0,0,.14); border-radius: " + (round ? "4px" : "0") + "; padding: 8px 0; }", F + " .femenu a { padding: 0 24px 0 16px; height: 48px; color: #202124; } " + F + " .femenu a:hover { background: #f1f3f4; } " + F + " .femenu a.chk { background: #e8f0fe; } " + F + " .femenu .mi { color: #5f6368; }", F + " .fedlgf { background: rgba(0,0,0,.4); } " + F + " .fedlg { border-radius: " + (round ? "8px" : "2px") + "; padding: 24px 24px 8px 24px; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); }", F + " .fedlgh { font: " + (round ? "400 22px \"Google Sans\"" : "500 20px") + " Roboto, arial, sans-serif; margin: 0 0 16px 0; }", F + " .fedlg input.w, " + F + " .fedlg textarea.w { border: 0; border-bottom: 1px solid #dadce0; padding: 8px 0; outline: none; } " + F + " .fedlg .dl { font-weight: 500; }", F + " .dtabs { display: flex; border-bottom: 1px solid #dadce0; margin: 0 0 12px 0; } " + F + " .dtabs a { padding: 10px 16px; font-weight: 500; color: #5f6368; border-bottom: 2px solid transparent; } " + F + " .dtabs a.on { color: " + accent.main + "; border-bottom-color: " + accent.main + "; }", F + " .fedlgf2 { justify-content: flex-end; margin: 16px -16px 0 0; } " + F + " .fedlgf2 button { height: 36px; padding: 0 12px; border: 0; background: none; color: " + accent.main + "; font: 500 14px Roboto, arial, sans-serif; text-transform: " + (round ? "none" : "uppercase") + "; cursor: pointer; border-radius: " + (round ? "4px" : "2px") + "; }", F + " .fedlgf2 button:hover { background: rgba(0,0,0,.06); }", F + " .fenote { top: auto; bottom: 24px; left: 24px; transform: none; background: #323232; color: #fff; padding: 14px 24px; border-radius: " + (round ? "4px" : "2px") + "; } " + F + " .fenote a { color: #8ab4f8; margin-left: 16px; }" ); if (kind === "fk") { css.push( F + " .csend { border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; height: 29px; padding: 0 20px; border-radius: 2px; font: bold 11px arial, sans-serif; }", F + " .ctabs a { font-weight: 400; }", // the dialogs of 2014-2016 were still Kennedy's: blue and grey buttons, // boxed fields, the page whitened behind F + " .fedlgf { background: rgba(255,255,255,.75); } " + F + " .fedlg { border-radius: 0; padding: 30px 42px; border: 1px solid #acacac; box-shadow: 0 4px 16px rgba(0,0,0,.2); }", F + " .fedlgh { font: 16px arial, sans-serif; color: #222; margin: 0 0 16px 0; }", F + " .fedlg input.w, " + F + " .fedlg textarea.w { border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 1px; padding: 5px 8px; font: 13px arial, sans-serif; } " + F + " .fedlg input.w:focus, " + F + " .fedlg textarea.w:focus { border-color: #4d90fe; box-shadow: inset 0 1px 2px rgba(0,0,0,.3); }", F + " .fedlgf2 { justify-content: flex-start; margin: 22px 0 0 0; gap: 8px; } " + F + " .fedlgf2 button { height: 29px; min-width: 72px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; " + "background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px arial, sans-serif; text-transform: none; cursor: default; }", F + " .fedlgf2 button:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); background: linear-gradient(#f8f8f8, #f1f1f1); color: #222; }", F + " .fedlgf2 button.pri { background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff; } " + F + " .fedlgf2 button.pri:hover { background: linear-gradient(#4d90fe, #357ae8); border-color: #2f5bb7; color: #fff; }", F + " .dtabs a.on { color: #222; border-bottom-color: #dd4b39; }" ); } else if (kind === "fm") { css.push( F + " .mbar { background: " + accent.main + "; color: #fff; flex: 0 0 auto; }", F + " .mtop { display: flex; align-items: center; height: 64px; padding: 0 8px; } " + F + " .mtop .ib, " + F + " .mtop .ctitle { color: #fff; } " + F + " .mtop .ctitle { font-size: 20px; font-weight: 500; }", F + " .mtop .ib:hover { background: rgba(255,255,255,.12); }", F + " .csend { background: #f1f1f1; color: " + accent.main + "; border-radius: 2px; min-width: 88px; padding: 0 16px; letter-spacing: .5px; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2); }", F + " .csend:hover { background: #e6e6e6; }", F + " .mband { position: absolute; left: -100vw; right: -100vw; top: 0; height: 48px; background: " + accent.main + "; }", F + " .cbody { padding-top: 0; } " + F + " .mtabs { position: relative; background: #fff; margin: 0; }", F + " .mtabs .ctabs { border-bottom: 1px solid #e0e0e0; height: 48px; } " + F + " .mtabs + .ccard { margin-top: 0; border-top-width: 1px; border-top-color: #dadce0; }", F + " .mtabs + .ccard.ctc { border-top: 1px solid #e0e0e0; margin-top: 0; }", F + " .ctabs a { font-size: 14px; letter-spacing: .25px; }" ); } else { css.push( F + " .csend { background: " + accent.main + "; color: #fff; border-radius: 4px; font-family: \"Google Sans\", Roboto, arial, sans-serif; letter-spacing: .25px; }", F + " .ctitle { font-family: \"Google Sans\", Roboto, arial, sans-serif; } " + F + " .ccard.ctc { border-top-left-radius: 8px; border-top-right-radius: 8px; }", F + " .ctabs a { font-family: \"Google Sans\", Roboto, arial, sans-serif; }" ); } } return css.join("\n"); } // ---- Gplex for Google Drive (5.5) ------------------------------------------------- // Gplex's own Drive: the Google Docs list before Drive (2007 to early 2012), then the // Drive of each period. It is drawn over Google's own Drive page, which keeps running // underneath: what is listed is read from Google's page, and everything done (opening, // starring, renaming, uploading, sharing...) is done by pressing Google's own controls. function ugfDvWanted() { if (window.location.host !== "drive.google.com" || !ugfNtTopFrame() || !ugfNtOn("UGF_DRIVE_ON")) { return false; } return ugfDvView().view !== ""; } // which Drive a layout gets // dl07 2004-2008: the Docs list with the blue bar // dl09 late 2008-2010: the Docs list of 2009 // dl10 2010-early 2011: collections, the Google bar of 2010 // dl11 late 2011-early 2012: the grey Docs list under the black bar // dv12 late 2012-2013: the first Drive (April 2012), red CREATE // dv14 2014-2016: the new Drive of June 2014, blue NEW // dv17 2017-2018: Drive in Material, white bar // dv19 2019 on: Google Material 2 function ugfDvEra() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "dv19"; } if (l === "2017" || l === "2018" || l === "2018M") { return "dv17"; } if (["2014", "2015", "2015L", "2016", "2016C", "2016L"].indexOf(l) > -1) { return "dv14"; } if (l === "2013" || l === "2013L") { return "dv12"; } if (l === "2012" || l === "2011") { return "dl11"; } if (l === "2010" || l === "2010N") { return "dl10"; } if (l === "2009" || l === "2009L") { return "dl09"; } return "dl07"; } function ugfDvAuthUser() { return ((window.location.pathname || "").match(/\/u\/(\d+)(\/|$)/) || ["", "0"])[1]; } function ugfDvBase() { return "https://drive.google.com/drive/u/" + ugfDvAuthUser(); } // where in Drive we are function ugfDvView() { const p = (window.location.pathname || "/").replace(/^\/drive\/u\/\d+/, "/drive"); if (p === "/" || /^\/drive\/?$/.test(p)) { return { view: "root" }; } let m = p.match(/^\/drive\/folders\/([\w-]+)\/?$/); if (m) { return { view: "folder", id: m[1] }; } m = p.match(/^\/drive\/(my-drive|home|shared-with-me|recent|starred|trash|search|computers|shared-drives|spam|quota)\/?$/); if (m) { return { view: m[1], q: m[1] === "search" ? (new URLSearchParams(window.location.search).get("q") || "") : "" }; } return { view: "" }; } // ---- a file's kind, from the type Google names it by ------------------------------- function ugfDvKindOf(type) { const t = String(type || "").trim(); const g = { "Google Docs": "document", "Google Sheets": "spreadsheet", "Google Slides": "presentation", "Google Forms": "form", "Google Drawings": "drawing", "Google Sites": "sites", "Google My Maps": "map", "Google Apps Script": "script", "Google Jamboard": "generic", "Google Vids": "video", "Folder": "folder", "Shared folder": "sharedfolder", "Shortcut": "generic", "PDF": "pdf", "Image": "image", "Video": "video", "Audio": "audio", "Text": "text", "Compressed archive": "archive", "Archive": "archive", "Microsoft Word": "word", "Microsoft Excel": "excel", "Microsoft PowerPoint": "powerpoint", "Word": "word", "Excel": "excel", "PowerPoint": "powerpoint", "Unknown file": "generic", "Binary file": "generic" }[t]; if (g) { return g; } if (/folder/i.test(t)) { return /shared/i.test(t) ? "sharedfolder" : "folder"; } if (/word/i.test(t)) { return "word"; } if (/excel/i.test(t)) { return "excel"; } if (/powerpoint/i.test(t)) { return "powerpoint"; } return "generic"; } // every type label Drive writes after a name, longest first (the name is what is left) function ugfDvTypeLabels() { return ["Google Apps Script", "Compressed archive", "Microsoft PowerPoint", "Microsoft Excel", "Microsoft Word", "Google Drawings", "Google My Maps", "Google Jamboard", "Google Slides", "Google Sheets", "Google Forms", "Google Sites", "Google Docs", "Google Vids", "Shared folder", "Unknown file", "Binary file", "PowerPoint", "Shortcut", "Archive", "Folder", "Image", "Video", "Audio", "Excel", "Word", "Text", "PDF"]; } function ugfDvIsFolder(it) { return it.kind === "folder" || it.kind === "sharedfolder"; } function ugfDvIcon(kind, era) { const A = ugfDocsArt(); const set = A.dv[era] || A.dv.mt; return set[kind] || (kind === "sharedfolder" ? set.folder : "") || set.generic || A.dv.mt.generic; } // where a file opens: the editors for Google's own kinds, the folder in Drive, and // Google's viewer for the rest function ugfDvOpenUrl(it) { const u = "/u/" + ugfDvAuthUser(); const map = { document: "document", spreadsheet: "spreadsheets", presentation: "presentation", form: "forms", drawing: "drawings" }; if (ugfDvIsFolder(it)) { return ugfDvBase() + "/folders/" + it.id; } if (map[it.kind]) { return "https://docs.google.com/" + map[it.kind] + u + "/d/" + it.id + "/edit"; } return "https://drive.google.com/file/d/" + it.id + "/view?authuser=" + ugfDvAuthUser(); } function ugfDvShareUrl(it) { const map = { document: "document", spreadsheet: "spreadsheets", presentation: "presentation", form: "forms", drawing: "drawings" }; if (ugfDvIsFolder(it)) { return "https://drive.google.com/drive/folders/" + it.id + "?usp=sharing"; } if (map[it.kind]) { return "https://docs.google.com/" + map[it.kind] + "/d/" + it.id + "/edit?usp=sharing"; } return "https://drive.google.com/file/d/" + it.id + "/view?usp=sharing"; } function ugfDvThumb(it, size) { return "https://drive.google.com/thumbnail?id=" + encodeURIComponent(it.id) + "&sz=" + (size || "w400") + "&authuser=" + ugfDvAuthUser(); } // ---- reading Google's list ----------------------------------------------------------- // Drive lists files as table rows (the list) or grid cells (the grid, and the // suggested folders); each carries the file's id. The columns are named in the table's // head, so each row's cells are read by the head's names. function ugfDvHarvest() { const out = []; const seen = {}; const clean = function(s) { return String(s || "").replace(/\s+/g, " ").trim(); }; const labels = ugfDvTypeLabels(); document.querySelectorAll("[role=row][data-id], [role=gridcell][data-id]").forEach(function(el) { if (el.closest("#ugf-drive") || !el.isConnected) { return; } const id = el.getAttribute("data-id"); if (!id || seen[id] || !/^[\w-]{10,}$/.test(id)) { return; } // the name and the type: the name's tooltip is " " let tip = ""; el.querySelectorAll("[data-tooltip]").forEach(function(t) { if (!tip && t.getAttribute("data-id") === id) { tip = clean(t.getAttribute("data-tooltip")); } }); const svgT = el.querySelector("[data-column-field='6'] svg title, svg title"); let type = svgT ? clean(svgT.textContent) : ""; let name = clean((el.querySelector("strong") || {}).textContent || ""); if (!type && tip) { labels.some(function(lb) { if (tip.length > lb.length && tip.slice(-lb.length - 1) === " " + lb) { type = lb; return true; } return false; }); } if (!name) { name = type && tip.slice(-type.length - 1) === " " + type ? tip.slice(0, -type.length - 1) : tip; } if (!name) { const al = clean(el.getAttribute("aria-label") || ""); name = al.replace(/ (Located in|More info).*$/, ""); } if (!name) { return; } // shared and starred, as the name's label says (" Shared Starred") let flags = ""; el.querySelectorAll("[aria-label]").forEach(function(a) { const v = clean(a.getAttribute("aria-label")); if (v.indexOf(name) === 0 && v.length > name.length && v.length < name.length + 60) { flags += " " + v.slice(name.length); } }); const starBtn = el.querySelector("button[aria-label^='Remove from starred'], button[aria-label^='Add to starred']"); const starred = starBtn ? /^Remove/.test(starBtn.getAttribute("aria-label")) : / Starred\b/.test(flags); const shared = / Shared\b/.test(flags) || /^Shared folder$/.test(type); const it = { id: id, el: el, name: name, type: type, kind: ugfDvKindOf(type || (/ folder\b/i.test(flags) ? "Folder" : "")), starred: starred, shared: shared, cols: {}, grid: el.getAttribute("role") === "gridcell" }; // the other columns, by the head's names const table = el.closest("table"); if (table) { const heads = {}; table.querySelectorAll("thead th[data-column-field]").forEach(function(th) { heads[th.getAttribute("data-column-field")] = clean(th.textContent); }); el.querySelectorAll("td[data-column-field]").forEach(function(td) { const h = heads[td.getAttribute("data-column-field")]; if (!h || td.getAttribute("data-column-field") === "6") { return; } const lab = td.querySelector("[data-tooltip]"); it.cols[h] = clean(lab ? lab.getAttribute("data-tooltip") : td.textContent); }); } else { const sub = el.querySelector(".uSZ2u, [class*='subtitle']"); if (sub) { it.cols.Location = clean(sub.textContent).replace(/^in /, ""); } } const c = it.cols; it.owner = c.Owner || c["Shared by"] || ""; it.modified = c["Last modified"] || c["Date modified"] || c["Last opened by me"] || c["Opened by me"] || c["Date shared"] || c["Trashed date"] || c["Date trashed"] || (c["Reason suggested"] || "").replace(/^You (edited|modified|opened|created|uploaded)\s*•\s*/, ""); it.size = c["File size"] || c.Size || ""; it.location = c.Location || c["Original location"] || ""; seen[id] = true; out.push(it); }); return out; } // how much of the storage is used, as Google's page says it function ugfDvQuota() { const a = document.querySelector("a[data-target=quota][aria-label], [aria-label^='Storage Summary']"); const m = a ? String(a.getAttribute("aria-label") || "").match(/:\s*(.+?) of (.+?) used/) : null; return m ? { used: m[1], total: m[2] } : null; } // the name of the folder being shown (the page's title is " - Google Drive") function ugfDvTitle() { return String(document.title || "").replace(/\s*-\s*Google Drive\s*$/, "").trim(); } // ---- pressing Google's controls ----------------------------------------------------- function ugfDvFire(el, types, extra) { const r = el.getBoundingClientRect(); const at = Object.assign({ bubbles: true, cancelable: true, button: 0, buttons: 1, clientX: r.left + Math.min(20, r.width / 2), clientY: r.top + Math.min(12, r.height / 2) }, extra || {}); types.forEach(function(t) { if (/up|click/.test(t)) { at.buttons = 0; } try { el.dispatchEvent(/^pointer/.test(t) && typeof PointerEvent === "function" ? new PointerEvent(t, Object.assign({ pointerType: "mouse", isPrimary: true }, at)) : new MouseEvent(t, at)); } catch (e) { try { el.dispatchEvent(new MouseEvent(t.replace("pointer", "mouse"), { bubbles: true, cancelable: true })); } catch (e2) {} } }); } function ugfDvPress(el) { if (!el) { return false; } try { el.focus({ preventScroll: true }); } catch (e) {} ugfDvFire(el, ["pointerover", "mouseover", "pointerdown", "mousedown", "pointerup", "mouseup", "click"]); return true; } function ugfDvKey(el, key) { const codes = { Enter: 13, Escape: 27, Delete: 46, ArrowDown: 40 }; ["keydown", "keyup"].forEach(function(t) { try { (el || document.activeElement || document.body).dispatchEvent(new KeyboardEvent(t, { bubbles: true, cancelable: true, key: key, code: key, keyCode: codes[key] || 0, which: codes[key] || 0 })); } catch (e) {} }); } function ugfDvShown(el) { if (!el || !el.isConnected || el.closest("#ugf-drive, #ugf-photos")) { return false; } if (!el.getClientRects().length) { return false; } const cs = getComputedStyle(el); return cs.visibility !== "hidden" && cs.display !== "none" && el.getAttribute("aria-hidden") !== "true"; } // wait for something to appear on Google's page (or give up) function ugfDvWait(fn, ms) { return new Promise(function(resolve) { const end = Date.now() + (ms || 4000); const step = function() { let v = null; try { v = fn(); } catch (e) {} if (v) { resolve(v); } else if (Date.now() > end) { resolve(null); } else { setTimeout(step, 60); } }; step(); }); } function ugfDvSleep(ms) { return new Promise(function(r) { setTimeout(r, ms); }); } // Google's row (or grid cell) for a file function ugfDvRow(id) { let found = null; document.querySelectorAll("[role=row][data-id], [role=gridcell][data-id]").forEach(function(el) { if (!found && el.getAttribute("data-id") === id && !el.closest("#ugf-drive, #ugf-photos")) { found = el; } }); return found; } function ugfDvText(el) { return String((el && (el.getAttribute("aria-label") || el.textContent)) || "").replace(/\s+/g, " ").trim(); } // a menu item on show, by the words it starts with function ugfDvMenuItem(re) { let hit = null; document.querySelectorAll("[role=menuitem], [role=menuitemcheckbox], [role=menuitemradio], [role=option]").forEach(function(el) { if (hit || !ugfDvShown(el) || el.getAttribute("aria-disabled") === "true") { return; } const t = String(el.textContent || "").replace(/\s+/g, " ").trim(); const a = String(el.getAttribute("aria-label") || "").trim(); if (re.test(t) || re.test(a)) { hit = el; } }); return hit; } function ugfDvDialog() { let hit = null; document.querySelectorAll("[role=dialog], [role=alertdialog]").forEach(function(el) { if (!hit && ugfDvShown(el) && el.querySelector("button, input, [role=button]")) { hit = el; } }); return hit; } // a button of any of Google's dialogs on show (a page can have several open at once, // some of them side panels), by its words function ugfDvDialogButton(re) { let hit = null; document.querySelectorAll("[role=dialog], [role=alertdialog]").forEach(function(d) { if (!hit && ugfDvShown(d)) { hit = ugfDvButton(d, re); } }); return hit; } // what Google's dialogs on show offer (for the console, when a step fails) function ugfDvDialogWords() { const out = []; document.querySelectorAll("[role=dialog], [role=alertdialog]").forEach(function(d) { if (ugfDvShown(d)) { const bs = []; d.querySelectorAll("button, [role=button]").forEach(function(b) { if (ugfDvShown(b)) { bs.push(ugfDvText(b).slice(0, 30)); } }); out.push("[" + bs.join(" | ") + "]"); } }); return out.join(" "); } function ugfDvButton(root, re) { let hit = null; (root || document).querySelectorAll("button, [role=button]").forEach(function(b) { if (!hit && ugfDvShown(b) && b.getAttribute("aria-disabled") !== "true" && !b.disabled && re.test(ugfDvText(b))) { hit = b; } }); return hit; } function ugfDvCloseMenus() { ugfDvKey(document.activeElement, "Escape"); } // put words into one of Google's fields the way typing does function ugfDvType(input, value) { try { input.focus({ preventScroll: true }); input.select && input.select(); } catch (e) {} let ok = false; try { ok = document.execCommand("selectAll", false) && document.execCommand("insertText", false, value); } catch (e) {} if (!ok || input.value !== value) { const d = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), "value"); if (d && d.set) { d.set.call(input, value); } else { input.value = value; } input.dispatchEvent(new Event("input", { bubbles: true })); } input.dispatchEvent(new Event("change", { bubbles: true })); } // ---- doing things in Drive: one at a time, each by pressing Google's own controls ---- function ugfDvActions(onBusy) { const queue = []; let busy = false; const pump = async function() { if (busy) { return; } busy = true; onBusy(true); while (queue.length) { const job = queue.shift(); let r = false; try { r = await job[0](); } catch (e) { console.log("[Gplex] Drive: " + e); r = false; } job[1](r); } busy = false; onBusy(false); }; const run = function(fn) { return new Promise(function(resolve) { queue.push([fn, resolve]); pump(); }); }; const rowButton = function(id, re) { const row = ugfDvRow(id); if (!row) { return null; } ugfDvFire(row, ["pointerover", "mouseover", "mouseenter"]); let hit = null; row.querySelectorAll("button[aria-label], [role=button][aria-label]").forEach(function(b) { if (!hit && re.test(b.getAttribute("aria-label")) && b.getAttribute("aria-disabled") !== "true") { hit = b; } }); return hit; }; // select the file in Google's list (a plain click on its row) const select = function(id) { const row = ugfDvRow(id); if (!row) { return false; } const cell = row.querySelector("[data-column-field='28'], [data-column-field='8']") || row; ugfDvFire(cell, ["pointerdown", "mousedown", "pointerup", "mouseup", "click"]); return true; }; // the row's menu: its three dots, or a right click on it const openMore = async function(id) { ugfDvCloseMenus(); await ugfDvSleep(60); const row = ugfDvRow(id); if (!row) { return false; } const b = rowButton(id, /^More actions/); if (b) { ugfDvPress(b); } let up = await ugfDvWait(function() { return ugfDvMenuItem(/\S/); }, 1500); if (!up) { select(id); ugfDvFire(row.querySelector("strong") || row, ["contextmenu"], { button: 2, buttons: 2 }); up = await ugfDvWait(function() { return ugfDvMenuItem(/\S/); }, 1500); } return !!up; }; // through a menu and its submenus: each step is the words its item starts with const menuPath = async function(steps) { for (let i = 0; i < steps.length; i++) { const it = await ugfDvWait(function() { return ugfDvMenuItem(steps[i]); }, 2500); if (!it) { // (what the menu did offer, so a changed wording can be seen in the console) const offered = []; document.querySelectorAll("[role=menuitem], [role=menuitemcheckbox], [role=menuitemradio]").forEach(function(el) { if (ugfDvShown(el)) { offered.push(String(el.textContent || "").replace(/\s+/g, " ").trim().slice(0, 40)); } }); console.log("[Gplex] Drive: no menu item matching " + steps[i] + (offered.length ? " (the menu has: " + offered.join(" | ") + ")" : " (no menu open)")); ugfDvCloseMenus(); return false; } if (i < steps.length - 1) { ugfDvFire(it, ["pointerover", "mouseover", "mouseenter", "pointermove", "mousemove"]); await ugfDvSleep(200); if (!ugfDvMenuItem(steps[i + 1])) { ugfDvPress(it); await ugfDvSleep(150); } if (!ugfDvMenuItem(steps[i + 1])) { ugfDvKey(it, "ArrowRight"); } } else { ugfDvPress(it); } } return true; }; const viaMenu = async function(id, steps) { return (await openMore(id)) && (await menuPath(steps)); }; // Google's dialog with a text field: fill it and press its button const fillDialog = async function(value, okRe) { const dlg = await ugfDvWait(function() { const d = ugfDvDialog(); return d && d.querySelector("input[type=text], input:not([type])") ? d : null; }, 4000); if (!dlg) { console.log("[Gplex] Drive: Google's dialog with a name field did not appear"); return false; } const input = dlg.querySelector("input[type=text], input:not([type])"); ugfDvType(input, value); await ugfDvSleep(120); const ok = ugfDvButton(dlg, okRe); if (ok) { ugfDvPress(ok); } else { ugfDvKey(input, "Enter"); } await ugfDvWait(function() { return !dlg.isConnected || !ugfDvShown(dlg); }, 4000); return true; }; // a confirmation Google may ask for (moving a shared file, deleting forever) const confirm = async function(re, ms) { const b = await ugfDvWait(function() { return ugfDvDialogButton(re); }, ms || 900); if (b) { ugfDvPress(b); } return !!b; }; const newMenu = async function(re) { ugfDvCloseMenus(); const btn = document.querySelector("[guidedhelpid=new_menu_button]") || ugfDvButton(document, /^New$/); if (!btn) { return false; } ugfDvPress(btn); // (and by the keyboard, if the mouse did not open it) if (!(await ugfDvWait(function() { return ugfDvMenuItem(/\S/); }, 1500))) { try { btn.focus(); } catch (e) {} ugfDvKey(btn, "Enter"); if (!(await ugfDvWait(function() { return ugfDvMenuItem(/\S/); }, 1200))) { ["keydown", "keyup"].forEach(function(t) { try { btn.dispatchEvent(new KeyboardEvent(t, { bubbles: true, cancelable: true, key: " ", code: "Space", keyCode: 32, which: 32 })); } catch (e) {} }); } } return menuPath([re]); }; // the parts of Google's page a file can be dropped on const dropTarget = function() { return document.querySelector("[role=main][guidedhelpid=main_container]") || document.querySelector("[role=main]"); }; const drag = function(src, dst) { let dt; try { dt = new DataTransfer(); } catch (e) { return false; } const ev = function(el, t) { const r = el.getBoundingClientRect(); try { el.dispatchEvent(new DragEvent(t, { bubbles: true, cancelable: true, dataTransfer: dt, clientX: r.left + 30, clientY: r.top + r.height / 2 })); } catch (e) {} }; if (src) { ev(src, "dragstart"); ev(src, "drag"); } ev(dst, "dragenter"); ev(dst, "dragover"); ev(dst, "drop"); if (src) { ev(src, "dragend"); } return dt; }; return { run: run, busy: function() { return busy; }, star: function(id) { return run(async function() { const b = rowButton(id, /^(Add to|Remove from) starred/); if (b) { return ugfDvPress(b); } return viaMenu(id, [/^Organi[sz]e/, /^(Add to|Remove from) [Ss]tarred/]); }); }, rename: function(id, name) { return run(async function() { const b = rowButton(id, /^Rename/); if (b) { ugfDvPress(b); } else if (!(await viaMenu(id, [/^Rename/]))) { return false; } return fillDialog(name, /^OK$/i); }); }, trash: function(id) { return run(async function() { const b = rowButton(id, /^(Move to (trash|bin)|Remove)\b/); if (b) { ugfDvPress(b); } else if (!(await viaMenu(id, [/^(Move to (trash|bin)|Remove)\b/]))) { return false; } await confirm(/^(Move to (trash|bin)|Remove|OK)$/i); return true; }); }, restore: function(id) { return run(function() { const b = rowButton(id, /^Restore/); return b ? ugfDvPress(b) : viaMenu(id, [/^Restore/]); }); }, purge: function(id) { return run(async function() { const b = rowButton(id, /^Delete forever/); if (b) { ugfDvPress(b); } else if (!(await viaMenu(id, [/^Delete forever/]))) { return false; } await confirm(/^Delete forever$/i, 3000); return true; }); }, download: function(id) { return run(async function() { const b = rowButton(id, /^Download/); if (b) { return ugfDvPress(b); } return viaMenu(id, [/^Download/]); }); }, copy: function(id) { return run(function() { return viaMenu(id, [/^Make a copy/]); }); }, // Google's share dialog, opened (for driving, or to be shown) share: function(id) { return run(async function() { const b = rowButton(id, /^Share/); if (b) { ugfDvPress(b); } else if (!(await viaMenu(id, [/^Share/, /^Share/]))) { return null; } return ugfDvWait(ugfDvShareDialog, 8000); }); }, moveDialog: function(id) { return run(async function() { if (!(await viaMenu(id, [/^Organi[sz]e/, /^Move/]))) { return null; } return ugfDvWait(ugfDvDialog, 4000); }); }, // moving: dragging the row onto a folder of the list, or onto My Drive move: function(id, target) { return run(async function() { const src = ugfDvRow(id); let dst = null; if (target === "root") { dst = ugfDvTreeItem(/^My Drive$/); } else { dst = ugfDvRow(target); } if (!src || !dst) { return false; } drag(src, dst); await confirm(/^Move$/i, 1500); return !!(await ugfDvWait(function() { return !ugfDvRow(id); }, 3000)); }); }, newFolder: function(name) { return run(async function() { if (!(await newMenu(/^(New )?folder(?!\s*upload)/i))) { return false; } return fillDialog(name, /^Create$/i); }); }, folderUpload: function() { return run(function() { return newMenu(/^Folder upload/); }); }, // Google's own File upload / Folder upload, pressed straight away (not queued): // the browser opens a file picker only for a click the person has just made googleUpload: function(folder) { const re = folder ? /^Folder upload/i : /^File upload/i; const btn = document.querySelector("[guidedhelpid=new_menu_button]") || ugfDvButton(document, /^New$/); if (!btn) { console.log("[Gplex] Drive: Google's New button was not found"); return Promise.resolve(false); } ugfDvPress(btn); const now = ugfDvMenuItem(re); if (now) { ugfDvPress(now); return Promise.resolve(true); } return ugfDvWait(function() { return ugfDvMenuItem(re); }, 2500).then(function(it) { if (!it) { return menuPath([re]); } ugfDvPress(it); return true; }); }, // files chosen or dropped on Gplex's page go to Google's page the way a drop does upload: function(files) { return run(async function() { const t = dropTarget(); if (!t || !files.length) { return false; } let dt; try { dt = new DataTransfer(); [].forEach.call(files, function(f) { dt.items.add(f); }); } catch (e) { return false; } const r = t.getBoundingClientRect(); // (the page is told a drag came in, then it is dropped once on the list) [["dragenter", t], ["dragover", t], ["drop", t]].forEach(function(e2) { try { e2[1].dispatchEvent(new DragEvent(e2[0], { bubbles: true, cancelable: true, dataTransfer: dt, clientX: r.left + r.width / 2, clientY: r.top + r.height / 2 })); } catch (e) {} }); return true; }); }, // the Undo of Google's own message (after moving to the trash, renaming...) undo: function() { return run(async function() { let b = null; document.querySelectorAll("[role=alert] button, [role=status] button, [aria-live] button, [role=alert] [role=button], [aria-live] [role=button]").forEach(function(x) { if (!b && ugfDvShown(x) && /^Undo$/i.test(ugfDvText(x))) { b = x; } }); b = b || ugfDvButton(document, /^Undo$/i); return b ? ugfDvPress(b) : false; }); }, select: select }; } // one of Google's places on the left (My Drive, Starred...), by its words function ugfDvTreeItem(re) { let hit = null; document.querySelectorAll("[role=treeitem]").forEach(function(ti) { if (hit || ti.closest("#ugf-drive")) { return; } const ids = String(ti.getAttribute("aria-labelledby") || "").split(/\s+/); const lab = ids[0] ? document.getElementById(ids[0]) : null; const inner = ti.querySelector("[aria-label]"); const words = [lab ? lab.textContent : "", inner ? inner.getAttribute("aria-label") : "", ti.getAttribute("aria-label") || "", (ti.textContent || "").slice(0, 60)]; if (words.some(function(w) { return re.test(String(w || "").replace(/\s+/g, " ").trim()); })) { hit = lab || ti; } }); return hit; } // Google's share dialog (on the page, or in a frame of Drive's own) function ugfDvShareDialog() { const looks = function(root) { let hit = null; root.querySelectorAll("[role=dialog]").forEach(function(d) { if (!hit && (d.getClientRects().length) && /^Share\b|Sharing settings|Share with/i.test(String(d.getAttribute("aria-label") || d.textContent || "").trim().slice(0, 80))) { hit = d; } }); return hit; }; let d = looks(document); if (d) { return { dialog: d, doc: document, frame: null }; } let found = null; document.querySelectorAll("iframe").forEach(function(f) { if (found || !f.getClientRects().length) { return; } try { const doc = f.contentDocument; if (doc && /shar/i.test(f.src + " " + (f.className || "") + " " + (f.name || ""))) { const dd = looks(doc) || doc.querySelector("[role=dialog]"); if (dd) { found = { dialog: dd, doc: doc, frame: f }; } } } catch (e) {} }); return found; } // Show one of Google's dialogs above Gplex's page: the fallback when Gplex cannot do // what was asked through its own dialog function ugfDvReveal(el, onGone) { if (!el) { return; } let top = el; while (top.parentElement && top.parentElement !== document.body) { top = top.parentElement; } const whole = top.querySelector && top.querySelector("[role=main]"); const html = document.documentElement; if (whole || top === el.ownerDocument.documentElement) { html.setAttribute("gplex-dv-reveal", ""); } else { top.setAttribute("ugf-dv-up", ""); if (getComputedStyle(top).position === "static") { top.style.setProperty("position", "relative", "important"); top.setAttribute("ugf-dv-pos", ""); } } const watch = setInterval(function() { if (!el.isConnected || !el.getClientRects().length || getComputedStyle(el).visibility === "hidden") { clearInterval(watch); html.removeAttribute("gplex-dv-reveal"); top.removeAttribute("ugf-dv-up"); if (top.hasAttribute("ugf-dv-pos")) { top.style.removeProperty("position"); top.removeAttribute("ugf-dv-pos"); } if (onGone) { onGone(); } } }, 300); } // Inviting people through Google's share dialog: the addresses into its field, the // role, the note, and Send. Anything not found leaves the dialog shown as it is. async function ugfDvShareInvite(sd, emails, role, notify, note) { const doc = sd.doc; const d = sd.dialog; const shown = function(el) { return el && el.getClientRects().length > 0; }; const field = await ugfDvWait(function() { let hit = null; d.querySelectorAll("input, [contenteditable=true]").forEach(function(i) { const w = (i.getAttribute("aria-label") || "") + " " + (i.getAttribute("placeholder") || ""); if (!hit && shown(i) && /add people|people|email|groups/i.test(w)) { hit = i; } }); return hit; }, 4000); if (!field) { return false; } for (let i = 0; i < emails.length; i++) { try { field.focus(); } catch (e) {} let ok = false; try { ok = doc.execCommand("insertText", false, emails[i]); } catch (e) {} if (!ok) { const dsc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(field), "value"); if (dsc && dsc.set) { dsc.set.call(field, emails[i]); } field.dispatchEvent(new Event("input", { bubbles: true })); } await ugfDvSleep(500); ugfDvKey(field, "Enter"); await ugfDvSleep(400); } await ugfDvSleep(600); // the role: "Editor", "Commenter" or "Viewer" on the dialog's role button const want = { edit: /^Editor$/i, comment: /^Commenter$/i, view: /^Viewer$/i }[role]; if (want && role !== "edit") { let rb = null; d.querySelectorAll("button, [role=button], [role=listbox], [aria-haspopup]").forEach(function(b) { if (!rb && shown(b) && /^(Editor|Viewer|Commenter)\b/i.test(String(b.textContent || "").trim())) { rb = b; } }); if (rb) { ugfDvPress(rb); const opt = await ugfDvWait(function() { let o = null; doc.querySelectorAll("[role=menuitem], [role=option], [role=menuitemradio]").forEach(function(x) { if (!o && shown(x) && want.test(String(x.textContent || "").replace(/\s+/g, " ").trim().split(" ")[0])) { o = x; } }); return o; }, 2000); if (opt) { ugfDvPress(opt); } } } const box = d.querySelector("input[type=checkbox][aria-label*='Notify'], [role=checkbox][aria-label*='Notify']"); if (box) { const on = box.getAttribute("aria-checked") === "true" || box.checked; if (on !== !!notify) { ugfDvPress(box); } } if (note && notify) { const ta = d.querySelector("textarea"); if (ta && shown(ta)) { ugfDvType(ta, note); } } await ugfDvSleep(300); let send = null; d.querySelectorAll("button, [role=button]").forEach(function(b) { if (!send && shown(b) && /^(Send|Share)$/i.test(String(b.textContent || "").trim())) { send = b; } }); if (!send) { return false; } ugfDvPress(send); return true; } // ---- Drive: starting, and the page ----------------------------------------------------- function ugfDvStart() { if (window.location.host !== "drive.google.com" || !ugfNtTopFrame() || !ugfNtOn("UGF_DRIVE_ON")) { return; } // a file's own page: the viewer of the period if (ugfDvFileId()) { ugfDvViewer(ugfDvEra()); return; } if (!ugfDvWanted()) { const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } } if (ugfDvWanted()) { ugfDriveMain(); return; } // Drive changes its address without reloading: start when it reaches one of its lists const t = setInterval(function() { if (ugfDvWanted()) { clearInterval(t); ugfDriveMain(); } }, 500); } function ugfDriveMain() { const era = ugfDvEra(); const A = ugfDocsArt(); const l = String(layout || ""); const fav = { dl07: A.fav2007, dl09: A.fav2008, dl10: A.fav2010, dl11: A.fav2011, dv12: A.dvFav2012, dv14: A.dvFav2014, dv17: A.dvFav2017, dv19: l === "2022" ? A.dvFav2020 : A.dvFav2017 }[era]; console.log("[Gplex] Drive: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); ugfDriveHome(era); } function ugfDriveHome(era) { const A = ugfDocsArt(); const esc = ugfDocsEsc; const ic = ugfFeIcon; const l = String(layout || ""); const who = ugfCalWho(); const signedIn = !!(who.email || who.name); const docsList = era === "dl07" || era === "dl09" || era === "dl10" || era === "dl11"; const kennedy = era === "dl11" || era === "dv12"; const material = era === "dv14" || era === "dv17" || era === "dv19"; const gm = era === "dv19"; const html = document.documentElement; html.setAttribute("gplex-dv", era); const style = document.createElement("style"); style.id = "ugf-drive-styles"; style.textContent = ugfDriveCss(era, A).join("\n"); (document.head || document.documentElement).appendChild(style); const shell = document.createElement("div"); shell.id = "ugf-drive"; shell.setAttribute("era", era); shell.setAttribute("tabindex", "-1"); document.body.appendChild(shell); // Google's page stays usable underneath (its menus and dialogs are pressed from here) const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } const act = ugfDvActions(function(b) { shell.classList.toggle("busy", b); }); const state = { items: [], sel: {}, anchor: "", sort: "", dir: 1, grid: false, loaded: false, view: ugfDvView(), moreNav: false, lastKey: "", gTitle: document.title }; try { state.grid = localStorage.getItem("UGF_DV_GRID") === "1"; } catch (e) {} const W = docsList ? { item: "item", items: "items", folder: era === "dl10" || era === "dl11" ? "collection" : "folder", Folder: era === "dl10" || era === "dl11" ? "Collection" : "Folder" } : { item: "item", items: "items", folder: "folder", Folder: "Folder" }; // ---- remembered folders (the top of My Drive), for the folder lists on the left const cacheKey = "UGF_DV_FOLDERS_" + ugfDvAuthUser(); const cached = function() { try { return JSON.parse(localStorage.getItem(cacheKey) || "[]"); } catch (e) { return []; } }; const remember = function() { if (state.view.view !== "my-drive" || !state.loaded) { return; } const f = state.items.filter(ugfDvIsFolder).slice(0, 40).map(function(it) { return { id: it.id, name: it.name }; }); try { localStorage.setItem(cacheKey, JSON.stringify(f)); } catch (e) {} }; // the way down into folders, for the path above the list const trailKey = "UGF_DV_TRAIL"; const trail = function() { try { return JSON.parse(sessionStorage.getItem(trailKey) || "[]"); } catch (e) { return []; } }; const setTrail = function(t) { try { sessionStorage.setItem(trailKey, JSON.stringify(t)); } catch (e) {} }; // ---- the places on the left, per period const places = function() { if (era === "dl07" || era === "dl09") { return [["All items", "my-drive"], ["Opened by me", "recent"], ["Starred", "starred"], ["Shared with me", "shared-with-me"], ["Trash", "trash"]]; } if (era === "dl10") { return [["Home", "home"], ["Starred", "starred"], ["All items", "my-drive"], ["Shared with me", "shared-with-me"], ["Trash", "trash"]]; } if (era === "dl11") { return [["Home", "home"], ["Starred", "starred"], ["Owned by me", "my-drive"], ["Shared with me", "shared-with-me"], ["Trash", "trash"]]; } if (era === "dv12") { return [["My Drive", "my-drive"], ["Shared with me", "shared-with-me"], ["Starred", "starred"], ["Recent", "recent"], ["Trash", "trash", true]]; } if (era === "dv14") { return [["My Drive", "my-drive", "folder"], ["Shared with me", "shared-with-me", "people"], ["Recent", "recent", "access_time"], ["Starred", "starred", "star"], ["Trash", "trash", "delete"]]; } return [["My Drive", "my-drive", "folder"], ["Computers", "computers", "computer"], ["Shared with me", "shared-with-me", "people"], ["Recent", "recent", "access_time"], ["Starred", "starred", "star"], ["Trash", "trash", "delete"]]; }; const placeName = function(v) { let n = ""; places().forEach(function(p) { if (p[1] === v) { n = p[0]; } }); return n || { "my-drive": "My Drive", home: "Home", search: "Search results", computers: "Computers", spam: "Spam" }[v] || "My Drive"; }; const here = function() { const v = state.view.view; if (v === "folder" || v === "root") { const t = trail(); return t.length && t[0].from ? t[0].from : "my-drive"; } return v; }; // ---- going places: Google's own links on its left, so the page does not reload const go = function(v) { const re = { "my-drive": /^My Drive$/, home: /^Home$/, "shared-with-me": /^(Items )?[Ss]hared with me$/, recent: /^Recent( items)?$/, starred: /^Starred( items)?$/, trash: /^(Trash|Trashed items|Bin|Items in bin)$/, computers: /^Computers$/, spam: /^Spam/ }[v]; setTrail([]); state.sel = {}; const ti = re ? ugfDvTreeItem(re) : null; const url = ugfDvBase() + "/" + v; if (ti) { ugfDvPress(ti); setTimeout(function() { if (ugfDvView().view !== v) { window.location.href = url; } }, 2500); } else { window.location.href = url; } }; const openFolder = function(it, from) { const t = trail().filter(function(x) { return x.id !== it.id; }); const cur = state.view.view === "folder" ? state.view.id : ""; let nt = []; if (cur) { const at = t.map(function(x) { return x.id; }).indexOf(cur); nt = at > -1 ? t.slice(0, at + 1) : [{ id: cur, name: currentTitle() }]; } nt.push({ id: it.id, name: it.name }); nt[0].from = nt[0].from || from || (state.view.view === "folder" ? here() : state.view.view === "root" ? "my-drive" : state.view.view); setTrail(nt); state.sel = {}; const row = ugfDvRow(it.id); const url = ugfDvBase() + "/folders/" + it.id; if (row) { const nm = row.querySelector("strong, .MxB3Nd") || row; ugfDvFire(nm, ["mousedown", "mouseup", "click"], { detail: 1 }); ugfDvFire(nm, ["mousedown", "mouseup", "click"], { detail: 2 }); ugfDvFire(nm, ["dblclick"], { detail: 2 }); setTimeout(function() { const v = ugfDvView(); if (!(v.view === "folder" && v.id === it.id)) { window.location.href = url; } }, 1800); } else { window.location.href = url; } }; const openItem = function(it) { if (!it) { return; } if (ugfDvIsFolder(it)) { openFolder(it); return; } if (it.kind === "image") { preview(it); return; } window.open(ugfDvOpenUrl(it), "_blank"); }; const newDoc = function(kind) { const path = { document: "document", spreadsheet: "spreadsheets", presentation: "presentation", form: "forms", drawing: "drawings" }[kind]; const f = state.view.view === "folder" ? "&folder=" + encodeURIComponent(state.view.id) : ""; window.open("https://docs.google.com/" + path + "/u/" + ugfDvAuthUser() + "/create?usp=drive_web" + f, "_blank"); }; // ---- what is listed const visible = function() { let list = state.items.slice(); if (state.sort === "name") { list.sort(function(a, b) { const fa = ugfDvIsFolder(a) ? 0 : 1; const fb = ugfDvIsFolder(b) ? 0 : 1; return fa - fb || a.name.localeCompare(b.name, undefined, { numeric: true }) * state.dir; }); } return list; }; const selected = function() { return visible().filter(function(it) { return state.sel[it.id]; }); }; const byId = function(id) { let f = null; state.items.forEach(function(it) { if (it.id === id) { f = it; } }); return f; }; const inTrash = function() { return state.view.view === "trash"; }; const dateOf = function(it) { return String(it.modified || "").replace(/^(me|You)\s*[•·]?\s*/, ""); }; const ownerOf = function(it) { return it.owner || (state.view.view === "shared-with-me" || it.grid ? "" : "me"); }; // ---- the bars at the top const searchForm = function(cls, ph, btn) { return '
' + (btn || "") + "
"; }; const topLinks = function() { const apps = era === "dl07" ? [["Mail", "https://mail.google.com/"], ["Calendar", "https://calendar.google.com/"], ["Documents", ""], ["Photos", "https://photos.google.com/"], ["Groups", "https://groups.google.com/"], ["Web", "https://www.google.com/"]] : [["Gmail", "https://mail.google.com/"], ["Calendar", "https://calendar.google.com/"], ["Documents", ""], ["Reader", "https://www.google.com/reader/"], ["Web", "https://www.google.com/"]]; return '"; }; const quota = function() { const qd = ugfDvQuota(); if (!qd) { return ""; } if (material) { return '
' + esc(qd.used) + " of " + esc(qd.total) + ' used
' + (gm ? "Buy storage" : "UPGRADE STORAGE") + "
"; } return '
' + (kennedy ? esc(qd.used) + " (" + "of " + esc(qd.total) + ") used" : "You're using " + esc(qd.used) + " of " + esc(qd.total) + ".") + (kennedy ? '
Get more storage' : "") + "
"; }; const quotaFill = function() { const qd = ugfDvQuota(); const bar = shell.querySelector(".qbar i"); if (!qd || !bar) { return; } const n = function(s) { const m = String(s).match(/([\d.,]+)\s*(bytes|KB|MB|GB|TB)/i); if (!m) { return 0; } return parseFloat(m[1].replace(/,/g, "")) * Math.pow(1024, ["bytes", "kb", "mb", "gb", "tb"].indexOf(m[2].toLowerCase())); }; const p = n(qd.total) ? Math.min(100, Math.max(1, 100 * n(qd.used) / n(qd.total))) : 0; bar.style.width = p + "%"; }; const frame = function() { let h = ""; const nav = ''; if (era === "dl07") { h = topLinks() + '
' + searchForm("srch", "", '') + "
" + '
New ▾Upload
' + '
' + nav + '
'; } else if (era === "dl09") { h = topLinks() + '
' + searchForm("srch", "", ' Show search options') + "
" + '
New ▾Upload...
' + nav + "
" + '
'; } else if (era === "dl10") { h = ugfNtGbar("classic", "Documents", "2010") + '
' + searchForm("srch", "", ' Browse template gallery') + "
" + '
Create new ▾Upload...
' + nav + "
" + '
'; } else if (kennedy) { const drive = era === "dv12"; h = ugfNtGbar("dark", drive ? "Drive" : "Documents", "2011") + '
' + searchForm("ksrch", drive ? "" : "", '") + ugfNtHeadCorner() + "
" + '
' + (drive ? "Drive" : "Docs") + '
' + 'Sort ▾' + (drive ? '' + ic(state.grid ? "view_list" : "view_module", 18) + "" + '' + ic("settings", 18) + "" : "") + "
" + '
CREATE' + ic("file_download", 18) + "
" + nav + quota() + '
'; } else if (era === "dv14") { const newLogo = ["2016", "2016C", "2016L"].indexOf(l) > -1; h = '
" + searchForm("gsrch", "Search Drive", '") + ugfNtHeadCorner() + "
" + '
Drive
' + '' + ic(state.grid ? "view_list" : "view_module", 24) + "" + '' + ic("sort_by_alpha", 24) + '' + ic("info_o", 24) + "" + '' + ic("settings", 24) + "
" + '
NEW
' + nav + quota() + '
'; } else { const q4 = l === "2022"; h = '
Drive' + searchForm("msrch", "Search Drive", '") + '' + ic("help_outline", 24) + '' + ic("settings", 24) + "" + '' + ugfNtCorner() + "
" + '
' + (gm ? ic("add", 24) + "New" : "NEW") + "
" + nav + quota() + "
" + '
' + '' + ic(state.grid ? "view_list" : "view_module", 24) + "" + '' + ic("info_o", 24) + "
" + '
'; } shell.innerHTML = trusted_policy.createHTML(h + ''); ugfNtMenus(shell, gm); drawNav(); drawList(); quotaFill(); }; // ---- the places on the left const drawNav = function() { const box = shell.querySelector(".nav"); if (!box) { return; } const cur = here(); let h = ""; places().forEach(function(p) { if (p[2] === true && !state.moreNav) { return; } const on = p[1] === cur; h += '
' + (material && p[2] ? ic(p[2], 24) : "") + "" + esc(p[0]) + "
"; // the folders at the top of My Drive, under it if ((p[1] === "my-drive" && (era === "dv12" || era === "dv14")) || (p[1] === "my-drive" && era === "dl11" && false)) { const fs = cached(); if (on && fs.length) { h += '
' + fs.map(function(f) { const openF = state.view.view === "folder" && trail().some(function(x) { return x.id === f.id; }); return '
' + (material ? ic("folder", 20) : '') + "" + esc(f.name) + "
"; }).join("") + "
"; } } }); if (era === "dv12") { h += '
' + (state.moreNav ? "Less ▴" : "More ▾") + "
"; } // the old lists: the folders (or collections) as a group of their own if (docsList) { const fs = cached(); const title = era === "dl07" ? "Folders" : era === "dl09" ? "My folders" : "My collections"; h += '
' + (fs.length ? "▾ " : "▸ ") + title + "
"; h += fs.length ? fs.map(function(f) { const openF = state.view.view === "folder" && trail().some(function(x) { return x.id === f.id; }); return '
' + esc(f.name) + "
"; }).join("") : '
' + (era === "dl07" || era === "dl09" ? "No folders" : "No collections") + "
"; } box.innerHTML = trusted_policy.createHTML(h); }; // the path above the list (Drive), or the list's name (the Docs list) const crumbHtml = function() { const v = state.view.view; if (v === "search") { return 'Search results for “' + esc(state.view.q) + "”"; } if (v !== "folder") { return '' + esc(placeName(v)) + (v === "my-drive" && material ? " " + ic("arrow_drop_down", 24) : "") + ""; } const t = trail(); const at = t.map(function(x) { return x.id; }).indexOf(state.view.id); const path = at > -1 ? t.slice(0, at + 1) : [{ id: state.view.id, name: currentTitle() }]; const sep = material ? ic("chevron_right", 24) : kennedy ? " > " : " › "; const root = (t[0] && t[0].from) || "my-drive"; let h = '' + esc(placeName(root)) + ""; path.forEach(function(x, i) { const last = i === path.length - 1; const name = last ? (currentTitle() || x.name) : x.name; h += '' + sep + '" + esc(name) + (last && material ? " " + ic("arrow_drop_down", 24) : "") + ""; }); return h; }; const currentTitle = function() { const t = String(state.gTitle || "").replace(/\s*-\s*Google Drive\s*$/, "").trim(); return /^(Google Drive|My Drive|Home|Recent|Starred|Trash|Bin|Shared with me|Computers|Search results)$/i.test(t) ? "" : t; }; // ---- the buttons over the list: what can be done with the chosen files const actionsFor = function(sel) { const one = sel.length === 1 ? sel[0] : null; if (inTrash()) { return [["restore", "Restore", "restore"], ["purge", "Delete forever", "delete_outline"]]; } const out = []; if (one) { out.push(["open", ugfDvIsFolder(one) ? "Open" : "Open", "open_in_new"]); } out.push(["share", "Share...", "person_add"]); if (one) { out.push(["link", "Get link", "link"]); } out.push(["move", docsList ? (era === "dl10" || era === "dl11" ? "Move to collection..." : "Move to folder...") : "Move to...", "drive_file_move"]); out.push(["star", sel.length && sel.every(function(it) { return it.starred; }) ? "Remove star" : (material ? "Add to Starred" : "Add star"), "star_border"]); if (one) { out.push(["rename", "Rename...", "drive_file_rename_outline"]); } if (one && !ugfDvIsFolder(one)) { out.push(["copy", "Make a copy", "content_copy"]); } out.push(["download", "Download", "file_download"]); if (one) { out.push(["details", material ? "View details" : "Details", "info_o"]); } out.push(["trash", docsList ? "Delete" : "Remove", "delete"]); return out; }; // (only when it changes: an open menu keeps its button) const put = function(el, h) { if (el && el.ugfH !== h) { el.ugfH = h; el.innerHTML = trusted_policy.createHTML(h); } }; const drawTool = function() { const box = shell.querySelector(".tool"); const sel = selected(); if (box) { let h = ""; if (era === "dl07") { h = 'Add to folder ▾' + (inTrash() ? "Restore" : "Delete") + "" + 'RenameMore actions ▾'; } else if (era === "dl09") { h = inTrash() ? 'UndeleteEmpty trash' : 'Share ▾Folders ▾Delete' + 'RenameMore actions ▾'; } else if (era === "dl10") { h = inTrash() ? 'UndeleteDelete forever' : 'Share ▾Organize ▾Delete' + 'RenameMore actions ▾'; } else if (kennedy) { h = sel.length ? (inTrash() ? 'RestoreDelete forever' : '' + ic("person_add", 18) + '' + ic("folder", 18) + "" + '' + ic("delete", 18) + 'More ▾') : ""; } else { h = sel.length ? actionsFor(sel).filter(function(a) { return ["share", "link", "open", "trash", "restore", "purge", "download"].indexOf(a[0]) > -1 && !(a[0] === "open"); }).map(function(a) { return '' + ic(a[2], 24) + ""; }).join("") + '' + ic("more_vert", 24) + "" : ""; } put(box, h); } put(shell.querySelector(".mhead"), crumbHtml()); put(shell.querySelector(".crumb"), crumbHtml()); const n = visible().length; put(shell.querySelector(".foot"), 'Select: All ' + n + ', None' + (n ? "Showing items 1-" + n + " of " + n : "") + ""); }; // ---- the list itself const empty = function() { if (!state.loaded) { return '
Loading...
'; } const v = state.view.view; const words = { trash: docsList ? "No items in the trash." : "Trash is empty", starred: "No starred items", "shared-with-me": "Nothing has been shared with you", search: "No results for “" + (state.view.q || "") + "”", recent: "No recent files" }[v]; return '
' + esc(words || (docsList ? "No items." : "No files in this folder. Drag files here or use the " + (era === "dv12" ? "CREATE" : "NEW") + " button.")) + "
"; }; const iconImg = function(it) { return ''; }; const tags = function(it) { let t = ""; if (it.shared && !ugfDvIsFolder(it)) { t += material ? '' + ic("people", 16) + "" : ' Shared'; } if (material && it.starred) { t += '' + ic("star", 16) + ""; } return t; }; const table = function(list) { const old = era === "dl07" || era === "dl09"; const caps = era === "dv12"; const sortMark = state.sort === "name" ? (state.dir > 0 ? " ▲" : " ▼") : ""; let h = '" + (old ? '' : '") + '"; list.forEach(function(it) { const on = !!state.sel[it.id]; h += '' + '' + '" + (old ? '" : '") + '"; }); return h + "
' + (old ? "" : '') + '' + (old ? '' : "") + '' + (caps ? "TITLE" : old ? "Name" : "Title") + sortMark + "Folders / Sharing' + (caps ? "OWNER" : "Owner") + "' + (inTrash() ? (caps ? "DATE TRASHED" : "Trashed") : caps ? "LAST MODIFIED" : old ? "Date" : "Last modified") + "
' + iconImg(it) + '' + esc(it.name) + "" + tags(it) + "' + esc(it.location && it.location !== "My Drive" ? it.location : (it.shared ? "Shared" : "")) + "' + esc(ownerOf(it)) + "' + esc(dateOf(it)) + "
"; }; const rows = function(list) { const sortMark = state.sort === "name" ? ic(state.dir > 0 ? "arrow_upward" : "arrow_downward", 18) : ""; let h = '
Name ' + sortMark + 'Owner' + (inTrash() ? "Trashed" : state.view.view === "recent" ? "Last opened by me" : "Last modified") + (state.sort ? "" : " " + ic("arrow_downward", 18)) + 'File size
'; list.forEach(function(it) { h += '
' + iconImg(it) + '' + esc(it.name) + "" + tags(it) + '' + esc(ownerOf(it)) + '' + esc(dateOf(it)) + '' + esc(ugfDvIsFolder(it) ? "—" : (it.size || "—")) + "
"; }); return '
' + h + "
"; }; const grid = function(list) { const folders = list.filter(ugfDvIsFolder); const files = list.filter(function(it) { return !ugfDvIsFolder(it); }); let h = ""; if (folders.length) { h += '
Folders
' + folders.map(function(it) { return '
' + (material ? ic(it.kind === "sharedfolder" ? "folder_shared" : "folder", 24) : iconImg(it)) + '' + esc(it.name) + "
"; }).join("") + "
"; } if (files.length) { h += '
Files
' + files.map(function(it) { return '
' + iconImg(it) + '' + esc(it.name) + "
"; }).join("") + "
"; } return '
' + h + "
"; }; const drawList = function() { const box = shell.querySelector(".list"); if (!box) { return; } const list = visible(); const keepScroll = box.parentElement ? box.parentElement.scrollTop : 0; let h; if (!list.length) { h = (material ? "" : table([])) + empty(); } else if (material || era === "dv12") { h = state.grid ? grid(list) : (material ? rows(list) : table(list)); } else { h = table(list); } box.innerHTML = trusted_policy.createHTML(h); box.querySelectorAll(".gc .th img").forEach(function(img) { img.addEventListener("error", function() { img.src = img.getAttribute("data-fb"); img.classList.add("fb"); }, { once: true }); }); if (box.parentElement) { box.parentElement.scrollTop = keepScroll; } drawTool(); }; // ---- choosing files const choose = function(id, ev) { const list = visible(); if (ev && (ev.metaKey || ev.ctrlKey)) { state.sel[id] = !state.sel[id]; } else if (ev && ev.shiftKey && state.anchor) { const ids = list.map(function(it) { return it.id; }); const a = ids.indexOf(state.anchor); const b = ids.indexOf(id); state.sel = {}; ids.slice(Math.min(a, b), Math.max(a, b) + 1).forEach(function(x) { state.sel[x] = true; }); } else { state.sel = {}; state.sel[id] = true; } if (!(ev && ev.shiftKey)) { state.anchor = id; } paintSel(); }; const paintSel = function() { shell.querySelectorAll(".list [data-id]").forEach(function(el) { const on = !!state.sel[el.getAttribute("data-id")]; el.classList.toggle(el.tagName === "TR" ? "hl" : "on", on); const cb = el.querySelector("input[type=checkbox]"); if (cb) { cb.checked = on; } }); drawTool(); }; // ---- messages ("Moved to the trash. Undo") let noticeT = 0; const notice = function(text, undo, stay) { const n = shell.querySelector(".notice"); if (!n) { return; } n.innerHTML = trusted_policy.createHTML("" + esc(text) + "" + (undo ? '' + (material && !gm ? "UNDO" : "Undo") + "" : "") + (material ? "" : '' + (kennedy ? "×" : "Dismiss") + "")); n.hidden = false; const u = n.querySelector(".undo"); if (u) { u.addEventListener("click", function(ev) { ev.preventDefault(); n.hidden = true; act.undo().then(function(ok) { if (!ok) { notice("Couldn't undo from here."); } }); }); } const x = n.querySelector(".x"); if (x) { x.addEventListener("click", function(ev) { ev.preventDefault(); n.hidden = true; }); } clearTimeout(noticeT); if (!stay) { noticeT = setTimeout(function() { n.hidden = true; }, 8000); } }; const plural = function(n, w) { return n + " " + (n === 1 ? w : w + "s"); }; // ---- menus const closeMenus = function() { shell.querySelectorAll(".dvmenu").forEach(function(m) { m.remove(); }); shell.querySelectorAll(".dd.open").forEach(function(d) { d.classList.remove("open"); }); }; const menu = function(anchor, items, at) { closeMenus(); const m = document.createElement("div"); m.className = "dvmenu"; m.innerHTML = trusted_policy.createHTML(items.map(function(it, i) { if (!it) { return '
'; } return '
' + (material && it.icon ? '' + (it.img ? '' : ic(it.icon, 20)) + "" : (it.img && !material ? '' : "")) + "" + esc(it.label) + "
"; }).join("")); shell.appendChild(m); const r = at || anchor.getBoundingClientRect(); const mw = m.offsetWidth; const mh = m.offsetHeight; let x = at ? r.left : r.left; let y = at ? r.top : r.bottom + (material ? 0 : 1); if (x + mw > window.innerWidth - 8) { x = Math.max(8, (at ? r.left : r.right) - mw); } if (y + mh > window.innerHeight - 8) { y = Math.max(8, window.innerHeight - mh - 8); } m.style.left = x + "px"; m.style.top = y + "px"; if (anchor && anchor.classList) { anchor.classList.add("open"); } m.querySelectorAll(".mi2").forEach(function(el) { el.addEventListener("click", function(ev) { ev.stopPropagation(); const it = items[+el.getAttribute("data-i")]; if (it.off) { return; } closeMenus(); it.fn(); }); }); }; const newItems = function() { const doc = function(kind, label) { return { label: label, icon: "insert_drive_file", img: ugfDvIcon(kind, material ? "mt" : era), fn: function() { newDoc(kind); } }; }; const folder = { label: material || era === "dv12" ? (gm ? "New folder" : "Folder") : W.Folder, icon: "create_new_folder", img: ugfDvIcon("folder", material ? "mt" : era), fn: function() { ask(gm ? "New folder" : "New " + W.folder, "", gm ? "Create" : "Create", function(v) { act.newFolder(v || "Untitled " + W.folder).then(function(ok) { notice(ok ? (W.Folder + " created.") : "Couldn't create the " + W.folder + "."); }); }); } }; const up = { label: "File upload", icon: "upload_file", fn: pickFiles }; const upF = { label: "Folder upload", icon: "drive_folder_upload", fn: folderUpload }; if (era === "dl07") { return [doc("document", "Document"), doc("spreadsheet", "Spreadsheet"), doc("presentation", "Presentation"), null, folder]; } if (era === "dl09") { return [doc("document", "Document"), doc("presentation", "Presentation"), doc("spreadsheet", "Spreadsheet"), doc("form", "Form"), null, folder, null, { label: "From template...", fn: function() { window.open("https://docs.google.com/document/u/0/?ftv=1&tgif=c", "_blank"); } }]; } if (era === "dl10" || era === "dl11") { return [doc("document", "Document"), doc("presentation", "Presentation"), doc("spreadsheet", "Spreadsheet"), doc("form", "Form"), doc("drawing", "Drawing"), null, folder, null, { label: "From template...", fn: function() { window.open("https://docs.google.com/document/u/0/?ftv=1&tgif=c", "_blank"); } }]; } if (era === "dv12") { return [folder, null, doc("document", "Document"), doc("presentation", "Presentation"), doc("spreadsheet", "Spreadsheet"), doc("form", "Form"), doc("drawing", "Drawing")]; } return [folder, null, up, upF, null, doc("document", "Google Docs"), doc("spreadsheet", "Google Sheets"), doc("presentation", "Google Slides"), doc("form", "Google Forms"), doc("drawing", "Google Drawings")]; }; const moreItems = function(list) { return actionsFor(list).map(function(a) { return { label: a[1], icon: a[2], fn: function() { doAction(a[0]); } }; }); }; const sortItems = function() { return [{ label: "Last modified", on: !state.sort, fn: function() { state.sort = ""; drawList(); } }, { label: material ? "Name" : "Title", on: state.sort === "name", fn: function() { state.sort = "name"; state.dir = 1; drawList(); } }]; }; const gearItems = function() { return [{ label: "Settings", icon: "settings", fn: function() { window.open("https://drive.google.com/drive/settings", "_blank"); } }, { label: "Gplex settings", icon: "settings_applications", fn: function() { window.open("https://www.google.com/gplex", "_blank"); } }, { label: "Help", icon: "help_outline", fn: function() { window.open("https://support.google.com/drive", "_blank"); } }]; }; const moveItems = function() { const sel = selected(); const ids = sel.map(function(it) { return it.id; }); const here2 = visible().filter(function(it) { return ugfDvIsFolder(it) && ids.indexOf(it.id) < 0; }); const items = []; if (state.view.view === "folder") { items.push({ label: "My Drive", icon: "folder", img: ugfDvIcon("folder", material ? "mt" : era), fn: function() { moveTo(sel, "root", "My Drive"); } }); } here2.slice(0, 15).forEach(function(f) { items.push({ label: f.name, icon: "folder", img: ugfDvIcon("folder", material ? "mt" : era), fn: function() { moveTo(sel, f.id, f.name); } }); }); if (items.length) { items.push(null); } items.push({ label: docsList ? "Other " + W.folder + "s..." : "Choose another folder...", fn: function() { googleMove(sel[0]); } }); return items; }; const openMenu = function(anchor, which) { if (anchor.classList.contains("open")) { closeMenus(); return; } const sel = selected(); if (which === "new") { menu(anchor, newItems()); } else if (which === "upload") { menu(anchor, [{ label: "Files...", icon: "upload_file", fn: pickFiles }, { label: "Folder...", icon: "drive_folder_upload", fn: folderUpload }]); } else if (which === "more") { if (!sel.length) { notice("Select one or more " + W.items + " first."); return; } menu(anchor, moreItems(sel)); } else if (which === "move") { if (!sel.length) { notice("Select one or more " + W.items + " first."); return; } menu(anchor, moveItems()); } else if (which === "sort") { menu(anchor, sortItems()); } else if (which === "gear") { menu(anchor, gearItems()); } }; // ---- dialogs const dialog = function(title, body, buttons, cls) { const box = document.createElement("div"); box.className = "dvdlg-wrap"; box.innerHTML = trusted_policy.createHTML('
"); shell.appendChild(box); const close = function() { box.remove(); document.removeEventListener("keydown", onKey, true); try { shell.focus({ preventScroll: true }); } catch (e) {} }; const onKey = function(ev) { if (ev.key === "Escape") { ev.preventDefault(); ev.stopPropagation(); close(); } else if (ev.key === "Enter" && ev.target && ev.target.tagName === "INPUT" && ev.target.type !== "checkbox") { ev.preventDefault(); const pri = buttons.filter(function(b) { return b.primary; })[0]; if (pri && pri.fn(box) !== false) { close(); } } }; document.addEventListener("keydown", onKey, true); box.querySelectorAll(".dbtns button").forEach(function(b) { b.addEventListener("click", function() { const bt = buttons[+b.getAttribute("data-i")]; if (!bt.fn || bt.fn(box) !== false) { close(); } }); }); box.querySelector(".dx").addEventListener("click", function(ev) { ev.preventDefault(); close(); }); box.querySelector(".dvfence").addEventListener("click", close); const f = box.querySelector("input:not([readonly]), textarea"); if (f) { setTimeout(function() { f.focus(); f.select && f.select(); }, 0); } return { box: box, close: close }; }; const cancelLabel = era === "dv17" ? "CANCEL" : "Cancel"; const okLabel = function(s) { return era === "dv17" ? s.toUpperCase() : s; }; const ask = function(title, value, ok, fn) { dialog(title, '', [{ label: okLabel(ok || "OK"), primary: true, fn: function(box) { fn(box.querySelector(".dvin").value.trim()); } }, { label: cancelLabel }]); }; const sure = function(title, text, ok, fn) { dialog(title, "

" + esc(text) + "

", [{ label: okLabel(ok), primary: true, fn: fn }, { label: cancelLabel }]); }; // the details of a file: what Google's list says about it const details = function(it) { if (!it) { return; } const row = function(k, v) { return v ? "" + esc(k) + "" + esc(v) + "" : ""; }; const thumb = ["image", "pdf", "document", "spreadsheet", "presentation", "drawing", "video"].indexOf(it.kind) > -1; let extra = ""; Object.keys(it.cols).forEach(function(k) { if (["Owner", "Last modified", "File size", "Location", "Reason suggested"].indexOf(k) < 0) { extra += row(k, it.cols[k]); } }); dialog(it.name, (thumb ? '
' : "") + '' + row("Type", it.type || (ugfDvIsFolder(it) ? W.Folder : "")) + row("Owner", ownerOf(it)) + row("Location", it.location) + row(inTrash() ? "Trashed" : "Modified", dateOf(it)) + row("Size", it.size) + row("Shared", it.shared ? "Yes" : "") + row("Starred", it.starred ? "Yes" : "") + extra + "
", [{ label: okLabel("Open"), primary: true, fn: function() { openItem(it); } }, { label: era === "dv17" ? "CLOSE" : "Close" }], "wide"); const img = shell.querySelector(".dvthumb img"); if (img) { img.addEventListener("error", function() { img.parentElement.remove(); }, { once: true }); } }; // a picture, large, over the page (the other kinds open in a new tab) const preview = function(it) { const box = document.createElement("div"); box.className = "dvprev"; box.innerHTML = trusted_policy.createHTML('" + '
'); shell.appendChild(box); const close = function() { box.remove(); document.removeEventListener("keydown", onKey, true); }; const onKey = function(ev) { if (ev.key === "Escape") { ev.preventDefault(); close(); } }; document.addEventListener("keydown", onKey, true); box.addEventListener("click", function(ev) { const a = ev.target.closest("[data-p]"); if (a && a.getAttribute("data-p") === "open") { return; } ev.preventDefault(); if (a && a.getAttribute("data-p") === "dl") { act.download(it.id); } if (!a || a.getAttribute("data-p") === "x" || a.getAttribute("data-p") === "dl" || ev.target.classList.contains("pimg")) { close(); } }); }; // sharing: the period's dialog, carried out in Google's own share dialog const share = function(it) { if (!it) { return; } const link = ugfDvShareUrl(it); const title = docsList ? (era === "dl11" ? "Sharing settings" : "Share " + it.name) : era === "dv12" ? "Sharing settings" : "Share with others"; const body = '
Link to share' + (material ? "" : " (only accessible by collaborators)") + '
' + '
" + '
' + (material ? "People" : "Invite people:") + '
' + '
' + '
' + '"; const d = dialog(title, body, [{ label: okLabel(material ? "Done" : "Share & save"), primary: true, fn: function(box) { const emails = box.querySelector(".who").value.split(/[\s,;]+/).filter(function(x) { return /@/.test(x); }); if (!emails.length) { return true; } const role = box.querySelector(".role").value; const notify = box.querySelector(".notify").checked; const note = box.querySelector(".note").value; notice("Sharing...", false, true); act.share(it.id).then(async function(sd) { if (!sd) { notice("Couldn't open sharing for this " + W.item + "."); return; } const ok = await ugfDvShareInvite(sd, emails, role, notify, note); if (ok) { notice("Shared with " + plural(emails.length, "person").replace("persons", "people") + "."); } else { notice("Finish sharing in the dialog below."); ugfDvReveal(sd.frame || sd.dialog); } }); return true; } }, { label: cancelLabel }], "share"); d.box.querySelector(".cpy").addEventListener("click", function() { const inp = d.box.querySelector(".lnk"); inp.select(); const done = function() { notice("Link copied to clipboard."); }; try { navigator.clipboard.writeText(link).then(done, function() { document.execCommand("copy"); done(); }); } catch (e) { document.execCommand("copy"); done(); } }); d.box.querySelector(".adv").addEventListener("click", function(ev) { ev.preventDefault(); d.close(); act.share(it.id).then(function(sd) { if (sd) { ugfDvReveal(sd.frame || sd.dialog); } else { notice("Couldn't open sharing for this " + W.item + "."); } }); }); }; // moving: Gplex's own list of folders; any other goes through Google's move dialog const moveTo = function(list, target, name) { let n = 0; let bad = 0; list.forEach(function(it) { act.move(it.id, target).then(function(ok) { ok ? n++ : bad++; if (n + bad === list.length) { if (bad && n === 0 && list.length === 1) { googleMove(list[0]); } else { notice(n ? "Moved " + plural(n, W.item) + " to “" + name + "”." : "Couldn't move the " + W.items + ".", n > 0); } } }); }); }; const googleMove = function(it) { if (!it) { return; } act.moveDialog(it.id).then(function(dl) { if (dl) { ugfDvReveal(dl); } else { notice("Couldn't open the move dialog."); } }); }; // ---- uploading: by Google's own File upload and Folder upload (its picker, its // uploading), or by dropping files, which pass straight through to Google's page // Google's own upload panel is watched (out of sight under Gplex's page), and the // list: an upload is only called complete once Google has said so after saying it // was uploading, or once the files are in the list. What Google's panel says is // written to the console, so an upload that goes wrong can be followed. let upNames = []; window.addEventListener("change", function(ev) { const t = ev.target; if (t && t.type === "file" && !t.closest("#ugf-drive") && t.files && t.files.length) { upNames = [].map.call(t.files, function(f) { return f.name; }); console.log("[Gplex] Drive: " + upNames.length + " file(s) chosen in Google's picker"); watchUpload(upNames); } }, true); const watchUpload = function(names) { names = names || []; const started = Date.now(); const before = {}; state.items.forEach(function(it) { before[it.id] = true; }); let going = false; let lastSaid = ""; clearInterval(watchUpload.t); const panelText = function() { let txt = ""; document.querySelectorAll("[role=alert], [role=status], [aria-live], [role=dialog], [role=log], [role=region], [role=complementary]").forEach(function(el) { if (!el.closest("#ugf-drive") && !el.closest("[role=main]") && el.getClientRects().length) { txt += " " + (el.innerText || el.textContent || ""); } }); return txt.replace(/\s+/g, " ").trim(); }; const arrived = function() { return state.items.filter(function(it) { return !before[it.id] && (!names.length || names.some(function(nm) { return it.name === nm || it.name === nm.replace(/\.[^.]+$/, ""); })); }).length; }; watchUpload.t = setInterval(function() { const txt = panelText(); const bit = (txt.match(/[^.]{0,40}upload[^.]{0,60}/i) || [""])[0].trim(); if (bit && bit !== lastSaid) { lastSaid = bit; console.log("[Gplex] Drive: Google says: " + bit.slice(0, 120)); } if (/uploading|preparing|\d+ (items?|files?) remaining|upload(s)? in progress/i.test(txt)) { going = true; notice("Uploading" + (names.length ? " " + plural(names.length, "file") : "") + "...", false, true); } const n = arrived(); if (n && (!names.length || n >= names.length)) { clearInterval(watchUpload.t); notice("Upload complete."); } else if (going && /\b\d+ uploads? complete|\bupload complete/i.test(txt)) { // (Google says it is done: the list catches up in a moment) if (!watchUpload.doneAt) { watchUpload.doneAt = Date.now(); } else if (Date.now() - watchUpload.doneAt > 8000) { clearInterval(watchUpload.t); watchUpload.doneAt = 0; notice("Upload complete. (It may be in another folder: Google puts uploads where it was told to.)"); } } else if (/upload(s)? failed|couldn.t upload|can.t upload|upload error|failed to upload/i.test(txt)) { clearInterval(watchUpload.t); notice("The upload didn't finish."); } else if (!going && Date.now() - started > 20000) { clearInterval(watchUpload.t); if (names.length) { console.log("[Gplex] Drive: Google never started uploading"); notice("Google didn't start the upload."); } } else if (Date.now() - started > 1800000) { clearInterval(watchUpload.t); } }, 600); }; const pickFiles = function() { act.googleUpload(false).then(function(ok) { console.log("[Gplex] Drive: Google's File upload " + (ok ? "pressed" : "not found")); if (!ok) { notice("Couldn't open the upload. Drag the files onto the list instead."); } }); }; const folderUpload = function() { act.googleUpload(true).then(function(ok) { console.log("[Gplex] Drive: Google's Folder upload " + (ok ? "pressed" : "not found")); if (!ok) { notice("Couldn't open the folder upload. Drag the folder onto the list instead."); } }); }; // ---- doing what was asked const doAction = function(a) { const sel = selected(); const one = sel[0]; if (!sel.length && ["all", "none", "grid", "morenav", "upload", "details"].indexOf(a) < 0) { notice("Select one or more " + W.items + " first."); return; } if (a === "open") { openItem(one); } else if (a === "share") { share(one); } else if (a === "link") { const link = ugfDvShareUrl(one); try { navigator.clipboard.writeText(link).then(function() { notice("Link copied to clipboard."); }, function() { share(one); }); } catch (e) { share(one); } } else if (a === "move") { openMenu(shell.querySelector("[data-m=move]") || shell.querySelector(".tool") || shell, "move"); } else if (a === "star" || a === "star1") { const on = !sel.every(function(it) { return it.starred; }); sel.forEach(function(it) { if (it.starred !== on) { it.starred = on; act.star(it.id); } }); drawList(); } else if (a === "rename") { ask(material ? "Rename" : "Rename " + W.item, one.name, "OK", function(v) { if (v && v !== one.name) { act.rename(one.id, v).then(function(ok) { notice(ok ? "Renamed to “" + v + "”." : "Couldn't rename the " + W.item + "."); }); } }); } else if (a === "copy") { sel.forEach(function(it) { act.copy(it.id); }); notice("Making a copy..."); } else if (a === "download") { sel.forEach(function(it) { act.download(it.id); }); } else if (a === "details") { details(one || null); } else if (a === "trash") { const go2 = function() { let n = 0; sel.forEach(function(it) { act.trash(it.id).then(function(ok) { if (ok) { n++; } if (it === sel[sel.length - 1]) { notice(n ? (sel.length === 1 ? "“" + one.name + "” has been moved to the trash." : plural(n, W.item) + " moved to the trash.") : "Couldn't remove the " + W.items + ".", n > 0); } }); }); state.sel = {}; }; if (docsList && era !== "dl11") { sure("Delete", "Move " + (sel.length === 1 ? "“" + one.name + "”" : plural(sel.length, W.item)) + " to the trash?", "Delete", go2); } else { go2(); } } else if (a === "restore") { sel.forEach(function(it) { act.restore(it.id); }); notice(plural(sel.length, W.item) + " restored."); state.sel = {}; } else if (a === "purge") { sure("Delete forever", (sel.length === 1 ? "“" + one.name + "”" : plural(sel.length, W.item)) + " will be deleted forever. This can't be undone.", "Delete forever", function() { sel.forEach(function(it) { act.purge(it.id); }); state.sel = {}; }); } }; // ---- the page's clicks, keys and drops shell.addEventListener("click", function(ev) { const t = ev.target; if (!t.closest(".dvmenu") && !t.closest(".dd")) { closeMenus(); } const ddEl = t.closest(".dd[data-m]"); if (ddEl && ddEl.getAttribute("data-m")) { ev.preventDefault(); openMenu(ddEl, ddEl.getAttribute("data-m")); return; } const goEl = t.closest("[data-go]"); if (goEl) { ev.preventDefault(); go(goEl.getAttribute("data-go")); return; } const fEl = t.closest("[data-folder]"); if (fEl) { ev.preventDefault(); openFolder({ id: fEl.getAttribute("data-folder"), name: fEl.getAttribute("data-name") || "" }, "my-drive"); return; } const aEl = t.closest("[data-a]"); if (aEl) { ev.preventDefault(); const a = aEl.getAttribute("data-a"); if (a === "star1") { const tr = aEl.closest("[data-id]"); if (tr) { state.sel = {}; state.sel[tr.getAttribute("data-id")] = true; } doAction("star"); } else if (a === "upload") { pickFiles(); } else if (a === "grid") { state.grid = !state.grid; try { localStorage.setItem("UGF_DV_GRID", state.grid ? "1" : "0"); } catch (e) {} frame(); } else if (a === "morenav") { state.moreNav = !state.moreNav; drawNav(); } else if (a === "all" || a === "none") { state.sel = {}; if (a === "all") { visible().forEach(function(it) { state.sel[it.id] = true; }); } paintSel(); } else if (a === "details" && !selected().length) { notice("Select an " + W.item + " to see its details."); } else { doAction(a); } return; } const sortEl = t.closest("[data-sort]"); if (sortEl) { const k = sortEl.getAttribute("data-sort"); if (k === "name" && state.sort === "name") { state.dir = -state.dir; } else { state.sort = k; state.dir = 1; } drawList(); return; } if (t.matches("thead input.all")) { state.sel = {}; if (t.checked) { visible().forEach(function(it) { state.sel[it.id] = true; }); } paintSel(); return; } const row = t.closest(".list [data-id]"); if (row) { const id = row.getAttribute("data-id"); if (t.closest("a.op")) { ev.preventDefault(); openItem(byId(id)); return; } if (t.matches("input[type=checkbox]")) { state.sel[id] = t.checked; state.anchor = id; paintSel(); return; } choose(id, ev); return; } if (t.closest(".list") && !t.closest("thead, .lhead")) { state.sel = {}; paintSel(); } }); shell.addEventListener("dblclick", function(ev) { const row = ev.target.closest(".list [data-id]"); if (row && !ev.target.closest("input, .star")) { ev.preventDefault(); openItem(byId(row.getAttribute("data-id"))); } }); shell.addEventListener("contextmenu", function(ev) { const row = ev.target.closest(".list [data-id]"); if (!row || docsList) { return; } ev.preventDefault(); const id = row.getAttribute("data-id"); if (!state.sel[id]) { choose(id, null); } menu(null, moreItems(selected()), { left: ev.clientX, top: ev.clientY, right: ev.clientX, bottom: ev.clientY }); }); shell.addEventListener("submit", function(ev) { const f = ev.target; ev.preventDefault(); const v = (f.querySelector("input[name=q]") || {}).value || ""; if (v.trim()) { window.location.href = ugfDvBase() + "/search?q=" + encodeURIComponent(v.trim()); } }); shell.addEventListener("click", function(ev) { if (ev.target.classList && ev.target.classList.contains("web")) { const v = (shell.querySelector("form input[name=q]") || {}).value || ""; window.location.href = "https://www.google.com/search?q=" + encodeURIComponent(v); } }); // keys: kept from Google's page underneath (its shortcuts would act on its own list) shell.addEventListener("keydown", function(ev) { ev.stopPropagation(); const inField = /^(INPUT|TEXTAREA|SELECT)$/.test(ev.target.tagName); if (inField || shell.querySelector(".dvdlg-wrap, .dvprev")) { return; } const list = visible(); const ids = list.map(function(it) { return it.id; }); const cur = ids.indexOf(state.anchor); if (ev.key === "ArrowDown" || ev.key === "ArrowUp") { ev.preventDefault(); const n = Math.max(0, Math.min(ids.length - 1, cur + (ev.key === "ArrowDown" ? 1 : -1))); if (ids[n]) { choose(ids[n], ev.shiftKey ? { shiftKey: true } : null); const el = shell.querySelector('.list [data-id="' + ids[n].replace(/"/g, "") + '"]'); if (el) { el.scrollIntoView({ block: "nearest" }); } } } else if (ev.key === "Enter" && selected().length === 1) { ev.preventDefault(); openItem(selected()[0]); } else if ((ev.key === "Delete" || ev.key === "Backspace") && selected().length && !inTrash()) { ev.preventDefault(); doAction("trash"); } else if ((ev.key === "a" || ev.key === "A") && (ev.ctrlKey || ev.metaKey)) { ev.preventDefault(); doAction("all"); } else if (ev.key === "Escape") { closeMenus(); } }); ["keyup", "keypress"].forEach(function(t) { shell.addEventListener(t, function(ev) { ev.stopPropagation(); }); }); // files dragged in from the computer: Gplex's page lets them through to Google's // underneath (a real drop, which Google uploads into the folder being shown), and // marks the list meanwhile const hasFiles = function(ev) { return ev.dataTransfer && [].indexOf.call(ev.dataTransfer.types || [], "Files") > -1; }; let dragT = 0; const dragOff = function(dropped) { clearTimeout(dragT); if (html.hasAttribute("gplex-dv-drag")) { html.removeAttribute("gplex-dv-drag"); shell.classList.remove("drop"); if (dropped && dropped.length) { console.log("[Gplex] Drive: " + dropped.length + " file(s) dropped on Google's page" + (dropTook ? "" : " (not taken)")); if (dropTook) { notice("Uploading...", false, true); watchUpload(dropped); } } } }; let dropTook = false; window.addEventListener("dragenter", function(ev) { if (!hasFiles(ev) || shell.hidden) { return; } html.setAttribute("gplex-dv-drag", ""); shell.classList.add("drop"); clearTimeout(dragT); }, true); window.addEventListener("dragover", function(ev) { if (html.hasAttribute("gplex-dv-drag")) { clearTimeout(dragT); // (the drag has left the window when these stop coming) dragT = setTimeout(function() { dragOff(false); }, 900); } }, true); window.addEventListener("drop", function(ev) { if (html.hasAttribute("gplex-dv-drag")) { const names = ev.dataTransfer && ev.dataTransfer.files ? [].map.call(ev.dataTransfer.files, function(f) { return f.name; }) : []; dropTook = true; setTimeout(function() { dragOff(names); }, 50); } }, true); window.addEventListener("dragend", function() { dragOff(false); }, true); // (a drop Google's page did not take is not left to the browser, which would open // the file in place of Drive) window.addEventListener("dragover", function(ev) { if (html.hasAttribute("gplex-dv-drag") && hasFiles(ev) && !ev.defaultPrevented) { ev.preventDefault(); } }); window.addEventListener("drop", function(ev) { if (html.hasAttribute("gplex-dv-drag") && !ev.defaultPrevented) { ev.preventDefault(); dropTook = false; setTimeout(function() { notice("Drop the files onto the list of files to upload them."); }, 80); } }); // more of a long list: Google loads it as its own list is scrolled shell.addEventListener("scroll", function(ev) { const m = ev.target; if (!m.classList || !m.classList.contains("main") || m.scrollTop + m.clientHeight < m.scrollHeight - 200) { return; } const last = state.items[state.items.length - 1]; const row = last ? ugfDvRow(last.id) : null; if (row) { try { row.scrollIntoView({ block: "end" }); } catch (e) {} } }, true); // ---- keeping up with Google's page const harvest = function() { const items = ugfDvHarvest().filter(function(it) { return it.el.getClientRects().length > 0; }); const key = items.map(function(i) { return i.id + "|" + i.name + "|" + i.starred + "|" + i.modified + "|" + i.owner + "|" + i.size; }).join("#"); if (key !== state.lastKey) { state.lastKey = key; state.items = items; if (items.length) { state.loaded = true; } Object.keys(state.sel).forEach(function(id) { if (!byId(id)) { delete state.sel[id]; } }); remember(); drawList(); quotaFill(); } }; let myTitle = ""; const titleFor = function() { const v = state.view.view; const name = v === "folder" ? (currentTitle() || "Folder") : v === "search" ? "Search results" : placeName(v); if (docsList) { return "Google Docs - " + name; } return name + " - Google Drive"; }; const tick = function() { const v = ugfDvView(); // a part of Drive Gplex does not draw (settings, a file's page...): Google's own if (v.view === "") { if (!shell.hidden) { shell.hidden = true; html.removeAttribute("gplex-dv"); } return; } if (shell.hidden) { shell.hidden = false; html.setAttribute("gplex-dv", era); } if (document.title !== myTitle) { state.gTitle = document.title; } const changed = v.view !== state.view.view || v.id !== state.view.id || v.q !== state.view.q; if (changed) { state.view = v; state.sel = {}; state.items = []; state.lastKey = ""; state.loaded = false; closeMenus(); drawNav(); drawList(); setTimeout(function() { state.loaded = true; if (!state.items.length) { drawList(); } }, 6000); } // Drive opens on its Home page; the Drive of these years opened on My Drive if ((v.view === "home" || v.view === "root") && era !== "dl10" && era !== "dl11" && !tick.left) { tick.left = true; go("my-drive"); } myTitle = titleFor(); if (document.title !== myTitle) { document.title = myTitle; } harvest(); if (changed || !tick.crumbAt || Date.now() - tick.crumbAt > 2000) { tick.crumbAt = Date.now(); drawTool(); } }; frame(); tick(); setTimeout(function() { state.loaded = true; if (!state.items.length) { drawList(); } }, 8000); setInterval(tick, 700); } // ---- Drive: the styles of each period ---------------------------------------------- function ugfDriveCss(era, A) { const H = "#ugf-drive"; const c = []; const add = function(sel, body) { c.push(sel.split(",").map(function(s) { return H + " " + s.trim(); }).join(", ") + " { " + body + " }"); }; const l = String(layout || ""); const kennedy = era === "dl11" || era === "dv12"; const material = era === "dv14" || era === "dv17" || era === "dv19"; const gm = era === "dv19"; const classic = era === "dl07" || era === "dl09" || era === "dl10"; const f = gm ? "'Google Sans', Roboto, Arial, sans-serif" : material ? "Roboto, RobotoDraft, Helvetica, Arial, sans-serif" : "Arial, sans-serif"; // the Google bar and the account corner, from the shared styles (Google's page is // left as it is underneath: Gplex's page simply covers it) ugfNtBaseCss("ugf-drive").forEach(function(r) { if (r.indexOf("html[gplex-nt]") !== 0 && r.indexOf(H + " {") !== 0) { c.push(r); } }); c.push("html[gplex-dv], html[gplex-dv] body { overflow: hidden !important; }"); c.push("html[gplex-dv] body > [ugf-dv-up] { z-index: 2147483100 !important; }"); c.push("html[gplex-dv-reveal] " + H + " { display: none !important; }"); c.push("html[gplex-dv] #ugf-gmail-accfence { z-index: 2147483600 !important; } html[gplex-dv] #ugf-gmail-accmenu, html[gplex-dv] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }"); c.push("html[gplex-dv] #ugf-gmail-accmenu a, html[gplex-dv] #ugf-gmail-appsmenu a { text-decoration: none; }"); c.push(H + " { position: fixed; inset: 0; z-index: 2147483000; display: flex; flex-direction: column; background: #fff; color: #000; font: 13px " + f + "; text-align: left; overflow: hidden; outline: none; }"); c.push(H + "[hidden] { display: none !important; }"); c.push(H + ".busy, " + H + ".busy * { cursor: progress !important; }"); // (while files are dragged in, the page lets them through to Google's) c.push("html[gplex-dv-drag] " + H + " { pointer-events: none !important; }"); c.push(H + ".drop .main { outline: 3px dashed " + (material ? "#4285f4" : "#6d9eeb") + "; outline-offset: -6px; background: " + (gm ? "#e8f0fe" : "#f3f7fe") + "; }"); add("*", "box-sizing: border-box;"); add("a", "cursor: pointer;"); add(".mi", "display: inline-flex; font-style: normal;"); add(".mi svg", "display: block; fill: currentColor;"); add(".body", "flex: 1; display: flex; min-height: 0;"); add(".side", "flex: 0 0 auto; overflow: auto; display: flex; flex-direction: column;"); add(".main", "flex: 1; overflow: auto; min-width: 0; position: relative;"); add("form", "display: flex; align-items: center; margin: 0;"); add(".sp", "flex: 1;"); add(".dd, [data-a], [data-go], [data-folder], [data-sort]", "cursor: pointer; user-select: none;"); add(".empty", "padding: 24px; color: #777; font-size: 13px;"); add(".fi", "width: 16px; height: 16px; vertical-align: -3px; margin-right: 6px; flex: 0 0 16px;"); add(".nav .fi", "margin-right: 5px;"); add("table.list", "width: 100%; border-collapse: collapse; table-layout: fixed;"); add("table.list td, table.list th", "white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: left; font-weight: normal;"); add("table.list .cb", "width: 28px; text-align: center;"); add("table.list .st", "width: 24px;"); add("table.list .ow, table.list .fs", "width: 22%;"); add("table.list .dt", "width: 18%;"); add("table.list tr[data-id]", "cursor: default;"); add("table.list td.nm a", "text-decoration: none;"); add("table.list input", "margin: 0; vertical-align: middle;"); add(".tag", "font-size: 11px; color: #777;"); add(".star", "display: inline-block; width: 16px; height: 16px; vertical-align: middle;"); add(".upin", "display: none;"); // ---- the messages add(".notice", "position: absolute; z-index: 60; display: flex; align-items: center; gap: 12px;"); add(".notice[hidden]", "display: none;"); if (material) { add(".notice", "left: 24px; bottom: 24px; min-height: 48px; padding: 6px 24px; background: " + (gm ? "#202124" : "#323232") + "; color: #fff; font: 14px " + f + "; box-shadow: 0 3px 5px rgba(0,0,0,.2); border-radius: " + (gm ? "4px" : "2px") + "; max-width: 560px;"); add(".notice a", "color: " + (gm ? "#8ab4f8" : "#eeff41") + "; text-decoration: none; font-weight: 500; margin-left: 12px;"); } else if (kennedy) { add(".notice", "left: 50%; top: 6px; transform: translateX(-50%); padding: 6px 12px; background: #f9edbe; border: 1px solid #f0c36d; box-shadow: 0 2px 4px rgba(0,0,0,.2); font: bold 13px Arial, sans-serif; color: #222; border-radius: 2px;"); add(".notice a", "color: #222; text-decoration: underline;"); add(".notice .x", "text-decoration: none; font-size: 16px; color: #777; margin-left: 4px;"); } else { add(".notice", "left: 50%; top: 4px; transform: translateX(-50%); padding: 4px 10px; background: #fad163; font: bold 13px Arial, sans-serif; color: #000; border-radius: 3px;"); add(".notice a", "color: #00c; text-decoration: underline; font-weight: normal;"); } // ---- menus: square until 2019 add(".dvmenu", "position: fixed; z-index: 70; background: #fff; min-width: 170px; max-height: 70vh; overflow: auto; " + (gm ? "padding: 6px 0; border-radius: 4px; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2); font: 14px Roboto, Arial, sans-serif;" : material ? "padding: 8px 0; box-shadow: 0 2px 10px rgba(0,0,0,.2); font: 13px " + f + ";" : kennedy ? "padding: 6px 0; border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 4px rgba(0,0,0,.2); font: 13px Arial, sans-serif;" : "padding: 2px 0; border: 1px solid; border-color: #ccc #666 #666 #ccc; font: 13px Arial, sans-serif;")); add(".dvmenu .mi2", "display: flex; align-items: center; white-space: nowrap; color: " + (material ? "#202124" : "#222") + "; " + (material ? "gap: 16px; padding: 0 24px 0 16px; line-height: 32px;" : kennedy ? "padding: 6px 44px 6px 30px; position: relative;" : "padding: 3px 18px 3px 8px;")); add(".dvmenu .mi2:hover", material ? "background: " + (gm ? "#f1f3f4" : "#eee") + ";" : kennedy ? "background: #eee;" : "background: #316ac5; color: #fff;"); add(".dvmenu .mi2.off", "color: #aaa; pointer-events: none;"); add(".dvmenu .mi2.chk::before", "content: '\\2713'; " + (material ? "margin-right: 8px;" : kennedy ? "position: absolute; left: 10px;" : "margin-right: 4px;")); add(".dvmenu .mic", "display: inline-flex; width: 20px; justify-content: center; color: #5f6368;"); add(".dvmenu .mic img", "width: 16px; height: 16px;"); add(".dvmenu .msep", "height: 1px; background: " + (material ? "#e0e0e0" : "#ebebeb") + "; margin: " + (material ? "8px 0" : "4px 0") + ";"); // ---- dialogs // the dialogs: Kennedy's (with its blue and grey buttons, and boxed fields) until // 2016, Material's flat ones from 2017 const kdlg = kennedy || era === "dv14"; const mdlg = material && era !== "dv14"; add(".dvdlg-wrap", "position: fixed; inset: 0; z-index: 80;"); add(".dvfence", "position: absolute; inset: 0; background: " + (mdlg ? "rgba(0,0,0,.4)" : kdlg ? "rgba(255,255,255,.75)" : "rgba(0,0,0,.25)") + ";"); add(".dvdlg", "position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); background: #fff; width: 440px; max-width: calc(100% - 32px); max-height: calc(100% - 32px); overflow: auto; " + (gm ? "border-radius: 8px; padding: 24px; box-shadow: 0 1px 3px rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15);" : mdlg ? "padding: 24px; box-shadow: 0 16px 24px rgba(0,0,0,.3);" : kdlg ? "padding: 30px 42px; border: 1px solid #acacac; box-shadow: 0 4px 16px rgba(0,0,0,.2);" : "border: 1px solid #6b90da; padding: 0 0 10px;")); add(".dvdlg.wide", "width: 520px;"); add(".dvdlg.share", "width: 560px;"); add(".dvdlg .dt2", "display: flex; align-items: center; " + (mdlg ? "font: " + (gm ? "400 22px 'Google Sans', Roboto, sans-serif; color: #202124;" : "500 20px Roboto, sans-serif; color: #212121;") + " margin-bottom: 20px;" : kdlg ? "font: 16px Arial, sans-serif; color: #222; margin-bottom: 16px;" : "background: #e0ecff; padding: 5px 8px; font: bold 13px Arial, sans-serif; margin-bottom: 10px;")); add(".dvdlg .dt2 span", "flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".dvdlg .dx", "text-decoration: none; color: #777; font-size: " + (kdlg ? "22px" : "18px") + "; line-height: 1; margin-left: 12px;"); add(".dvdlg .db", (classic ? "padding: 0 12px;" : "") + " font-size: 13px; color: #222;"); add(".dvdlg .db p", "margin: 0 0 8px;"); add(".dvdlg .dvin, .dvdlg .shl input[type=text], .dvdlg .shi input[type=text]", "width: 100%; height: " + (mdlg ? "36px" : "29px") + "; font: 13px " + f + "; padding: 0 8px; outline: none; " + (mdlg ? "border: 0; border-bottom: 1px solid #ccc; padding: 0 2px; font-size: 15px;" : "border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 1px;")); add(".dvdlg .dvin:focus, .dvdlg input[type=text]:focus", mdlg ? "border-bottom: 2px solid #4285f4;" : "border-color: #4d90fe;"); add(".dvdlg .dbtns", "display: flex; gap: 8px; margin-top: 22px; " + (mdlg ? "justify-content: flex-end; flex-direction: row-reverse;" : classic ? "padding: 0 12px;" : "")); if (mdlg) { add(".dvdlg .dbtns", "justify-content: flex-start;"); add(".dvdlg .dbtns button", "border: 0; background: none; color: " + (gm ? "#1a73e8" : "#4285f4") + "; font: 500 14px " + (gm ? "'Google Sans', Roboto" : "Roboto") + ", sans-serif; height: 36px; padding: 0 12px; cursor: pointer; border-radius: " + (gm ? "4px" : "2px") + ";"); add(".dvdlg .dbtns button:hover", "background: rgba(66,133,244,.08);"); add(".dvdlg .dbtns", "flex-direction: row-reverse; justify-content: flex-start;"); add(".dvdlg .dbtns button.pri", gm ? "background: #1a73e8; color: #fff; padding: 0 24px;" : ""); } else if (kdlg) { add(".dvdlg .dbtns button", "height: 29px; min-width: 72px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif; cursor: default;"); add(".dvdlg .dbtns button.pri", "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff;"); } else { add(".dvdlg .dbtns button", "font: 13px Arial, sans-serif; padding: 2px 10px;"); add(".dvdlg .dbtns button.pri", "font-weight: bold;"); } add(".dvprops", "border-collapse: collapse; width: 100%; margin-top: 8px;"); add(".dvprops th", "text-align: left; font-weight: normal; color: #777; padding: 4px 16px 4px 0; width: 110px; vertical-align: top;"); add(".dvprops td", "padding: 4px 0; word-break: break-word;"); add(".dvthumb", "text-align: center; background: #f5f5f5; margin-bottom: 8px;"); add(".dvthumb img", "max-width: 100%; max-height: 220px; display: inline-block;"); // sharing add(".dvdlg .lab", "font-weight: bold; margin: 0 0 6px; " + (mdlg ? "font-weight: 500; color: #202124; font-size: 14px;" : "")); add(".dvdlg .row", "display: flex; gap: 8px; align-items: center;"); add(".dvdlg .shl", "padding-bottom: 14px; margin-bottom: 14px; border-bottom: 1px solid #ebebeb;"); add(".dvdlg .shl .lnk", "color: #666;"); add(".dvdlg .row button, .dvdlg select", "height: " + (mdlg ? "36px" : "29px") + "; font: " + (mdlg ? "500 13px Roboto" : "bold 11px Arial") + ", sans-serif; white-space: nowrap; " + (mdlg ? "border: 0; background: none; color: " + (gm ? "#1a73e8" : "#4285f4") + "; padding: 0 8px;" : "border: 1px solid #d9d9d9; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; padding: 0 8px;")); add(".dvdlg select", mdlg ? "border: 0; border-bottom: 1px solid #ccc; color: #444; font-weight: normal;" : "font-weight: normal;"); add(".dvdlg .nt", "display: flex; align-items: center; gap: 6px; margin: 10px 0 6px;"); add(".dvdlg .nt input", "margin: 0;"); add(".dvdlg .note", "width: 100%; font: 13px " + f + "; padding: 6px 8px; resize: vertical; " + (mdlg ? "border: 1px solid #ddd;" : "border: 1px solid #d9d9d9; border-top-color: #c0c0c0;")); add(".dvdlg .shadv", "margin-top: 12px;"); add(".dvdlg .shadv a", "color: " + (mdlg ? "#4285f4" : "#15c") + "; text-decoration: none;"); // a picture, large add(".dvprev", "position: fixed; inset: 0; z-index: 85; background: rgba(0,0,0,.85); display: flex; flex-direction: column;"); add(".dvprev .pbar", "display: flex; align-items: center; gap: 12px; height: 56px; padding: 0 16px; color: #fff; background: rgba(0,0,0,.6); font: 14px " + f + ";"); add(".dvprev .pbar a", "color: #fff; text-decoration: none; display: inline-flex; align-items: center;" + (material ? "" : " border: 1px solid #777; padding: 4px 10px; border-radius: 2px; font: bold 11px Arial, sans-serif;")); add(".dvprev .pn", "display: flex; align-items: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".dvprev .pimg", "flex: 1; display: flex; align-items: center; justify-content: center; min-height: 0; padding: 16px;"); add(".dvprev .pimg img", "max-width: 100%; max-height: 100%; box-shadow: 0 4px 16px rgba(0,0,0,.5); background: #fff;"); // ---- the Docs list: 2007-2008 add(".toplinks", "display: flex; justify-content: space-between; padding: 3px 8px 0; height: 24px; font-size: 13px; flex: 0 0 auto;"); add(".toplinks .left > *", "margin-right: 8px;"); add(".toplinks a", "color: #00c;"); add(".toplinks .more small", "font-size: 9px;"); if (classic) { add(".hdr", "display: flex; align-items: center; gap: 10px; padding: 8px 8px 10px; flex: 0 0 auto;"); add(".hdr .logo img", "display: block;"); add(".srch input", "width: 290px; height: 22px; font-size: 13px; padding: 1px 3px; border: 1px solid; border-color: #999 #ccc #ccc #999;"); add(".srch button", "margin-left: 5px; font-size: 13px; padding: 2px 6px;"); add(".srch .opts, .srch .tpl", "margin-left: 8px; font-size: 11px; color: #00c;"); add(".star", "background: url(" + (era === "dl10" ? A.sprite_doclist2011 : A.sprite_doclist2008) + ") no-repeat -304px 0; cursor: pointer;"); add(".star.on", "background-position: -240px 0;"); add(".nav .ni, .nav .grp, .nav .in", "padding: 3px 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".nav .ni.sel", "font-weight: bold;"); add(".nav .in", "padding-left: 22px;"); add(".nav .in.none", "color: #777;"); add(".nav .grp", "margin-top: 8px; color: #000;"); add(".quota", "margin-top: auto; padding: 10px 6px; color: #666; font-size: 11px;"); add(".mhead", "font-size: 14px; padding: 5px 8px;"); add(".mhead .cr[data-go], .mhead .cr[data-folder]", "color: #00c; text-decoration: underline;"); } if (era === "dl07") { add(".hdr .logo img", "height: 55px;"); add(".bar", "display: flex; gap: 22px; align-items: center; margin: 0 10px; height: 33px; padding: 0 12px; background: linear-gradient(#78aee4, #4a8bd0); color: #fff; font-size: 14px; border-radius: 4px 4px 0 0; flex: 0 0 auto;"); add(".bar > span, .bar .tool span", "color: #fff; cursor: pointer;"); add(".bar .tool", "display: flex; gap: 22px;"); add(".bar .dd.open", "text-decoration: underline;"); add(".body", "margin: 0 10px; border: 1px solid #a9c4e8; border-top: 0;"); add(".side", "width: 210px; background: #fff; border-right: 3px solid #c3d9ff; padding: 4px 0; font-size: 13px;"); add(".nav .ni, .nav .grp", "padding: 3px 10px;"); add(".nav .in", "padding-left: 30px;"); add(".nav .ni.sel", "background: #c3d9ff;"); add("table.list thead th", "background: #e8eef7; border-bottom: 1px solid #c3d9ff; height: 24px; font-weight: bold; color: #333; padding: 0 4px;"); add("table.list td", "height: 23px; border-bottom: 1px solid #eee; padding: 0 4px;"); add("table.list td.nm a", "color: #000; font-weight: bold;"); add("table.list td.fs, table.list td.dt", "color: #666;"); add("tr.hl td", "background: #ffc;"); add(".foot", "display: flex; justify-content: space-between; margin: 0 10px 6px; padding: 4px 8px; background: #e8eef7; font-size: 13px; flex: 0 0 auto;"); add(".foot a", "color: #00c;"); } if (era === "dl09" || era === "dl10") { add(".side", "width: " + (era === "dl09" ? "190" : "200") + "px; padding: 0 0 0 8px; font-size: 13px;"); add(".btns", "display: flex; gap: 6px; margin: 2px 0 10px;"); add(".gbtn", era === "dl09" ? "display: inline-block; padding: 2px 8px; border: 1px solid; border-color: #bbb #999 #999 #bbb; border-radius: 2px; background: linear-gradient(#fff, #ddd); color: #000; font-size: 13px; white-space: nowrap;" : "display: inline-block; padding: 3px 8px; border: 1px solid #bbb; border-radius: 2px; background: linear-gradient(#f9f9f9, #eee 60%, #e3e3e3); color: #222; font: bold 13px Arial, sans-serif; white-space: nowrap;"); add(".gbtn:hover, .gbtn.open", "border-color: #888;"); add(".nav .ni.sel", "background: " + (era === "dl09" ? "#c3d9ff" : "#e0ecff") + ";"); add(".main", era === "dl09" ? "margin: 0 8px; border: 1px solid #c3d9ff;" : "margin: 0 8px 0 4px;"); add(".mhead", era === "dl09" ? "background: #c3d9ff;" : "font-size: 18px; padding: 2px 4px 6px;"); add(".acts", "display: flex; gap: 4px; padding: 5px 6px; " + (era === "dl09" ? "background: #e8eef7; border-bottom: 1px solid #c3d9ff;" : "background: #c3d9ff;")); add("table.list thead th", "height: 24px; color: #666; font-size: 12px; padding: 0 4px; border-bottom: 1px solid #ddd;"); add("table.list td", "height: 24px; border-bottom: 1px solid #eee; padding: 0 4px;"); add("table.list td.nm a", "color: #000;"); add("table.list td.fs, table.list td.ow, table.list td.dt", "color: #666; font-size: 12px;"); add("tr.hl td", "background: " + (era === "dl09" ? "#e8eef7" : "#ffc") + ";"); } if (era === "dl10") { add(".hdr .logo.g10", "display: flex; align-items: flex-end; text-decoration: none;"); add(".hdr .logo.g10 img", "height: 40px; width: auto;"); add(".hdr .logo.g10 .dw", "font: 26px Arial, sans-serif; color: #3a66cc; margin: 0 0 3px 3px; line-height: 1;"); } // ---- Kennedy: the Docs list of late 2011 and the first Drive if (kennedy) { add(".khead", "display: flex; align-items: center; height: 72px; padding: 0 16px 0 20px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto;"); add(".glogo img", "display: block; width: 117px; height: 44px;"); add(".ksrch", "margin-left: 78px;"); add(".ksrch input", "width: 460px; max-width: 40vw; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 0 8px; font-size: 13px; background: #fff; outline: none;"); add(".ksrch input:focus", "border-color: #4d90fe;"); add(".kbtn", "display: inline-flex; align-items: center; justify-content: center; height: 29px; min-width: 54px; padding: 0 8px; margin-right: 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif; cursor: default; white-space: nowrap;"); add(".kbtn:hover, .kbtn.open", "border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); color: #222;"); add(".kbtn.ico", "min-width: 42px;"); add(".kbtn.ico svg", "fill: #666;"); add(".kbtn.blue", "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff; margin: 0 0 0 8px; width: 72px;"); add(".kbtn.blue svg", "fill: #fff;"); add(".kbtn.red", "background: linear-gradient(#dd4b39, #d14836); border-color: #c6322a; color: #fff; min-width: 0; padding: 0 12px;"); add(".kbtn.red svg", "fill: #fff; transform: rotate(180deg);"); add(".kbtn.red.up", "padding: 0 6px; margin-right: 0;"); add(".ktool", "display: flex; align-items: center; height: 57px; padding: 0 16px 0 0; border-bottom: 1px solid #ebebeb; flex: 0 0 auto;"); add(".ktool .app", "width: 214px; flex: 0 0 214px; padding-left: 20px; font-size: 20px; color: #dd4b39;"); add(".ktool .crumb", "font-size: 18px; color: #222; margin-right: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 40%;"); add(".ktool .crumb .cr[data-go], .ktool .crumb .cr[data-folder]", "color: #666;"); add(".ktool .crumb .cr[data-go]:hover, .ktool .crumb .cr[data-folder]:hover", "text-decoration: underline;"); add(".ktool .tool", "display: flex;"); add(".side", "width: 214px; padding: 16px 0 0 0;"); add(".btns", "display: flex; padding-left: 20px; margin-bottom: 16px;"); add(".nav .ni", "padding: 0 8px 0 20px; line-height: 24px; color: #222; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".nav .ni:hover", "background: #eee;"); add(".nav .ni.sel", "color: #dd4b39; font-weight: bold;"); add(".nav .ni.sub", "padding-left: 36px; font-weight: normal; color: #222;"); add(".nav .ni.sub.open", "font-weight: bold;"); add(".nav .grp", "padding-left: " + (era === "dl11" ? "8px" : "20px") + "; margin-top: 8px; line-height: 24px; color: #222;"); add(".nav .in", "padding: 0 8px 0 28px; line-height: 24px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"); add(".nav .in.none", "color: #999;"); add(".nav .in.sel", "color: #dd4b39; font-weight: bold;"); add(".quota", "margin-top: auto; padding: 16px 20px; color: #666; font-size: 11px;"); add(".quota a", "color: #15c; text-decoration: none;"); add(".main", "padding: 0 16px 0 0;"); add("table.list thead th", "height: 34px; color: #666; font-size: 13px; padding: 0 4px; border-bottom: 1px solid #ebebeb;" + (era === "dv12" ? " font-size: 11px; font-weight: bold;" : "")); add("table.list thead th.on", "color: #dd4b39;"); add("table.list td", "height: " + (era === "dv12" ? "30" : "34") + "px; border-bottom: 1px solid #ebebeb; padding: 0 4px;"); add("table.list td.nm a", "color: #222;"); add("table.list td.nm a:hover", "text-decoration: underline;"); add("table.list td.ow, table.list td.dt", "color: #222;"); add(".star", "opacity: .35; background: url(" + A.sprite_jfk + ") no-repeat 0 -672px; width: 21px; height: 21px; cursor: pointer;"); add(".star.on", "opacity: 1; filter: sepia(1) saturate(8) hue-rotate(5deg);"); add("tr[data-id]:hover td", "background: #f5f5f5;"); add("tr.hl td, tr.hl:hover td", "background: #ffc;"); // the grid of the first Drive add(".gview", "padding: 12px 0;"); add(".gsec", "font: bold 11px Arial, sans-serif; color: #666; padding: 8px 0;"); add(".gfold, .gfiles", "display: flex; flex-wrap: wrap; gap: 12px;"); add(".gf", "display: flex; align-items: center; gap: 6px; width: 190px; height: 34px; padding: 0 10px; border: 1px solid #ebebeb; white-space: nowrap; overflow: hidden;"); add(".gc", "width: 190px; border: 1px solid #ebebeb;"); add(".gc .th", "height: 130px; background: #f5f5f5; display: flex; align-items: center; justify-content: center; overflow: hidden;"); add(".gc .th img", "max-width: 100%;"); add(".gc .th img.fb", "width: 32px; height: 32px;"); add(".gc .ft", "display: flex; align-items: center; padding: 6px 8px; white-space: nowrap; overflow: hidden;"); add(".gf.on, .gc.on", "background: #ffc; border-color: #f0c36d;"); add(".n", "overflow: hidden; text-overflow: ellipsis;"); } // ---- Drive from June 2014 if (material) { const sel = gm ? "#e8f0fe" : "#e3edfd"; const selText = gm ? "#1967d2" : "#202124"; add(".ib", "display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; color: #5f6368; border-radius: " + (gm ? "50%" : "0") + ";"); add(".ib:hover, .ib.open", "background: rgba(60,64,67,.08);"); add(".side", "width: " + (gm ? "256px" : "240px") + "; padding: " + (gm ? "8px 0" : "16px 0") + ";"); add(".btns", "padding: " + (gm ? "8px 0 16px 8px" : "0 16px 20px 24px") + ";"); add(".nbtn", gm ? "display: inline-flex; align-items: center; gap: 12px; height: 48px; padding: 0 24px 0 12px; border-radius: 24px; background: #fff; color: #3c4043; font: 500 14px 'Google Sans', Roboto, sans-serif; box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15);" : "display: inline-flex; align-items: center; justify-content: center; height: 36px; min-width: 96px; padding: 0 16px; border-radius: 2px; background: " + (era === "dv14" ? "#4285f4" : "#2196f3") + "; color: #fff; font: 500 14px Roboto, sans-serif; letter-spacing: .5px; box-shadow: 0 2px 2px rgba(0,0,0,.24);"); add(".nbtn:hover, .nbtn.open", gm ? "background: #f8f9fa; box-shadow: 0 1px 3px 0 rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15);" : "box-shadow: 0 4px 8px rgba(0,0,0,.28);"); add(".nbtn .mi svg", "width: 36px; height: 36px; fill: #1a73e8;"); add(".nav .ni", "display: flex; align-items: center; gap: " + (gm ? "18px" : "20px") + "; height: " + (gm ? "40px" : "40px") + "; padding: 0 16px 0 24px; color: #202124; font-size: 14px; white-space: nowrap; overflow: hidden;" + (gm ? " border-radius: 0 20px 20px 0; margin-right: 12px;" : "")); add(".nav .ni .mi", "color: #5f6368;"); add(".nav .ni:hover", "background: " + (gm ? "#f1f3f4" : "#f5f5f5") + ";"); add(".nav .ni.sel", "background: " + (gm ? sel : era === "dv14" ? "#eee" : "#eee") + "; color: " + (gm ? selText : era === "dv14" ? "#4285f4" : "#212121") + "; font-weight: " + (gm ? "500" : era === "dv17" ? "500" : "normal") + ";"); add(".nav .ni.sel .mi", gm ? "color: #1967d2;" : era === "dv14" ? "color: #4285f4;" : ""); add(".nav .tree", "margin: 0 0 4px;"); add(".nav .ni.sub", "height: 32px; padding-left: 52px; font-size: 13px; gap: 12px;"); add(".nav .ni.sub.open", "font-weight: 500;"); add(".quota", "margin-top: auto; padding: 16px 24px; color: #5f6368; font-size: 13px; border-top: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";"); add(".qbar", "height: 4px; background: #e0e0e0; margin-bottom: 8px;" + (gm ? " border-radius: 2px; overflow: hidden;" : "")); add(".qbar i", "display: block; height: 100%; background: " + (gm ? "#1a73e8" : "#4285f4") + "; width: 0;"); add(".qup", "display: inline-block; margin-top: 10px; color: " + (gm ? "#1a73e8" : "#4285f4") + "; text-decoration: none; font-weight: 500;" + (gm ? " border: 1px solid #dadce0; border-radius: 4px; padding: 8px 16px;" : "")); add(".dbar", "display: flex; align-items: center; flex: 0 0 auto; height: " + (era === "dv14" ? "56px" : "56px") + "; padding: 0 16px 0 0; border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";"); add(".dbar .app", "width: 240px; flex: 0 0 240px; padding-left: 24px; font: 20px " + f + "; color: #666;"); add(".crumb", "display: flex; align-items: center; min-width: 0; white-space: nowrap; overflow: hidden; font: " + (gm ? "400 18px 'Google Sans', Roboto" : "18px Roboto") + ", sans-serif; color: #5f6368;"); add(".crumb .cr", "display: inline-flex; align-items: center; padding: 4px 8px; overflow: hidden; text-overflow: ellipsis;" + (gm ? " border-radius: 4px;" : "")); add(".crumb .cr:hover", "background: rgba(60,64,67,.08);"); add(".crumb .cr.last", "color: #202124;"); add(".crumb .sep", "display: inline-flex; color: #5f6368;"); add(".tool", "display: flex; align-items: center;"); add(".main", "background: #fff;"); add(".list", "padding: 0 " + (gm ? "16px" : "24px") + " 80px 0;"); // the list add(".lhead, .lrow", "display: flex; align-items: center; height: 48px; border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + "; font-size: 13px; color: #202124; cursor: default;"); add(".lhead", "height: 48px; color: #5f6368; font-weight: 500; position: sticky; top: 0; background: #fff; z-index: 1;"); add(".lhead .mi svg", "width: 16px; height: 16px;"); add(".lhead .c", "display: flex; align-items: center; gap: 4px;"); add(".c", "white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding-right: 12px;"); add(".c.nm", "flex: 1; min-width: 0; display: flex; align-items: center; padding-left: 16px; font-weight: 500;"); add(".lhead .c.nm", "padding-left: 16px;"); add(".c.nm .fi", "margin-right: 16px;"); add(".c.nm .n", "overflow: hidden; text-overflow: ellipsis;"); add(".c.ow", "width: 150px; color: #5f6368;"); add(".c.dt", "width: 170px; color: #5f6368;"); add(".c.sz", "width: 100px; color: #5f6368;"); add(".shr", "display: inline-flex; color: #5f6368; margin-left: 8px; flex: 0 0 auto;"); add(".lrow:hover", "background: " + (gm ? "#f1f3f4" : "#f5f5f5") + ";"); add(".lrow.on", "background: " + sel + "; color: " + selText + ";"); add(".lrow.on .c", gm ? "color: #1967d2;" : ""); // the grid add(".gview", "padding: 8px 0 0 0;"); add(".gsec", "font-size: 14px; font-weight: 500; color: #202124; padding: 16px 0 12px;"); add(".gfold", "display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px;"); add(".gf", "display: flex; align-items: center; gap: 16px; height: 48px; padding: 0 16px; color: #202124; font-weight: 500; white-space: nowrap; overflow: hidden; " + (gm ? "border: 1px solid #dadce0; border-radius: 8px;" : "box-shadow: 0 1px 2px rgba(0,0,0,.2);")); add(".gf .mi", "color: #5f6368;"); add(".gfiles", "display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px;"); add(".gc", "display: flex; flex-direction: column; height: 200px; overflow: hidden; " + (gm ? "border: 1px solid #dadce0; border-radius: 8px;" : "box-shadow: 0 1px 2px rgba(0,0,0,.2);")); add(".gc .th", "flex: 1; min-height: 0; background: #f1f3f4; display: flex; align-items: center; justify-content: center; overflow: hidden;"); add(".gc .th img", "width: 100%; height: 100%; object-fit: cover; object-position: top;"); add(".gc .th img.fb", "width: 48px; height: 48px; object-fit: contain;"); add(".gc .ft", "display: flex; align-items: center; height: 48px; padding: 0 16px; font-weight: 500; color: #202124; white-space: nowrap; overflow: hidden; border-top: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";"); add(".gc .ft .fi", "margin-right: 12px;"); add(".n", "overflow: hidden; text-overflow: ellipsis;"); add(".gf.on, .gc.on", "background: " + sel + "; color: " + selText + ";" + (gm ? " border-color: " + sel + ";" : " box-shadow: 0 0 0 2px #4285f4;")); add(".empty", "padding: 60px 24px; text-align: center; color: #5f6368; font-size: 16px;"); } if (era === "dv14") { add(".gtop", "display: flex; align-items: center; height: 60px; padding: 0 16px 0 24px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto;"); add(".gtop .glogo img", "display: block; height: 30px; width: auto;"); add(".gsrch", "margin-left: 40px; flex: 0 1 560px; display: flex;"); add(".gsrch input", "flex: 1; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; padding: 0 8px; font: 16px Arial, sans-serif; outline: none; background: #fff; color: #222;"); add(".gsrch input:focus", "border-color: #4d90fe;"); add(".gsrch .gbtn", "width: 60px; height: 29px; border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; border-radius: 0 2px 2px 0;"); add(".gsrch .gbtn svg", "fill: #fff;"); add(".gtop .kcorner", "margin-left: auto;"); add(".dbar", "background: #fff;"); add(".dbar .crumb", "margin-left: 0;"); } if (era === "dv17" || era === "dv19") { add(".appbar", "display: flex; align-items: center; height: 64px; padding: 0 8px 0 " + (gm ? "8px" : "16px") + "; border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + "; flex: 0 0 auto; background: #fff;"); add(".brand", "display: flex; align-items: center; gap: " + (gm ? "8px" : "12px") + "; width: " + (gm ? "238px" : "224px") + "; padding-left: " + (gm ? "8px" : "0") + "; text-decoration: none; color: #5f6368; font: 22px " + (gm ? "'Product Sans', 'Google Sans', Arial" : "Roboto, Arial") + ", sans-serif;"); add(".brand img", "width: 40px; height: 40px;"); add(".msrch", "position: relative; flex: 0 1 720px;"); add(".msrch input", "width: 100%; height: " + (gm ? "48px" : "46px") + "; border: 0; border-radius: " + (gm ? "8px" : "2px") + "; padding: 0 16px 0 60px; font: 16px " + f + "; outline: none; background: " + (gm ? "#f1f3f4" : "#f1f1f1") + "; color: #202124;"); add(".msrch input:focus", "background: #fff; box-shadow: 0 1px 1px 0 rgba(65,69,73,.3), 0 1px 3px 1px rgba(65,69,73,.15);"); add(".msrch .sic", "position: absolute; left: 6px; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border: 0; background: none; color: #5f6368; cursor: pointer;" + (gm ? " border-radius: 50%;" : "")); add(".appbar .corner", "display: flex; align-items: center; margin-left: 4px;"); add(".main .dbar", "padding-left: 8px;"); } return c; } // ---- Drive: a file's own page (drive.google.com/file/d/.../view) ------------------------ // PDFs (and pictures) are shown in the viewer of the period: the file is downloaded the // way Download does it, and drawn page by page with PDF.js. Anything else, or anything // that cannot be read, is left to Google's page. function ugfDvFileId() { const m = (window.location.pathname || "").match(/^\/file(?:\/u\/\d+)?\/d\/([\w-]{10,})\/(view|edit)\b/); return m ? m[1] : ""; } function ugfDvViewerGiveUp(why) { console.log("[Gplex] Drive viewer: left to Google (" + why + ")"); const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } const v = document.getElementById("ugf-dvv"); if (v) { v.remove(); } document.documentElement.removeAttribute("gplex-dvv"); } // the file's bytes, as Download gives them (on to Google's download host if need be) function ugfDvFetchFile(id, onDone) { const q = new URLSearchParams(window.location.search); const rk = q.get("resourcekey"); const au = q.get("authuser") || ((window.location.pathname || "").match(/\/u\/(\d+)\//) || [])[1] || "0"; const url = "https://drive.google.com/uc?id=" + encodeURIComponent(id) + "&export=download&authuser=" + au + (rk ? "&resourcekey=" + encodeURIComponent(rk) : ""); const okType = function(ct) { return !ct || /pdf|image\/|octet-stream|binary/i.test(ct); }; if (typeof GM_xmlhttpRequest === "function") { let aborted = false; const req = GM_xmlhttpRequest({ method: "GET", url: url, responseType: "arraybuffer", timeout: 120000, onreadystatechange: function(r) { if (r.readyState === 2 && !aborted) { const h = String(r.responseHeaders || ""); const ct = (h.match(/content-type:\s*([^\r\n;]+)/i) || [])[1] || ""; const len = +((h.match(/content-length:\s*(\d+)/i) || [])[1] || 0); if (!okType(ct) || len > 200 * 1024 * 1024) { aborted = true; try { req.abort(); } catch (e) {} onDone(null, !okType(ct) ? "type " + ct : "too large"); } } }, onload: function(r) { if (!aborted) { onDone(r.status < 400 ? r.response : null, "status " + r.status); } }, onerror: function() { if (!aborted) { onDone(null, "network"); } }, ontimeout: function() { if (!aborted) { onDone(null, "timeout"); } } }); return; } fetch(url, { credentials: "include" }).then(function(r) { return r.ok && okType(r.headers.get("content-type")) ? r.arrayBuffer() : null; }).then(function(b) { onDone(b, "fetch"); }, function() { onDone(null, "fetch failed"); }); } function ugfDvSniff(buf) { const b = new Uint8Array(buf, 0, Math.min(16, buf.byteLength)); const s = String.fromCharCode.apply(null, b); if (s.indexOf("%PDF-") > -1 || String.fromCharCode.apply(null, new Uint8Array(buf, 0, Math.min(1024, buf.byteLength))).indexOf("%PDF-") > -1) { return "pdf"; } if (b[0] === 0x89 && s.slice(1, 4) === "PNG") { return "image/png"; } if (b[0] === 0xff && b[1] === 0xd8) { return "image/jpeg"; } if (s.slice(0, 3) === "GIF") { return "image/gif"; } if (s.slice(0, 4) === "RIFF" && s.slice(8, 12) === "WEBP") { return "image/webp"; } return ""; } function ugfDvViewer(era) { const id = ugfDvFileId(); const A = ugfDocsArt(); const esc = ugfDocsEsc; const ic = ugfFeIcon; const l = String(layout || ""); const kennedy = era === "dl11"; const dark = era === "dv12" || era === "dv14" || era === "dv17" || era === "dv19"; const gm = era === "dv19"; const classic = era === "dl07" || era === "dl09" || era === "dl10"; const html = document.documentElement; const nameNow = function() { return String(document.title || "").replace(/\s*-\s*Google Drive\s*$/, "").trim() || "Untitled"; }; html.setAttribute("gplex-dvv", era); const style = document.createElement("style"); style.id = "ugf-dvv-styles"; style.textContent = ugfDvViewerCss(era, A).join("\n"); (document.head || document.documentElement).appendChild(style); const box = document.createElement("div"); box.id = "ugf-dvv"; box.setAttribute("era", era); box.setAttribute("tabindex", "-1"); document.body.appendChild(box); const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } const fav = { dl07: A.fav2007, dl09: A.fav2008, dl10: A.fav2010, dl11: A.fav2011, dv12: A.dvFav2012, dv14: A.dvFav2014, dv17: A.dvFav2017, dv19: l === "2022" ? A.dvFav2020 : A.dvFav2017 }[era]; ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); const st = { name: nameNow(), kind: "", bytes: null, pdf: null, pages: [], zoom: 0, fit: 1, cur: 1 }; const back = ugfDvBase() + "/my-drive"; const kindIcon = function() { const k = st.kind === "pdf" ? "pdf" : "image"; return ''; }; // ---- the frame of the period const draw = function() { let h = ""; const pageBox = '' + (classic ? "Page " : "") + ' ' + (classic ? "of" : "/") + ' ?'; if (classic) { h = '
' + kindIcon() + "" + esc(st.name) + "
" + 'Download original
' + '
−+' + pageBox + 'PrintBack to Docs
'; } else if (kennedy) { h = '
' + kindIcon() + "" + esc(st.name) + "
" + '−+' + pageBox + 'PrintDownload
'; } else if (era === "dv12") { h = '
×
' + kindIcon() + "" + esc(st.name) + "
" + '' + ic("print", 18) + '' + ic("file_download", 18) + "
"; } else { h = '
' + ic(gm ? "close" : "arrow_back", 24) + '
' + kindIcon() + "" + esc(st.name) + "
" + '' + '' + ic("print", 24) + '' + ic("file_download", 24) + "
"; } h += '
Loading...
'; if (dark) { h += '
' + ic("remove", 20) + '' + ic("zoom_in", 20) + '' + ic("add", 20) + '
' + pageBox + "
"; } box.innerHTML = trusted_policy.createHTML(h); // Google's own "Open with Google Docs" stays usable, from here setTimeout(function() { const o = ugfDvButton(document, /^Open with Google Docs$/i); const mine = box.querySelector(".vopen"); if (o && mine) { mine.hidden = false; mine.addEventListener("click", function() { ugfDvPress(o); }); } }, 1500); }; const msg = function(t) { const p = box.querySelector(".vpages"); if (p) { p.innerHTML = trusted_policy.createHTML('
' + esc(t) + "
"); } }; // ---- drawing the pages const scroller = function() { return box.querySelector(".vbody"); }; const scaleNow = function() { return st.fit * (st.zoom ? Math.pow(1.25, st.zoom) : 1); }; let io = null; const renderPage = function(pg) { if (pg.done === scaleNow() || pg.busy) { return; } pg.busy = true; const sc = scaleNow(); const dpr = Math.min(3, window.devicePixelRatio || 1); st.pdf.getPage(pg.n).then(function(page) { const vp = page.getViewport({ scale: sc * dpr }); const c = document.createElement("canvas"); c.width = Math.floor(vp.width); c.height = Math.floor(vp.height); c.style.width = Math.floor(vp.width / dpr) + "px"; c.style.height = Math.floor(vp.height / dpr) + "px"; return page.render({ canvasContext: c.getContext("2d"), viewport: vp }).promise.then(function() { pg.el.innerHTML = ugfTT(""); pg.el.appendChild(c); pg.done = sc; pg.busy = false; if (pg.done !== scaleNow()) { renderPage(pg); } }); }).catch(function(e) { pg.busy = false; console.log("[Gplex] Drive viewer: page " + pg.n + ": " + e); }); }; const layoutPages = function() { const sc = scaleNow(); st.pages.forEach(function(pg) { pg.el.style.width = Math.floor(pg.w * sc) + "px"; pg.el.style.height = Math.floor(pg.h * sc) + "px"; }); if (io) { io.disconnect(); st.pages.forEach(function(pg) { io.observe(pg.el); }); } }; const showPdf = function() { const lib = typeof pdfjsLib !== "undefined" ? pdfjsLib : (globalThis["pdfjs-dist/build/pdf"] || null); if (!lib) { ugfDvViewerGiveUp("PDF.js is not loaded"); return; } lib.getDocument({ data: new Uint8Array(st.bytes.slice(0)), isEvalSupported: false }).promise.then(function(pdf) { st.pdf = pdf; const wrap = box.querySelector(".vpages"); wrap.innerHTML = ugfTT(""); box.querySelectorAll(".vpt").forEach(function(e) { e.textContent = pdf.numPages; }); const jobs = []; for (let n = 1; n <= pdf.numPages; n++) { jobs.push(n); } // every page's size first (from page 1 for the rest, then corrected) return pdf.getPage(1).then(function(p1) { const v1 = p1.getViewport({ scale: 1 }); const avail = Math.max(300, scroller().clientWidth - (dark ? 160 : 60)); st.fit = Math.min(1.25, avail / v1.width); jobs.forEach(function(n) { const el = document.createElement("div"); el.className = "vpg"; el.setAttribute("data-n", n); wrap.appendChild(el); st.pages.push({ n: n, el: el, w: v1.width, h: v1.height, done: 0 }); }); io = new IntersectionObserver(function(ents) { ents.forEach(function(en) { if (en.isIntersecting) { const pg = st.pages[+en.target.getAttribute("data-n") - 1]; if (pg) { renderPage(pg); } } }); }, { root: scroller(), rootMargin: "600px 0px" }); layoutPages(); // the true size of each page, as it comes jobs.slice(1).forEach(function(n) { pdf.getPage(n).then(function(pp) { const v = pp.getViewport({ scale: 1 }); const pg = st.pages[n - 1]; if (v.width !== pg.w || v.height !== pg.h) { pg.w = v.width; pg.h = v.height; pg.done = 0; layoutPages(); } }); }); }); }).catch(function(e) { console.log("[Gplex] Drive viewer: " + e); ugfDvViewerGiveUp("PDF.js could not read it"); }); }; const showImage = function(type) { const url = URL.createObjectURL(new Blob([st.bytes], { type: type })); const wrap = box.querySelector(".vpages"); wrap.innerHTML = trusted_policy.createHTML('
'); const img = wrap.querySelector("img"); img.onload = function() { st.pages = [{ n: 1, el: wrap.querySelector(".vpg"), w: img.naturalWidth, h: img.naturalHeight, img: true }]; st.fit = Math.min(1, Math.max(300, scroller().clientWidth - 160) / img.naturalWidth, Math.max(200, scroller().clientHeight - 80) / img.naturalHeight); layoutImg(); }; img.src = url; box.querySelectorAll(".vpt").forEach(function(e) { e.textContent = "1"; }); }; const layoutImg = function() { const pg = st.pages[0]; if (!pg) { return; } const sc = scaleNow(); const img = pg.el.querySelector("img"); img.style.width = Math.floor(pg.w * sc) + "px"; img.style.height = Math.floor(pg.h * sc) + "px"; }; const zoom = function(d) { st.zoom = Math.max(-4, Math.min(6, st.zoom + d)); if (st.kind === "pdf") { layoutPages(); } else { layoutImg(); } }; // ---- the buttons const download = function() { if (!st.bytes) { return; } const a = document.createElement("a"); a.href = URL.createObjectURL(new Blob([st.bytes], { type: st.kind === "pdf" ? "application/pdf" : st.kind })); a.download = st.name; document.body.appendChild(a); a.click(); setTimeout(function() { a.remove(); }, 1000); }; const print = function() { // every page drawn first, then the browser's own printing of just the pages if (st.kind === "pdf") { const waitAll = function(tries) { const todo = st.pages.filter(function(pg) { return pg.done !== scaleNow(); }); todo.slice(0, 4).forEach(renderPage); if (todo.length && tries < 600) { setTimeout(function() { waitAll(tries + 1); }, 100); } else { window.print(); } }; waitAll(0); } else { window.print(); } }; box.addEventListener("click", function(ev) { const t = ev.target; const z = t.closest("[data-z]"); if (z) { ev.preventDefault(); zoom(+z.getAttribute("data-z")); return; } if (t.closest(".zi")) { st.zoom = 0; zoom(0); return; } if (t.closest(".vdl")) { ev.preventDefault(); download(); return; } if (t.closest(".vprint")) { ev.preventDefault(); print(); return; } const x = t.closest(".vx, .vback, .vlogo"); if (x && window.history.length > 1 && document.referrer && /^https:\/\/drive\.google\.com\//.test(document.referrer)) { ev.preventDefault(); window.history.back(); } }); box.addEventListener("keydown", function(ev) { ev.stopPropagation(); if (ev.target.classList && ev.target.classList.contains("vpin")) { if (ev.key === "Enter") { const n = Math.max(1, Math.min(st.pages.length, parseInt(ev.target.value, 10) || 1)); const pg = st.pages[n - 1]; if (pg) { pg.el.scrollIntoView({ block: "start" }); } } return; } if (ev.key === "+" || ev.key === "=") { zoom(1); } else if (ev.key === "-") { zoom(-1); } }); box.addEventListener("scroll", function() { const sc = scroller(); if (!sc || !st.pages.length) { return; } const mid = sc.getBoundingClientRect().top + sc.clientHeight / 3; let cur = 1; st.pages.forEach(function(pg) { if (pg.el.getBoundingClientRect().top <= mid) { cur = pg.n; } }); if (cur !== st.cur) { st.cur = cur; box.querySelectorAll(".vpin").forEach(function(i) { if (document.activeElement !== i) { i.value = cur; } }); } }, true); draw(); box.focus(); // the name: Google's page names it in its title let named = st.name; setInterval(function() { const n = nameNow(); if (n && n !== named && !/^Google Drive$/i.test(n)) { named = n; st.name = n; box.querySelectorAll(".vname b, .vname span").forEach(function(e) { e.textContent = n; }); } }, 1000); ugfDvFetchFile(id, function(buf, why) { if (!buf || !buf.byteLength) { ugfDvViewerGiveUp("download: " + why); return; } const k = ugfDvSniff(buf); if (!k) { ugfDvViewerGiveUp("not a PDF or picture"); return; } st.bytes = buf; st.kind = k; const fi = box.querySelector(".vfi"); if (fi) { fi.src = ugfDvIcon(k === "pdf" ? "pdf" : "image", dark && era !== "dv12" ? "mt" : era); } msg("Loading..."); if (k === "pdf") { showPdf(); } else { showImage(k); } }); } function ugfDvViewerCss(era, A) { const V = "#ugf-dvv"; const c = []; const add = function(sel, body) { c.push(sel.split(",").map(function(s) { return V + " " + s.trim(); }).join(", ") + " { " + body + " }"); }; const dark = era === "dv12" || era === "dv14" || era === "dv17" || era === "dv19"; const gm = era === "dv19"; const kennedy = era === "dl11"; const classic = !dark && !kennedy; const f = gm ? "'Google Sans', Roboto, Arial, sans-serif" : (era === "dv14" || era === "dv17") ? "Roboto, Arial, sans-serif" : "Arial, sans-serif"; c.push("html[gplex-dvv], html[gplex-dvv] body { overflow: hidden !important; }"); c.push(V + " { position: fixed; inset: 0; z-index: 2147483000; display: flex; flex-direction: column; font: 13px " + f + "; text-align: left; outline: none; background: " + (dark ? (era === "dv12" ? "#202020" : "#333") : classic ? "#ebebeb" : "#f1f1f1") + "; color: " + (dark ? "#fff" : "#222") + "; }"); c.push("@media print { html[gplex-dvv] body > *:not(#ugf-dvv) { display: none !important; } html[gplex-dvv], html[gplex-dvv] body { overflow: visible !important; background: #fff !important; } " + V + " { position: static !important; display: block !important; background: #fff !important; } " + V + " .vtop, " + V + " .vtool, " + V + " .vzoom, " + V + " .vpageind { display: none !important; } " + V + " .vbody { overflow: visible !important; padding: 0 !important; } " + V + " .vpg { box-shadow: none !important; margin: 0 auto !important; break-after: page; } }"); add("*", "box-sizing: border-box;"); add(".mi", "display: inline-flex; font-style: normal;"); add(".mi svg", "display: block; fill: currentColor;"); add(".sp", "flex: 1;"); add("[hidden]", "display: none !important;"); add(".vtop", "display: flex; align-items: center; gap: 10px; flex: 0 0 auto;"); add(".vname", "display: flex; align-items: center; gap: 8px; min-width: 0; white-space: nowrap; overflow: hidden;"); add(".vname b, .vname span", "overflow: hidden; text-overflow: ellipsis;"); add(".vfi", "width: 16px; height: 16px; flex: 0 0 16px;"); add(".vbody", "flex: 1; overflow: auto; min-height: 0; position: relative; padding: " + (dark ? "24px 0 90px" : "16px 0 40px") + ";"); add(".vpages", "display: flex; flex-direction: column; align-items: center; gap: " + (dark ? "16px" : "12px") + ";"); add(".vpg", "background: #fff; flex: 0 0 auto; " + (dark ? "box-shadow: 0 2px 8px rgba(0,0,0,.5);" : "border: 1px solid #c6c6c6; box-shadow: 0 1px 3px rgba(0,0,0,.2);")); add(".vpg canvas", "display: block;"); add(".vpg.vimg", "background: transparent; border: 0; box-shadow: none;"); add(".vpg.vimg img", "display: block; box-shadow: 0 2px 8px rgba(0,0,0,.4);"); add(".vmsg", "padding: 60px 0; color: " + (dark ? "#ccc" : "#666") + "; font-size: 14px;"); add(".vpin", "width: 36px; text-align: center; font: inherit; padding: 1px 2px; " + (dark ? "background: rgba(0,0,0,.4); color: #fff; border: 1px solid #777;" : "border: 1px solid #bbb;")); add(".vpgn", "display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;"); if (classic) { add(".vtop", "height: 50px; padding: 0 12px; background: #fff; border-bottom: 1px solid #c9d7f1;"); add(".vlogo img", "display: block; height: " + (era === "dl07" ? "40px" : "auto") + ";"); add(".vname", "font-size: 16px; margin-left: 10px;"); add(".vdl, .vprint, .vback", "color: #00c; text-decoration: underline; cursor: pointer; margin-left: 14px;"); add(".vtool", "display: flex; align-items: center; gap: 6px; height: 32px; padding: 0 12px; background: #f0f0f0; border-bottom: 1px solid #ccc; flex: 0 0 auto;"); add(".vbtn", "display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 22px; border: 1px solid; border-color: #ccc #999 #999 #ccc; background: linear-gradient(#fff, #e3e3e3); font: bold 14px Arial, sans-serif; cursor: pointer; user-select: none;"); add(".vsep", "width: 1px; height: 18px; background: #ccc; margin: 0 6px;"); } if (kennedy) { add(".vtop", "height: 64px; padding: 0 16px 0 20px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5;"); add(".vlogo img", "display: block; width: 95px; height: auto;"); add(".vname", "font-size: 18px; color: #222; margin-left: 24px;"); add(".kbtn", "display: inline-flex; align-items: center; justify-content: center; height: 29px; min-width: 32px; padding: 0 10px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif; cursor: default; user-select: none;"); add(".kbtn:hover", "border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1);"); add(".kbtn.blue", "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff;"); add(".vpgn", "margin: 0 8px; color: #444;"); } if (era === "dv12") { add(".vtop", "height: 56px; padding: 0 16px; background: #000; border-bottom: 1px solid #333; font: 16px Arial, sans-serif;"); add(".vx", "color: #ccc; text-decoration: none; font-size: 26px; line-height: 1; padding: 0 6px;"); add(".vname", "color: #fff;"); add(".dbtn", "display: inline-flex; align-items: center; justify-content: center; height: 29px; min-width: 34px; padding: 0 10px; border: 1px solid #555; border-radius: 2px; background: linear-gradient(#4a4a4a, #3a3a3a); color: #eee; font: bold 11px Arial, sans-serif; cursor: default; user-select: none;"); add(".dbtn:hover", "border-color: #888;"); add(".dbtn svg", "fill: #eee;"); } if (era === "dv14" || era === "dv17" || gm) { add(".vtop", "height: 64px; padding: 0 12px; background: linear-gradient(rgba(0,0,0,.65), rgba(0,0,0,.3)); font-size: 16px;"); add(".ib", "display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; color: #fff; text-decoration: none; cursor: pointer; border-radius: " + (gm ? "50%" : "0") + ";"); add(".ib:hover", "background: rgba(255,255,255,.12);"); add(".vname", "color: #fff; margin-left: 4px;"); add(".vfi", "background: #fff; padding: 2px; width: 20px; height: 20px; flex-basis: 20px;" + (gm ? " border-radius: 2px;" : "")); add(".obtn", "display: inline-flex; align-items: center; height: 36px; padding: 0 16px; color: #fff; border: 1px solid rgba(255,255,255,.6); border-radius: " + (gm ? "4px" : "2px") + "; font: 500 14px " + f + "; cursor: pointer; white-space: nowrap;"); add(".obtn:hover", "background: rgba(255,255,255,.12);"); } if (dark) { add(".vzoom", "position: absolute; left: 50%; bottom: 24px; transform: translateX(-50%); display: flex; align-items: center; background: " + (era === "dv12" ? "#111" : "rgba(33,33,33,.9)") + "; " + (gm ? "border-radius: 24px; padding: 0 6px;" : "border-radius: 0;") + " box-shadow: 0 2px 6px rgba(0,0,0,.4); z-index: 2;"); add(".zb", "display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 40px; color: #fff; cursor: pointer; user-select: none;" + (gm ? " border-radius: 50%;" : "")); add(".zb:hover", "background: rgba(255,255,255,.12);"); add(".vpageind", "position: absolute; left: 24px; bottom: 30px; color: #ddd; font-size: 13px; background: rgba(33,33,33,.9); padding: 6px 10px;" + (gm ? " border-radius: 4px;" : "") + " z-index: 2;"); } return c; } // ---- Gplex for Google Photos (5.6) ---------------------------------------------------- // Picasa Web Albums (2007-2011), Google+ Photos (late 2012-2014) and Google Photos of // each period from 2015, drawn over Google's own Photos page, which keeps running // underneath: the photos are read from it, and everything done is done by pressing // Google's own controls (as Gplex's Drive does). function ugfPhAu() { return ((window.location.pathname || "").match(/^\/u\/(\d+)(\/|$)/) || ["", "0"])[1]; } function ugfPhBase() { const a = ugfPhAu(); return "https://photos.google.com" + (a !== "0" ? "/u/" + a : ""); } // where in Photos we are function ugfPhView() { const p = (window.location.pathname || "/").replace(/^\/u\/\d+/, "") || "/"; let m; if (p === "/" || /^\/photos\/?$/.test(p)) { return { view: "library" }; } if ((m = p.match(/^\/album\/([\w-]+)\/photo\/([\w-]+)/))) { return { view: "photo", id: m[2], album: m[1] }; } if ((m = p.match(/^\/(?:search\/[^/]+\/|share\/[\w-]+\/)?photo\/([\w-]+)/))) { return { view: "photo", id: m[1] }; } // a photo in the trash opens at /trash/ if ((m = p.match(/^\/trash\/([\w-]{20,})\/?$/))) { return { view: "photo", id: m[1], trash: true }; } if ((m = p.match(/^\/album\/([\w-]+)\/?$/))) { return { view: "album", id: m[1] }; } if (/^\/albums\/?$/.test(p)) { return { view: "albums" }; } if ((m = p.match(/^\/search\/([^/]+)\/?$/))) { return { view: "search", token: m[1] }; } if ((m = p.match(/^\/(archive|trash|sharing)\/?$/))) { return { view: m[1] }; } return { view: "" }; } function ugfPhWanted() { return window.location.host === "photos.google.com" && ugfNtTopFrame() && ugfNtOn("UGF_PHOTOS_ON") && ugfPhView().view !== ""; } // which Photos a layout gets // pw07 2007-2009: Picasa Web Albums under the blue links // pw10 2010: Picasa Web Albums under the Google bar of 2010 // pw11 late 2011-2012: Picasa Web Albums under the black bar // gp13 late 2012-2014: Google+ Photos // ph15 2015-2016: Google Photos (May 2015) // ph17 2017-2018: Google Photos with its places on the left // ph19 2019 on: Google Material 2 function ugfPhEra() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "ph19"; } if (l === "2017" || l === "2018" || l === "2018M") { return "ph17"; } if (["2015", "2015L", "2016", "2016C", "2016L"].indexOf(l) > -1) { return "ph15"; } if (l === "2013" || l === "2013L" || l === "2014") { return "gp13"; } if (l === "2011" || l === "2012") { return "pw11"; } if (l === "2010" || l === "2010N") { return "pw10"; } return "pw07"; } // a picture's address without its size, and with the size wanted function ugfPhStripSize(u) { return String(u || "").replace(/[?#].*$/, "").replace(/=[^=/]*$/, ""); } function ugfPhSized(base, spec) { return base ? base + "=" + spec + "?authuser=" + ugfPhAu() : ""; } // "Photo - Landscape - Sep 25, 2026, 8:04:44 PM": the kind, and the day and time function ugfPhParseLabel(lbl) { const s = String(lbl || "").replace(/ /g, " "); const kind = /^Video\b/i.test(s) ? "video" : /^Animation\b/i.test(s) ? "animation" : "photo"; const d = s.match(/([A-Z][a-z]{2} \d{1,2}, \d{4})(?:, (\d{1,2}:\d{2}(?::\d{2})? ?[AP]M))?/); return { kind: kind, day: d ? d[1] : "", time: d && d[2] ? d[2] : "", orient: (s.match(/ - (Landscape|Portrait|Square) - /) || [])[1] || "" }; } function ugfPhBg(el) { if (!el) { return ""; } const d = el.getAttribute("data-latest-bg"); if (d) { return d; } const m = String(el.getAttribute("style") || "").match(/url\(["']?(?:")?([^"')&]+)/); return m ? m[1] : ""; } // ---- reading Google's page function ugfPhHarvest() { const photos = []; const albums = []; const seen = {}; document.querySelectorAll("a[href*='/photo/'], a[href*='/trash/']").forEach(function(a) { if (a.closest("#ugf-photos") || !a.getClientRects().length) { return; } const lbl = a.getAttribute("aria-label") || ""; if (!/^(Photo|Video|Animation|Screenshot|Image)\b/i.test(lbl) && !a.querySelector("[data-latest-bg]")) { return; } const href = a.getAttribute("href") || ""; const m = href.match(/\/photo\/([\w-]+)/) || href.match(/\/trash\/([\w-]{20,})/); if (!m || seen[m[1]]) { return; } seen[m[1]] = true; const bgEl = a.querySelector("[data-latest-bg]") || a.querySelector("[style*='background-image']"); const p = ugfPhParseLabel(lbl); const box = a.parentElement; photos.push({ id: m[1], href: href, base: ugfPhStripSize(ugfPhBg(bgEl)), kind: p.kind, day: p.day, time: p.time, orient: p.orient, label: lbl, el: a, check: box ? box.querySelector("[role=checkbox]") : null }); }); const seenA = {}; document.querySelectorAll("a[href*='/album/']").forEach(function(a) { if (a.closest("#ugf-photos") || !a.getClientRects().length || /\/photo\//.test(a.getAttribute("href") || "")) { return; } const m = (a.getAttribute("href") || "").match(/\/album\/([\w-]+)/); if (!m || seenA[m[1]]) { return; } // the albums of the list (not the short list on the left) const bgEl = a.querySelector("[style*='background-image']"); const bg = ugfPhBg(bgEl); if (!a.hasAttribute("data-item-type") && !/=s(1\d\d|[2-9]\d\d)/.test(bg)) { return; } seenA[m[1]] = true; const t = a.querySelector("[dir=auto] span, [dir=auto]"); const txt = String(a.textContent || "").replace(/\s+/g, " "); albums.push({ id: m[1], href: a.getAttribute("href"), base: ugfPhStripSize(bg), title: t ? String(t.textContent || "").trim() : "Untitled album", count: (txt.match(/(\d[\d,]*) items?/) || ["", ""])[1], shared: a.getAttribute("data-is-shared") === "true", el: a }); }); return { photos: photos, albums: albums }; } // the photo on show in Google's viewer function ugfPhViewerMedia(id) { let hit = null; document.querySelectorAll("c-wiz[data-media-key][data-url]").forEach(function(c) { if (c.closest("#ugf-photos")) { return; } if (c.getAttribute("data-media-key") === id || (!hit && !id)) { hit = c; } }); if (!hit) { return null; } const img = hit.querySelector("img[aria-label]"); const p = ugfPhParseLabel(img ? img.getAttribute("aria-label") : ""); return { id: hit.getAttribute("data-media-key"), base: hit.getAttribute("data-url"), w: +hit.getAttribute("data-width") || 0, h: +hit.getAttribute("data-height") || 0, kind: hit.querySelector("video") ? "video" : p.kind, day: p.day, time: p.time }; } // one of Google's buttons on show, by its label (the last on show, which is the one // of the view in front) function ugfPhGoogleButton(re, within) { let hit = null; (within || document).querySelectorAll("button[aria-label], [role=button][aria-label], a[aria-label]").forEach(function(b) { if (!b.closest("#ugf-photos") && re.test(b.getAttribute("aria-label")) && b.getClientRects().length && b.getAttribute("aria-disabled") !== "true") { hit = b; } }); return hit; } // Google's places on the left (All photos, Albums, Favorites...), for their addresses function ugfPhNavHref(re) { let hit = ""; document.querySelectorAll("a[role=tab][aria-label], a[aria-label][href*='photos.google.com']").forEach(function(a) { if (!hit && !a.closest("#ugf-photos") && re.test(a.getAttribute("aria-label"))) { hit = a.getAttribute("href"); } }); return hit; } // ---- Photos: starting, and the page ---------------------------------------------------- function ugfPhStart() { if (window.location.host !== "photos.google.com" || !ugfNtTopFrame() || !ugfNtOn("UGF_PHOTOS_ON")) { return; } if (ugfPhWanted()) { ugfPhotosMain(); return; } const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } const t = setInterval(function() { if (ugfPhWanted()) { clearInterval(t); ugfPhotosMain(); } }, 500); } function ugfPhotosMain() { const era = ugfPhEra(); const A = ugfDocsArt(); // (the paper pinwheel until the new one of October 2020) const fav = era.indexOf("pw") === 0 ? A.phPicasaFav : era === "gp13" ? A.phGplusFav : String(layout || "") === "2022" ? A.phFav : A.phFav2015; console.log("[Gplex] Photos: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); ugfPhotosHome(era); } function ugfPhotosHome(era) { const A = ugfDocsArt(); const esc = ugfDocsEsc; const ic = ugfFeIcon; const l = String(layout || ""); const who = ugfCalWho(); const signedIn = !!(who.email || who.name); const pw = era.indexOf("pw") === 0; const gp = era === "gp13"; const ph = era.indexOf("ph") === 0; const gm = era === "ph19"; const html = document.documentElement; html.setAttribute("gplex-ph", era); const style = document.createElement("style"); style.id = "ugf-photos-styles"; style.textContent = ugfPhotosCss(era, A).join("\n"); (document.head || document.documentElement).appendChild(style); const shell = document.createElement("div"); shell.id = "ugf-photos"; shell.setAttribute("era", era); shell.setAttribute("tabindex", "-1"); document.body.appendChild(shell); const veil = document.getElementById("ugf-dv-veil"); if (veil) { veil.remove(); } const state = { view: { view: "" }, photos: [], albums: [], sel: {}, key: "", bases: {}, favs: {}, info: false, loaded: false, lastGrid: "library" }; // ---- small helpers const notice = function(text, stay) { let n = shell.querySelector(".pnote"); if (!n) { n = document.createElement("div"); n.className = "pnote"; shell.appendChild(n); } n.textContent = text; n.hidden = false; clearTimeout(notice.t); if (!stay) { notice.t = setTimeout(function() { n.hidden = true; }, 6000); } }; const plural = function(n, w) { return n + " " + (n === 1 ? w : w + "s"); }; const W = pw ? { photos: "photos", album: "album", albums: "My Photos", lib: "Recent photos", fav: "Favorites" } : gp ? { photos: "photos", album: "album", albums: "Albums", lib: "Photos", fav: "Favorites" } : { photos: "photos", album: "album", albums: "Albums", lib: "Photos", fav: "Favorites" }; const dayLabel = function(day) { if (!day) { return ""; } const d = new Date(day); if (isNaN(d)) { return day; } const now = new Date(); const y = new Date(now); y.setDate(now.getDate() - 1); if (d.toDateString() === now.toDateString()) { return ph ? "Today" : day; } if (d.toDateString() === y.toDateString()) { return ph ? "Yesterday" : day; } if (ph) { const wd = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][d.getDay()]; const mo = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][d.getMonth()]; return d.getFullYear() === now.getFullYear() ? wd + ", " + mo + " " + d.getDate() : mo + " " + d.getDate() + ", " + d.getFullYear(); } return day; }; // ---- going places (Google's own links on its left, so the page does not reload) const hrefFor = function(v) { const b = ugfPhBase(); if (v === "library") { return b + "/"; } if (v === "favorites") { return ugfPhNavHref(/^Favorites$/) || b + "/search/Favorites"; } return b + "/" + v; }; const go = function(v) { state.sel = {}; const re = { library: /^(All photos|Photos)$/, albums: /^Albums$/, favorites: /^Favorites$/, archive: /^Archive$/, trash: /^(Trash|Bin)$/, sharing: /^Sharing$/ }[v]; let a = null; if (re) { document.querySelectorAll("a[aria-label]").forEach(function(x) { if (!a && !x.closest("#ugf-photos") && re.test(x.getAttribute("aria-label"))) { a = x; } }); } const url = hrefFor(v); if (a) { ugfDvPress(a); setTimeout(function() { if (ugfPhView().view === state.view.view && v !== state.view.view) { window.location.href = url; } }, 2000); } else { window.location.href = url; } }; const openLink = function(el, href) { const abs = /^https?:/.test(href) ? href : "https://photos.google.com" + (href.charAt(0) === "/" ? "" : "/") + href.replace(/^\.\//, ""); const before = window.location.pathname; if (el && el.isConnected) { ugfDvPress(el); setTimeout(function() { if (window.location.pathname === before) { window.location.href = abs; } }, 1500); } else { window.location.href = abs; } }; const byId = function(id) { let f = null; state.photos.forEach(function(p) { if (p.id === id) { f = p; } }); return f; }; // ---- the bars at the top, per period const searchForm = function(cls, ph2, btn) { return '
' + (btn || "") + "
"; }; const topLinks = function() { const apps = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Maps", "https://www.google.com/maps"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"], ["Photos", ""]]; return '"; }; const tabsFor = function() { if (pw) { return [[W.lib, "library"], [W.albums, "albums"], [W.fav, "favorites"]]; } if (gp) { return [["Photos", "library"], ["Albums", "albums"], ["Favorites", "favorites"], ["Trash", "trash"]]; } return [["Photos", "library", "photo_library"], ["Albums", "albums", "photo_album"], ["Favorites", "favorites", "star_border"], ["Archive", "archive", "archive"], ["Trash", "trash", "delete"]]; }; const current = function() { const v = state.view.view; if (v === "photo") { return state.view.trash ? "trash" : state.view.album ? "albums" : state.lastGrid; } if (v === "album") { return "albums"; } if (v === "search" && state.view.token && ugfPhNavHref(/^Favorites$/).indexOf(state.view.token) > -1) { return "favorites"; } return v; }; const frame = function() { const v = state.view.view; let h = ""; if (v === "photo") { h = viewerFrame(); } else if (pw) { const bar = era === "pw07" ? topLinks() : era === "pw10" ? ugfNtGbar("classic", "Photos", "2010") : ugfNtGbar("dark", "Photos", "2011"); h = bar + '
' + searchForm("psrch", "", '") + (era === "pw11" ? ugfNtHeadCorner() : "") + "
" + '
' + tabsFor().map(function(t) { return '' + esc(t[0]) + ""; }).join("") + 'Upload' + (current() === "albums" ? 'New album' : "") + "
" + '
'; } else if (gp) { // (the black bar until 2014; the bevelled logo of 2010 until the flat one of // late 2013) h = (l === "2014" ? "" : ugfNtGbar("dark", "Photos", "2011")) + '
Google' + searchForm("gsrch", "Search photos", '") + ugfNtHeadCorner() + "
" + '
Photos' + tabsFor().map(function(t) { return '' + esc(t[0]) + ""; }).join("") + '' + (current() === "albums" ? 'New album' : "") + 'Upload photos
'; } else if (era === "ph15") { // 2015-2016: Google's bar of those years on top (the logo, the search box // with its blue button, the apps and the photo), as over Drive, and the // app's own bar under it: "Photos", and the place shown, with the others // in its menu const newLogo = ["2016", "2016C", "2016L"].indexOf(l) > -1; let place = "Photos"; tabsFor().forEach(function(t) { if (t[1] === current()) { place = t[0]; } }); if (state.view.view === "album") { place = heading(); } h = '
" + searchForm("gsrch", "Search Photos", '") + ugfNtHeadCorner() + "
" + '
Photos
' + esc(place) + " " + ic("arrow_drop_down", 24) + "
" + '' + (current() === "albums" ? '' + ic("add_photo_alternate", 24) + "" : "") + '' + ic("cloud_upload", 24) + '
'; } else { h = '
' + '' + (gm ? "Google Photos" : "Photos") + "" + searchForm("msrch", gm ? "Search your photos" : "Search", '") + '' + (gm ? '' + ic("cloud_upload", 20) + "Upload" : '' + ic("cloud_upload", 24) + "") + '' + ugfNtCorner() + "
" + '
' + (era === "ph15" ? '
' : "") + '
' + (era === "ph15" ? '
Photos
' : "") + tabsFor().map(function(t) { return '' + ic(t[2], 24) + "" + esc(t[0]) + ""; }).join("") + '
'; } const note = shell.querySelector(".pnote"); shell.innerHTML = trusted_policy.createHTML(h); // (a message on show outlives the page it was said on) if (note && !note.hidden) { shell.appendChild(note); } ugfNtMenus(shell, gm); state.drawn = ""; if (v === "photo") { drawViewer(); } else { drawContent(); } }; // ---- the photos and albums const thumbOf = function(p, size, crop) { return ugfPhSized(p.base, crop ? "s" + size + "-c" : "w" + size + "-h" + size + "-no"); }; const gridHtml = function(list) { if (!list.length) { return '
' + (state.loaded ? esc(emptyWords()) : "Loading...") + "
"; } const tile = function(p) { const on = !!state.sel[p.id]; return '
' + (p.kind === "video" ? '' + ic("play_circle", 22) + "" : "") + '' + ic("check_circle", 22) + "
"; }; if (pw) { return '
' + list.map(tile).join("") + "
"; } // grouped by day, from 2012 on let h = ""; let lastDay = null; list.forEach(function(p) { if (p.day !== lastDay) { if (lastDay !== null) { h += ""; } lastDay = p.day; h += '
' + esc(dayLabel(p.day) || "") + '
'; } h += tile(p); }); return h + "
"; }; const albumsHtml = function(list) { if (!list.length) { return '
' + (state.loaded ? "No albums yet." : "Loading...") + "
"; } return '
' + list.map(function(a) { return '
' + '
' + esc(a.title) + "
" + '
' + (a.count ? plural(+a.count.replace(/,/g, ""), pw ? "photo" : "item") : "") + (a.shared ? (a.count ? " · " : "") + "Shared" : "") + "
"; }).join("") + "
"; }; const emptyWords = function() { const v = state.view.view; return { trash: "Trash is empty", archive: "No photos in the archive", search: "No results", album: "This album is empty" }[v] || (pw ? "No photos yet. Upload some with the Upload button." : "No photos yet. Drag photos here or use Upload."); }; const heading = function() { const v = state.view.view; if (v === "album") { const t = document.querySelector("textarea[aria-label='Edit album name'], [data-title]"); const name = t ? (t.value || t.getAttribute("data-title") || "") : ""; return name || "Album"; } if (v === "search") { return current() === "favorites" ? W.fav : "Search results"; } return { library: W.lib, albums: W.albums, archive: "Archive", trash: "Trash", sharing: "Sharing" }[v] || ""; }; const drawContent = function() { const box = shell.querySelector(".pcontent"); if (!box) { return; } const v = state.view.view; let h = ""; const head = heading(); if (v === "albums") { h = (pw || gp ? "" : '") + albumsHtml(state.albums); } else { const albumBar = v === "album" ? '' + (pw ? "" : ic("share", 20)) + "" + (pw ? "Share album" : "Share") + "" : ""; h = (pw ? '
' + (v === "album" ? '' + esc(W.albums) + " › " : "") + esc(head) + albumBar + "
" : (v === "library" && ph ? "" : '
' + (v === "album" ? '' + ic("arrow_back", 22) + "" : "") + "" + esc(head) + "" + albumBar + "
")) + gridHtml(state.photos); } if (h === state.drawn) { return; } state.drawn = h; const main = shell.querySelector(".pmain"); const keep = main ? main.scrollTop : 0; box.innerHTML = trusted_policy.createHTML(h); // the rows of 2012 on are filled edge to edge: each picture as wide as its shape box.querySelectorAll(".pgrid.jr img").forEach(function(img) { const fit = function() { if (img.naturalWidth && img.naturalHeight) { const r = img.naturalWidth / img.naturalHeight; const t = img.parentElement; t.style.flexGrow = String(r); t.style.flexBasis = Math.round(r * rowH()) + "px"; } }; if (img.complete) { fit(); } else { img.addEventListener("load", fit, { once: true }); } }); if (main) { main.scrollTop = keep; } drawSel(); }; const rowH = function() { return gp ? 180 : gm ? 220 : 200; }; // ---- choosing photos const selected = function() { return state.photos.filter(function(p) { return state.sel[p.id]; }); }; const drawSel = function() { const bar = shell.querySelector(".pselbar"); if (!bar) { return; } const sel = selected(); shell.classList.toggle("selecting", sel.length > 0); if (!sel.length) { bar.hidden = true; return; } bar.hidden = false; const trashView = state.view.view === "trash"; const acts = trashView ? [["restore", "Restore", "restore"]] : [["share", "Share", "share"], ["fav", "Add to favorites", "star_border"], ["download", "Download", "file_download"], ["trash", pw ? "Delete" : "Move to trash", "delete"]]; if (ph) { bar.innerHTML = trusted_policy.createHTML('' + ic("close", 24) + '' + sel.length + " selected" + acts.map(function(a) { return '' + ic(a[2], 24) + ""; }).join("")); } else { bar.innerHTML = trusted_policy.createHTML('' + plural(sel.length, "photo") + " selected: " + acts.map(function(a) { return '' + esc(a[1]) + ""; }).join(" | ") + ' | Clear'); } }; const paintSel = function() { shell.querySelectorAll(".pt[data-id]").forEach(function(t) { t.classList.toggle("on", !!state.sel[t.getAttribute("data-id")]); }); drawSel(); }; // ---- dialogs of the period const dialog = function(title, body, buttons) { const box = document.createElement("div"); box.className = "pdlg-wrap"; box.innerHTML = trusted_policy.createHTML('
"); shell.appendChild(box); const close = function() { box.remove(); document.removeEventListener("keydown", onKey, true); }; const onKey = function(ev) { if (ev.key === "Escape") { ev.preventDefault(); ev.stopPropagation(); close(); } else if (ev.key === "Enter" && ev.target.tagName === "INPUT") { ev.preventDefault(); const pri = buttons.filter(function(b) { return b.primary; })[0]; if (pri) { pri.fn(box); close(); } } }; document.addEventListener("keydown", onKey, true); box.querySelectorAll(".pdbtns button").forEach(function(b) { b.addEventListener("click", function() { const bt = buttons[+b.getAttribute("data-i")]; if (bt.fn) { bt.fn(box); } close(); }); }); box.querySelector(".pfence").addEventListener("click", close); const f = box.querySelector("input"); if (f) { setTimeout(function() { f.focus(); f.select(); }, 0); } }; const caps = era === "ph17"; const okL = function(s) { return caps ? s.toUpperCase() : s; }; const sure = function(title, text, ok, fn) { dialog(title, "

" + esc(text) + "

", [{ label: okL(ok), primary: true, fn: fn }, { label: okL("Cancel") }]); }; // ---- doing things, by Google's own controls const busy = { n: 0 }; const pressThen = async function(re, confirmRe, ms) { const b = await ugfDvWait(function() { return ugfPhGoogleButton(re); }, ms || 2500); if (!b) { console.log("[Gplex] Photos: no button on Google's page matching " + re); return false; } ugfDvFire(b, ["pointerover", "mouseover", "pointerenter", "mouseenter"]); ugfDvPress(b); if (confirmRe) { const c = await ugfDvWait(function() { return ugfDvDialogButton(confirmRe); }, 3000); if (c) { ugfDvPress(c); console.log("[Gplex] Photos: pressed Google's " + ugfDvText(b) + ", then " + ugfDvText(c)); } else { // (no question asked: fine, if the photo went; else what the dialogs offered) console.log("[Gplex] Photos: pressed Google's " + ugfDvText(b) + "; no confirmation matching " + confirmRe + " (dialogs on show: " + (ugfDvDialogWords() || "none") + ")"); } } return true; }; // Moving to the trash: Google's button, then whatever Google asks (the first time // it explains the trash and wants "Got it"; later it may ask to confirm), until the // photo has gone - the button pressed again once if Google only wanted the "Got it" const trashIt = async function(ids, inViewer) { const before = window.location.pathname; const re = /^(Move to trash|Delete|Move to bin|Remove)$/; const conf = /^(Move to trash|Move to bin|Delete|Remove|OK|Got it|Continue|Yes)$/i; const gone = function() { if (inViewer) { return window.location.pathname !== before || !ugfPhViewerMedia(ids[0]); } const hv = ugfPhHarvest(); return !hv.photos.some(function(p) { return ids.indexOf(p.id) > -1; }); }; // Google's answers, as long as it keeps asking const answer = async function() { let any = false; for (let i = 0; i < 3; i++) { const c = await ugfDvWait(function() { return ugfDvDialogButton(conf); }, i ? 1200 : 3000); if (!c) { break; } console.log("[Gplex] Photos: answered Google's question with " + ugfDvText(c)); ugfDvPress(c); any = true; await ugfDvSleep(500); if (gone()) { break; } } return any; }; for (let round = 0; round < 2; round++) { const b = await ugfDvWait(function() { return ugfPhGoogleButton(re); }, 1500); if (b) { ugfDvFire(b, ["pointerover", "mouseover", "pointerenter", "mouseenter"]); ugfDvPress(b); console.log("[Gplex] Photos: pressed Google's " + ugfDvText(b)); } else { // Google's own key for it ["keydown", "keypress", "keyup"].forEach(function(t) { try { (document.activeElement && !document.activeElement.closest("#ugf-photos") ? document.activeElement : document.body).dispatchEvent(new KeyboardEvent(t, { bubbles: true, cancelable: true, key: "#", code: "Digit3", shiftKey: true, keyCode: t === "keypress" ? 35 : 51, which: t === "keypress" ? 35 : 51 })); } catch (e) {} }); console.log("[Gplex] Photos: no trash button; tried Google's # key"); } await answer(); if (await ugfDvWait(gone, 3000)) { return true; } if (!b) { break; } } const left = ugfDvDialogWords(); if (left) { console.log("[Gplex] Photos: Google's dialogs still open: " + left); // (never left open underneath) const x = ugfDvDialogButton(/^(Cancel|Close|No thanks)$/i); if (x) { ugfDvPress(x); } } return false; }; const menuDownload = async function() { const more = await ugfDvWait(function() { return ugfPhGoogleButton(/^More options$/); }, 2000); if (!more) { console.log("[Gplex] Photos: Google's More options was not found"); return false; } ugfDvPress(more); const it = await ugfDvWait(function() { return ugfDvMenuItem(/^Download/); }, 2500); if (!it) { console.log("[Gplex] Photos: no Download in Google's menu"); ugfDvCloseMenus(); return false; } ugfDvPress(it); return true; }; // choosing the photos in Google's own grid (its tick on each), before its bar's buttons const selectInGoogle = async function(list) { list.forEach(function(p) { const live = byId(p.id); const c = live && live.check; if (c && c.isConnected && c.getAttribute("aria-checked") !== "true") { ugfDvFire(live.el, ["pointerover", "mouseover", "pointerenter", "mouseenter", "pointermove", "mousemove"]); ugfDvPress(c); } }); await ugfDvSleep(400); const n = list.filter(function(p) { const live = byId(p.id); return live && live.check && live.check.getAttribute("aria-checked") === "true"; }).length; console.log("[Gplex] Photos: " + n + " of " + list.length + " chosen in Google's grid"); }; const clearGoogle = function() { const b = ugfPhGoogleButton(/^(Clear selection|Cancel selection|Close selection|Deselect all)/); if (b) { ugfDvPress(b); } else { ugfDvCloseMenus(); } }; const doSel = async function(a) { const sel = selected(); if (!sel.length) { return; } if (a === "clear") { state.sel = {}; paintSel(); return; } const run = async function() { await selectInGoogle(sel); let ok = false; if (a === "trash") { ok = await trashIt(sel.map(function(p) { return p.id; }), false); notice(ok ? plural(sel.length, "photo") + " moved to the trash." : "The photos didn't go to the trash."); } else if (a === "download") { ok = await pressThen(/^Download/) || await menuDownload(); if (!ok) { notice("Couldn't start the download."); } } else if (a === "fav") { ok = await pressThen(/^(Add to favorites|Favorite)$/); if (!ok) { ok = (await ugfDvWait(function() { return ugfPhGoogleButton(/^More options$/); }, 800)) && (ugfDvPress(ugfPhGoogleButton(/^More options$/)), true); const it = ok ? await ugfDvWait(function() { return ugfDvMenuItem(/^(Add to favorites|Favorite)/); }, 2000) : null; ok = !!it && ugfDvPress(it); } notice(ok ? "Added to favorites." : "Couldn't add to favorites."); } else if (a === "restore") { ok = await pressThen(/^Restore$/); notice(ok ? plural(sel.length, "photo") + " restored." : "Couldn't restore the photos."); } else if (a === "share") { ok = await pressThen(/^Share$/); if (ok) { revealSoon(); } else { notice("Couldn't open sharing."); } } if (a !== "share") { setTimeout(clearGoogle, 400); } state.sel = {}; paintSel(); }; if (a === "trash") { sure(pw ? "Delete photos" : "Move to trash?", pw ? "Delete " + plural(sel.length, "photo") + "?" : plural(sel.length, "photo") + " will be moved to the trash.", pw ? "Delete" : "Move to trash", run); } else { run(); } }; // Google's own dialog, shown above Gplex's page, where Gplex cannot carry it out // itself (sharing, adding photos to an album) const revealSoon = function() { ugfDvWait(function() { return ugfDvDialog(); }, 4000).then(function(d) { if (d) { ugfDvReveal(d); } }); }; // uploading: Google's own "Upload" (its picker, its uploading), or files dropped // on the page, which go straight through to Google's page underneath const upload = function() { const btn = ugfPhGoogleButton(/^(Upload|Create and add photos|Create)$/); if (!btn) { notice("Couldn't find Google's upload. Drag the photos onto the page instead."); return; } ugfDvPress(btn); const re = /^(Upload( photos)?|Import photos|From computer|Computer)\b/i; const now = ugfDvMenuItem(re); const pick = function(it) { ugfDvPress(it); // a menu of places to upload from: the computer setTimeout(function() { const c = ugfDvMenuItem(/^(Computer|From computer|From your computer)\b/i); if (c) { ugfDvPress(c); } }, 250); }; if (now) { pick(now); return; } ugfDvWait(function() { return ugfDvMenuItem(re); }, 2500).then(function(it) { if (it) { pick(it); } else { const offered = []; document.querySelectorAll("[role=menuitem]").forEach(function(el) { if (ugfDvShown(el)) { offered.push(String(el.textContent || "").replace(/\s+/g, " ").trim().slice(0, 40)); } }); console.log("[Gplex] Photos: no upload in Google's menu" + (offered.length ? " (it has: " + offered.join(" | ") + ")" : "")); ugfDvCloseMenus(); notice("Couldn't open the upload. Drag the photos onto the page instead."); } }); }; const newAlbum = function() { dialog(gm ? "Create album" : "New album", '', [{ label: okL("Create"), primary: true, fn: function(box) { const name = box.querySelector(".pin").value.trim(); const run = async function() { if (state.view.view !== "albums") { go("albums"); await ugfDvWait(function() { return ugfPhView().view === "albums"; }, 4000); } if (!(await pressThen(/^(Create album|New album)$/))) { notice("Couldn't create the album."); return; } if (name) { const f = await ugfDvWait(function() { let t = null; document.querySelectorAll("textarea[aria-label='Edit album name'], textarea[placeholder='Add a title'], input[placeholder='Add a title']").forEach(function(x) { if (!x.closest("#ugf-photos") && x.getClientRects().length) { t = x; } }); return t; }, 5000); if (f) { ugfDvType(f, name); ugfDvKey(f, "Enter"); f.blur(); } } notice("Album created. Add photos to it from Google's picker."); revealSoon(); }; run(); } }, { label: okL("Cancel") }]); }; // ---- the photo viewer of the period const viewerFrame = function() { if (pw) { const bar = era === "pw07" ? topLinks() : era === "pw10" ? ugfNtGbar("classic", "Photos", "2010") : ugfNtGbar("dark", "Photos", "2011"); return bar + '' + ''; } if (gp) { return ''; } return ''; }; const drawViewer = function() { const id = state.view.id; shell.classList.toggle("intrash", !!state.view.trash); const m = ugfPhViewerMedia(id); const base = (m && m.base) || state.bases[id] || ""; if (base) { state.bases[id] = base; } const img = shell.querySelector(".pvimg img, .gvimg img, .pvstage img"); if (!img) { return; } const stage = img.parentElement; const dpr = Math.min(2, window.devicePixelRatio || 1); const w = Math.round(Math.max(200, stage.clientWidth || 1000) * dpr); const h = Math.round(Math.max(200, stage.clientHeight || 700) * dpr); const want = base ? ugfPhSized(base, "w" + w + "-h" + h + "-no") : ""; if (want && img.getAttribute("data-src") !== want) { img.setAttribute("data-src", want); img.src = want; } // what is known of it const known = byId(id) || {}; const day = (m && m.day) || known.day || ""; const time = (m && m.time) || known.time || ""; const rows = [["Date", day + (time ? ", " + time : "")], ["Size", m && m.w ? m.w + " × " + m.h : ""], ["Kind", (m && m.kind === "video") || known.kind === "video" ? "Video" : "Photo"]]; const infoH = rows.filter(function(r) { return r[1]; }).map(function(r) { return "
" + esc(r[0]) + " " + esc(r[1]) + "
"; }).join(""); shell.querySelectorAll(".pvinfo").forEach(function(x) { if (x.ugfH !== infoH) { x.ugfH = infoH; x.innerHTML = trusted_policy.createHTML(infoH); } }); const gd = shell.querySelector(".gvdate"); if (gd) { gd.textContent = day; } const crumb = shell.querySelector(".pvcrumb"); if (crumb) { const hh = '' + esc(state.view.album ? W.albums : W.lib) + " › Photo"; if (crumb.ugfH !== hh) { crumb.ugfH = hh; crumb.innerHTML = trusted_policy.createHTML(hh); } } // favorite or not, as Google's own button says const fb = ugfPhGoogleButton(/^(Favorite|Unfavorite|Remove from favorites|Add to favorites)$/); const isFav = !!fb && /^(Unfavorite|Remove from favorites)$/.test(fb.getAttribute("aria-label")); shell.querySelectorAll("[data-v=fav]").forEach(function(x) { if (x.classList.contains("ib")) { const want2 = ic(isFav ? "star" : "star_border", 24); if (x.ugfH !== want2) { x.ugfH = want2; x.innerHTML = trusted_policy.createHTML(want2); } } else { x.textContent = isFav ? "Remove from favorites" : "Add to favorites"; } }); shell.querySelectorAll("[data-v=prev]").forEach(function(x) { x.classList.toggle("off", !ugfPhGoogleButton(/^View previous photo$/)); }); shell.querySelectorAll("[data-v=next]").forEach(function(x) { x.classList.toggle("off", !ugfPhGoogleButton(/^View next photo$/)); }); }; const viewerAct = function(a) { if (a === "prev" || a === "next") { const b = ugfPhGoogleButton(a === "prev" ? /^View previous photo$/ : /^View next photo$/); if (b) { ugfDvPress(b); } } else if (a === "back") { const b = ugfPhGoogleButton(/^Back to (photos|album)/i) || ugfPhGoogleButton(/^Back$/); if (b) { ugfDvPress(b); } else if (window.history.length > 1) { window.history.back(); } else { window.location.href = ugfPhBase() + "/"; } } else if (a === "info") { const p = shell.querySelector(".pvpanel"); if (p) { p.hidden = !p.hidden; shell.classList.toggle("infoopen", !p.hidden); setTimeout(drawViewer, 50); } } else if (a === "fav") { pressThen(/^(Favorite|Unfavorite|Remove from favorites|Add to favorites)$/).then(function() { setTimeout(drawViewer, 400); }); } else if (a === "download") { menuDownload().then(function(ok) { if (!ok) { notice("Couldn't start the download."); } }); } else if (a === "share") { pressThen(/^Share$/).then(function(ok) { if (ok) { revealSoon(); } else { notice("Couldn't open sharing."); } }); } else if (a === "restore") { pressThen(/^Restore$/, /^Restore$/).then(function(ok) { notice(ok ? "Restored." : "Couldn't restore the photo."); }); } else if (a === "purge") { sure("Delete forever?", "This photo will be deleted forever. This can't be undone.", "Delete forever", function() { pressThen(/^(Delete permanently|Delete forever|Delete)$/, /^(Delete permanently|Delete forever|Delete|Got it)$/i).then(function(ok) { notice(ok ? "Deleted forever." : "Couldn't delete the photo."); }); }); } else if (a === "trash") { sure(pw ? "Delete photo" : "Move to trash?", pw ? "Delete this photo?" : "This photo will be moved to the trash.", pw ? "Delete" : "Move to trash", function() { trashIt([state.view.id], true).then(function(ok) { notice(ok ? (pw ? "Photo deleted." : "Moved to the trash.") : "The photo didn't go to the trash."); }); }); } }; // ---- clicks, keys, drops shell.addEventListener("click", function(ev) { const t = ev.target; if (!t.closest("[data-a=places]")) { const pl = shell.querySelector(".pplaces"); if (pl) { pl.hidden = true; } } if (t.closest(".pfence2")) { shell.classList.remove("dopen"); return; } const g = t.closest("[data-go]"); if (g) { shell.classList.remove("dopen"); ev.preventDefault(); go(g.getAttribute("data-go")); return; } const v = t.closest("[data-v]"); if (v) { ev.preventDefault(); if (!v.classList.contains("off")) { viewerAct(v.getAttribute("data-v")); } return; } const a = t.closest("[data-a]"); if (a) { ev.preventDefault(); const w = a.getAttribute("data-a"); if (w === "places") { const pl = shell.querySelector(".pplaces"); if (pl) { const r = a.getBoundingClientRect(); pl.style.left = Math.round(r.left) + "px"; pl.style.top = Math.round(r.bottom) + "px"; pl.hidden = !pl.hidden; } } else if (w === "drawer") { shell.classList.toggle("dopen"); } else if (w === "upload") { upload(); } else if (w === "newalbum") { newAlbum(); } else if (w === "share-album") { pressThen(/^Share$/).then(function(ok) { if (ok) { revealSoon(); } else { notice("Couldn't open sharing."); } }); } else { doSel(w); } return; } const chk = t.closest(".pchk"); const tile = t.closest(".pt[data-id]"); if (tile) { const id = tile.getAttribute("data-id"); if (chk || ev.metaKey || ev.ctrlKey || shell.classList.contains("selecting")) { state.sel[id] = !state.sel[id]; paintSel(); return; } const p = byId(id); if (p) { state.bases[id] = p.base; state.lastGrid = state.view.view === "album" ? "albums" : state.view.view; openLink(p.el, p.href); } return; } const al = t.closest(".pa[data-album]"); if (al) { let f = null; state.albums.forEach(function(x) { if (x.id === al.getAttribute("data-album")) { f = x; } }); if (f) { openLink(f.el, f.href); } } }); shell.addEventListener("submit", function(ev) { ev.preventDefault(); const q = ((ev.target.querySelector("input[name=q]") || {}).value || "").trim(); if (q) { window.location.href = ugfPhBase() + "/search/" + encodeURIComponent(q); } }); shell.addEventListener("keydown", function(ev) { ev.stopPropagation(); if (/^(INPUT|TEXTAREA)$/.test(ev.target.tagName) || shell.querySelector(".pdlg-wrap")) { return; } if (state.view.view === "photo") { if (ev.key === "ArrowLeft") { viewerAct("prev"); } else if (ev.key === "ArrowRight") { viewerAct("next"); } else if (ev.key === "Escape") { viewerAct("back"); } } else if (ev.key === "Escape") { state.sel = {}; paintSel(); } }); // photos dragged in from the computer go through to Google's page underneath let dragT = 0; const hasFiles = function(ev) { return ev.dataTransfer && [].indexOf.call(ev.dataTransfer.types || [], "Files") > -1; }; const dragOff = function() { clearTimeout(dragT); html.removeAttribute("gplex-ph-drag"); shell.classList.remove("drop"); }; window.addEventListener("dragenter", function(ev) { if (hasFiles(ev) && !shell.hidden) { html.setAttribute("gplex-ph-drag", ""); shell.classList.add("drop"); } }, true); window.addEventListener("dragover", function() { if (html.hasAttribute("gplex-ph-drag")) { clearTimeout(dragT); dragT = setTimeout(dragOff, 900); } }, true); window.addEventListener("drop", function(ev) { if (html.hasAttribute("gplex-ph-drag")) { const n = ev.dataTransfer && ev.dataTransfer.files ? ev.dataTransfer.files.length : 0; setTimeout(function() { dragOff(); if (n) { notice("Uploading " + plural(n, "photo") + "...", false); } }, 50); } }, true); window.addEventListener("dragover", function(ev) { if (html.hasAttribute("gplex-ph-drag") && hasFiles(ev) && !ev.defaultPrevented) { ev.preventDefault(); } }); window.addEventListener("drop", function(ev) { if (html.hasAttribute("gplex-ph-drag") && !ev.defaultPrevented) { ev.preventDefault(); } }); window.addEventListener("resize", function() { if (state.view.view === "photo") { drawViewer(); } }); // ---- keeping up with Google's page let myTitle = ""; const titleFor = function() { const v = state.view.view; const what = v === "photo" ? "Photo" : heading() || "Photos"; return pw ? "Picasa Web Albums - " + what : gp ? what + " - Google+" : what + " - Google Photos"; }; const tick = function() { const v = ugfPhView(); if (v.view === "") { if (!shell.hidden) { shell.hidden = true; html.removeAttribute("gplex-ph"); } return; } if (shell.hidden) { shell.hidden = false; html.setAttribute("gplex-ph", era); } const changed = v.view !== state.view.view || v.id !== state.view.id || v.token !== state.view.token || v.album !== state.view.album; const wasPhoto = state.view.view === "photo"; if (changed) { state.view = v; state.sel = {}; if (!(wasPhoto && v.view === "photo")) { state.photos = []; state.albums = []; state.key = ""; state.loaded = false; frame(); setTimeout(function() { state.loaded = true; drawContent(); }, 5000); } } if (v.view === "photo") { drawViewer(); } else { const hv = ugfPhHarvest(); const key = hv.photos.map(function(p) { return p.id + p.base.slice(-12); }).join("|") + "#" + hv.albums.map(function(a) { return a.id + a.title + a.count; }).join("|") + "#" + heading(); // (the grid keeps the photos it had while Google's list refills itself) if (key !== state.key) { state.key = key; state.photos = hv.photos; state.albums = hv.albums; hv.photos.forEach(function(p) { if (p.base) { state.bases[p.id] = p.base; } }); if (hv.photos.length || hv.albums.length) { state.loaded = true; } drawContent(); } } myTitle = titleFor(); if (document.title !== myTitle) { document.title = myTitle; } }; // more of a long list: Google loads it as its own grid is scrolled shell.addEventListener("scroll", function(ev) { const m = ev.target; if (!m.classList || !m.classList.contains("pmain") || m.scrollTop + m.clientHeight < m.scrollHeight - 300) { return; } const last = state.photos[state.photos.length - 1]; if (last && last.el && last.el.isConnected) { try { last.el.scrollIntoView({ block: "end" }); } catch (e) {} } }, true); tick(); setInterval(tick, 600); } // ---- Photos: the styles of each period --------------------------------------------- function ugfPhotosCss(era, A) { const H = "#ugf-photos"; const c = []; const add = function(sel, body) { c.push(sel.split(",").map(function(s) { return H + " " + s.trim(); }).join(", ") + " { " + body + " }"); }; const pw = era.indexOf("pw") === 0; const gp = era === "gp13"; const ph = era.indexOf("ph") === 0; const gm = era === "ph19"; const k11 = era === "pw11"; const f = gm ? "'Google Sans', Roboto, Arial, sans-serif" : ph ? "Roboto, RobotoDraft, Helvetica, Arial, sans-serif" : "Arial, sans-serif"; ugfNtBaseCss("ugf-photos").forEach(function(r) { if (r.indexOf("html[gplex-nt]") !== 0 && r.indexOf(H + " {") !== 0) { c.push(r); } }); c.push("html[gplex-ph], html[gplex-ph] body { overflow: hidden !important; }"); c.push("html[gplex-ph] body > [ugf-dv-up] { z-index: 2147483100 !important; }"); c.push("html[gplex-dv-reveal] " + H + " { display: none !important; }"); c.push("html[gplex-ph-drag] " + H + " { pointer-events: none !important; }"); c.push("html[gplex-ph] #ugf-gmail-accfence { z-index: 2147483600 !important; } html[gplex-ph] #ugf-gmail-accmenu, html[gplex-ph] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }"); c.push("html[gplex-ph] #ugf-gmail-accmenu a, html[gplex-ph] #ugf-gmail-appsmenu a { text-decoration: none; }"); c.push(H + " { position: fixed; inset: 0; z-index: 2147483000; display: flex; flex-direction: column; background: " + (gp ? "#f1f1f1" : "#fff") + "; color: #222; font: 13px " + f + "; text-align: left; overflow: hidden; outline: none; }"); c.push(H + "[hidden] { display: none !important; }"); c.push(H + ".drop .pmain { outline: 3px dashed " + (ph ? "#4285f4" : "#6d9eeb") + "; outline-offset: -8px; }"); add("*", "box-sizing: border-box;"); // (a photo in the trash: Restore and Delete forever in place of the rest) c.push(H + ":not(.intrash) .tr-only, " + H + ".intrash .not-tr { display: none !important; }"); add("a, [data-a], [data-go], [data-v], .pt, .pa", "cursor: pointer;"); add(".mi", "display: inline-flex; font-style: normal;"); add(".mi svg", "display: block; fill: currentColor;"); add(".sp", "flex: 1;"); add("form", "display: flex; align-items: center; margin: 0;"); add(".pmain", "flex: 1; overflow: auto; min-height: 0; position: relative;"); add(".pempty", "padding: 40px 24px; color: #777; font-size: 14px;" + (ph ? " text-align: center; padding-top: 80px; font-size: 16px;" : "")); add(".pnote", "position: absolute; z-index: 50; " + (ph ? "left: 24px; bottom: 24px; background: " + (gm ? "#202124" : "#323232") + "; color: #fff; padding: 14px 24px; font-size: 14px; border-radius: " + (gm ? "4px" : "2px") + ";" : "left: 50%; top: 6px; transform: translateX(-50%); background: " + (k11 || gp ? "#f9edbe; border: 1px solid #f0c36d;" : "#fad163;") + " padding: 5px 12px; font-weight: bold; border-radius: 2px;")); add(".pnote[hidden]", "display: none;"); // the tiles add(".pgrid", "display: flex; flex-wrap: wrap; gap: " + (pw ? "18px" : gp ? "4px" : "4px") + ";"); add(".pgrid.sq .pt", "width: 160px; height: 160px; padding: 7px; background: #fff; border: 1px solid #ccc; box-shadow: 1px 1px 2px rgba(0,0,0,.15);"); add(".pgrid.sq .pt img", "width: 144px; height: 144px; object-fit: cover; display: block;"); add(".pgrid.jr::after", "content: ''; flex-grow: 1000000;"); add(".pgrid.jr .pt", "height: " + (gp ? 180 : gm ? 220 : 200) + "px; flex: 1 1 200px; min-width: 60px; max-width: 800px; overflow: hidden; background: #eee;"); add(".pgrid.jr .pt img", "width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .12s;"); add(".pt", "position: relative; user-select: none;"); add(".pt .pchk", "position: absolute; left: 6px; top: 6px; display: none; color: rgba(255,255,255,.85); filter: drop-shadow(0 1px 2px rgba(0,0,0,.5));"); add(".pt:hover .pchk, " + H + ".selecting .pt .pchk", "display: inline-flex;"); add(".pt.on .pchk", "display: inline-flex; color: " + (ph ? "#4285f4" : "#3079ed") + "; filter: none; background: #fff; border-radius: 50%;"); add(".pt.on img", ph ? "transform: scale(.86);" : "outline: 3px solid #3079ed; outline-offset: -3px;"); add(".pt.on", ph ? "background: " + (gm ? "#e8f0fe" : "#dde7fb") + ";" : ""); add(".pt .pv", "position: absolute; right: 6px; top: 6px; color: #fff; filter: drop-shadow(0 1px 2px rgba(0,0,0,.6));"); add(".pday", "font: " + (ph ? "500 14px " + f : gp ? "bold 13px Arial" : "bold 13px Arial") + "; color: " + (ph ? "#202124" : "#444") + "; padding: " + (ph ? "24px 0 12px" : "16px 0 8px") + ";"); // the albums add(".palbums", "display: grid; grid-template-columns: repeat(auto-fill, " + (pw ? "180px" : "minmax(180px, 1fr)") + "); gap: " + (pw ? "24px 18px" : "24px 16px") + ";"); add(".pa", "min-width: 0;"); add(".pac", pw ? "width: 172px; height: 172px; padding: 6px; background: #fff; border: 1px solid #ccc; box-shadow: 3px 3px 0 #fff, 4px 4px 0 #ccc, 6px 6px 0 #fff, 7px 7px 0 #bbb;" : "aspect-ratio: 1; overflow: hidden; background: #eee; border-radius: " + (gm ? "8px" : "0") + ";" + (gp ? " box-shadow: 0 1px 2px rgba(0,0,0,.2);" : "")); add(".pac img", "width: 100%; height: 100%; object-fit: cover; display: block;"); add(".pat", "margin-top: " + (pw ? "10px" : "8px") + "; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; " + (pw ? "color: #00c; text-decoration: underline; font-weight: bold;" : "color: #202124; font-weight: 500; font-size: 14px;")); add(".pam", "color: #777; font-size: 12px; margin-top: 2px;"); add(".phd", "display: flex; align-items: center; gap: 8px; padding: " + (ph ? "20px 0 16px" : "12px 0") + "; font: " + (ph ? (gm ? "400 22px 'Google Sans', Roboto" : "400 20px Roboto") : "bold 16px Arial") + ", sans-serif; color: #202124;"); add(".phd .plink", "display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 500; color: " + (ph ? "#1a73e8" : "#00c") + ";"); add(".phd .pback", "display: inline-flex; color: #5f6368;"); add(".pwhd a", "color: #00c; font-weight: normal;"); // the bar over the chosen photos add(".pselbar", "display: flex; align-items: center; gap: 6px; flex: 0 0 auto;"); add(".pselbar[hidden]", "display: none;"); // ---- dialogs (Kennedy's until 2016, Material's after) const kd = !ph || era === "ph15"; add(".pdlg-wrap", "position: fixed; inset: 0; z-index: 80;"); add(".pfence", "position: absolute; inset: 0; background: " + (kd ? "rgba(255,255,255,.75)" : "rgba(0,0,0,.4)") + ";"); add(".pdlg", "position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 420px; max-width: calc(100% - 32px); background: #fff; " + (kd ? "padding: 30px 42px; border: 1px solid #acacac; box-shadow: 0 4px 16px rgba(0,0,0,.2);" : "padding: 24px; box-shadow: 0 16px 24px rgba(0,0,0,.3); border-radius: " + (gm ? "8px" : "2px") + ";")); add(".pdt", kd ? "font: 16px Arial, sans-serif; margin-bottom: 16px;" : "font: " + (gm ? "400 22px 'Google Sans'" : "500 20px Roboto") + ", sans-serif; margin-bottom: 20px;"); add(".pdb p", "margin: 0;"); add(".pdb .pin", "width: 100%; height: " + (kd ? "29px" : "36px") + "; font: 13px " + f + "; outline: none; " + (kd ? "border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 0 8px;" : "border: 0; border-bottom: 1px solid #ccc; font-size: 15px;")); add(".pdb .pin:focus", kd ? "border-color: #4d90fe;" : "border-bottom: 2px solid #1a73e8;"); add(".pdbtns", "display: flex; gap: 8px; margin-top: 22px;" + (kd ? "" : " flex-direction: row-reverse; justify-content: flex-start;")); add(".pdbtns button", kd ? "height: 29px; min-width: 72px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif;" : "border: 0; background: none; color: #1a73e8; font: 500 14px " + f + "; height: 36px; padding: 0 12px; border-radius: " + (gm ? "4px" : "2px") + ";"); add(".pdbtns button.pri", kd ? "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff;" : gm ? "background: #1a73e8; color: #fff; padding: 0 24px;" : ""); // ---- Picasa Web Albums if (pw) { add(".toplinks", "display: flex; justify-content: space-between; padding: 3px 8px 0; height: 24px; font-size: 13px; flex: 0 0 auto;"); add(".toplinks .left > *", "margin-right: 8px;"); add(".toplinks a", "color: #00c;"); add(".phead", "display: flex; align-items: center; gap: 18px; padding: " + (k11 ? "0 16px 0 20px; height: 72px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5;" : "10px 12px 8px;") + " flex: 0 0 auto;"); add(".plogo", "display: flex; align-items: flex-end; gap: 4px; text-decoration: none;"); add(".plogo img", "display: block; height: 40px;"); add(".plogo span", "font: 20px Arial, sans-serif; color: " + (k11 ? "#777" : "#666") + "; margin-bottom: 4px;"); add(".psrch input", k11 ? "width: 380px; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 0 8px; font-size: 13px; outline: none;" : "width: 260px; height: 22px; font-size: 13px; padding: 1px 3px; border: 1px solid; border-color: #999 #ccc #ccc #999;"); add(".psrch button", k11 ? "" : "margin-left: 5px; font-size: 13px; padding: 2px 6px;"); add(".ptabs", "display: flex; align-items: center; gap: " + (k11 ? "24px" : "4px") + "; padding: " + (k11 ? "0 20px" : "0 12px") + "; height: " + (k11 ? "50px" : "30px") + "; flex: 0 0 auto; " + (k11 ? "border-bottom: 1px solid #ebebeb;" : "border-bottom: 1px solid #c3d9ff;")); add(".ptab", k11 ? "color: #666; font-size: 13px; font-weight: bold; text-decoration: none;" : "padding: 5px 12px; color: #00c; text-decoration: underline; border: 1px solid transparent; border-bottom: 0; margin-bottom: -1px;"); add(".ptab.on", k11 ? "color: #dd4b39;" : "background: #fff; border-color: #c3d9ff; color: #000; text-decoration: none; font-weight: bold; border-radius: 4px 4px 0 0;"); add(".pbtn", "display: inline-block; padding: 2px 10px; margin-left: 6px; border: 1px solid; border-color: #bbb #999 #999 #bbb; border-radius: 2px; background: linear-gradient(#fff, #ddd); color: #000; font-size: 13px;"); add(".kbtn", "display: inline-flex; align-items: center; justify-content: center; height: 29px; min-width: 54px; padding: 0 12px; margin-left: 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif;"); add(".kbtn.red", "background: linear-gradient(#dd4b39, #d14836); border-color: #c6322a; color: #fff;"); add(".kbtn.blue", "background: linear-gradient(#4d90fe, #4787ed); border-color: #3079ed; color: #fff; width: 60px; margin: 0 0 0 6px;"); add(".kbtn svg", "fill: #fff;"); add(".pmain", "padding: 8px 20px 40px;"); add(".pselbar", "padding: 6px 20px; background: " + (k11 ? "#f9edbe" : "#e8eef7") + "; font-size: 13px;"); add(".pselbar a", "color: #00c; text-decoration: underline;"); // the photo on its own page add(".pvw", "flex: 1; display: flex; flex-direction: column; min-height: 0; padding: 0 20px;"); add(".pvcrumb", "padding: 8px 0; font-size: 14px;"); add(".pvcrumb a", "color: #00c;"); add(".pvnav", "padding: 0 0 8px; font-size: 13px;"); add(".pvnav a", "color: #00c; text-decoration: underline;"); add(".pvnav a.off", "color: #999; text-decoration: none; cursor: default;"); add(".pvsep", "color: #999; margin: 0 6px;"); add(".pvbody", "flex: 1; display: flex; gap: 20px; min-height: 0;"); add(".pvimg", "flex: 1; display: flex; align-items: flex-start; justify-content: center; min-width: 0; min-height: 0; padding-bottom: 20px;"); add(".pvimg img", "max-width: min(100%, 800px); max-height: min(100%, 640px); border: 1px solid #ccc; padding: 6px; background: #fff; box-shadow: 2px 2px 4px rgba(0,0,0,.15);"); add(".pvside", "width: 220px; flex: 0 0 220px; font-size: 13px;"); add(".pvside a", "display: block; color: #00c; text-decoration: underline; margin: 4px 0;"); add(".pvsh", "font-weight: bold; margin: 14px 0 6px; padding-bottom: 3px; border-bottom: 1px solid #c3d9ff;"); add(".pvinfo div", "margin: 3px 0; color: #444;"); add(".pvinfo span", "color: #777;"); } // ---- Google+ Photos if (gp) { add(".ghead", "display: flex; align-items: center; height: 60px; padding: 0 16px 0 20px; background: #f5f5f5; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto;"); add(".glogo img", "display: block; height: 30px; width: auto;"); add(".glogo.g10 img", "height: 38px;"); add(".gsrch", "margin-left: 40px; flex: 0 1 520px; display: flex;"); add(".gsrch input", "flex: 1; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; padding: 0 8px; font-size: 13px; outline: none;"); add(".gsrch .gbtn", "width: 60px; height: 29px; border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); display: inline-flex; align-items: center; justify-content: center; color: #fff;"); add(".gsrch .gbtn svg", "fill: #fff;"); add(".ghead .kcorner", "margin-left: auto;"); add(".gbar2", "display: flex; align-items: center; gap: 26px; height: 52px; padding: 0 20px; background: #fff; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto;"); add(".gtitle", "font-size: 20px; color: #404040; margin-right: 12px;"); add(".gtab", "color: #666; font-size: 13px; font-weight: bold; height: 52px; line-height: 49px; border-bottom: 3px solid transparent;"); add(".gtab.on", "color: #dd4b39; border-bottom-color: #dd4b39;"); add(".kbtn", "display: inline-flex; align-items: center; height: 29px; padding: 0 12px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px Arial, sans-serif;"); add(".kbtn.red", "background: linear-gradient(#dd4b39, #d14836); border-color: #c6322a; color: #fff;"); add(".pmain", "padding: 12px 20px 40px;"); add(".pselbar", "padding: 8px 20px; background: #f9edbe; border-bottom: 1px solid #f0c36d; font-size: 13px;"); add(".pselbar a", "color: #15c;"); add(".pday", "color: #404040; font-weight: normal; font-size: 15px;"); // the lightbox add(".gv", "position: fixed; inset: 0; display: flex; background: #000; z-index: 5;"); add(".gvimg", "flex: 1; position: relative; display: flex; align-items: center; justify-content: center; min-width: 0;"); add(".gvimg img", "max-width: 100%; max-height: 100%;"); add(".gvx", "position: absolute; left: 14px; top: 8px; color: #aaa; font-size: 34px; text-decoration: none;"); add(".gvarr", "position: absolute; top: 50%; transform: translateY(-50%); color: #fff; opacity: 0; transition: opacity .15s; display: flex;"); add(".gvimg:hover .gvarr", "opacity: .8;"); add(".gvarr.l", "left: 8px;"); add(".gvarr.r", "right: 8px;"); add(".gvarr.off", "display: none;"); add(".gvside", "width: 300px; background: #fff; padding: 20px; overflow: auto;"); add(".gvwho", "display: flex; gap: 10px; align-items: center; margin-bottom: 14px;"); add(".gvwho .pfp", "width: 40px; height: 40px;"); add(".gvdate", "color: #999; font-size: 12px; margin-top: 2px;"); add(".gvacts a", "display: block; color: #15c; padding: 5px 0;"); add(".pvinfo", "margin-top: 14px; padding-top: 12px; border-top: 1px solid #ebebeb;"); add(".pvinfo div", "margin: 4px 0;"); add(".pvinfo span", "color: #999;"); } // ---- Google Photos if (ph) { add(".ib", "display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; color: #5f6368; border-radius: " + (gm ? "50%" : "0") + ";"); add(".ib:hover", "background: rgba(60,64,67,.08);"); add(".pbar", "display: flex; align-items: center; height: 64px; padding: 0 12px 0 16px; background: #fff; flex: 0 0 auto; " + (era === "ph15" ? "box-shadow: 0 1px 3px rgba(0,0,0,.2); position: relative; z-index: 2;" : "border-bottom: 1px solid " + (gm ? "#dadce0" : "#e0e0e0") + ";")); add(".brand", "display: flex; align-items: center; gap: 10px; width: 232px; text-decoration: none; color: #5f6368; font: " + (gm ? "22px 'Product Sans', 'Google Sans', Arial" : "20px Roboto, Arial") + ", sans-serif;"); add(".brand img", "width: 32px; height: 32px;"); add(".msrch", "position: relative; flex: 0 1 720px;"); add(".msrch input", "width: 100%; height: " + (gm ? "48px" : "44px") + "; border: 0; padding: 0 16px 0 56px; font: 16px " + f + "; outline: none; color: #202124; border-radius: " + (gm ? "8px" : "2px") + "; background: " + (era === "ph15" ? "#fff; border-bottom: 1px solid #e0e0e0; border-radius: 0" : "#f1f3f4") + ";"); add(".msrch input:focus", era === "ph15" ? "border-bottom-color: #4285f4;" : "background: #fff; box-shadow: 0 1px 1px 0 rgba(65,69,73,.3), 0 1px 3px 1px rgba(65,69,73,.15);"); add(".msrch .sic", "position: absolute; left: 8px; top: 50%; transform: translateY(-50%); width: 40px; height: 40px; border: 0; background: none; color: #5f6368; display: inline-flex; align-items: center; justify-content: center;"); add(".upbtn", "display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 16px; margin-right: 8px; color: #5f6368; font: 500 14px " + f + "; border-radius: 4px;"); add(".upbtn:hover", "background: rgba(60,64,67,.08);"); add(".corner", "display: flex; align-items: center; margin-left: 4px;"); add(".pbody", "flex: 1; display: flex; min-height: 0;"); add(".pnav", "width: " + (gm ? "256px" : "232px") + "; flex: 0 0 auto; padding: 8px 0; overflow: auto;"); add(".pni", "display: flex; align-items: center; gap: " + (gm ? "18px" : "24px") + "; height: " + (gm ? "40px" : "48px") + "; padding: 0 16px 0 24px; color: #202124; text-decoration: none; font-size: 14px; font-weight: 500;" + (gm ? " border-radius: 0 20px 20px 0; margin-right: 12px;" : "")); add(".pni .mi", "color: #5f6368;"); add(".pni:hover", "background: " + (gm ? "#f1f3f4" : "#eee") + ";"); add(".pni.on", gm ? "background: #e8f0fe; color: #1967d2;" : "color: #4285f4;"); add(".pni.on .mi", gm ? "color: #1967d2;" : "color: #4285f4;"); add(".pmain", "padding: 0 " + (gm ? "20px" : "24px") + " 60px " + (gm ? "8px" : "16px") + ";"); add(".pselbar", "position: absolute; left: 0; right: 0; top: 0; height: 64px; z-index: 5; padding: 0 12px; background: " + (gm ? "#fff" : "#4285f4") + "; color: " + (gm ? "#202124" : "#fff") + "; " + (gm ? "border-bottom: 1px solid #dadce0;" : "box-shadow: 0 1px 4px rgba(0,0,0,.3);")); add(".pselbar .ib", gm ? "" : "color: #fff;"); add(".pselbar .ib:hover", gm ? "" : "background: rgba(255,255,255,.12);"); add(".scount", "font-size: 20px; margin-left: 12px;"); // the viewer add(".pview", "position: fixed; inset: 0; background: #000; display: flex; flex-direction: column; z-index: 5;"); add(".pvtop", "position: absolute; left: 0; right: 0; top: 0; height: 64px; display: flex; align-items: center; padding: 0 12px; z-index: 3; background: linear-gradient(rgba(0,0,0,.5), transparent);"); add(".pvtop .ib, .pvph .ib", "color: #fff;"); add(".pvtop .ib:hover", "background: rgba(255,255,255,.12);"); add(".pvstage", "flex: 1; position: relative; display: flex; align-items: center; justify-content: center; min-height: 0;"); add(".pvstage img", "max-width: 100%; max-height: 100%;"); add(".pvarr", "position: absolute; top: 50%; transform: translateY(-50%); display: flex; color: #fff; opacity: 0; transition: opacity .15s; width: 64px; height: 64px; align-items: center; justify-content: center;" + (gm ? " border-radius: 50%;" : "")); add(".pvstage:hover .pvarr", "opacity: .85;"); add(".pvarr:hover", "background: rgba(255,255,255,.12);"); add(".pvarr.l", "left: 12px;"); add(".pvarr.r", "right: 12px;"); add(".pvarr.off", "display: none;"); add(".pvpanel", "position: absolute; right: 0; top: 0; bottom: 0; width: 360px; background: #fff; color: #202124; z-index: 4; box-shadow: -2px 0 6px rgba(0,0,0,.3);"); add(".pvpanel[hidden]", "display: none;"); add(".pvph", "display: flex; align-items: center; gap: 16px; height: 64px; padding: 0 12px; font-size: 20px;"); add(".pvph .ib", "color: #5f6368;"); add(".pvinfo", "padding: 8px 24px;"); add(".pvinfo div", "margin: 12px 0; font-size: 14px;"); add(".pvinfo span", "display: block; color: #5f6368; font-size: 12px;"); c.push(H + ".infoopen .pvstage { margin-right: 360px; }"); // 2015-2016: Google's grey bar of those years, then the app's bar (as Drive's) if (era === "ph15") { add(".gtop", "display: flex; align-items: center; height: 60px; padding: 0 16px 0 24px; background: #f1f1f1; border-bottom: 1px solid #e5e5e5; flex: 0 0 auto;"); add(".gtop .glogo img", "display: block; height: 30px; width: auto;"); add(".gsrch", "margin-left: 40px; flex: 0 1 560px; display: flex;"); add(".gsrch input", "flex: 1; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-right: 0; padding: 0 8px; font: 16px Arial, sans-serif; outline: none; background: #fff; color: #222;"); add(".gsrch input:focus", "border-color: #4d90fe;"); add(".gsrch .gbtn", "width: 60px; height: 29px; border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; border-radius: 0 2px 2px 0;"); add(".gsrch .gbtn svg", "fill: #fff;"); add(".gtop .kcorner", "margin-left: auto;"); add(".dbar", "display: flex; align-items: center; flex: 0 0 auto; height: 56px; padding: 0 16px 0 0; background: #fff; border-bottom: 1px solid #e0e0e0;"); add(".dbar .app", "display: flex; align-items: center; gap: 10px; width: 240px; flex: 0 0 240px; padding-left: 24px; font: 20px Roboto, Arial, sans-serif; color: #666;"); add(".dbar .app img", "width: 24px; height: 24px;"); add(".crumb", "display: flex; align-items: center; font: 18px Roboto, sans-serif; color: #202124;"); add(".crumb .cr", "display: inline-flex; align-items: center; padding: 4px 8px;"); add(".crumb .cr:hover", "background: rgba(60,64,67,.08);"); add(".pplaces", "position: fixed; z-index: 40; min-width: 200px; background: #fff; padding: 8px 0; box-shadow: 0 2px 10px rgba(0,0,0,.2);"); add(".pplaces[hidden]", "display: none;"); add(".ppl", "display: flex; align-items: center; gap: 16px; padding: 0 24px 0 16px; line-height: 36px; color: #202124; font-size: 13px; text-decoration: none;"); add(".ppl .mi", "color: #5f6368;"); add(".ppl:hover", "background: #eee;"); add(".ppl.on", "color: #4285f4;"); add(".ppl.on .mi", "color: #4285f4;"); add(".pmain", "padding: 0 32px 60px;"); add(".pselbar", "top: 60px; height: 56px;"); } } return c; } // ---- end Gplex for Google Docs ---- // ---- Gplex for Google News and Google Translate (4.4) ---------------------------- // Both take over their page the way Calendar does: Google's own page stays loaded // underneath, out of sight, and Gplex draws the period's page over it. News reads // the stories from Google News' own RSS feeds (and the pictures from Google's page // for the same section); Translate asks Google's translation service directly. function ugfNtArt() { if (!ugfNtArt.c) { ugfNtArt.c = {"news2005":"data:image/gif;base64,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","news2007":"data:image/gif;base64,R0lGODlhzQBVAPcAAF94YNPT0/74yGqV7Pn5+vrLCMzMzMNFQ7y7vJmZmeNLNmcUCLOyss3d92bTbNQpESdSro2XrhEsZ3KErmlYEPHx8ce5tfvs6zVm0auzxYfYi4huBBQ4h0Rx0fz8/CRc1ShKlLjO9KuZlRhGqh1UyhhKtq2srM5oZfuDcdrm+rknJujo6Hah8PJnVObl5YkUA/fqsbWsoQJzB+3t7ZGjynGP0FTJWlqH6vf39+Hh4d7e3uy9BmdyjFdjgfTOKUl64wRWCM/Jsfh2Y/7hESquMbqxj9DOzsbFxM01IFlxpvqhlOXr+K51baGBAqWkpe/Fv/Xe3YWl6tWqBJq48pNwa/7ycev266XA8sHAwNnZ2aYXBIGr8v7+/vr33rQnFNDp0bqWBLgaBPPz8/ePfubZ1bXYt8FWUOtaRqGqvsWzcCtBcf3z8oaviOPESOSqqvzxn5mgsIV/aRZAnOzMy/H1/fu0qayJhMylB3GNc0JXhCtcLQqFD4FSS8keBreYIhyjI3xtM9bHjcepN8PN4ZEiEsKnpIMyJ+zy/LO+1oSb0Om8uoBjX4WKmPzIwV97uv30VpOIXjps28xmWN6amJeKiO/j3oev86lCNJuy4F3MY/P58/b4/P72Icidlu7Yf66hdKmmpd6yBdvUyv3TzMG6ofn6/v75+fXYYZfImbO0usTDw3dAONO6Wv2/tTRfwMaeA9fW1v788KTep8LVw87T3nrWf/v8/qxfVP/++F2F2diUi9B4dvz9/9/k76+MA6SHEpiUjpZ9GaGkrquvuuvq69za2s7Cv7qhQDCENdw/KbeXFidnKrWfSRxPvv39/aCen87Q1r+MhY+SnMvKyaepr8nIyq0AAODf37m4uNmIh7IREcfHx7Cvr7a1te/37/3+/6+0r/H0+dbb5hx2IEBen5OBOf3+/f///XqBkubo7YeRh42z8o6t7z27RJLclpzin/j7+Kqpqdzc3OPj4xibH66RHuvguLzByvWsoZq+89zGbPX19fj27/f29re5wP///yH5BAAAAAAALAAAAADNAFUAAAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3MlTpa1Nh5YsSSH0EJ1SvHq6hGflnQMHmWwQobcHWRkPXJQepJPiCotcHVyRgADBFYYfuaJcaXDIltaTVjS0c6DBXa129GSMm1Whn4e3Anl1vYGhWYkRI0AoHiFnRDMSHz6cZRHiEOCRX2SVmYWqVqY/e4DgMSJvBoGsWlOsIwxBDrkJcNAMG4YGToQJ5EaUgBz5Q4coSy5/dOah34osqNoR2SNDNIIAxAhopXNlQAcIIJLASYUAm3ds3box/+BGLUISECUefyBBAgOmcMI5cvEg5nhy0ECcFxPzt2eKLTe4IkcecDAQHgJYbFPNNNNsowoC3XDjhDS57UZCM4yRQwtq8WHkAQ4VECOLVKEBoY4qK0jXUwgs3AABBzzEw003WBgAyzUurEAMMSu4cA0sBiDAzTM86FaCHBxIoIY4WHWI0XweECCLA+2UmIABMzizYosQSBAjN1gYcQ0xfRHgwZlR9hPiNUYgEM8ErSWpRio5iKGlkxk5M2WV+T1jRAV36sSiixL04AQD2+gwg1+BFkRcPzPosA03E8gpDTZZVNAfnhfp6QARzQHhRAAVcIhTAy26ouQz3Rjhgl8Oef+wjwsGVKoGI6Cocs0+jXJKkTNOgZpfPKSaatMhLAwQSZLStLoCDsYuxAUOg5BDTgLxYFGMpr5iBI87n4ZqAixiRDuTLfm0OEKh3Bjw7ERc9HIPAgxgIQ+33V70bbhA6GFCFuXm9N8AqkqQwBHz9GMuQ1zsk4MRYuKbr0X7CqsHN1nsszBMm+SzxQ9ySJAHpoBSNC0x86wg8cQVfZuJxQxkLLAlLGCQJCPVpFjRfP30g8OmDplywSit1FFHK6NcsIZF58TShQBvRA2DALHgchEX3/Citda2dO31JuEk9Q88GrzcnB4MFNPPQkITfXQjUKyxsUYeXLFalxJgHPDOznD/MbdBF+DTQjIPIIFEMgqccYYQSkAhES4CVOHDDqFUvkMBBfhwCgyxSHRICiFccUU++Yw+BTtRsJBsDY5gsolAmpT9x9ndqJ3QGo2goEAyiCd+RgtjOE4QA8T/w8BAx08Uzjofh5yHKi6oeNIFSpyBhBeXMBHNLmYYroACh0+ytEMCPLLDHcock8b6gtwRyg7wt2HP3wOlwM4PkkXywwAspH5DJB/AkBxAMAFx/OwfsfsM7eSxtoOMQgjJwN4tTtC9wxEOCZMAWvKKV7yJNIBmNvOSEbKEkgdG8BYWMIABtnEELBTiFl54gAz7cADhKeQcbxhCKH6RhiAYYYWqwEIR/wQhBfiFQgr64Mfc6DCFH0CAHImgAQ0c4YoO/OAHkSBBEm4zgXtkIQczgFYCZ9evbuiggQQxBT6sd4lOTMMI01DFC/swwzBkQ2EC2WDMOhgRD4TAEgRLEjrIhZJWCEEBhGBCELGAhRZiARvcYEIY+kDJMCCBDBvDRRWGIIVgkGIbjFTFEYLYjRgww31HfAUrlIiQFLDAiTSARgBW6I8IQIA9GAKBMLCBoGpkYQUKG+PZsKEDHBTEFEpoARIuYQxQMhIL9LoFHfsQBi10Agda2qDxtikRAkzBEjdoBrOuYUyTGPIMhKCCd2oEi2IUIwtGwEIkJ0lNLVyiEuY6xyalsP+BGPBSFUZopzzgiQUTHEMKqQRDGqBlEFe6KALTOMIRtgHKbtiyBIcZoDAQcIQA5KAC0hFmv4hZzoEoAYKG6AYCEKAKAwQAFgGYBjYOIMNqEkIU0NLm8ZIXkX6w42MlSBIc5iG9kYwCBS3wgiFM0I0j/LICYhBDBWZwDQMw4BKUrOct8EgQHHJiB02AxIy2UQyViWEfIdJBNWKAyjuAwReBKOo/6LAFgo2MowEohg7giYAJNOOvI+AAOYyggxWI4TT/8IZnyKgHkhLkqOikgoG28dQKVOA4nSBcGF6wACYQA2gXqUDqfhBYCcBhBaAFyRrGgIJkvIAK3NjGNUDaN7//FWcFRhBBVqv5gk6AVgCcGAIYKPAMBkyjTh6o7XxmZYA0VE4Kr/DFL8gAtHSBjAdgygIxxNAPMcxAHlgQCwmOxAE00HYgilXgSIs5kDWgQAhIWMAzuKEKHdCWC84gQAWKoYA+cHYBhvhTr341gwH8r7QRQG1J6jCGpC4gAVi4Bn8OQoAVTMMMWdXCC+65KVw84qtNAEQ8VJEDrhKEC/1wwREqF4roNuETdhLIErbAAldwAB3dIFWT5iMGHdAAl0hKgoLRu9hhslcguUOnIZyAgEz1ag34QIIWFkDlRWBBZx4ixhU/UFpGDFkkqx2DAl5gCFDoOCE4yEEn6viCFxSC/6vAHcIrNgAIBsCiZAdB8TVYQTkpgKEJwSiGiq4Azi6hA3pydUYFoIGBAAZWDdDYW2KLvN5ymoK1rl1FPKbx5X+swZAPmPIqFkGJZyAgByW1iAdWAMAPkJcHnQZJ7uD7glVgA9UKUbQRwPcA3t7iswKpAicK4AsKxAEL0VOIB2YQBCP+eQNFKFUpmAcyCaBjhANedQ3WU9pUAFsg6WWsY/9xgfci4QV8sHOpBBI462GPCSJ4RgKeYYJtzCPVFVl1q8mbBxektiMeUEKDvVDrI8TaIDiYxwkI1wcNGyIAxoxFcMFq7GnM4N8EwcE1JtfiJmwAEv4+BI07EDJ0FMsgXP8QAybwV1o44FogVqB0Y4/cCCEkFd3YIOc/oCDmB3jhFp0whiq4ISMETMO+GO/jCjoQmWYgSQ2wkKtH3IuCM2h4FRYfcEGWPYndNZyzFqjAPwQwBB16HBICXogHiNGGApzP4+WART+WkCwMIIkHJzcIAQZx4CQ9Q22oibkNxH3kOlSd4HxAwDWeAEEveIEJFjBCNaDJUsIaFrEeWsG2Hc2B8qIRJBcQgu6uPo11K6RhijiDAkLN2RhkCQZDKIAUzp73hKTcE26Xgi/oXPolGPgDSMrDn8zlAXEMgLQSkAA1yBX4WgzeyOU86RkIvgoRHMBwl4gGxJypimnAYh6LahL/3YhBg8iQgDEcSILpJcKLUpTCa11zfyk2QYd/VEL0yXD4EdafEAKQoQXWo2ELIALRk0OyR3v8hxAEYA+YM3t0hgXEsAT/w2UcoAb+cHF51gvWETJqwA3MB3POR3jGxAVKcHgvQAh20AlzQAbFYATOtA1GUFYV8DP0ExFcUAGIYH7kBQI6kHQJwQsNcDrsMAWicwWnwwKsEwJcAAVCAEECGHb0s3Y2l3+cJQIl9gYNuHvlUHsJ4QGVgDmh4HEUgAAuUAHbNl5IMgEHJxAaGEI80A0Z03zPV2n/4AzSt1kvYAIBcA1ZYAASZSNgtA/JFRJiAA1MdyHoRwNSpxClEALH/xcJGDAZ7ABIkeB0SbAEBHB/g6NhbkZC0lIB70WFA7grMACGuwcIpad1jjIDPlAAYUgBFIAN84CDuMQYIEALn0cQDUAoapAAildSgieC/8AFgtNfGkYFBuBOsAALhTWDPqgROKADNYBLGUUO6VCD/1AKV/ADHeAI3jgBiTAANPYDTpcHsLBdlQCASMBbnvWMwygGY+CEVBYPOrAPDEg5z0YKGPiJrTh7FAAICDAPYjAPHWAYGTUBnkgQvGAJIYQOoLANXxaM0DeMqWeMtWYA80AMM1AB+4B5JOEBLpAB62EYjCEHNOCOAlEKvSAOWVAN3eEdNbBlSNIDx3VZJ7B6vP+1Cv7WEP0Qj661AKvQDSVWCRz3Ch73CWtoEBUQe3ewAcaGbDgwA/cAAYjBGCNAA/j2DyGAfOjAKnfGIRJJh0vodZtFCIXwLMmFjRqha45AjbYoDjVIHy4AC9uwUt1RA5AYVIWCMGqiC0jwAF9HCNOQlQfRD0h1bgtgZfc2A21AOXfgC01QDjrHEPwQe8NFAcCAIrIiD3AAAnLwmY1RA0uQFN9AHU6kBtJAb+5SVGE5c+U0A9bTaxp2C0S1EigmD2hwIQbJGEkAHwxBHyugAzC1jAGQCP+jlz2AJfRhDEhQSRrGBAlYmDbnBVQGDNvwWRUQCM/1Z8EQBJKWEF0wBBT/RwGggCXEQQxGAAd50HkcIAclgAFqYV0QkAfUAAomcAQlZiqtOW79oAuAWU9mGZ0lsWrV4Ah/tZtykAjumF9SZVlQRQyY8EriVCjMhwPyIAnOSWbz4I5MiEhAaQLD1w+iIAipBJmfsI8KkUP8ZGzcEABiMIz9MA/bYALokAdqoBgYMADM4yJqQA3cwABHIGGgtZ9HRgBz8J/VZE9ksIgkkXLFkAqugFFSihiYQD/OcKV+kxX7EKHkmCQ9IDMgWQheEAZkqmHRYGIIITjxtQCUgABn9A8EMA9pIAVS4FbShVPS8gjEBoum9nLO4DDTwAATwgjSgAaJUFc21gMzclwT/1YQRFpOa3cClZSkZpCUI7F2BgAHVCmlh1ECNKCKCrGlEuqlMnODASBJZaoFhEBdCrEGh0QIiblpCrZsRiAIr3Crb8UMCXkQ4bmilACiKOoMxhEAqtANJnCsudB3PVBvCaN14dYcyzBuKWcEKkCm1hoGZlAJoCoQ22oy/XANWCANVGkkUloDvvkQotqlhSIz/5BmWHALWhCv8WoGM6AQSqAA1MkHprYfWYFiOWABfgAGAvtWcZUQHkZxcWBqb0oQzgAi8wBP03APWMRlGgUwqhiW0XpkcLoCnTCm1xoGB6AIpoAQHqAIT/ARHlABsIANjOCZiCGlzdABgwARW6ospf/1pfsgECkLC1clr/EqCReAEHWArwvABwnADUbwbf+wbAEQA/XgC74wsIHwb5qEsMUVACg6EPOBA95FDDpwfK7GGBAwCIQJcy/DHECwDOCgsc4gBlnABPJqrXTUAnUQtALBBYFzAJJQCYMoHwRADAHAANLgmY2hG39FArnQAKXQEPvADpWYJOuas8NYYQZgArdACC8gryFrCllqClDQWl6QTs8QD/ZmYtNiYaBQDk3QBFALBqzQBbhwDrILOT4QhoAADPRWDS7AUAiBX7KCCYSxmxCACFp3Dl+wHKECBMjABmXwBV9gDvNBDAbABITgs2RKR4ijOBGkBdnKXR65ljj/sAJWlQDkgCSfabjskQtXkAJHYSpcUApc0UQTmnw4OxDCKqPcQAmG0GbxGgbJsAusdQY+Rwh8AApOYAK60qj26zBHEA+QEAyrG7V30Aae4AmnULtg8AufICGxlQO80hAEIA65MF6c2gyKaBBWgLz5scIyoBeogBUoJqN2sL/827/WGq+EEA3XMA9liE0e0bAuYATd4AQ1yp6Fmx6QsT9DKDpH+D+u8GhqkAc8QA3sqrOAygDPQAV8YAiEUL3x6gUqkD2FAEmIMlv/Rh85MCnPAAnlEAzB8AtRCwbK4AfMUASPxFSM6oN0sAQNEAJTEAUdUJXkWgI18DoE8QWowAZ4/wAAjAwAeIAHbDAL23UabZsDDUwFXLwAbbbJhGAIVJBCLvVR37sRJwMLBfUM6NADamDER5weBwpYT5QEE0CowJAATLaw9ptiAeAm8kYJdvDL0VAIxhBREIIARiCQSSeXbRIP8iYCn/AJRUAKPuSH3YEFAfAqGLcJQagsI2mL7emeU1oDvLu0MxAAQ/wM6BwPNGIEv9QPWoLG0zDElEAFi8AHfLAIVEAJoGAgCLANsABM3XoR+lVV2MDM0oAOPJAHNqoGN6oY1iLLEYAGGYAg3RAP9lkvAYBlDBuVOhAkDGACM4IgqrBIACUPxODDuRaVxeDRIK1SWDDSjHQEYhJG5v/SiK/0xBAgyxKNBhHACHnwmVNqkpi3bFlQl3aJIDBYDCeNGsK6ArBQrPHgBOiMzk5QdJQF0B+5DytQDNMgJKAgb9IQ1tKQAMJADcPAHc901I0UUGMCKygnK8RwDbM0SqqgIAbA1tslftJCH3EdU3S9DdPgUl9EDIJoLikASIFMDnBwDwvCQvTCzDwAAkZii4OAWMWBMteQ2Zq9w4QNNPlVAfMAJA/yHSxlAFlQhqMcElxAAPWhAy4IIUQXD7IN0vws0ttw1zfiAhvpF3r91mpCDC6QA8KdAy5AJn6hlndbHCES3MLNw8bd27pYdzCi1nVNUQ/CDeJqJEHGLfNBADj/8N3g3TM4YCZvDSLAfQ06kN7ETSYojRI8c1k5kAUBAEcURVF3/VLFsMMrMANi8DPQvRDEESXfTQBmEtAAfiYETuBnsq2uZB0wMh40Mg15tcMu4CNtclGHwQEgEAB4hNwF0d040DM+YyYe7hFnggNoNQM7sgI6opGWtQ/jnZYQYQ007gYFcQA0zhKbQDM/AAJqMLrYMA0y6L0EDinFgAWaiiEVOAxZyzJa67togiZ+YxE0bg0qcOM5vhINQGOqYijYkNGC2DdbVwHXsA0TMF5CdW9OjhJVbg3ZQBA4bg22+U03sC7YNUKpvcDzcA+FkSQJYDtrbhJtrg12+w9xvhKl/7AFzWNtWFCbAP6tP0ACSeIEHxjoJEHj2kDjuzAQhz4QUHACma4CkzAQKmANByAQikDjb/4P2UDjwuMGpa4NJzAHB7EJdYck6GCeDbFsNyDpHfiVln7pph7nwtPp/zAHmd7mJyAQJ2AN2iAQrW4NZiAQZmDlAjEJbU7jo14Qm3ADLMcBwiegB7EETuQlMfOiwT4SNF5D6y4Qxl7qKuA40a4I/4Dt1uA41W7t/1Dqy77v0n4BUKACZlDoA7EPZ3gkcmBe2BgCy9KLv5ju6m7q/9Ds1kDvnW7vNi4QpT7tUFDj/u7qF6DtAqHp7IYQOIAIF3IYIwABtICSh8CjuAKRKP8J8RXR7hcQ6oae5buQ5dCu76WeDSHv7NbgBm7g6tS+7hlPYTngCCqPGK6ACIacEL73IozgBN1wZwZO8xTR7qyu6p0e59me5c1+AEWvDdWeDa1+5QKB7FWuAklPEGt3D+V7xM2QCyGwBG5BELbQFU4EAhEA0jnDpFqfEVzv79pQ6nKe88N+AIzP+Nfu7K1uBq3O+NbQ7wLx6W3+9nfrtsMw9+f7GJFwAyzADuuAOv9DAnKQBP6ADQyQwFk/+BJR+EXf5kdvDQRPEB1v5W4+B86e6dtOEBcQ7Wq/dejJDUXcnrrBHrgEy46QAS7ZDaqwLTMP+7Ev8ZxO+11vDb9/AbT/TupVTu9tbkPBPxA7n/gfnmIG0A3PwAg8YC1k8f7koNOM/SD9jHQlTv0NUfj/kOpVDhD//l3QZk3bJEWTVFjbJfDfCWsRBR6IqMIhlIUnLlygaNHhR2f9VgTAws3JM5ROTDDohsDlSwRHAswT44HLR5w5de7k2dPnT6BBheqMeAAnRIkCJ0VkGnGSw6XWjP7LFvHER6RNn+50hmPGNSNYunGLVzaeCW4sEWCZFiDHDBzOhs6lW9fu3Z9FcUIpaO2jIjMVT8z5CCViNoGKnOKcRFGqm58e+s1wUSyAgWpHNG8zYASWjhUVcNjEW9r0adSpVft0RqBfhRnEVswmRqxCQIV+pFfv5t3b92+BXJx5IF78JnDkyZUvZ97c+XPo0aVPp17d+nXs2bVv597d+3fw4cWPJ1/e/Hn06dWvZ98+aEAAOw==","news2009":"data:image/gif;base64,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","news2010":"data:image/gif;base64,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","envelope":"data:image/gif;base64,R0lGODlhEAAPAJEAAP///2ZmZgAAAAAAACH5BAAAAAAALAAAAAAQAA8AQAImhI8JcaJugpy0ToVXzgxmJyWQF1nmtaXqQn4h0DYlQpIvHd9qUAAAOw==","fav_g1999":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAAfAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAuZJREFUeJydk0uLW3UAR899JDeZOMk80dF0Oo4UtdgqSp2C+EDQjZUKBRe2K4sgiC5Kt4KK7lyIdtOVgogIbtSFIgMqpYLB6bSZoS9rhmHGaZNMJs+be29u7v/nIh9A8HyAszrH8k7f0fETr9OhiRcUMekW/VSOqbhKaDLgTtKkw4wTEVjjpOI2m06KgnEB4NGT19Uf1CVJsR/IaEt1GcWStvvS5sauOpJarVBRIqkvaRBK7Uh/Hl6Uu2PNY6eyREB/LEO1W+Trb2vcKv1OqWzTD2epuXUOHfR45tgSrzxuceR+h5zpYocVmD29KqNQDfX1my+9eLak6Sd+1t91qSppKOmOpD+uScWjH+vhx85qb09SV7oy4YmFUyUZbSmU9MZH1/XAkfOqRZLRlgamKQ0ThcnItHKrq1J5XYG6UtRV+aGC2Pfmbfmx9P75Dd391GdauxEpkBRqRy0FCrWpQG0pkOLBSOSrrURVrRxErtuysF3Ys8ZIJYs8UkxDEiMnjxd7tFPzWEAm8SGTQ/jYDLHjaUwtj52O9wgw/LB+GRaHmLEaWAYrzkFiUUggnwBWGseAwSYhAYkp18Vu5HMIG7cxBU1hR5PQNSjl000ZiEFOBBlIbOGYLFkEqhBl9mF7SYs0UJyeYPvGDpEzgHGPqJNj3LHxM1DDcLFSZbUes1aDlfUsxpug7VzB9uwMNrscfTIG50E+PLdG046w88AQxgi4uZrh7VOXeOm57zhx7EeWlyvI5MlZc7D/1UCSdDuUFg5fVGHqcy1fkwLFMpLUa0hDKYqly/9Is/vf05ffrMhoS5dm5mQPstsInxlvk19/WmJuZpfjz37Fp59UqA4gyaVpOT16Lmw0Yuq9q3jjPgCZXA9r9q2ybp47hGdGbzQjw5l3f+HC92tE3iSkDuDkB4T1uyjcU+WF530+OPMy92WzlBfmYenkVakzKu+/6A+SUduhpH5ffx24V27qtXd4+gL/iy/8Hf4FGW4Nq9+pMjQAAAAASUVORK5CYII=","fav_g2009":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABDAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAwpJREFUeJwl0strnFUYwOHfe873TSaTyW0ySRPa2GgiDUoWbUQhSANW2y68gVJcqC0I6lZddlu1GzeKm9YLbmIRUUQQgwSE2nrBW2yN0RQS0qbRGNOZdGYy35zL66L/wbN4AHBe9celVR05PqPJwx/oax/Pa1CvWfWGnp+e0t8FbRmjATRgtCHoFiiA8U7VWjh1boGVZh9x192c/uJfltcb5Do7mXz7LKWOAjZGRCxIBCCSsGJQYxMI3nP5nwjFbqK1bO+kfPj9CmDJj99FNnU/HiGagEdoqUXFoxGMRkgkYVdPHtOKGDKMWC4vexCPWAidBRwWGyFRg5VAS8EZSyLmFunIRJkLf6yTtPUSY4YxCRGLyWBjYZG1IcONzl7SFgxUavRvO5wGkiurFUZvK/H80TFmzl9l8e8qXe2RE9N7EIQzs+9w6kiTq3fux0qOECLtDcf+Kzs8fnEV2ffs+/rqift4YnqcSt3x2U9rTI12Mzrcy+nZs5z84S3sYDdEJcQAGMQJalKkZpH+Y+fUZTUOjBR4YHKQk08fBFG+XvqZQ+8eI44NQDQgIK0UAHUe8Sl4wZRsi2Iuz8WlJm/M/MXKRh1Vyx2l3YyNHoCsiYkGExIUj0RFSBFATQvjKpvsac949J4yzxwdp7IdUIHhviEuPHWGw+WDaKNGVAG1RLk1KCrgUmTmq1/1ockJ+noNvrrA1n9LNLavMzT2JPliPy54HvvoZb5cn0NzXRAsxkVisBBANKjWNudZ+vZFevmNJG2gmaHmxtl96FO6SqMsblzj3veOc7PQwnqLBiF6AQ8mi3X+nHuB25Pv2NvfZLCrQLmnjbIssPHNSyiGfeW9DHYMQOYIosQAqU8RD0mrukHRXyOf9nCz5hFviQEK7SVCcw1xdXZMB81aHSTF+BxRHEEDGhXT3jNCW/+D1Lc82iygIUciRcKOpW3oETRX5PNfZrleXUeCQUKEHUNsRYg5kjQx4mqbWpkfRquXENfAJXnaxg6Tn3iOS6vLvPLJm4TEYrKEgIAGIIXX5+R/yZB7kQeZcRMAAAAASUVORK5CYII=","fav_news2009":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAASAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAtlJREFUeJylk1tIUwEAhv+zc842z+Y0t3MkJpXNldnmbDNNypbVSJw3dGhkUln4GFJB0UOXFyl6K7KCQAy60YUUb7MLEVFaMBseuqgTd2nzks5L5nRz6yUiiSzof/7/7+n7gf8M8S8ljU4fA8ACwMrbbZ5/Bmh0+i0cy9bOzc8bDPoNjGNg4CspIHc3PXrQ8keARqcXAzCtXLHijFqdtNa0c4fEKI9D+EkH+rZuw7Wbt0dfve7cztttPABQvwylHMuWyRXyY0kqlSovd5cw5csogi1NmHzXDYoAkqVSWEpL2N7evhcanX41b7dNED/G2Vqt5nI8xyVX7q2gEz97MHb9OjA8BIoAZHlmSM1mCFe9R3imG/UdWjS3tj7u73eYKQCIEotbc4xGaenqVRg+cxruoSHQUglicnOxbJ8FtPAhBJN7EPG4QQCozG9AZ5ciZ25urlAAALOBgKmzq2tq3OPBwvQ0YisrwVy5gbgDYYhmTCDHzoMIuRGmEuATXUV7pxBlZRZKSAtrBYkqtUwkpIudTid9zzcE7u5dnBsx4eTVaYRCIRDhKUSIaPgiNXjQcwr1913o4Xsgi5YiPp5TUgAsCoXiaE6OkWpptSIzIwOhBQ7Wl7MYPFQNGa2DvY/Eh48DCAYHQdM0sjZlgWVZxHOchACANH16FUWSdQVFhSLnoBNHag6j+uw8NmpIHCwRoKmpEQCgULBINxjAMAzarB1oa7fO/PQgM2tzkVgsuimXs5Lionywy7WoOBFE40UaXs8nMFEMlAkJcDgceNTYHPRP+HmXy12+SKREldqoVCrb1ElJUVVV+3GhQYhsfQRb0sLw+nx4+uw5vF6vc2zcf9bv99/h7bbZ30xMz8gsl8XE3iow5wlSU7VwudzoevMWbo/HHQgE6oaHR+p4u21qyS+kGTYeZxXsOUbCRCYmJsdJUnBhZGT0Em+3fVvqO4uyZt362hSNLv9vve+s3gxN+4CXUAAAAABJRU5ErkJggg==","fav_news2012":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAAHAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAM5JREFUeJzFkzEKg0AQRd9uxMsIixex8AbiAdJsb2GTysYDBG/gUYSF7WztkzYgplGjxgSjRX6zw2f+nz8wK7quExyAPCIGcACMMdc9YqVU7PR1tDPAaIB7jhBSIuUJKSVieMX6lvdLDvQrADzyYleE0SDLstUGrTXW2jfe87y5AUCapmNdVRVlWc6avyYYkCQJAGEYjtzmBMsUPycYpi9hraWua3zfn9KFUuploLX+OKVtW1zXnYmDIIhhwykbY2iaZlU8NbjtEQOIv//GJ2rEQ71KdQzQAAAAAElFTkSuQmCC","fav_news2013":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIAAHAQAAJgAAACAgAAAAACAASwMAAC0BAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAADOSURBVHicxZMxCoNAEEXfbsTLCIsXsfAG4gHSbG9hk8rGAwRv4FGEhe1s7ZM2IKZRo8YEo0V+s8Nn/p8/MCu6rhMcgDwiBnAAjDHXPWKlVOz0dbQzwGiAe44QUiLlCSklYnjF+pb3Sw70KwA88mJXhNEgy7LVBq011to33vO8uQFAmqZjXVUVZVnOmr8mGJAkCQBhGI7c5gTLFD8nGKYvYa2lrmt835/ShVLqZaC1/jilbVtc152JgyCIYcMpG2NommZVPDW47REDiL//xidqxEO9SnUM0AAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAxJJREFUeJztVsluE0EQfW04ceKU5AoSByB2JuE7IjshgROS/RkIJFvc+ACUo0d8QfgPkhk7IXhN4myebFKQOHdxmO6e3sZ2bhxS0mi6uqurXr2uXoAH+V/k/GLc1Nu6fnJ23jw5PVP64dFx8/DoWOm9wbDZ7Q+UftDpNg9+d5Te3t9vtvb2lR6391SbycbFOCEAoVCrRAQAIRGBiKrib+jc0kEU8vRv2HM5LvwBqAalInMAMKZUCAfuB4A4h3Cs+jGDnfQLABJAwV4KHYQjcswymTBjqjgASEPriOy3hnOsZ5LHemApfz+sAoyBMQYGJtoFQy8whkeMwcyfFBoDlPD95+s3B0DBtNPX1PHiTM7L/D6MeBkAAWCiaNKcpRGIpTkTWGrC9En3Fy+AJ99/ZC61qgZxcCJwLqrctwO0fuIchNR+dgCMqTVTABQQZMssAks7gtWvtp0Wjay/A0AE/9KoGyh1dvT2x0+fASJEOz+947a8fL0o4mc2/hqYIbjoAAEIVt5kS4HsALLp98WwAJinVblcBgAEQaAmxHGM7e1trS4I8e7OxCTk2KvFolOrJgBrMAgCNBoN9XcyESCWllc8xejPnqwgCgAXBiwnk0qlopio1+vCWWrbinanZg8gZUBO9DHA4JAAAEiSBFEUIYoi1Go10zERSsGywYB++RjZe1iYWIRJkijqZeA4jvXUQABa0e7U7AGxC/JqQO13bdLW1lauYyBbgtJSoNY9JWJK9rnnwIxiOCVCuxU7NsejEZ49fwHGGAoFcZFl7VDaqZO80+05COwbzWBIf2RYmXe6PYzHl1iYn3MAMMbC9cqqKiT3JIS5ppOYKZZK4AT82murvtHoFDe3tyAQFubn7ClGcIOBg07Xc99q9WpXtme9e/0BkuQSnHMQwWYg3Fgv12BJxgDn3ixtBnyBAaA/GOLy6tqw1HyEm28rTnATANEdgKcOAHU8+wEBwGAwxJUM7h6o4buNNW9wQHsREWiNE90R0oNEfkRI7/+ct+JweIjrmxuJTm0z+Sx/v7meG/xBHgQA/gFOSuKx3z9wpQAAAABJRU5ErkJggg==","fav_news2017":"data:image/x-icon;base64,AAABAAEAICAAAAAAIAA8BAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAABANJREFUeJztVk1oXFUU/s67701eEkOwan4WTiqC1kWgSMRfcOFKqIhQQRG7KS60pVu7cOdG1IA4MC7EdqO0FLUr/8C6ak1rQjErGc1L3sybl0kkIaWZxOTNu/e4mLyZ9z+TtR4Y5t5zvnO+79137n0X+M+b4zizzEwA4Lpu0bbtW0tLSzNB3Lbtc5ZlXWJmAQCWZY1alvWLZVkvBZh6vX7CcZyf1tfX7wGAhYUFw7bty47jvBVgqtXqzPLy8nXbticBgJmpWq1+QK7rslKqVCgUPvU87xoRFaWUd5RSLxLRc0T0ETNDSnkVwNvM/KOmaceJyBNCvKbrOimlLgEoSCnnDMN4eW9v74Ku6yeICEqpd5RSv2ua9gMRjUop/zIM4wXP897VNO0M1et1BgDf93d1XR/SNA3MDM/z/hFCDBIRDuKQUu4KIYY0TYNSCkqpVqFQgBDCICJIKdFqtXaFEENCCACAlBK+7+8ahjFEREHtHSHEMABQvV5nIQSUUgjIlFJg5sirYuaIj5mhlIJpmp28wBfMw3lhX4CRUkKLAwKSeJE0I6LcvDAua66HA0qpnqThWB6mV25HQLAc576+N4SK/IFjc/DBmBm/PkxQB/M4jsERX7he5amttoA4aXyaRp54qqQLnOpNmp5ornCRDPK4uN5icgRkgRLkGZYrpg8frayscLBno8DkNoz7mRmmaebi83y+70d3Qb+FeuUcxjo9cPa9SrJwhCSNjPH5h9MAgEajcSihExMTbQF5pGHiJHn6O+7XglqdFcgjTiOP2+TkZCYuy8fMoV2QUT89+TDYfF/iHAgAhk449eoUnn3ifoCBazf+xlff1mKvpDvO64E0EWNjY20BWaA3T07hoeIw3v/kDxAAc0Bk9kM/340sSzRhYM/M3IePP/sTK7UdPP/0AwCAJ4eP4ObtzW5xdFcv6Oo84rSzJFMAMwBq/08/NoqxIwUMDAjcvL3Z+3TMaTqg+9VVSrUFtIPRhOu3NnDqZBFfXK7iu58bOP36USwsbkXJQ5O1tbVMEVJKNJvNyAqMjIxASumkrgAz48urNbzxShHnzzwKIuDGb5v45ns3QdxrBXzfR61Wg+/7EQEbGxt3t7e3pzObsNVSuHjFxsUrduoTt3O64/Hx8VQhrusmyH3fb8zNzT1SLpebWrh2/Id4MEScd0KG/VLKCLmUctm27WPlcrkJZDVh5kETJ+02VrwHAkyz2eyM9/f3rcXFxcdLpdLdAKN37oF9kHaJ+7POMd++9NYcxzleKpWaYQxVKpUVTdOOpt1ms4qGx4ODg6nx4IruOA5WV1e35ufnH5ydnd2J19NbrdZpXdcvMPNUP6Rxf/gyk3GXWDVN81ga+f8GAP8CaF4B3WWvs8wAAAAASUVORK5CYII=","fav_news2018":"data:image/x-icon;base64,AAABAAEAICAAAAAAIABgBQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAABSdJREFUeJztlluIlVUUx39rf5dzZs5xxmPqmGIDEzZWakXmJbwUUfbQSxE9lA89pA9CBRE+ZARiUBHZQxcqowsFhURF1INBmURihZNTaaOVDV4yp3G8zIxnzvftb68evnOdm9GrLdiwv73/31r/ddl7bfhfLnaRyTYXbX9oj5cNl2riAEUBVQVARTmrcCQGDHSII1PGoJrOjCEeKX17+L5tyyay4U9GYMiWCqYY4xKtEhhWpU8Fio61XsT6GX1cWzjB7b3Xsc8JraKopmgVwSa2MJmNSQkgooLgUHpVwAmdieXV1n5WX3aMQvYXsAakyGNT53DHmUs5j2O6Kj4gAkbSoPwnAocdigpYw2stZ7mt5Tjt+YOQFEFDsHlS9RluzR1i+85Wfm0P2ZQX8CjvyX8n8EJrMViV62dR80HQv0GzYH0gV9ZeHmoIc30sPfMHa7p8HmzOcmx2EwfamuieEgZbJrExpgi1e/49FHs2oNxIQEBSZ2v0H5V1AQwM90D0+nwkFyOJw1iLZww2XwCKv7qmjq5wbse7uWdf+rSBgBbvbWf/ga0kQzfhT5v23YnNJC4tpnpbjUxHzQVcDIN7PKQS14oCBRFhSc/zhG6IET8bG9/bfskHO9am0H17dhAUO9ETHOp7kWU/r2GlH49rr05nudpTcVouutk1jKscWeA7E7DnVC/zjjyPZ6cF1tpOqNRA0v81Xr4TBUPCYs9yiWfHeKy1aeN3HSlchZw2YBciGE0AMCJIHO0EMACy4tw6nKvV1HhjAuOjUzFeqsbDzti1b2MtAgDO/ojHouqNR1ogCpyNYSBSYoWcEaZnIDTppgMODCmuHAlX9t4BswKhLWy0LUCU2BMVszUCyciHhCyqhrTMvHtQ2XpLwIqrfZqzwp/9jre+itn7lyMwMGihZ1OOUtzou2eg+zfLhg8j2jI1BkZAbPJjBWcqE1k5tJkSVqR2uvYOKl+sy3LnipBCCwyfj5k312PdLYa+UqU3gLoYnG0Y6izqkqr3BohV8URgZOTzsREASNjtG1Y5hcEYnlzu0zHbY//hEgu2RWA81s4s8fEp4aqsAYW8B5nHo9qxqM93CEtyqUdGoATYxDFj9y9bxydQ5JXAY5UCp2O48cp0++53Yla0ejy83Gfm1IAHFEIfntkRM2Ch95EsUf2h0Voa9vcmbPkyRrIQKZCc+a3eZAMBWcN7P3/S/FLOUBhUJQzS9Z6ScJUoq6/xmTG1mjUKu2KOjSjtszwmktgqZxNoAWKFMDrZNSEBgJ0nl++c6nGXesKho5b2WR5vrvbZuNsy86khOJ5w5LkpzG3z+fSkY3FekIdOAzL2dvTg8lbD5TmPgfJF1fw9709K4O2+eccvbYJCAE98HnPzdQH3r8lwdbvHn6ccN3T6zJ5u2NU1wmWhMOJg9/p8YwpIc37weMIbPySopukoqRdJxEeTEihIYlQFQcn7wtoXhtl6X4Yb5odVzDfd57n7Y8f1eeF0BMsXBOOGf850w9PfWvJNQgY40zTnwGjMGAKO2jEMDAzEhmUvRyxsKnJFQfjsmJILfBbn07bYEsCj285hXaMeAf4aFtqzBgUyCl+0Ld17QQJQu4gqgAXNglWfnwagI9/YkT2Brv60CKu/aW3PSO3793BK8V9FoE5HVUxFWT3JsoSm8b5XqdNRhwsSN+b9MYaAKkYZ5yE3wcOqwfDo9YZGJGmzvRCBuBgdbQozyOiteq9GLWu5c1WjreW5VF48KbJUio6O78b/cjHLP5ecYNAEfomiAAAAAElFTkSuQmCC","fav_news2019":"data:image/x-icon;base64,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","fav_news2020":"data:image/x-icon;base64,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","fav_tr2010":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABVAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAhxJREFUeJx9k8trE2EUxX+TTmszYlpHYjFRaXxRYhdCyaZgcVsQRbA0oJtCaUA3rYL/QaGbLlypq9KF0LhQKhQXokITE1wIKljwEaslj1J14jSPaTJJxsUwk4wkntX3Oufec+/9BIBy8adBCzStaK9reoUB35BAB7j+JccTcR4/XXM8ymU+Ot60QgR4GI3ybXMTgEw2B2DvAW7OTHXimwIWMtkcft8Rh5C17wTBsvB+Y4N79x8wd2sWr0difmmNfeN3mjb2oFQpk9Yltgo6AMpkjyBaBTsTOA7Ao5UoJwIBAhenydb/Gxw5WjVcrQfXwxNksjlirxNk67Ij+owvw1wgz9HucvsaqLt5Xq3HHSQLI/sVhqUiDaPOmOwmoXQDoKk7iDW9QlbZJbQkE5u8ROGPgtfnZ0ExPQOM+DQAtvMlrvb/YIFhW9wFEFoy0z0f9RMcOo3XI/GpCGldAiDoVomnNZ5XTgIwKuto6o4p4F90dJLBu710dTUHb0zeo143+KDAutILwFTfZ/teABBvf7UnrbZ4ShDCq8bBK+MAvDj7Dq9HoqpXbZKq1bj29jCpX6ppoaGaQ9NQc7imYwZA/skzRmWdPrfIm22dSFIkkhRZ/mJmNzGQb2ZgkQCMouKwlJo/RiQpEi832/ryXAqAC7F+bLPtRHpCg+bdgUM2uVH47QjQ9psK4VXDWLksBJe/G6Wq8yMaumavt24Ehb+waeCmMz31bwAAAABJRU5ErkJggg==","fav_tr2012":"data:image/x-icon;base64,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","fav_tr2015":"data:image/x-icon;base64,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","fav_tr2015s":"data:image/x-icon;base64,AAABAAIAEBAAAAAAIAByAgAAJgAAACAgAAAAACAA0wUAAJgCAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAI5SURBVHicfZJNSNRRFMV/773/zDjjzCRqDgN+UBrWYto0EH0YLaJNENXCRVAE6qZVuzbBIFG7WgpJy1q4ahMJtREtiAgXFSIpgUJoSoMzoun8/+/dFvORM8E8uPB4j3PvOeceNfx067nTZkQEHICAACLQEuQvTN3vm6PJ0VaZEdCgNKqh9mx0tBkYQAuViQ3TBZCQdzOX+xZu1sCT6k3+/1Q64nVkWr8sLi4tRSKe8zxPrAVrLcYgu7vBlFcFHk7AyJBPZyusFeDJ2xCBwPJW6+BF//dgPB7DGI0xAhhEhETCXPOqlEeHfN58NcyvahItELjy+0ohRr64Tji8SyIeQylV74Gr6O1KCvOrmksnHA+u+Dy+7gNgRbG4GaO0XyI3+RIRQaRMW0SoSdgoKk71Od4taAp/4NyAqxk7t+zYWp/neE83L6ZnyG/v0JPq5Or57D8Tn82GGBvyuX3WsllUTMyY2la2SXMo0UFmIMWPn2tk+ns5eewIzjm8ChvWC/DwdahuI1Kh6YtiT3Uz/eEj0ZYwZzKD+L6PMQYtUjaLAyUHwFUZ3wtt7JcCUAprLc45giCoD5IArmKSOwAWYKWY5PLpLJn+Xl7NfsJaV5YQ7O1P6HD4bmOeREApUEojAhaPX6V2sr1J2uIxRBxgqF9qw8nlPsfeL2zsAMTjhnt3UqRTUZQCrTVKKXSzBuPj2d2j3WYlGtGMDXfQ2R6qZaCag6YNANIpeXTrRpJ0l0HEIVLWbq1lM789+RegBBTiboovUAAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAABZpJREFUeJytll1sHNUVx3/33pldO/au7bCJCQGMMQpJ2pgmhra4WFEaEqBRvytAaStVQjxApb4gVZWqSgG1lZB4oPBQib61De0DD5SiEsI3WJC2CaFKICFxTELSfPkr9trr7M7ce/qwO5uZnXWUYo50NWfOzL3//zlzPkb97Mlj3adc1wtGe18GQEAgUqvXSInpNqg8DvyCRYr63hNT7xrPvx2l6oc3EkiQqumBDYptPbu7ALsYAp7xTAI8JQvYPaVzZvQrq4EPF0WgETjlffxZ3KgUF52/Hfjl4gg0A2pQmr2jlCY02YcGSkt/BbjPTGBB8AUkTk5rv2t/5Z+rgY8+M4GmgJJWm+aIUlzfc/Vf7ls388flhXxZKe18v/q2tWCMkShHrXU45zSA1sqCG+nr63s9GYGF8qHxU0SK0pyd7+oXpp5QWmht0WitUEohtU0iBgDfN7V7qV9HRo7/2msWcwEGehxb11p6C1XLJ+OKXQcN+z7VCQ5l6/Hp9BJybXNks514WjcQSALE77NZfq6ldlh83X+b5aebQm7qFs7OwOkZxU3LhZ98LaSjJc348Hg7QWApzhQJgjAFupCISCaVhAM9jq1fsIwVFU+95nFySgFwXZdgHUzPq9SnOTLZTrl8Hs8LKRZnyeXa8f3U0U2JaZFad6utrWurSfP7Ny+BA5ycVJy+kAYXoBR6HJ/KYEOHtY65uTnC8MoikaApQG8BJmYVo+Oqbnxqe5DY9PFZxdOvJT08MplnVfckUO2qO57ZifYyPPrg/ZclkMiBhMSME3MwMQvTJci3CJ2tUn8lUo5O5XAiWGsREUQEG4ZYe/lRkaqC0XFY1S30LnN8MqYRYMfffAD6VzoeuSvkzLROlWQx8Pnd8x+QcWfQRgEKrYUdzzyL9jwgqp7qhh0P3Fsj0CAvf2hY1R3y8CbL068qTkxWP8WKDuHHg1Vv3jmqE+ARmet6B/nqilNksh6eB77ngVKcHp/i7f8cYtvgAIXOXKKppTrh3uOafxwwfGOd5bHvBJyZVjgH13QKSsGug4bDZ1XTOXFqfhlZ7xzlcoVrly+ntSWDMZr3D4/Sls2w4eYb8TyTSM5kEtbsf/2X4eg5xV1ftNxYABQcG9Ps/kjz3jHdFFxEmC77nJz2eHffMENfWs3QhjX8d2ySwydOsfnWdYRhUO+UlyKwQKXsO6HZe0InjU1mRAQe2cbDFdzcs5L3Dh7hhmuWsfvfH7C0I8fAmj5EhEqlgu/7aK0REZp2wlRVxAzxZ1G2xwl9PJln6Ja1tC9p4dndw1yYLfHtoVvxzKVZEIYhzlUneIOLDYANTJp5nbALTMxnmLyYpbOtDUFYkm2hNZtN7YnKVV/e9bS50evUhAReeH+W0dNjDPWvJbQhO18eZmZuPuWntTYZgctxiQM3RqMxSueDq7lzoJ/1q3q5b/Mg5aDCn3e9TbF0iUR01sKdMAbaCCxNbuL20FvGVYXrAcXSfJ7tW+6gHFT400tvUSyVEmfqILDDzoY4Z1NLxCHicLEV2cRVr43RiLgencqBEpRWFDrz/OjujRQ68/ien3BIl89f+GYYyrB1EK2wYdWf2dhy4FwsHyQ5IQ9NtGGMQVFtYIWOHPduHiTjmUSU1cjISJPgX5n8YefI9/ceCJ5LFFONxJaNebZtugpjNMYotNY451Cqqkd/Tc3L8ApldM3M876vQFWHD1T1wQ1tbL49j9S8F5F63cel2ohiifb/rt+uX2/7rs3uU4BS1Rbbv6aVbVs68DyNrnnZ7MeknoSLiQBAe4f/mwikryfDD+7pwDcarSGqjXjvj4N/LgT2BG/83WjHyhU+P/xWJxlfoTW178yC4CLC7OzFPWr//gOL5cBzL5578+t35De2LzF4nsYYg9aqPvniJKIkLJUqe1555dB3/weFYj6lM0bc6QAAAABJRU5ErkJggg==","fav_tr2017":"data:image/x-icon;base64,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","tlogo2006":"data:image/gif;base64,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","tlogo2008":"data:image/gif;base64,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","tlogo2010":"data:image/gif;base64,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","tbuttons":"data:image/gif;base64,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","glogoSvg":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3NCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDc0IDI0Ij48cGF0aCBmaWxsPSIjNDI4NUY0IiBkPSJNOS4yNCA4LjE5djIuNDZoNS44OGMtLjE4IDEuMzgtLjY0IDIuMzktMS4zNCAzLjEtLjg2Ljg2LTIuMiAxLjgtNC41NCAxLjgtMy42MiAwLTYuNDUtMi45Mi02LjQ1LTYuNTRzMi44My02LjU0IDYuNDUtNi41NGMxLjk1IDAgMy4zOC43NyA0LjQzIDEuNzZMMTUuNCAyLjVDMTMuOTQgMS4wOCAxMS45OCAwIDkuMjQgMCA0LjI4IDAgLjExIDQuMDQuMTEgOXM0LjE3IDkgOS4xMyA5YzIuNjggMCA0LjctLjg4IDYuMjgtMi41MiAxLjYyLTEuNjIgMi4xMy0zLjkxIDIuMTMtNS43NSAwLS41Ny0uMDQtMS4xLS4xMy0xLjU0SDkuMjR6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTI1IDYuMTljLTMuMjEgMC01LjgzIDIuNDQtNS44MyA1LjgxIDAgMy4zNCAyLjYyIDUuODEgNS44MyA1LjgxczUuODMtMi40NiA1LjgzLTUuODFjMC0zLjM3LTIuNjItNS44MS01LjgzLTUuODF6bTAgOS4zM2MtMS43NiAwLTMuMjgtMS40NS0zLjI4LTMuNTIgMC0yLjA5IDEuNTItMy41MiAzLjI4LTMuNTJzMy4yOCAxLjQzIDMuMjggMy41MmMwIDIuMDctMS41MiAzLjUyLTMuMjggMy41MnoiLz48cGF0aCBmaWxsPSIjNDI4NUY0IiBkPSJNNTMuNTggNy40OWgtLjA5Yy0uNTctLjY4LTEuNjctMS4zLTMuMDYtMS4zQzQ3LjUzIDYuMTkgNDUgOC43MiA0NSAxMmMwIDMuMjYgMi41MyA1LjgxIDUuNDMgNS44MSAxLjM5IDAgMi40OS0uNjIgMy4wNi0xLjMyaC4wOXYuODFjMCAyLjIyLTEuMTkgMy40MS0zLjEgMy40MS0xLjU2IDAtMi41My0xLjEyLTIuOTMtMi4wN2wtMi4yMi45MmMuNjQgMS41NCAyLjMzIDMuNDMgNS4xNSAzLjQzIDIuOTkgMCA1LjUyLTEuNzYgNS41Mi02LjA1VjYuNDloLTIuNDJ2MXptLTIuOTMgOC4wM2MtMS43NiAwLTMuMS0xLjUtMy4xLTMuNTIgMC0yLjA1IDEuMzQtMy41MiAzLjEtMy41MiAxLjc0IDAgMy4xIDEuNSAzLjEgMy41NC4wMSAyLjAzLTEuMzYgMy41LTMuMSAzLjV6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNSIgZD0iTTM4IDYuMTljLTMuMjEgMC01LjgzIDIuNDQtNS44MyA1LjgxIDAgMy4zNCAyLjYyIDUuODEgNS44MyA1LjgxczUuODMtMi40NiA1LjgzLTUuODFjMC0zLjM3LTIuNjItNS44MS01LjgzLTUuODF6bTAgOS4zM2MtMS43NiAwLTMuMjgtMS40NS0zLjI4LTMuNTIgMC0yLjA5IDEuNTItMy41MiAzLjI4LTMuNTJzMy4yOCAxLjQzIDMuMjggMy41MmMwIDIuMDctMS41MiAzLjUyLTMuMjggMy41MnoiLz48cGF0aCBmaWxsPSIjMzRBODUzIiBkPSJNNTggLjI0aDIuNTF2MTcuNTdINTh6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTY4LjI2IDE1LjUyYy0xLjMgMC0yLjIyLS41OS0yLjgyLTEuNzZsNy43Ny0zLjIxLS4yNi0uNjZjLS40OC0xLjMtMS45Ni0zLjctNC45Ny0zLjctMi45OSAwLTUuNDggMi4zNS01LjQ4IDUuODEgMCAzLjI2IDIuNDYgNS44MSA1Ljc2IDUuODEgMi42NiAwIDQuMi0xLjYzIDQuODQtMi41N2wtMS45OC0xLjMyYy0uNjYuOTYtMS41NiAxLjYtMi44NiAxLjZ6bS0uMTgtNy4xNWMxLjAzIDAgMS45MS41MyAyLjIgMS4yOGwtNS4yNSAyLjE3YzAtMi40NCAxLjczLTMuNDUgMy4wNS0zLjQ1eiIvPjwvc3ZnPg==","glogo92":"data:image/png;base64,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","translate24":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADFUlEQVR4AWKgC0gC9E5OXW6FUQDtc41/VI89UxvvtcZVXNu2jbEV28nYNze3j+f0npV8cY271o6z9/10IZBddOILX3hcAKLgmAD5YfIIlQC5IjtuDE77rUDxCYErOiHAjwLFR0eyfivAxHEBJmcBQsG///1ARE4k3z2RoxRgg8Qy45cDTJooz1cJSOQpBcwNo3jcjy5XHwwODcFQmMHBQRgYGIjQ398fcDo96XGB/BjywjB5JKAQcMOZcexRm0XpdwP0PBkJJIrLH/HQY+dwYGQC1fZJLH/ARwI5Ii8/m8FstlOE5EScnBEJkJRR9pCH8fEJfNIawMPPeHjYzOG+e3xEThy560W1xgQOp4vJvx+ghWTQnb/o4JAtKrtzFsiWC7ju1Dh2dOrBYrGBy+X6cYBkjIHhCVS85IHk12oDMD4xgYTeOUlyArNEXnw2gU5vBpvNDpsrZJgY6OvriwZIxmAjyKYteSEIO+8Eod0yiZ+1XESeKROwsLwG1+2V4IbSo7ipTIKbK+S4tVqFW6pUmBQgGaP0QWgNHotrcOgpD3cbOaT3++7ymEUBWYi1J8fx2oOX0NrZDQ6HA6SXbuOzj7WpR5CtECCWA2Kk28bhwHBoF1WKuypWnhlGefUz7FVdxLd1jbBdcgrtdjt4vV6SxweyRGkqMuVREuUZ0iAeuuPBUuUl3FAmwfqWTnA6nbToLJI6wISMjDCJ8nSRVcdHcGupCndITuPZe4+RAoTb7Qa/3x8NpJDGIwtBYiYn0iRBPH6jFrrUeig9fgHP3XmMLODz+WIDQS6VlJHOSJATh257UaMxgt5ghNKTF/FjQ0tyIOfoSFaaNBhMl/LASIthqSREmoTHtKMBApeGWX1iFLVaI50H2k1x6zDlV6+9ez/NW1T0GhcWvSJwQeErPKRsQIPBDLSDCIr8doCuLbvqBxcWv0WiWlGPPWoDmMwWcQS2uIDH4/m9wGF5865FJW+xSl6PnZ1a0OmMYI4PsAj3W4GKipa51fJabG9Xg1qtA4NBHIHJBBaLBaxWKz0TfEODOnfK/7i+AovHxWW/Lj+SAAAAAElFTkSuQmCC","mi":{"language":"","language_o":"","flag":"","flag_o":"","business":"","business_o":"","memory":"","memory_o":"","local_movies":"","local_movies_o":"","directions_bike":"","directions_bike_o":"","science":"","science_o":"","fitness_center":"","fitness_center_o":"","view_headline":"","view_headline_o":"","public":"","public_o":"","location_on":"","location_on_o":"","star":"","star_o":"","person":"","person_o":"","search":"","search_o":"","apps":"","apps_o":"","settings":"","settings_o":"","menu":"","menu_o":"","edit":"","edit_o":"","arrow_forward":"","arrow_forward_o":"","expand_less":"","expand_less_o":"","expand_more":"","expand_more_o":"","history":"","history_o":"","mic":"","mic_o":"","volume_up":"","volume_up_o":"","content_copy":"","content_copy_o":"","swap_horiz":"","swap_horiz_o":"","translate":"","translate_o":"","description":"","description_o":"","image":"","image_o":"","close":"","close_o":"","keyboard_arrow_down":"","keyboard_arrow_down_o":"","chrome_reader_mode":"","chrome_reader_mode_o":"","article":"","article_o":"","star_border":"","star_border_o":"","person_outline":"","person_outline_o":"","clear":"","clear_o":"","thumbs_up_down":"","thumbs_up_down_o":"","share":"","share_o":"","arrow_drop_down":"","arrow_drop_down_o":"","check":"","check_o":"","notifications":"","notifications_o":"","view_module":"","view_list":"","sort_by_alpha":"","folder":"","folder_open":"","more_vert":"","add":"","arrow_back":""}}; } return ugfNtArt.c; } function ugfNtEsc(s) { return String(s === undefined || s === null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } function ugfNtIcon(n, size) { let svg = ugfNtArt().mi[n] || ""; if (size) { svg = svg.replace(/(]*?)\s(width|height)="\d+"/g, "$1").replace("' + svg + ""; } // Gplex for News / for Translate switched on (the default) in Gplex's settings function ugfNtOn(key) { try { return String((typeof GM_getValue === "function" ? GM_getValue(key, null) : null) || "true") !== "false"; } catch (e) { return true; } } function ugfNtTopFrame() { try { return window.top === window.self; } catch (e) { return false; } } // "53 minutes ago" (2005-2016), "57m ago" (2017-2018), "1 hour ago" (2019 on) function ugfNtAgo(d, style) { if (!d || isNaN(d)) { return ""; } const s = Math.max(0, (Date.now() - d.getTime()) / 1000); const m = Math.round(s / 60); const h = Math.floor(s / 3600); const mon = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; if (style === "short") { if (m < 60) { return Math.max(1, m) + "m ago"; } if (h < 24) { return h + "h ago"; } return Math.floor(h / 24) + "d ago"; } if (style === "gm") { if (m < 60) { return Math.max(1, m) + (m === 1 ? " minute ago" : " minutes ago"); } if (h < 24) { return h + (h === 1 ? " hour ago" : " hours ago"); } if (h < 48) { return "Yesterday"; } return Math.floor(h / 24) + " days ago"; } if (m < 60) { return Math.max(1, m) + (m === 1 ? " minute ago" : " minutes ago"); } if (h < 24) { return h + (h === 1 ? " hour ago" : " hours ago"); } return mon[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear(); } // ---- the Google bar, by period ---------------------------------------------------- // "classic": the blue links of 2006-2010; "dark": the black bar of 2011-2016. // here: the product in bold ("News", "Translate") function ugfNtGbar(kind, here, era) { const esc = ugfNtEsc; const who = ugfCalWho(); const signedIn = !!(who.name || who.email); if (kind === "classic") { let apps; if (era === "2007") { apps = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Maps", "https://www.google.com/maps"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"]]; } else if (era === "2009") { apps = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Video", "https://www.youtube.com/"], ["Maps", "https://www.google.com/maps"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"]]; } else { apps = [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Videos", "https://www.youtube.com/"], ["Maps", "https://www.google.com/maps"], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"]]; } let left = ""; apps.forEach(function(a) { left += a[0] === here ? "" + esc(a[0]) + "" : '' + esc(a[0]) + ""; }); left += 'more ▼'; let right = ""; if (here === "Translate") { right = 'Help'; } else if (signedIn) { right = '' + esc(who.email || who.name) + " | " + (era === "2010" ? 'Settings ▾ | ' : 'My Account | ') + 'Sign out'; } else { right = (era === "2010" ? 'Settings ▾ | ' : "") + 'Sign in'; } return '
' + left + '
' + right + "
"; } // the black bar const l = String(layout || ""); const late = ["2014", "2015", "2015L", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(l) > -1; const plusBar = ugfNtPlusBar(); const apps = [["Search", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Maps", "https://www.google.com/maps"], ["Play", "https://play.google.com/"], ["YouTube", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"]].concat(late || plusBar || !ugfDocsInGbar() ? [["Drive", "https://drive.google.com/"]] : []).filter(ugfDvGbarKeep); if (plusBar) { apps.push(["Calendar", "https://calendar.google.com/"]); } let links = plusBar ? '+' + esc(signedIn ? ugfGmailPlusName() : "You") + "" : ""; apps.forEach(function(a) { links += '' + esc(a[0]) + ""; }); links += 'More ▾'; // the +You bar has nothing on the right: the account sits in the header const right = plusBar ? "" : (signedIn ? '' + esc(who.first || who.name || who.email) + "" : '') + '' + ugfNtIcon("settings", 16) + ""; return '
' + links + '
' + right + "
"; } // The Google bar arrived in 2007; in late 2012 and 2013 it was the +You bar, and 2014 on had none // (bold links, +Name first); the legacy (old browser) layouts kept the older one function ugfNtHasGbar() { return ["2007", "2009", "2009L", "2010", "2010N", "2011", "2012", "2013", "2013L", "2015L", "2016L"].indexOf(String(layout || "")) > -1; } function ugfNtPlusBar() { return String(layout || "") === "2013"; } // the right of the grey header: +Name, the count, Share and the photo (late 2012 to // 2014), the app grid, bell and photo (2015-2018 and 2016 on), or nothing (the name // is on the bar) function ugfNtHeadCorner() { const l = String(layout || ""); const who = ugfCalWho(); if (l === "2013" || l === "2014") { if (!(who.name || who.email)) { return '"; } return ''; } if (ugfNtHasGbar() && !ugfNtPlusBar()) { return ""; } return ugfNtKCorner(); } // 2014-2018 without the bar: the app grid, the bell and the round photo in the // grey header (or a blue Sign in) function ugfNtKCorner() { const who = ugfCalWho(); return '
' + ugfNtIcon("apps", 24) + "" + (who.name || who.email ? '' + ugfNtIcon("notifications", 24) + '' + ugfGmailAvatar() + "" : 'Sign in') + "
"; } // the corner of the Material pages: app grid and round photo (or a blue Sign in) function ugfNtCorner() { const who = ugfCalWho(); return '' + ugfNtIcon("apps", 24) + "" + (who.name || who.email ? '' + ugfGmailAvatar() + "" : 'Sign in'); } // the account and apps menus Gmail, Maps and Calendar already use // Docs in the Google bar: "Documents", and "Docs" on the Late 2012-2013 +You bar // Drive came out in April 2012: the bars of the layouts before it leave it out. From // then until 2014 Docs lived inside Drive, and the bar of Late 2012-2013 had Drive only. function ugfDriveYet() { return ["2007", "2009", "2009L", "2010", "2010N", "2011", "2012"].indexOf(String(layout || "")) < 0; } function ugfDocsInGbar() { return ["2013", "2013L"].indexOf(String(layout || "")) < 0; } function ugfDvGbarKeep(a) { const n = typeof a === "string" ? a : (a && a[0]); if (n === "Drive") { return ugfDriveYet(); } if ((n === "Docs" || n === "Documents") && !ugfDocsInGbar()) { return false; } return true; } // the item of the bar lit on the Docs, Sheets, Slides and Forms pages function ugfDocsHere() { return ugfDocsInGbar() ? ugfDocsLabel() : "Drive"; } function ugfDocsLabel() { return String(layout || "") === "2013" ? "Docs" : "Documents"; } function ugfMenusRounded() { return ["2019", "2022"].indexOf(String(layout || "")) > -1; } function ugfNtMenus(shell, material) { // the rounded menus came with the 2019 redesign; every earlier layout had the square ones const chrome = ugfMenusRounded() ? "m2018" : "m2013"; shell.querySelectorAll(".me, .ugf-nt-gbar .who").forEach(function(el) { el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAccountMenu(el, chrome); }); }); shell.querySelectorAll(".apps").forEach(function(el) { el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAppsMenu(el, chrome); }); }); } // common frame rules: Google's own page hidden underneath ours function ugfNtBaseCss(id) { return [ 'html[gplex-nt] body > *:not(#' + id + '):not(#ugf-nt-styles):not(#ugf-gmail-accmenu):not(#ugf-gmail-appsmenu):not(#ugf-gmail-accfence):not(script):not(style) { visibility: hidden !important; pointer-events: none !important; }', 'html[gplex-nt], html[gplex-nt] body { overflow: hidden !important; background: #fff !important; }', 'html[gplex-nt] #ugf-gmail-accfence { z-index: 2147483600 !important; }', 'html[gplex-nt] #ugf-gmail-accmenu, html[gplex-nt] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }', 'html[gplex-nt] #ugf-gmail-accmenu a, html[gplex-nt] #ugf-gmail-appsmenu a { text-decoration: none; }', ugfMapsMenuCss(), '#' + id + ' { position: fixed; inset: 0; z-index: 2147483000; background: #fff; color: #000; font: 13px arial, sans-serif; overflow: auto; text-align: left; visibility: visible; }', '#' + id + ' * { box-sizing: border-box; }', '#' + id + ' .mi { display: inline-flex; font-style: normal; } #' + id + ' .mi svg { display: block; fill: currentColor; }', // the Google bar '#' + id + ' .ugf-nt-gbar.classic { display: flex; justify-content: space-between; padding: 3px 8px 0 8px; height: 25px; font-size: 13px; border-bottom: 1px solid #c9d7f1; }', '#' + id + ' .ugf-nt-gbar.classic .left > * { margin-right: 8px; } #' + id + ' .ugf-nt-gbar.classic a { color: #00c; }', '#' + id + ' .ugf-nt-gbar.classic .more small { font-size: 9px; }', '#' + id + ' .ugf-nt-gbar.dark { display: flex; justify-content: space-between; align-items: center; background: #2d2d2d; height: 30px; padding: 0 0 0 10px; color: #ccc; }', '#' + id + ' .ugf-nt-gbar.dark .left, #' + id + ' .ugf-nt-gbar.dark .right { display: flex; align-items: center; height: 30px; }', '#' + id + ' .ugf-nt-gbar.dark .left a { color: #ccc; line-height: 27px; height: 30px; border-top: 3px solid transparent; text-decoration: none; font-size: 13px; padding: 0 6px; margin-right: 0; }', '#' + id + ' .ugf-nt-gbar.dark .left a:hover { color: #fff; background: #4c4c4c; }', '#' + id + ' .ugf-nt-gbar.dark .left a.here { color: #fff; font-weight: bold; border-top-color: #dd4b39; }', '#' + id + ' .ugf-nt-gbar.dark .right a { color: #ccc; text-decoration: none; font-weight: bold; padding: 0 10px; line-height: 30px; }', '#' + id + ' .ugf-nt-gbar.dark .right .gear { display: inline-flex; align-items: center; border-left: 1px solid #555; height: 22px; } #' + id + ' .ugf-nt-gbar.dark .gear svg { fill: #ccc; }', // the Material corner '#' + id + ' .ib { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; color: #5f6368; }', '#' + id + ' .ib:hover { background: rgba(60,64,67,.08); }', '#' + id + ' .me { display: inline-flex; margin: 0 8px 0 4px; } #' + id + ' .me .pfp { width: 32px; height: 32px; border-radius: 50%; display: block; object-fit: cover; }', '#' + id + ' .me .pfp.letter { background: #c62828; color: #fff; display: flex; align-items: center; justify-content: center; font: 16px Roboto, arial, sans-serif; text-transform: uppercase; }', // the +You bar: bold grey links, the current one white, no red mark '#' + id + ' .ugf-nt-gbar.dark.plus { padding-left: 4px; height: 29px; }', '#' + id + ' .ugf-nt-gbar.dark.plus .left a { font-weight: bold; color: #bbb; border-top: 0; line-height: 29px; height: 29px; padding: 0 9px; }', '#' + id + ' .ugf-nt-gbar.dark.plus .left a:hover { background: transparent; color: #fff; } #' + id + ' .ugf-nt-gbar.dark.plus .left a.here { color: #fff; }', // +Name, the count, Share and the photo '#' + id + ' .kcorner.gplus { gap: 15px; font: 13px arial, sans-serif; }', '#' + id + ' .kcorner .plusname { color: #666 !important; text-decoration: none; }', '#' + id + ' .kcorner .nbox { min-width: 27px; height: 27px; border: 1px solid #c6c6c6; border-radius: 2px; background: linear-gradient(#f8f8f8, #ececec); color: #999; font: bold 14px arial, sans-serif; display: inline-flex; align-items: center; justify-content: center; padding: 0 8px; }', '#' + id + ' .kcorner .sharebtn { height: 27px; border: 1px solid #c6c6c6; border-radius: 2px; background: linear-gradient(#f8f8f8, #ececec); color: #666; display: inline-flex; align-items: center; gap: 8px; padding: 0 12px; cursor: pointer; }', '#' + id + ' .kcorner .sharebtn b { font-size: 16px; font-weight: normal; color: #999; }', '#' + id + ' .kcorner .pfpwrap { display: inline-flex; align-items: center; gap: 4px; margin: 0; }', '#' + id + ' .kcorner .pfpwrap .pfp { width: 27px; height: 27px; border: 1px solid #c6c6c6; border-radius: 2px; }', '#' + id + ' .kcorner .pfpwrap .car { font-style: normal; color: #777; font-size: 9px; }', '#' + id + ' .ksignin.red { border-color: #b0281a; background: linear-gradient(#dd4b39, #d14836); font-size: 11px; }', '#' + id + ' .kcorner { margin-left: auto; display: flex; align-items: center; gap: 14px; }', '#' + id + ' .kcorner .kic { display: inline-flex; color: #666 !important; } #' + id + ' .kcorner .kic svg { width: 22px; height: 22px; }', '#' + id + ' .kcorner .me { margin: 0; }', '#' + id + ' .ksignin { display: inline-flex; align-items: center; height: 30px; padding: 0 12px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff !important; font: bold 13px arial, sans-serif; text-decoration: none !important; }', '#' + id + ' .signin2 { display: inline-flex; align-items: center; height: 36px; padding: 0 24px; margin: 0 8px; border-radius: 4px; background: #1a73e8; color: #fff; font: 500 14px "Google Sans", Roboto, arial, sans-serif; text-decoration: none; }' ]; } // ---- Google News ---------------------------------------------------------------- function ugfNewsWanted() { if (window.location.host !== "news.google.com" || !ugfNtTopFrame()) { return false; } const p = window.location.pathname || "/"; // the front page, the sections and search; stories, publishers and settings stay Google's if (!/^\/($|home|topstories|foryou|headlines|topics\/|search)/.test(p)) { return false; } return ugfNtOn("UGF_NEWS_ON"); } function ugfNewsEra() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "n2019"; } if (l === "2017" || l === "2018" || l === "2018M") { return "n2017"; } if (["2011", "2012", "2013", "2013L", "2014", "2015", "2015L", "2016", "2016C", "2016L"].indexOf(l) > -1) { return "n2012"; } if (l === "2010" || l === "2010N") { return "n2010"; } if (l === "2009" || l === "2009L") { return "n2009"; } if (l === "2006" || l === "2007") { return "n2007"; } return "n2005"; } // the edition: Google News' own hl / gl / ceid, from the address or the U.S. one function ugfNewsLoc() { const q = new URLSearchParams(window.location.search); const hl = q.get("hl") || "en-US"; const gl = q.get("gl") || "US"; const ceid = q.get("ceid") || (gl + ":" + hl.split("-")[0]); return { hl: hl, gl: gl, ceid: ceid }; } function ugfNewsQs() { const l = ugfNewsLoc(); return "hl=" + encodeURIComponent(l.hl) + "&gl=" + encodeURIComponent(l.gl) + "&ceid=" + encodeURIComponent(l.ceid); } function ugfNewsEditions() { return [["U.S.", "en-US", "US", "US:en"], ["U.K.", "en-GB", "GB", "GB:en"], ["Canada English", "en-CA", "CA", "CA:en"], ["Australia", "en-AU", "AU", "AU:en"], ["India", "en-IN", "IN", "IN:en"], ["Ireland", "en-IE", "IE", "IE:en"], ["New Zealand", "en-NZ", "NZ", "NZ:en"], ["South Africa", "en-ZA", "ZA", "ZA:en"]]; } function ugfNewsEditionName() { const l = ugfNewsLoc(); const e = ugfNewsEditions().filter(function(x) { return x[2] === l.gl; })[0]; return e ? e[0] : l.gl; } // the sections each period listed, with Google News' own section colours of 2009 function ugfNewsSections(era) { const tech = era === "n2005" || era === "n2007" || era === "n2009" || era === "n2010" ? "Sci/Tech" : "Technology"; const s = { top: { key: "top", label: era === "n2019" ? "Top stories" : "Top Stories", c: "#6b90da", b: "#ebeff9", icon: era === "n2019" ? "public_o" : "chrome_reader_mode_o" }, WORLD: { key: "WORLD", label: "World", c: "#ffc300", b: "#fff7db", icon: era === "n2019" ? "language_o" : "language" }, NATION: { key: "NATION", label: "U.S.", c: "#3c3ca4", b: "#eeeef9", icon: era === "n2019" ? "flag_o" : "flag" }, BUSINESS: { key: "BUSINESS", label: "Business", c: "#007300", b: "#eaf7ea", icon: era === "n2019" ? "business_o" : "business" }, TECHNOLOGY: { key: "TECHNOLOGY", label: tech, c: "#c00", b: "#ffeeee", icon: era === "n2019" ? "memory_o" : "memory" }, ENTERTAINMENT: { key: "ENTERTAINMENT", label: "Entertainment", c: "#8a60b3", b: "#f5eaff", icon: era === "n2019" ? "local_movies_o" : "local_movies" }, SPORTS: { key: "SPORTS", label: "Sports", c: "#f60", b: "#fff1ec", icon: era === "n2019" ? "directions_bike_o" : "directions_bike" }, SCIENCE: { key: "SCIENCE", label: "Science", c: "#9ac1ba", b: "#e9efee", icon: era === "n2019" ? "science_o" : "science" }, HEALTH: { key: "HEALTH", label: "Health", c: "#438988", b: "#e9f7f7", icon: era === "n2019" ? "fitness_center_o" : "fitness_center" } }; let order; if (era === "n2005" || era === "n2007") { order = ["top", "WORLD", "NATION", "BUSINESS", "TECHNOLOGY", "SPORTS", "ENTERTAINMENT", "HEALTH"]; } else if (era === "n2009" || era === "n2010") { order = ["top", "WORLD", "NATION", "BUSINESS", "TECHNOLOGY", "ENTERTAINMENT", "SPORTS", "HEALTH"]; } else if (era === "n2019") { order = ["top", "NATION", "WORLD", "BUSINESS", "TECHNOLOGY", "ENTERTAINMENT", "SPORTS", "SCIENCE", "HEALTH"]; } else { order = ["top", "WORLD", "NATION", "BUSINESS", "TECHNOLOGY", "ENTERTAINMENT", "SPORTS", "SCIENCE", "HEALTH"]; } return order.map(function(k) { return s[k]; }); } // ---- the stories ------------------------------------------------------------------ function ugfNewsParse(xml) { const doc = new DOMParser().parseFromString(trusted_policy.createHTML(xml), "text/xml"); const text = function(el, sel) { const x = el.querySelector(sel); return x ? x.textContent.trim() : ""; }; const chan = doc.querySelector("channel"); const out = { title: chan ? text(chan, "title") : "", link: chan ? text(chan, "link") : "", built: chan && text(chan, "lastBuildDate") ? new Date(text(chan, "lastBuildDate")) : null, items: [] }; doc.querySelectorAll("item").forEach(function(it) { const src = it.querySelector("source"); const source = src ? src.textContent.trim() : ""; let title = text(it, "title"); if (source && title.slice(-(source.length + 3)) === " - " + source) { title = title.slice(0, -(source.length + 3)); } const related = []; const desc = text(it, "description"); if (desc) { const h = new DOMParser().parseFromString(trusted_policy.createHTML(desc), "text/html"); h.querySelectorAll("li").forEach(function(li) { const a = li.querySelector("a"); const f = li.querySelector("font"); if (a) { related.push({ title: a.textContent.trim(), link: a.getAttribute("href"), source: f ? f.textContent.trim() : "" }); } }); } const link = text(it, "link"); out.items.push({ id: text(it, "guid"), title: title, link: link, source: source, sourceUrl: src ? src.getAttribute("url") : "", date: new Date(text(it, "pubDate")), related: related.filter(function(r) { return r.link !== link && r.title !== title; }).slice(0, 4) }); }); return out; } function ugfNewsFeed(path) { const c = ugfNewsFeed.c || (ugfNewsFeed.c = {}); if (!c[path]) { c[path] = fetch(path, { credentials: "include" }).then(function(r) { return r.text().then(function(t) { const f = ugfNewsParse(t); f.url = r.url; return f; }); }); c[path].catch(function() { delete c[path]; }); } return c[path]; } function ugfNewsFeedPath(sec, q, topicId) { const qs = ugfNewsQs(); if (q) { return "/rss/search?q=" + encodeURIComponent(q) + "&" + qs; } if (topicId) { return "/rss/topics/" + topicId + "?" + qs; } if (!sec || sec === "top") { return "/rss?" + qs; } return "/rss/headlines/section/topic/" + sec + "?" + qs; } // the pictures: Google's own page for the same section carries each story's // picture next to the story's id, which is the same id the feed gives function ugfNewsPics(url) { const c = ugfNewsPics.c || (ugfNewsPics.c = {}); if (!c[url]) { c[url] = fetch(url, { credentials: "include" }).then(function(r) { return r.text(); }).then(function(h) { const map = {}; const re = /\.\/read\/(CBMi[\w-]+)|src="(\/api\/attachments\/[^"]+)"|src="(https:\/\/encrypted-tbn\d\.gstatic\.com\/faviconV2[^"]+)"/g; let m; let cur = ""; let at = 0; while ((m = re.exec(h))) { if (m[1]) { cur = m[1]; at = m.index; } else if (cur && m.index - at < 4000) { const e = map[cur] || (map[cur] = {}); if (m[2] && !e.img) { e.img = m[2].replace(/&/g, "&").replace(/=[-\w]*$/, ""); } else if (m[3] && !e.fav) { e.fav = m[3].replace(/&/g, "&"); } } } return map; }).catch(function() { return {}; }); } return c[url]; } // the front page's own section ("Top stories" / Headlines), whose page carries the // pictures: its id is the first section link on Google's front page function ugfNewsTopId() { const qs = ugfNewsQs(); const c = ugfNewsTopId.c || (ugfNewsTopId.c = {}); if (!c[qs]) { const mine = document.querySelector("a[href^='./topics/'], a[href^='/topics/']"); const m0 = mine && !mine.closest("#ugf-news") ? String(mine.getAttribute("href")).match(/topics\/([\w-]+)/) : null; c[qs] = m0 ? Promise.resolve(m0[1]) : fetch("/?" + qs, { credentials: "include" }).then(function(r) { return r.text(); }).then(function(h) { const m = h.match(/href="\.\/topics\/([\w-]+)/); return m ? m[1] : ""; }).catch(function() { return ""; }); } return c[qs]; } function ugfNewsPicUrl(img, w, h) { return img ? img + "=w" + w + "-h" + h + "-p-df" : ""; } // "In the News": the names the headlines have most in common function ugfNewsTopics(items, n) { const stop = /^(The|A|An|And|Or|But|In|On|At|Of|For|To|From|With|By|As|After|Before|Over|Under|How|Why|What|Who|When|Where|Is|Are|Was|Were|Be|New|Top|More|Most|Live|Watch|Video|Photos|Update|Updates|Breaking|Report|Says|Say|Said|Will|Can|Could|Would|Should|May|It|Its|This|That|These|Those|He|She|They|We|You|I|His|Her|Their|Our|Not|No|Yes|All|Some|First|Last|Here|There|Now|Today|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday|Opinion|Analysis|Exclusive)$/; const count = {}; items.forEach(function(it) { const words = String(it.title).replace(/[’']s\b/g, "").replace(/[,:;!?"“”()|–—]/g, " | ").split(/\s+/); let run = []; const flush = function() { while (run.length && stop.test(run[0])) { run.shift(); } if (run.length) { const k = run.slice(0, 3).join(" "); if (k.length > 2) { count[k] = (count[k] || 0) + (run.length > 1 ? 2 : 1); } } run = []; }; words.forEach(function(w, i) { const clean = w.replace(/^[^\w]+|[^\w.]+$/g, ""); if (w !== "|" && /^[A-Z][\w.&-]*$/.test(clean) && !(i === 0 && stop.test(clean)) && !/^(Say|Says|They|Them|Stole|Warns|Gets|Takes|Makes|Calls|Plans|Wants)$/.test(clean)) { run.push(clean.replace(/\.$/, "")); } else { flush(); } }); flush(); }); return Object.keys(count).filter(function(k) { return count[k] >= 2 && !stop.test(k); }).sort(function(a, b) { return count[b] - count[a]; }).slice(0, n); } // The tab icon Google News really had at the time of each layout (from the Wayback // Machine): google.com's own until 2009 (News pages named no icon of their own), // the stack of papers from August 2009, the newspaper with the red bar in 2012 and, // with the grey g on it, from November 2012 until mid-2017, the blue-bar newspaper // with the blue G until the 2018 redesign, then the G-and-lines icons function ugfNewsFav() { const A = ugfNtArt(); const l = String(layout || ""); const pick = { "2022": "news2020", "2019": "news2019", "2018M": "news2018", "2018": "news2017", "2017": "news2017", "2016": "news2013", "2016C": "news2013", "2016L": "news2013", "2015": "news2013", "2015L": "news2013", "2014": "news2013", "2013": "news2013", "2013L": "news2013", "2012": "news2012", "2011": "news2009", "2010": "news2009", "2010N": "news2009", "2009L": "news2009", "2009": "g2009" }[l] || "g1999"; return A["fav_" + pick]; } // the era's tab icon on the News pages Gplex leaves to Google (stories, publishers, // settings) too, so the tab never flips back to today's icon function ugfNewsFavOnly() { if (!ugfNtTopFrame() || !ugfNtOn("UGF_NEWS_ON")) { return; } const fav = ugfNewsFav(ugfNewsEra()); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); } // ---- the page --------------------------------------------------------------------- function ugfNewsMain() { const era = ugfNewsEra(); const A = ugfNtArt(); const esc = ugfNtEsc; const l = String(layout || ""); const material = era === "n2017" || era === "n2019"; const secs = ugfNewsSections(era); console.log("[Gplex] News: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); const style = document.createElement("style"); style.id = "ugf-nt-styles"; style.textContent = ugfNtBaseCss("ugf-news").concat(ugfNewsCss(era)).join("\n"); (document.head || document.documentElement).appendChild(style); document.documentElement.setAttribute("gplex-nt", era); const fav = ugfNewsFav(era); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); const shell = document.createElement("div"); shell.id = "ugf-news"; shell.setAttribute("era", era); document.body.appendChild(shell); // where we are: the front page, a section, or a search const route = function() { const p = window.location.pathname; const q = new URLSearchParams(window.location.search).get("q"); if (/^\/search/.test(p) && q) { return { sec: "search", q: q }; } const m = p.match(/^\/topics\/([\w-]+)/); if (m) { let sec = ""; try { sec = JSON.parse(sessionStorage.getItem("ugfNewsTopics") || "{}")[m[1]] || ""; } catch (e) {} return { sec: sec || "topic", topic: m[1] }; } return { sec: "top" }; }; let st = route(); const secLabel = function(k) { const s = secs.filter(function(x) { return x.key === k; })[0]; return s ? s.label : ""; }; const target = material ? ' target="_blank" rel="noopener"' : ""; const storyLink = function(it, cls, text) { return '" + esc(text || it.title) + ""; }; const searchLink = function(t) { return "/search?q=" + encodeURIComponent(t) + "&" + ugfNewsQs(); }; // ---- the frame of each period const searchBox = function(big) { return '
" + '
'; }; const navHtml = function(topics) { let h = ""; secs.forEach(function(s) { const on = st.sec === s.key; if (era === "n2005" || era === "n2007") { h += '' + (on ? ">" : "") + esc(s.label) + ""; } else if (era === "n2009") { h += '' + esc(s.label) + ""; } else if (era === "n2010") { h += '' + esc(s.label) + ""; if (s.key === "top" && topics) { h += '
' + topics.map(function(t) { return '' + esc(t) + ""; }).join("") + "
"; } } else if (era === "n2012") { h += '' + esc(s.label) + ""; if (s.key === "top" && topics) { h += '
' + topics.map(function(t) { return '' + esc(t) + ""; }).join("") + "
"; } } else { h += '' + ugfNtIcon(s.icon, 24) + "" + esc(s.label) + ""; } }); return h; }; const header = function() { const edSel = '"; if (era === "n2005") { return '
' + '
' + searchBox() + '
Search and browse 4,500 news sources updated continuously.
' + ''; } if (era === "n2007" && !ugfNtHasGbar()) { // 2006: the BETA was gone but the Google bar had not come yet return '
' + '
' + searchBox() + '
Search and browse 4,500 news sources updated continuously.
' + ''; } if (era === "n2007") { return ugfNtGbar("classic", "News", "2007") + '
' + '
' + searchBox() + '
Search and browse 4,500 news sources updated continuously.
' + ''; } if (era === "n2009") { return ugfNtGbar("classic", "News", "2009") + ''; } if (era === "n2010") { return ugfNtGbar("classic", "News", "2010") + '
' + '
' + searchBox(true) + 'Advanced news search
' + ''; } if (era === "n2012") { return (ugfNtHasGbar() ? ugfNtGbar("dark", "News") : "") + '
" + '
' + '
' + ugfNtHeadCorner() + "
" + '
News' + esc(ugfNewsEditionName()) + ' edition ▾' + edSel + '' + 'Modern ▾' + ugfNtIcon("settings", 18) + "
"; } if (era === "n2017") { return '
' + ugfNtIcon("menu", 24) + "" + '' + '
' + ugfNtIcon("search", 24) + '
' + '
' + ugfNtCorner() + "
" + '
HeadlinesLocalFor You' + '' + esc(ugfNewsEditionName()) + " " + ugfNtIcon("keyboard_arrow_down", 20) + edSel + "" + '' + ugfNtIcon("settings", 24) + "
"; } return '
' + ugfNtIcon("menu", 24) + "" + '' + '
' + ugfNtIcon("search", 24) + '
' + '
' + ugfNtCorner() + "
"; }; // ---- one story, in the period's style const pic = function(it, w, h) { if (!it.img) { return ""; } return ''; }; const story = function(it, opts) { opts = opts || {}; const ago = ugfNtAgo(it.date, era === "n2017" ? "short" : (era === "n2019" ? "gm" : "")); if (era === "n2005" || era === "n2007" || era === "n2009" || era === "n2010") { let h = '
'; if (!opts.small && it.img) { h += '
' + pic(it, 80, 80) + '
' + esc(it.source) + "
"; } h += '
' + storyLink(it) + "
"; h += '
' + esc(it.source) + "" + (era === "n2010" ? " - " : " - ") + esc(ago) + (era === "n2010" ? "" : "") + "
"; if (!opts.small) { const rel = it.related; rel.slice(0, 2).forEach(function(r) { h += '
' + esc(r.title) + ' ' + esc(r.source) + "
"; }); if (rel.length > 2) { h += '
' + rel.slice(2).map(function(r) { return '' + esc(r.source || r.title) + ""; }).join(" - ") + "
"; } h += '"; } else if (it.related.length) { h += '"; } return h + "
"; } if (era === "n2012") { let h = '
'; if (!opts.small) { h += '
' + (it.img ? '' + pic(it, 72, 72) + "" : '') + '
' + esc(it.source) + "
" + (opts.first ? 'See realtime coverage' : "") + "
"; } h += '
' + storyLink(it) + '
' + esc(it.source) + " - " + esc(ago) + "
"; if (!opts.small && it.related.length) { h += '
' + it.related.slice(0, 3).map(function(r) { return '
' + esc(r.title) + ' ' + esc(r.source) + "
"; }).join("") + "
"; } return h + "
"; } if (era === "n2017") { let h = '
'; h += '
' + (it.img ? '" + pic(it, 128, 128) + "" : "") + "
"; h += '
' + storyLink(it) + '
' + esc(it.source) + " · " + esc(ago) + "
"; if (it.related.length) { h += '
RELATED COVERAGE
' + it.related.slice(0, 3).map(function(r) { return '
" + esc(r.title) + '
' + esc(r.source) + "
"; }).join(""); } h += 'View full coverage ' + ugfNtIcon("arrow_forward", 18) + "
"; return h; } // 2019 on let h = '
' + storyLink(it) + '
' + (it.fav ? '' : "") + esc(it.source) + " · " + esc(ago) + "
" + (it.img ? '" + pic(it, 200, 124) + "" : "") + "
"; if (it.related.length) { h += '
    ' + it.related.slice(0, 3).map(function(r) { return '
  • " + esc(r.title) + '
    ' + esc(r.source) + "
  • "; }).join("") + "
"; } h += '' + ugfNtIcon("chrome_reader_mode_o", 18) + "View full coverage
"; return h; }; // ---- the whole page let seq = 0; const paint = function() { const my = ++seq; const isTop = st.sec === "top"; const title = st.sec === "search" ? st.q : (st.sec === "topic" ? "" : secLabel(st.sec)); document.title = material ? (st.sec === "search" ? st.q + " - Google News" : (isTop ? "Google News" : title + " - Latest - Google News")) : (st.sec === "search" ? st.q + " - Google News" : (isTop ? "Google News" : "Google News - " + title)); let h = header(); const loading = '
Loading...
'; if (material) { h += '
" + '

' + loading + '
'; } else if (era === "n2012") { h += '
' + navHtml([]) + '
' + loading + '
'; } else { const left = '
' + (era === "n2009" ? '
' : "") + navHtml([]) + '
' + (era === "n2010" ? "" : ' News Alerts

') + (era === "n2005" || era === "n2007" ? 'RSS | Atom
About Feeds' + (era === "n2005" ? '

About Google News' : '

Mobile News') : (era === "n2009" ? 'Text Version

Standard Version

Image Version

RSS' : "")) + "
"; h += '
' + left + '
' + (era === "n2005" || era === "n2007" ? '' : "") + '
' + '
' + loading + '
' + '
' + '
' + searchBox() + '
©' + ({ n2005: 2005, n2007: 2007, n2009: 2009, n2010: 2010 }[era]) + ' Google - Google Home - Advertising Programs - ' + 'Business Solutions - About Google
'; } shell.innerHTML = trusted_policy.createHTML(h); shell.scrollTop = 0; // the edition picker of 2005-2009 sits in the Top Stories bar const edsel = shell.querySelector(".edsel"); if (edsel) { edsel.innerHTML = trusted_policy.createHTML(' '); } if (era === "n2009") { const ep = shell.querySelector(".cnav .edpick"); ep.innerHTML = trusted_policy.createHTML('"); } ugfNtMenus(shell, material); const setTitle = function(t) { shell.querySelectorAll(".pt").forEach(function(x) { x.textContent = t; }); }; setTitle(era === "n2019" && isTop ? "" : (st.sec === "search" ? (material ? st.q : "Search results for " + st.q) : (title || (isTop ? secLabel("top") : "")))); // the stories of this page const where = st.sec === "top" ? ugfNewsTopId() : Promise.resolve(""); where.then(function(topId) { const path = topId ? ugfNewsFeedPath("", "", topId) : ugfNewsFeedPath(st.sec === "search" || st.sec === "topic" ? "" : st.sec, st.sec === "search" ? st.q : "", st.topic); return ugfNewsFeed(path).then(function(f) { f.topId = topId; return f; }); }).then(function(f) { if (my !== seq) { return; } // a section reached by name: remember its topic page, for Back and reloads const tm = String(f.url || "").match(/\/rss\/topics\/([\w-]+)/); if (tm && st.sec !== "top" && st.sec !== "search" && !f.topId) { try { const map = JSON.parse(sessionStorage.getItem("ugfNewsTopics") || "{}"); if (st.sec !== "topic") { map[tm[1]] = st.sec; } sessionStorage.setItem("ugfNewsTopics", JSON.stringify(map)); } catch (e) {} if (!st.topic) { st.topic = tm[1]; try { history.replaceState({ ugfNews: 1 }, "", "/topics/" + tm[1] + "?" + ugfNewsQs()); } catch (e) {} } } if (st.sec === "topic") { setTitle(String(f.title).replace(/ - (Latest - )?Google News$/, "")); } const upd = shell.querySelector(".upd"); if (upd && f.built && era !== "n2010") { const mins = Math.max(1, Math.round((Date.now() - f.built) / 6e4)); upd.innerHTML = trusted_policy.createHTML((era === "n2005" || era === "n2007" ? "Auto-generated " : "Updated ") + "" + mins + (mins === 1 ? " minute" : " minutes") + " ago"); } fill(f, my); // the pictures, from Google's own page for the same thing let picUrl = f.topId ? "/topics/" + f.topId + "?" + ugfNewsQs() : "/?" + ugfNewsQs(); if (st.sec === "search") { picUrl = "/search?q=" + encodeURIComponent(st.q) + "&" + ugfNewsQs(); } else if (st.topic) { picUrl = "/topics/" + st.topic + "?" + ugfNewsQs(); } ugfNewsPics(picUrl).then(function(map) { if (my !== seq) { return; } let any = false; f.items.forEach(function(it) { const p = map[it.id]; if (p && (p.img !== it.img || p.fav !== it.fav)) { it.img = p.img; it.fav = p.fav; any = true; } }); if (any) { fill(f, my); } }); }).catch(function() { if (my === seq) { shell.querySelector(".stories").innerHTML = trusted_policy.createHTML('
' + (material ? "Couldn't load stories. Check your connection and try again." : "Sorry, the news could not be loaded. Please try again later.") + "
"); } }); }; // the stories, the right-hand column and (on the front page) the sections below const fill = function(f, my) { const isTop = st.sec === "top"; const items = f.items; const box = shell.querySelector(".stories"); const side = shell.querySelector(".cside, .kside, .mside"); let mainN = items.length; if (!material && era !== "n2012" && isTop) { mainN = 3; } else if (isTop) { mainN = Math.min(items.length, era === "n2012" ? 10 : 12); } let h = ""; items.slice(0, mainN).forEach(function(it, i) { h += story(it, { first: i === 0 }); }); if (!items.length) { h = '
' + (st.sec === "search" ? "Your search - " + esc(st.q) + " - did not match any news results." : "No stories right now.") + "
"; } if (era === "n2019" && isTop) { h = '' + h; } box.innerHTML = trusted_policy.createHTML(h); const topics = ugfNewsTopics(items, 10); // the keyword list under Top Stories (2010-2016) const kws = shell.querySelector(".kws"); if (kws && isTop) { kws.innerHTML = trusted_policy.createHTML(topics.map(function(t) { return '' + esc(t) + ""; }).join("")); } // the right-hand column let s = ""; const rest = items.slice(mainN); const recent = items.slice().sort(function(a, b) { return b.date - a.date; }).filter(function(it) { return items.indexOf(it) >= mainN || !isTop; }).slice(0, 5); if (era === "n2005" || era === "n2007" || era === "n2009") { if (isTop) { s += '
' + (era === "n2005" ? "Customize this pageNew!" : 'Personalize this page') + "
"; rest.slice(0, 7).forEach(function(it) { s += story(it, { small: true }); }); s += '
In The News
' + topics.map(function(t) { return '' + esc(t) + ""; }).join("") + "
"; } else { s += '
'; ugfNewsFeed(ugfNewsFeedPath("top")).then(function(tf) { const t = shell.querySelector(".topl"); if (t && my === seq) { t.innerHTML = trusted_policy.createHTML(tf.items.slice(0, 6).map(function(it) { return story(it, { small: true }); }).join("")); } }).catch(function() {}); } } else if (era === "n2010") { s += '
Recent
' + recent.map(function(it) { return story(it, { small: true }); }).join("") + "
"; } else if (era === "n2012") { const who = ugfCalWho(); if (!(who.name || who.email) && l !== "2012" && l !== "2013" && l !== "2013L") { s += '
Sign in to get news on topics you care about.
Learn more
'; } s += '
Recent
' + recent.map(function(it) { return story(it, { small: true }); }).join(""); } else if (era === "n2017") { if (topics.length) { s += '
In the News
' + topics.map(function(t) { return '' + esc(t) + ""; }).join("") + "
"; } s += '
Recent
' + recent.map(function(it) { return '
' + storyLink(it) + '
' + esc(it.source) + " · " + esc(ugfNtAgo(it.date, "short")) + "
"; }).join("") + "
"; } else { s += '
Recent
' + recent.map(function(it) { return '
' + storyLink(it) + '
' + esc(it.source) + "
"; }).join("") + "
"; if (topics.length) { s += '
In the news
' + topics.slice(0, 8).map(function(t) { return '' + esc(t) + ""; }).join("") + "
"; } } if (side) { side.innerHTML = trusted_policy.createHTML(s); } // the sections below the front page (2005-2010) const below = shell.querySelector(".csecs"); if (below && isTop) { const list = secs.filter(function(x) { return x.key !== "top"; }); below.innerHTML = trusted_policy.createHTML('
' + list.map(function(x) { return '
Loading...
'; }).join("") + "
"); list.forEach(function(x) { ugfNewsFeed(ugfNewsFeedPath(x.key)).then(function(sf) { if (my !== seq) { return; } const b = below.querySelector('.sec[data-k="' + x.key + '"] .secb'); b.innerHTML = trusted_policy.createHTML(sf.items.slice(0, 2).map(function(it) { return story(it); }).join("")); }).catch(function() {}); }); } }; // ---- getting around const go = function(next, push) { st = next; try { let url = "/?" + ugfNewsQs(); if (st.sec === "search") { url = "/search?q=" + encodeURIComponent(st.q) + "&" + ugfNewsQs(); } else if (st.topic) { url = "/topics/" + st.topic + "?" + ugfNewsQs(); } else if (st.sec !== "top") { url = window.location.pathname + window.location.search; } history[push ? "pushState" : "replaceState"]({ ugfNews: 1 }, "", url); } catch (e) {} paint(); }; shell.addEventListener("click", function(ev) { const a = ev.target.closest("[data-sec], [data-q], .burger, .b2, .go"); if (!a || !shell.contains(a)) { return; } if (a.classList.contains("burger")) { ev.preventDefault(); shell.classList.toggle("nonav"); return; } if (a.classList.contains("b2")) { ev.preventDefault(); const q = (a.form && a.form.querySelector(".q") || {}).value || ""; window.location.href = "https://www.google.com/search?q=" + encodeURIComponent(q); return; } if (a.classList.contains("go") && a.type === "button") { ev.preventDefault(); const sel = shell.querySelector(".edsel select"); if (sel) { sel.dispatchEvent(new Event("change", { bubbles: true })); } return; } if (ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.button === 1) { return; } const q = a.getAttribute("data-q"); if (q) { ev.preventDefault(); go({ sec: "search", q: q }, true); return; } const sec = a.getAttribute("data-sec"); if (sec) { ev.preventDefault(); go({ sec: sec }, true); } }); shell.addEventListener("submit", function(ev) { const f = ev.target.closest("form.nsearch"); if (!f) { return; } ev.preventDefault(); const q = f.querySelector(".q").value.trim(); if (q) { go({ sec: "search", q: q }, true); } }); shell.addEventListener("change", function(ev) { const sel = ev.target.closest("select.ed"); if (!sel) { return; } const v = sel.value.split("|"); window.location.href = "/?hl=" + encodeURIComponent(v[0]) + "&gl=" + encodeURIComponent(v[1]) + "&ceid=" + encodeURIComponent(v[2]); }); window.addEventListener("popstate", function() { st = route(); paint(); }); paint(); // fresh stories now and then, as Google News did every few minutes setInterval(function() { if (!document.hidden) { ugfNewsFeed.c = {}; ugfNewsPics.c = {}; const y = shell.scrollTop; paint(); shell.scrollTop = y; } }, 15 * 60 * 1000); } // ---- how Google News looked, period by period ------------------------------------ function ugfNewsCss(era) { const N = "#ugf-news"; const classic = [ N + ' { font: 13px arial, sans-serif; }', N + ' a { color: #00c; } ' + N + ' a:visited { color: #551a8b; }', N + ' .nhead { display: flex; align-items: flex-start; }', N + ' .nhead .logo img { display: block; border: 0; }', N + ' .nsearch { display: flex; align-items: center; gap: 3px; flex-wrap: wrap; }', N + ' .nsearch .q { font: 13px arial, sans-serif; padding: 2px 3px; border: 1px solid #7f9db9; }', N + ' .nsearch input[type=submit], ' + N + ' .nsearch input[type=button] { font: 13px arial, sans-serif; padding: 1px 6px; }', N + ' .slogan { color: #a03; font-weight: bold; font-size: 13px; margin-top: 2px; }', N + ' .new { color: #f00; font-size: 11px; }', N + ' .cbody { display: flex; }', N + ' .cnav { width: 118px; flex: 0 0 118px; }', N + ' .cnav .ni { display: block; font-weight: bold; color: #000; text-decoration: none; }', N + ' .cnav .nl { text-align: center; margin: 22px 0; line-height: 1.3; } ' + N + ' .cnav .nl img { vertical-align: middle; }', N + ' .cmain { flex: 1; min-width: 0; padding-left: 12px; }', N + ' .sh { display: flex; align-items: center; gap: 8px; padding: 2px 4px; }', N + ' .sh .pt { font-weight: bold; font-size: 17px; }', N + ' .sh .upd { margin-left: auto; font-size: 13px; }', N + ' .cols { display: flex; gap: 22px; } ' + N + ' .cols .stories { flex: 1 1 0; min-width: 0; } ' + N + ' .cols .cside { width: 38%; flex: 0 0 38%; }', N + ' .st { overflow: hidden; margin: 12px 0 18px 0; }', N + ' .st .th { float: right; width: 90px; text-align: center; margin: 0 0 6px 12px; }', N + ' .st .th img { display: block; margin: 0 auto; width: 80px; height: 80px; object-fit: cover; border: 1px solid #00c; }', N + ' .st .th .ts { font-size: 10px; color: #666; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }', N + ' .st .tt a { font-size: 17px; font-weight: bold; }', N + ' .st .src { color: #666; } ' + N + ' .st .src .sn { font-weight: bold; }', N + ' .st .rel a { font-size: 13px; } ' + N + ' .st .rel .rs { color: #666; }', N + ' .st .gsrc a { color: #008000; } ' + N + ' .st .all a { color: #008000; font-weight: bold; }', N + ' .st.small { margin: 8px 0; } ' + N + ' .st.small .tt a { font-size: 13px; font-weight: bold; } ' + N + ' .st.small .src .sn { font-weight: normal; } ' + N + ' .st.small .all { display: inline; } ' + N + ' .st.small .all a { font-weight: normal; }', N + ' .pers { border: 1px solid #36c; text-align: center; padding: 4px; font-size: 16px; font-weight: bold; }', N + ' .itn { margin-top: 14px; border-top: 1px solid #ccc; padding-top: 8px; width: 90%; } ' + N + ' .itng { display: grid; grid-template-columns: 1fr 1fr; gap: 1px 10px; margin-top: 8px; }', N + ' .csecs .scols { display: grid; grid-template-columns: 1fr 1fr; gap: 0 28px; margin: 18px 10px 0 10px; }', N + ' .csecs .sech { display: flex; justify-content: space-between; border-top: 3px solid; padding: 3px 4px; }', N + ' .csecs .sech a { color: #000; font-weight: bold; font-size: 17px; } ' + N + ' .csecs .sech .edit { color: #00c; text-decoration: underline; font-size: 13px; cursor: pointer; }', N + ' .cfoot { clear: both; text-align: center; margin: 24px 0 16px 0; } ' + N + ' .cfoot .nsearch { justify-content: center; background: #e5ecf9; padding: 14px 0; border-top: 1px solid #36c; }', N + ' .cfoot .fl { margin-top: 12px; font-size: 13px; }', N + ' .loading { padding: 16px 4px; color: #666; }' ]; const css = {}; // ---- 2002-2005: the BETA page, its links beside the logo css.n2005 = classic.concat([ N + ' .nhead { justify-content: center; padding: 8px 8px 0 8px; gap: 14px; }', N + ' .nhead .tabs { display: flex; gap: 14px; font-size: 13px; margin: 2px 0 4px 0; align-items: baseline; } ' + N + ' .nhead .tabs .adv { font-size: 11px; margin-left: 12px; }', N + ' .vlinks { text-align: right; padding: 4px 6px; font-size: 13px; }', N + ' .cnav .ni { background: #efefef; border-left: 4px solid; border-bottom: 2px solid #fff; padding: 2px 6px; }', N + ' .cnav .ni.on { background: #c03 !important; color: #fff; border-left-color: #c03 !important; }', N + ' .sh { background: #efefef; border-top: 2px solid #c03; }', N + ' .pers { border: 1px solid #36c; background: #fff; }' ]); // ---- 2006-2008: the Google bar over it, the logo centred with the search css.n2007 = css.n2005.concat([ N + ' .nhead { padding: 10px 8px 0 8px; gap: 12px; align-items: center; }', N + ' .nhead .hc { padding-top: 0; }', N + ' .vlinks { padding: 10px 0 4px 0; }', N + ' .sh { border-top-color: #a03; } ' + N + ' .cnav .ni.on { background: #a03 !important; border-left-color: #a03 !important; }' ]); // ---- late 2008-2009: "Google news" on the left, blue-grey section bars css.n2009 = classic.concat([ N + ' .nhead { align-items: center; gap: 10px; padding: 10px 8px 14px 8px; }', N + ' .nhead .hlinks { display: flex; flex-direction: column; font-size: 11px; margin-left: 4px; }', N + ' .cnav { width: 118px; } ' + N + ' .cnav .edpick select { width: 118px; margin-bottom: 6px; font: 13px arial, sans-serif; }', N + ' .cnav .ni { font-weight: normal; padding: 3px 4px; border-bottom: 1px solid #e0e6f1; display: flex; align-items: center; gap: 8px; }', N + ' .cnav .ni i { width: 4px; height: 16px; flex: 0 0 4px; }', N + ' .cnav .ni.on { color: #fff; font-weight: bold; } ' + N + ' .cnav .ni.on i { background: #fff !important; }', N + ' .cnav .nl span { display: block; }', N + ' .cmain { border-left: 1px solid #e0e6f1; padding-left: 8px; }', N + ' .sh { background: #ebeff9; border-top: 1px solid #6b90da; } ' + N + ' .sh .pt { font-size: 16px; }', N + ' .st .tt a { font-size: 16px; }', N + ' .st .all a.email { margin-left: 10px; color: #77c; font-weight: normal; } ' + N + ' .st .email img { vertical-align: middle; margin-right: 3px; }', N + ' .pers { border: 0; background: #ebeff9; font-size: 13px; padding: 4px; }', N + ' .csecs .sech { border-top: 1px solid; } ' + N + ' .csecs .sech a { font-size: 16px; }', N + ' .cfoot .nsearch { background: #ebeff9; }' ]); // ---- 2010: the keyword list under Top Stories, the Recent column css.n2010 = classic.concat([ N + ' .nhead { align-items: flex-start; gap: 10px; padding: 16px 8px 8px 8px; }', N + ' .nhead .hc { display: flex; flex-direction: column; align-items: flex-end; }', N + ' .nhead .nsearch .q { width: 345px; height: 32px; font-size: 17px; border: 1px solid #ccc; border-top-color: #999; }', N + ' .nhead .nsearch input[type=submit], ' + N + ' .nhead .nsearch input[type=button] { height: 32px; font-size: 15px; }', N + ' .nhead .adv { font-size: 11px; margin-top: 4px; }', N + ' .vlinks { display: flex; justify-content: flex-end; gap: 14px; padding: 0 8px 6px 0; } ' + N + ' .vlinks select { font: 13px arial, sans-serif; }', N + ' .cnav { width: 150px; flex: 0 0 150px; padding-left: 10px; }', N + ' .cnav .ni { font-weight: normal; color: #00c; padding: 2px 0; display: flex; gap: 8px; align-items: center; }', N + ' .cnav .ni i { width: 6px; height: 14px; flex: 0 0 6px; } ' + N + ' .cnav .ni.on { color: #000; font-weight: bold; }', N + ' .cnav .kws a { display: block; padding: 1px 0 1px 14px; text-decoration: none; } ' + N + ' .cnav .ni { text-decoration: none; }', N + ' .cmain { padding-left: 20px; }', N + ' .sh { background: #ebeff9; } ' + N + ' .sh .pt { font-size: 13px; }', N + ' .st { border-bottom: 1px solid #ebeff9; padding-bottom: 8px; margin: 6px 0 8px 0; }', N + ' .st .src .sn { font-weight: normal; } ' + N + ' .st .all a { font-weight: normal; }', N + ' .cols .cside { width: 320px; flex: 0 0 320px; }', N + ' .sbox .sbh { background: #ebeff9; font-weight: bold; padding: 4px 6px; } ' + N + ' .sbox .st.small { border: 0; }', N + ' .csecs .sech { border-top: 0; } ' + N + ' .csecs .sech a { font-size: 13px; }' ]); // ---- 2011-2016: the grey header, the red "News", thumbnails on the left css.n2012 = [ N + ' { font: 13px arial, sans-serif; color: #222; }', N + ' a { color: #15c; text-decoration: none; } ' + N + ' a:hover { text-decoration: underline; }', N + ' .nhead { display: flex; align-items: center; background: #f1f1f1; border-bottom: 1px solid #e5e5e5; height: 58px; padding: 0 28px; gap: 60px; }', N + ' .nhead .logo img { display: block; }', N + ' .nsearch.k { display: flex; align-items: center; gap: 16px; }', N + ' .nsearch.k .q { width: 248px; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 1px 8px; font: 16px arial, sans-serif; outline: none; }', N + ' .nsearch.k .q:focus { border-color: #4d90fe; box-shadow: inset 0 1px 2px rgba(0,0,0,.3); }', N + ' .nsearch.k .go { width: 72px; height: 29px; margin-left: -12px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; }', N + ' .kb { display: inline-flex; align-items: center; gap: 6px; height: 29px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444 !important; font: bold 11px arial, sans-serif; cursor: pointer; position: relative; text-decoration: none !important; }', N + ' .kb:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); } ' + N + ' .kb svg { fill: #666; }', N + ' .kb.dd select { position: absolute; inset: 0; opacity: 0; cursor: pointer; }', N + ' .nbar { display: flex; align-items: center; gap: 16px; height: 58px; padding: 0 28px; border-bottom: 1px solid #ebebeb; }', N + ' .nbar .label { color: #dd4b39; font-size: 20px; width: 158px; }', N + ' .nbar .gearb { margin-left: auto; margin-right: 22%; width: 72px; justify-content: center; }', N + ' .kbody { display: flex; padding: 0 0 20px 0; }', N + ' .knav { width: 186px; flex: 0 0 186px; padding: 10px 0 0 28px; }', N + ' .knav .ni { display: block; color: #222; font-size: 13px; padding: 7px 0; } ' + N + ' .knav .ni.on { color: #dd4b39; }', N + ' .knav .kws a { display: block; color: #222; padding: 3px 0 3px 9px; }', N + ' .kmain { flex: 0 1 530px; min-width: 0; }', N + ' .kmain .sh { background: #f5f5f5; border-bottom: 1px solid #ddd; padding: 6px 4px; margin-top: 4px; } ' + N + ' .kmain .sh .pt { font-size: 16px; color: #222; }', N + ' .st { display: flex; gap: 14px; padding: 12px 0 12px 6px; border-bottom: 1px solid #ebebeb; }', N + ' .st .th { width: 72px; flex: 0 0 72px; text-align: center; } ' + N + ' .st .th img { display: block; width: 72px; height: 72px; object-fit: cover; }', N + ' .st .th .noimg { display: block; height: 4px; }', N + ' .st .th .ts { font-size: 11px; color: #777; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 2px; }', N + ' .st .th .rt { display: block; margin-top: 12px; background: #4d90fe; border: 1px solid #3079ed; border-radius: 2px; color: #fff !important; font-weight: bold; font-size: 11px; line-height: 16px; padding: 6px 4px; }', N + ' .st .tb { flex: 1; min-width: 0; }', N + ' .st .tt a { font-size: 17px; font-weight: bold; color: #15c; line-height: 1.25; }', N + ' .st .src { font-size: 11px; color: #777; margin: 3px 0 6px 0; }', N + ' .st .rels { margin-top: 6px; } ' + N + ' .st .rel { margin: 3px 0; } ' + N + ' .st .rel .rs { color: #777; font-size: 11px; }', N + ' .st.small { display: block; padding: 6px 0; border: 0; } ' + N + ' .st.small .tt a { font-size: 13px; } ' + N + ' .st.small .src { margin: 1px 0 0 0; }', N + ' .kside { width: 310px; flex: 0 0 310px; margin-left: 26px; padding-top: 6px; }', N + ' .kside .sbh { font-size: 16px; color: #222; padding: 8px 0 6px 0; border-bottom: 1px solid #ebebeb; margin-bottom: 4px; }', N + ' .signbox { background: #fff4c2; border: 1px solid #f0c36d; padding: 12px; line-height: 1.6; margin-bottom: 12px; }', N + ' .kfoot { text-align: center; color: #777; padding: 20px 0; border-top: 1px solid #ebebeb; }', N + ' .loading { padding: 16px 6px; color: #777; }' ]; // ---- 2017-2018: Material cards css.n2017 = [ N + ' { font: 14px Roboto, arial, sans-serif; color: #212121; background: #f2f2f2; }', N + ' a { color: inherit; text-decoration: none; }', N + ' .mhead { display: flex; align-items: center; height: 64px; background: #fff; padding: 0 8px; gap: 8px; }', N + ' .mlogo { display: flex; align-items: center; gap: 6px; width: 200px; margin-left: 8px; } ' + N + ' .mlogo span { font: 22px "Product Sans", "Google Sans", Roboto, arial, sans-serif; color: #757575; }', N + ' .nsearch.m { flex: 0 1 602px; display: flex; align-items: center; height: 48px; background: #f1f1f1; border-radius: 2px; padding: 0 12px; gap: 12px; color: #757575; }', N + ' .nsearch.m .q { flex: 1; border: 0; background: transparent; outline: none; font: 16px Roboto, arial, sans-serif; color: #212121; }', N + ' .corner { margin-left: auto; display: flex; align-items: center; }', N + ' .mtabs { display: flex; align-items: center; justify-content: center; gap: 0; height: 48px; background: #fff; box-shadow: 0 2px 2px rgba(0,0,0,.1); position: relative; }', N + ' .mtabs a { padding: 0 24px; line-height: 45px; color: #616161; border-bottom: 3px solid transparent; } ' + N + ' .mtabs a.on { color: #4285f4; border-bottom-color: #4285f4; }', N + ' .mtabs .sep { width: 1px; height: 20px; background: #ddd; margin: 0 8px; }', N + ' .mtabs .edm { display: inline-flex; align-items: center; color: #616161; padding: 0 16px; position: relative; } ' + N + ' .mtabs .edm select { position: absolute; inset: 0; opacity: 0; }', N + ' .mtabs .gearm { position: absolute; right: 16px; }', N + ' .mbody { display: flex; gap: 24px; }', N + ' .mnav { width: 280px; flex: 0 0 280px; background: #f2f2f2; padding: 12px 0; border-right: 1px solid transparent; }', N + ' #ugf-news.nonav .mnav { display: none; }', N + ' .mnav .nh { font-size: 12px; color: #616161; padding: 8px 24px; letter-spacing: .4px; }', N + ' .mnav .ni { display: flex; align-items: center; gap: 24px; height: 40px; padding: 0 24px; color: #424242; } ' + N + ' .mnav .ni .mi { color: #757575; }', N + ' .mnav .ni.on { background: #e0e0e0; font-weight: 500; } ' + N + ' .mnav .ni.on .mi { color: #424242; }', N + ' .mnav .nsep { border-top: 1px solid #ddd; margin: 8px 0; }', N + ' .mmain { flex: 0 1 444px; min-width: 0; } ' + N + ' .mmain .pt { font: 400 24px Roboto, arial, sans-serif; color: #212121; margin: 20px 0 8px 16px; }', N + ' .card { background: #fff; border-radius: 2px; box-shadow: 0 1px 2px rgba(0,0,0,.2); margin-bottom: 8px; }', N + ' .st { display: flex; gap: 16px; padding: 16px; }', N + ' .st .lcol { width: 128px; flex: 0 0 128px; } ' + N + ' .st .lcol img { display: block; width: 128px; height: 128px; object-fit: cover; } ' + N + ' .st .lcol:empty { display: none; }', N + ' .st .rcol { flex: 1; min-width: 0; }', N + ' .st .tt a { font: 500 18px Roboto, arial, sans-serif; color: #212121; line-height: 24px; } ' + N + ' .st .tt a:hover { text-decoration: underline; }', N + ' .st .src { font-size: 12px; color: #757575; margin: 4px 0 12px 0; }', N + ' .st .rh { font-size: 12px; color: #616161; letter-spacing: .3px; margin: 12px 0 8px 0; }', N + ' .st .rel { margin-bottom: 12px; } ' + N + ' .st .rel a { font-size: 14px; color: #212121; line-height: 20px; } ' + N + ' .st .rel .rs { font-size: 12px; color: #757575; }', N + ' .st .full { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; color: #212121; margin-top: 4px; }', N + ' .mside { width: 304px; flex: 0 0 304px; }', N + ' .mside .sh2 { font-size: 18px; color: #212121; margin: 24px 0 12px 16px; }', N + ' .chips { display: flex; flex-wrap: wrap; gap: 8px; padding: 16px; } ' + N + ' .chips a { border: 1px solid #ddd; border-radius: 6px; padding: 5px 8px; font-size: 14px; color: #212121; }', N + ' .recent { padding: 16px; } ' + N + ' .recent .ri { margin-bottom: 16px; } ' + N + ' .recent .ri a { font-size: 14px; color: #212121; line-height: 20px; } ' + N + ' .recent .rs { font-size: 12px; color: #757575; }', N + ' .loading { padding: 24px 16px; color: #757575; }' ]; // ---- 2019 on: Google Sans, the pill search, cards with lines css.n2019 = [ N + ' { font: 14px Roboto, arial, sans-serif; color: #202124; background: #fff; }', N + ' a { color: inherit; text-decoration: none; }', N + ' .mhead { display: flex; align-items: center; height: 64px; background: #fff; padding: 0 8px; gap: 8px; box-shadow: 0 1px 2px rgba(60,64,67,.3), 0 2px 6px 2px rgba(60,64,67,.15); position: sticky; top: 0; z-index: 5; }', N + ' .mlogo { display: flex; align-items: center; gap: 4px; width: 200px; margin-left: 8px; } ' + N + ' .mlogo span { font: 22px "Product Sans", "Google Sans", Roboto, arial, sans-serif; color: #5f6368; }', N + ' .nsearch.m { flex: 0 1 720px; display: flex; align-items: center; height: 48px; background: #f1f3f4; border-radius: 8px; padding: 0 12px; gap: 12px; color: #5f6368; }', N + ' .nsearch.m .q { flex: 1; border: 0; background: transparent; outline: none; font: 16px Roboto, arial, sans-serif; color: #202124; }', N + ' .corner { margin-left: auto; display: flex; align-items: center; }', N + ' .mbody { display: flex; gap: 32px; padding-top: 16px; }', N + ' .mnav { width: 256px; flex: 0 0 256px; padding: 8px 0; }', N + ' #ugf-news.nonav .mnav { display: none; }', N + ' .mnav .ni { display: flex; align-items: center; gap: 20px; height: 40px; padding: 0 24px; color: #202124; border-radius: 0 20px 20px 0; font: 500 14px "Google Sans", Roboto, arial, sans-serif; } ' + N + ' .mnav .ni .mi { color: #5f6368; }', N + ' .mnav .ni:hover { background: #f1f3f4; } ' + N + ' .mnav .ni.on { background: #e8f0fe; color: #1967d2; } ' + N + ' .mnav .ni.on .mi { color: #1967d2; }', N + ' .mmain { flex: 0 1 482px; min-width: 0; } ' + N + ' .mmain .pt { font: 400 24px "Google Sans", Roboto, arial, sans-serif; margin: 8px 0 12px 0; } ' + N + ' .mmain .pt:empty { display: none; }', N + ' .hh { display: flex; align-items: baseline; justify-content: space-between; margin: 8px 0 12px 0; } ' + N + ' .hh span { font: 400 22px "Google Sans", Roboto, arial, sans-serif; } ' + N + ' .hh a { color: #1a73e8; font: 500 14px "Google Sans", Roboto, arial, sans-serif; }', N + ' .card { border: 1px solid #dadce0; border-radius: 8px; margin-bottom: 16px; }', N + ' .st { padding: 16px; }', N + ' .st .top { display: flex; gap: 16px; } ' + N + ' .st .tb { flex: 1; min-width: 0; }', N + ' .st .tt a { font: 500 20px "Google Sans", Roboto, arial, sans-serif; color: #202124; line-height: 26px; } ' + N + ' .st .tt a:hover { text-decoration: underline; }', N + ' .st .src { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #5f6368; margin-top: 8px; } ' + N + ' .st .fv { width: 16px; height: 16px; border-radius: 2px; }', N + ' .st .im img { display: block; width: 100px; height: 100px; object-fit: cover; border-radius: 8px; }', N + ' .st .rels { margin: 14px 0 0 0; padding: 0 0 0 16px; } ' + N + ' .st .rels li { margin-bottom: 12px; color: #1a73e8; } ' + N + ' .st .rels a { font: 500 14px Roboto, arial, sans-serif; color: #202124; } ' + N + ' .st .rels .rs { font-size: 12px; color: #5f6368; margin-top: 2px; }', N + ' .st .full { display: inline-flex; align-items: center; gap: 8px; color: #1a73e8; font: 500 14px "Google Sans", Roboto, arial, sans-serif; margin-top: 6px; }', N + ' .mside { width: 234px; flex: 0 0 234px; }', N + ' .gcard { border: 1px solid #dadce0; border-radius: 8px; padding: 16px; margin-bottom: 16px; } ' + N + ' .gcard .gh { font: 400 18px "Google Sans", Roboto, arial, sans-serif; color: #5f6368; padding-bottom: 12px; border-bottom: 1px solid #dadce0; margin-bottom: 12px; }', N + ' .gcard .ri { margin-bottom: 14px; } ' + N + ' .gcard .ri a { font: 500 14px Roboto, arial, sans-serif; color: #202124; line-height: 20px; } ' + N + ' .gcard .rs { font-size: 12px; color: #5f6368; }', N + ' .chips { display: flex; flex-wrap: wrap; gap: 8px; } ' + N + ' .chips a { border: 1px solid #dadce0; border-radius: 16px; padding: 6px 12px; font-size: 13px; color: #3c4043; }', N + ' .loading { padding: 24px 0; color: #5f6368; }' ]; return css[era] || css.n2012; } // ---- Google Translate ----------------------------------------------------------- function ugfTrWanted() { if (window.location.host !== "translate.google.com" || !ugfNtTopFrame()) { return false; } const p = window.location.pathname || "/"; // the translator itself, with its documents and websites; images, saved and history stay Google's if (!/^\/(|m)$/.test(p)) { return false; } const q = new URLSearchParams(window.location.search); if (q.get("u") || q.get("op") === "images") { return false; } return ugfNtOn("UGF_TRANSLATE_ON"); } function ugfTrEra() { const l = String(layout || "2015"); if (l === "2019" || l === "2022") { return "t2019"; } if (["2015", "2016", "2016C", "2016L", "2017", "2018", "2018M"].indexOf(l) > -1) { return "t2015"; } if (["2011", "2012", "2013", "2013L", "2014", "2015L"].indexOf(l) > -1) { return "t2012"; } if (l === "2009" || l === "2009L" || l === "2010" || l === "2010N") { return "t2010"; } if (l === "2007") { return "t2008"; } return "t2006"; } // the languages, by Google's codes: all 249 Google Translate offers now (its own list) function ugfTrLangs() { return ugfTrLangs.c || (ugfTrLangs.c = [ ["ab", "Abkhaz"], ["ace", "Acehnese"], ["ach", "Acholi"], ["aa", "Afar"], ["af", "Afrikaans"], ["sq", "Albanian"], ["alz", "Alur"], ["am", "Amharic"], ["ar", "Arabic"], ["hy", "Armenian"], ["as", "Assamese"], ["av", "Avar"], ["awa", "Awadhi"], ["ay", "Aymara"], ["az", "Azerbaijani"], ["ban", "Balinese"], ["bal", "Baluchi"], ["bm", "Bambara"], ["bci", "Baoulé"], ["ba", "Bashkir"], ["eu", "Basque"], ["btx", "Batak Karo"], ["bts", "Batak Simalungun"], ["bbc", "Batak Toba"], ["be", "Belarusian"], ["bem", "Bemba"], ["bn", "Bengali"], ["bew", "Betawi"], ["bho", "Bhojpuri"], ["bik", "Bikol"], ["bs", "Bosnian"], ["br", "Breton"], ["bg", "Bulgarian"], ["bua", "Buryat"], ["yue", "Cantonese"], ["ca", "Catalan"], ["ceb", "Cebuano"], ["ch", "Chamorro"], ["ce", "Chechen"], ["ny", "Chichewa"], ["zh-CN", "Chinese (Simplified)"], ["zh-TW", "Chinese (Traditional)"], ["chk", "Chuukese"], ["cv", "Chuvash"], ["co", "Corsican"], ["crh", "Crimean Tatar (Cyrillic)"], ["crh-Latn", "Crimean Tatar (Latin)"], ["hr", "Croatian"], ["cs", "Czech"], ["da", "Danish"], ["fa-AF", "Dari"], ["dv", "Dhivehi"], ["din", "Dinka"], ["doi", "Dogri"], ["dov", "Dombe"], ["nl", "Dutch"], ["dyu", "Dyula"], ["dz", "Dzongkha"], ["en", "English"], ["eo", "Esperanto"], ["et", "Estonian"], ["ee", "Ewe"], ["fo", "Faroese"], ["fj", "Fijian"], ["tl", "Filipino"], ["fi", "Finnish"], ["fon", "Fon"], ["fr", "French"], ["fr-CA", "French (Canada)"], ["fy", "Frisian"], ["fur", "Friulian"], ["ff", "Fulani"], ["gaa", "Ga"], ["gl", "Galician"], ["ka", "Georgian"], ["de", "German"], ["el", "Greek"], ["gn", "Guarani"], ["gu", "Gujarati"], ["ht", "Haitian Creole"], ["cnh", "Hakha Chin"], ["ha", "Hausa"], ["haw", "Hawaiian"], ["iw", "Hebrew"], ["hil", "Hiligaynon"], ["hi", "Hindi"], ["hmn", "Hmong"], ["hu", "Hungarian"], ["hrx", "Hunsrik"], ["iba", "Iban"], ["is", "Icelandic"], ["ig", "Igbo"], ["ilo", "Ilocano"], ["id", "Indonesian"], ["iu-Latn", "Inuktut (Latin)"], ["iu", "Inuktut (Syllabics)"], ["ga", "Irish"], ["it", "Italian"], ["jam", "Jamaican Patois"], ["ja", "Japanese"], ["jw", "Javanese"], ["kac", "Jingpo"], ["kl", "Kalaallisut"], ["kn", "Kannada"], ["kr", "Kanuri"], ["pam", "Kapampangan"], ["kk", "Kazakh"], ["kha", "Khasi"], ["km", "Khmer"], ["cgg", "Kiga"], ["kg", "Kikongo"], ["rw", "Kinyarwanda"], ["ktu", "Kituba"], ["trp", "Kokborok"], ["kv", "Komi"], ["gom", "Konkani"], ["ko", "Korean"], ["kri", "Krio"], ["ku", "Kurdish (Kurmanji)"], ["ckb", "Kurdish (Sorani)"], ["ky", "Kyrgyz"], ["lo", "Lao"], ["ltg", "Latgalian"], ["la", "Latin"], ["lv", "Latvian"], ["lij", "Ligurian"], ["li", "Limburgish"], ["ln", "Lingala"], ["lt", "Lithuanian"], ["lmo", "Lombard"], ["lg", "Luganda"], ["luo", "Luo"], ["lb", "Luxembourgish"], ["mk", "Macedonian"], ["mad", "Madurese"], ["mai", "Maithili"], ["mak", "Makassar"], ["mg", "Malagasy"], ["ms", "Malay"], ["ms-Arab", "Malay (Jawi)"], ["ml", "Malayalam"], ["mt", "Maltese"], ["mam", "Mam"], ["gv", "Manx"], ["mi", "Maori"], ["mr", "Marathi"], ["mh", "Marshallese"], ["mwr", "Marwadi"], ["mfe", "Mauritian Creole"], ["chm", "Meadow Mari"], ["mni-Mtei", "Meiteilon (Manipuri)"], ["min", "Minang"], ["lus", "Mizo"], ["mn", "Mongolian"], ["my", "Myanmar (Burmese)"], ["nhe", "Nahuatl (Eastern Huasteca)"], ["ndc-ZW", "Ndau"], ["nr", "Ndebele (South)"], ["new", "Nepalbhasa (Newari)"], ["ne", "Nepali"], ["bm-Nkoo", "NKo"], ["no", "Norwegian"], ["nus", "Nuer"], ["oc", "Occitan"], ["or", "Odia (Oriya)"], ["om", "Oromo"], ["os", "Ossetian"], ["pag", "Pangasinan"], ["pap", "Papiamento"], ["ps", "Pashto"], ["fa", "Persian"], ["pl", "Polish"], ["pt", "Portuguese (Brazil)"], ["pt-PT", "Portuguese (Portugal)"], ["pa", "Punjabi (Gurmukhi)"], ["pa-Arab", "Punjabi (Shahmukhi)"], ["qu", "Quechua"], ["kek", "Qʼeqchiʼ"], ["rom", "Romani"], ["ro", "Romanian"], ["rn", "Rundi"], ["ru", "Russian"], ["se", "Sami (North)"], ["sm", "Samoan"], ["sg", "Sango"], ["sa", "Sanskrit"], ["sat-Latn", "Santali (Latin)"], ["sat", "Santali (Ol Chiki)"], ["gd", "Scots Gaelic"], ["nso", "Sepedi"], ["sr", "Serbian"], ["st", "Sesotho"], ["crs", "Seychellois Creole"], ["shn", "Shan"], ["sn", "Shona"], ["scn", "Sicilian"], ["szl", "Silesian"], ["sd", "Sindhi"], ["si", "Sinhala"], ["sk", "Slovak"], ["sl", "Slovenian"], ["so", "Somali"], ["es", "Spanish"], ["su", "Sundanese"], ["sus", "Susu"], ["sw", "Swahili"], ["ss", "Swati"], ["sv", "Swedish"], ["ty", "Tahitian"], ["tg", "Tajik"], ["ber-Latn", "Tamazight"], ["ber", "Tamazight (Tifinagh)"], ["ta", "Tamil"], ["tt", "Tatar"], ["te", "Telugu"], ["tet", "Tetum"], ["th", "Thai"], ["bo", "Tibetan"], ["ti", "Tigrinya"], ["tiv", "Tiv"], ["tpi", "Tok Pisin"], ["to", "Tongan"], ["lua", "Tshiluba"], ["ts", "Tsonga"], ["tn", "Tswana"], ["tcy", "Tulu"], ["tum", "Tumbuka"], ["tr", "Turkish"], ["tk", "Turkmen"], ["tyv", "Tuvan"], ["ak", "Twi"], ["udm", "Udmurt"], ["uk", "Ukrainian"], ["ur", "Urdu"], ["ug", "Uyghur"], ["uz", "Uzbek"], ["ve", "Venda"], ["vec", "Venetian"], ["vi", "Vietnamese"], ["war", "Waray"], ["cy", "Welsh"], ["wo", "Wolof"], ["xh", "Xhosa"], ["sah", "Yakut"], ["yi", "Yiddish"], ["yo", "Yoruba"], ["yua", "Yucatec Maya"], ["zap", "Zapotec"], ["zu", "Zulu"] ]); } // every language works in every period; 2006 keeps its list of language pairs function ugfTrLangsFor(era) { return ugfTrLangs(); } function ugfTrName(code) { if (code === "auto") { return "Detect language"; } const x = ugfTrLangs().filter(function(l) { return l[0] === code; })[0]; return x ? x[1] : code; } // A request to Google's translation service: through the userscript manager // (no cookies, no page rules in the way), else the page's own fetch. cb(status, text) function ugfTrGet(url, body, cb) { if (typeof GM_xmlhttpRequest === "function") { try { GM_xmlhttpRequest({ method: body ? "POST" : "GET", url: url, data: body || undefined, anonymous: true, headers: body ? { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" } : {}, onload: function(r) { cb(r.status, r.responseText); }, onerror: function() { cb(0, ""); }, ontimeout: function() { cb(0, ""); }, timeout: 15000 }); return; } catch (e) {} } fetch(url, body ? { method: "POST", body: body, credentials: "omit", headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" } } : { credentials: "omit" }).then(function(r) { return r.text().then(function(t) { cb(r.status, t); }); }).catch(function() { cb(0, ""); }); } // Google's own translation service, the one its Chrome extension uses, with the // one its Translate web widget uses as the second try. cb(err, text, detected) function ugfTrTranslate(text, sl, tl, cb) { const long = encodeURIComponent(text).length > 1800; const q = "&sl=" + encodeURIComponent(sl) + "&tl=" + encodeURIComponent(tl); // the widget's service: [[["Hola","Hello",...],...],null,"en",...] const second = function(firstErr, firstOut, firstDet) { const url = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t" + q + (long ? "" : "&q=" + encodeURIComponent(text)); ugfTrGet(url, long ? "q=" + encodeURIComponent(text) : "", function(status, txt) { try { if (status !== 200) { throw new Error("HTTP " + status); } const j = JSON.parse(txt); const out = (j[0] || []).map(function(x) { return x && x[0] ? x[0] : ""; }).join(""); if (!out) { throw new Error("empty"); } cb(null, out, j[2] || firstDet || ""); } catch (e) { if (firstOut !== undefined && firstOut !== null && !firstErr) { cb(null, firstOut, firstDet); } else { cb(firstErr || e); } } }); }; const url = "https://clients5.google.com/translate_a/t?client=dict-chrome-ex" + q + (long ? "" : "&q=" + encodeURIComponent(text)); ugfTrGet(url, long ? "q=" + encodeURIComponent(text) : "", function(status, txt) { let out = ""; let det = ""; try { if (status !== 200) { throw new Error("HTTP " + status); } const j = JSON.parse(txt); // [["translation","en"]] when detecting, ["translation"] otherwise (Array.isArray(j) ? j : [j]).forEach(function(p) { if (Array.isArray(p)) { out += p[0]; det = det || p[1] || ""; } else if (typeof p === "string") { out += p; } }); } catch (e) { second(e); return; } // nothing came back (it does that now and then), or the text came back // unchanged when it should not have const same = out.trim() === text.trim() && sl !== tl && !(sl === "auto" && det === tl); if (!out.trim() && !ugfTrTranslate.retry) { ugfTrTranslate.retry = true; setTimeout(function() { ugfTrTranslate(text, sl, tl, function(e, o, d) { ugfTrTranslate.retry = false; cb(e, o, d); }); }, 350); return; } if (!out.trim() || same) { second(null, out, det); return; } cb(null, out, det); }); } // The tab icon Google Translate really had at the time of each layout (from the // Wayback Machine): google.com's own until July 2010, then the 文/A icons - the // small one, the grey-and-blue one from November 2012, the blue A of March 2015, // the G of September 2015 and the larger G set of 2017, which it still uses function ugfTrFav() { const A = ugfNtArt(); const l = String(layout || ""); const pick = { "2022": "tr2017", "2019": "tr2017", "2018M": "tr2017", "2018": "tr2017", "2017": "tr2017", "2016": "tr2015s", "2016C": "tr2015s", "2016L": "tr2015s", "2015L": "tr2015s", "2015": "tr2015", "2014": "tr2012", "2013": "tr2012", "2013L": "tr2012", "2012": "tr2010", "2011": "tr2010", "2010": "tr2010", "2010N": "tr2010", "2009L": "g2009", "2009": "g2009" }[l] || "g1999"; return A["fav_" + pick]; } // the era's tab icon on the Translate pages Gplex leaves to Google (documents, // websites, images, saved) too function ugfTrFavOnly() { if (!ugfNtTopFrame() || !ugfNtOn("UGF_TRANSLATE_ON")) { return; } const fav = ugfTrFav(ugfTrEra()); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); } function ugfTrMain() { const era = ugfTrEra(); const A = ugfNtArt(); const esc = ugfNtEsc; const material = era === "t2019"; const kennedy = era === "t2012" || era === "t2015"; const langs = ugfTrLangsFor(era); const l = String(layout || ""); console.log("[Gplex] Translate: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); const style = document.createElement("style"); style.id = "ugf-nt-styles"; style.textContent = ugfNtBaseCss("ugf-tr").concat(ugfTrCss(era)).join("\n"); (document.head || document.documentElement).appendChild(style); document.documentElement.setAttribute("gplex-nt", era); const fav = ugfTrFav(era); ugfApplyFavicon(fav); ugfKeepFavicon(function() { return fav; }); document.title = "Google Translate"; // what to translate: from the address (?sl=&tl=&text= as Google uses now, or #sl|tl|text) const q = new URLSearchParams(window.location.search); const hash = decodeURIComponent((window.location.hash || "").slice(1)).split("|"); const st = { sl: q.get("sl") || (hash.length > 2 ? hash[0] : "") || "auto", tl: q.get("tl") || (hash.length > 2 ? hash[1] : "") || "en", text: q.get("text") || (hash.length > 2 ? hash.slice(2).join("|") : ""), out: "", det: "", instant: true, recentSl: ["en", "es", "fr"], recentTl: ["en", "es", "ar"], mode: q.get("op") === "docs" ? "docs" : q.get("op") === "websites" && l === "2022" ? "web" : "text", file: null }; if (era === "t2006" || era === "t2008") { st.sl = st.sl === "auto" ? "es" : st.sl; } try { st.instant = localStorage.getItem("ugfTrInstant") !== "off"; } catch (e) {} const shell = document.createElement("div"); shell.id = "ugf-tr"; shell.setAttribute("era", era); document.body.appendChild(shell); const opts = function(sel, withAuto) { return (withAuto ? '" : "") + langs.map(function(x) { return '"; }).join(""); }; // the 2006 language pairs const pairs = [["ar", "en"], ["zh-CN", "en"], ["en", "ar"], ["en", "zh-CN"], ["en", "zh-TW"], ["en", "fr"], ["en", "de"], ["en", "it"], ["en", "ja"], ["en", "ko"], ["en", "pt"], ["en", "ru"], ["en", "es"], ["fr", "en"], ["fr", "de"], ["de", "en"], ["de", "fr"], ["it", "en"], ["ja", "en"], ["ko", "en"], ["pt", "en"], ["ru", "en"], ["es", "en"]]; // choosing a document, as each period had it const fileIn = ''; const docresHtml = '
'; let h = ""; if (era === "t2006") { h = '' + '
Translate Text
Original text:
' + '
' + '
Translate a Web Page
' + '
Translate a Document
' + fileIn + '
' + docresHtml + '
©2006 Google
'; } else if (era === "t2008") { h = '
Google Translate BETA' + '
' + '
Translate Text
Original text:
' + '
»
' + '
Translate a Web Page
»
' + '
Translate a Document
' + fileIn + '
»
' + docresHtml + ''; } else if (era === "t2010") { h = ugfNtGbar("classic", "Translate", "2010") + '
Google translate
' + '
' + '

Translate text, webpages and documents

Enter text or a webpage URL, or upload a document.' + 'Upload a document, or translate text or a webpage.
' + '
' + fileIn + '
' + '
Translate from:
Translate into:
' + '
' + docresHtml + '
Languages available for translation:
' + langs.map(function(x) { return "" + esc(x[1]) + ""; }).join("") + "
" + ''; } else if (kennedy) { const group = function(side, recent) { if (era === "t2012") { return '
' + recent.map(function(c) { return '' + esc(ugfTrName(c)) + ""; }).join("") + "
"; } return '
' + recent.map(function(c) { return '' + esc(ugfTrName(c)) + ""; }).join("") + (side === "s" ? 'Detect language' : "") + '▾
'; }; h = (ugfNtHasGbar() ? ugfNtGbar("dark", "Translate") : "") + '
' + ugfCalHeadLogo() + ugfNtHeadCorner() + "
" + '" + (era === "t2015" ? '
' + group("s", st.recentSl) + '' + ugfNtIcon("swap_horiz", 18) + '' + group("t", st.recentTl) + 'Translate
' : "") + '
' + (era === "t2012" ? group("s", st.recentSl) : "") + '
' + (era === "t2015" ? '0/5000' : "") + '×
' + '
No file chosen
' + '
Type text or a website address or translate a document.' + 'Choose a document to translate, or cancel.
' + '
' + (era === "t2012" ? group("t", st.recentTl) : "") + '
' + docresHtml + ''; } else { const tab = function(side, codes) { return '
' + (side === "s" ? '' + (l === "2022" ? "Detect language" : "DETECT LANGUAGE") + "" : "") + codes.map(function(c) { const n = ugfTrName(c); return '' + esc(l === "2022" ? n : n.toUpperCase()) + ""; }).join("") + '' + ugfNtIcon("expand_more", 24) + "
"; }; h = '
' + ugfNtIcon("menu", 24) + '' + '
' + ugfNtCorner() + "
" + '" + '
' + tab("s", st.recentSl) + '' + ugfNtIcon("swap_horiz", 24) + "" + tab("t", st.recentTl) + "
" + '
' + '
' + ugfNtIcon("volume_up", 24) + "" + '' + ugfNtIcon("content_copy", 24) + '' + ugfNtIcon("thumbs_up_down", 24) + "" + '' + ugfNtIcon("share", 24) + "
" + '
Choose a document
Upload a .docx, .pptx, .xlsx, .pdf, .odt, .rtf or .txt file.
' + '
' + '
' + ugfNtIcon("description", 24) + '' + '' + ugfNtIcon("close", 24) + 'Translate
' + (l === "2022" ? '" : "") + "
" + docresHtml + '' + '"; } shell.innerHTML = trusted_policy.createHTML(h); ugfNtMenus(shell, material); const $ = function(s) { return shell.querySelector(s); }; const src = $(".src"); src.value = st.text; // ---- text, a document or a website const setMode = function(m) { st.mode = m; shell.setAttribute("mode", m); shell.querySelectorAll(".mt").forEach(function(a) { a.classList.toggle("on", a.getAttribute("data-mode") === m); }); save(); if (m === "text") { src.focus(); } else if (m === "web" && $(".wurl")) { $(".wurl").focus(); } }; // Google's address for a website, translated const webUrl = function(u, sl, tl) { u = String(u || "").trim(); if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(u)) { u = "http://" + u; } return "https://translate.google.com/website?sl=" + encodeURIComponent(sl || "auto") + "&tl=" + encodeURIComponent(tl || "en") + "&hl=en&client=webapp&u=" + encodeURIComponent(u); }; const isUrl = function(t) { return /^\s*((https?:\/\/)?([a-z0-9-]+\.)+[a-z]{2,}(:\d+)?(\/\S*)?|https?:\/\/\S+)\s*$/i.test(t || "") && !/\s\S/.test(String(t).trim()); }; // the document chosen const fmtSize = function(n) { return n < 1024 ? n + " B" : n < 1048576 ? Math.round(n / 1024) + " KB" : (n / 1048576).toFixed(1) + " MB"; }; const paintFile = function() { shell.querySelectorAll(".fname").forEach(function(x) { x.textContent = st.file ? st.file.name : (kennedy ? "No file chosen" : ""); }); shell.querySelectorAll(".fsize").forEach(function(x) { x.textContent = st.file ? fmtSize(st.file.size) : ""; }); shell.classList.toggle("hasfile", !!st.file); }; let docUrl = ""; let docSeq = 0; const docres = $(".docres"); const runDoc = function(sl, tl) { if (!st.file) { docres.innerHTML = trusted_policy.createHTML('
' + (material ? "Choose a document first" : "Please choose a file to translate.") + "
"); docres.style.display = ""; return; } sl = sl || st.sl; tl = tl || st.tl; const my = ++docSeq; const file = st.file; docres.style.display = ""; docres.innerHTML = trusted_policy.createHTML('
' + (material ? "Translating…" : "Translating...") + '
'); ugfTrDoc(file, sl, tl, function(done, total) { const pc = docres.querySelector(".pct"); if (pc && my === docSeq) { pc.textContent = total ? Math.round(done / total * 100) + "%" : ""; } }, function(err, r) { if (my !== docSeq) { return; } if (err) { const why = err.message === "type" ? (material ? "This file type isn't supported" : "Sorry, this type of file cannot be translated.") : err.message === "nopdftext" ? (material ? "No text could be found in this PDF" : "Sorry, no text could be found in this PDF.") : err.message === "empty" ? (material ? "There's no text in this document" : "This document has no text to translate.") : (material ? "Couldn't translate this document" : "Sorry, this document could not be translated right now."); docres.innerHTML = trusted_policy.createHTML('
' + esc(why) + "
"); return; } if (docUrl && /^blob:/.test(docUrl)) { URL.revokeObjectURL(docUrl); } docUrl = URL.createObjectURL(r.blob); // Firefox keeps a userscript's blob: addresses from the page, so there // the file goes into the link itself if (/Firefox\//.test(navigator.userAgent)) { URL.revokeObjectURL(docUrl); docUrl = "#"; const fr = new FileReader(); fr.onload = function() { docUrl = String(fr.result); const dl = docres.querySelector("a.dl"); if (dl) { dl.setAttribute("href", docUrl); } }; fr.readAsDataURL(r.blob); } const from = sl === "auto" && r.det ? r.det : sl; const pdf = /\.pdf$/i.test(file.name); const slides = /\.(pptx|odp)$/i.test(file.name); const body = function(pages) { return pages.map(function(pg, i) { if (!pg.length) { return ""; } return (pages.length > 1 && (pdf || slides) ? '
' + (pdf ? "Page " : "Slide ") + (i + 1) + "
" : "") + pg.map(function(t) { return "

" + esc(t) + "

"; }).join(""); }).join(""); }; const head = esc(ugfTrName(from)) + " to " + esc(ugfTrName(tl)) + " translation"; docres.innerHTML = trusted_policy.createHTML('
' + head + '' + esc(file.name) + "" + '' + (material ? "" : "View: ") + 'Translation' + (material ? "" : " | ") + 'Original' + '' + (material ? "Download translation" : "Download the translated document") + "
" + '
' + body(r.to) + "
" + '"); }); }; const chooseFile = function(f) { if (!f) { return; } st.file = f; paintFile(); if (st.mode !== "docs" && era !== "t2006" && era !== "t2008") { setMode("docs"); } }; // a file dropped on the page is a document to translate shell.addEventListener("dragover", function(ev) { if (ev.dataTransfer && Array.prototype.indexOf.call(ev.dataTransfer.types || [], "Files") > -1) { ev.preventDefault(); } }); shell.addEventListener("drop", function(ev) { const f = ev.dataTransfer && ev.dataTransfer.files && ev.dataTransfer.files[0]; if (f) { ev.preventDefault(); chooseFile(f); } }); // ---- what is shown: the language buttons and the result const paintLangs = function() { shell.querySelectorAll("[data-qs]").forEach(function(a) { a.classList.toggle("on", a.getAttribute("data-qs") === st.sl); }); shell.querySelectorAll("[data-qt]").forEach(function(a) { a.classList.toggle("on", a.getAttribute("data-qt") === st.tl); }); // a language picked from the menu joins the quick buttons ["s", "t"].forEach(function(side) { const cur = side === "s" ? st.sl : st.tl; const rec = side === "s" ? st.recentSl : st.recentTl; if (cur !== "auto" && rec.indexOf(cur) === -1) { rec.unshift(cur); rec.length = 3; const holder = shell.querySelector(".quick." + side + ", .grp." + side + ", .ltabs." + side); if (holder) { holder.querySelectorAll("[data-q" + side + "]").forEach(function(a) { if (a.getAttribute("data-q" + side) !== "auto") { a.remove(); } }); const first = side === "s" && holder.classList.contains("ltabs") ? holder.querySelector("[data-qs=auto]") : null; rec.slice().reverse().forEach(function(c) { const a = document.createElement("a"); a.href = "#"; if (holder.classList.contains("grp")) { a.className = "kb"; } a.setAttribute("data-q" + side, c); a.textContent = material && l !== "2022" ? ugfTrName(c).toUpperCase() : ugfTrName(c); if (first) { first.after(a); } else { holder.insertBefore(a, holder.firstChild); } }); } paintLangs(); } }); const sn = $(".sln"); if (sn) { sn.textContent = st.sl === "auto" && st.det ? ugfTrName(st.det) + " - detected" : ugfTrName(st.sl); } const tn = $(".tln"); if (tn) { tn.textContent = ugfTrName(st.tl); } // "English - detected" on the Detect language button (2015 on) const detBtn = shell.querySelector("[data-qs=auto]"); if (detBtn && (era === "t2015" || era === "t2019")) { const base = era === "t2019" && l !== "2022" ? "DETECT LANGUAGE" : "Detect language"; detBtn.textContent = st.sl === "auto" && st.det ? (era === "t2019" && l !== "2022" ? ugfTrName(st.det).toUpperCase() + " - DETECTED" : ugfTrName(st.det) + " - detected") : base; } ["sl", "tl"].forEach(function(k) { const s = $("select." + k); if (s && s.value !== st[k]) { s.value = st[k]; } }); }; const paintResult = function() { const res = $(".res"); res.textContent = st.out; res.classList.toggle("empty", !st.out); const rh = $(".rh"); if (rh) { rh.textContent = st.out ? (st.sl === "auto" && st.det ? ugfTrName(st.det) : ugfTrName(st.sl)) + " to " + ugfTrName(st.tl) + " translation" : ""; } const resw = $(".resw"); if (resw) { resw.style.display = st.out ? "" : "none"; } const avail = $(".avail"); if (avail) { avail.style.display = st.out || src.value ? "none" : ""; } if (era === "t2006" || era === "t2008") { res.innerHTML = trusted_policy.createHTML(st.out ? '
' + esc(ugfTrName(st.sl)) + " to " + esc(ugfTrName(st.tl)) + " translation
" + '
' + esc(st.out) + "
" : ""); } const cnt = $(".cnt"); if (cnt) { cnt.textContent = src.value.length + (era === "t2019" ? " / 5000" : "/5000"); } const clr = $(".clr"); if (clr) { clr.style.visibility = src.value ? "visible" : "hidden"; } }; // ---- translating let seq = 0; let timer = 0; const save = function() { try { history.replaceState(history.state, "", "/?sl=" + encodeURIComponent(st.sl) + "&tl=" + encodeURIComponent(st.tl) + (src.value && st.mode === "text" ? "&text=" + encodeURIComponent(src.value.slice(0, 1500)) : "") + "&op=" + (st.mode === "docs" ? "docs" : st.mode === "web" ? "websites" : "translate")); } catch (e) {} }; const run = function() { clearTimeout(timer); if (st.mode !== "text") { return; } const text = src.value; save(); // a website address: a link to the website, translated if (isUrl(text) && era !== "t2006" && era !== "t2008") { ++seq; st.out = ""; st.det = ""; paintResult(); const res = $(".res"); const u = text.trim(); res.classList.remove("empty"); res.innerHTML = trusted_policy.createHTML('' + esc(u) + ""); const resw = $(".resw"); if (resw) { resw.style.display = ""; } const avail = $(".avail"); if (avail) { avail.style.display = "none"; } return; } if (!text.trim()) { st.out = ""; st.det = ""; paintResult(); paintLangs(); return; } const my = ++seq; ugfTrTranslate(text.slice(0, 5000), st.sl, st.tl, function(err, out, det) { if (my !== seq) { return; } if (err) { st.out = ""; $(".res").textContent = material ? "Translation error" : "Sorry, we could not translate this text right now."; return; } st.out = out; st.det = st.sl === "auto" ? det : ""; paintResult(); paintLangs(); }); }; const soon = function() { clearTimeout(timer); if (st.instant || material) { timer = setTimeout(run, 400); } paintResult(); }; src.addEventListener("input", soon); src.addEventListener("keydown", function(ev) { if (ev.key === "Enter" && (ev.ctrlKey || ev.metaKey)) { ev.preventDefault(); run(); } }); // choosing a language: the same one on both sides swaps them, as Google did const pick = function(side, code) { if (side === "s") { if (code !== "auto" && code === st.tl) { st.tl = st.sl === "auto" ? (st.det && st.det !== code ? st.det : (code === "en" ? "es" : "en")) : st.sl; } st.sl = code; } else { if (code === st.sl) { st.sl = st.tl; } st.tl = code; } }; // ---- the language menus (2011 on): every language in columns let menu = null; const closeMenu = function() { if (menu) { menu.remove(); menu = null; } }; const openMenu = function(anchor, side) { const again = menu && menu.getAttribute("data-side") === side; closeMenu(); if (again) { return; } menu = document.createElement("div"); menu.className = "lmenu"; menu.setAttribute("data-side", side); const cur = side === "s" ? st.sl : st.tl; const list = (side === "s" ? [["auto", "Detect language"]] : []).concat(langs); menu.innerHTML = trusted_policy.createHTML(list.map(function(x) { return '' + (material && x[0] === cur ? ugfNtIcon("check", 18) : "") + esc(x[1]) + ""; }).join("")); // down the columns, as Google listed them menu.style.gridTemplateRows = "repeat(" + Math.ceil(list.length / (material ? 6 : 8)) + ", auto)"; shell.appendChild(menu); const r = anchor.getBoundingClientRect(); const sr = shell.getBoundingClientRect(); menu.style.top = (r.bottom - sr.top + shell.scrollTop + 2) + "px"; menu.style.left = Math.max(8, Math.min(material ? 16 : r.left - sr.left, sr.width - menu.offsetWidth - 16)) + "px"; menu.addEventListener("click", function(ev) { const a = ev.target.closest("[data-pick]"); if (!a) { return; } ev.preventDefault(); pick(side, a.getAttribute("data-pick")); closeMenu(); paintLangs(); run(); }); }; document.addEventListener("mousedown", function(ev) { if (menu && !menu.contains(ev.target) && !ev.target.closest("[data-menu]")) { closeMenu(); } }, true); // ---- clicks shell.addEventListener("click", function(ev) { const a = ev.target.closest("a, input[type=button]"); if (!a || !shell.contains(a)) { return; } const qs = a.getAttribute("data-qs"); const qt = a.getAttribute("data-qt"); if (qs || qt) { ev.preventDefault(); if (qs) { pick("s", qs); } else { pick("t", qt); } paintLangs(); run(); return; } const m = a.getAttribute("data-menu"); if (m) { ev.preventDefault(); openMenu(a, m); return; } if (a.classList.contains("mt")) { ev.preventDefault(); setMode(a.getAttribute("data-mode")); return; } if (a.classList.contains("todoc") || a.classList.contains("nodoc")) { ev.preventDefault(); setMode(a.classList.contains("todoc") ? "docs" : "text"); return; } if (a.classList.contains("unpick")) { ev.preventDefault(); st.file = null; shell.querySelectorAll(".docfile").forEach(function(x) { x.value = ""; }); paintFile(); return; } if (a.classList.contains("godoc")) { ev.preventDefault(); if ($(".pair3")) { const p = $(".pair3").value.split("|"); runDoc(p[0], p[1]); } else { runDoc($(".sl3").value, $(".tl3").value); } return; } if (a.classList.contains("vw")) { ev.preventDefault(); const v = a.getAttribute("data-v"); docres.querySelectorAll(".vw").forEach(function(x) { x.classList.toggle("on", x === a); }); docres.querySelectorAll(".dbody").forEach(function(x) { x.style.display = x.classList.contains(v) ? "" : "none"; }); return; } if (a.classList.contains("go") && st.mode === "docs") { ev.preventDefault(); runDoc(); return; } if (a.classList.contains("goweb") && $(".wurl")) { ev.preventDefault(); const u = $(".wurl").value.trim(); if (u) { window.location.href = webUrl(u, st.sl, st.tl); } return; } if (a.classList.contains("go")) { ev.preventDefault(); if (era === "t2006") { const p = $(".pair").value.split("|"); st.sl = p[0]; st.tl = p[1]; } run(); } else if (a.classList.contains("swap")) { ev.preventDefault(); const from = st.sl === "auto" ? (st.det || "en") : st.sl; st.sl = st.tl; st.tl = from; if (st.out) { src.value = st.out; } paintLangs(); run(); } else if (a.classList.contains("clr")) { ev.preventDefault(); src.value = ""; run(); src.focus(); } else if (a.classList.contains("instant")) { ev.preventDefault(); st.instant = !st.instant; try { localStorage.setItem("ugfTrInstant", st.instant ? "on" : "off"); } catch (e) {} a.textContent = st.instant ? "Turn off instant translation" : "Turn on instant translation"; } else if (a.classList.contains("goweb")) { ev.preventDefault(); const u = $(".url").value.trim(); let sl = "auto"; let tl = "en"; if ($(".pair2")) { const p = $(".pair2").value.split("|"); sl = p[0]; tl = p[1]; } else if ($(".sl2")) { sl = $(".sl2").value; tl = $(".tl2").value; } if (u && u !== "http://") { window.location.href = webUrl(u, sl, tl); } } else if (a.classList.contains("listen")) { ev.preventDefault(); const isSrc = a.classList.contains("s"); const text = isSrc ? src.value : st.out; const lang = isSrc ? (st.sl === "auto" ? st.det || "en" : st.sl) : st.tl; if (text) { new Audio("/translate_tts?ie=UTF-8&client=tw-ob&tl=" + encodeURIComponent(lang) + "&q=" + encodeURIComponent(text.slice(0, 200))).play().catch(function() {}); } } else if (a.classList.contains("copy")) { ev.preventDefault(); if (st.out && navigator.clipboard) { navigator.clipboard.writeText(st.out).catch(function() {}); } } }); shell.addEventListener("keydown", function(ev) { if (ev.key === "Enter" && ev.target.matches && ev.target.matches(".wurl")) { ev.preventDefault(); const u = ev.target.value.trim(); if (u) { window.location.href = webUrl(u, st.sl, st.tl); } } }); shell.addEventListener("change", function(ev) { const s = ev.target; if (s.matches(".docfile")) { chooseFile(s.files && s.files[0]); return; } if (s.matches("select.sl, select.tl")) { pick(s.classList.contains("sl") ? "s" : "t", s.value); if (st.instant && era !== "t2006" && era !== "t2008") { run(); } paintLangs(); } else if (s.matches("select.pair")) { const p = s.value.split("|"); st.sl = p[0]; st.tl = p[1]; } }); paintLangs(); paintResult(); paintFile(); setMode(st.mode); if (st.text) { run(); } if (st.mode === "text") { src.focus(); } } // ---- translating a document ---------------------------------------------------- // Done here, as the Translate of 2009-2019 did it: the file is read in the browser, // its text sent to Google's translation service in batches, and the translation // shown as a page, with the translated file to download - a Word, PowerPoint, // Excel or OpenDocument file comes back in its own format with its formatting. // Nothing is uploaded anywhere but the text itself, to Google's translator. // // Many pieces of text in one request: cb(err, [translations], detected) function ugfTrBatch(parts, sl, tl, cb) { const url = "https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=" + encodeURIComponent(sl) + "&tl=" + encodeURIComponent(tl); const body = parts.map(function(p) { return "q=" + encodeURIComponent(p); }).join("&"); ugfTrGet(url, body, function(status, txt) { try { if (status !== 200) { throw new Error("HTTP " + status); } const j = JSON.parse(txt); let det = ""; const out = (Array.isArray(j) ? j : [j]).map(function(x) { if (Array.isArray(x)) { det = det || x[1] || ""; return String(x[0] || ""); } return String(x || ""); }); if (out.length !== parts.length) { throw new Error("count"); } cb(null, out, det); } catch (e) { // one at a time, then const outs = []; let det = ""; let i = 0; const next = function() { if (i >= parts.length) { cb(null, outs, det); return; } ugfTrTranslate(parts[i], sl, tl, function(err, o, d) { if (err) { cb(err); return; } outs.push(o); det = det || d || ""; i++; next(); }); }; next(); } }); } // All the pieces, in batches of about 4000 characters. Long pieces are cut at // sentence ends first. progress(done, total); cb(err, [translations], detected) function ugfTrMany(texts, sl, tl, progress, cb) { const LIMIT = 4000; // pieces that are only spaces, numbers or marks are not sent const worth = function(t) { return /[^\s\d\W_]|[À-￿]/.test(t || ""); }; const jobs = []; // [indexInTexts, subIndex, text] const cut = function(t) { if (t.length <= LIMIT) { return [t]; } const out = []; let rest = t; while (rest.length > LIMIT) { let at = -1; const head = rest.slice(0, LIMIT); const m = head.match(/[\s\S]*[.!?。!?]\s/); at = m ? m[0].length : head.lastIndexOf(" "); if (at < LIMIT / 3) { at = LIMIT; } out.push(rest.slice(0, at)); rest = rest.slice(at); } out.push(rest); return out; }; texts.forEach(function(t, i) { if (worth(t)) { cut(t).forEach(function(p, k) { jobs.push([i, k, p]); }); } }); const res = texts.map(function(t) { return worth(t) ? [] : t; }); const batches = []; let cur = []; let size = 0; jobs.forEach(function(j) { if (cur.length && (size + j[2].length > LIMIT || cur.length >= 90)) { batches.push(cur); cur = []; size = 0; } cur.push(j); size += j[2].length; }); if (cur.length) { batches.push(cur); } let done = 0; let det = ""; let bi = 0; const next = function() { if (bi >= batches.length) { cb(null, res.map(function(r) { return Array.isArray(r) ? r.join("") : r; }), det); return; } const b = batches[bi]; ugfTrBatch(b.map(function(j) { return j[2]; }), sl, tl, function(err, outs, d) { if (err) { cb(err); return; } det = det || d || ""; b.forEach(function(j, k) { // keep the spaces the piece began and ended with const lead = (j[2].match(/^\s*/) || [""])[0]; const trail = (j[2].match(/\s*$/) || [""])[0]; res[j[0]][j[1]] = lead + String(outs[k]).trim() + trail; }); done += b.length; if (progress) { progress(done, jobs.length); } bi++; next(); }); }; if (progress) { progress(0, jobs.length); } next(); } // ---- ZIP files (Office and OpenDocument files are ZIP files) ---------------------- function ugfTrCrcTable() { if (!ugfTrCrcTable.t) { const t = new Uint32Array(256); for (let n = 0; n < 256; n++) { let c = n; for (let k = 0; k < 8; k++) { c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; } t[n] = c >>> 0; } ugfTrCrcTable.t = t; } return ugfTrCrcTable.t; } function ugfTrCrc(bytes) { const t = ugfTrCrcTable(); let c = 0xffffffff; for (let i = 0; i < bytes.length; i++) { c = t[(c ^ bytes[i]) & 0xff] ^ (c >>> 8); } return (c ^ 0xffffffff) >>> 0; } // Deflate through the browser's own streams; where a userscript manager keeps // those out of reach, inflating is done here and compressing is left out function ugfTrStream(bytes, how, compress) { const fallback = function() { if (compress) { return Promise.reject(new Error("nocompress")); } try { return Promise.resolve(ugfTrInflate(how === "deflate" ? bytes.subarray(2) : bytes)); } catch (e) { return Promise.reject(e); } }; try { const S = compress ? CompressionStream : DecompressionStream; const s = new Blob([bytes]).stream().pipeThrough(new S(how)); return new Response(s).arrayBuffer().then(function(b) { return new Uint8Array(b); }).catch(fallback); } catch (e) { return fallback(); } } // a small inflater (after zlib's "puff") function ugfTrInflate(src) { let pos = 0; let bitbuf = 0; let bitcnt = 0; let out = new Uint8Array(Math.max(4096, src.length * 4)); let olen = 0; const room = function(n) { if (olen + n > out.length) { const nb = new Uint8Array(Math.max(out.length * 2, olen + n)); nb.set(out.subarray(0, olen)); out = nb; } }; const bits = function(n) { let v = 0; for (let i = 0; i < n; i++) { if (!bitcnt) { if (pos >= src.length) { throw new Error("inflate: end of data"); } bitbuf = src[pos++]; bitcnt = 8; } v |= (bitbuf & 1) << i; bitbuf >>>= 1; bitcnt--; } return v; }; const build = function(lengths) { const count = new Uint16Array(16); const offs = new Uint16Array(16); for (let i = 0; i < lengths.length; i++) { count[lengths[i]]++; } count[0] = 0; for (let i = 1; i < 16; i++) { offs[i] = offs[i - 1] + count[i - 1]; } const symbol = new Uint16Array(lengths.length); for (let i = 0; i < lengths.length; i++) { if (lengths[i]) { symbol[offs[lengths[i]]++] = i; } } return { count: count, symbol: symbol }; }; const decode = function(h) { let code = 0; let first = 0; let index = 0; for (let len = 1; len < 16; len++) { code |= bits(1); const c = h.count[len]; if (code - c < first) { return h.symbol[index + (code - first)]; } index += c; first += c; first <<= 1; code <<= 1; } throw new Error("inflate: bad code"); }; const LB = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258]; const LE = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; const DB = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577]; const DE = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; const codes = function(lit, dist) { for (;;) { let sym = decode(lit); if (sym < 256) { room(1); out[olen++] = sym; } else if (sym === 256) { return; } else { sym -= 257; if (sym >= 29) { throw new Error("inflate: bad length"); } const len = LB[sym] + bits(LE[sym]); const ds = decode(dist); const d = DB[ds] + bits(DE[ds]); if (d > olen) { throw new Error("inflate: bad distance"); } room(len); for (let i = 0; i < len; i++) { out[olen] = out[olen - d]; olen++; } } } }; let fixed = null; let last = 0; do { last = bits(1); const type = bits(2); if (type === 0) { bitbuf = 0; bitcnt = 0; const len = src[pos] | (src[pos + 1] << 8); pos += 4; room(len); out.set(src.subarray(pos, pos + len), olen); olen += len; pos += len; } else if (type === 1) { if (!fixed) { const l = new Uint8Array(288); for (let i = 0; i < 288; i++) { l[i] = i < 144 ? 8 : i < 256 ? 9 : i < 280 ? 7 : 8; } const dl = new Uint8Array(30).fill(5); fixed = [build(l), build(dl)]; } codes(fixed[0], fixed[1]); } else if (type === 2) { const nlen = bits(5) + 257; const ndist = bits(5) + 1; const ncode = bits(4) + 4; const order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; const cl = new Uint8Array(19); for (let i = 0; i < ncode; i++) { cl[order[i]] = bits(3); } const lencode = build(cl); const lens = new Uint8Array(nlen + ndist); for (let i = 0; i < nlen + ndist;) { const sym = decode(lencode); if (sym < 16) { lens[i++] = sym; } else { let rep = 0; let val = 0; if (sym === 16) { if (!i) { throw new Error("inflate: bad repeat"); } val = lens[i - 1]; rep = 3 + bits(2); } else if (sym === 17) { rep = 3 + bits(3); } else { rep = 11 + bits(7); } while (rep-- && i < nlen + ndist) { lens[i++] = val; } } } codes(build(lens.subarray(0, nlen)), build(lens.subarray(nlen))); } else { throw new Error("inflate: bad block"); } } while (!last); return out.slice(0, olen); } // the entries of a ZIP file: [{ name, method, crc, csize, usize, data (as stored), extra }] function ugfTrUnzip(buf) { const u8 = new Uint8Array(buf); const dv = new DataView(u8.buffer, u8.byteOffset, u8.byteLength); let eocd = -1; for (let i = u8.length - 22; i >= Math.max(0, u8.length - 70000); i--) { if (dv.getUint32(i, true) === 0x06054b50) { eocd = i; break; } } if (eocd < 0) { throw new Error("not a zip"); } const count = dv.getUint16(eocd + 10, true); let p = dv.getUint32(eocd + 16, true); const out = []; const dec = new TextDecoder("utf-8"); for (let n = 0; n < count; n++) { if (dv.getUint32(p, true) !== 0x02014b50) { throw new Error("bad zip"); } const method = dv.getUint16(p + 10, true); const crc = dv.getUint32(p + 16, true); const csize = dv.getUint32(p + 20, true); const usize = dv.getUint32(p + 24, true); const nl = dv.getUint16(p + 28, true); const el = dv.getUint16(p + 30, true); const cl = dv.getUint16(p + 32, true); const lh = dv.getUint32(p + 42, true); const name = dec.decode(u8.subarray(p + 46, p + 46 + nl)); const lnl = dv.getUint16(lh + 26, true); const lel = dv.getUint16(lh + 28, true); const start = lh + 30 + lnl + lel; out.push({ name: name, method: method, crc: crc, csize: csize, usize: usize, data: u8.subarray(start, start + csize) }); p += 46 + nl + el + cl; } return out; } function ugfTrEntryText(e) { const dec = new TextDecoder("utf-8"); if (e.method === 0) { return Promise.resolve(dec.decode(e.data)); } return ugfTrStream(e.data, "deflate-raw", false).then(function(b) { return dec.decode(b); }); } // a ZIP file again: changed entries (e.text) compressed afresh, the rest as they were function ugfTrZip(entries) { const enc = new TextEncoder(); return Promise.all(entries.map(function(e) { if (e.text === undefined) { return Promise.resolve(e); } const raw = enc.encode(e.text); // the mimetype entry of an OpenDocument file stays uncompressed if (e.name === "mimetype") { return Promise.resolve({ name: e.name, method: 0, crc: ugfTrCrc(raw), csize: raw.length, usize: raw.length, data: raw }); } return ugfTrStream(raw, "deflate-raw", true).then(function(c) { return { name: e.name, method: 8, crc: ugfTrCrc(raw), csize: c.length, usize: raw.length, data: c }; }, function() { return { name: e.name, method: 0, crc: ugfTrCrc(raw), csize: raw.length, usize: raw.length, data: raw }; }); })).then(function(list) { const parts = []; const central = []; let off = 0; list.forEach(function(e) { const nm = enc.encode(e.name); const lh = new Uint8Array(30 + nm.length); const lv = new DataView(lh.buffer); lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); lv.setUint16(8, e.method, true); lv.setUint16(10, 0, true); lv.setUint16(12, 0x21, true); lv.setUint32(14, e.crc, true); lv.setUint32(18, e.csize, true); lv.setUint32(22, e.usize, true); lv.setUint16(26, nm.length, true); lh.set(nm, 30); const ch = new Uint8Array(46 + nm.length); const cv = new DataView(ch.buffer); cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true); cv.setUint16(10, e.method, true); cv.setUint16(14, 0x21, true); cv.setUint32(16, e.crc, true); cv.setUint32(20, e.csize, true); cv.setUint32(24, e.usize, true); cv.setUint16(28, nm.length, true); cv.setUint32(42, off, true); ch.set(nm, 46); parts.push(lh, e.data); central.push(ch); off += lh.length + e.data.length; }); let csize = 0; central.forEach(function(c) { csize += c.length; }); const end = new Uint8Array(22); const ev = new DataView(end.buffer); ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, list.length, true); ev.setUint16(10, list.length, true); ev.setUint32(12, csize, true); ev.setUint32(16, off, true); return new Blob(parts.concat(central, [end])); }); } // ---- the paragraphs of an Office or OpenDocument file ---------------------------- // Which parts of the file hold text, and what a paragraph and a piece of its text // are called in them. A paragraph's translation goes into its first piece, the // others are emptied, so the paragraph keeps the look of its beginning. function ugfTrOfficeKind(name) { const ext = (name.match(/\.([a-z0-9]+)$/i) || ["", ""])[1].toLowerCase(); if (ext === "docx" || ext === "docm" || ext === "dotx") { return { ext: ext, parts: /^word\/(document|header\d*|footer\d*|footnotes|endnotes|comments)\.xml$/, para: "p", piece: "t", ns: "http://schemas.openxmlformats.org/wordprocessingml/2006/main", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }; } if (ext === "pptx" || ext === "ppsx") { return { ext: ext, parts: /^ppt\/(slides\/slide\d+|notesSlides\/notesSlide\d+)\.xml$/, para: "p", piece: "t", ns: "http://schemas.openxmlformats.org/drawingml/2006/main", mime: "application/vnd.openxmlformats-officedocument.presentationml.presentation", order: /slide(\d+)\.xml$/ }; } if (ext === "xlsx") { return { ext: ext, parts: /^xl\/(sharedStrings|worksheets\/sheet\d+)\.xml$/, para: ["si", "is"], piece: "t", ns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", order: /(\d+)\.xml$/ }; } if (ext === "odt" || ext === "odp" || ext === "ods") { return { ext: ext, parts: /^content\.xml$/, odf: true, mime: { odt: "application/vnd.oasis.opendocument.text", odp: "application/vnd.oasis.opendocument.presentation", ods: "application/vnd.oasis.opendocument.spreadsheet" }[ext] }; } return null; } // the paragraphs of one XML part: [{ pieces: [text node holders], text }] function ugfTrXmlParas(doc, kind) { const out = []; if (kind.odf) { const T = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"; const ps = Array.prototype.filter.call(doc.getElementsByTagNameNS(T, "*"), function(e) { return e.localName === "p" || e.localName === "h"; }); ps.forEach(function(p) { const pieces = []; const walk = function(n) { for (let c = n.firstChild; c; c = c.nextSibling) { if (c.nodeType === 3) { pieces.push(c); } else if (c.nodeType === 1 && !(c.namespaceURI === T && (c.localName === "p" || c.localName === "h" || c.localName === "note"))) { walk(c); } } }; walk(p); const text = pieces.map(function(x) { return x.nodeValue; }).join(""); if (text.trim()) { out.push({ pieces: pieces, text: text, set: function(v) { pieces[0].nodeValue = v; for (let i = 1; i < pieces.length; i++) { pieces[i].nodeValue = ""; } } }); } }); return out; } const paraNames = [].concat(kind.para); const ps = Array.prototype.filter.call(doc.getElementsByTagNameNS(kind.ns, "*"), function(e) { return paraNames.indexOf(e.localName) > -1; }); ps.forEach(function(p) { // not the paragraphs inside this one (a text box in a paragraph has its own) const pieces = Array.prototype.filter.call(p.getElementsByTagNameNS(kind.ns, kind.piece), function(t) { let a = t.parentNode; while (a && a !== p) { if (a.namespaceURI === kind.ns && paraNames.indexOf(a.localName) > -1) { return false; } a = a.parentNode; } return true; }); const text = pieces.map(function(t) { return t.textContent; }).join(""); if (text.trim()) { out.push({ pieces: pieces, text: text, set: function(v) { pieces[0].textContent = v; pieces[0].setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); for (let i = 1; i < pieces.length; i++) { pieces[i].textContent = ""; } } }); } }); return out; } function ugfTrA85(b) { const out = []; let tuple = 0; let cnt = 0; let i = 0; if (b[0] === 60 && b[1] === 126) { i = 2; } for (; i < b.length; i++) { const c = b[i]; if (c === 126) { break; } if (c <= 32) { continue; } if (c === 122 && cnt === 0) { out.push(0, 0, 0, 0); continue; } tuple = tuple * 85 + (c - 33); cnt++; if (cnt === 5) { out.push((tuple >>> 24) & 255, (tuple >>> 16) & 255, (tuple >>> 8) & 255, tuple & 255); tuple = 0; cnt = 0; } } if (cnt) { for (let k = cnt; k < 5; k++) { tuple = tuple * 85 + 84; } const bytes = [(tuple >>> 24) & 255, (tuple >>> 16) & 255, (tuple >>> 8) & 255, tuple & 255]; for (let k = 0; k < cnt - 1; k++) { out.push(bytes[k]); } } return new Uint8Array(out); } // the glyph names of PDF fonts that are not simply their letter function ugfTrGlyphNames() { if (!ugfTrGlyphNames.m) { const m = { space: " ", exclam: "!", quotedbl: "\"", numbersign: "#", dollar: "$", percent: "%", ampersand: "&", quotesingle: "'", quoteright: "\u2019", quoteleft: "\u2018", parenleft: "(", parenright: ")", asterisk: "*", plus: "+", comma: ",", hyphen: "-", minus: "\u2212", period: ".", slash: "/", colon: ":", semicolon: ";", less: "<", equal: "=", greater: ">", question: "?", at: "@", bracketleft: "[", backslash: "\\", bracketright: "]", asciicircum: "^", underscore: "_", grave: "`", braceleft: "{", bar: "|", braceright: "}", asciitilde: "~", quotedblleft: "\u201c", quotedblright: "\u201d", quotedblbase: "\u201e", quotesinglbase: "\u201a", endash: "\u2013", emdash: "\u2014", bullet: "\u2022", ellipsis: "\u2026", fi: "fi", fl: "fl", ff: "ff", ffi: "ffi", ffl: "ffl", germandbls: "\u00df", ae: "\u00e6", AE: "\u00c6", oe: "\u0153", OE: "\u0152", oslash: "\u00f8", Oslash: "\u00d8", dagger: "\u2020", daggerdbl: "\u2021", degree: "\u00b0", copyright: "\u00a9", registered: "\u00ae", trademark: "\u2122", section: "\u00a7", paragraph: "\u00b6", periodcentered: "\u00b7", nbspace: "\u00a0", dotlessi: "\u0131", guillemotleft: "\u00ab", guillemotright: "\u00bb", zero: "0", one: "1", two: "2", three: "3", four: "4", five: "5", six: "6", seven: "7", eight: "8", nine: "9", Euro: "\u20ac", sterling: "\u00a3", yen: "\u00a5", cent: "\u00a2" }; // letters with accents: aacute, Egrave, ntilde and the rest const marks = { acute: "\u0301", grave: "\u0300", circumflex: "\u0302", dieresis: "\u0308", tilde: "\u0303", ring: "\u030a", cedilla: "\u0327", caron: "\u030c" }; "aeiouyAEIOUYncNCszSZ".split("").forEach(function(l) { Object.keys(marks).forEach(function(k) { const c = (l + marks[k]).normalize("NFC"); if (c.length === 1) { m[l + k] = c; } }); }); ugfTrGlyphNames.m = m; } return ugfTrGlyphNames.m; } // ---- the text of a PDF --------------------------------------------------------- // Enough of a PDF reader for its words: the objects (object streams too), Flate // streams, each font's ToUnicode map, and the text operators of each page. function ugfTrPdfText(buf) { const u8 = new Uint8Array(buf); const latin = function(a, b) { let s = ""; for (let i = a; i < b; i += 8192) { s += String.fromCharCode.apply(null, u8.subarray(i, Math.min(b, i + 8192))); } return s; }; const all = latin(0, u8.length); // a small parser of PDF values const parse = function(s, pos) { const ws = function() { for (;;) { while (pos < s.length && /[\s\0]/.test(s[pos])) { pos++; } if (s[pos] === "%") { while (pos < s.length && s[pos] !== "\n" && s[pos] !== "\r") { pos++; } } else { return; } } }; const val = function() { ws(); const c = s[pos]; if (c === "<" && s[pos + 1] === "<") { pos += 2; const d = { __dict: true }; for (;;) { ws(); if (s[pos] === ">" && s[pos + 1] === ">") { pos += 2; return d; } if (pos >= s.length) { return d; } const k = val(); const v = val(); if (k && k.name) { d[k.name] = v; } } } if (c === "<") { const e = s.indexOf(">", pos); const hex = s.slice(pos + 1, e).replace(/[^0-9a-f]/gi, ""); pos = e + 1; const bytes = []; for (let i = 0; i < hex.length; i += 2) { bytes.push(parseInt((hex[i] || "0") + (hex[i + 1] || "0"), 16)); } return { str: bytes }; } if (c === "(") { pos++; let depth = 1; const bytes = []; while (pos < s.length) { let ch = s[pos++]; if (ch === "\\") { ch = s[pos++]; const map = { n: 10, r: 13, t: 9, b: 8, f: 12 }; if (map[ch] !== undefined) { bytes.push(map[ch]); } else if (/[0-7]/.test(ch)) { let o = ch; while (o.length < 3 && /[0-7]/.test(s[pos])) { o += s[pos++]; } bytes.push(parseInt(o, 8) & 255); } else if (ch === "\r") { if (s[pos] === "\n") { pos++; } } else if (ch !== "\n") { bytes.push(ch.charCodeAt(0)); } continue; } if (ch === "(") { depth++; } else if (ch === ")") { depth--; if (!depth) { break; } } bytes.push(ch.charCodeAt(0)); } return { str: bytes }; } if (c === "[") { pos++; const a = []; for (;;) { ws(); if (s[pos] === "]" || pos >= s.length) { pos++; return a; } a.push(val()); } } if (c === "/") { const m = /^\/([^\s\/\[\]()<>{}%]*)/.exec(s.slice(pos, pos + 128)); pos += m[0].length; return { name: m[1].replace(/#([0-9a-f]{2})/gi, function(x, h) { return String.fromCharCode(parseInt(h, 16)); }) }; } const m = /^([+-]?(\d+\.?\d*|\.\d+))(\s+(\d+)\s+R(?![A-Za-z]))?/.exec(s.slice(pos, pos + 40)); if (m) { pos += m[0].length; return m[3] ? { ref: +m[1] } : +m[1]; } const w = /^[A-Za-z'"*]+/.exec(s.slice(pos, pos + 32)); if (w) { pos += w[0].length; return { op: w[0] }; } pos++; return null; }; return { val: val, at: function() { return pos; }, set: function(p) { pos = p; }, ws: ws }; }; // every object: its dictionary and, for a stream, where its bytes are const objs = {}; const re = /(\d+)\s+(\d+)\s+obj\b/g; let m; while ((m = re.exec(all))) { const p = parse(all, m.index + m[0].length); let v = null; try { v = p.val(); } catch (e) { continue; } const o = { v: v }; p.ws(); const after = p.at(); if (all.slice(after, after + 6) === "stream") { let s0 = after + 6; if (all[s0] === "\r") { s0++; } if (all[s0] === "\n") { s0++; } let len = v && typeof v.Length === "number" ? v.Length : -1; let e0 = len >= 0 ? s0 + len : all.indexOf("endstream", s0); if (all.slice(e0, e0 + 20).indexOf("endstream") < 0) { e0 = all.indexOf("endstream", s0); } o.s = [s0, e0]; o.lenRef = v && v.Length && v.Length.ref; } objs[+m[1]] = o; } const decode = function(o) { if (!o || !o.s) { return Promise.resolve(null); } if (o.bytes) { return Promise.resolve(o.bytes); } let [s0, e0] = o.s; if (o.lenRef && objs[o.lenRef] && typeof objs[o.lenRef].v === "number") { e0 = s0 + objs[o.lenRef].v; } let raw = u8.subarray(s0, e0); let f = o.v.Filter; f = Array.isArray(f) ? f.map(function(x) { return x.name; }) : f ? [f.name] : []; if (!f.length) { o.bytes = raw; return Promise.resolve(raw); } // ASCII85 (ReportLab writes it) before Flate if (f[0] === "ASCII85Decode" || f[0] === "A85") { raw = ugfTrA85(raw); f = f.slice(1); if (!f.length) { o.bytes = raw; return Promise.resolve(raw); } } if (f.length === 1 && (f[0] === "FlateDecode" || f[0] === "Fl")) { return ugfTrStream(raw, "deflate", false).catch(function() { return ugfTrStream(raw.subarray(2), "deflate-raw", false); }).then(function(b) { const pr = o.v.DecodeParms; if (pr && pr.Predictor >= 10) { const cols = (pr.Columns || 1) + 1; const rows = Math.floor(b.length / cols); const outp = new Uint8Array(rows * (cols - 1)); const prev = new Uint8Array(cols - 1); for (let r = 0; r < rows; r++) { const t = b[r * cols]; for (let c = 0; c < cols - 1; c++) { let x = b[r * cols + 1 + c]; if (t === 2) { x = (x + prev[c]) & 255; } prev[c] = x; outp[r * (cols - 1) + c] = x; } } b = outp; } o.bytes = b; return b; }).catch(function() { return null; }); } return Promise.resolve(null); }; const str = function(b) { let s = ""; for (let i = 0; i < b.length; i += 8192) { s += String.fromCharCode.apply(null, b.subarray(i, Math.min(b.length, i + 8192))); } return s; }; // objects kept in object streams const objStreams = Object.keys(objs).filter(function(k) { const v = objs[k].v; return v && v.Type && v.Type.name === "ObjStm"; }); return Promise.all(objStreams.map(function(k) { return decode(objs[k]).then(function(b) { if (!b) { return; } const s = str(b); const v = objs[k].v; const head = parse(s, 0); const nums = []; for (let i = 0; i < v.N; i++) { nums.push([head.val(), head.val()]); } nums.forEach(function(x) { if (objs[x[0]] && objs[x[0]].s) { return; } const p = parse(s, v.First + x[1]); try { objs[x[0]] = { v: p.val() }; } catch (e) {} }); }); })).then(function() { const get = function(v) { let n = 0; while (v && v.ref !== undefined && n++ < 20) { v = objs[v.ref] ? objs[v.ref].v : null; } return v; }; // the pages, in order let root = null; Object.keys(objs).forEach(function(k) { const v = objs[k].v; if (v && v.Type && v.Type.name === "Catalog") { root = v; } }); const pages = []; const seen = {}; const walk = function(node, inherited, id) { if (!node || (id && seen[id])) { return; } if (id) { seen[id] = true; } const res = node.Resources ? get(node.Resources) : inherited; if (node.Kids) { (get(node.Kids) || []).forEach(function(k) { walk(get(k), res, k.ref); }); } else if (node.Contents !== undefined) { pages.push({ node: node, res: res }); } }; if (root) { walk(get(root.Pages), null, 0); } if (!pages.length) { Object.keys(objs).forEach(function(k) { const v = objs[k].v; if (v && v.Type && v.Type.name === "Page") { pages.push({ node: v, res: get(v.Resources) }); } }); } // a font's map from codes to text const cmaps = {}; const fontMap = function(fref) { const key = fref && fref.ref !== undefined ? "r" + fref.ref : null; if (key && cmaps[key]) { return Promise.resolve(cmaps[key]); } const font = get(fref); const fm = { bytes: font && font.Subtype && font.Subtype.name === "Type0" ? 2 : 1, map: null }; // how wide each character is, to know where the next one goes const widths = {}; let dw = 0.5; try { if (font && font.Subtype && font.Subtype.name === "Type0") { const dfs = get(font.DescendantFonts); const df = get(Array.isArray(dfs) ? dfs[0] : dfs); if (df) { dw = typeof df.DW === "number" ? df.DW / 1000 : 1; const W = get(df.W) || []; for (let i = 0; i < W.length;) { const c = get(W[i]); const nx = get(W[i + 1]); if (Array.isArray(nx)) { nx.forEach(function(w, k) { widths[c + k] = get(w) / 1000; }); i += 2; } else { const w = get(W[i + 2]) / 1000; for (let k = c; k <= nx && k - c < 65536; k++) { widths[k] = w; } i += 3; } } } } else if (font) { const fc = get(font.FirstChar) || 0; (get(font.Widths) || []).forEach(function(w, k) { widths[fc + k] = get(w) / 1000; }); dw = /Courier/.test((font.BaseFont && font.BaseFont.name) || "") ? 0.6 : 0.5; if (!Object.keys(widths).length) { widths[32] = dw === 0.6 ? 0.6 : 0.278; } } } catch (e) {} // simple fonts: MacRoman, and the Differences of the font's own encoding try { const enc = font && get(font.Encoding); if (enc && (enc.name === "MacRomanEncoding" || (enc.BaseEncoding && enc.BaseEncoding.name === "MacRomanEncoding"))) { fm.mac = true; } const dif = enc && get(enc.Differences); if (Array.isArray(dif)) { const names = ugfTrGlyphNames(); let code = 0; fm.diff = {}; dif.forEach(function(x) { x = get(x); if (typeof x === "number") { code = x; } else if (x && x.name) { const nm = x.name; let ch = names[nm]; if (ch === undefined) { const u = /^uni([0-9A-F]{4})/i.exec(nm) || /^u([0-9A-F]{4,6})$/i.exec(nm); ch = u ? String.fromCodePoint(parseInt(u[1], 16)) : nm.length === 1 ? nm : /^[A-Za-z]\.\w+$/.test(nm) ? nm[0] : undefined; } if (ch !== undefined) { fm.diff[code] = ch; } code++; } }); } } catch (e) {} fm.w = function(c) { const v = widths[c]; return typeof v === "number" && v > 0 ? v : dw; }; const tu = font && font.ToUnicode; if (!tu || tu.ref === undefined || !objs[tu.ref]) { if (key) { cmaps[key] = fm; } return Promise.resolve(fm); } return decode(objs[tu.ref]).then(function(b) { if (b) { const s = str(b); const map = {}; const hex = function(h) { return parseInt(h, 16); }; const uni = function(h) { let o = ""; for (let i = 0; i + 3 < h.length + 1; i += 4) { o += String.fromCharCode(hex(h.substr(i, 4))); } return o; }; const cs = /<([0-9a-f]+)>\s*<([0-9a-f]+)>/i.exec((s.match(/begincodespacerange([\s\S]*?)endcodespacerange/) || ["", ""])[1]); if (cs) { fm.bytes = Math.max(1, Math.ceil(cs[1].length / 2)); } (s.match(/beginbfchar([\s\S]*?)endbfchar/g) || []).forEach(function(blk) { const r2 = /<([0-9a-f]+)>\s*<([0-9a-f]*)>/gi; let x; while ((x = r2.exec(blk))) { map[hex(x[1])] = uni(x[2]); } }); (s.match(/beginbfrange([\s\S]*?)endbfrange/g) || []).forEach(function(blk) { const r3 = /<([0-9a-f]+)>\s*<([0-9a-f]+)>\s*(<([0-9a-f]*)>|\[([^\]]*)\])/gi; let x; while ((x = r3.exec(blk))) { const a = hex(x[1]); const z = hex(x[2]); if (x[4] !== undefined) { const base = x[4]; const last = hex(base.slice(-4) || "0"); for (let c = a; c <= z && c - a < 65536; c++) { map[c] = uni(base.slice(0, -4)) + String.fromCharCode(last + (c - a)); } } else { const list = x[5].match(/<([0-9a-f]*)>/gi) || []; list.forEach(function(h, i) { map[a + i] = uni(h.replace(/[<>]/g, "")); }); } } }); fm.map = map; } if (key) { cmaps[key] = fm; } return fm; }); }; const mac = "\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7"; const win = "€\u0081‚ƒ„…†‡ˆ‰Š‹Œ\u008dŽ\u008f\u0090‘’“”•–—˜™š›œ\u009džŸ"; // the characters of a string: [[text, width in ems], ...] const glyphs = function(bytes, fm) { const out = []; const nb = fm ? fm.bytes : 1; for (let i = 0; i < bytes.length; i += nb) { let c = 0; for (let k = 0; k < nb; k++) { c = c * 256 + (bytes[i + k] || 0); } let t = ""; if (fm && fm.map) { t = fm.map[c] !== undefined ? fm.map[c] : ""; } else if (nb === 1) { t = fm && fm.diff && fm.diff[c] !== undefined ? fm.diff[c] : fm && fm.mac && c >= 128 ? mac[c - 128] : c >= 128 && c < 160 ? win[c - 128] : String.fromCharCode(c); } out.push([t, fm && fm.w ? fm.w(c) : 0.5, c]); } return out; }; // one page's lines const readPage = function(pg) { let cont = pg.node.Contents; cont = Array.isArray(get(cont)) ? get(cont) : [cont]; const fonts = pg.res && get(pg.res.Font) ? get(pg.res.Font) : {}; const names = Object.keys(fonts).filter(function(k) { return k !== "__dict"; }); const fms = {}; return Promise.all(names.map(function(n) { return fontMap(fonts[n]).then(function(fm) { fms[n] = fm; }); })).then(function() { return Promise.all(cont.map(function(c) { return c && c.ref !== undefined ? decode(objs[c.ref]) : null; })); }).then(function(bufs) { const s = bufs.filter(Boolean).map(str).join("\n"); const p = parse(s, 0); const lines = []; let line = ""; let chunks = []; // the pieces of the line being read, by where they start let y = null; // the y of the line being read let ly = 0; // the text line's y, as the operators move it let lx = 0; // and its x let tx = 0; // how far along the line the text has gone let tc = 0; let tw = 0; let lead = 0; let fm = null; let fsize = 12; let scale = 1; let stack = []; const size = function() { return fsize * scale; }; // a string drawn: its characters go where the widths put them const show = function(bytes) { glyphs(bytes, fm).forEach(function(g) { const x = lx + tx; const w = g[1] * size(); const c = chunks[chunks.length - 1]; // a character with no text but a space's width is a space const t = g[0] || (g[1] >= 0.2 && g[1] <= 0.6 ? " " : ""); if (c && Math.abs(x - c.end) < 0.3 * size()) { c.t += (x - c.end > 0.15 * size() && !/\s$/.test(c.t) && t !== " " ? " " : "") + t; c.end = x + w; } else { chunks.push({ x: x, end: x + w, t: t, i: chunks.length }); } tx += w + tc * scale + (g[2] === 32 && fm && fm.bytes === 1 ? tw * scale : 0); }); }; // the pieces left to right (they are not always drawn in that order), // with spaces between words but not before a comma or inside a word const join = function() { const cs = chunks.filter(function(c) { return c.t; }).sort(function(a, b) { return a.x - b.x || a.i - b.i; }); let out = ""; let end = null; cs.forEach(function(c) { // a space drawn over text already placed says nothing new if (end !== null && !c.t.trim() && c.x < end) { return; } if (end !== null && c.x - end > 0.15 * size() && !/\s$/.test(out) && !/^\s/.test(c.t)) { out += " "; } out += c.t; end = end === null ? c.end : Math.max(end, c.end); }); chunks = []; return out; }; const brk = function() { line = join().replace(/[\ufb00-\ufb06]/g, function(x) { return x.normalize("NFKC"); }); if (line.trim()) { lines.push({ t: line.replace(/\s+/g, " ").trim(), y: y, size: size() }); } line = ""; }; // the text moves to a new y: the same line, or a new one const moveTo = function(ny) { if (y === null) { y = ny; } else if (Math.abs(ny - y) >= size() * 0.5) { brk(); y = ny; } }; let guard = 0; while (p.at() < s.length && guard++ < 2000000) { const v = p.val(); if (v === null || v === undefined) { continue; } if (!v.op) { stack.push(v); continue; } const op = v.op; const n = function(i) { const x = stack[stack.length - i]; return typeof x === "number" ? x : 0; }; if (op === "BT") { ly = 0; lx = 0; tx = 0; scale = 1; } else if (op === "Tc") { tc = n(1); } else if (op === "Tw") { tw = n(1); } else if (op === "Tf") { const f = stack[stack.length - 2]; fsize = Math.abs(n(1)) || fsize; fm = f && f.name ? fms[f.name] : null; } else if (op === "Tj" || op === "'" || op === '"') { if (op !== "Tj") { ly -= lead || size(); lx = 0; tx = 0; moveTo(ly); } const a = stack[stack.length - 1]; if (a && a.str) { if (y === null) { y = ly; } show(a.str); } } else if (op === "TJ") { const a = stack[stack.length - 1]; if (y === null) { y = ly; } (Array.isArray(a) ? a : []).forEach(function(x) { if (x && x.str) { show(x.str); } else if (typeof x === "number") { tx -= x / 1000 * size(); } }); } else if (op === "Td" || op === "TD") { if (op === "TD") { lead = -n(1); } ly += n(1) * scale; lx += n(2) * scale; tx = 0; moveTo(ly); } else if (op === "Tm") { scale = Math.abs(n(3)) || 1; if (scale > 0.2 && fsize > 2) { scale = 1; } ly = n(1); lx = n(2); tx = 0; moveTo(ly); } else if (op === "T*") { ly -= lead || size(); lx = 0; tx = 0; moveTo(ly); } else if (op === "TL") { lead = n(1) || lead; } else if (op === "BI") { const e = s.indexOf("EI", p.at()); p.set(e < 0 ? s.length : e + 2); } stack = []; } brk(null); // lines into paragraphs: a new one after a wider gap, a short line // or a change of size const gaps = []; for (let i = 1; i < lines.length; i++) { gaps.push(Math.abs(lines[i - 1].y - lines[i].y)); } const sorted = gaps.filter(function(g) { return g > 0; }).sort(function(a, b) { return a - b; }); const usual = sorted.length ? sorted[Math.floor(sorted.length / 2)] : 14; const longest = Math.max.apply(null, lines.map(function(l) { return l.t.length; }).concat([1])); // which way the lines run (down the page, mostly; some files count y downwards) let down = 0; for (let i = 1; i < lines.length; i++) { down += lines[i - 1].y > lines[i].y ? 1 : lines[i - 1].y < lines[i].y ? -1 : 0; } const dir = down < 0 ? -1 : 1; const paras = []; let cur = ""; lines.forEach(function(l, i) { const prev = lines[i - 1]; if (i && (Math.abs(prev.y - l.y) > usual * 1.45 || Math.abs(prev.size - l.size) > 1.5 || prev.t.length < longest * 0.6 || (prev.y - l.y) * dir < 0 || (/[.!?:;\u3002]["'\u201d\u2019)]?$/.test(prev.t) && /^["'\u201c\u2018(]?[A-Z0-9\u00c0-\u00de\u0391-\u03a9\u0410-\u042f]/.test(l.t)))) { paras.push(cur); cur = ""; } cur = cur ? (/-$/.test(cur) ? cur.slice(0, -1) + l.t : cur + " " + l.t) : l.t; }); if (cur) { paras.push(cur); } return paras; }); }; const out = []; let chain = Promise.resolve(); pages.forEach(function(pg, i) { chain = chain.then(function() { return readPage(pg).then(function(paras) { out.push(paras); }).catch(function() { out.push([]); }); }); }); return chain.then(function() { return out; }); }); } // ---- a document, start to finish ------------------------------------------------- // cb(err, { name, from: [[paragraph, ...] per page or part], to: [[...]], blob, det }) function ugfTrDoc(file, sl, tl, progress, cb) { const name = file.name || "document"; const ext = (name.match(/\.([a-z0-9]+)$/i) || ["", ""])[1].toLowerCase(); const base = name.replace(/\.[^.]+$/, ""); const outName = base + " (" + ugfTrName(tl) + ")." + (ext === "pdf" ? "txt" : ext || "txt"); const fail = function(e) { cb(e instanceof Error ? e : new Error(String(e))); }; const kind = ugfTrOfficeKind(name); const readBuf = function() { return file.arrayBuffer ? file.arrayBuffer() : new Response(file).arrayBuffer(); }; if (kind) { readBuf().then(function(buf) { const entries = ugfTrUnzip(buf); let targets = entries.filter(function(e) { return kind.parts.test(e.name); }); if (kind.order) { targets = targets.slice().sort(function(a, b) { const na = /notesSlide/.test(a.name) ? 1e6 : 0; const nb = /notesSlide/.test(b.name) ? 1e6 : 0; return na + +((a.name.match(/(\d+)\.xml$/) || [0, 0])[1]) - nb - +((b.name.match(/(\d+)\.xml$/) || [0, 0])[1]); }); } // the document itself before its headers and footers targets.sort(function(a, b) { return (/document\.xml$|content\.xml$/.test(b.name) ? 1 : 0) - (/document\.xml$|content\.xml$/.test(a.name) ? 1 : 0); }); if (!targets.length) { throw new Error("empty"); } return Promise.all(targets.map(ugfTrEntryText)).then(function(texts) { const docs = texts.map(function(t) { return new DOMParser().parseFromString(trusted_policy.createHTML(t), "application/xml"); }); const groups = docs.map(function(d) { return ugfTrXmlParas(d, kind); }); const flat = []; groups.forEach(function(g) { g.forEach(function(p) { flat.push(p.text); }); }); if (!flat.length) { throw new Error("empty"); } ugfTrMany(flat, sl, tl, progress, function(err, outs, det) { if (err) { fail(err); return; } let i = 0; const to = []; groups.forEach(function(g) { const page = []; g.forEach(function(p) { p.set(outs[i]); page.push(outs[i]); i++; }); to.push(page); }); const ser = new XMLSerializer(); targets.forEach(function(t, k) { let x = ser.serializeToString(docs[k]); if (!/^<\?xml/.test(x)) { x = '\r\n' + x; } t.text = x; }); ugfTrZip(entries).then(function(blob) { cb(null, { name: outName, from: groups.map(function(g) { return g.map(function(p) { return p.text; }); }), to: to, blob: new Blob([blob], { type: kind.mime }), det: det }); }).catch(fail); }); }); }).catch(fail); return; } if (ext === "pdf") { readBuf().then(ugfTrPdfText).then(function(pages) { const flat = []; pages.forEach(function(p) { p.forEach(function(x) { flat.push(x); }); }); if (!flat.join("").trim()) { throw new Error("nopdftext"); } ugfTrMany(flat, sl, tl, progress, function(err, outs, det) { if (err) { fail(err); return; } let i = 0; const to = pages.map(function(p) { return p.map(function() { return outs[i++]; }); }); const txt = to.map(function(p) { return p.join("\r\n\r\n"); }).join("\r\n\r\n\f\r\n"); cb(null, { name: outName, from: pages, to: to, blob: new Blob([txt], { type: "text/plain;charset=utf-8" }), det: det }); }); }).catch(fail); return; } if (ext === "htm" || ext === "html" || ext === "xhtml") { file.text().then(function(t) { const d = new DOMParser().parseFromString(trusted_policy.createHTML(t), "text/html"); const nodes = []; const tw = d.createTreeWalker(d.body || d.documentElement, NodeFilter.SHOW_TEXT); let n; while ((n = tw.nextNode())) { if (n.nodeValue.trim() && !n.parentNode.closest("script, style, noscript, code, pre")) { nodes.push(n); } } const tn = d.querySelector("title"); const texts = nodes.map(function(x) { return x.nodeValue; }).concat(tn ? [tn.textContent] : []); // for showing: the text of each block (heading, paragraph, cell...) together const blockOf = function(x) { return x.parentNode.closest("p, h1, h2, h3, h4, h5, h6, li, td, th, dt, dd, blockquote, pre, figcaption, caption, div, section, article, body") || d.body; }; const grouped = function(list) { const out = []; let last = null; nodes.forEach(function(x, i) { const b = blockOf(x); if (b !== last || !out.length) { out.push(""); last = b; } out[out.length - 1] += list[i]; }); return out.map(function(t) { return t.replace(/\s+/g, " ").trim(); }).filter(Boolean); }; ugfTrMany(texts, sl, tl, progress, function(err, outs, det) { if (err) { fail(err); return; } const fromShown = grouped(texts); const toShown = grouped(outs); nodes.forEach(function(x, i) { x.nodeValue = outs[i]; }); if (tn) { tn.textContent = outs[outs.length - 1]; } if (d.documentElement) { d.documentElement.setAttribute("lang", tl); } if (d.head && !d.querySelector("meta[charset]")) { const mc = d.createElement("meta"); mc.setAttribute("charset", "utf-8"); d.head.insertBefore(mc, d.head.firstChild); } const html = "\n" + d.documentElement.outerHTML; cb(null, { name: outName, from: [fromShown], to: [toShown], blob: new Blob([html], { type: "text/html;charset=utf-8" }), det: det, html: true }); }); }).catch(fail); return; } if (/^(txt|text|md|markdown|csv|tsv|srt|vtt|log|ini|json|xml|rtf)$/.test(ext) || /^text\//.test(file.type || "")) { file.text().then(function(t) { if (ext === "rtf") { // the words of a rich-text file, without its formatting t = t.replace(/\\par[d]?/g, "\n").replace(/\{\\\*[^{}]*\}/g, "").replace(/\\'([0-9a-f]{2})/gi, function(x, h) { return String.fromCharCode(parseInt(h, 16)); }).replace(/\\u(-?\d+)\??/g, function(x, c) { return String.fromCharCode((+c + 65536) % 65536); }).replace(/\\[a-z]+-?\d* ?/gi, "").replace(/[{}]/g, "").replace(/\n{3,}/g, "\n\n").trim(); } const lines = t.split(/\r?\n/); ugfTrMany(lines, sl, tl, progress, function(err, outs, det) { if (err) { fail(err); return; } const paras = function(ls) { return ls.join("\n").split(/\n\s*\n/).filter(function(x) { return x.trim(); }); }; cb(null, { name: ext === "rtf" ? base + " (" + ugfTrName(tl) + ").txt" : outName, from: [paras(lines)], to: [paras(outs)], blob: new Blob([outs.join(/\r\n/.test(t) ? "\r\n" : "\n")], { type: "text/plain;charset=utf-8" }), det: det }); }); }).catch(fail); return; } fail(new Error("type")); } // the kinds of file Gplex translates function ugfTrDocTypes() { return ".docx,.pptx,.xlsx,.odt,.odp,.ods,.pdf,.txt,.rtf,.htm,.html,.srt,.csv"; } // ---- a website, translated ------------------------------------------------------ // Google shows a translated website at .translate.goog with its bar across the // top, which is a frame of translate.google.com - so Gplex draws the bar of the // period inside that frame, over Google's own: the languages, Translation or // Original, and the way back to the website itself. function ugfTrWebBarWanted() { return window.location.host === "translate.google.com" && /^\/websitetranslationui\/?$/.test(window.location.pathname || "") && !ugfNtTopFrame() && ugfNtOn("UGF_TRANSLATE_ON"); } function ugfTrWebBar() { const era = ugfTrEra(); const A = ugfNtArt(); const esc = ugfNtEsc; const l = String(layout || ""); const q = new URLSearchParams(window.location.search); const u = q.get("u") || ""; // the page shown untranslated ("Original") carries op=true const st = { sl: q.get("sl") || "auto", tl: q.get("tl") || "en", view: q.get("op") === "true" ? "from" : "to" }; const langs = ugfTrLangsFor(era); const opts = function(sel, auto) { return (auto ? '" : "") + langs.map(function(x) { return '"; }).join(""); }; const T = "#ugf-trw"; const css = [ "html, body { background: transparent !important; overflow: hidden !important; }", "body > *:not(#ugf-trw):not(script):not(style) { visibility: hidden !important; }", T + " { position: fixed; left: 0; top: 0; right: 0; height: 57px; z-index: 2147483647; display: flex; align-items: center; gap: 12px; padding: 0 12px; visibility: visible; box-sizing: border-box; white-space: nowrap; overflow: hidden; }", T + " * { box-sizing: border-box; } " + T + " img { display: block; } " + T + " .sp { flex: 1; }", T + " select { max-width: 170px; }", T + " .src { overflow: hidden; text-overflow: ellipsis; min-width: 0; }" ]; let h = ""; const src = 'Translated version of ' + esc(u.replace(/^https?:\/\//, "").replace(/\/$/, "")) + ""; if (era === "t2006" || era === "t2008" || era === "t2010") { const logo = era === "t2010" ? 'Google translate' : 'Google'; h = logo + '
' + src + "
" + '
Translate from to " + 'View:
" + 'Remove frame'; css.push( T + " { background: #fff; border-bottom: 1px solid #c9d7f1; font: 13px arial, sans-serif; color: #000; padding-left: 8px; }", T + " a { color: #00c; } " + T + " .mid { display: flex; flex-direction: column; gap: 4px; min-width: 0; }", T + " .r2 { display: flex; align-items: center; gap: 5px; } " + T + " select, " + T + " input { font: 13px arial, sans-serif; }", T + " .view { margin-left: 14px; } " + T + " .view label { margin-left: 4px; } " + T + " .rm { font-size: 12px; }" ); if (era !== "t2010") { css.push(T + " { background: #e5ecf9; border-bottom-color: #36c; }"); } } else if (era === "t2012" || era === "t2015") { h = 'Translate' + '" + 'TranslationOriginal' + '' + src + '×'; css.push( T + " { background: #f1f1f1; border-bottom: 1px solid #e5e5e5; font: 13px arial, sans-serif; color: #222; gap: 14px; padding: 0 16px; }", T + " a { color: #15c; text-decoration: none; } " + T + " .logo img { width: 70px !important; height: auto !important; }", T + " .lbl { color: #dd4b39; font-size: 18px; margin-right: 8px; }", T + " .kb { display: inline-flex; align-items: center; gap: 4px; height: 29px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444 !important; font: bold 11px arial, sans-serif; cursor: default; }", T + " .kb:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); }", T + " .kb select { border: 0; background: transparent; font: bold 11px arial, sans-serif; color: #222; outline: none; cursor: pointer; }", T + " .grp { display: inline-flex; } " + T + " .grp .kb { border-radius: 0; margin-left: -1px; } " + T + " .grp .kb:first-child { border-radius: 2px 0 0 2px; margin-left: 0; } " + T + " .grp .kb:last-child { border-radius: 0 2px 2px 0; }", T + " .kb.on { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); border-color: #ccc; color: #222 !important; }", T + " .src { color: #666; font-size: 12px; } " + T + " .x { color: #777 !important; font-size: 22px; padding: 0 4px; }" ); } else { h = '' + '' + ugfNtIcon("arrow_forward", 20) + '" + 'OriginalTranslation' + '' + ugfNtIcon("close", 24) + ""; css.push( T + " { background: #fff; border-bottom: 1px solid #dadce0; font: 14px Roboto, arial, sans-serif; color: #3c4043; gap: 16px; padding: 0 12px 0 16px; }", T + " a { color: inherit; text-decoration: none; }", T + " .logo { display: flex; align-items: center; gap: 4px; margin-right: 24px; } " + T + " .logo span { font: 22px \"Product Sans\", \"Google Sans\", Roboto, arial, sans-serif; color: #5f6368; }", T + " .lang { display: flex; align-items: center; gap: 8px; } " + T + " .arr { color: #5f6368; display: inline-flex; }", T + " select { height: 36px; border: 1px solid #dadce0; border-radius: 4px; background: #fff; padding: 0 8px; font: 500 14px \"Google Sans\", Roboto, arial, sans-serif; color: #1a73e8; outline: none; cursor: pointer; }", T + " .tabs { display: flex; height: 57px; } " + T + " .tabs a { display: inline-flex; align-items: center; padding: 0 16px; font: 500 14px \"Google Sans\", Roboto, arial, sans-serif; color: #5f6368; border-bottom: 3px solid transparent; }", T + " .tabs a.on { color: #1a73e8; border-bottom-color: #1a73e8; }", T + " .x { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; color: #5f6368; } " + T + " .x:hover { background: rgba(60,64,67,.08); }" ); if (l !== "2022") { css.push(T + " .tabs a { text-transform: uppercase; }"); } } const style = document.createElement("style"); style.id = "ugf-trw-styles"; style.textContent = css.join("\n"); (document.head || document.documentElement).appendChild(style); const bar = document.createElement("div"); bar.id = "ugf-trw"; bar.setAttribute("era", era); bar.innerHTML = trusted_policy.createHTML(h); document.body.appendChild(bar); // other languages, or the original: the page again, from Google's address for it // (anno=2 is Google's page untranslated, under the same bar) const reload = function() { const url = "https://translate.google.com/website?sl=" + encodeURIComponent(st.sl) + "&tl=" + encodeURIComponent(st.tl) + "&hl=en&client=webapp&u=" + encodeURIComponent(u) + (st.view === "from" ? "&anno=2" : ""); try { window.top.location.href = url; } catch (e) { window.open(url, "_top"); } }; const view = function(v) { if (v === st.view) { return; } st.view = v; bar.querySelectorAll("[data-v]").forEach(function(a) { a.classList.toggle("on", a.getAttribute("data-v") === v); }); reload(); }; bar.addEventListener("change", function(ev) { const s = ev.target; if (s.matches("select.sl")) { st.sl = s.value; reload(); } else if (s.matches("select.tl")) { st.tl = s.value; reload(); } else if (s.matches("input[name=v]")) { view(s.value); } }); bar.addEventListener("click", function(ev) { const a = ev.target.closest("[data-v]"); if (a) { ev.preventDefault(); view(a.getAttribute("data-v")); } }); } // ---- how Google Translate looked, period by period ------------------------------- function ugfTrCss(era) { const T = "#ugf-tr"; const early = [ T + ' { font: 13px arial, sans-serif; padding: 8px; }', T + ' a { color: #00c; }', T + ' .new { color: #f00; font-size: 11px; }', T + ' textarea, ' + T + ' select, ' + T + ' input { font: 13px arial, sans-serif; }', T + ' .io { display: flex; gap: 12px; align-items: flex-start; }', T + ' .src { width: 525px; height: 36px; resize: both; }', T + ' .res { flex: 1; min-width: 0; } ' + T + ' .res .rlab { font-weight: bold; margin-bottom: 4px; } ' + T + ' .res .rtext { white-space: pre-wrap; font-size: 15px; }', T + ' .tfoot { text-align: center; margin-top: 50px; }', // a document, translated T + ' .docres { margin: 12px 0 0 0; padding: 8px 9px; border: 1px solid #c9d7f1; }', T + ' .docres .dt { font-weight: bold; }', T + ' .weblink { color: #00c; text-decoration: underline; }' ]; const docs = [ T + ' .docres:empty { display: none; }', T + ' .dhead { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; margin-bottom: 12px; }', T + ' .dhead .dn { color: #676767; } ' + T + ' .dhead .dl { margin-left: auto; }', T + ' .dhead .vw.on { font-weight: bold; color: inherit !important; text-decoration: none; cursor: default; }', T + ' .dbody p { margin: 0 0 10px 0; white-space: pre-wrap; line-height: 1.4; }', T + ' .dpg { color: #676767; font-size: 11px; margin: 16px 0 6px 0; border-top: 1px solid #e5e5e5; padding-top: 4px; }', T + ' .dmsg.err { color: #c00; }' ]; const css = {}; // ---- 2006: the small logo, the blue "Translate" bar, language pairs css.t2006 = early.concat(docs, [ T + ' .thead { display: flex; align-items: flex-end; } ' + T + ' .thead img { display: block; }', T + ' .tbar { flex: 1; display: flex; justify-content: space-between; align-items: center; background: #e5ecf9; border-top: 1px solid #36c; padding: 2px 4px; margin-bottom: 14px; }', T + ' .tbar b { font-size: 19px; }', T + ' .tsec { margin: 24px 0 0 0; } ' + T + ' .tsh { font-weight: bold; font-size: 16px; padding: 0 9px 3px 9px; }', T + ' .tbox { border: 4px solid #e5ecf9; padding: 8px 8px 8px 8px; }', T + ' .tbox .io { margin: 4px 0 90px 0; } ' + T + ' .ctl { display: flex; gap: 3px; } ' + T + ' .ctl .pair { width: 440px; }', T + ' .tbox.row { display: flex; gap: 4px; } ' + T + ' .tbox.row .url { flex: 1; }' ]); // ---- 2007-2008: the BETA logo and its tabs css.t2008 = early.concat(docs, [ T + ' .tsh + .tbox .docfile { margin: 4px 0; }', T + ' .help { text-align: right; }', T + ' .thead { display: flex; align-items: flex-end; gap: 12px; margin-top: -4px; }', T + ' .ttabs { flex: 1; display: flex; gap: 0; background: #e5ecf9; border-bottom: 1px solid #36c; height: 30px; padding-left: 4px; align-items: flex-end; }', T + ' .ttabs a, ' + T + ' .ttabs span { padding: 6px 17px; font-weight: bold; } ' + T + ' .ttabs .on { background: #fff; border: 1px solid #36c; border-bottom-color: #fff; margin-bottom: -1px; }', T + ' .tsh { background: #e5ecf9; font-weight: bold; font-size: 17px; padding: 6px; margin: 46px 0 14px 0; }', T + ' .tsh + .tbox { padding: 0 3px; } ' + T + ' .tbox .io { margin: 4px 0 90px 0; }', T + ' .ctl { display: flex; align-items: center; gap: 5px; margin-top: 4px; } ' + T + ' .ctl select { width: 120px; } ' + T + ' .ctl .go, ' + T + ' .ctl .goweb { margin-left: 10px; }', T + ' .url.wide { width: 100%; }', T + ' .tfoot { border-top: 1px solid #ccc; padding-top: 12px; margin-top: 70px; }' ]); // ---- 2009-2010: "Google translate", a column of links, instant translation css.t2010 = [ T + ' { font: 13px arial, sans-serif; }', T + ' a { color: #00c; }', T + ' .thead { padding: 14px 8px 6px 8px; } ' + T + ' .thead img { display: block; }', T + ' .tbody { display: flex; padding: 8px; }', T + ' .tnav { width: 130px; flex: 0 0 130px; border-right: 1px solid #c9d7f1; display: flex; flex-direction: column; gap: 14px; padding-right: 8px; }', T + ' .tmain { padding-left: 18px; max-width: 540px; } ' + T + ' .tmain h2 { font-size: 16px; margin: 0 0 8px 0; } ' + T + ' .hint { margin-bottom: 8px; }', T + ' .src { width: 520px; height: 60px; font: 13px arial, sans-serif; border: 1px solid #aaa; }', T + ' .ctl { display: flex; justify-content: space-between; align-items: flex-start; width: 520px; } ' + T + ' .ctl td { padding: 2px 4px; } ' + T + ' .ctl select { width: 154px; font: 13px arial, sans-serif; }', T + ' .ctl .swap { display: block; width: 18px; height: 18px; background: url("' + ugfNtArt().tbuttons + '") -72px 0 no-repeat; margin-left: 4px; }', T + ' .thead { display: flex; justify-content: space-between; align-items: flex-start; } ' + T + ' .thead .lay { display: flex; gap: 2px; } ' + T + ' .thead .lay i { width: 18px; height: 18px; background: url("' + ugfNtArt().tbuttons + '") no-repeat; }', T + ' .ctl .go { font: bold 13px arial, sans-serif; padding: 2px 8px; margin-top: 4px; }', T + ' .resw { margin-top: 16px; } ' + T + ' .rh { font-weight: bold; color: #676767; font-size: 13px; margin-bottom: 6px; } ' + T + ' .res { white-space: pre-wrap; font-size: 16px; line-height: 1.4; }', T + ' .avail { margin-top: 56px; } ' + T + ' .avail .grid { display: grid; grid-template-columns: repeat(6, auto); gap: 1px 14px; margin-top: 18px; justify-content: start; grid-auto-flow: column; grid-template-rows: repeat(42, auto); }', T + ' .tfoot { text-align: center; margin-top: 50px; }', T + ' .docw { display: none; padding: 20px 0 22px 0; } ' + T + ' .hint .dx { display: none; }', T + '[mode=docs] .src, ' + T + '[mode=docs] .resw, ' + T + '[mode=docs] .avail, ' + T + '[mode=docs] .hint .tx { display: none !important; }', T + '[mode=docs] .docw { display: block; } ' + T + '[mode=docs] .hint .dx { display: inline; }', T + ' .docres { margin-top: 16px; } ' + T + ' .docres .dt { font-weight: bold; color: #676767; } ' + T + ' .dbody { font-size: 16px; }', T + ' .weblink { color: #00c; text-decoration: underline; }' ].concat(docs); // ---- 2011-2014: the grey header, the red "Translate", From / To buttons const kennedy = [ T + ' { font: 13px arial, sans-serif; color: #222; }', T + ' a { color: #15c; text-decoration: none; }', T + ' .khead { background: #f1f1f1; height: 71px; display: flex; align-items: center; padding: 0 28px; border-bottom: 1px solid #e5e5e5; }', T + ' .kbar { display: flex; align-items: center; gap: 16px; height: 58px; padding: 0 28px; border-bottom: 1px solid #ebebeb; }', T + ' .kbar .label { color: #dd4b39; font-size: 20px; width: 160px; }', T + ' .kb { display: inline-flex; align-items: center; gap: 4px; height: 29px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); background: linear-gradient(#f5f5f5, #f1f1f1); color: #444 !important; font: bold 11px arial, sans-serif; border-radius: 2px; cursor: pointer; }', T + ' .kb:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); } ' + T + ' .kb svg { fill: #777; } ' + T + ' .kb small { font-size: 9px; color: #777; }', T + ' .kb.on { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); border-color: #ccc; color: #222 !important; }', T + ' .kb.swap { width: 36px; justify-content: center; background: #fff; }', T + ' .blue { display: inline-flex; align-items: center; height: 29px; padding: 0 16px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff !important; font: bold 11px arial, sans-serif; }', T + ' .panes { display: flex; gap: 16px; padding: 12px 28px 0 28px; } ' + T + ' .pane { flex: 1 1 0; min-width: 0; }', T + ' .phead { height: 28px; }', T + ' .quick { display: flex; gap: 2px; } ' + T + ' .quick a { color: #444; font-weight: bold; font-size: 11px; padding: 3px 8px; border: 1px solid transparent; border-radius: 2px; }', T + ' .quick a.on { background: #eee; border-color: #ccc; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); color: #222; }', T + ' .srcw { position: relative; } ' + T + ' .src { width: 100%; height: 133px; border: 1px solid #ccc; border-top-color: #b9b9b9; padding: 6px 28px 6px 8px; font: 16px arial, sans-serif; resize: none; outline: none; }', T + ' .src:focus { border-color: #4d90fe; }', T + ' .clr { position: absolute; right: 8px; top: 4px; color: #999; font-size: 20px; }', T + ' .res { min-height: 133px; background: #f5f5f5; border: 1px solid #f5f5f5; padding: 6px 8px; font: 16px arial, sans-serif; white-space: pre-wrap; }', T + ' .rtools { padding: 4px 0; } ' + T + ' .rtools .listen { color: #777; display: inline-flex; }', T + ' .hint { color: #666; margin-top: 8px; }', T + ' .kfoot { position: fixed; left: 0; right: 0; bottom: 0; background: #f5f5f5; border-top: 1px solid #ebebeb; display: flex; align-items: center; height: 29px; padding: 0 28px; }', T + ' .kfoot a, ' + T + ' .kfoot b { margin-right: 26px; } ' + T + ' .kfoot .fr { margin-left: auto; display: flex; } ' + T + ' .kfoot b { color: #444; margin-right: 0; }', T + ' .lmenu { position: absolute; z-index: 20; background: #fff; border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 4px rgba(0,0,0,.2); padding: 8px 0; display: grid; grid-auto-flow: column; max-width: calc(100% - 32px); overflow: auto; }', T + ' .lmenu { max-height: 70vh; } ' + T + ' .lmenu a { color: #222; padding: 3px 18px 3px 12px; white-space: nowrap; } ' + T + ' .lmenu a:hover { background: #eee; } ' + T + ' .lmenu a.on { font-weight: bold; }', // a document to translate, in place of the text box T + ' .docw { display: none; } ' + T + ' .hint .dx { display: none; } ' + T + ' .kb.pick input { display: none; }', T + '[mode=docs] .srcw, ' + T + '[mode=docs] .hint .tx { display: none !important; } ' + T + '[mode=docs] .hint .dx { display: inline; }', T + '[mode=docs] .docw { display: flex; align-items: center; gap: 10px; height: 133px; padding: 0 12px; border: 1px solid #ccc; border-top-color: #b9b9b9; }', T + ' .docw .fname { color: #666; }', T + '[mode=docs] .pane + .pane .res, ' + T + '[mode=docs] .pane + .pane .rtools { visibility: hidden; }', T + ' .docres { margin: 16px 28px 70px 28px; font-size: 13px; } ' + T + ' .docres .dt { font-weight: bold; }', T + ' .dbody { font: 16px arial, sans-serif; } ' + T + ' .dhead .dl { font-weight: bold; }', T + ' .weblink { color: #15c !important; text-decoration: underline !important; }' ].concat(docs); css.t2012 = kennedy; // ---- 2015-2018: the flat logo, the language button groups, a counter css.t2015 = kennedy.concat([ T + ' .kbar .sp { flex: 1; } ' + T + ' .kbar .plain { color: #666; margin-right: 8px; }', T + ' .kbar .star { width: 36px; justify-content: center; margin-right: 0; }', T + ' .krow { display: flex; align-items: center; gap: 16px; padding: 14px 28px 0 28px; }', T + ' .grp { display: inline-flex; } ' + T + ' .grp .kb { border-radius: 0; margin-left: -1px; font-size: 13px; background: #f8f8f8; } ' + T + ' .grp .kb:first-child { border-radius: 2px 0 0 2px; margin-left: 0; } ' + T + ' .grp .kb:last-child { border-radius: 0 2px 2px 0; }', T + ' .grp .kb.arrow { width: 22px; justify-content: center; }', T + ' .krow .swap { margin-left: auto; }', T + ' .krow .grp.t { margin-right: 0; }', T + ' .phead { display: none; } ' + T + ' .panes { padding-top: 12px; }', T + ' .src { border-color: #4d90fe; height: 130px; }', T + ' .cnt { position: absolute; right: 10px; bottom: 8px; color: #777; font-size: 12px; }', T + ' .res { background: #f5f5f5; min-height: 130px; }', T + ' .kfoot { height: 48px; } ' + T + ' .kfoot a { color: #666; }' ]); // ---- 2019 on: Material, one card with tabs of languages css.t2019 = [ T + ' { font: 14px Roboto, arial, sans-serif; color: #202124; }', T + ' a { color: inherit; text-decoration: none; }', T + ' .mhead { display: flex; align-items: center; height: 64px; padding: 0 8px 0 12px; border-bottom: 1px solid #dadce0; gap: 8px; }', T + ' .mlogo { display: flex; align-items: center; gap: 4px; margin-left: 8px; } ' + T + ' .mlogo span { font: 22px "Product Sans", "Google Sans", Roboto, arial, sans-serif; color: #5f6368; }', T + ' .corner { margin-left: auto; display: flex; align-items: center; }', T + ' .mtypes { display: flex; gap: 8px; padding: 10px 12px; background: #fafafa; border-bottom: 1px solid #dadce0; }', T + ' .mtypes a { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 12px; border: 1px solid #dadce0; border-radius: 4px; color: #1967d2; font: 500 14px "Google Sans", Roboto, arial, sans-serif; background: #fff; }', T + ' .mtypes a.on { background: #e8f0fe; border-color: #d2e3fc; }', T + ' .mcard { border-bottom: 1px solid #dadce0; box-shadow: 0 1px 1px rgba(0,0,0,.1); }', T + ' .lrow { display: flex; align-items: center; height: 48px; border-bottom: 1px solid #dadce0; }', T + ' .ltabs { flex: 1 1 0; display: flex; align-items: stretch; height: 48px; min-width: 0; overflow: hidden; }', T + ' .ltabs a { display: inline-flex; align-items: center; padding: 0 16px; font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #5f6368; border-bottom: 2px solid transparent; letter-spacing: .25px; white-space: nowrap; }', T + ' .ltabs a.on { color: #1a73e8; border-bottom-color: #1a73e8; } ' + T + ' .ltabs a:hover { background: #f8f9fa; }', T + ' .ltabs .more { padding: 0 12px; margin-left: auto; color: #5f6368; }', T + ' .lrow .swap { margin: 0 12px; color: #5f6368; }', T + ' .panes { display: flex; } ' + T + ' .pane { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; min-height: 170px; } ' + T + ' .pane.out { border-left: 1px solid #dadce0; background: #fff; }', T + ' .srcw { position: relative; flex: 1; } ' + T + ' .src { width: 100%; min-height: 120px; border: 0; outline: none; resize: none; padding: 16px 56px 8px 24px; font: 24px Roboto, arial, sans-serif; color: #202124; background: transparent; }', T + ' .clr { position: absolute; right: 8px; top: 8px; }', T + ' .res { flex: 1; padding: 16px 24px 8px 24px; font: 24px Roboto, arial, sans-serif; white-space: pre-wrap; color: #202124; } ' + T + ' .res.empty:before { content: attr(data-ph); color: #5f6368; }', T + ' .ptools { display: flex; align-items: center; padding: 4px 12px 8px 12px; color: #5f6368; } ' + T + ' .ptools .sp { flex: 1; } ' + T + ' .cnt { margin-left: auto; font-size: 12px; color: #5f6368; padding-right: 12px; }', T + ' .fb { text-align: right; padding: 8px 12px; font-style: italic; font-size: 12px; color: #5f6368; }', T + ' .circles { display: flex; justify-content: center; gap: 62px; margin-top: 60px; } ' + T + ' .circles a { display: flex; flex-direction: column; align-items: center; gap: 10px; color: #5f6368; font-family: Roboto, arial, sans-serif; }', T + ' .circles span { display: flex; align-items: center; justify-content: center; width: 72px; height: 72px; border: 1px solid #dadce0; border-radius: 50%; }', T + ' .lmenu { position: absolute; z-index: 20; background: #fff; box-shadow: 0 1px 3px rgba(60,64,67,.3), 0 4px 8px 3px rgba(60,64,67,.15); padding: 8px 0; display: grid; grid-auto-flow: column; max-height: 60vh; overflow: auto; width: calc(100% - 32px); }', T + ' .lmenu a { display: flex; align-items: center; gap: 8px; padding: 8px 16px; color: #3c4043; white-space: nowrap; } ' + T + ' .lmenu a:hover { background: #f1f3f4; } ' + T + ' .lmenu a.on { color: #1a73e8; }', // Documents and Websites T + ' .mdoc, ' + T + ' .mweb { display: none; }', T + '[mode=docs] .panes, ' + T + '[mode=web] .panes { display: none; } ' + T + '[mode=docs] .mdoc { display: block; } ' + T + '[mode=web] .mweb { display: flex; }', T + ' .pickw { display: flex; flex-direction: column; align-items: center; padding: 40px 16px 36px 16px; }', T + ' .pickw .ph { font: 22px "Google Sans", Roboto, arial, sans-serif; color: #202124; } ' + T + ' .pickw .sub { color: #5f6368; margin: 8px 0 24px 0; }', T + ' .browse { display: inline-flex; align-items: center; height: 36px; padding: 0 24px; border: 1px solid #dadce0; border-radius: 4px; color: #1a73e8; font: 500 14px "Google Sans", Roboto, arial, sans-serif; cursor: pointer; } ' + T + ' .browse:hover { background: #f6fafe; } ' + T + ' .browse input { display: none; }', T + ' .chosen { display: none; align-items: center; gap: 16px; padding: 24px; } ' + T + '.hasfile .pickw { display: none; } ' + T + '.hasfile .chosen { display: flex; }', T + ' .chosen .fic { color: #1a73e8; display: inline-flex; } ' + T + ' .chosen .fn { flex: 1; display: flex; flex-direction: column; min-width: 0; }', T + ' .chosen .fname { font: 500 16px "Google Sans", Roboto, arial, sans-serif; color: #202124; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } ' + T + ' .chosen .fsize { color: #5f6368; font-size: 12px; }', T + ' .blue2, ' + T + ' .dhead .dl { display: inline-flex; align-items: center; height: 36px; padding: 0 24px; border-radius: 4px; background: #1a73e8; color: #fff !important; font: 500 14px "Google Sans", Roboto, arial, sans-serif; }', T + ' .mweb { align-items: center; gap: 8px; padding: 24px; } ' + T + ' .wurl { flex: 1; max-width: 600px; height: 48px; border: 1px solid #dadce0; border-radius: 4px; padding: 0 16px; font: 16px Roboto, arial, sans-serif; color: #202124; outline: none; } ' + T + ' .wurl:focus { border: 2px solid #1a73e8; padding: 0 15px; }', T + ' .mweb .goweb { color: #1a73e8; }', T + ' .docres { margin: 16px 12px; border: 1px solid #dadce0; border-radius: 8px; padding: 16px 24px; }', T + ' .dhead { align-items: center !important; } ' + T + ' .dhead .dt { font: 500 16px "Google Sans", Roboto, arial, sans-serif; color: #202124; } ' + T + ' .dhead .dn { color: #5f6368 !important; }', T + ' .dhead .dv a { color: #1a73e8; font: 500 14px "Google Sans", Roboto, arial, sans-serif; margin-right: 12px; padding: 6px 0; } ' + T + ' .dhead .dv a.vw.on { color: #1a73e8 !important; font-weight: 500; border-bottom: 2px solid #1a73e8; }', T + ' .dbody { font: 16px/1.5 Roboto, arial, sans-serif; color: #202124; } ' + T + ' .dpg { color: #5f6368 !important; border-top-color: #dadce0 !important; }', T + ' .dmsg { color: #5f6368; } ' + T + ' .weblink { color: #1a73e8 !important; text-decoration: underline !important; font-size: 18px; }' ].concat(docs); return css[era] || css.t2015; } // ---- end Gplex for Google News and Google Translate ---- // ---- Gplex for Google Calendar (4.2) --------------------------------------- // Like Gmail and Maps: Google's own Calendar keeps running underneath, hidden, and // Gplex draws the Calendar of the layout's period on top, with your events read // out of Google's page. Adding and editing events goes to Google's own editor. function ugfCalArt() { if (!ugfCalArt.c) { ugfCalArt.c = {"logoBeta":"data:image/gif;base64,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","logoSm":"data:image/gif;base64,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","fav2006":"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAAiAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAelJREFUeJx1kz9oFEEUxn/75zzuYsJanBe4UzQipxFBwUq0sNCACFp4VRoR7C0t7Exha6uFpEh1YJUmkCKFomAjYpMYMUQ9xeC5F3Rnd+fmxmJu/9zGfDAw78187/veG8YCKC8ITQ7DKDAbGaJVDEqiZYSjAgZSgQzQMkQv3bDshKx6Xxis3kduvmJf+OtYHxfRMjRxu6Pt5Mz+8QYAa6uTqhehuqPi/fU05yYba7ZNqz6gX2rxc5TL2wc4dOIKh6cCNqMzyP6O4ZUXhE57TjBS369/wMwgFrhF8oXa33T/ditTrx0ccGxyyOtPZDPIt4AMmTvS5+nN7EGW3g15sAKP56B9ugLAzCNTUMfCzA4Zppa/+orri0Paz3t83hHMnzMzvtgwpFjKMXUAW6uYZH34VabpOdw673G8VuH99h8cFXD5ic/ahkhJibppQcnsQEbcntnl2lmPODKqA6nGFPNk40BGJAvg7guL5sPvrG0ITtVLuCUnvSxERBGuo7JXmG1UaXoe4HFyOiCWcuQsBCp7yABu3uLVepd7l7w0fvbSR/YlOhb89h2YnthTwLLvrI59JDfuMlU5wK6IieW4qiW20ZWj4w4A3Opklqm26EkFE2BTgNfAyoVD/5uJrfllXbxbnPZ/0Wlb/wAGpALj26udjwAAAABJRU5ErkJggg==","fav2011":"data:image/x-icon;base64,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","logo2013":"data:image/png;base64,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","fav2014":["data:image/x-icon;base64,AAABAAIAEBAAAAAAIACrAQAAJgAAACAgAAAAACAAVAMAANEBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFySURBVHicpZE9TltREIW/c+YmfljJy5OCKLIBCwkWQBEUGigRC2ABWUWIRMNCsgA6REOeLEUp0iUIUfNTgQwGgR0TQfHsxCCbiGSaK82Z+c7MHQGUZfkBWONpsQZ8VFmWALeDbGN6FoD9ve/3qsfkpdnVbzvAuye6D+Kzgfl/bAaYN9D+D0DbwOE49WU9WH77+jHAUQJ2gZmHyvuVN6wuTfGiHmw2T8cBfhj4Mko5Pumy8engMXeArwa2RymbzVOOT37+DbCVJhsNOmdtOuete4plUjYBQPaqQA4URg4cgW1S/TkJWMyKHIDOeQvJCIGN5QoWgZz+AJKRjfBSAuYAsiJHQPeyDQpsQVQApYRtiOpVCDtAmksMXaBW5OCgd3WJHSiiP8EA4H7eYIE0o4X1ixZQDO/fu7rm5rqLwxCBw7/Hl1WtZgGcJSB/+LXP6hMozG3vV9+1aiaEJZAGpbmB5qj7pFqNyGo4JRTV2LaHmwGad2pISOEeCfoJAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADG0lEQVR4nMWWv09TURTHP+e0lUprS/mNSNq4kJgYB4nGMHQ0Lv4BJg4G4+5/4KKrfwETg4Obg04mdnAwOghNwITIZiARfwAtFNqCw7v3vdvXAq8S7UmavPa+c7+f+z3n3lvBRKlUugPMAxP821gH5orF4hsAdQY6ihcKBWZnZ5mcnKRarUZSOCVnwmgRBui48qmpKWKxGPl8nkqlEgkiQo6vpeGRcKytrdFoNFhdXQWIBNFNjtiHUql01OmF45LT6TSpVKrjpFFyisWiAMjV+5/+V/OFYx2Y0x6JYzTnFacMPQhVoNxDgCUFFnsNsNRDgMUzO3CvmOPujczfpi/FgRWgDiSiZl2/fJ7bNweYLqQYzCZ4++EnsN2teB1Y1vLCTB1Yjpr19MElnjwqcOvaAHu1ZreibqyUF2bq9iiO3AfVWpNX777z+PlXXr//cRaARYB4twDPXqz7z1fyybMAlCG4jHqxFT+7AL3YimUwJRient6u/d6mtvXr1CwRNWe3kMulyF/sZ3Rkn+SFLKiAKCKCiIAKgoIKKmIOXkFVQGs7EDgwlhzIkMzmThRXK+5M5qEYMVHUF1cPVq2gAVHzrsbHXYARgOMgvImNoF2lGiGLoN5vqCIaM9+9DxJDVVFVM66IxIb9ElgACwH45XAt98QlsNgCiPceqggSwKmCWPtNrl+WVoBRd8UW4mB7ywgbs3xxQNyb3HPAq7knggFSCyr44mZ8zAUYCtueHMggAvs7O0ZA/FrbRvMggp5ob7SQY8YhFBAdcgHG2woP9GUzIMpBZce3XHzxoARiBcU0Gu2Wizo5AoqMuwDDnQAA+jJpUKFe2UUUf+UiysuPNUpfNtisHplGM8KhPvB3jnUDQGXw2B5og0inUIT63l5bo23u4tgfbjRxLLfOeJ5ZzbZdcFwk0v2gSmO/1kWj2VUTgAR/QUcilaAFoj+JqNA8qBOt0cyuEIItG0QLwFgUAIB4sg8R4bDeiNJo4VW70bINt4D+qBCxvnOIKofN5mmNdtI0WxAcxQ+BjagAAJqIo4m4Y7n4l47oqeLfgDmAPxV+uaYIpmLLAAAAAElFTkSuQmCC","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,AAABAAIAEBAAAAAAIADWAQAAJgAAACAgAAAAACAAwgMAAPwBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAGdSURBVHicpZGxa5NRFMV/99zXfl8K+UyrECMKDkKsNEuLYJdEF4UsKs4lHRwER3FOBAf/E/8ERRANBVFx1D2IDoo0MS0msW3qEL9SNAlUL7zhnXPuuefdZwDNZrMONDhaNSqVygOllxQtLpYoLpb+Uo/BGwBWWnv3Arh8xOlpvRRQ/sdmgLKA7n8YdAV8mqa4dytPdSU7if4s4MMktrqSpXb9NBcvTDR4L+DVJPZ+7Sy9/t60gK8D8GwcU187xbf2z2nNAE/DiWKRfqdL/3v7AD1fmKVaznP7UYv6egHNxGTmj2MuTI7ckUSYm0XA1TiXEB+bB8BM3L2ZH6VYL3DmZERlOculcxnkYXSCY8ExdC0AqwBxLsGAwXaXx887PHmzBebcubHAxy+7tDb3sRCQhLkhOZitBmApjR7lEpDztrWNNAQfUhvA186Qzb6QC8kxF8jAbMmuPNxqA7nDm9n50WO3N0AucEeug/ebDNlvA+gEIPlztTNzGczF/s4euEax5eCGzMAslSYCNsb9T4giPI5QCJiPYks63Ayw8QsqIlW6eSVceQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAA4lJREFUeJzFlk9oHHUUxz/vzW52sztuNsnsJm0ICfaQU3sqCAa6Sg9tLRU9FKRFPESLiAcFr4IHvXkVRKiXgvRSqCe9SNl7D00CLSUaaEFW+oea3c1mk9kkHuY3s7N/0p0d1H2ngZn3+37e973f/H6CiXK5fAG4Dhzjv40KsFIqlX4B0NCLvuKLi4ssLy8zNzfH9vZ2JIUBOceMFt0AfSufn5/HsiwWFhao1+uRICLkBFra/aY7Njc3abVabGxsAESCGCZH/IdyuXzY74Ojkm3bJpvN9l00Sk6pVBIAOfn+3f9r+LqjAqzoiMQxmteVUBtGEKrA+ggB1hRYHTXA2ggBVv8VBz467/DZuzNxUtcUeAC4ccWvlCZ5+40CZ1+bwrGtYVJd4L6u3zjtAvfjiDu2xTtvFtlpHsRJf7B+47Tr/4pjzcHnl73fx72H1Tjpq9A+C4YGuFKa5NTSK9y+84RGPAfWwwBDDaJjW5x7fZrfHzf4qfwijjjAvTDAUA5cu1RkPGXx3a1KXHEwDiQAnKWlavPvKs2twdVcPZPnvQvHufnrUx7XxxjLpigWsiwcz5DJT5BOgIggIqCCoKCCipgfr6AqoM0atB2YSedzpCcmXyo+O5Hkg4tFHlWafPvzCxBBVBBznIgoGogrIoqoL2hA1IBpYjZwACgApPM5gB4nRBQBPrnk4Ewmebrp8tXVQiD86lwKgI/fygPC17eqnogPIxoIg4EWywH+6ADoB+GLg2BnLB5VdsmOW5w6kTHnqJBJe0aePDFuBGqBC4hvv4QcU1DLCTtQDFfsQ+xVtwAxjVK++PGJqQoQ9Z5V+PLyFBeXc3z6/TOe1Q8R9apGvZYgAkIgbt7PhAGmu/udzucQgd1arW0bfiXaMWgeEagoYnmuBJZLqBWqZg1AdDoMMNsNAJCayIEoe3VjqYjXEr8qNSD+nUYV9BCl13LxQY0binQModMPACCVs0EFt95AlGCoRDQYtG9u1/jhtx2eN0DNVhMNV00g7gEDKlNHzkAPhJ1FEdydncDGsAAiPG8c9hk0CVkuxhmvRb5mzy44KpJ2BlRp7TYDgMGD5ldNG6R9BS1EakEHRCaNqLC/5xJt0DwHvF3Tc/ftAIh8nUmkU4gIB24ryqB1Vx2Ojm24BWSiQlipMUSVg/39QYP2smW2oH0WfAj8FRUAQJMJNJkIWS7BoSM6UPxPYAXgH1bE3vqvdy1qAAAAAElFTkSuQmCC","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,AAABAAIAEBAAAAAAIADTAQAAJgAAACAgAAAAACAArwMAAPkBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAGaSURBVHicpZI7T5NxFMZ/5zkH37bD2wJaB90bDSw6EQXFwQu7cTAMLn4NIdEv4eoXYFLjIq9NjIkYBxWjbkRcNBZaA8WqOLTVtika9IzPeW7/iwFkWXYDWGB/swAsWpZlALtdtHJsEoA3r1/0sffAzSbnVx4CZ/eZ3p1lATP/KAaYEVD/D4N6AO+BUi96/EjC5XPjfcynqw3uPmsMGqwLePW3mLnpMkfLybDVywAeA1d60dX1HRbvfADgVKXA3HSZ2/c+DTN4IuDBn9KvXjzMo5XPe63vx8FKheZGneZmrW8jE4eKI5w+Ocb8rTXyo+OYC5MjdyQRhQMEcD5XSgFobtYwE4aBxPVLY7xda/Lu4w/k8dsghEkYuiBgCiBXSskXRzEZuCMXZ06kLFUbWERbFIHCMRdyB7OpACa6tZNSCnJaW1+4NlsEM5aef0UeSAIXUtsAGZhN2OzNRo2Bf9Da2ubb9g5y/WrTrW8yZB0D2AggHbzakUIec7Hb+t5JbYtxQ2Zg1qWmAqrD3ieSBM8lKALzzrmlXjFA9SdE51hBaYrqDAAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAA3ZJREFUeJzFlk1rG1cUhp/3jFxJliorjhzbCGM3UEILwQRCA7ZBlBBoCw10WUhWbnf9Ef0dgazSP9Buuim0KoRS40Iig7NwUUshpBDT1ra+Ysl2F3NnNFLG9iih1QHBzNx7z/uc9565GuGiWq1+CNwH5vlv4xmwXqlUvgWwyECs+NLSEqurq5TLZZrNZiKFc9bMOy2GAWIrX1hYwPM8FhcXaTQaiSASrAm1bHhkOOr1Or1ej52dHYBEEKOsUXBRrVZP4iactjifz5PL5WKTJllTqVQEoKt3N/+v5huOZ8C6jUkcp3nfiGzDGMIM2BojQM2Ax+MGqI0R4HGKERy4/V6By+XsmXPqT9t8s7GfNGUtBTwBusDEebMvl7PcvDF99qSf/wISAXSBbQFcvbv5CFhOsqqU92Kf37lV4uaNab689zu/1NtJUtW2HlxfTgU3SQF2G0exUCvLRX79o5VUHNzWB/8Fr9WIn6xdIJsxvt/8e5RlW1GA13oV16751Y/QfACPogCv7MDnH5SYnppgu57sWyESWwApgNKVK/udf/bp7J1voWTu7BaYuP3+HLms8eBhl8xUEWRIQvLHhYEJk9zBK8wE1jmAvgOzmWKBzNSFM8UtEHfJPl0rsDif5ruNfV9MhoXi5sNaIOhAzIFZai4KMANwGoSf2MKqcYk/WinS6hzz1Q8NZP4zzJB57t7/IQ8zw8zcuCF5pZcA4iCGLQ/Fr+V4560sG9tNnjdPkAzM61ct+eJmYdVIyFMwtxT2AHApWnGmWADgcH/PCTtWZ68EH69MAfD1w4b/zFks5DshJy5fGIFcT7jx2SjAxWHbM8UCErw4OACXVM6FlbezXH83x+aTFj/91kXmndJoikC77QkKkl2MAszFNV16qgAyDhsHfgL59t25VQTgx1rbt1zRqoURER+ouu+GobkoQCkOACBdyIOJbqOFDCTxxb1dLr2Z4nnrxDWULx5WHTgWVk0oLsm/N02f2gMvQeRzGKLbboc27rZO+pYrsH+wasJt8wEs7CeFmgHATLx0Pybyk2BG70VnhEYLqqYP0v8EnUm0BQMQkxlk4uiwS7JGc2+F/OuhGACYTQIAkMqkkcRxt5ek0YarjsbAa7gHTCaF8NJvIDOOj47Oa7Sz0uxB/yT8DPgzKQCATaSwiVTEcoVngexc8afAOsC/AADd38jKxzQAAAAASUVORK5CYII=","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,AAABAAIAEBAAAAAAIAC8AQAAJgAAACAgAAAAACAA1AMAAOIBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAGDSURBVHicpZG9ilNRFIW/tfbJjxO5XEFEsBGboEweYJqgjb6CjZ1PYeMIdnZ2lnYW1kFsxuuAWJhKRewstM5M4jgZJnItbm5IRoOMru4s1v7OOvsIoCiK+8A2p9M28EBFUQCUtdu92gPg86f3K+k1vtS7824HuH7K22u9MtD/x2GAvoHxfwDGBr6edG/3z3HtUuuvHvDNwMfl0M7jHvfuXuHyxeZab0kfDLxZ9DmY8ejpl9WOBzOePP+tZK23Bl7Wp8FwwmA4WUkMhhOevR6tA7xI57tdpntjpvuroWi0aXZKZCMbgMbZnM6FDo7ANmmjSQJutvMMgOn+CKkKI2MHOHBobgWOEqcKKnwrAVsA7TxDwNH38TwsFFEFU1RQB04lClVwaSsBm3XtVp6BY3GbUsI2ilhAHYHCYIG0qRsPJyMgX37/8Y9DZodHOAwROIzCFdTCmgNgLwHZydU2Ns6gMOXxTwhXLRwQwhJIdTQzsPun/0mtFtFu4ZSqXcxBS8MAu78AaIJWehVtgY0AAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAObSURBVHicxZe/bxtlGMc/z3Pn2LFdOz/OcUiIHKFWkYqAAakdUafC0pEBCYmq8Ad0ZENIdGVjq2in7gx0qoQHBiQGmkgUEojSoU2jKAEnduPYTspw73v31jnb14H6me7ee9/3+3m+z3Pv2YKJer3+EXAbeIP/N7aBG8B9AKnX6/bB0yTx5eVlFhcX2draYn19nUKhMFIhxZptYAFAncHEzJeWlvA8j1qtRrPZpNVqjQRIsSbS0v4n/bG5uUmv12NjYwMgFcSrrHFL8CJpwqDFxWJxYDlSrhEAeefTX19X8/XHNnBDxySO0bytGCvGFKrA2hgBVhV4OG6A1TECPHwlBz75YJprl0pD5wRFjy8+DDhfnUiz5aoPPAK6QCZpxvtvTXL18hQrywVmyhke/LIPHJyZd+1Sictvl7hQKzCZU3b2O/y10xkm3gV+9+0F8F7/jG+uv8m7K+cAeLLThnIiI3e/PM9MOcNR+5T9RofFXG6YsI1HQNcexYl90Gqf8MNPu9z89m9+/Hlv4E77jS737j/j46/+5I+t52nEwZTeHwZw6952dH2xNjirm989TivqxhrEH6NxvIq/uQDjeBXXwJQgWFk5aP97QLvxz8DZU+VJagt55maPmJjMAwIqgCAqiLmvVs5RW8gzE0yTD7IICiqoiDl4BVUBbR8CaHmpAlDNTZXIlafTsdvNxIhLKC6i8ZdFwntRK2hA1MxVf17UR0V9gArAIAgRDUWsuN1Y1Ih6iIZjlkBEzFj4XFVRVTBjIl4g4uGLeBGAhQCicoio3dLixFlbGLEuhK64AIi1X2LHUFAvCHtAPYA5N2ML0TlomFoTbYwVs8JRH4QWC45TqqG4CAiRuKiAaBXAF1GA2X7bc1MlROD48DCEEMcH9Zyspa/RYgC1WTsOSZSQzhoHFGD+TOGBbLkEonSah86vFomz0th+k5XbOC9ZLirRWMgg8wBy5esGqH4PfJYEAXDcbNFtPqdaVnabL4z9xnKnJLbDg4Kyd4STtQMkpkgqd4Dr1oG5QeIA2WIBRdhtHoX2u42Y0Gh7bWJAp4fUXocIc2EJwqgkS8eRKeZBld5xOwJAdESj2ayJQeJiVlyAYBQAQCafQ1Q46XSJT7RhjRY6IEL8FsXxEkA1DQCAn8siIpx2e2fe7YRG68/ajaoL0ADyaSG87ASiyunJyahGG7ZNA+Kv4efAs7QAAJrx0YzvWC7RWSA6UvwJ4V90/gMkF9mCEqQXlwAAAABJRU5ErkJggg==","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,AAABAAIAEBAAAAAAIAAUAgAAJgAAACAgAAAAACAAtAQAADoCAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAHbSURBVHicpZHNa1NREMV/M3Pty4c+nxhMSRf1C0IkVZcWoehCRdwoXbmo7rrqyvwBbaGLgggKrvoHiEt3igj2WRAFXalIVXBRFZVg6ktpUtsYF8krSYqL6sDAPXPPOTNzrwCEYTgJTLG9mAKmJQxDgGZczReGAFh8+6qL/Ze6yNDYi8fAqW12j2NegZF/FAOMKBD9h0GkwKfe6vj5zOY56xul0SyTYzmyvvVSPyvwJkal0SzP544zcXlwk3G7dJgTRwMODqS4O3Ok1+C1Ak9jVF1tcO3Guy5G/sBObt5Z4ursB/YGfb1TPHPAwxjN3S9vWXLx4wrjl3Jc/PGLWr3Bt6jRef3AZfJ56ssR9Z+VLmFfMgWqlKMmhf1pBgfSLH3fIL2vHzVDVXGpPhQ4mwh8Erv3ACCiLQc1CrkEJ4/t4sr1L1yY/komcJwpplBniDMEPeeAYYBE4CPA2krU1iuVWsvrUL9Hpg5JTxFrpaqByLADivHYXuCDWtvAUa4r955UuTWRBeDRyxrz73+j5kAFRIpyeqZaAYLO/ddXa2zU1lBTMEPbXUUNUUFFWwaw7AC/9+V3pJKIKc31Bpii2hJjgoqASEz1FVjY8neA8zws4aHOIWbtvbVTDLDwB/UlbVTRfTYcAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEe0lEQVR4nMWWXWibZRTHf+ckad4mr03Xpktq1g9KaaVY1LWI0EHmldWLgaIi4lCpk+GdN+KNILIpgmwXeie72QoyQfy6UNnFDEz0omV2LWtdZzeLddbNbmmSJWua1ov3TfomfZvGgfZAIOT5OL/nf/7PcyLYkUgkHgdOAK38t3ENGInH498AqGPANXlnZydDQ0PEYjEymUxNGbZZ02rnohLA9eRtbW14PB46OjpIp9M1QdSwppRLK0cqY25ujtXVVWZnZwFqgvg3a6T4JZFIrLtN2GqxaZoEg0HXTWtZE4/HBUD6D479X+arjGvAiO5QcuycJxRHGXYgVIHJHQS4oMDETgNc2EGACS81KjDQVc/eniAff3tj01jY9PDkvl30dQWp9yvj0yk+P3eTG+nCdttekP6DYz4gA/jcZhwaDtPXFaS7PQDAy0culW0cNj0cOdROLGKwsJgDIBYxyObWeP/kPONz2a2S54GgTp4azAMXK0cfvT/Ip2/3cmB/C00hH0vJvOsurz/TSixi8NX31zl8/AqHj1/h2Og89YbywvDuaqefnjw1mC8+xa4+mP0tw7HReV587zLZnLuce6IGS8l8WWnOTmVYWMzR3R4gbHq2ApgA8G4FcHYqw9mp2rrfXcYkbDSju76K52dSNIV8HHi4ofTbQFc9TaE6Ls/frmbEn6GKArXG6JkbtDT6OPRUjCeGmgFoCtWxlFzh6Mnfqy2dLAGEe3uXc7eWySVvbjk7Fg3Q0WpgBAPUFQqAgAqG6aU1EqTj3gCiHkBoj9YxfTWHGQ6TNQAVVMR+eAVVAc2lnApEjEZLwmoQpRABURB456UIg30mxz5Z5PSPtxERhh8I8MbzYT56LcJzH/yFqD1fBbXBRb1R4NeiB1oAjMYGjNAul3y6KbmosK+nnsE+k7GLGU7/dNtKpMp3Uyt8/UOa9qiPZx8JgnhQVVQVVBFVRDxhpwItxf0rlRDR8nYpiugaIkJ7pA6AxZurFqQqgiAqpHPW/5t7AmpLLiDWmKCg5QBlL0YRYmU5iVVrKHZtEUVkHUSZuGo9Tl0xP6KWxEWAB7v9ACwsrVu1F0rJ7ZJEnADNlbIbjQ2IwJ1UCpCSCqKAehARflkskDifJv6QyYevhjk3mQMRevb4GOg1mJnPc2YmbyW2TSjFA4k2OwGimwoP+EMNIMpKOuWwgKKybnlBlTdHb/FWFvbvDTB4X31p3vilOxz5LF1x6uIHFIk6AcJuAAD+BhNUePrdP4iElOsZS1KxXS0iHP0ixdEvMzzW76choCRm8vydBRGxDGeRWx4QW02VJidA1a7hN4MowvV01pLfrnNRVsS652em8xtGkw1PWJIXryDYftrtBGhxT70RPjMAqqzeyZUAsJ2vDmndJLeGys1czLltCcogAgaiQmElz8aL5pB2k9HsWyHW94ooA4jUAgDgNfyICGv51U1328Volad2Rtk1TAKBWiE8/jpElbVCwXFq3IxWbZskbLTjV4A/awUAUJ8X9Xkdkkup6VhvRdXkC8AIwD+tD0U7XkmkPQAAAABJRU5ErkJggg==","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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","data:image/x-icon;base64,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"],"fav2020":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABH0lEQVR42mN0aPsez/T/zwQGBkYBBhqC64/uoQsd+M/4N5GJ6f/fBlpbjgM4MP5nns/EwMCgwDBwwIGJYYDBqANYcEnsreKmqkV/9hqNRgH1HfD47S+G4L57DObVNxievP1F3TRACBy/9ZUhccZDhk/f/tImEeIDvVteMvRuecXAwMDAwMfFTJEjyIqCVcffM8gKszKsKVJi4Odkon8IeOjzMxT7iDHwcTHTrhzABxrDJEez4agDRh0wAtoDxAJtGU4GWWE2Bj5O5oFxwLxM+dE0QFkauPbbBauE6Uppqlq0bbYhhtj//4yNAxYC//8zNorvO9XANJCWD0gaQLacgYGBgek/w/8PA2U5AwMDA9M/hn+ODAwMDwbCcgYGBgYAlONWltps4XoAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB20lEQVR42u2WP0gbYRjGf/elKUkK19KIGZprS2lLwQhRcHGKVGiHjJ2VQpdu0mxtoTq0WySjEEpx9HAMIorB7dDJoX8gQyleEBSvpldiJPHydQiKrVow5u6WPOP7Dc/zfs/zvrxK6kNtXMjDHCg3cBHfNr//W1qVivNcCOlMuk1+DlKKDHwSwF38Q0rgM7oCrpz3sPL6WkeJDlcGuxZczIL/IVvYZnHDxq45qOEAfVqYTLoXLXrVfQETsya6UTlRafClfIBRqrL85j5qJOCeBbqxh25U0KJB5l/dY2umn6W3D9CiQUyrTr64624GFjdsADLpGMMPW1OSiId48bgHgM/mgbsW5MbjbP5scPtm8K+6Gm59+++a464ANRIgcYbHZasOQF885M8YHoXySfK69wKyhW1Mq04iHjrOhWcC8sVdsoUd1Ijg48s73i2io86zhZ1WOMe0tpZQ2wLe6VvkixZqRJAb03iaVL1ZxaZVZ2K2jFGqHi+jdjtvS4Bu7GGUqgD8qjV5Nn3q0GTt/SNvMmDvO9j7zqVH+EICMukYmXSsexN29iD52hg982Fo7lZHiRbyA6dqUipTvv2AlMpUrLg+Kfwk9yUDJ8kBhERW/CIHEE2aI8APP8gB/gDHhKHZ1k2fbAAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACJUlEQVR42u2WP2gTYRjGf3cxR5NAarliUXNYA8ahDio4xCn+KTh0q2YV0YJukm46tBnq1uDmEP/g2JCxSEESnDzopEMUQqnFOwqKR9tgeiHX67nE0LQWuZrLIfTZ7vmG5/2e73nfe4XUE/O26Gw9BeEoHuLz1+Xd1DtHsO+IomNPey2+D1KCE3glAsP4h5SIzzgs4Mh+B6VHka4KbZUu/mcO/A26YfG++hMARZZIJiK9K2CqsEq+bHRwiixRzJxGkSVvQzg7/4182SAaFpm4Osjk2DEUOYhmNHn4WvfegYK6DsDbx2fat00nBxidWUKt1tGNJjEXLrguoJiJs2HaHVYrskR/SKS2aXvvgCIHUQh2cJrRRDMsFDno6vb/1AW1TZt8+QeaYbHwsUY0LJK9daJ3bbhh2szOf29/JxMRRpS+3o3i/lCAYibOy/unSCcHUKt1bua+uM7BgR2IhgNcbg2fG+ejaEYTtVpnTl1j4tqgdw5U9AYLH2p7+N/FVPSGdw5UNJPRmSWioQCLibNEw4EdnWC1nkb0LgMjSghFDlIzbcZzy63BYzFVWKWgrgFwz4X9B8rAiwfD3H22QkVvMJ7rXDQnx4Zc/wtcF3Au1kcxE+d5yaCimwDEZIl0cqCdA8+7QJElsunjhzthdzaiT9b1Px5cmjvZVaE3+Qt7OMcRsr454DhCdqi8OC36Ke5LBnaKA4gOzrpf4gDiNttXgBU/xAF+AW1SvtSqaznJAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABdUlEQVR42u2Wv0tCURzFP+9WktlvQ5F80CRBQRQ02GTU6Fiu0tAfEG5NGtRmtTtEY83SprRJ7RY0VPSapIcV4QPteZuU6BclvveGPOM9wzn3nO/9oUR2jLiQr/ugDGMhLu+uPy6dSsVcE0KaSavFv0FEkV0HApjAOUQEDqNjoPs7IrfpaavQa26uU8HfKvgtNL1KOlsCIBH1oXpd9iaQzpY4LpQ5LpTR9Jq9FTSEHZmB54rZjH6wr8t+A5n8A5peJRH1M+QW9hpoDJ7q7SER9dlfwcruDQB7cdX+e6ARfSw8wkLIY6+Bdkbf0kWUzpZ4rpioo67mCQB4MupNvjgzwPrSmDUGNL0KQPHeoHhvfOILVy8oSOsMbK0Gmrt9j41DDU2vkYoFCIf6ratgSnX/zAfdTAd7/9lrCHC2Pdn5E7ZewUVt+Uti/mi8rUInmdlPa1IqKccSkFJJ+fPnSeGkuCMz8F4cQEjko1PiAKJOfRG4dUIc4A1c35KYrGO8IQAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACAElEQVR42u2Wv2sTcRjGP/eNCb0GrtYTJJjz11CECqmCYjtFqhD/ANuxFnRwk44ipDfULdhREBHHxI5BcKg4merkYBWDiJrDYvCIHiRXkl7OIXjUmgwt+fYo9B3fd3iee5/nfb6npO+5M8LfWATlIBLrw7fPW1svfcWbFcL35mWD96i04kceC+AE4VVaEHLtEzjQa7B8J95XoI3lc3tsA73KaXg4brvrTFMF2mBELoH8So1sYa3rbGIkztLcKbkErJ9NAEaTAwxt+drRpCpfgordAuD+dYMzyYHdP8PfrgfAsUPRcEy4aq2jqZ3VF0o1AAw9xvhIfPeuQFMjXLj7EafhBX1Dj7E0dxJDj8mTwGl4GHoUx/UYUgXmVAJzKoGhR6nYTW4/seRuQBuM8HrhNPlSjaspLbj5TErjysInSuU6r8p1JrYhx46ScHp8+J/AMfQYmZTW8UjFlSvB87cO76zeII7rySOQX6kx++Br1yQsleudMDJUeQSmLw4HYLniD1atdSy7RbbwnYrdxNCjgRTSTGheS5B9ukauWCVXrG6aCR7dOi4/B25OHiYzppErVrHsZvAG3JjUt50BOyLw1/WLM8n9f8L+PEbvW5e7Ds7nj/YV6NnDs//1fF8xQ9uA7yvmkRdv5kWY4KF4YDM4gPDxf4UFDiDatC8BX8IAB/gDQ4ywJknehTEAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB/ElEQVR42u2WPWgTcRiHn7uzIU0kMVxRgnf4MQQhglUQvUzRCnVwU84xKHZwrZsuvUE322wOEZ0rHUXikODUoJMZopihSi+L0CNy2qRccz0XE6q1StpcrkN/4/sfnvfj9753QvZROyd6nTwIh/BRH5eX/gy98QT3lih67ozf8G2UFTzpuQgcJzhlRQLWfgIHtnso3Y8OFNQpndsfweATsFsuj19+ZbG+OngP/E+m5XD7yTK1RhtVbvL24anhJWBaDjdmP2NaDplUlLmcMtwOdOG6liC/C/iOPFAor2BaDmklvGv4jjrwtGQB8OzuMSr1VUzLQZVDaKmo/wl0gWkl3DNgV6ocYmH6BKoc8m8Ei/UfANQaa9jtDoaexNCTqPJIz5h2y/WvA6a1/qvaERamT/aqvXkxwfXZJWqNNeYrTaYmxvw9RFrq4G+tjkUkro7HAGhYjn8jSKvhf15F39cwrYwCUHxvY26q1LQcitXvAEyOx/3zQCYVRdcSvKg0ufDgE5NnYsQjEsWqjd1y0bUEmT7Xse87kM8pxEclCuUVXlftXnzq8hj3rh0ezik29CR3JuTeVpxWwsQi0nC/hqoc6vvo7M1/wg/rV/76cH7+6EBBrwpnt8Q8TzAC64DnCcaR8rsZMUh4IB7YDAcQPbxvQcEBxA02LgFfgoAD/ASjE7z5V5DH1QAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABg0lEQVR42u2WvUvDQBjGn1xtsUbUElDQRlzMIg4KDulU0dFR7Vgc/AvcHKRd3KqOgoOzdS3FpeJkwc1BBQcRUxQKoTZgI7HpOdT61Q9ovm7pMx3vHTy/u+de7rjorh4ntHoAcCNwUXdPD/9LF5QzNwihZsJt8zaKctR3TABMgZ2iBIzVA+hrN5Hb5h01qubmexF0F0EraRUTO6cvHdfE5BBkiXcHoKybSOdLHddEJB4yXAIYDvqwHw831QuqgVSmCAAICwH3Ihga8CEmh/7UFNXA6l7dPLk2jojEe3sJU5kiFNXAuhzC5pLgbRcoqoF0vgRR8GNrZdT7NmzkLkuDELvM3jaAVvnpCKu7twVwef8GAJgR+y3v3hbA2bVW7/tpe2+GZYAb5d1S3zsHUNC/Igh6D6BVzO/xpOD3HqCsm2xew4ZEIYDnw9nen9CZCG4/lltOLJxMOGqUPZprqlHKJZmdAKVccuz8KkFYmjO5A7/NAYBQ0FdW5gBAaqgtAnhkYQ4AnzxdeRMrtuRKAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACGUlEQVR42u2WMWgTYRiGn/tjgiYSLBcSqg2KQxzUQcEhnaKxkxltHUUwg5s0m4NpwLpFHIUi4pjGMUgdWpw8dLJgFVIpYoLB4tH2IJeS9HIObY5gjXKYn3Pot/3fP7zv/37v994pqYetm8LeeQzKMSTWp69rv7Ze24p1SwjbmpENPqBSiu17JoBTeFcpgcd1QODQoIvFe6GhAu0sXjwYgbsR/KkM02Ju6Qfz2gYAY2qAG8kRppIj8gkYpsXE7Gdqetvp1fQOWrXJlmmRTUfkjmBh2aCmt4mrft7OnuHbk/MUJkcByJcbGKYll0BpT/bC1HHiagCAbDpCMrG7NW9Wm3IJ9EAHvTR8xCeXQM9oxco6K/Vtx5BatUlc9TOeCMk14XgiRGFylHy5wcSD1T5l/LyYPi0/B2p6m3ltc1fuoHBeXNM7zlpKVeB+ucFKvUUuEyOXiTqkrj9ao1hZJ5k46moMwm0GvHpvADjgPWNOZ2IArlVwRWCrZf3V6fW+gBo6gbgaIBz0YbSsfS/tnc+OHZbrgdy1KPlyg7vP65S0DeJqgIVlA8O0CAcFt11GsWsC2XQEo9WlWPmOVm2i0XTW8Omdk05QSf0a5jJRsldUPtS399bRxzmX0v8TgR6o29T7P39IPnau/vbiUunEUIFezl3Y17NtpeCZAratFGJL72aEl+CeeKAfHEDY2JtegQOILt3LwBcvwAF+AhZZzKchyRNHAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB/klEQVR42u2WP0gbYRjGf3dXQ6KQVq5UpHdYQusSO1TokE6p6OYoOoYWOrjGrS3FQHWLdasg6Nxqt1CkojgZ6KSDCmmxfyItSoNykESi59ch5ky0FtLmyzn4Tsf7fvA83/s+7/OdEh7NR1RxOA7KNSTGxvfN06klodiPVFXYw7LBz4mwIrRpFbiFexFWcTkuCVw5r7DwtKmmQIcLnZcjqG4EfwsrZzO5+Iu3yV0ADN3DQKiZ/lCzfALpTIG+sS+kM4Wy3AHJVJa5FYupwTa5I4gndkhnCgQNLx+e3+HHxF1mowFMvYG5VYt4YlsugVLbpwbb6DC8ADxob+JVxDyu78kjUGq736dh6p6Kmqk3OGesnC2HwFWfVhRh3q7QAEAylT0RaV4SAX+jRqi9aFCPX39jbWvfAY8ndpxzxqnu1HQLxiMGfWObrG3t0/PyUwU5gKDplbuGpu5hNhpgOZVlJrmLv1EjaPiON2Tb+ZZqRKbuYSBUNJ9ybwAY6r1RXyu2crZjTEO9LWe2QyqBdKZAz8hnx5iqvf0/j6BkSC9mfmLlbIKGl3fRQP0eI8BZxydd14n1t9b3NSwJcf7Z7apnXlMN/C/4xfghWT/o/mPh/pubNQV6P3nvTE4IJeZaB4RQYi2LH4dVN8Fd0UA5OIAqEHtugQOoRxw9BL66AQ7wGxgvuiJCAcHaAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACL0lEQVR42u2WPWgTcRjGf7kzIYmSGi80iHdUBV3SQQWHOMVE0SGjxM0gNKBbaTaH2oC4VbMHKh2b6lbEpcGpJ04ORiGISu+wUDwiwXyQNj0HQ2i+sM0HB9JnfN8Xnof/8378baGn1bhg7qbBdpIx4vPm187QW9PWuC8IZmNh3OR9ELKZ4gsBOIt1CAlYjCMBx/ol1h8dHynR7vqVIwsOZ0EvqIUymlEnFvS2xUuVBivvipQqDaZlF7cueUYv4HH2B5mcAdAmIKsWmV/dolRptGKK5ODl3DkUyTG8BZpR5+aTLy3yztzssg6YJKN+nsdlYkEvmlHnzrNvbaIGFjC7rJPXqyTCPhTJ3pUDSN9TSEYnuRv0ko7LJMI+NKNOJvdzeAETLpGlB1OkYqe7fFcLZQKKk9sdniejkwBsFMrD98DSw6me8bxeA+Dahe594XGLKJId9QACBh7DTaPeIusFudmAerPu/7sFEy7xQHWef9QNLCCgOAH4qNX69ogi2ftaNLQARXLgcYuohXLXvGfVv1sxePHEeG9BIixRqjaYX91CazabZtRZXNsGYCbiG+0t6Bbg482HElm1SFYtokh2NGOnuQv8TMvO0QqYifjantvjFnk1d57FtW02Cr/J6zUCspNY8BSJiDT6a5gI+3ounc4tefQnPNSH5NPOjZ6JqytnRkr0OnO5K2aatpRlL2CatpQ/935BsJLckh7YTw4gmJi/rCIHEPbYuw58t4Ic4A/Ems/0tWkBMAAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABbklEQVR42u2Wv0sCYRzGn3uvhDM4izuSKLGhP6CChjbToMXZNQoF2wS3CNKlua1BUGzLPyAsUNoOmlwscIjwjrajONAD83xbTd+j5a53uWf8fobn4f3+4BUSV/YxoeNrQFiGj3rtv82WnqjgnBBCnZLf5i5KCFSsEQCb4KcEAWcFARbcQOt8yVOjcWs3aIE3AZodCw8di8m03gAN7dObGZiVNXRQuDXQ7FiIKSEcbcu/+GXjA5W2CQDI7K94G0DrDVCoG9DN0RzTzRFOb/roGrZ/LSjUdejmCLmkymAGuoaNXFJFTFn0J8CGEsLjxRayKWWORSQR1Xwc5cyat3dgWrV8HHJYZLagehb3fwvksBjcgSBAEOD//wMsRSQRxfQqZIm9ltmUCmvo+BdADosopqOunHWqgxn4swUv34dMsHe37qnRfWVnrkapUOb2ApQK5Wj7uUR4mnOZgWlzACAU9IuXOQCQCSYHAN55mAPADxmdd7QupFXbAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB8ElEQVR42u2WP2gTYRjGf3cxRXNwKFdS/HMggrc4iIKIN8XWQdBVHUuF7GI3C9oMuh12U8ggjq26HaJIgpMFpw5W0UG0OZSGHtVDe5L08rmYI/YaG8ldbsk7Pu/we/i+53v4pMIdf1IWm3Mg7SXBebfycav0UkjBlCyLYDZpeJcpSCLzQAYOk94UZFKeoYFd3RaVG0qsoM3KyeEVJGvAcZs4bjO+DGydmtvg2kMHgCfXj4T68yWPm4++UnMboVacGKV0aX98BsrVNSy7jrcRoGsjf5mauv8ZANNQUHMZni15lCtrAD2Z2NHArYUvlKsuai56W5Zd/wM6QHFCC02dnnnP/Kt1pi/kUXOZ/jLwxvmFaSi8mDka2enaCKahhPC2pmtZPD/A84P+T2D64himoXTZ5YF8RP/utwBQ92T6fwXd4P8Kq7cRcEzfvePxJ9ID7VwUx0cHX0SWvcrC4jq6luXymX2DNWDZq1h2HV3L8rijJ2Irol6eahve2RWJGqi5Da7eW2HZ8TENhbuTh/4L3rcBy66z7PgACAirurOSzx9Xk78CgMUPPyPalR6CKI3f/iEG8yHJDj8k22fgbfPctotT8wdjBT0tn4hoQkil1E5ACKk0Vn09K6cJTyUDnXAAWSC+pQUHkFu0zgKf0oAD/Aag+rShJtqb+wAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACN0lEQVR42u2WT2iScRjHP+/7pkwNa7wyqZRFMAm8rKBAT2ZFO3gLvI4iYbdq3tpg82C3xW4dhIVHreOIwVA69VKnguyPRFR7KaqJIXOOOfd20ElON6y97r34PT7PC98vz/f7e95HCNyvjIva1jwIx+kh3n39tLv0TBNqN0RRq832mnwPBARNeiQCpzEOARGD0RdwZK9G5p5NV6KtzPm+Bf9mQSco+TKl9RrXRu1t9ZRSBOCYReLWZRm3bNZPQGm9xtziDxLZAm7Z3CJgJv2NRLbQ8n0iu8rCxDBju4T+lwVv1ApX4x/bSADSSrEhysSTyTO8iJ8lGnICcCep6pOBmfR3VgqbRIKOtp7dIuH32IiFT+L32HDLJqKhIbwuC6VKDbWweXAL3LKZ6KQTv8dGIrva0hsbte87ZrtFOriA+XFXV6NUC9W6/5lf5NQKkaADu1XS9xXsh9vJFZR8GQCva4BY+MTh7oEdO9yyiZy6oV8Iu0Uk6GBhYpjlqRF8HhtppcjS61LvBex43wyeVSLsG6wvqA9rvRVw8+EXLk6953nD++biqtSaYnoqwOseAOBuUkXJl1ELVZR8mbnFnwD4PEd7+woiQQdLr0rk1A2uP2g9OqOh+u7QVUA0NNSyXOxWieXpEVJKkceNn5FLNhP2DXZFDiAE42va4Rwkpv5B0jkDb6tXOjYupE7pSvQ0ca6tpmlCzLAJaJoQc2ZfzopGkhuSgb/JAUQN7bdR5ADiNtuXgM9GkAP8ASk0yIbEtxW8AAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABqklEQVR42u2WPUgjURSFvxk1IEIwzGIwOrBYaOkPLKJVFEGLlGvasIhgbTotdArtRuy2UNh6B8thYYuI3aCVoKhsoZIIYnCIBjQQTZ6dBGOc6E4yCDnlfYc539x33+NJ4dVcTBaP6yC1U0MdJ09flnaEVPghy6KwXOvwCgpLoumXDHzFO4VlPFYDoLnSQmKhzdWgx8RQYwv+H8D6d8ff/eybnpSdx7Ayjj7HGShV9r6Abl6xsW2jKj4mB/wVvbqZxrAyjr6qAQ4vcsz8TJKy844fM6wMhpVxdwuWjEtSdp7Z8S+OrdfNNKrS4i6AqvjYmu9Bi3a+6dPNNCk7TzwSdBdgPdbNaG9bVYMXHQkQHQnU/xh+XzsDIB7pqP89oJtXz61XFV99AUoH7yN/X/U9UEmbiWsAbnNFhhdPyuCGF0/QoiGm+v21AUDi3cfOVQBtOoQ2HSqrh+YOUBUfuyt9n/g98JrikQ78rU2u+T4AEHTV13iQADQfPUy8uvDtd5erQX82BstqQkiaZx0QQtKC23vLspfhnsxAaTiALBA3XoUDyEWKY8C5F+EAT2lXm5pagT61AAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACI0lEQVR42u2WPWgTcRjGf7mYcCZ6qAkEMWelYBCJEAWHZorWIUNXXUWx0LG0mw5th7oF3BQClY6NdgtCkQSnHDoptAo3iCZHhZAjTeR6JR89h0po8yFqc5xCn/F9uHve//N+/P+uxGPzrmC1noDrFDbiU/Fzd+iN5WrfEwSrPW+3+AAkXJb7uQBcwDkkBBzGUQLHBhG5h/6hCrVy145K8J/1QDdKeoPpZQ2A1ZnRTvz+069saGbfb1ZnRgkHvIdPIJ2vkMqWqW+3kbt+WNKblPQmcsBjjwNzmU3SeR3J179aG5pJPOLn5T5XhtoD69oO8Yif148u9nD17TYAJ4+77euB2YkQ8Yh/wOl3AIjKIopqsK6ZnD/j5bIs9pTqrxMYJA5Q++lARtkilS0f4BZun2VyPGjvGIaDXuSAh5rZYnYixNLUCJM390TnXnyjoBrDG8N+iIZF3i5eoqQ3OpYnYxKSTyCVLbP2vvZLB4e2iLrrHY+cAKCoN+0tQUapMr2soemNvvx3s21vAgXVIKNUSef1A/EVpQrAnbHT9vbAg/HgXgK5CsVKg6gsUlANFNVADngYi/jtdSAaFlmaGkEOeFj7UCeVLaOoRmcz/s4u+CMHNp9d6YklYxLJmNQZOcnnJhoWh38bHmZh/dvvgY/NW32J6yvnhir0Kn21J2ZZrgXHHLAs10Io/25ecFLckR7YLw4gWFhbTokDCLvs3gC+OCEO8AMLAcBQWMuQsAAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACJElEQVR42u2WP2gTYRjGf3fXBpPAmXJikCYoQbvYQQXBZIpFcOlo4xhEHJyEdLODjaBbaDeHIuLYmDFoSmlxO3AyUBQyFGkC0sIRe9iLXHs9Bw1JzR9PcvGWPHDLvR/f7+X5nu/lE5LPG2nRPloGIcQQ9Xln+89f723BuieKtrU4bHgPJQVbeiUCF/BOSRGPNWpgrFdh43HQVdDRxrXREQzegFo5YO2j3re+VfvhTgbapRsWueIuK5saUcXH7Styx5pccZdccY+o4mN94SJyQHKnga1ag/svdqhqZs81Lfg4S+mIY7ijI3iS/0pVM3kwc+av8EImRmIq6G4GooqPQiZGNnWuo1bVzBPwqOJzbw40tZyO9LF+D4D52TA17RC1csBpv9Q1IwOFsF/qZb/EqlpHrRyccO3lw/NMR04Nbw7ohkVVM9EbFjXNZCkdoZCJkYpPUNVM7uS20Q1reA7sN1qbt59/YiqIbliUyjqlsk4qPjHcSRhVfB3ha2ag39UduIGo4kMOSOwbVofVzTw4uRUDOXD3Rgi9YfHode1XHgyLvFonr9aRAyJxBzNhoFswPxumVNZZ+/216+ncpCMHxv4NeBbZ3xqzckBifeES78o6b9Q6AJcjfuYSIaYjfkd7CjPPvtv/50EyPnqQdM/Ap8NbXQvXVyddBb1dudrxz7aFrGcO2LaQDW9+WBS9hHuSgXY4gGhjf/MKDiAec3wT+OIFHOAn4h/cPp8lgs4AAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABp0lEQVR42u2WvUtCURjGf/eWEQpWOETlhQhyiYiCBp0MGhpac436C6K2GtKGtqCtwCEak9oiglCaCtqCPsAh+hADSQopjfJ6GkLpw0tXvXoJfMf3nMPznOd5z/seybucmZRFdhWkVqoYl7dXP1OHQlKnZFmo/mqDa4RXEg0bMtCNeeGVMTnqBBq1FsLzNkOBsuGhugX/rAZ+xl3yjZnNGAA7sz0ATK/dcB7LaJ4J+DoZG7BXTiAYeWBlN0EqraI4mgp5u7VBg+w7AKm0WrkCi6E4wUgSu/W3W6uTzqJkF0P3KA7Ln7fXVQNnsVc8LhsHC726bFrZTaA4LGzP9mgqVJICc+PteFz6ekLepqWJjm9WVaSAXvDzuwyh40cUhwWfu632zzAYSRYUM6UP7J+mAHC7bLUncBx9IZVW6VOadXtvKIGj6PNnvfSWPsAMIZBvPM4Sb28ggTcAWnS8+6oOo3IUaCxlc3y9v2g+P5zq/4Gy/gMX76NFF4a3ugwF2gsO/soJIQVMU0AIKdAeOfHLZoKbUgNfwQFkgXgyCxxAzpEbAa7NAAf4AO/Di5iwh+rbAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACOElEQVR42u2WMWgTcRTGf3cxwRhJDVeUogcSMItDquCQTDG1tIOr6VhEs9e4iWADtlugm0MHydiYMWhAGpxy4NRCqxBFpAlIiiHt0SSl9noOmuj1ErQk11vytnvv4Pve+773+AuRxdasqB8ugXABC+Pj1pfjqXe6oN0XRV2btxq8R0QE3fFSBK5iX0REbI4hgTO9CqtPPAMFOly9OZTgZBJ0C6XUQG1qTI17Tfn8mspuS2PE7eDhhIQsuQZHQG1qpHJVlgs1ZMllIJDKVUnltg3/Lxe+k7w3RnxitH8CG5UWD15sUa4dmGrl2kEHPJvwI0suiqU9HqUrpHLbzIR8eM85+vPAs8w3yrUD4lFzN5vlfQCmgl7CAQ+y5GQm5CMW8qG2NDYq+/2bUJZcZBN+krExU63d3cixLtWmNjgTLs1e6Vlrd51R6oQDHsKB87xZ3yW/riJLTsIBz2C3oFtkE34mFz4zl678mYzbQTbhP507kMpVUZsa4YCHWMiHLDlRW5ppMyyZQEapk1F2iIV8Bqnm0pWOLLGQz7oJ5NdUABPIdPDXnSiWGtZK0N4CtWV0/fFvywhcl892bsXm751XSo2O/pZvQTw6SqZYZ7Oyz+TzT0YZxr3/1P/EBB7fvYjXbTw6b59eY0Wp80qpd2SZDv4fOIAQXdjTT+dB4hw+SLp74MOPO10Lt1YuDxTo9fINU07XhaRtE9B1IXmp8H5etBPcFg/8DQ4g6ug7doEDiEcc3Qa+2gEO8BMSidYHadDDogAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACPklEQVR42u2WP2gTYRjGf7k2oTGSVK40WHMgDlkqGAWHdKpVaIfbbLOGItnV21zSOLil7aaQgnRscAyiQ4KTAScFq9DBP71AaMlRe7SJXHs5hzbFJA1Wc/GWPOP73vE8vN/zvN/nmnxSiwvW4TK4hukhPm9+aS29sVzmvCBY5kKvyTtg0mUNPBeAyziHSQGH0Rcw2KmRf+Szlegwf6N/BH93BKehuLGPXjWZjvib6qpmsJLX2K2ZBLwDzET8RMM++wToVZN0botMQUMSPU0CMoUKyWy56ftMoYIij6LIwe4FfCzVuPd0E1Uz2nqqZpDMlvGfE1DkIDPXAqiawYNVlXRuG0n0EIte6M4DyWwZVTNITI209VbyFQAez42RmBpBEt1MhH0sxSUA1oo73ZtQEj28eHiFVOxiW2+3VgcgJHpa/nGfeKZrAcvxEBMdDBXwCsdEe031knbwf2I4HQkcmS6vkS3usF76yev3OvdXSwD4vQP2xrAVE2Efihwknds6IW3UVc3gqjTUWwEAijxKLDrMqw86etUkGj5PcWOPtxv7f0yALQIaRm2kRNUMZnPbSKL7TMvI1lWsagazi1+PJxNEaklHzybQiNz8s+/oVRNFDp5p/LYJWFdr3F08enSm5sZI3BZ7cxkp8uip0RqXvKRiY4yHhjruDJsEdL5cElPiP02v/yAZ/HRw59TGzbVLthK9zFxvq1mWK+XYBCzLlQoW3i0ITpI74oHfyQEEC+uHU+QAQp36LeCbE+QAvwACrcoZiREYiAAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACjUlEQVR42u2WQUhTcRzHP3tr4jZ4GU9a2h6FhyUpSEEHPZlLENoxvYrgoKO1WxfdYd1mHgOhsJvLWyO8KJ1cdvIyiyFSvUex4LF8tPfG5tvrUD20Taw2GYHf4//3+/+/X36/7+/H3zX80JwU7P0FcHVwgnj7cff3o1e2y5oSBNuaO2nyIzDsst1PBeAyrcOwQItxKuDMUYG1B/6mEu2vXT9twX/mgYPI5IosZwooWpn+oJfpsIQstR3KSabzrG7piD43YwMi0XBncwQk03mS6S8AiD7BEbMS66E/2A7AbOoTi+sasuRBNy1mn38mq5ZYmAw21gLdsJyHNxNXeDffR3y8C920SL7IA5DKFFhc14hFAmwmetlM9BId6SSVKbCRKzYmYM+0GAr5iY93OyWPhjuRJQ/bagmA1S0dWfIQi5x37sUnuhB9blKZQmMtkKU2nty9VEdY1Sm/olW4GvTW5IwNiGQarcBRhtQNi76fArKqSb/cXpN31iugaOXmCtANi5klFdEnMH2My0Wfu/l7YOaZiqKVid2+4HhC9LlRtEpNrqJVEL3u5uwB3bCYevyBTK5ILBIgGpacWF+wnaxq1tzJKqW6rfnrCihamdHEDplckfh49yG3AwyF/GSV0qGRW93SyaomE4PnGquAbliMJnbQjR/jqJv7JNN5Jx6LBJyZv7ekMjHYgW5UWX5dQJY8DIb8jQnYMy10wwJgI1esWSyxSADR52blfg935nedjTkU8vNoMlizruvBNZL4ZjfrP/DLjLLkqfMf8Py7Cf8U9YhP/wPHmnC7cqtu4MbyxaYSvVy8VnNm2654yypg2654YP3NnNBK8pZ44CA5gGBjf20VOYBQpXoTeN8KcoDv7l8JuauTMrAAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACHklEQVR42u2WP2gTYRjGf3dnJE0gWiLt4B1KwAy2IAoOyRSrgkM2pWsUdHBSk01E2qFuqdkrSt0S61ZEhRQnD5w6+AeCVPECQugRPUwiZy/nYHrY/MFILrklz3Tf833wPPe+7/fwCYl7jZRo7+RAOMgQ8eHLVjv1yhasK6JoWwvDFu+BhGBLj0TgKN4hIeIxxgb29doo3g66KrRTPDVuwf+1oB0FtcrrUg2AAxMSV8+GUcL7u559vmkQCkjEo0F3DFxc3kJtie8ir1ZZy0SYlf0Op+kmN1fLqKUa8WiQeDoyeAsKahW1VGNG9rOWjvDyzjHmY5MYDYtbq2XnnFqqcX7pY4fRgQ3k1SoA9y8rxKNBZmU/uZRMKCDxTmtQ1k2nSmBzbe6QuzOQSylourmn1H/mQMSoW856Rvbz8PoRAFY2tt0zoIR9KGFfB/+90QRAbg3i03SEUEBCa1VkqNewoFYx6hbzsUmHCwWk0eSApptk1ysAZJJTow0iTTe5tPwJTTfJJKd75sBQDLSLu/H3fQfRi02DG4/LGHXLVfG+DDwobnP3yVen5/FocE/YyGHfQK34p4G35Z/Od3a9QpZKW07IKLEhGrhwItQ1B3ZxXJloCyiJTHKq76oIc0s/7NE8SHzjB0n3GXj/61zXjdP5w64KPVs52cHZtrDoWQVsW1ic3nizIHop7skM/C0OINrY37wSBxCbNM8An70QB/gN5mjEI42T+CIAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACeklEQVR42u2WQUgUYRiGn51tF3VhrWZpiXbaCPKQBhZ00JNZUIc9mlfJWNhu0t4izL10W/FmsLDi0anjEhEonRroFrgFBho7g6I4rU3sjoyO00FbXHdNY1a2g+/p5/v+mff9v/f7fn5P30tzSHC2J8BzlhPE18LiwdAHx2M/EgTHHjtp8kPQ53G8UwJwheahT6DJOBVw5rDE7LNAQ4m2Z2+dWvBvFuyHUbZRFkoUflhcPu/nutSCJPqr9igLJVTd4qdp0xVppacj0BgBqm4xML6EqltV8YmhCIM95wBI51ZJ59aq8vG7IVIPL7q3YGRaQ9Ut4v0hsoko8f4QAKPyCkbZRlaKpHNrSKKPbCJKNhFFEn1kZtdJ51bdVUDVLZSFEr0dAVKDu6d50B0EHDJzOh+/lZhRigC8eXq1YkuwzcvA+CLz6qY7AZLo5/3za7S3Vhcq2OatrKcSUea1zaqekEQfAL9M230PdEVaamL5vZNFRD/BNi+9BxpO07cA6KzzresxVHWLd58NJNFXVxxQseV+d3vjBQxPFgBIxsJ185m5dWSlyGDPuZrKuBJglG1GplXymkkyFq6M4H7ISpEX8gqS6CMZu9C4i0jVLYYnC+Q1k3h/qO7P/9wFkuirmgjXAuY1k8eTBVTdIhkL15AbZZvR18vIygadkRayT6LHJj+WgIHxJYyyjST6UXWLkWmtkuvtCJBXTWRlY7frpdaaG3FiKOJOgFG2KzaoivXXvfJe9zdUwPKrG0eW8SiS0yfZ//0g+bJ1r27i9sylhhK9zdysiTmOJ9W0CjiOJxWe+zQmNJO8KT2wnxxAcHA2mkUOIOywcwf43gxygN+qBPa0Cz03OwAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsUlEQVR42u2WP0wTcRTHP73aBlpTlGto1J4YEhnExD+JA0xYHBi6CayNSBPckG7GIB10o7IxNMF0FBiJISY0TjZxkgQ0wQRMrwkROTEX25KD4xwKZ6+FGNqSLrzlLr939/t+33vf9/Js3a/yIcHYmwTbBU7RvqbXSo8+GDb9kSAY+vhpgx9j3TbD/kYArlE/6xaos50ROHecY/GZu6ZAe4t3z0pwshIUm5rTSa1mSf/SuNrs5IbUgCQ6Ld+kVrMsZ/IAdLWfp8PfUBsCsqLRF1tHVjTL+WTIz0DnRQAm5n8wMb9p8Yd7vET7L1VfgpFEBlnRCAe8TA+3Eg54ARib2UDN6cyktpmY36TD38D0cCtzo21IooP44hYLS2p1GZAVjdRqlq52N9GBQjS9tz2AQTyp8PFbFlnRCuBPWs2yvA5J9MXWWPis0nvLUzkBSXTy/vl1mhqtifK47OZ7JOgjEvRZ/LaDZ+l/FWng5hFiWpF3APAfIUQ1pzM2u4HHJTDU461NF5SWZWFJRRIdFnKyovEwtmYRaWmn1ITA4FTaTH2xNTXaiQRbAJhJbTOSyACYnVL1IFJzOiMJmZVMnkjQV3axx2U39TA32obHZS9rzYozICsag1NpVjJ5wgGvGelh3WVFsxCSRCdNjULZ7KiIwHImz+OpNLKiHUTYUjInZGRlF7/opKvdbRKWlV0k0VE9gb7YOmpORxKdyIpm1rYwct0MBby8mN3gaSJj9vzhABrobK6egJrT/0WVKk/pZMiPmt8nnvxJPLl1oAeBaP9lwj3ifwnYAi//GLXYB9ScznJmx5wdxcOqsA84atOGx5nHZTc1cLYTnmgh+bL74EjHvbdXagr0Ln6n7MwwbNG6ZcAwbFFf8tO4UE/wumigGBxAMDB+1wscQNhn/z7wvR7gAH8B/IoN5NQ54xQAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACR0lEQVR42u2WT2iScRjHP+9rypzhWooSaUWQh1j0Bwr0ZNJhB2+J19FC6DjyVjHmpdtkN4NBsWNGtxERbHSa0C3ICoMM35dFg7cNQY13c28XfdO9GvmPl8Dn+Pwe+H5/z/f7PDxC+HFtTtQOVkA4wQjjU+nr0dRbTajfEUWtvjRq8C4RFjTLMxE4h3kRFjE5xgSOdXvYeOAYKtDBxrWxBL1J0Brlap1coULpp8qZkzYu+ifwu2xd62VlHwCfyzo4AUlRiaWLSIrall+Z8xEPThvqs7ldFtZkALafXBpcgoU1GUlRSUTcPL13lkTEDcBi9jvlat1Adnl9Z3gSSIpKrlAhFHCQip8CYPaKE9BY3VTY+lJh9rJTr19e30FSVJyTFgO5vgj4XTbePLrAlL29Uc5JS0ey2dwu8eC0TnwoUzDjMxouL/1qmOxPPpYu4ndZSUY9ox1DSVF5/b6M32VlxjfRaP0PJEUlGfX+dTqGQmA+UwIgGfW2GS8UcHSciqHsgeYuWHyxTV6ukYx6dbCm65NRrz7/rfvAaRc7eqYnApKiMp8pkZdrJCJuXeem8QBupw0XDzcefiYZ9ejd6ovAB7nG3UxJ17jVZFN2S0fTZXN7jXoPwcDxwSSIpYuUq3X8LhuSoupbDiAUcHT83VahohMe2APNhSIpKlJONbz3Y7yeCPzLPj8aL++fH59k/9FB8nH/VseH689PDxXo1epVQ07ThJRpHdA0IeXdfLckmgluigdawQFEDW3PLHAA8ZDDm8A3M8ABfgM5e/KpBI0oKQAAAABJRU5ErkJggg==","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACpUlEQVR42u2WMUwTcRjFf22lodQUsY0NsWccpBrBoCYmthOiAwMbiCOByE7CpkbBRDcqGyQdDKN1JQY1ECcuOknSalKTor2LRMOBXHK95uR6DrQNtRACV9KFN35f/ve+//veuztH13N90GltTYHjFEeIr9nM/6UPlsMccjotc/yoyfdAl8NyvXQC56kfupzUGccDnNirsfDAW1OirYXrxys42Ap2Qs2ZiGmN7LrBudNuLguNCH53RV/VC7ueDfkb7A0gKQb9sRUkxaioTw2GGIi0ADA594v4olJ1VvC7+fjsor0BRmdlJMVgpDtAJOxFTGvEF9d4nFilp9OHr8lFUs4DMNZ7puKsz+OytwJJMRDTGtGwl4mBVgB6rvoAi/iiwtI3jZ5OH2quQLvQyFhvsLYeEPxu3j1qo9lT6VVfU+XNpHWDSJv3aEzYEWqsqqWkfNFg7m0D5kxU3aQvliEl52n2uIiEvTy921o1rO0YSorB/LKK4G+gI9TIpm4CIKY1UrJONOwFLBLiBkMzP2oTw50Yns4WDRescPr8sspId6Acy75YBjGtsVT0kG0F1JzJ6KxEStYZ6w2WI1gaokRe8sj924HiunT7CkiKwfB0lpSsM9IdqIhbUtYR0xqR8Mld/aIWV3RoBZKyTn9spXzzUhxLENMaTxKrvBY3quoA7YLHngL9sRXUnIngdyMpBqOzcrkXDXu5d7OFybnfxBfW2MyZCP4GknKet5+3jdrT6bM3gJozy2uQRKOqPxBp4f3DC/THMiR2qBANe3kxGLKfgp8zV/Z9yHYSLpGU82W1hH0+QoeO4UFfWsf/hPuu4MvfO7s2brw6W1OiN/FrVTXLckzUTQHLckwEFz+NO+tJXhcP7CQHcFpYf+pFDuAsULgFfK8HOcA/p0QX1wgsFaoAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACr0lEQVR42u2WT0iTcRjHP5tuzBbT9Yqj2qsROaIWWtBhO5l0GLRbNo8jQfA43C2k3KFuTm8GgrFjo6OEJUonR50MXMGCrL0jQXozB/vDq/Pt4Dady9zaZBef4/P8eL/f3/f5Ps/v1fQ9y3i16s4UaNo4wfgc/3o49U7V5B5qtWpu/KTBj4g+jdr0QgtconHRp6XBcUqg+ajC4iNjXYF2Fm+dtqC6FhyMZDpHJJYi/kuh85yea6IBUdAfeX41kcFubakPAUlWGAiuIclKSX7Ka8XjMJed9YUSRKUsC2NX/kmy4hb4QgkkWWG4v53ZkS6G+9sBeBxeJ5nOlRGNxFIMOsy0tjTVroAkK0RiKZw2IwHPeQBcvSZAZWZJZvlLClePqUSlKa+Ix9FWHw+Igp63Y920tpQKZTpTeruJuQ0kWSHw4EJV4BV5wG41lOWiUhYAq6BHkhXCkU2cNiN20cDM0s89pXpMFXmgudqxkWSF+Y9JREGH3WogHNnM57e5H9x/cp+E1/G7O/C7LfXdA0PTcYDih6NSBoCtzA6zI128f3qVSa8VUdAxMbfBcixVHwLJdA5fSCKayOB3W4ojuJXZ3SN0z4Kr14Qo6Bh0mBnNE3yzslV7CyRZYWg6TjSRYbi/Hb+7o1grGLT1kDE78/0vEPxvBVYTGQaCa8WbF8axEA7bWYAyqedXkgA4bcbaFBgIrpFM5xDzjveFEsWa02bE4zAjCrqiGa+LBqJSlnBkE1HQ4eox1UagsO0kWUGKKGV1j8PMq9HLDE1/3yMR2Sc36bWW7YyqCfx4fuNYj4iCnoWxblYT2aJaoqCr32tYafxtaZ3+Ex7bgk/bd/9auP3yYl2BXs/cLMupqibQMAVUVROwLH0Y1zYSvCEeOAgOoFVRfzcKHEC7y+4d4FsjwAH+AOVDD5i1H1ADAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACSElEQVR42u2WMWgTcRTGf3c1oTWS2l4xqDlxMYIKrYJDMsXokCGbtWuxNnsgm4g0Q91aumXIIBntXKQIDU4edCsYhQhW8j8QSs/KYXJybXoOLaHNNVXbq+fQb3yP///7eO97jyclX1jjsrM1B9J5ThAf6587Q28dqfVYlp3W1EmTd0FScnpeysBV/ENSxmecCjjTLbH0NOQp0dbSndMW/F0L9sJsttBqDerfbK4MBrmh9qIqwXbOtLa7vo0qgeMJEIbN6OwqwrD3xefGo4zFByhV1plZWOv6fnn6OtFdsUcSkCvrCMMmmxoiHguh1RqUKus8n/9KejhMPHaOfKZT9Cbz2gYA4b6eo1dAGDZarUEiFqIwdhGA9EgYcChVDN59apAeDpOI7Z+Yh7M7e7/w6BLhs8cQoCpB3jy7Rn/ffq8e9um8toFWa5BNDZG9rxzfhLeiva5YVfzcNVjQZdaZhTVUJcDkH5AfaQyFYbO4YqIqAZe4xRUTYdikR/rbU+K5gIliHYB8JuLKlZYMACZTiveLyGy2yJUFVd0in4kwFh9wVaaqW9zcsyM8W0TCsJko1qnqFtnUEPnMhe6+GAx6uwnf6xZPinWEYZPPRA4kB6jq1o5p1V5vBYzOrmI2W6hKEGHY5Mp6O5eIhdqtEMZme3Q9FWA2W+02CM125Tu98LvF0wkpNf3D+Tf3QOD0HvhPD5IPmw8OTNx9ddlTotel266Y40gF3yrgOFIhUlmekv0k98UDe8kBZAfnu1/kAPI22/eAL36QA/wCDAPfxsKqqRgAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACqUlEQVR42u2WTWgTYRCGn2zs0iYQTRMaxGyrhRbRilXwsDnVIKiQmyXXoBLQW2luIv056DHkVqGo9Gjas0ShxVMXPbXQKEQwpRvai2vbYH5Ym64H0yU/rbYmJZfO7ZuZ3Xm/eWfeXcvQ80JIMHZiYDnDMdqXtW+1rg+GpXRfEIzSxHEXP8CGLIb1tQCcp3U2JNBiOwFw6qDA/BN7UwvtzF8/oeBoFFRaNl9CSeVY+6HT3SlySWpHcol1OYnlLNuFEt2dIrcHHc0BoGo6w9E0qqZX+WMhL0HZeWCO5BKZG71QB/TIFIzMZFA1nbDfzatHPYT9bgDG4htk8yUAs3jY72ZutJdIwIOq6YzMZBrrgKrpKKkcvn47k8GzANwZdAAG0wsai19z+PrsqJpelePrt5NYyqKkcmTzJRw26/8BkFwi75/2cbqjulH7vdCoOTtsQnNmYMDbXudLqkUAvC4Rh81KUHYSVzaZnv/OgNRBYmkbJZUj7Hf/9faH3oJaWhLLWSRXmwkuFvKSVIuMz26YeZe97SYlTdWBB1NrAEQCnopBVUlmCgRlJ5FAF0HZSTJTbHwIa/d8bHadZKZAJOAxV1BJ5YgrWwRlJ7GQt+qZuLJJUHbi67c31gFV07kXTRNXtgj73UQCXWZsMfXTnPxKk8vnpFpojIKVTIHhaNq8eS2v3rLQLKZyVX6lfJbcYmMUDEfTZPMlJJdYJy6+fjt3rzoYt1mJK5vl1W1jJVPk3dKfQfX12RsDsKd2qqajKnpdPCg7mRvt5eHUqgliD8jLxz2Nr+H6iyscRis+PrvISqZoKt9++tEUHTiqaJ38E/6Tgs+/bu0buPHmXFMLvZ2+Vv8BMyyTLeuAYVgmPQufJoRWFm/JDFQWBxAMjK1WFQcQdtm9Cay2ojjAb8F4F3uF/wLNAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACpUlEQVR42u2WQUhTcRzHP3tzY3Owyg1H9J6VoIc0WkEHPdko2mFH8ZhkDDqKu1U4PdQt82YwKDw27RYhhaOTg26CK1iRsTcmBC/z4fbi6fN1cBubU3Jssou/4+/34//9/r/f3//3nmXomTYqmLuzYDnLCcbXzI+DqU+mxbgvCKYxddLgR8SQxbS+FoBLtC6GBFocpwTajiosP3I1FWh3+capBfVZUBlqwSCZzpP5rdPVYeeK5EDy2Gt6llZVZEWnX3Ry1+9uDgFZ0RmeWUdW9Kr87KjIyMA5ANayGsMz66gFo1yXPHYWJy7XEK3bgvH5LLKiEw54efXwIuGAF4DJ+AZqwSgTBJNIyMfiRDfhgLecryRVtwKyopNM5xnsdTE9ch6AoN8NmMQSCivf8qRkDbVgVCky2OtiSzOIJzdZWlXL+boVkDx2Pjzp4cWoWJV3t1srSO4AIB6QeqB3/xmnZK0xC/rF2oFLyX/LoJLHBkAyvV3Vk0znAdjS9hp/BQdtWVpVkTw2+kUHZ5wCsYRCbFkpEnaykt4mntwsqmhrLoGxuQwAkZCvbNPsPZHoQo7n734VLRIY6HWRTOfpk5zNIaAWDCYXcqSyGpGQr2qwgn43Qb+blXQed7uVrg4bd55+R/LYCF5zN05AVnTG5jKkshrhgJdIqPPQvsHi4EXjOWRFL6vUEIG1rMaDuUz5wKPASxGN54glFPpEx397j0WgtEwkjx1Z0Rmfz1bduHIbRuMb+76LDt5OdDdnFZc2mazoyEm9pl4i0NVhJ1vcmJFQZ9WuaIhA7uXVYx3kbrfy8XHPsYFP5HNcL/jpDwlA25ed24cWbr650FSg97HrNTnTtEy3TAHTtEz7Ep+nhFaCt2QGKsEBBBPzT6vAAYQ99m4BP1sBDvAP3HcVryGTVowAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACn0lEQVR42u2WQUiTYRzGf/vWhtvCOb7YsPaReNhlQhREbCeTDkE7unkcER28id+toJxQt2m3DkvCY8NuVnqYdHLQSUGLFmi4j0LZWH60TTY/vy7ua+YsY7N18Lm9//eF53mf//N/eU39j8tRQd99AqYuThAfNtZ+Lb3VTdptQdC1sZMmPwL9Jt38XAB6aB/6BdqMUwFnjtpI3XO0lGg3deW0Bc0JUPJV0pkiaklruK+WNOaX1N+e+asM1JDNVxiZVkhnikZNDrmRQx5jvaKUGZxYN4gl0crU8EX6vB3NOzA4sU46U0QOeZiMevF7O4jPbpFMFwyBd55u4LQJTEa9TEa9gM5gfO1YTgh/ur0kWrg7cA455GYo4OLlaC8Ab5ZUAJ6lcmTzFWZGexkKuBgKuJga7kEtayQWcs21QBKtzOwT1rBdPnirFWWHoM+BJFqNWp+3g4DPwWKmiNyqEK4qO8wvqYxMK3TaBcYj3Ubd36DXkmhlNbvTfAhreJD8YgQxEnAZN1ZLGp12cwMBFtSy1joB4+Futst7JNMFkukCTruZWLjbENFoLFsyhjX4JRsAQZ+DbL5CIpVDvuVGEi1s5KsNAlzFLzU5hivKDiPTCnPL6oG60/bT8oDv7KHHJ5uvsPipiN9ra06ASddJpgs8TH4lm68AkM4UmVtWkUQLnXYzkYALtawRf7VlWB+f3UQtaUQCruZa4JdsyCEP8dlNrt3/iCRayO7bHQufN1pSO5NI5epeSw9Bn6P5DMghN17RwvyyilrSuHnJSTjYRV+dvbUz9VNyHHIA08Cj7/q/+Q9YTv8D/+mf8H31RsONqy8utJTodeLyoZqum2Jtc0DXTTHPwrsxoZ3kbclAPTmAoKN/axc5gLDH3nXgczvIAX4A6SAdYsDAGeAAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACQklEQVR42u2WP2gTYRjGf3exIfbksEZaxByRgFlaaBWsJFMsFjt0a8kaHAQ7mmxGsAXrlpA91bpaMwYpQoJTA04K/qlRgpgoRD1qg0kk6fUcDKGpCbZy5y15p+973497Hp73+d77hMDdekjUdxIgHMfEePOxsD/1VBe0q6Koa4tmg/eIgKDbVkXgDNZFQMTi6BM40quQuSkZCrSTOd9vweFasD/Wclts5KsAjCoOZsZlFKe969n15xUE4MqEbAyBuXiBXAscgBysZFTuLbgZczna6UpNI5Yuk8yqKE77gQj8tQUrmW/k8lVGXQ5SYQ9Pbp3l2tRJimqD22uf2+delupML78nmVWN9cB2XcPvlbi/4MbvlRhzOVgKnkIetHWocuPBJ4pqg8jsiLEe6PXBSk1DcQ609/KgSCrswe+ViKXLxpsQoKQ22a5rJDNfAQj6TrRrq9fdyIM2824BwGR0s732eSUis8N7FLCZPweCviFmJmQU5wC5fPVQUhuiQCLkAqCoNpiPF4ilv+DzHsPvlcydhCW12bFXnHZmxuVWrWHuKL4YfctkdJNKTevIF1uk/rX3Bybgal21uXiBV6WflNQmsXSZ9ReV32N5zyQ0xQOJkIv5Fvj0nXf7akrP/4FhBBSnnVTYw0a+yqPcVksVO0HfUE/zRWaHkY8erDXC1PIP/f88SAb6D5LuHnjdvNy1cOHhaUOBHifP/ZHTdWHJMgV0XVgayT5bFK0Et8QDe8EBRB39u1XgAOIuu5eAD1aAA/wC083IzkRnqHoAAAAASUVORK5CYII="],"arrR":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAARCAYAAAAhUad0AAAAZUlEQVR42mNkYGBgSOt495+BTmBWhRAjIz0thAEmhgEAQ8fSmeWCA+NTSiymKHjJtZjiOCXHYqokJFItpoql6Z3v6WspqRZSbCk5FlJkKbkWkm0pJRaOsLJ3VoUQIz0tnFUhxAgA0EMYRk5rSpMAAAAASUVORK5CYII=","arrL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAARCAYAAAAhUad0AAAAZElEQVR42uXUURGAMAwD0BQHVCRIoBI2CVQkSBhfCFi6644jBt5PEgGArVwNSXFTkUzwzYIJ+R56HmsuyoI0GgEpNAp2oyPAbnSv95z2joCpIkVhejIROHQOLPyj73VTyQTdVB5IUhhGVdHiBQAAAABJRU5ErkJggg==","miniNav":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAMCAYAAAAH4W+EAAAAZElEQVR42mNkYGBg6Fj17j8DiaAiTIiRUr3IgJEcg6gB0B3DxDBIAEGHlIcKkmwoOXqYqG0guXqZaOEIcswY/Gmkc/V7ig0nxQwmahlEqV4mahtIrp7Bk0awFbfEloyU6EUXAwDEbiGbJxOS8QAAAABJRU5ErkJggg==","close":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAYUlEQVR42mNkYGBg2H3m/38GYsDuM/+JBkwwTZ2r3zN0rn6PYRiyOBM2SWxsBgYGBsbdZ/7/dzHGLgkD5aGCmCbDBHGJMTGQAJhwuRebGBM2wfJQQRTrcYYGsiIMP5ASKQDlG3vYITjb5AAAAABJRU5ErkJggg==","plus":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAFVBMVEUAAADqQzX7vAXlZjJChfTVbDY0qFNGmUfDAAAABHRSTlMA///pR/n12QAAAEhJREFUeAFjwAZGgSAQDLyCUQWjCpTgACgv7AIH2BWYEFAg7EJAgQkBBaIuBBSEEFAg6kJAQQiqAkyQBgQI3oApGFUwqmAUAAA3gEptDjzKJgAAAABJRU5ErkJggg==","mi":{"add":"","apps":"","arrow_drop_down":"","check":"","check_box":"","check_box_outline_blank":"","chevron_left":"","chevron_right":"","close":"","delete":"","edit":"","event":"","expand_less":"","expand_more":"","help_outline":"","lock_outline":"","menu":"","more_vert":"","notes":"","notifications":"","people_outline":"","place":"","print":"","refresh":"","schedule":"","search":"","settings":"","subject":""}}; } return ugfCalArt.c; } function ugfCalWanted() { if (window.location.host !== "calendar.google.com") { return false; } // Gplex's own hidden helper frame, and Calendar shown inside other pages try { if (window.top !== window.self) { return false; } } catch (e) { return false; } const p = window.location.pathname || ""; if (!/^\/calendar(\/|$)/.test(p)) { return false; } // Google's own pages for editing, settings, search and the rest stay Google's if (/\/r\/(eventedit|settings|search|tasks|trash|appointment|birthdays|timeline|tasks|workinglocation)/.test(p) || /\/(embed|htmlembed|appointments|render|event)(\/|$|\?)/.test(p.replace(/^\/calendar(\/u\/\d+)?/, ""))) { return false; } let on = null; try { on = typeof GM_getValue === "function" ? GM_getValue("UGF_CAL_ON", null) : null; } catch (e) {} return String(on) !== "false"; } // Which Google Calendar a layout gets. Calendar opened in April 2006, so every // older layout shows the 2006 Calendar. // c2006 the original, in Gmail's blue (to May 2010) // c2010 the lighter one of May 2010 // c2011 the grey redesign of June 2011, under the dark Google bar // c2013 the same without the bar, as it stayed until October 2017 // c2017 the Material redesign of October 2017 // c2019 Google Material 2 (2019), and c2022 the same with the 2020 icon function ugfCalEra() { const l = String(layout || "2015"); if (l === "2022") { return "c2022"; } if (l === "2019") { return "c2019"; } if (l === "2018" || l === "2018M") { return "c2017"; } if (["2014", "2015", "2016", "2016C", "2017"].indexOf(l) > -1) { return "c2013"; } if (["2011", "2012", "2013", "2013L", "2015L", "2016L"].indexOf(l) > -1) { return "c2011"; } if (l === "2010" || l === "2010N") { return "c2010"; } return "c2006"; } function ugfCalClassic(era) { return era === "c2006" || era === "c2010" || era === "c2011" || era === "c2013"; } // ---- dates ------------------------------------------------------------------ function ugfCalDay(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function ugfCalAdd(d, n) { return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n); } function ugfCalSame(a, b) { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); } function ugfCalWeekStart(d, first) { const x = ugfCalDay(d); const back = (x.getDay() - (first || 0) + 7) % 7; return ugfCalAdd(x, -back); } // (functions rather than consts: this part of the script is reached before a // const this far down would exist) function ugfCalK() { if (ugfCalK.c) { return ugfCalK.c; } ugfCalK.c = {}; ugfCalK.c.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; ugfCalK.c.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; return ugfCalK.c; } function ugfCalMon(d, len) { return ugfCalK().months[d.getMonth()].slice(0, len || 99); } function ugfCalDow(d, len) { return ugfCalK().days[d.getDay()].slice(0, len || 99); } // "10am", "10:30am" (classic), "10:30" style is left to the caller function ugfCalTime(d, style) { let h = d.getHours(); const m = d.getMinutes(); const pm = h >= 12; h = h % 12 || 12; if (style === "gm2") { return h + (m ? ":" + String(m).padStart(2, "0") : "") + (pm ? "pm" : "am"); } if (style === "short") { // month cells in the classic pages: 2:05p return h + (m ? ":" + String(m).padStart(2, "0") : "") + (pm ? "p" : ""); } return h + (m ? ":" + String(m).padStart(2, "0") : "") + (pm ? "pm" : "am"); } function ugfCalHourLabel(h, era) { const pm = h >= 12; const hh = h % 12 || 12; if (era === "c2019" || era === "c2022") { return hh + " " + (pm ? "PM" : "AM"); } return hh + (pm ? "pm" : "am"); } // ---- where we are: Google's own addresses (/r/week/2026/9/23 and the like) ---- function ugfCalBase() { const m = (window.location.pathname || "").match(/^\/calendar(\/u\/\d+)?/); return (m ? m[0] : "/calendar") + "/r"; } function ugfCalParseUrl() { const p = window.location.pathname || ""; const m = p.match(/\/r\/(day|week|month|year|customday|agenda|schedule|customweek)(?:\/(\d{4})\/(\d{1,2})\/(\d{1,2}))?/); const out = { view: "", date: ugfCalDay(new Date()) }; if (m) { out.view = { day: "day", week: "week", month: "month", year: "month", customday: "4day", customweek: "week", agenda: "agenda", schedule: "agenda" }[m[1]]; if (m[2]) { out.date = new Date(parseInt(m[2], 10), parseInt(m[3], 10) - 1, parseInt(m[4], 10)); } } return out; } function ugfCalUrl(view, d) { const name = { day: "day", week: "week", month: "month", "4day": "customday", agenda: "agenda" }[view] || "week"; return ugfCalBase() + "/" + name + "/" + d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate(); } // the days a view covers function ugfCalRange(view, d, first) { if (view === "day") { return { from: ugfCalDay(d), days: 1 }; } if (view === "4day") { return { from: ugfCalDay(d), days: 4 }; } if (view === "month") { const a = ugfCalWeekStart(new Date(d.getFullYear(), d.getMonth(), 1), first); const last = new Date(d.getFullYear(), d.getMonth() + 1, 0); const b = ugfCalAdd(ugfCalWeekStart(last, first), 7); return { from: a, days: Math.round((b - a) / 864e5) }; } if (view === "agenda") { return { from: ugfCalDay(d), days: 30 }; } return { from: ugfCalWeekStart(d, first), days: 7 }; } function ugfCalStep(view, d, dir) { if (view === "day") { return ugfCalAdd(d, dir); } if (view === "4day") { return ugfCalAdd(d, 4 * dir); } if (view === "month") { return new Date(d.getFullYear(), d.getMonth() + dir, 1); } if (view === "agenda") { return ugfCalAdd(d, 30 * dir); } return ugfCalAdd(d, 7 * dir); } // ---- colours ---------------------------------------------------------------- // Events arrive in today's colours; each period drew them from its own set, so // every colour is matched to the nearest one of the period's. function ugfCalClassicColors() { return ugfCalClassicColors.c || (ugfCalClassicColors.c = [ ["#A32929", "#D96666"], ["#B1365F", "#E67399"], ["#7A367A", "#B373B3"], ["#5229A3", "#8C66D9"], ["#29527A", "#668CB3"], ["#2952A3", "#668CD9"], ["#1B887A", "#59BFB3"], ["#28754E", "#65AD89"], ["#0D7813", "#4CB052"], ["#528800", "#8CBF40"], ["#88880E", "#BFBF4D"], ["#AB8B00", "#E0C240"], ["#BE6D00", "#F2A640"], ["#B1440E", "#E6804D"], ["#865A5A", "#BE9494"], ["#705770", "#A992A9"], ["#4E5D6C", "#8997A5"], ["#5A6986", "#94A2BE"], ["#4A716C", "#85AAA5"], ["#6E6E41", "#A7A77D"], ["#8D6F47", "#C4A883"] ]); } // the calendar colours of June 2011 on (the swatches in its colour picker) function ugfCal2011Colors() { return ugfCal2011Colors.c || (ugfCal2011Colors.c = ["#ac725e", "#d06b64", "#f83a22", "#fa573c", "#ff7537", "#ffad46", "#42d692", "#16a765", "#7bd148", "#b3dc6c", "#fbe983", "#fad165", "#92e1c0", "#9fe1e7", "#9fc6e7", "#4986e7", "#9a9cff", "#b99aff", "#c2c2c2", "#cabdbf", "#cca6ac", "#f691b2", "#cd74e6", "#a47ae2"]); } function ugfCalRgb(hex) { const m = String(hex || "").replace("#", "").match(/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i); if (!m) { const rgb = String(hex || "").match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/); return rgb ? [parseInt(rgb[1], 10), parseInt(rgb[2], 10), parseInt(rgb[3], 10)] : [3, 155, 229]; } return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)]; } function ugfCalNear(hex, list, pick) { const a = ugfCalRgb(hex); let best = 0; let bd = 1e9; list.forEach(function(c, i) { const b = ugfCalRgb(pick ? pick(c) : c); // weighted by how the eye sees the channels const d = 2 * Math.pow(a[0] - b[0], 2) + 4 * Math.pow(a[1] - b[1], 2) + 3 * Math.pow(a[2] - b[2], 2); if (d < bd) { bd = d; best = i; } }); return list[best]; } // { bg, fg, border, text } for an event in this period // ---- your Calendar settings in Gplex: display density, the colour set of the // Material pages and the colours you give your calendars (kept by Gplex, like the // rest of its settings) function ugfCalPrefs() { if (!ugfCalPrefs.p) { const get = function(k, d) { try { return typeof GM_getValue === "function" ? GM_getValue(k, d) : d; } catch (e) { return d; } }; let colors = {}; try { colors = JSON.parse(get("UGF_CAL_COLORS", "{}")) || {}; } catch (e) {} ugfCalPrefs.p = { density: get("UGF_CAL_DENSITY", ""), colorset: get("UGF_CAL_COLORSET", "modern"), colors: colors }; } return ugfCalPrefs.p; } function ugfCalSetPref(k, v) { const p = ugfCalPrefs(); p[k] = v; try { if (typeof GM_setValue === "function") { GM_setValue({ density: "UGF_CAL_DENSITY", colorset: "UGF_CAL_COLORSET", colors: "UGF_CAL_COLORS" }[k], k === "colors" ? JSON.stringify(v) : v); } } catch (e) {} } // a calendar's colour: yours if you picked one here, else Google's function ugfCalColorFor(cal, color) { const c = ugfCalPrefs().colors; return (cal && c[cal]) || color; } // the calendar colours of the Material pages, by the names Google gives them function ugfCalMaterialColors() { return [["#ad1457", "Radicchio"], ["#d81b60", "Cherry blossom"], ["#d50000", "Tomato"], ["#e67c73", "Flamingo"], ["#f4511e", "Tangerine"], ["#ef6c00", "Pumpkin"], ["#f09300", "Mango"], ["#f6bf26", "Banana"], ["#e4c441", "Citron"], ["#c0ca33", "Avocado"], ["#7cb342", "Pistachio"], ["#33b679", "Sage"], ["#0b8043", "Basil"], ["#009688", "Eucalyptus"], ["#039be5", "Peacock"], ["#4285f4", "Cobalt"], ["#3f51b5", "Blueberry"], ["#7986cb", "Lavender"], ["#b39ddb", "Wisteria"], ["#9e69af", "Amethyst"], ["#8e24aa", "Grape"], ["#795548", "Cocoa"], ["#616161", "Graphite"], ["#a79b8e", "Birch"]]; } function ugfCalPaint(hex, era) { if (era === "c2006" || era === "c2010") { const p = ugfCalNear(hex, ugfCalClassicColors(), function(c) { return c[1]; }); return { dark: p[0], light: p[1], text: "#fff" }; } if (era === "c2011" || era === "c2013") { const c = ugfCalNear(hex, ugfCal2011Colors()); const rgb = ugfCalRgb(c); const lum = 0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]; return { dark: c, light: c, text: lum > 170 ? "#1d1d1d" : "#fff" }; } const rgb = ugfCalRgb(hex); // the "Classic" colour set of 2018 on: the colour paled, with black writing if (ugfCalPrefs().colorset === "classic") { const pale = rgb.map(function(v) { return Math.round(v + (255 - v) * 0.55); }); return { dark: "rgb(" + rgb.join(",") + ")", light: "rgb(" + pale.join(",") + ")", text: "#202124" }; } return { dark: "rgb(" + rgb.join(",") + ")", light: "rgb(" + rgb.join(",") + ")", text: "#fff" }; } // ---- your events -------------------------------------------------------------- // [{ id, title, start, end, allDay, color, cal, where }] and [{ id, name, color, mine, on }] // Read out of Google's page by ugfCalHarvest; kept per day so paging back and forth // does not wait on Google again. function ugfCalS() { return ugfCalS.s || (ugfCalS.s = { events: {}, calendars: [], days: {} }); } function ugfCalKey(d) { return d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate(); } function ugfCalPut(list, from, days) { for (let i = 0; i < days; i++) { ugfCalS().days[ugfCalKey(ugfCalAdd(from, i))] = true; } // what Google showed for these days replaces what we had for them; an event // just made or changed here stays until Google shows it too (or a minute has // gone by), and one just deleted here stays away as long const gone = ugfCalS().gone || {}; const kept = {}; list = list.filter(function(x) { return !(x.eid && gone[x.eid] && Date.now() - gone[x.eid] < 60000); }); Object.keys(ugfCalS().events).forEach(function(id) { const ev = ugfCalS().events[id]; if (ev.end > from && ev.start < ugfCalAdd(from, days)) { if (ev.pending && Date.now() - ev.pending < 60000 && !list.some(function(x) { return x.title === ev.title && x.start.getTime() === ev.start.getTime() && (!ev.eid || x.eid === ev.eid); })) { if (ev.eid) { kept[ev.eid] = true; } return; } delete ugfCalS().events[id]; } }); list.forEach(function(ev) { if (!(ev.eid && kept[ev.eid])) { ugfCalS().events[ev.id] = ev; } }); } function ugfCalHave(from, days) { for (let i = 0; i < days; i++) { if (!ugfCalS().days[ugfCalKey(ugfCalAdd(from, i))]) { return false; } } return true; } function ugfCalEventsIn(from, days) { const to = ugfCalAdd(from, days); const offCal = {}; ugfCalS().calendars.forEach(function(c) { if (c.on === false) { offCal[c.name] = true; } }); return Object.keys(ugfCalS().events).map(function(id) { return ugfCalS().events[id]; }).filter(function(ev) { return ev.end > from && ev.start < to && !offCal[ev.cal]; }).sort(function(a, b) { return (b.allDay - a.allDay) || (a.start - b.start) || ((b.end - b.start) - (a.end - a.start)) || String(a.title).localeCompare(b.title); }); } // ---- the page ----------------------------------------------------------------- function ugfCalEsc(s) { return String(s === undefined || s === null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } function ugfCalIcon(n, size) { const A = ugfCalArt(); let svg = A.mi[n] || ""; if (size) { svg = svg.replace(/(]*?)\s(width|height)="\d+"/g, "$1").replace("' + svg + ""; } // the Google logo in the 2011-2017 header: the one Gplex's results pages show function ugfCalHeadLogo() { const M = ugfMapsArt(); const l = String(layout || ""); if (l === "2011" || l === "2012") { return 'Google'; } if (["2014", "2015", "2015L"].indexOf(l) > -1) { return 'Google'; } // the new logo of September 2015 (layout 2018 is "2017-2018") if (["2016", "2016C", "2016L", "2017", "2018", "2018M", "2019", "2022"].indexOf(l) > -1) { return 'Google'; } return 'Google'; } // the tab icon: the small blue "31" (2006), the flat "31" (2011), the blue one // with today's date on it (2014 on) and the four-colour one of late 2020 function ugfCalFaviconFor(era) { const A = ugfCalArt(); const d = new Date().getDate(); if (era === "c2022") { return A.fav2020[d - 1]; } if (era === "c2013" || era === "c2017" || era === "c2019") { return A.fav2014[d - 1]; } if (era === "c2011") { return A.fav2011; } return A.fav2006; } function ugfCalSetFavicon(era) { let href = ugfCalFaviconFor(era); ugfApplyFavicon(href); // Google puts its own back, and swaps in its own now and then (the 2026 one) ugfKeepFavicon(function() { return href; }); // the date on it moves on with the day, and so does the one in the header let day = new Date().getDate(); setInterval(function() { if (new Date().getDate() === day) { return; } day = new Date().getDate(); href = ugfCalFaviconFor(era); ugfApplyFavicon(href); document.querySelectorAll("#ugf-cal img.datelogo").forEach(function(img) { img.src = ugfCalDateIcon(era); }); }, 60000); } // the logo in the Material header: Google's icon with today's date on it function ugfCalDateIcon(era) { const d = new Date().getDate(); if (era === "c2022") { return "https://ssl.gstatic.com/calendar/images/dynamiclogo_2020q4/calendar_" + d + "_2x.png"; } return "https://ssl.gstatic.com/calendar/images/dynamiclogo/2x/cal_" + String(d).padStart(2, "0") + "_v2.png"; } // who is signed in, for the bars and the account menu function ugfCalWho() { const id = ugfGmailIdentity(); return { name: id.name || "", first: id.first || "", email: id.email || "", photo: id.photo || "" }; } // ---- the Google bar per period (Calendar's own, which differs from Search's) function ugfCalGbar(era) { const esc = ugfCalEsc; const who = ugfCalWho(); const l = String(layout || ""); if (era === "c2006" || era === "c2010") { const apps = [["Gmail", "https://mail.google.com/"], ["Calendar", ""], ["Documents", "https://docs.google.com/"], ["Photos", "https://photos.google.com/"], ["Reader", "https://www.google.com/reader/"], ["Web", "https://www.google.com/"]]; let left = ""; apps.forEach(function(a) { left += a[1] ? '' + esc(a[0]) + "" : "" + esc(a[0]) + ""; }); left += 'more ▼'; // before 2007 there was no Google bar: just the account links on the right if (["1997", "1998", "1999", "2000", "2001", "2002", "2003", "2005", "2006"].indexOf(l) > -1) { left = ""; } const right = (who.email || who.name ? '' + esc(who.email || who.name) + " | " : "") + 'Settings | ' + 'Help | ' + (who.email || who.name ? 'Sign out' : 'Sign in'); return '
' + left + '
' + right + "
"; } // late 2012 to 2013: the +You bar; 2014 on had none if (era !== "c2011") { return ""; } // June 2011 on: the dark bar const late = l === "2013" || l === "2014" || l === "2015"; const apps = [["Search", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Maps", "https://www.google.com/maps"], ["Play", "https://play.google.com/"], ["YouTube", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"], ["Drive", "https://drive.google.com/"], ["Calendar", ""]].filter(ugfDvGbarKeep); let links = late ? '+' + esc(ugfGmailPlusName()) + "" : ""; apps.forEach(function(a) { links += a[1] ? '' + esc(a[0]) + "" : '' + esc(a[0]) + ""; }); links += 'More ▾'; const right = late ? "" : (who.first || who.email ? '' + esc(who.first || who.email) + "" : 'Sign in') + '' + ugfCalIcon("settings", 16) + ""; return '
' + links + '
' + right + "
"; } // the account corner of the 2012-2017 header: +Name, count, Share, photo (2012-2014); // app grid, bell, round photo (2015-2017) function ugfCalAccount(era) { const esc = ugfCalEsc; const l = String(layout || ""); const who = ugfCalWho(); if (!who.name && !who.email) { return ''; } if (era === "c2011" && l !== "2013") { return ""; // the name is on the dark bar } if (l === "2013" || l === "2014") { return '
+' + esc(ugfGmailPlusName()) + "" + (l === "2014" ? '' + ugfCalIcon("apps", 20) + "" : "") + '0' + '' + ugfGmailAvatar() + '▾
'; } return '
' + ugfCalIcon("apps", 20) + "" + '' + ugfCalIcon("notifications", 20) + "" + '' + ugfGmailAvatar() + "
"; } // ---- reading your events out of Google's page ---------------------------------- // Google's Calendar, hidden underneath, is kept on the same days as Gplex's; what it // draws is read back. Each event Google draws carries its id and a line of text // for screen readers with everything about it ("10am to 11am, Title, Calendar, // Location, September 23, 2026"), which is what this goes by rather than anything // Google styles differently from one build to the next. function ugfCalGoogleDriving() { return !!ugfCalGoogleDriving.on; } // Move Google's own Calendar to a view and day, through its own address handling function ugfCalDrive(view, d) { const want = ugfCalUrl(view, d); if ((window.location.pathname || "") !== want) { try { history.replaceState(history.state, "", want); } catch (e) {} } ugfCalGoogleDriving.on = true; try { const w = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; w.dispatchEvent(new PopStateEvent("popstate", { state: null })); } catch (e) {} ugfCalGoogleDriving.on = false; } // the months Calendar spells out in its screen-reader text function ugfCalMonthNo(name) { const i = ugfCalK().months.findIndex(function(m) { return m.toLowerCase().indexOf(String(name).toLowerCase().slice(0, 3)) === 0; }); return i; } // "10am", "10:30pm", "22:30", "noon" function ugfCalParseClock(t, base) { t = String(t).trim().toLowerCase(); if (t === "noon") { return new Date(base.getFullYear(), base.getMonth(), base.getDate(), 12, 0); } if (t === "midnight") { return new Date(base.getFullYear(), base.getMonth(), base.getDate(), 0, 0); } const m = t.match(/(\d{1,2})(?::(\d{2}))?\s*(am|pm|a\.m\.|p\.m\.)?/); if (!m) { return null; } let h = parseInt(m[1], 10); const mi = m[2] ? parseInt(m[2], 10) : 0; if (m[3]) { const pm = /p/.test(m[3]); if (h === 12) { h = pm ? 12 : 0; } else if (pm) { h += 12; } } return new Date(base.getFullYear(), base.getMonth(), base.getDate(), h, mi); } // a date spelled out: "September 23, 2026" / "Wednesday, September 23" / "23 September 2026" function ugfCalParseDateText(t, fallbackYear) { let m = String(t).match(/([A-Z][a-z]+)\s+(\d{1,2}),?\s*(\d{4})?/); if (m && ugfCalMonthNo(m[1]) > -1) { return new Date(m[3] ? parseInt(m[3], 10) : fallbackYear, ugfCalMonthNo(m[1]), parseInt(m[2], 10)); } m = String(t).match(/(\d{1,2})\s+([A-Z][a-z]+)\s*(\d{4})?/); if (m && ugfCalMonthNo(m[2]) > -1) { return new Date(m[3] ? parseInt(m[3], 10) : fallbackYear, ugfCalMonthNo(m[2]), parseInt(m[1], 10)); } return null; } // one event from its screen-reader line function ugfCalParseLabel(txt, dayHint) { const parts = String(txt).split(/,\s+/); const out = { allDay: false }; let i = 0; // the time comes first: "10am to 11am" / "All day" / "10am to September 24, 2026 at 1am" const first = parts[0] || ""; let startT = null; let endT = null; if (/^all day$/i.test(first)) { out.allDay = true; i = 1; } else { const tm = first.match(/^(.+?)\s+(?:to|–|-)\s+(.+)$/i); if (tm && /\d/.test(tm[1])) { startT = tm[1]; endT = tm[2]; i = 1; } } out.title = (parts[i] || "").trim(); const rest = parts.slice(i + 1); // the day it is on: the last part that reads as a date let day = null; for (let k = rest.length - 1; k >= 0 && !day; k--) { day = ugfCalParseDateText(rest[k] + (rest[k + 1] && /^\d{4}$/.test(rest[k + 1]) ? " " + rest[k + 1] : ""), (dayHint || new Date()).getFullYear()); } day = day || dayHint; if (!day) { return null; } rest.forEach(function(p) { const pl = p.toLowerCase(); if (/^location:?\s*/.test(pl)) { out.where = p.replace(/^location:?\s*/i, ""); } else if (/^calendar:?\s*/.test(pl)) { out.cal = p.replace(/^calendar:?\s*/i, ""); } }); // a stretch of days: "September 25, 2026 to September 27, 2026" const span = String(txt).match(/([A-Z][a-z]+\s+\d{1,2},?\s*\d{4}|\d{1,2}\s+[A-Z][a-z]+\s+\d{4})\s+(?:to|–|-)\s+([A-Z][a-z]+\s+\d{1,2},?\s*\d{4}|\d{1,2}\s+[A-Z][a-z]+\s+\d{4})/); const spanFrom = span ? ugfCalParseDateText(span[1], day.getFullYear()) : null; const spanTo = span ? ugfCalParseDateText(span[2], day.getFullYear()) : null; if (out.allDay && spanFrom && spanTo && spanTo >= spanFrom) { out.start = ugfCalDay(spanFrom); out.end = ugfCalAdd(ugfCalDay(spanTo), 1); } else if (out.allDay) { out.start = ugfCalDay(day); out.end = ugfCalAdd(out.start, 1); } else if (startT) { out.start = ugfCalParseClock(startT, day) || ugfCalDay(day); // an end on another day names that day const endDay = /[A-Za-z]{3,}\s+\d/.test(endT) ? ugfCalParseDateText(endT, day.getFullYear()) : null; out.end = ugfCalParseClock(endT.replace(/^.*\bat\s+/i, ""), endDay || day) || new Date(out.start.getTime() + 36e5); if (out.end <= out.start) { out.end = new Date(out.end.getTime() + 864e5); } } else { out.start = ugfCalDay(day); out.end = ugfCalAdd(out.start, 1); out.allDay = true; } return out; } // Google marks each day column with a "datekey": either YYYYMMDD or its packed // number ((year - 1970) << 9 | month << 5 | day) function ugfCalDecodeKey(k) { k = String(k || ""); let m = k.match(/^(\d{4})(\d{2})(\d{2})$/); if (m) { return new Date(+m[1], +m[2] - 1, +m[3]); } if (!/^\d{3,6}$/.test(k)) { return null; } const n = parseInt(k, 10); const y = 1970 + (n >> 9); const mo = (n >> 5) & 15; const d = n & 31; if (y < 1990 || y > 2200 || mo < 1 || mo > 12 || d < 1) { return null; } return new Date(y, mo - 1, d); } // the days Google's own page is showing right now (null when it cannot be told) function ugfCalGoogleDays() { const out = {}; let any = false; document.querySelectorAll("[data-datekey]").forEach(function(el) { if (ugfCalMine(el)) { return; } const d = ugfCalDecodeKey(el.getAttribute("data-datekey")); if (d) { out[ugfCalKey(d)] = true; any = true; } }); // the grid also carries the first and last day it covers document.querySelectorAll("[data-start-date-key][data-end-date-key]").forEach(function(el) { if (ugfCalMine(el)) { return; } const a = ugfCalDecodeKey(el.getAttribute("data-start-date-key")); const b = ugfCalDecodeKey(el.getAttribute("data-end-date-key")); if (a && b && b >= a && b - a < 50 * 864e5) { for (let d = a; d <= b; d = ugfCalAdd(d, 1)) { out[ugfCalKey(d)] = true; any = true; } } }); return any ? out : null; } function ugfCalMine(el) { return !!(el && el.closest && el.closest("#ugf-cal, [id^='ugf-']")); } // everything Google's page shows right now function ugfCalHarvest() { const out = []; const seen = {}; const calNames = {}; ugfCalS().calendars.concat(ugfCalHarvestCals.last && ugfCalHarvestCals.last.length ? ugfCalHarvestCals.last : ugfCalHarvestCals()).forEach(function(c) { calNames[String(c.name).toLowerCase()] = c.name; }); document.querySelectorAll("[data-eventid]").forEach(function(el) { if (ugfCalMine(el)) { return; } const id = el.getAttribute("data-eventid"); // the screen-reader line: the hidden text inside the chip, else its label let txt = ""; const sr = el.querySelector(".XuJrye, [role='heading'] ~ div, .ynRLnc"); if (sr && /\d/.test(sr.textContent || "")) { txt = sr.textContent; } txt = txt || el.getAttribute("aria-label") || ugfMapsReadText(el) || el.textContent || ""; txt = txt.replace(/\s+/g, " ").trim(); // the day column it sits in gives the day when the text leaves it out let hint = null; const col = el.closest("[data-datekey], [data-date]"); if (col) { hint = ugfCalDecodeKey(col.getAttribute("data-date") || col.getAttribute("data-datekey")); } const ev = ugfCalParseLabel(txt, hint); if (!ev || !ev.title) { return; } // which calendar, and where: the other parts of the line, past the // answer ("Accepted") and the days if (!ev.cal || !ev.where) { const parts = txt.split(/,\s+/); const ti = parts.indexOf(ev.title); parts.slice(ti + 1).forEach(function(p) { const pl = p.toLowerCase().trim(); if (!ev.cal && calNames[pl]) { ev.cal = calNames[pl]; } else if (!ev.where && ev.cal && p.length > 1 && !/\d{4}|^\d|^(accepted|declined|tentative|maybe|needs rsvp|no location|organi[sz]er|busy|free|all day|invitation)/i.test(pl) && !ugfCalK().months.some(function(m) { const w = pl.split(/\s/)[0]; return m.toLowerCase() === w || m.toLowerCase().slice(0, 3) === w; }) && !/^(mon|tues|wednes|thurs|fri|satur|sun)day/i.test(pl)) { ev.where = p.trim(); } }); } const key = id + "|" + ev.start.getTime(); if (seen[key]) { return; } seen[key] = true; // its colour: the chip's own background or border const cs = window.getComputedStyle(el); let color = cs.backgroundColor; if (!color || /rgba\(0, 0, 0, 0\)|transparent/.test(color)) { color = cs.borderColor || cs.color; } const inner = el.querySelector("[style*='background-color'], [style*='border-color']"); if ((!color || /rgba\(0, 0, 0, 0\)|transparent/.test(color)) && inner) { color = inner.style.backgroundColor || inner.style.borderColor; } if (!color || /rgba\(0, 0, 0, 0\)|transparent/.test(color)) { const v = (el.getAttribute("style") || "").match(/--[\w-]*colou?r[\w-]*:\s*([^;]+)/i); if (v) { color = v[1].trim(); } } ev.id = key; ev.eid = id; ev.color = color || "#039be5"; out.push(ev); }); return out; } // the calendars in Google's side column (checkboxes with the calendar's colour) function ugfCalHarvestCals() { const out = []; const seen = {}; document.querySelectorAll("[role='listitem'] input[type='checkbox'], [role='listitem'] [role='checkbox'], input[type='checkbox'][aria-label]").forEach(function(cb) { if (ugfCalMine(cb)) { return; } const li = cb.closest("[role='listitem']") || cb.parentElement; const name = (cb.getAttribute("aria-label") || (li && li.textContent) || "").replace(/\s+/g, " ").trim(); if (!name || seen[name]) { return; } seen[name] = true; const list = cb.closest("[role='list']"); const listLabel = list ? (list.getAttribute("aria-label") || "") : ""; let color = ""; const sw = li ? li.querySelector("[style*='background-color'], [style*='border-color']") : null; if (sw) { color = sw.style.backgroundColor || sw.style.borderColor; } if (!color && li) { const v = (li.outerHTML.match(/--[\w-]*colou?r[\w-]*:\s*([^;"]+)/i) || [])[1]; if (v) { color = v.trim(); } } out.push({ name: name, color: color || "#039be5", mine: !/other/i.test(listLabel), on: cb.checked !== undefined ? !!cb.checked : cb.getAttribute("aria-checked") !== "false" }); }); ugfCalHarvestCals.last = out; return out; } // Test pages hand Gplex their events directly function ugfCalMock() { try { const w = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; return w.__ugfCalMock || null; } catch (e) { return null; } } // Bring the store up to the days of a view: Google's page is moved there and read // once it has drawn them. cb(changed) function ugfCalFetch(view, d, r, cb, quiet) { if (ugfCalFetch.stuck === undefined) { try { ugfCalFetch.stuck = sessionStorage.getItem("ugfCalStuck") === "1"; } catch (e) { ugfCalFetch.stuck = false; } } const mock = ugfCalMock(); if (mock) { const before = JSON.stringify(Object.keys(ugfCalS().events)); const evs = (mock.events || []).map(function(e) { return { id: e.id, eid: e.id, title: e.title, start: new Date(e.start), end: new Date(e.end), allDay: !!e.allDay, color: e.color || "#039be5", cal: e.cal || "", where: e.where || "" }; }).filter(function(e) { return e.end > r.from && e.start < ugfCalAdd(r.from, r.days); }); if (!ugfCalS().calendars.length) { ugfCalS().calendars = (mock.calendars || []).map(function(c) { return { name: c.name, color: c.color, mine: c.mine !== false, on: c.on !== false }; }); } setTimeout(function() { ugfCalPut(evs, r.from, r.days); cb(before !== JSON.stringify(Object.keys(ugfCalS().events))); }, quiet ? 0 : 150); return; } // the first time, Google's page is already on the address's day const boot = !ugfCalFetch.booted; if (boot) { ugfCalFetch.booted = true; quiet = quiet || view === ugfCalParseUrl().view; } if (!quiet) { // Google's page would not follow before: load the day properly instead if (ugfCalFetch.stuck) { window.location.assign(ugfCalUrl(view, d)); return; } ugfCalDrive(view, d); } const t0 = Date.now(); let checked = quiet; let first = null; let moved = false; let last = ""; let steady = 0; const iv = setInterval(function() { const evs = ugfCalHarvest(); const sig = evs.map(function(e) { return e.id; }).join("|"); steady = sig === last ? steady + 1 : 0; if (first === null) { first = sig; } else if (sig !== first) { moved = true; } last = sig; // Google should now be on the wanted days. Whether its day marks can be // read at all is learnt the first time, when it is on the page's own day; // if it can be seen that it has not followed, it does not take being moved // like this, and the day is loaded properly instead const shown = ugfCalGoogleDays(); const onIt = !!(shown && (shown[ugfCalKey(r.from)] || shown[ugfCalKey(d)])); const late = Date.now() - t0 > 3000; if (onIt && ugfCalFetch.trust === undefined) { ugfCalFetch.trust = true; } else if (late && ugfCalFetch.trust === undefined) { ugfCalFetch.trust = false; } if (!checked && late) { checked = true; if (ugfCalFetch.trust && view !== "agenda" && !onIt) { clearInterval(iv); ugfCalFetch.stuck = true; try { sessionStorage.setItem("ugfCalStuck", "1"); } catch (e) {} window.location.assign(ugfCalUrl(view, d)); return; } } const ready = (boot ? !!shown || moved || late : quiet) || checked || (ugfCalFetch.trust ? onIt : ugfCalFetch.trust === false && moved); if ((steady >= 3 && ready) || Date.now() - t0 > 8000) { clearInterval(iv); const before = JSON.stringify(ugfCalEventsIn(r.from, r.days).map(function(e) { return e.id + e.title + e.start.getTime() + e.end.getTime(); })); ugfCalPut(evs.filter(function(e) { return e.end > r.from && e.start < ugfCalAdd(r.from, r.days); }), r.from, r.days); const cals = ugfCalHarvestCals(); if (cals.length) { const was = {}; ugfCalS().calendars.forEach(function(c) { was[c.name] = c.on; }); cals.forEach(function(c) { if (was[c.name] === false) { c.on = false; } }); ugfCalS().calendars = cals; } cb(before !== JSON.stringify(ugfCalEventsIn(r.from, r.days).map(function(e) { return e.id + e.title + e.start.getTime() + e.end.getTime(); }))); } }, 250); } // ---- making an event ------------------------------------------------------------ // Gplex has no way of its own to write to your calendar, so Google's own editor does // it, out of sight: it is opened in a hidden frame with everything filled in through // its address (the same fields Google's "add to calendar" links use), and its Save // is pressed. cb(ok) function ugfCalDateParam(d, allDay) { const p = function(n) { return String(n).padStart(2, "0"); }; return d.getFullYear() + p(d.getMonth() + 1) + p(d.getDate()) + (allDay ? "" : "T" + p(d.getHours()) + p(d.getMinutes()) + "00"); } function ugfCalEditUrl(ev) { let u = ugfCalBase() + "/eventedit?text=" + encodeURIComponent(ev.title || "") + "&dates=" + ugfCalDateParam(ev.start, ev.allDay) + "/" + ugfCalDateParam(ev.end, ev.allDay); if (ev.where) { u += "&location=" + encodeURIComponent(ev.where); } if (ev.details) { u += "&details=" + encodeURIComponent(ev.details); } if (ev.recur) { u += "&recur=" + encodeURIComponent(ev.recur); } return u; } // the words Google's Save button carries in the languages Gplex speaks function ugfCalSaveWords() { return ["save", "guardar", "speichern", "enregistrer", "salva", "salvar", "opslaan", "zapisz", "сохранить", "保存", "저장", "kaydet", "spara", "gem", "lagre", "tallenna", "uložit", "mentés", "salvează", "αποθήκευση", "שמירה", "حفظ", "simpan", "lưu", "บันทึก"]; } function ugfCalSeen(el) { if (!el || !el.getBoundingClientRect) { return false; } const r = el.getBoundingClientRect(); const cs = el.ownerDocument.defaultView.getComputedStyle(el); return r.width > 0 && r.height > 0 && cs.visibility !== "hidden" && cs.display !== "none"; } function ugfCalCreate(ev, cb) { const url = ugfCalEditUrl(ev); const old = document.getElementById("ugf-cal-saver"); if (old) { old.remove(); } const fr = document.createElement("iframe"); fr.id = "ugf-cal-saver"; fr.name = "ugf-cal-saver"; fr.setAttribute("aria-hidden", "true"); fr.setAttribute("tabindex", "-1"); fr.style.cssText = "position:fixed;left:-12000px;top:0;width:1280px;height:900px;opacity:0;pointer-events:none;border:0;z-index:-1;"; fr.src = url; document.body.appendChild(fr); const t0 = Date.now(); let clickedAt = 0; let clicks = 0; let done = false; const finish = function(ok) { if (done) { return; } done = true; clearInterval(iv); setTimeout(function() { fr.remove(); }, ok ? 1500 : 0); cb(ok); }; const words = ugfCalSaveWords(); const iv = setInterval(function() { let doc = null; let path = ""; try { doc = fr.contentDocument; path = fr.contentWindow.location.pathname || ""; } catch (e) { finish(false); return; } if (!doc || !doc.body) { if (Date.now() - t0 > 30000) { finish(false); } return; } // saved: Google has left its editor if (clickedAt && !/\/eventedit/.test(path)) { finish(true); return; } // the title, if the address did not put it there const titleIn = doc.querySelector("input[aria-label='Title'], input[placeholder='Add title']"); if (titleIn && ev.title && !titleIn.value) { try { const setter = Object.getOwnPropertyDescriptor(fr.contentWindow.HTMLInputElement.prototype, "value").set; setter.call(titleIn, ev.title); } catch (e) { titleIn.value = ev.title; } titleIn.dispatchEvent(new fr.contentWindow.Event("input", { bubbles: true })); titleIn.dispatchEvent(new fr.contentWindow.Event("change", { bubbles: true })); return; } // Save (again after a while, in case the first press came too early) if (!clickedAt || (Date.now() - clickedAt > 4000 && clicks < 3)) { const btns = Array.prototype.slice.call(doc.querySelectorAll("button, [role='button']")).filter(function(b) { const t = String(b.getAttribute("aria-label") || b.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); return words.indexOf(t) > -1 && ugfCalSeen(b) && !b.disabled && b.getAttribute("aria-disabled") !== "true"; }); if (btns.length) { btns[0].click(); clickedAt = Date.now(); clicks++; return; } } if (Date.now() - t0 > 35000) { finish(false); } }, 400); } // ---- changing or deleting an event ------------------------------------------------- // The same way: Google's editor for the event is opened out of sight as soon as you // choose to edit it, and read for what the bubble does not show (the description, // how it repeats). When you save, only what you changed is typed into Google's // fields and its Save pressed; deleting presses its Delete. Anything Google asks // on the way (which events of a repeating one, whether to email the guests) is // asked in the layout's own look through hooks.ask. // hooks.ready(info) the editor is open: info.details, info.repeat, info.where // hooks.ask(q, answer) q = { title, text, radios: [label], pick, buttons: [label] } // answer(radioIndex, buttonIndex) function ugfCalEditor(eid, hooks) { hooks = hooks || {}; const fr = document.createElement("iframe"); fr.className = "ugf-cal-editor"; fr.setAttribute("aria-hidden", "true"); fr.setAttribute("tabindex", "-1"); fr.style.cssText = "position:fixed;left:-12000px;top:0;width:1280px;height:900px;opacity:0;pointer-events:none;border:0;z-index:-1;"; fr.src = ugfCalBase() + "/eventedit/" + eid; document.body.appendChild(fr); const self = { ready: false, busy: false, gone: false, info: null }; const t0 = Date.now(); let queued = null; const W = function() { return fr.contentWindow; }; const D = function() { try { return fr.contentDocument; } catch (e) { return null; } }; const path = function() { try { return fr.contentWindow.location.pathname || ""; } catch (e) { return ""; } }; const one = function(sels) { const doc = D(); if (!doc) { return null; } for (let i = 0; i < sels.length; i++) { const all = doc.querySelectorAll(sels[i]); for (let j = 0; j < all.length; j++) { if (ugfCalSeen(all[j])) { return all[j]; } } } return null; }; const F = { title: ["input[aria-label='Title']", "input[placeholder='Add title']"], sd: ["input[aria-label='Start date']"], st: ["input[aria-label='Start time']"], et: ["input[aria-label='End time']"], ed: ["input[aria-label='End date']"], where: ["input[aria-label='Location']", "input[aria-label='Add location']", "input[placeholder='Add location']", "input[aria-label*='ocation']"], desc: ["[contenteditable='true'][aria-label='Description']", "[contenteditable='true'][aria-label*='escription']", "textarea[aria-label*='escription']", "[contenteditable='true'][aria-multiline='true']"], repeat: ["[aria-label^='Recurrence']", "[aria-label*='epeat'][role='combobox']", "[aria-label*='ecurrence'][role='combobox']"] }; const allDayBox = function() { const direct = one(["input[type='checkbox'][aria-label='All day']", "[role='checkbox'][aria-label='All day']"]); if (direct) { return direct; } const doc = D(); const lab = doc && Array.prototype.slice.call(doc.querySelectorAll("label")).filter(function(x) { return /^all day$/i.test((x.textContent || "").trim()); })[0]; if (!lab) { return null; } return lab.control || (lab.htmlFor && doc.getElementById(lab.htmlFor)) || lab.querySelector("input[type='checkbox']"); }; const isOn = function(box) { return box ? (box.checked === true || box.getAttribute("aria-checked") === "true") : false; }; // put text into one of Google's fields as typing would const type = function(el, text, commit) { const w = W(); try { el.focus(); } catch (e) {} let done = false; try { if (el.isContentEditable) { const sel = w.getSelection(); sel.selectAllChildren(el); done = text ? D().execCommand("insertText", false, text) : D().execCommand("delete", false, null); } else { el.select(); done = text ? D().execCommand("insertText", false, text) : D().execCommand("delete", false, null); } } catch (e) { done = false; } const now = el.isContentEditable ? (el.innerText || "").replace(/\n$/, "") : el.value; if (!done || now !== text) { if (el.isContentEditable) { el.textContent = text; } else { try { Object.getOwnPropertyDescriptor(el instanceof w.HTMLTextAreaElement ? w.HTMLTextAreaElement.prototype : w.HTMLInputElement.prototype, "value").set.call(el, text); } catch (e) { el.value = text; } } el.dispatchEvent(new w.Event("input", { bubbles: true })); } el.dispatchEvent(new w.Event("change", { bubbles: true })); if (commit) { ["keydown", "keyup"].forEach(function(k) { el.dispatchEvent(new w.KeyboardEvent(k, { key: "Enter", code: "Enter", keyCode: 13, which: 13, bubbles: true, cancelable: true })); }); try { el.blur(); } catch (e) {} el.dispatchEvent(new w.FocusEvent("focusout", { bubbles: true })); } }; // dates and times written the way the field already writes them const dateLike = function(was, d) { const mon = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; if (/^\s*\d{4}-\d{1,2}-\d{1,2}\s*$/.test(was)) { return d.getFullYear() + "-" + String(d.getMonth() + 1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0"); } if (/^\s*\d{1,2}\/\d{1,2}\/\d{2,4}\s*$/.test(was)) { return (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear(); } return mon[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear(); }; const timeLike = function(was, d) { const h = d.getHours(); const m = String(d.getMinutes()).padStart(2, "0"); if (was && !/[ap]\.?m/i.test(was) && /\d:\d\d/.test(was)) { return String(h).padStart(was.trim().length > 4 ? 2 : 1, "0") + ":" + m; } const ap = h < 12 ? "am" : "pm"; const t = ((h + 11) % 12 + 1) + ":" + m; if (/\s[AP]M/.test(was || "")) { return t + " " + ap.toUpperCase(); } if (/[AP]M/.test(was || "")) { return t + ap.toUpperCase(); } return t + (/\s[ap]m/.test(was || "") ? " " : "") + ap; }; let finishCb = null; let doneFlag = false; const finish = function(ok, why) { if (doneFlag) { return; } doneFlag = true; self.gone = true; clearInterval(iv); setTimeout(function() { fr.remove(); }, ok ? 1500 : 0); if (finishCb) { finishCb(ok, why); } else if (!ok && hooks.failed) { hooks.failed(why); } }; // Google's questions, asked again in Gplex's own dialog let asking = false; let answeredCancel = false; const dialogs = function() { const doc = D(); if (!doc || asking) { return false; } const dl = Array.prototype.slice.call(doc.querySelectorAll("[role='dialog'], [role='alertdialog']")).filter(function(x) { return ugfCalSeen(x) && !x.hasAttribute("data-ugf-asked") && x.querySelector("button, [role='button']") && !x.querySelector("input[aria-label='Title'], [aria-label='Start date']"); }).pop(); if (!dl) { return false; } dl.setAttribute("data-ugf-asked", "1"); const txt = function(x) { return String((x && (x.innerText || x.textContent)) || "").replace(/\s+/g, " ").trim(); }; const head = dl.querySelector("[role='heading'], h1, h2, h3"); const radios = Array.prototype.slice.call(dl.querySelectorAll("[role='radio'], input[type='radio']")).filter(function(r) { return r.tagName === "INPUT" || ugfCalSeen(r); }); const rlabel = function(r) { const lab = r.getAttribute("aria-label") || (r.labels && r.labels[0] && txt(r.labels[0])) || (r.id && txt(doc.querySelector("label[for='" + r.id + "']"))) || txt(r.closest("label")) || txt(r.parentElement); return lab; }; const buttons = Array.prototype.slice.call(dl.querySelectorAll("button, [role='button']")).filter(function(b) { return ugfCalSeen(b) && txt(b) && !b.closest("[role='radiogroup']") && radios.indexOf(b) < 0; }); if (!buttons.length) { return false; } let body = txt(dl); [head].concat(radios.map(function(r) { return { innerText: rlabel(r) }; }), buttons).forEach(function(x) { const t = txt(x); if (t) { body = body.replace(t, ""); } }); const q = { title: txt(head), text: body.replace(/\s+/g, " ").trim(), radios: radios.map(rlabel), pick: Math.max(0, radios.findIndex(isOn)), buttons: buttons.map(txt) }; if (!hooks.ask) { buttons[buttons.length - 1].click(); return true; } asking = true; hooks.ask(q, function(ri, bi) { asking = false; if (radios[ri]) { radios[ri].click(); } const b = buttons[bi] || buttons[buttons.length - 1]; if (/^(cancel|back|keep editing|continue editing)$/i.test(txt(b))) { answeredCancel = true; } setTimeout(function() { b.click(); }, radios[ri] ? 150 : 0); }); return true; }; // saving or deleting: wait for Google to leave its editor let pressedAt = 0; let presses = 0; let moreAt = 0; let job = null; const press = function() { const doc = D(); if (job.kind === "save") { const words = ugfCalSaveWords(); const b = Array.prototype.slice.call(doc.querySelectorAll("button, [role='button']")).filter(function(x) { const t = String(x.getAttribute("aria-label") || x.textContent || "").replace(/\s+/g, " ").trim().toLowerCase(); return words.indexOf(t) > -1 && ugfCalSeen(x) && !x.disabled && x.getAttribute("aria-disabled") !== "true"; })[0]; if (b) { b.click(); return true; } return false; } const del = one(["button[aria-label='Delete event']", "[role='button'][aria-label='Delete event']", "button[aria-label='Delete']", "[role='button'][aria-label='Delete']"]); if (del) { del.click(); return true; } const item = Array.prototype.slice.call(doc.querySelectorAll("[role='menuitem'], [role='option']")).filter(function(x) { return ugfCalSeen(x) && /^delete( event)?$/i.test((x.textContent || "").replace(/\s+/g, " ").trim()); })[0]; if (item) { item.click(); return true; } const more = one(["[aria-label='More actions']", "[aria-label='More options']", "[aria-label='Options']"]); if (more && Date.now() - moreAt > 2000) { moreAt = Date.now(); more.click(); } return false; }; const steps = []; let stepAt = 0; const iv = setInterval(function() { const doc = D(); const p = path(); if (!doc || !doc.body) { if (Date.now() - t0 > 30000) { finish(false, "load"); } return; } if (!self.ready) { if (one(F.title)) { self.ready = true; const d = one(F.desc); const r = one(F.repeat); const w = one(F.where); const dsc = d ? (d.isContentEditable ? d.innerText : d.value) : ""; self.info = { details: String(dsc || "").replace(/\n$/, ""), repeat: r ? String(r.textContent || r.value || "").replace(/\s+/g, " ").trim() : "", where: w ? w.value : "", allDay: isOn(allDayBox()), canDelete: true }; if (hooks.ready) { hooks.ready(self.info); } if (queued) { const q = queued; queued = null; q(); } } else if (Date.now() - t0 > 30000) { finish(false, "load"); } return; } if (!job) { return; } // typing, one field at a time if (steps.length) { if (Date.now() - stepAt > 250) { stepAt = Date.now(); steps.shift()(); } return; } if (pressedAt && !/\/eventedit/.test(p)) { finish(true); return; } if (dialogs() || asking) { return; } if (answeredCancel) { answeredCancel = false; job = null; pressedAt = 0; presses = 0; self.busy = false; if (finishCb) { const cb = finishCb; finishCb = null; cb(false, "cancel"); } return; } if (!pressedAt || (Date.now() - pressedAt > 4000 && presses < 4)) { if (press()) { pressedAt = Date.now(); presses++; } } if (Date.now() - job.at > 45000) { finish(false, "stuck"); } }, 200); // ch: what changed { title, where, details, allDay, start, end } (only those present) self.save = function(ch, cb) { if (self.gone) { cb(false, "gone"); return; } if (!self.ready) { queued = function() { self.save(ch, cb); }; return; } self.busy = true; finishCb = cb; const put = function(key, val, commit) { steps.push(function() { const el = one(F[key]); if (el) { type(el, val(el), commit); } }); }; if (ch.title !== undefined) { put("title", function() { return ch.title; }, false); } if (ch.allDay !== undefined) { steps.push(function() { const box = allDayBox(); if (box && isOn(box) !== ch.allDay) { box.click(); } }); } if (ch.start) { const ad = ch.allDay !== undefined ? ch.allDay : self.info.allDay; const lastDay = ad ? ugfCalAdd(ugfCalDay(ch.end), -1) : ch.end; put("sd", function(el) { return dateLike(el.value, ch.start); }, true); if (!ad) { put("st", function(el) { return timeLike(el.value, ch.start); }, true); } put("ed", function(el) { return dateLike(el.value, lastDay); }, true); if (!ad) { put("et", function(el) { return timeLike(el.value, ch.end); }, true); } } if (ch.where !== undefined) { put("where", function() { return ch.where; }, false); } if (ch.details !== undefined) { put("desc", function() { return ch.details; }, false); } steps.push(function() {}); job = { kind: "save", at: Date.now() }; pressedAt = 0; presses = 0; }; self.del = function(cb) { if (self.gone) { cb(false, "gone"); return; } if (!self.ready) { queued = function() { self.del(cb); }; return; } self.busy = true; finishCb = cb; job = { kind: "del", at: Date.now() }; pressedAt = 0; presses = 0; }; self.close = function() { if (!self.busy && !self.gone) { self.gone = true; clearInterval(iv); fr.remove(); } }; self.url = fr.src; return self; } // ---- views -------------------------------------------------------------------- // Lay a day's timed events out side by side where they overlap, as Calendar does: // each gets a column within its cluster of overlapping events. function ugfCalColumns(evs) { const out = []; let cluster = []; let clusterEnd = 0; const flush = function() { const cols = []; cluster.forEach(function(o) { let c = 0; while (cols[c] && cols[c] > o.s) { c++; } cols[c] = o.e; o.col = c; }); cluster.forEach(function(o) { o.cols = cols.length; out.push(o); }); cluster = []; }; evs.forEach(function(o) { if (cluster.length && o.s >= clusterEnd) { flush(); clusterEnd = 0; } cluster.push(o); clusterEnd = Math.max(clusterEnd, o.e); }); if (cluster.length) { flush(); } return out; } function ugfCalMain() { const era = ugfCalEra(); const A = ugfCalArt(); const esc = ugfCalEsc; const classic = ugfCalClassic(era); const material = !classic; const l = String(layout || ""); const url = ugfCalParseUrl(); const st = { view: url.view || "week", date: url.date, first: 0 }; console.log("[Gplex] Calendar: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); const style = document.createElement("style"); style.id = "ugf-cal-styles"; style.textContent = ugfCalCss(era); (document.head || document.documentElement).appendChild(style); document.documentElement.setAttribute("gplex-cal", era); ugfCalSetFavicon(era); document.title = "Google Calendar"; const shell = document.createElement("div"); shell.id = "ugf-cal"; shell.setAttribute("era", era); shell.setAttribute("layout", l); // ---- the frame: bar, header, side column, toolbar let head = ""; if (era === "c2006" || era === "c2010") { const beta = ["2009", "2010", "2010N"].indexOf(l) === -1; head = ugfCalGbar(era) + '
" + '
'; } else if (classic) { head = ugfCalGbar(era) + '
" + '' + ugfCalAccount(era) + "
"; } else { head = '"; } // the toolbar over the calendar (2006-2017; the Material pages have it in the header) let bar = ""; const views = era === "c2006" ? [["day", "Day"], ["week", "Week"], ["month", "Month"], ["4day", "Next 4 Days"], ["agenda", "Agenda"]] : [["day", "Day"], ["week", "Week"], ["month", "Month"], ["4day", "4 Days"], ["agenda", "Agenda"]]; const viewBtns = views.map(function(v) { return '' + v[1] + ""; }).join(""); if (era === "c2006") { bar = '
' + '
"; } else if (era === "c2010") { bar = '
' + viewBtns + "
"; } else if (classic) { bar = '"; } // the side column let side = ""; if (era === "c2006") { side = ''; } else if (era === "c2010") { side = ''; } else if (classic) { side = '
Calendar
'; } else if (era !== "c2017") { side = 'Create'; } side += '
'; shell.innerHTML = trusted_policy.createHTML(head + '
' + side + "
" + '
' + bar + '
' + (era === "c2017" ? '' + ugfCalIcon("add", 24) + "" : "") + '
Loading...
'); document.body.appendChild(shell); // ---- the view picker of the Material pages const viewSel = shell.querySelector(".viewsel"); if (viewSel) { viewSel.innerHTML = trusted_policy.createHTML('' + ugfCalIcon("arrow_drop_down", 20) + "" + '
' + [["day", "Day", "D"], ["week", "Week", "W"], ["month", "Month", "M"], ["agenda", "Schedule", "A"], ["4day", "4 days", "X"]].map(function(v) { return '' + v[1] + "" + v[2] + ""; }).join("") + "
"); viewSel.querySelector(".vs").addEventListener("click", function(ev) { ev.preventDefault(); viewSel.classList.toggle("open"); }); document.addEventListener("click", function(ev) { if (!viewSel.contains(ev.target)) { viewSel.classList.remove("open"); } }); } const view = shell.querySelector("#ugf-cal-view"); const loading = shell.querySelector("#ugf-cal-loading"); // ---- titles const rangeTitle = function() { const r = ugfCalRange(st.view, st.date, st.first); const a = r.from; const b = ugfCalAdd(r.from, r.days - 1); if (st.view === "month") { return ugfCalMon(st.date) + " " + st.date.getFullYear(); } if (st.view === "day") { if (material) { return ugfCalMon(a) + " " + a.getDate() + ", " + a.getFullYear(); } return ugfCalDow(a) + ", " + ugfCalMon(a) + " " + a.getDate() + ", " + a.getFullYear(); } if (material) { // Material: the month (or months) the range falls in if (a.getMonth() === b.getMonth()) { return ugfCalMon(a) + " " + a.getFullYear(); } if (a.getFullYear() === b.getFullYear()) { return ugfCalMon(a, 3) + " – " + ugfCalMon(b, 3) + " " + b.getFullYear(); } return ugfCalMon(a, 3) + " " + a.getFullYear() + " – " + ugfCalMon(b, 3) + " " + b.getFullYear(); } if (era === "c2011" || era === "c2013") { if (a.getMonth() === b.getMonth()) { return ugfCalMon(a, 3) + " " + a.getDate() + " – " + b.getDate() + ", " + b.getFullYear(); } return ugfCalMon(a, 3) + " " + a.getDate() + " – " + ugfCalMon(b, 3) + " " + b.getDate() + ", " + b.getFullYear(); } if (a.getMonth() === b.getMonth()) { return ugfCalMon(a) + " " + a.getDate() + " – " + b.getDate() + " " + b.getFullYear(); } return ugfCalMon(a, 3) + " " + a.getDate() + " – " + ugfCalMon(b, 3) + " " + b.getDate() + " " + b.getFullYear(); }; const paintBar = function() { shell.querySelectorAll(".title").forEach(function(t) { t.textContent = rangeTitle(); }); shell.querySelectorAll("[data-view]").forEach(function(a) { a.classList.toggle("on", a.getAttribute("data-view") === st.view); }); const vs = shell.querySelector(".viewsel .vs span"); if (vs) { vs.textContent = { day: "Day", week: "Week", month: "Month", agenda: "Schedule", "4day": "4 days" }[st.view]; } document.title = material ? "Google Calendar - " + rangeTitle() : "Google Calendar"; }; // ---- the small month let miniMonth = new Date(st.date.getFullYear(), st.date.getMonth(), 1); const paintMini = function() { const box = shell.querySelector("#ugf-cal-mini"); const r = ugfCalRange(st.view, st.date, st.first); const a = ugfCalWeekStart(miniMonth, st.first); const today = new Date(); const dows = []; for (let i = 0; i < 7; i++) { const d = ugfCalAdd(a, i); dows.push(classic ? ugfCalDow(d, era === "c2006" || era === "c2010" ? 2 : 1).slice(0, era === "c2006" || era === "c2010" ? 2 : 1) : ugfCalDow(d, 1)); } let h = '
' + (era === "c2006" || era === "c2010" ? '«' + ugfCalMon(miniMonth) + " " + miniMonth.getFullYear() + '»' : '' + ugfCalMon(miniMonth) + " " + miniMonth.getFullYear() + "" + '' + (material ? ugfCalIcon("chevron_left", 18) : "‹") + "" + '' + (material ? ugfCalIcon("chevron_right", 18) : "›") + "") + '
' + dows.map(function(x) { return ""; }).join("") + ""; for (let w = 0; w < 6; w++) { h += ""; for (let i = 0; i < 7; i++) { const d = ugfCalAdd(a, w * 7 + i); const inView = d >= r.from && d < ugfCalAdd(r.from, r.days) && st.view !== "agenda"; const cls = [d.getMonth() !== miniMonth.getMonth() ? "out" : "", ugfCalSame(d, today) ? "today" : "", inView ? "sel" : "", ugfCalSame(d, st.date) ? "cur" : ""].filter(Boolean).join(" "); h += '"; } h += ""; } box.innerHTML = trusted_policy.createHTML(h + "
" + esc(x) + "
' + d.getDate() + "
"); box.querySelectorAll("[data-mini]").forEach(function(x) { x.addEventListener("click", function(ev) { ev.preventDefault(); miniMonth = new Date(miniMonth.getFullYear(), miniMonth.getMonth() + parseInt(x.getAttribute("data-mini"), 10), 1); paintMini(); }); }); box.querySelectorAll("td[data-d]").forEach(function(td) { td.addEventListener("click", function() { const p = td.getAttribute("data-d").split("-"); go(st.view === "agenda" ? "day" : st.view, new Date(+p[0], +p[1] - 1, +p[2])); }); }); }; // ---- your calendars const paintCals = function() { const box = shell.querySelector("#ugf-cal-cals"); const cals = ugfCalS().calendars; const mine = cals.filter(function(c) { return c.mine !== false; }); const other = cals.filter(function(c) { return c.mine === false; }); const item = function(c) { const p = ugfCalPaint(ugfCalColorFor(c.name, c.color), era); const off = c.on === false; if (material) { return '' + (off ? "" : ugfCalIcon("check", 14)) + '' + esc(c.name) + '' + ugfCalIcon("more_vert", 20) + ""; } if (era === "c2011" || era === "c2013") { return '' + esc(c.name) + '▾'; } // 2006-2011: the name on a bar of its colour return '' + esc(c.name) + '▼'; }; let h = ""; const sect = function(title, list, foot, add) { if (material) { return '
' + title + "" + (add ? '' + ugfCalIcon("add", 20) + "" : "") + ugfCalIcon("expand_less", 20) + "
" + list.map(item).join("") + "
"; } return '
' + (era === "c2006" || era === "c2010" ? "▼" : '▾') + title + "
" + (add ? '
' : "") + '
' + list.map(item).join("") + '
' + foot + "
"; }; if (material) { h = '
' + (era === "c2017" ? '' + ugfCalIcon("add", 20) + "" : "") + "
"; } h += sect(era === "c2006" ? "My Calendars" : "My calendars", mine, era === "c2006" || era === "c2010" ? 'SettingsCreate' : 'Add | Settings', false); h += sect(era === "c2006" ? "Other Calendars" : "Other calendars", other, era === "c2006" || era === "c2010" ? 'Add ▼Settings' : 'Add | Settings', true); box.innerHTML = trusted_policy.createHTML(h); box.querySelectorAll("[data-cm]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); calListMenu(a, a.getAttribute("data-cm")); }); }); box.querySelectorAll("a.cal").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const name = a.getAttribute("data-cal"); const opt = ev.target.closest(".dd, .opt"); if (opt) { ev.stopPropagation(); calMenu(opt, name); return; } ugfCalS().calendars.forEach(function(c) { if (c.name === name) { c.on = c.on === false; } }); paintCals(); paintView(); }); }); }; // ---- the calendar itself let bubble = null; const closeBubble = function() { if (bubble) { bubble.remove(); bubble = null; } }; const evClass = function(ev) { return ugfCalPaint(ugfCalColorFor(ev.cal, ev.color), era); }; const timeText = function(ev) { if (ev.allDay) { return ""; } return ugfCalTime(ev.start) + (material ? " – " : " – ") + ugfCalTime(ev.end); }; const chip = function(ev, mode) { // mode: "month" (a line in a month cell), "allday" (a bar), "timed" (a block in the day grid) const p = evClass(ev); const t = esc(ev.title || "(No title)"); if (mode === "timed") { if (ev.end - ev.start < 45 * 6e4) { // too short for two lines: the title and the time on one return '
' + (material ? "" + t + ", " + esc(ugfCalTime(ev.start)) : esc(ugfCalTime(ev.start)) + " " + t) + "
"; } if (era === "c2006" || era === "c2010") { return '
' + '
' + esc(ugfCalTime(ev.start) + " – " + ugfCalTime(ev.end)) + "
" + '
' + t + "
"; } if (classic) { return '
' + '
' + esc(ugfCalTime(ev.start) + " – " + ugfCalTime(ev.end)) + "
" + '
' + t + "
"; } return '
' + '
' + t + '
' + esc(ugfCalTime(ev.start) + " – " + ugfCalTime(ev.end)) + "
"; } if (mode === "allday" || ev.allDay || (ev.end - ev.start) >= 864e5) { return '
' + t + "
"; } // a timed event in a month cell if (material) { return '
' + '' + esc(ugfCalTime(ev.start, "gm2")) + " " + t + "
"; } return '
' + esc(ugfCalTime(ev.start, "short")) + " " + t + "
"; }; // the day grid: day, week and 4 days // the height of an hour, by display density (Comfortable, Cozy, Compact in 2011-2017; // Responsive or Compact on the Material pages) let HOUR = 42; const setDensity = function() { const d = ugfCalPrefs().density; if (material) { HOUR = d === "compact" ? 40 : 48; } else if (era === "c2011" || era === "c2013") { HOUR = d === "compact" ? 30 : (d === "cozy" ? 36 : 42); } else { HOUR = 42; } shell.classList.toggle("dens-cozy", !material && d === "cozy"); shell.classList.toggle("dens-compact", d === "compact"); }; setDensity(); let scrollKept = null; const paintGrid = function(from, days) { const today = new Date(); const evs = ugfCalEventsIn(from, days); const allday = evs.filter(function(e) { return e.allDay || (e.end - e.start) >= 864e5; }); // the all-day row: bars that can run across days const rows = []; allday.forEach(function(e) { const a = Math.max(0, Math.round((ugfCalDay(e.start) - from) / 864e5)); const endDay = e.allDay ? ugfCalAdd(ugfCalDay(e.end), 0) : ugfCalAdd(ugfCalDay(e.end), 1); const b = Math.min(days, Math.max(a + 1, Math.round((endDay - from) / 864e5))); let r = 0; while (rows[r] && rows[r].some(function(x) { return x.a < b && a < x.b; })) { r++; } (rows[r] = rows[r] || []).push({ a: a, b: b, e: e }); }); let h = '
' + (material ? 'GMT' + (function() { const o = -new Date().getTimezoneOffset(); return (o >= 0 ? "+" : "-") + String(Math.floor(Math.abs(o) / 60)).padStart(2, "0") + (o % 60 ? ":" + String(Math.abs(o) % 60).padStart(2, "0") : ""); })() + "" : "") + "
"; for (let i = 0; i < days; i++) { const d = ugfCalAdd(from, i); const isToday = ugfCalSame(d, today); let label; if (material) { label = '' + (era === "c2017" ? ugfCalDow(d, 3) : ugfCalDow(d, 3).toUpperCase()) + '' + d.getDate() + ""; } else if (days === 1) { label = '' + ugfCalDow(d) + " " + (d.getMonth() + 1) + "/" + d.getDate() + ""; } else { label = '' + ugfCalDow(d, 3) + " " + (d.getMonth() + 1) + "/" + d.getDate() + ""; } h += '
' + label + "
"; } h += '
'; for (let i = 0; i < days; i++) { h += '
'; } rows.forEach(function(r, ri) { r.forEach(function(x) { h += '
' + chip(x.e, "allday") + "
"; }); }); h += '
'; for (let hr = 0; hr < 24; hr++) { h += '
' + (hr === 0 && material ? "" : ugfCalHourLabel(hr, era)) + "
"; } h += '
'; for (let hr = 0; hr < 24; hr++) { h += '
' + (classic ? '
' : ""); } for (let i = 0; i < days; i++) { const d = ugfCalAdd(from, i); const next = ugfCalAdd(d, 1); const isToday = ugfCalSame(d, today); h += '
'; const timed = evs.filter(function(e) { return !(e.allDay || (e.end - e.start) >= 864e5) && e.start < next && e.end > d; }).map(function(e) { const s = Math.max(0, (e.start - d) / 6e4); const en = Math.min(1440, (e.end - d) / 6e4); return { ev: e, s: s, e: Math.max(en, s + 15) }; }); ugfCalColumns(timed).forEach(function(o) { const w = 100 / o.cols; h += '
' + chip(o.ev, "timed") + "
"; }); if (isToday && !(era === "c2006" || era === "c2010")) { const nowM = (today - d) / 6e4; h += '
'; } h += "
"; } h += "
"; view.innerHTML = trusted_policy.createHTML(h); const body = view.querySelector(".gbody"); const sw = body.offsetWidth - body.clientWidth; view.querySelectorAll(".sbar").forEach(function(sb) { sb.style.width = sw + "px"; }); body.scrollTop = scrollKept !== null ? scrollKept : 7 * HOUR - (material ? 10 : 4); body.addEventListener("scroll", function() { scrollKept = body.scrollTop; }); // a click in an empty slot: a new event there view.querySelectorAll(".col").forEach(function(col) { col.addEventListener("click", function(ev) { if (ev.target.closest(".ev")) { return; } const r = col.getBoundingClientRect(); const mins = Math.floor((ev.clientY - r.top) / HOUR * 2) * 30; const p = col.getAttribute("data-day").split("-"); const s = new Date(+p[0], +p[1] - 1, +p[2], 0, mins); quickBubble(ev.clientX, ev.clientY, s, new Date(s.getTime() + 36e5), false); }); }); }; const paintMonth = function() { const r = ugfCalRange("month", st.date, st.first); const weeks = r.days / 7; const evs = ugfCalEventsIn(r.from, r.days); const today = new Date(); let h = '
'; for (let i = 0; i < 7; i++) { const d = ugfCalAdd(r.from, i); h += "
" + (material ? (era === "c2017" ? ugfCalDow(d, 3) : ugfCalDow(d, 3).toUpperCase()) : ugfCalDow(d, 3)) + "
"; } h += "
"; // as many chips as the cell has room for, the way Google fits them const cellH = ((view.clientHeight || 600) - 24) / weeks; const per = Math.max(2, Math.floor((cellH - (material ? 26 : 20)) / (material ? 20 : 16))); for (let w = 0; w < weeks; w++) { h += '
'; for (let i = 0; i < 7; i++) { const d = ugfCalAdd(r.from, w * 7 + i); const next = ugfCalAdd(d, 1); const list = evs.filter(function(e) { return e.start < next && e.end > d; }); const cls = [d.getMonth() !== st.date.getMonth() ? "out" : "", ugfCalSame(d, today) ? "today" : ""].filter(Boolean).join(" "); let num = d.getDate(); if (d.getDate() === 1 && !material) { num = ugfCalMon(d, 3) + " 1"; } h += '
' + (material && d.getDate() === 1 ? ugfCalMon(d, 3) + " 1" : num) + ""; list.slice(0, list.length > per ? per - 1 : per).forEach(function(e) { h += chip(e, "month"); }); if (list.length > per) { h += '' + (material ? (list.length - per + 1) + " more" : "+" + (list.length - per + 1) + " more") + ""; } h += "
"; } h += "
"; } view.innerHTML = trusted_policy.createHTML(h + "
"); view.querySelectorAll(".mc").forEach(function(c) { c.addEventListener("click", function(ev) { if (ev.target.closest(".ev, a")) { return; } const p = c.getAttribute("data-day").split("-"); const s = new Date(+p[0], +p[1] - 1, +p[2]); quickBubble(ev.clientX, ev.clientY, s, ugfCalAdd(s, 1), true); }); }); }; const paintAgenda = function() { const from = ugfCalDay(st.date); const evs = ugfCalEventsIn(from, 30); const today = new Date(); let h = '
'; let any = false; for (let i = 0; i < 30; i++) { const d = ugfCalAdd(from, i); const next = ugfCalAdd(d, 1); const list = evs.filter(function(e) { return e.start < next && e.end > d; }); if (!list.length) { continue; } any = true; h += '
' + (material ? '' + d.getDate() + '' + ugfCalMon(d, 3).toUpperCase() + ", " + ugfCalDow(d, 3).toUpperCase() + "" : ugfCalDow(d, 3) + " " + ugfCalMon(d, 3) + " " + d.getDate()) + '
'; list.forEach(function(e) { const p = evClass(e); h += '
' + (e.allDay ? (material ? "All day" : "All day") : esc(ugfCalTime(e.start) + (material ? " – " + ugfCalTime(e.end) : ""))) + "" + '' + esc(e.title || "(No title)") + "
"; }); h += "
"; } if (!any) { h += '
' + (material ? "Nothing planned" : "No events") + "
"; } view.innerHTML = trusted_policy.createHTML(h + "
"); }; const paintView = function() { closeBubble(); const r = ugfCalRange(st.view, st.date, st.first); view.setAttribute("data-view", st.view); if (st.view === "month") { paintMonth(); } else if (st.view === "agenda") { paintAgenda(); } else { paintGrid(r.from, r.days); } view.querySelectorAll(".ev[data-id]").forEach(function(el) { el.addEventListener("click", function(ev) { ev.stopPropagation(); const e = ugfCalS().events[el.getAttribute("data-id")]; if (e) { eventBubble(el, e); } }); }); view.querySelectorAll("a[data-day]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); const p = a.getAttribute("data-day").split("-"); go("day", new Date(+p[0], +p[1] - 1, +p[2])); }); }); }; // ---- bubbles: an event, and a new one const placeBubble = function(b, x, y) { shell.appendChild(b); const w = b.offsetWidth; const hh = b.offsetHeight; let left = x - w / 2; let top = y - hh - 14; b.classList.remove("below"); if (top < 60) { top = y + 14; b.classList.add("below"); } left = Math.max(8, Math.min(window.innerWidth - w - 8, left)); b.style.left = left + "px"; b.style.top = top + "px"; const tail = b.querySelector(".tail"); if (tail) { tail.style.left = Math.max(14, Math.min(w - 30, x - left - 8)) + "px"; } }; const whenText = function(e) { const d = e.start; if (e.allDay) { const last = ugfCalAdd(ugfCalDay(e.end), -1); return ugfCalDow(d, 3) + ", " + ugfCalMon(d, 3) + " " + d.getDate() + (ugfCalSame(d, last) ? "" : " – " + ugfCalDow(last, 3) + ", " + ugfCalMon(last, 3) + " " + last.getDate()); } return ugfCalDow(d, 3) + ", " + ugfCalMon(d, 3) + " " + d.getDate() + ", " + ugfCalTime(e.start) + " – " + ugfCalTime(e.end); }; const editUrl = function(e) { return e.eid ? ugfCalBase() + "/eventedit/" + e.eid : ugfCalBase() + "/eventedit"; }; // events on calendars you only look at (holidays, others' calendars) cannot be changed const canEdit = function(e) { if (!e.eid || e.pending) { return false; } const c = ugfCalS().calendars.filter(function(x) { return x.name === e.cal; })[0]; return !(c && c.mine === false); }; const eventBubble = function(el, e) { closeBubble(); const p = evClass(e); const b = document.createElement("div"); b.className = "ugf-cal-bubble ev-b"; const ok = canEdit(e); let h; if (material) { h = '" + '
' + esc(e.title || "(No title)") + "
" + '
' + esc(whenText(e)) + "
" + (e.where ? '
' + ugfCalIcon("place", 20) + "
" + esc(e.where) + "
" : "") + (e.cal ? '
' + ugfCalIcon("event", 20) + "
" + esc(e.cal) + "
" : ""); } else { h = '' + (classic && era !== "c2006" && era !== "c2010" ? "×" : 'Close') + "" + '
' + esc(e.title || "(No title)") + "
" + '
' + esc(whenText(e)) + "
" + (e.where ? '
' + esc(e.where) + "
" : "") + (e.cal ? '
Calendar: ' + esc(e.cal) + "
" : "") + (ok ? '
' + (era === "c2006" || era === "c2010" ? 'delete|edit event details »' : 'Delete|Edit event »') + "
" : "") + ''; } b.innerHTML = trusted_policy.createHTML(h); const r = el.getBoundingClientRect(); placeBubble(b, r.left + Math.min(r.width / 2, 60), r.top + (material ? r.height / 2 : 0)); bubble = b; b.querySelector(".x").addEventListener("click", function(ev) { ev.preventDefault(); closeBubble(); }); if (ok) { b.querySelector(".ed").addEventListener("click", function(ev) { ev.preventDefault(); editPage({ edit: e, title: e.title, start: e.start, end: e.end, allDay: e.allDay, where: e.where }); }); b.querySelector(".dl").addEventListener("click", function(ev) { ev.preventDefault(); closeBubble(); removeEvent(e, null); }); } }; const quickBubble = function(x, y, s, e, allDay) { closeBubble(); const b = document.createElement("div"); b.className = "ugf-cal-bubble new-b"; const when = allDay ? ugfCalDow(s, 3) + ", " + ugfCalMon(s, 3) + " " + s.getDate() : ugfCalDow(s, 3) + ", " + ugfCalMon(s, 3) + " " + s.getDate() + ", " + ugfCalTime(s) + " – " + ugfCalTime(e); b.innerHTML = trusted_policy.createHTML(material ? '' + ugfCalIcon("close", 20) + "" + '' + '
' + esc(when) + "
" + '' : '' + (era === "c2006" || era === "c2010" ? 'Close' : "×") + "" + '
When: ' + esc(when) + "
" + '
What:
' + '" + ''); placeBubble(b, x, y); bubble = b; const what = b.querySelector(".what"); what.focus(); // made through Google's own editor, out of sight (see ugfCalCreate) const open = function() { closeBubble(); saveNew({ title: what.value.trim(), start: s, end: e, allDay: allDay }); }; const more = function() { editPage({ title: what.value.trim(), start: s, end: e, allDay: allDay }); }; b.querySelector(".save").addEventListener("click", function(ev) { ev.preventDefault(); open(); }); b.querySelector(".more").addEventListener("click", function(ev) { ev.preventDefault(); more(); }); what.addEventListener("keydown", function(ev) { if (ev.key === "Enter") { open(); } else if (ev.key === "Escape") { closeBubble(); } }); b.querySelector(".x").addEventListener("click", function(ev) { ev.preventDefault(); closeBubble(); }); }; document.addEventListener("mousedown", function(ev) { if (bubble && !bubble.contains(ev.target) && !ev.target.closest(".ev, .col, .mc")) { closeBubble(); } }); // ---- going places const paint = function() { paintBar(); paintMini(); paintCals(); paintView(); }; let loadSeq = 0; const load = function() { const seq = ++loadSeq; const r = ugfCalRange(st.view, st.date, st.first); const cached = ugfCalHave(r.from, r.days); shell.classList.toggle("busy", !cached); ugfCalFetch(st.view, st.date, r, function(ok) { if (seq !== loadSeq) { return; } shell.classList.remove("busy"); paintCals(); paintView(); }); }; const go = function(v, d, replace) { st.view = v; st.date = ugfCalDay(d); miniMonth = new Date(st.date.getFullYear(), st.date.getMonth(), 1); scrollKept = null; try { history[replace ? "replaceState" : "pushState"]({ ugfCal: 1 }, "", ugfCalUrl(st.view, st.date)); } catch (e) {} paint(); load(); }; // ---- making events, here rather than in today's Calendar ------------------- // a notice over the calendar: yellow on the older pages, a dark toast on Material let noteTimer = 0; const note = function(html, stay) { let n = shell.querySelector("#ugf-cal-note"); if (!n) { n = document.createElement("div"); n.id = "ugf-cal-note"; shell.appendChild(n); } n.innerHTML = trusted_policy.createHTML(html); n.style.display = html ? "" : "none"; clearTimeout(noteTimer); if (html && !stay) { noteTimer = setTimeout(function() { n.style.display = "none"; }, 8000); } }; const saveNew = function(ev) { const id = "new-" + Date.now(); const primary = ugfCalS().calendars.filter(function(c) { return c.mine !== false; })[0]; const made = { id: id, eid: "", title: ev.title || "(No title)", start: ev.start, end: ev.end, allDay: !!ev.allDay, color: primary ? primary.color : "#039be5", cal: primary ? primary.name : "", where: ev.where || "", pending: Date.now() }; ugfCalS().events[id] = made; paintView(); note(material ? "Saving…" : "Saving...", true); ugfCalCreate(ev, function(ok) { if (!ok) { delete ugfCalS().events[id]; paintView(); note((material ? "Couldn't save the event. " : "Sorry, your event could not be saved. ") + '' + (material ? "Open in Calendar" : "Try again in Google Calendar") + "", true); return; } note(material ? "Event saved" : "Your event was created."); // Google's page under ours takes the new event in shortly [1500, 5000, 12000].forEach(function(ms) { setTimeout(function() { ugfCalFetch(st.view, st.date, ugfCalRange(st.view, st.date, st.first), function(changed) { if (changed) { paintCals(); paintView(); } }, true); }, ms); }); }); }; const refetch = function() { [1500, 5000, 12000].forEach(function(ms) { setTimeout(function() { ugfCalFetch(st.view, st.date, ugfCalRange(st.view, st.date, st.first), function(changed) { if (changed) { paintCals(); paintView(); } }, true); }, ms); }); }; // Google's questions on the way (which events of a repeating one, whether to // email the guests), asked in the look of the period. answer(radio, button) const ask = function(qn, answer) { const old = shell.querySelector(".ugf-cal-askfence"); if (old) { old.remove(); } note(""); const fence = document.createElement("div"); fence.className = "ugf-cal-askfence"; const last = qn.buttons.length - 1; fence.innerHTML = trusted_policy.createHTML('"); shell.appendChild(fence); const pick = function(bi) { const r = fence.querySelector("input[type=radio]:checked"); fence.remove(); answer(r ? +r.value : -1, bi); }; fence.querySelectorAll(".ab button").forEach(function(b) { b.addEventListener("click", function() { pick(+b.getAttribute("data-i")); }); }); fence.addEventListener("keydown", function(ev) { if (ev.key === "Escape") { const c = qn.buttons.findIndex(function(b) { return /cancel|back/i.test(b); }); pick(c > -1 ? c : last); } ev.stopPropagation(); }); const pri = fence.querySelector(".ab .pri"); if (pri) { pri.focus(); } }; // saving changes to an event, shown at once and made in Google's editor const saveEdit = function(e, ch, sess) { const was = { title: e.title, start: e.start, end: e.end, allDay: e.allDay, where: e.where, pending: e.pending }; if (ch.title !== undefined) { e.title = ch.title || "(No title)"; } if (ch.where !== undefined) { e.where = ch.where; } if (ch.start) { e.start = ch.start; e.end = ch.end; } if (ch.allDay !== undefined) { e.allDay = ch.allDay; } e.pending = Date.now(); paintView(); note(material ? "Saving…" : "Saving...", true); sess.save(ch, function(ok, why) { if (!ok) { Object.keys(was).forEach(function(k) { e[k] = was[k]; }); paintView(); if (why === "cancel") { note(""); sess.close(); return; } note((material ? "Couldn't save the event. " : "Sorry, your changes could not be saved. ") + '' + (material ? "Open in Calendar" : "Try again in Google Calendar") + "", true); return; } note(material ? "Event saved" : "Your event was saved."); refetch(); }); }; // deleting an event: gone at once, deleted in Google's editor const removeEvent = function(e, sess) { sess = sess || ugfCalEditor(e.eid, { ask: ask }); const gone = ugfCalS().gone = ugfCalS().gone || {}; const keep = {}; Object.keys(ugfCalS().events).forEach(function(id) { if (ugfCalS().events[id].eid === e.eid) { keep[id] = ugfCalS().events[id]; delete ugfCalS().events[id]; } }); gone[e.eid] = Date.now(); paintView(); note(material ? "Deleting…" : "Deleting...", true); sess.del(function(ok, why) { if (!ok) { delete gone[e.eid]; Object.keys(keep).forEach(function(id) { ugfCalS().events[id] = keep[id]; }); paintView(); if (why === "cancel") { note(""); sess.close(); return; } note((material ? "Couldn't delete the event. " : "Sorry, the event could not be deleted. ") + '' + (material ? "Open in Calendar" : "Try again in Google Calendar") + "", true); return; } note(material ? "Event deleted" : "The event was deleted."); gone[e.eid] = Date.now(); refetch(); }); }; // the event details page, as each period had it const fmtDate = function(d) { return material ? ugfCalMon(d, 3) + " " + d.getDate() + ", " + d.getFullYear() : (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear(); }; const fmtTime = function(d) { return ugfCalTime(d, "gm2").replace(/^(\d+)(am|pm)$/, "$1:00$2"); }; const parseDate = function(t) { t = String(t || "").trim(); let m = t.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/); if (m) { return new Date(+m[3] < 100 ? 2000 + +m[3] : +m[3], +m[1] - 1, +m[2]); } m = t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/); if (m) { return new Date(+m[1], +m[2] - 1, +m[3]); } return ugfCalParseDateText(t.replace(/^[A-Za-z]+,\s*/, ""), new Date().getFullYear()); }; const editPage = function(pre) { closeBubble(); closeMenu(); note(""); const old = shell.querySelector("#ugf-cal-edit"); if (old) { old.remove(); } pre = pre || {}; const editing = pre.edit || null; let s0 = pre.start; if (!s0) { s0 = new Date(st.date.getFullYear(), st.date.getMonth(), st.date.getDate(), new Date().getHours() + 1, 0); } const e0 = pre.end || new Date(s0.getTime() + 36e5); const allDay = !!pre.allDay; const primary = ugfCalS().calendars.filter(function(c) { return c.mine !== false; })[0]; const calName = editing && editing.cal ? editing.cal : primary ? primary.name : (ugfCalWho().name || ugfCalWho().email || ""); const dow = ugfCalDow(s0); const reps = [["", material ? "Does not repeat" : "Does not repeat"], ["RRULE:FREQ=DAILY", "Daily"], ["RRULE:FREQ=WEEKLY;BYDAY=" + ["SU", "MO", "TU", "WE", "TH", "FR", "SA"][s0.getDay()], "Weekly on " + dow], ["RRULE:FREQ=MONTHLY", "Monthly on day " + s0.getDate()], ["RRULE:FREQ=YEARLY", "Annually on " + ugfCalMon(s0) + " " + s0.getDate()], ["RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR", "Every weekday (Monday to Friday)"]]; // an event being changed keeps how it repeats: Google's editor says what that is const repSel = editing ? '' + (material ? "Loading…" : "Loading...") + "" : '"; const whereVal = ' value="' + esc(pre.where || "") + '"'; const descAttr = editing ? ' disabled placeholder="' + (material ? "Loading…" : "Loading...") + '"' : ""; const when = '' + 'to' + '' + '' + '"; const box = document.createElement("div"); box.id = "ugf-cal-edit"; box.className = "e-" + era; let h = ""; if (era === "c2006" || era === "c2010") { const btns = '
' + (editing ? '' : "") + "
"; h = '' + btns + '
' + '' + "" + "" + '" + "" + '" + "
What
When" + when + "
Repeats:" + repSel + "
Where
Calendar" + esc(calName) + "
Description
" + btns; } else if (classic) { h = '
« Back to Calendar' + 'SAVEDiscard' + (editing ? 'Delete' : "") + "
" + '
' + '
' + when + '
" + '
Event detailsFind a time
' + '" + "" + '
Where
Calendar" + esc(calName) + "
Description
"; } else { h = '" + '
' + when + "
" + '
' + repSel + "
" + '
Event detailsFind a time
' + '
' + ugfCalIcon("place", 24) + '
" + '
' + ugfCalIcon("event", 24) + '' + esc(calName) + "
" + '
' + ugfCalIcon("subject", 24) + '
"; } box.innerHTML = trusted_policy.createHTML(h); shell.appendChild(box); shell.classList.add("editing"); const q = function(c) { return box.querySelector(c); }; const sync = function() { const on = q(".allday").checked; box.querySelectorAll(".st, .et, .to").forEach(function(x) { x.style.display = on ? "none" : ""; }); }; q(".allday").addEventListener("change", sync); sync(); q(".title").focus(); // changing an event: Google's editor for it opens out of sight now let sess = null; let info = null; if (editing) { const whereIn = q(".where"); let whereTouched = false; whereIn.addEventListener("input", function() { whereTouched = true; }); sess = ugfCalEditor(editing.eid, { ready: function(i) { info = i; if (!box.isConnected) { return; } const d = q(".desc"); d.disabled = false; d.value = i.details || ""; d.placeholder = material ? "Add description" : ""; const rt = q(".reptxt"); if (rt) { rt.textContent = i.repeat || "Does not repeat"; } if (!whereTouched && i.where && !whereIn.value) { whereIn.value = i.where; } }, failed: function() { if (!box.isConnected) { return; } note((material ? "Couldn't open the event. " : "Sorry, this event could not be opened. ") + '' + (material ? "Open in Calendar" : "Try again in Google Calendar") + "", true); }, ask: ask }); } let handed = false; const close = function() { box.remove(); shell.classList.remove("editing"); note(""); if (sess && !handed) { sess.close(); } }; const save = function() { const sd = parseDate(q(".sd").value); const ed = parseDate(q(".ed").value) || sd; const ad = q(".allday").checked; if (!sd || !ed) { note(material ? "Enter a valid date" : "Please enter a valid date.", false); return; } let start; let end; if (ad) { start = ugfCalDay(sd); end = ugfCalAdd(ugfCalDay(ed), 1); } else { start = ugfCalParseClock(q(".st").value, sd); end = ugfCalParseClock(q(".et").value, ed); if (!start || !end) { note(material ? "Enter a valid time" : "Please enter a valid time.", false); return; } if (end <= start) { end = new Date(start.getTime() + 36e5); } } if (editing) { // only what was changed goes to Google const ch = {}; const title = q(".title").value.trim(); const where = q(".where").value.trim(); if (title !== (editing.title || "")) { ch.title = title; } if (where !== (info && info.where !== undefined && info.where !== "" ? info.where : editing.where || "")) { ch.where = where; } if (info && q(".desc").value !== (info.details || "")) { ch.details = q(".desc").value; } if (ad !== !!editing.allDay) { ch.allDay = ad; } if (ch.allDay !== undefined || start.getTime() !== editing.start.getTime() || end.getTime() !== editing.end.getTime()) { ch.start = start; ch.end = end; } handed = true; close(); if (!Object.keys(ch).length) { sess.close(); return; } saveEdit(editing, ch, sess); return; } close(); saveNew({ title: q(".title").value.trim(), start: start, end: end, allDay: ad, where: q(".where").value.trim(), details: q(".desc").value, recur: q(".rep").value }); }; box.querySelectorAll(".del").forEach(function(b) { b.addEventListener("click", function(ev) { ev.preventDefault(); handed = true; close(); removeEvent(editing, sess); }); }); box.querySelectorAll(".save").forEach(function(b) { b.addEventListener("click", function(ev) { ev.preventDefault(); save(); }); }); box.querySelectorAll(".cancel").forEach(function(b) { b.addEventListener("click", function(ev) { ev.preventDefault(); close(); }); }); box.addEventListener("keydown", function(ev) { if (ev.key === "Escape") { close(); } else if (ev.key === "Enter" && ev.target.tagName === "INPUT" && ev.target.type === "text") { save(); } ev.stopPropagation(); }); }; // ---- the drop-down menus: the gear, More, the calendar list's links and each // calendar's own, in the look of the period let menu = null; let menuFrom = null; const closeMenu = function() { if (menu) { menu.remove(); menu = null; } if (menuFrom) { menuFrom.classList.remove("menuon"); menuFrom = null; } }; const openMenu = function(anchor, items, opts) { const again = menuFrom === anchor; closeMenu(); closeBubble(); if (again) { return; // a second click on the button closes it } opts = opts || {}; menu = document.createElement("div"); menu.className = "ugf-cal-menu" + (opts.cls ? " " + opts.cls : ""); let h = ""; items.forEach(function(it, i) { if (it.sep) { h += '
'; } else if (it.head) { h += '
' + esc(it.head) + "
"; } else if (it.sw) { h += '
' + it.sw.map(function(c) { const hex = typeof c === "string" ? c : c[0]; const name = typeof c === "string" ? "" : c[1]; const cur = it.cur && ugfCalRgb(it.cur).join() === ugfCalRgb(hex).join(); return '' + (cur ? ugfCalIcon("check", 14) : "") + ""; }).join("") + "
"; } else { h += '" + (it.on !== undefined ? '' + (it.on ? "✓" : "") + "" : "") + "" + esc(it.t) + "" + (it.key ? "" + esc(it.key) + "" : "") + ""; } }); menu.innerHTML = trusted_policy.createHTML(h); shell.appendChild(menu); menuFrom = anchor; anchor.classList.add("menuon"); // under the button; kept on the screen const r = anchor.getBoundingClientRect(); const mw = menu.offsetWidth; const mh = menu.offsetHeight; let x = opts.right ? r.right - mw : r.left; let y = r.bottom + (material ? 4 : 1); x = Math.max(4, Math.min(x, window.innerWidth - mw - 4)); if (y + mh > window.innerHeight - 4) { y = Math.max(4, r.top - mh - 2); } menu.style.left = x + "px"; menu.style.top = y + "px"; menu.addEventListener("click", function(ev) { const sw = ev.target.closest("[data-sw]"); const a = ev.target.closest("a.it"); if (sw) { ev.preventDefault(); const it = items.filter(function(x) { return x.sw; })[0]; closeMenu(); it.fn(sw.getAttribute("data-sw")); return; } if (!a) { return; } const it = items[parseInt(a.getAttribute("data-i"), 10)]; if (it.fn) { ev.preventDefault(); closeMenu(); it.fn(); } else if (it.href && !/^https?:/.test(it.href)) { closeMenu(); } else { closeMenu(); } }); }; document.addEventListener("mousedown", function(ev) { if (menu && !menu.contains(ev.target) && !(menuFrom && menuFrom.contains(ev.target))) { closeMenu(); } }, true); window.addEventListener("resize", closeMenu); shell.addEventListener("scroll", closeMenu, true); const setDensityTo = function(d) { ugfCalSetPref("density", d); setDensity(); scrollKept = null; paintView(); }; const B = ugfCalBase(); // the gear const gearMenu = function(anchor) { const d = ugfCalPrefs().density || (material ? "responsive" : "comfortable"); if (material) { openMenu(anchor, [ { t: "Settings", href: B + "/settings" }, { t: "Trash", href: B + "/trash" }, { t: "Density and color", fn: densityDialog }, { t: "Print", fn: function() { window.print(); } }, { t: "Get add-ons", href: "https://workspace.google.com/marketplace?host=calendar" } ], { right: true }); return; } openMenu(anchor, [ { head: "Display density:" }, { t: "Comfortable", on: d === "comfortable", fn: function() { setDensityTo("comfortable"); } }, { t: "Cozy", on: d === "cozy", fn: function() { setDensityTo("cozy"); } }, { t: "Compact", on: d === "compact", fn: function() { setDensityTo("compact"); } }, { sep: true }, { t: "Settings", href: B + "/settings" }, { t: "Labs", href: B + "/settings" }, { t: "Offline", href: B + "/settings" }, { sep: true }, { t: "Help", href: "https://support.google.com/calendar" } ], { right: true }); }; const moreMenu = function(anchor) { openMenu(anchor, [ { t: "Refresh", fn: function() { ugfCalS().days = {}; load(); } }, { t: "Print", fn: function() { window.print(); } }, { sep: true }, { t: "Create new calendar", href: B + "/settings/createcalendar" }, { t: "Import calendar", href: B + "/settings/export" }, { t: "Export calendars", href: B + "/settings/export" } ], { right: true }); }; // the links under the calendar list const calListMenu = function(anchor, what) { if (what === "settings") { window.location.href = B + "/settings"; } else if (what === "create") { window.location.href = B + "/settings/createcalendar"; } else if (material) { openMenu(anchor, [ { t: "Subscribe to calendar", href: B + "/settings/addcalendar" }, { t: "Create new calendar", href: B + "/settings/createcalendar" }, { t: "Browse calendars of interest", href: B + "/settings/browsecalendars" }, { t: "From URL", href: B + "/settings/addbyurl" }, { t: "Import", href: B + "/settings/export" } ]); } else { openMenu(anchor, [ { t: "Browse Interesting Calendars", href: B + "/settings/browsecalendars" }, { t: "Add by URL", href: B + "/settings/addbyurl" }, { t: "Import calendar", href: B + "/settings/export" } ]); } }; // each calendar's own menu: show only it, its settings, its colour const calMenu = function(anchor, name) { const cal = ugfCalS().calendars.filter(function(c) { return c.name === name; })[0]; if (!cal) { return; } const only = function() { ugfCalS().calendars.forEach(function(c) { c.on = c.name === name; }); paintCals(); paintView(); }; const pick = function(hex) { const colors = Object.assign({}, ugfCalPrefs().colors); colors[name] = hex; ugfCalSetPref("colors", colors); paintCals(); paintView(); }; const cur = ugfCalColorFor(name, cal.color); if (material) { openMenu(anchor, [ { t: "Display this only", fn: only }, { t: "Settings and sharing", href: B + "/settings" }, { sep: true }, { sw: ugfCalMaterialColors(), cur: cur, fn: pick, cls: "m24" } ], { cls: "calm" }); return; } // 2006-2010 calendars wear the light colour of each pair const sw = era === "c2011" || era === "c2013" ? ugfCal2011Colors() : ugfCalClassicColors().map(function(c) { return c[1]; }); openMenu(anchor, [ { t: "Display only this calendar", fn: only }, { sep: true }, { t: "Calendar settings", href: B + "/settings" }, { t: "Create event on this calendar", fn: function() { editPage(); } }, { t: "Share this calendar", href: B + "/settings" }, { t: "Edit notifications", href: B + "/settings" }, { sep: true }, { sw: sw, cur: ugfCalPaint(cur, era).light, fn: pick, cls: era === "c2011" || era === "c2013" ? "k24" : "c21" } ], { cls: "calm" }); }; // Material: the Density and color box const densityDialog = function() { const pr = ugfCalPrefs(); const fence = document.createElement("div"); fence.className = "ugf-cal-dlgfence"; const radio = function(group, val, label, cur) { return '"; }; fence.innerHTML = trusted_policy.createHTML(''); shell.appendChild(fence); const apply = function() { const cs = fence.querySelector("input[name=cs]:checked").value; const dn = fence.querySelector("input[name=dn]:checked").value; ugfCalSetPref("colorset", cs); ugfCalSetPref("density", dn === "compact" ? "compact" : ""); setDensity(); scrollKept = null; paintCals(); paintView(); }; fence.querySelectorAll("input").forEach(function(i) { i.addEventListener("change", apply); }); const close = function(ev) { if (ev) { ev.preventDefault(); } fence.remove(); }; fence.querySelector(".done").addEventListener("click", close); fence.addEventListener("mousedown", function(ev) { if (ev.target === fence) { close(); } }); }; shell.addEventListener("click", function(ev) { const mb = ev.target.closest("[data-menu]"); if (mb && shell.contains(mb)) { ev.preventDefault(); ev.stopPropagation(); if (mb.getAttribute("data-menu") === "gear") { gearMenu(mb); } else { moreMenu(mb); } return; } }, true); shell.addEventListener("click", function(ev) { const a = ev.target.closest("[data-act], [data-view]"); if (!a || !shell.contains(a) || a.closest(".vmenu") && !a.getAttribute("data-view")) { return; } const act = a.getAttribute("data-act"); const v = a.getAttribute("data-view"); if (v && a.closest("#ugf-cal-bar, .viewsel, #ugf-cal-head")) { ev.preventDefault(); if (viewSel) { viewSel.classList.remove("open"); } go(v, st.date); return; } if (!act) { return; } ev.preventDefault(); if (act === "today") { go(st.view, new Date()); } else if (act === "prev" || act === "next") { go(st.view, ugfCalStep(st.view, st.date, act === "prev" ? -1 : 1)); } else if (act === "refresh") { ugfCalS().days = {}; load(); } else if (act === "print") { window.print(); } else if (act === "create") { editPage(); } else if (act === "quick") { const r0 = shell.querySelector("#ugf-cal-view").getBoundingClientRect(); const s = new Date(); s.setMinutes(0, 0, 0); s.setHours(s.getHours() + 1); quickBubble(r0.left + r0.width / 2, r0.top + 80, s, new Date(s.getTime() + 36e5), false); } else if (act === "search") { const q = window.prompt("Search"); if (q) { window.location.href = ugfCalBase() + "/search?q=" + encodeURIComponent(q); } } }); const search = shell.querySelector("#ugf-cal-search"); if (search) { search.addEventListener("submit", function(ev) { ev.preventDefault(); const q = search.querySelector(".q").value.trim(); if (q) { window.location.href = ugfCalBase() + "/search?q=" + encodeURIComponent(q); } }); } // the keyboard shortcuts Calendar has always had document.addEventListener("keydown", function(ev) { if (ev.ctrlKey || ev.metaKey || ev.altKey || /^(INPUT|TEXTAREA|SELECT)$/.test((ev.target && ev.target.tagName) || "") || (ev.target && ev.target.isContentEditable)) { return; } const k = ev.key.toLowerCase(); const map = { d: "day", "1": "day", w: "week", "2": "week", m: "month", "3": "month", x: "4day", "4": "4day", a: "agenda", "5": "agenda" }; if (map[k]) { go(map[k], st.date); } else if (k === "t") { go(st.view, new Date()); } else if (k === "j" || k === "n") { go(st.view, ugfCalStep(st.view, st.date, 1)); } else if (k === "k" || k === "p") { go(st.view, ugfCalStep(st.view, st.date, -1)); } else if (k === "c") { editPage(); } else if (k === "escape") { closeBubble(); closeMenu(); } else { return; } ev.preventDefault(); ev.stopPropagation(); }, true); window.addEventListener("popstate", function() { if (ugfCalGoogleDriving()) { return; // our own nudge to Google's page, not Back or Forward } const u = ugfCalParseUrl(); if (u.view) { st.view = u.view; st.date = u.date; miniMonth = new Date(st.date.getFullYear(), st.date.getMonth(), 1); paint(); load(); } }); // the account menus and app grid, as on Gmail const menuChrome = ugfMenusRounded() ? "m2018" : "m2013"; shell.querySelectorAll("#ugf-cal-account .pfpwrap, #ugf-cal-account .plusname, #ugf-cal-account .me, #ugf-cal-head .me").forEach(function(el) { el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAccountMenu(el, menuChrome); }); }); shell.querySelectorAll("#ugf-cal-account .appsg, #ugf-cal-head .apps").forEach(function(el) { el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); ugfGmailAppsMenu(el, menuChrome); }); }); const burger = shell.querySelector(".burger"); if (burger) { burger.addEventListener("click", function(ev) { ev.preventDefault(); shell.classList.toggle("noside"); }); } go(st.view, st.date, true); // Google's page keeps changing under us (new events, other devices): look again now and then setInterval(function() { if (!document.hidden) { ugfCalFetch(st.view, st.date, ugfCalRange(st.view, st.date, st.first), function(changed) { if (changed) { paintCals(); paintView(); } }, true); } }, 30000); } // ---- how each period's Calendar looked ----------------------------------------- function ugfCalCss(era) { const common = [ 'html[gplex-cal] body > *:not(#ugf-cal):not(#ugf-cal-styles):not(#ugf-gmail-accmenu):not(#ugf-gmail-appsmenu):not(#ugf-gmail-accfence):not(script):not(style) { visibility: hidden !important; pointer-events: none !important; }', 'html[gplex-cal], html[gplex-cal] body { overflow: hidden !important; }', 'html[gplex-cal] #ugf-gmail-accfence { z-index: 2147483600 !important; }', 'html[gplex-cal] #ugf-gmail-accmenu, html[gplex-cal] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }', 'html[gplex-cal] #ugf-gmail-accmenu a, html[gplex-cal] #ugf-gmail-appsmenu a { text-decoration: none; }', ugfMapsMenuCss(), '#ugf-cal { position: fixed; inset: 0; z-index: 2147483000; background: #fff; color: #000; font: 13px arial, sans-serif; display: flex; flex-direction: column; text-align: left; visibility: visible; }', '#ugf-cal * { box-sizing: border-box; }', '#ugf-cal a { color: #00c; cursor: pointer; }', '#ugf-cal .mi { display: inline-flex; font-style: normal; } #ugf-cal .mi svg { display: block; fill: currentColor; }', '#ugf-cal-body { flex: 1; display: flex; min-height: 0; }', '#ugf-cal-side { flex: 0 0 auto; overflow-y: auto; overflow-x: hidden; }', '#ugf-cal.noside #ugf-cal-side { display: none; }', '#ugf-cal-main { flex: 1; display: flex; flex-direction: column; min-width: 0; }', '#ugf-cal-view { flex: 1; min-height: 0; position: relative; display: flex; flex-direction: column; }', '#ugf-cal-loading { position: absolute; left: 50%; top: 4px; transform: translateX(-50%); display: none; z-index: 50; }', '#ugf-cal.busy #ugf-cal-loading { display: block; }', // the day grid '#ugf-cal .grid { flex: 1; display: flex; flex-direction: column; min-height: 0; }', '#ugf-cal .ghead, #ugf-cal .gall { display: flex; flex: 0 0 auto; }', '#ugf-cal .ghead .dh { flex: 1 1 0; min-width: 0; text-align: center; overflow: hidden; white-space: nowrap; }', '#ugf-cal .gall .adwrap { flex: 1; position: relative; min-height: 20px; }', '#ugf-cal .adcol { position: absolute; top: 0; bottom: 0; }', '#ugf-cal .adpos { position: absolute; padding: 1px 2px; }', '#ugf-cal .gbody { flex: 1; overflow-y: scroll; position: relative; }', '#ugf-cal .gin { position: relative; display: flex; }', '#ugf-cal .gin .gutter { position: relative; flex: 0 0 auto; }', '#ugf-cal .hl { position: absolute; right: 0; left: 0; }', '#ugf-cal .cols { flex: 1; position: relative; }', '#ugf-cal .line, #ugf-cal .half { position: absolute; left: 0; right: 0; height: 0; }', '#ugf-cal .col { position: absolute; top: 0; bottom: 0; }', '#ugf-cal .tpos { position: absolute; padding: 0 2px 0 1px; }', '#ugf-cal .ev { cursor: pointer; overflow: hidden; }', '#ugf-cal .tpos .ev { height: 100%; }', '#ugf-cal .ev.ad { white-space: nowrap; text-overflow: ellipsis; }', '#ugf-cal .now { position: absolute; left: 0; right: 0; height: 0; z-index: 3; pointer-events: none; }', '#ugf-cal .sbar { flex: 0 0 auto; }', // month '#ugf-cal .month { flex: 1; display: flex; flex-direction: column; min-height: 0; }', '#ugf-cal .mhd { display: flex; flex: 0 0 auto; } #ugf-cal .mhd div { flex: 1 1 0; }', '#ugf-cal .mrow { flex: 1 1 0; display: flex; min-height: 0; }', '#ugf-cal .mc { flex: 1 1 0; min-width: 0; overflow: hidden; position: relative; }', '#ugf-cal .mc .ev { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', '#ugf-cal .mc .mn { display: block; text-decoration: none; }', // schedule / agenda '#ugf-cal .agenda { flex: 1; overflow-y: auto; }', '#ugf-cal .aday { display: flex; } #ugf-cal .aevs { flex: 1; min-width: 0; }', '#ugf-cal .ev.ag { display: flex; align-items: center; gap: 8px; }', // bubbles '#ugf-cal .ugf-cal-bubble { position: fixed; z-index: 100; background: #fff; }', '#ugf-cal .ugf-cal-bubble .tail { position: absolute; bottom: -12px; width: 0; height: 0; border: 12px solid transparent; border-bottom: 0; border-top-color: #fff; }', '#ugf-cal .ugf-cal-bubble.below .tail { bottom: auto; top: -12px; border-top: 0; border-bottom: 12px solid #fff; }', // the view picker of the Material pages '#ugf-cal .viewsel { position: relative; }', '#ugf-cal .viewsel .vmenu { display: none; position: absolute; top: 100%; right: 0; background: #fff; box-shadow: 0 2px 10px rgba(0,0,0,.2); padding: 8px 0; min-width: 160px; z-index: 30; }', '#ugf-cal .viewsel.open .vmenu { display: block; }', '#ugf-cal .viewsel .vmenu a { display: flex; justify-content: space-between; padding: 8px 16px; color: #3c4043 !important; text-decoration: none; }', '#ugf-cal .viewsel .vmenu a:hover { background: #f1f3f4; }', '#ugf-cal .viewsel .vmenu kbd { font: inherit; color: #70757a; }', // the event details page and the notices '#ugf-cal.editing #ugf-cal-body, #ugf-cal.editing #ugf-cal-fab { display: none !important; }', '#ugf-cal-edit { flex: 1; overflow: auto; min-height: 0; }', '#ugf-cal-edit input[type=text], #ugf-cal-edit textarea, #ugf-cal-edit select { font: inherit; }', '#ugf-cal-edit .when { display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }', '#ugf-cal-edit .when .sd, #ugf-cal-edit .when .ed { width: 96px; } #ugf-cal-edit .when .st, #ugf-cal-edit .when .et { width: 76px; }', '#ugf-cal-edit .ad { display: inline-flex; align-items: center; gap: 4px; margin-left: 10px; white-space: nowrap; }', '#ugf-cal-edit .wide { width: 100%; max-width: 560px; } #ugf-cal-edit textarea { width: 100%; max-width: 560px; resize: vertical; }', '#ugf-cal-edit .etab { border-collapse: collapse; } #ugf-cal-edit .etab th { text-align: right; vertical-align: top; font-weight: bold; padding: 6px 10px 6px 0; white-space: nowrap; } #ugf-cal-edit .etab td { padding: 4px 0; width: 100%; }', '#ugf-cal-note { position: absolute; z-index: 130; left: 50%; transform: translateX(-50%); top: 4px; }', '#ugf-cal-note a { margin-left: 6px; }', // the drop-down menus and the Material dialog '#ugf-cal .ugf-cal-menu { position: fixed; z-index: 120; background: #fff; min-width: 150px; text-align: left; }', '#ugf-cal .ugf-cal-menu .it { display: flex; align-items: center; white-space: nowrap; text-decoration: none; cursor: pointer; }', '#ugf-cal .ugf-cal-menu .it kbd { font: inherit; margin-left: auto; padding-left: 24px; }', '#ugf-cal .ugf-cal-menu .tick { display: inline-block; width: 18px; flex: 0 0 18px; }', '#ugf-cal .ugf-cal-menu .sws { display: grid; grid-template-columns: repeat(6, auto); gap: 4px; justify-content: start; }', '#ugf-cal .ugf-cal-menu .sws.k24 { grid-template-columns: repeat(6, auto); } #ugf-cal .ugf-cal-menu .sws.c21 { grid-template-columns: repeat(7, auto); }', '#ugf-cal .ugf-cal-menu .sw { display: flex; align-items: center; justify-content: center; color: #fff !important; }', '#ugf-cal .ugf-cal-askfence { position: fixed; inset: 0; z-index: 150; display: flex; align-items: center; justify-content: center; }', '#ugf-cal .ugf-cal-ask { background: #fff; width: 440px; max-width: calc(100vw - 32px); }', '#ugf-cal .ugf-cal-ask .ar label { display: flex; align-items: center; gap: 6px; padding: 3px 0; cursor: pointer; }', '#ugf-cal .ugf-cal-ask .ab { display: flex; gap: 8px; }', '#ugf-cal .ugf-cal-dlgfence { position: fixed; inset: 0; z-index: 140; background: rgba(32,33,36,.6); display: flex; align-items: center; justify-content: center; }', '#ugf-cal .ugf-cal-dlg { background: #fff; width: 400px; border-radius: 8px; padding: 24px; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); }', '#ugf-cal .ugf-cal-dlg .dt { font: 22px "Google Sans", Roboto, arial, sans-serif; color: #202124; margin-bottom: 20px; }', '#ugf-cal .ugf-cal-dlg .dsec { margin-bottom: 18px; } #ugf-cal .ugf-cal-dlg .dh { font: 500 14px Roboto, arial, sans-serif; color: #3c4043; margin-bottom: 8px; }', '#ugf-cal .ugf-cal-dlg .rd { display: flex; align-items: center; gap: 12px; font: 14px Roboto, arial, sans-serif; color: #3c4043; padding: 6px 0; cursor: pointer; }', '#ugf-cal .ugf-cal-dlg .rd input { width: 18px; height: 18px; margin: 0; accent-color: #1a73e8; }', '#ugf-cal .ugf-cal-dlg .dacts { display: flex; justify-content: flex-end; }', '#ugf-cal .ugf-cal-dlg .done { font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #1a73e8 !important; text-decoration: none; padding: 8px 24px; border-radius: 4px; }', '#ugf-cal .ugf-cal-dlg .done:hover { background: #f6fafe; }', '@media print { #ugf-cal .ugf-cal-menu, #ugf-cal .ugf-cal-dlgfence { display: none !important; } }', '@media print { #ugf-cal-side, #ugf-cal-head, #ugf-cal-gbar { display: none !important; } #ugf-cal { position: static; } }' ]; const css = {}; // ---- 2006 to May 2010: Gmail's blue css.c2006 = [ '#ugf-cal-edit { padding: 6px 10px 10px 8px; font-size: 13px; }', '#ugf-cal-edit .eback { margin: 2px 0 8px 0; } #ugf-cal-edit .eback a { font-weight: bold; }', '#ugf-cal-edit .ebtns { display: flex; gap: 6px; margin: 6px 0; } #ugf-cal-edit .ebtns button { font: 13px arial, sans-serif; padding: 1px 10px; }', '#ugf-cal-edit .eframe { background: #c3d9ff; padding: 6px; border-radius: 4px; } #ugf-cal-edit .eframe .etab { background: #fff; width: 100%; }', '#ugf-cal-edit .etab th { background: #e8eef7; padding: 6px 10px; width: 1%; } #ugf-cal-edit .etab td { padding: 5px 8px; }', '#ugf-cal-edit input[type=text] { border: 1px solid #7f9db9; padding: 2px 3px; } #ugf-cal-edit textarea { border: 1px solid #7f9db9; }', '#ugf-cal-edit .title.wide { font-size: 15px; font-weight: bold; }', '#ugf-cal-note { background: #fad163; padding: 3px 12px; font-weight: bold; border-radius: 3px; color: #000; }', '#ugf-cal .ugf-cal-menu { border: 1px solid #6b90da; box-shadow: 2px 2px 3px rgba(0,0,0,.25); padding: 2px 0; font-size: 12px; }', '#ugf-cal .ugf-cal-menu .it { color: #000 !important; padding: 3px 14px 3px 10px; }', '#ugf-cal .ugf-cal-menu .it:hover { background: #c3d9ff; }', '#ugf-cal .ugf-cal-menu .sep { border-top: 1px solid #c3d9ff; margin: 2px 0; }', '#ugf-cal .ugf-cal-menu .hd { color: #666; padding: 3px 10px; }', '#ugf-cal .ugf-cal-menu .sws { padding: 4px 10px 6px 10px; gap: 3px; } #ugf-cal .ugf-cal-menu .sw { width: 16px; height: 16px; border: 1px solid rgba(0,0,0,.25); } #ugf-cal .ugf-cal-menu .sw.cur { outline: 2px solid #000; }', '#ugf-cal .ugf-cal-menu .sw .mi svg { width: 12px; height: 12px; }', '#ugf-cal-gbar { display: flex; justify-content: space-between; padding: 4px 8px 0 8px; font-size: 13px; }', '#ugf-cal-gbar .left { display: flex; gap: 0; } #ugf-cal-gbar .left > * { margin-right: 8px; }', '#ugf-cal-gbar .more small { font-size: 9px; }', '#ugf-cal-gbar .right { color: #000; } #ugf-cal-gbar .right a { color: #00c; }', '#ugf-cal-head { display: flex; align-items: center; padding: 4px 8px 6px 4px; }', '#ugf-cal-head .logo img { display: block; border: 0; }', '#ugf-cal[layout="2009"] #ugf-cal-head .logo img, #ugf-cal[layout="2010"] #ugf-cal-head .logo img, #ugf-cal[layout="2010N"] #ugf-cal-head .logo img { margin: 8px 14px 6px 6px; }', '#ugf-cal-search { display: flex; align-items: center; gap: 4px; margin-left: 14px; }', '#ugf-cal-search .q { width: 290px; font: 13px arial, sans-serif; padding: 1px 2px; border: 1px solid #7f9db9; }', '#ugf-cal-search input[type="submit"], #ugf-cal-search input[type="button"] { font: 13px arial, sans-serif; }', '#ugf-cal-search .opts { font-size: 11px; margin-left: 4px; }', '#ugf-cal-side { width: 190px; padding: 4px 8px 8px 8px; }', '#ugf-cal-side .links a { display: block; font-weight: bold; margin: 0 0 4px 0; }', '#ugf-cal-mini { background: #c3d9ff; border-radius: 4px; padding: 4px 4px 5px 4px; margin: 8px 0 12px 0; }', '#ugf-cal-mini .mhead { display: flex; justify-content: space-between; align-items: center; font-weight: bold; padding: 1px 2px 3px 2px; }', '#ugf-cal-mini .mp { text-decoration: none; font-weight: bold; color: #112abb !important; padding: 0 3px; }', '#ugf-cal-mini .mgrid { width: 100%; border-collapse: collapse; background: #fff; font-size: 11px; }', '#ugf-cal-mini .mgrid th { background: #c3d9ff; font-weight: normal; color: #333; padding: 1px 0; }', '#ugf-cal-mini .mgrid td { text-align: center; padding: 1px 0; cursor: pointer; color: #000; }', '#ugf-cal-mini .mgrid td.out { color: #888; }', '#ugf-cal-mini .mgrid td.sel { background: #e0ecff; font-weight: bold; }', '#ugf-cal-mini .mgrid td.today span { border: 1px solid #b90000; padding: 0 1px; }', '#ugf-cal-cals .sect { background: #c3d9ff; border-radius: 4px; padding: 2px 3px 4px 3px; margin: 0 0 12px 0; }', '#ugf-cal-cals .sh { font-weight: bold; padding: 2px 3px 4px 3px; font-size: 12px; }', '#ugf-cal-cals .list { background: #fff; padding: 2px; }', '#ugf-cal-cals .addf input { width: 100%; font: 12px arial, sans-serif; margin: 0 0 3px 0; padding: 1px 2px; border: 1px solid #7f9db9; }', '#ugf-cal-cals .cal { display: flex; align-items: center; justify-content: space-between; margin: 1px 0; padding: 1px 0 1px 5px; text-decoration: none; font-size: 12px; border-radius: 2px; color: #fff !important; }', '#ugf-cal-cals .cal .cn { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }', '#ugf-cal-cals .cal .dd { font-size: 8px; color: #fff; padding: 2px 3px; margin-left: 4px; }', '#ugf-cal-cals .sf { display: flex; justify-content: space-between; padding: 3px 2px 0 2px; font-size: 11px; }', '#ugf-cal-main { padding: 0 8px 8px 0; }', '#ugf-cal-bar { display: flex; justify-content: space-between; align-items: flex-end; }', '#ugf-cal-bar .nav { display: flex; align-items: center; gap: 4px; padding: 0 0 4px 0; }', '#ugf-cal-bar .arr img { display: block; } #ugf-cal-bar .arr { display: block; }', '#ugf-cal-bar .today { font: 12px arial, sans-serif; color: #000 !important; text-decoration: none; border: 1px solid #aaa; border-radius: 3px; background: linear-gradient(#fff, #ddd); padding: 1px 6px; margin: 0 4px; }', '#ugf-cal-bar .title { font-weight: bold; font-size: 14px; margin: 0 10px 0 4px; }', '#ugf-cal-bar .refresh { font-size: 12px; }', '#ugf-cal-bar .tabs { display: flex; align-items: flex-end; }', '#ugf-cal-bar .tabs .print { display: inline-flex; align-items: center; gap: 2px; margin-right: 10px; font-size: 12px; padding-bottom: 4px; color: #00c; }', '#ugf-cal-bar .tabs .v { padding: 3px 8px 4px 8px; margin-left: 2px; font-size: 13px; font-weight: bold; border-radius: 4px 4px 0 0; background: #e8eef7; text-decoration: none; }', '#ugf-cal-bar .tabs .v.on { background: #c3d9ff; color: #000 !important; }', '#ugf-cal-view { background: #c3d9ff; padding: 5px; border-radius: 4px 0 4px 4px; }', '#ugf-cal .ghead { background: #c3d9ff; }', '#ugf-cal .ghead .dh { padding: 2px 0 3px 0; font-size: 12px; } #ugf-cal .ghead .dh a { color: #112abb; text-decoration: none; }', '#ugf-cal .ghead .dh.today { background: #fad163; }', '#ugf-cal .gutter { width: 44px; }', '#ugf-cal .gall { background: #fff; border-bottom: 2px solid #c3d9ff; }', '#ugf-cal .adcol { border-left: 1px solid #ddd; } #ugf-cal .adcol.today { background: #fff7d7; }', '#ugf-cal .gbody { background: #fff; }', '#ugf-cal .hl span { display: block; text-align: right; padding: 1px 3px 0 0; font-size: 11px; color: #666; }', '#ugf-cal .hl { border-top: 1px solid #ddd; }', '#ugf-cal .line { border-top: 1px solid #ddd; } #ugf-cal .half { border-top: 1px dotted #ddd; }', '#ugf-cal .col { border-left: 1px solid #ddd; } #ugf-cal .col.today { background: #fff7d7; }', '#ugf-cal .ev.tm { border: 1px solid; border-radius: 3px; color: #fff; font-size: 11px; }', '#ugf-cal .ev.tm.short { padding: 0 3px; white-space: nowrap; font-size: 11px; line-height: 13px; }', '#ugf-cal .ev.tm .eh { font-weight: bold; padding: 0 3px; white-space: nowrap; overflow: hidden; }', '#ugf-cal .ev.tm .eb { padding: 1px 3px; }', '#ugf-cal .ev.ad { border-radius: 3px; padding: 1px 4px; font-size: 11px; border: 1px solid; }', '#ugf-cal .mhd { background: #c3d9ff; } #ugf-cal .mhd div { text-align: center; font-size: 12px; padding: 2px 0 3px 0; }', '#ugf-cal .month { background: #fff; }', '#ugf-cal .mc { border-left: 1px solid #ddd; border-top: 1px solid #ddd; padding: 0 1px; }', '#ugf-cal .mc .mn { background: #e8eef7; text-align: right; padding: 0 3px; font-size: 11px; color: #333 !important; margin: 0 -1px 1px -1px; }', '#ugf-cal .mc.out .mn { color: #888 !important; background: #f3f3f3; }', '#ugf-cal .mc.today { background: #fff7d7; } #ugf-cal .mc.today .mn { background: #fad163; }', '#ugf-cal .mc .ev.mt { font-size: 11px; padding: 0 2px; }', '#ugf-cal .mc .ev.mt .t { font-weight: bold; }', '#ugf-cal .mc .ev.ad { margin: 0 0 1px 0; }', '#ugf-cal .mc .more { display: block; font-size: 11px; padding: 0 3px; }', '#ugf-cal .agenda { background: #fff; }', '#ugf-cal .aday { border-top: 1px solid #ddd; } #ugf-cal .aday.today { background: #fff7d7; }', '#ugf-cal .adate { width: 110px; flex: 0 0 110px; padding: 3px 6px; font-weight: bold; background: #e8eef7; font-size: 12px; }', '#ugf-cal .ev.ag { padding: 3px 6px; font-size: 12px; } #ugf-cal .ev.ag .at { width: 110px; color: #333; } #ugf-cal .ev.ag .dot { display: none; }', '#ugf-cal .agenda .none { padding: 20px; color: #666; }', '#ugf-cal-loading { background: #c00; color: #fff; font-weight: bold; padding: 2px 8px; top: 2px; }', '#ugf-cal .ugf-cal-bubble { border: 1px solid #99a; border-radius: 8px; box-shadow: 2px 2px 6px rgba(0,0,0,.3); padding: 10px 14px 10px 12px; width: 330px; font-size: 13px; }', '#ugf-cal .ugf-cal-bubble .x { position: absolute; right: 6px; top: 6px; } #ugf-cal .ugf-cal-bubble .x img { display: block; }', '#ugf-cal .ugf-cal-bubble .tt { font-weight: bold; font-size: 14px; margin: 0 16px 6px 0; }', '#ugf-cal .ugf-cal-bubble .tw, #ugf-cal .ugf-cal-bubble .tc { margin: 0 0 4px 0; }', '#ugf-cal .ugf-cal-bubble .wr { display: flex; align-items: center; gap: 6px; margin: 8px 0; } #ugf-cal .ugf-cal-bubble .wr input { flex: 1; font: 13px arial, sans-serif; }', '#ugf-cal .ugf-cal-bubble .acts { display: flex; align-items: center; gap: 10px; margin-top: 8px; font-size: 12px; }', '#ugf-cal .ugf-cal-bubble .acts button { font: 13px arial, sans-serif; }', '#ugf-cal .ugf-cal-bubble .tail { border-top-color: #fff; filter: drop-shadow(1px 1px 0 #99a); }', '#ugf-cal .ugf-cal-askfence { background: rgba(255,255,255,.5); }', '#ugf-cal .ugf-cal-ask { background: #c3d9ff; border-radius: 4px; padding: 6px; font-size: 13px; color: #000; box-shadow: 2px 2px 6px rgba(0,0,0,.3); }', '#ugf-cal .ugf-cal-ask .at { font-weight: bold; padding: 2px 4px 6px 4px; }', '#ugf-cal .ugf-cal-ask .ax, #ugf-cal .ugf-cal-ask .ar { background: #fff; padding: 8px 10px; }', '#ugf-cal .ugf-cal-ask .ax + .ar { padding-top: 0; }', '#ugf-cal .ugf-cal-ask .ab { padding: 6px 4px 2px 4px; }', '#ugf-cal .ugf-cal-ask button { font: 13px arial, sans-serif; padding: 1px 10px; }', '#ugf-cal .ugf-cal-ask button.pri { font-weight: bold; }' ]; // ---- May 2010 to June 2011: lighter, with buttons css.c2010 = css.c2006.concat([ '#ugf-cal-side .links { display: flex; align-items: center; gap: 10px; margin: 2px 0 10px 0; }', '#ugf-cal-side .links a { display: inline-block; margin: 0; font-weight: normal; }', '#ugf-cal-side .links .btn { color: #000 !important; text-decoration: none; border: 1px solid #aaa; border-radius: 3px; background: linear-gradient(#fff, #ddd); padding: 3px 8px; }', '#ugf-cal-mini { background: #fff; padding: 0; margin: 0 0 14px 0; }', '#ugf-cal-mini .mhead { color: #2a5db0; font-size: 13px; }', '#ugf-cal-mini .mgrid th { background: #fff; color: #333; }', '#ugf-cal-mini .mgrid td { font-weight: bold; } #ugf-cal-mini .mgrid td.out { font-weight: normal; }', '#ugf-cal-mini .mgrid td.sel { background: #dde5f5; }', '#ugf-cal-cals .sect { background: #fff; padding: 0; }', '#ugf-cal-cals .sh { color: #2a5db0; font-size: 13px; padding: 4px 0; border-top: 1px solid #c3d9ff; }', '#ugf-cal-cals .list { padding: 0; }', '#ugf-cal-bar { align-items: center; padding: 0 0 4px 0; }', '#ugf-cal-bar .nav .btn { margin: 0 4px 0 0; }', '#ugf-cal-bar .print { display: inline-flex; align-items: center; gap: 2px; font-size: 12px; margin: 0 8px 0 4px; }', '#ugf-cal-bar .views { display: flex; }', '#ugf-cal-bar .views .v { color: #000 !important; text-decoration: none; border: 1px solid #aaa; border-left-width: 0; background: linear-gradient(#fff, #ddd); padding: 3px 10px; font-size: 12px; }', '#ugf-cal-bar .views .v:first-child { border-left-width: 1px; border-radius: 3px 0 0 3px; } #ugf-cal-bar .views .v:last-child { border-radius: 0 3px 3px 0; }', '#ugf-cal-bar .views .v.on { background: linear-gradient(#ccc, #e8e8e8); box-shadow: inset 0 1px 2px rgba(0,0,0,.2); }', '#ugf-cal-view { background: #fff; padding: 0; border: 1px solid #c3d9ff; border-radius: 0; }', '#ugf-cal .ghead, #ugf-cal .mhd { background: #fff; border-bottom: 1px solid #ddd; }', '#ugf-cal .ghead .dh a { color: #333; }', '#ugf-cal .ghead .dh.today { background: #fad163; }', '#ugf-cal .gall { border-bottom: 1px solid #ccc; }', '#ugf-cal .mc .mn { background: none; }', '#ugf-cal .mc.today .mn { background: none; }' ]); // ---- June 2011 to 2013 (and to October 2017 without the dark bar) css.c2011 = [ '#ugf-cal-gbar.dark { display: flex; justify-content: space-between; align-items: center; background: #2d2d2d; height: 30px; padding: 0 14px; color: #ccc; flex: 0 0 auto; }', '#ugf-cal-gbar.dark .left, #ugf-cal-gbar.dark .right { display: flex; align-items: center; gap: 13px; height: 30px; }', '#ugf-cal-gbar.dark a { color: #ccc !important; line-height: 27px; height: 30px; border-top: 3px solid transparent; text-decoration: none; font-size: 13px; }', '#ugf-cal-gbar.dark a:hover { color: #fff !important; }', '#ugf-cal-gbar.dark a.here { color: #fff !important; font-weight: bold; border-top-color: #dd4b39; }', '#ugf-cal-gbar.dark a.plus, #ugf-cal-gbar.dark a.who { color: #fff !important; font-weight: bold; }', '#ugf-cal-gbar.dark.late { padding-left: 4px; height: 29px; } #ugf-cal-gbar.dark.late .left { gap: 0; height: 29px; }', '#ugf-cal-gbar.dark.late a { border-top: 0; line-height: 29px; height: 29px; font-weight: bold; color: #bbb !important; padding: 0 9px; } #ugf-cal-gbar.dark.late a.here, #ugf-cal-gbar.dark.late a:hover { color: #fff !important; }', '#ugf-cal-gbar.dark .gear { display: inline-flex; align-items: center; border: 0; line-height: normal; } #ugf-cal-gbar.dark .gear svg { fill: #ccc; }', '#ugf-cal-head { display: flex; align-items: center; padding: 14px 16px 12px 16px; border-bottom: 1px solid #ebebeb; flex: 0 0 auto; }', '#ugf-cal-head .logo { display: block; width: 186px; flex: 0 0 186px; } #ugf-cal-head .logo img { display: block; margin: -3px 0; }', '#ugf-cal-search { display: flex; align-items: center; }', '#ugf-cal-search .q { width: 482px; height: 29px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 1px 8px; font: 16px arial, sans-serif; outline: none; }', '#ugf-cal-search .q:focus { border-color: #4d90fe; box-shadow: inset 0 1px 2px rgba(0,0,0,.3); }', '#ugf-cal-search .go { width: 70px; height: 29px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff; margin-left: 4px; display: flex; align-items: center; justify-content: center; cursor: pointer; }', '#ugf-cal-search .opts { font-size: 11px; margin-left: 14px; }', '#ugf-cal-body { position: relative; }', '#ugf-cal-bar { display: flex; align-items: center; height: 58px; padding: 0 16px 0 0; flex: 0 0 auto; }', '#ugf-cal-side .label { height: 58px; margin-top: -58px; padding-top: 16px; color: #dd4b39; font-size: 20px; }', '#ugf-cal-bar .nav { display: flex; align-items: center; gap: 8px; flex: 1; }', '#ugf-cal-bar .views { display: flex; align-items: center; gap: 8px; }', '#ugf-cal .kb { display: inline-flex; align-items: center; justify-content: center; gap: 2px; height: 29px; min-width: 34px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444 !important; font: bold 11px arial, sans-serif; text-decoration: none; }', '#ugf-cal .kb:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); color: #222 !important; }', '#ugf-cal .kb svg { fill: #666; } #ugf-cal .kb small { font-size: 9px; }', '#ugf-cal .kb.today { padding: 0 10px; }', '#ugf-cal .grp { display: inline-flex; } #ugf-cal .grp .kb { border-radius: 0; margin-left: -1px; } #ugf-cal .grp .kb:first-child { border-radius: 2px 0 0 2px; margin-left: 0; } #ugf-cal .grp .kb:last-child { border-radius: 0 2px 2px 0; }', '#ugf-cal .kb.v { font-weight: bold; }', '#ugf-cal .kb.v.on { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); border-color: #ccc; color: #333 !important; }', '#ugf-cal-bar .title { font-size: 18px; color: #222; margin-left: 8px; }', '#ugf-cal-side { width: 186px; padding: 58px 0 10px 16px; }', '#ugf-cal-main { position: relative; }', '#ugf-cal-side .create { display: flex; margin: 16px 0 16px 0; }', '#ugf-cal-side .red { display: inline-flex; align-items: center; justify-content: center; height: 29px; border: 1px solid #b0281a; background: linear-gradient(#dd4b39, #d14836); color: #fff !important; font: bold 11px arial, sans-serif; text-decoration: none; padding: 0 8px; }', '#ugf-cal-side .red:first-child { width: 72px; border-radius: 2px 0 0 2px; } #ugf-cal-side .red.dd { width: 22px; border-left-color: #c53727; border-radius: 0 2px 2px 0; margin-left: -1px; font-size: 10px; }', '#ugf-cal-mini { margin: 0 12px 14px 0; font-size: 11px; }', '#ugf-cal-mini .mhead { display: flex; align-items: center; margin: 0 0 4px 0; font-size: 12px; color: #222; }', '#ugf-cal-mini .mhead .mt { flex: 1; font-weight: bold; } #ugf-cal-mini .mhead .mt:before { content: "\\25BE"; color: #999; margin-right: 4px; font-weight: normal; }', '#ugf-cal-mini .mp { color: #444 !important; text-decoration: none; font-size: 16px; padding: 0 5px; }', '#ugf-cal-mini .mgrid { width: 100%; border-collapse: collapse; }', '#ugf-cal-mini .mgrid th { font-weight: normal; color: #222; font-size: 11px; padding: 2px 0; }', '#ugf-cal-mini .mgrid td { text-align: center; padding: 2px 0; cursor: pointer; color: #222; font-weight: bold; font-size: 11px; }', '#ugf-cal-mini .mgrid td.out { color: #999; font-weight: normal; }', '#ugf-cal-mini .mgrid td.sel { background: #ddd; }', '#ugf-cal-mini .mgrid td.today span { border: 1px solid #444; padding: 0 1px; }', '#ugf-cal-cals .sh { font-weight: bold; font-size: 13px; color: #222; margin: 8px 0 4px 0; }', '#ugf-cal-cals .sh .tri { color: #999; margin-right: 4px; font-weight: normal; }', '#ugf-cal-cals .addf input { width: 100%; height: 25px; font: 12px arial, sans-serif; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 0 6px; margin: 2px 0 6px 0; }', '#ugf-cal-cals .cal { display: flex; align-items: center; gap: 6px; padding: 3px 4px; text-decoration: none; color: #222 !important; font-size: 13px; }', '#ugf-cal-cals .cal:hover { background: #eee; }', '#ugf-cal-cals .cal .sw { width: 14px; height: 14px; flex: 0 0 14px; border: 1px solid; border-radius: 1px; }', '#ugf-cal-cals .cal .cn { flex: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }', '#ugf-cal-cals .cal .dd { color: #777; font-size: 10px; visibility: hidden; } #ugf-cal-cals .cal:hover .dd { visibility: visible; }', '#ugf-cal-cals .cal.off { color: #999 !important; }', '#ugf-cal-cals .sf { font-size: 11px; color: #999; padding: 2px 4px; } #ugf-cal-cals .sf a { color: #15c; }', '#ugf-cal-view { border-top: 1px solid #ebebeb; }', '#ugf-cal .gutter { width: 60px; }', '#ugf-cal .ghead { border-bottom: 1px solid #ddd; }', '#ugf-cal .ghead .dh { padding: 4px 0; font-size: 13px; } #ugf-cal .ghead .dh a { color: #222; text-decoration: none; }', '#ugf-cal .ghead .dh.today { background: #fff7d6; } #ugf-cal .ghead .dh.today a { font-weight: bold; }', '#ugf-cal .gall { border-bottom: 2px solid #ddd; }', '#ugf-cal .adcol { border-left: 1px solid #ddd; } #ugf-cal .adcol.today { background: #fff7d6; }', '#ugf-cal .hl span { display: block; text-align: right; padding: 2px 6px 0 0; font-size: 11px; color: #666; }', '#ugf-cal .hl { border-top: 1px solid #ddd; }', '#ugf-cal .line { border-top: 1px solid #ddd; } #ugf-cal .half { border-top: 1px dotted #eee; }', '#ugf-cal .col { border-left: 1px solid #ddd; } #ugf-cal .col.today { background: #fff7d6; }', '#ugf-cal .now { border-top: 2px solid #f00; opacity: .6; }', '#ugf-cal .ev.tm { border: 1px solid; border-radius: 3px; font-size: 11px; padding: 1px 3px; }', '#ugf-cal .ev.tm .eh { font-weight: normal; white-space: nowrap; overflow: hidden; font-size: 11px; }', '#ugf-cal .ev.tm .eb { font-weight: bold; }', '#ugf-cal .ev.tm.short { padding: 0 3px; white-space: nowrap; line-height: 13px; }', '#ugf-cal .ev.ad { border-radius: 3px; padding: 1px 5px; font-size: 12px; border: 1px solid; }', '#ugf-cal .mhd div { font-size: 13px; color: #666; padding: 4px 6px; border-bottom: 1px solid #ddd; }', '#ugf-cal .mc { border-left: 1px solid #ddd; border-bottom: 1px solid #ddd; padding: 2px 0; }', '#ugf-cal .mc .mn { padding: 0 6px 2px 6px; font-size: 12px; color: #666 !important; }', '#ugf-cal .mc.out { } #ugf-cal .mc.out .mn { color: #bbb !important; }', '#ugf-cal .mc.today { background: #fff7d6; } #ugf-cal .mc.today .mn { color: #222 !important; font-weight: bold; }', '#ugf-cal .mc .ev.mt { font-size: 12px; padding: 0 6px; }', '#ugf-cal .mc .ev.ad { margin: 0 1px 1px 1px; }', '#ugf-cal .mc .more { display: block; font-size: 12px; padding: 1px 6px; color: #15c !important; }', '#ugf-cal .adate { width: 140px; flex: 0 0 140px; padding: 6px 10px; font-size: 13px; color: #222; }', '#ugf-cal .aday { border-bottom: 1px solid #eee; } #ugf-cal .aday.today .adate { font-weight: bold; }', '#ugf-cal .ev.ag { padding: 6px 10px; font-size: 13px; } #ugf-cal .ev.ag .at { width: 120px; color: #222; } #ugf-cal .ev.ag .dot { width: 10px; height: 10px; }', '#ugf-cal .agenda .none { padding: 20px; color: #777; }', '#ugf-cal-loading { background: #f9edbe; border: 1px solid #f0c36d; border-radius: 2px; padding: 3px 10px; font-weight: bold; color: #222; top: -46px; }', '#ugf-cal .ugf-cal-bubble { border: 1px solid #bebebe; box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 16px 20px 14px 20px; width: 360px; font-size: 13px; }', '#ugf-cal .ugf-cal-bubble .x { position: absolute; right: 8px; top: 4px; color: #777 !important; text-decoration: none; font-size: 20px; }', '#ugf-cal .ugf-cal-bubble .tt { font-size: 16px; font-weight: bold; margin: 0 16px 8px 0; }', '#ugf-cal .ugf-cal-bubble .tw, #ugf-cal .ugf-cal-bubble .tc { margin: 0 0 6px 0; color: #222; }', '#ugf-cal .ugf-cal-bubble .wr { display: flex; align-items: center; gap: 8px; margin: 10px 0; } #ugf-cal .ugf-cal-bubble .wr input { flex: 1; height: 27px; border: 1px solid #d9d9d9; padding: 0 6px; font: 13px arial, sans-serif; }', '#ugf-cal .ugf-cal-bubble .acts { display: flex; align-items: center; gap: 12px; margin-top: 12px; }', '#ugf-cal .ugf-cal-bubble .acts .sep { color: #ccc; }', '#ugf-cal .ugf-cal-bubble .acts button { height: 29px; border: 1px solid #3079ed; border-radius: 2px; background: linear-gradient(#4d90fe, #4787ed); color: #fff; font: bold 11px arial, sans-serif; padding: 0 12px; }', '#ugf-cal .ugf-cal-bubble .tail { filter: drop-shadow(0 2px 0 #bebebe); }', // the +You corner of 2012-2014 and the grid corner of 2015-2017 '#ugf-cal-account { display: flex; align-items: center; gap: 10px; margin-left: auto; }', '#ugf-cal-account .plusname { color: #666 !important; text-decoration: none; }', '#ugf-cal-account .nbox { min-width: 26px; height: 26px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #777; font-size: 12px; display: inline-flex; align-items: center; justify-content: center; padding: 0 6px; }', '#ugf-cal-account .sharebtn { height: 26px; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font-size: 12px; display: inline-flex; align-items: center; gap: 5px; padding: 0 10px; }', '#ugf-cal-account .sharebtn b { font-size: 14px; font-weight: normal; color: #777; }', '#ugf-cal-account .pfpwrap { display: inline-flex; align-items: center; gap: 3px; border: 1px solid #dcdcdc; border-radius: 2px; padding: 1px 4px 1px 1px; cursor: pointer; }', '#ugf-cal-account .pfpwrap .car { font-style: normal; color: #777; font-size: 9px; }', '#ugf-cal-account .pfp { width: 24px; height: 24px; display: block; object-fit: cover; border-radius: 1px; }', '#ugf-cal-account .pfp.letter, #ugf-cal-head .pfp.letter { background: #c62828; color: #fff; display: flex; align-items: center; justify-content: center; text-transform: uppercase; }', '#ugf-cal-account.mat .pfp { width: 32px; height: 32px; border-radius: 50%; }', '#ugf-cal-account .ic { display: inline-flex; width: 30px; height: 30px; align-items: center; justify-content: center; color: #666 !important; }', '#ugf-cal-head .signin { margin-left: auto; display: inline-flex; align-items: center; height: 29px; padding: 0 12px; background: linear-gradient(#dd4b39, #d14836); border: 1px solid #c53727; border-radius: 2px; color: #fff !important; font: bold 13px arial, sans-serif; text-decoration: none; }', '#ugf-cal .ugf-cal-askfence { background: rgba(255,255,255,.75); }', '#ugf-cal .ugf-cal-ask { border: 1px solid rgba(0,0,0,.333); box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 30px 42px; color: #222; }', '#ugf-cal .ugf-cal-ask .at { font-size: 16px; margin-bottom: 16px; }', '#ugf-cal .ugf-cal-ask .ax { margin-bottom: 14px; line-height: 17px; }', '#ugf-cal .ugf-cal-ask .ar { margin-bottom: 14px; }', '#ugf-cal .ugf-cal-ask .ab { margin-top: 18px; }', '#ugf-cal .ugf-cal-ask button { height: 29px; min-width: 72px; padding: 0 8px; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font: bold 11px arial, sans-serif; cursor: default; }', '#ugf-cal .ugf-cal-ask button:hover { border-color: #c6c6c6; box-shadow: 0 1px 1px rgba(0,0,0,.1); color: #222; }', '#ugf-cal .ugf-cal-ask button.pri { border-color: #3079ed; background: linear-gradient(#4d90fe, #4787ed); color: #fff; }', '#ugf-cal .ugf-cal-ask button.pri:hover { border-color: #2f5bb7; background: linear-gradient(#4d90fe, #357ae8); }', '#ugf-cal-edit .reptxt { color: #222; }' ]; css.c2011 = css.c2011.concat([ '#ugf-cal-edit { padding: 0 24px 20px 16px; }', '#ugf-cal-edit .etop { display: flex; align-items: center; gap: 12px; height: 58px; }', '#ugf-cal-edit .etop .back { color: #15c !important; font-size: 13px; margin-right: 8px; }', '#ugf-cal-edit .etop .red { display: inline-flex; align-items: center; height: 29px; padding: 0 16px; border: 1px solid #b0281a; border-radius: 2px; background: linear-gradient(#dd4b39, #d14836); color: #fff !important; font: bold 11px arial, sans-serif; text-decoration: none; }', '#ugf-cal-edit .etop .kb { padding: 0 16px; }', '#ugf-cal-edit .erow { margin: 0 0 12px 0; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }', '#ugf-cal-edit input[type=text], #ugf-cal-edit textarea { border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 4px 6px; font: 13px arial, sans-serif; outline: none; border-radius: 1px; }', '#ugf-cal-edit input[type=text]:focus, #ugf-cal-edit textarea:focus { border-color: #4d90fe; box-shadow: inset 0 1px 2px rgba(0,0,0,.3); }', '#ugf-cal-edit .title.big { width: 560px; max-width: 100%; font-size: 18px; height: 34px; }', '#ugf-cal-edit .when input { height: 27px; } #ugf-cal-edit .to { color: #222; margin: 0 2px; }', '#ugf-cal-edit select { height: 27px; border: 1px solid #d9d9d9; border-radius: 2px; background: #f5f5f5; font: 13px arial, sans-serif; color: #444; padding: 0 4px; } #ugf-cal-edit .rl { margin-right: 4px; }', '#ugf-cal-edit .etabs { display: flex; border-bottom: 1px solid #ebebeb; margin: 18px 0 12px 0; } #ugf-cal-edit .etabs span { padding: 8px 14px; color: #666; font-size: 13px; } #ugf-cal-edit .etabs span.on { color: #dd4b39; font-weight: bold; border-bottom: 2px solid #dd4b39; }', '#ugf-cal-edit .etab th { color: #222; font-size: 13px; width: 110px; padding-top: 10px; }', '#ugf-cal-note { background: #f9edbe; border: 1px solid #f0c36d; border-radius: 2px; padding: 4px 14px; font-weight: bold; color: #222; top: 60px; box-shadow: 0 2px 4px rgba(0,0,0,.2); }', '#ugf-cal .ugf-cal-menu { border: 1px solid rgba(0,0,0,.2); box-shadow: 0 2px 4px rgba(0,0,0,.2); padding: 6px 0; font-size: 13px; }', '#ugf-cal .ugf-cal-menu .it { color: #222 !important; padding: 6px 44px 6px 12px; }', '#ugf-cal .ugf-cal-menu .it:hover { background: #eee; }', '#ugf-cal .ugf-cal-menu .it .tick { color: #222; font-size: 13px; }', '#ugf-cal .ugf-cal-menu:not(.calm) .it:not(.ck) { padding-left: 30px; }', '#ugf-cal .ugf-cal-menu .sep { border-top: 1px solid #ebebeb; margin: 6px 0; }', '#ugf-cal .ugf-cal-menu .hd { color: #777; padding: 6px 44px 6px 16px; font-size: 13px; }', '#ugf-cal .ugf-cal-menu .sws { padding: 4px 16px 8px 16px; gap: 3px; } #ugf-cal .ugf-cal-menu .sw { width: 18px; height: 18px; border-radius: 1px; } #ugf-cal .ugf-cal-menu .sw:hover { outline: 1px solid #333; }', '#ugf-cal .ugf-cal-menu .sw .mi svg { width: 13px; height: 13px; }', '#ugf-cal .kb.menuon { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.1); border-color: #ccc; }', '#ugf-cal-cals .cal .dd { padding: 0 4px; } #ugf-cal-cals .cal .dd.menuon { visibility: visible; }', // Cozy and Compact '#ugf-cal.dens-cozy #ugf-cal-bar { height: 50px; } #ugf-cal.dens-cozy #ugf-cal-side .label { height: 50px; margin-top: -50px; padding-top: 12px; } #ugf-cal.dens-cozy #ugf-cal-side { padding-top: 50px; }', '#ugf-cal.dens-compact #ugf-cal-bar { height: 42px; } #ugf-cal.dens-compact #ugf-cal-side .label { height: 42px; margin-top: -42px; padding-top: 8px; } #ugf-cal.dens-compact #ugf-cal-side { padding-top: 42px; }', '#ugf-cal.dens-cozy .kb { height: 27px; } #ugf-cal.dens-compact .kb { height: 25px; min-width: 30px; }', '#ugf-cal.dens-cozy #ugf-cal-side .create, #ugf-cal.dens-compact #ugf-cal-side .create { margin: 8px 0 12px 0; }', '#ugf-cal.dens-compact .ev.tm { font-size: 11px; } #ugf-cal.dens-compact .ghead .dh { padding: 2px 0; } #ugf-cal.dens-compact #ugf-cal-cals .cal { padding: 1px 4px; }' ]); css.c2013 = css.c2011; // ---- October 2017 on: Material css.c2017 = [ '#ugf-cal { font: 14px Roboto, arial, sans-serif; color: #212121; }', '#ugf-cal a { color: inherit; text-decoration: none; }', '#ugf-cal-head { display: flex; align-items: center; height: 64px; padding: 8px; border-bottom: 1px solid #e0e0e0; flex: 0 0 auto; }', '#ugf-cal-head .ib { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; color: #5f6368 !important; margin: 0 2px; }', '#ugf-cal-head .ib:hover { background: rgba(0,0,0,.06); }', '#ugf-cal-head .burger { display: inline-flex; width: 48px; height: 48px; align-items: center; justify-content: center; border-radius: 50%; color: #5f6368 !important; margin: 0 4px; }', '#ugf-cal-head .logo { display: flex; align-items: center; gap: 4px; width: 238px; padding-left: 4px; }', '#ugf-cal-head .logo img { display: block; }', '#ugf-cal-head .logo .name { font-size: 22px; color: #757575; padding-left: 4px; }', '#ugf-cal-head .nav { display: flex; align-items: center; flex: 1; gap: 2px; }', '#ugf-cal-head .today { display: inline-flex; align-items: center; height: 36px; padding: 0 16px; margin-right: 12px; border-radius: 2px; background: #eee; color: #333 !important; font-weight: 500; font-size: 14px; }', '#ugf-cal-head .title { font-size: 20px; color: #212121; margin-left: 8px; white-space: nowrap; }', '#ugf-cal-head .tools { display: flex; align-items: center; gap: 2px; }', '#ugf-cal-head .viewsel .vs { display: inline-flex; align-items: center; height: 36px; padding: 0 4px 0 12px; border-radius: 2px; background: #eee; color: #333 !important; font-weight: 500; margin: 0 6px; }', '#ugf-cal-head .me { margin: 0 8px 0 6px; } #ugf-cal-head .me .pfp { width: 32px; height: 32px; border-radius: 50%; display: block; object-fit: cover; }', '#ugf-cal-head .me .pfp.letter { background: #c62828; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 16px; text-transform: uppercase; }', '#ugf-cal-head .signin { display: inline-flex; align-items: center; height: 36px; padding: 0 16px; background: #4285f4; border-radius: 2px; color: #fff !important; font-weight: 500; margin: 0 8px; }', '#ugf-cal-side { width: 256px; padding: 16px 0 16px 0; }', '#ugf-cal-mini { padding: 0 16px 0 24px; margin: 0 0 12px 0; }', '#ugf-cal-mini .mhead { display: flex; align-items: center; height: 32px; font-size: 13px; color: #212121; }', '#ugf-cal-mini .mhead .mt { flex: 1; }', '#ugf-cal-mini .mp { display: inline-flex; width: 28px; height: 28px; align-items: center; justify-content: center; border-radius: 50%; color: #616161 !important; }', '#ugf-cal-mini .mgrid { width: 100%; border-collapse: collapse; font-size: 10px; }', '#ugf-cal-mini .mgrid th { font-weight: 500; color: #757575; height: 24px; }', '#ugf-cal-mini .mgrid td { text-align: center; height: 28px; cursor: pointer; color: #212121; }', '#ugf-cal-mini .mgrid td span { display: inline-flex; width: 24px; height: 24px; align-items: center; justify-content: center; border-radius: 50%; }', '#ugf-cal-mini .mgrid td:hover span { background: #eee; }', '#ugf-cal-mini .mgrid td.out { color: #9e9e9e; }', '#ugf-cal-mini .mgrid td.cur span { background: #e0e0e0; }', '#ugf-cal-mini .mgrid td.today span { background: #4285f4; color: #fff; }', '#ugf-cal-cals .people { display: flex; align-items: center; margin: 12px 16px 8px 24px; background: #eee; border-radius: 2px; }', '#ugf-cal-cals .people input { flex: 1; min-width: 0; border: 0; background: transparent; height: 40px; padding: 0 12px; font: 14px Roboto, arial, sans-serif; outline: none; }', '#ugf-cal-cals .people .add { display: inline-flex; color: #616161 !important; padding: 0 8px; }', '#ugf-cal-cals .sect { border-top: 1px solid #e0e0e0; padding: 8px 0; }', '#ugf-cal-cals .sh { display: flex; align-items: center; justify-content: space-between; height: 40px; padding: 0 16px 0 24px; font-size: 14px; color: #616161; font-weight: 500; }', '#ugf-cal-cals .sh .add { display: inline-flex; color: #616161 !important; margin-left: auto; margin-right: 4px; }', '#ugf-cal-cals .sh .mi { color: #616161; }', '#ugf-cal-cals .cal { display: flex; align-items: center; height: 32px; padding: 0 16px 0 24px; gap: 16px; color: #212121 !important; }', '#ugf-cal-cals .cal:hover { background: #f5f5f5; }', '#ugf-cal-cals .cal .ck { display: inline-flex; width: 18px; height: 18px; border: 2px solid; border-radius: 2px; align-items: center; justify-content: center; color: #fff; flex: 0 0 18px; }', '#ugf-cal-cals .cal .ck svg { width: 14px; height: 14px; }', '#ugf-cal-cals .cal .cn { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }', '#ugf-cal-view { border-left: 1px solid #e0e0e0; }', '#ugf-cal .gutter { width: 56px; }', '#ugf-cal .ghead .dh { padding: 8px 0 6px 0; text-align: left; padding-left: 8px; border-left: 1px solid #e0e0e0; }', '#ugf-cal .ghead .dh .dw { display: block; font-size: 12px; color: #757575; }', '#ugf-cal .ghead .dh .dn { display: block; font-size: 40px; line-height: 44px; color: #212121; }', '#ugf-cal .ghead .dh.today .dw, #ugf-cal .ghead .dh.today .dn { color: #4285f4; }', '#ugf-cal .ghead .tz { display: block; font-size: 10px; color: #757575; padding: 60px 0 0 6px; }', '#ugf-cal .gall { border-bottom: 1px solid #e0e0e0; }', '#ugf-cal .adcol { border-left: 1px solid #e0e0e0; }', '#ugf-cal .hl span { display: block; text-align: right; padding-right: 8px; font-size: 12px; color: #757575; margin-top: -8px; }', '#ugf-cal .line { border-top: 1px solid #e0e0e0; }', '#ugf-cal .col { border-left: 1px solid #e0e0e0; } #ugf-cal .col.today { background: #f5f5f5; }', '#ugf-cal .now { border-top: 2px solid #db4437; }', '#ugf-cal .ev.tm { border-radius: 2px; color: #fff; font-size: 12px; padding: 2px 6px; box-shadow: 0 0 0 1px #fff; }', '#ugf-cal .ev.tm .eb { font-weight: 500; } #ugf-cal .ev.tm .eh { opacity: .95; }', '#ugf-cal .ev.tm.short { padding: 0 6px; white-space: nowrap; line-height: 16px; } #ugf-cal .ev.tm.short b { font-weight: 500; }', '#ugf-cal .ev.ad { border-radius: 2px; padding: 2px 8px; font-size: 12px; font-weight: 500; border: 0; }', '#ugf-cal .mhd div { font-size: 12px; color: #757575; padding: 6px 8px; border-left: 1px solid #e0e0e0; }', '#ugf-cal .mc { border-left: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0; padding: 2px 0; }', '#ugf-cal .mc .mn { padding: 4px 8px; font-size: 12px; color: #212121 !important; }', '#ugf-cal .mc.out .mn { color: #9e9e9e !important; }', '#ugf-cal .mc.today .mn { color: #4285f4 !important; font-weight: 500; }', '#ugf-cal .mc .ev.mt { display: flex; align-items: center; gap: 4px; font-size: 12px; padding: 1px 6px; } #ugf-cal .mc .ev.mt .dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 8px; } #ugf-cal .mc .ev.mt b { font-weight: 500; }', '#ugf-cal .mc .ev.ad { margin: 0 4px 1px 4px; }', '#ugf-cal .mc .more { display: block; font-size: 12px; padding: 2px 8px; color: #616161 !important; font-weight: 500; }', '#ugf-cal .agenda { padding: 12px 0; }', '#ugf-cal .aday { border-bottom: 1px solid #e0e0e0; padding: 8px 0; }', '#ugf-cal .adate { width: 140px; flex: 0 0 140px; display: flex; align-items: center; gap: 8px; padding: 0 16px; }', '#ugf-cal .adate .dn { font-size: 26px; color: #212121; width: 36px; }', '#ugf-cal .adate .dw { font-size: 11px; color: #757575; }', '#ugf-cal .aday.today .adate .dn, #ugf-cal .aday.today .adate .dw { color: #4285f4; }', '#ugf-cal .ev.ag { height: 32px; padding: 0 16px; } #ugf-cal .ev.ag:hover { background: #f5f5f5; }', '#ugf-cal .ev.ag .dot { width: 12px; height: 12px; border-radius: 50%; flex: 0 0 12px; order: -1; }', '#ugf-cal .ev.ag .at { width: 140px; color: #616161; font-size: 13px; } #ugf-cal .ev.ag .an { font-weight: 500; }', '#ugf-cal .agenda .none { padding: 24px; color: #757575; }', '#ugf-cal-loading { background: #323232; color: #fff; padding: 8px 16px; border-radius: 2px; top: 8px; }', '#ugf-cal-fab { position: absolute; right: 24px; bottom: 24px; width: 56px; height: 56px; border-radius: 50%; background: #db4437; color: #fff !important; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 5px rgba(0,0,0,.26); z-index: 20; }', '#ugf-cal .ugf-cal-bubble { width: 448px; border-radius: 2px; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); padding: 0 0 16px 0; }', '#ugf-cal .ugf-cal-bubble .bt { display: flex; justify-content: flex-end; padding: 6px 6px 0 0; }', '#ugf-cal .ugf-cal-bubble .ib { display: inline-flex; width: 36px; height: 36px; align-items: center; justify-content: center; border-radius: 50%; color: #616161 !important; }', '#ugf-cal .ugf-cal-bubble .ib:hover { background: #f1f1f1; }', '#ugf-cal .ugf-cal-bubble .br { display: flex; align-items: flex-start; gap: 24px; padding: 6px 24px 6px 28px; color: #212121; }', '#ugf-cal .ugf-cal-bubble .br .mi { color: #616161; }', '#ugf-cal .ugf-cal-bubble .sq { width: 16px; height: 16px; border-radius: 3px; margin-top: 6px; flex: 0 0 16px; }', '#ugf-cal .ugf-cal-bubble .tt { font-size: 22px; line-height: 28px; }', '#ugf-cal .ugf-cal-bubble .tw { font-size: 14px; color: #3c4043; margin-top: 2px; }', '#ugf-cal .ugf-cal-bubble.new-b { padding: 16px 24px; width: 420px; }', '#ugf-cal .ugf-cal-bubble.new-b .x { position: absolute; right: 6px; top: 6px; }', '#ugf-cal .ugf-cal-bubble.new-b .what { width: 100%; border: 0; border-bottom: 1px solid #e0e0e0; font: 22px Roboto, arial, sans-serif; padding: 8px 0; outline: none; margin: 24px 0 12px 0; }', '#ugf-cal .ugf-cal-bubble.new-b .what:focus { border-bottom: 2px solid #4285f4; }', '#ugf-cal .ugf-cal-bubble.new-b .acts { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }', '#ugf-cal .ugf-cal-bubble.new-b .acts a { display: inline-flex; align-items: center; height: 36px; padding: 0 16px; border-radius: 2px; font-weight: 500; }', '#ugf-cal .ugf-cal-bubble.new-b .acts .more { color: #616161 !important; } #ugf-cal .ugf-cal-bubble.new-b .acts .save { background: #4285f4; color: #fff !important; }', '#ugf-cal .ugf-cal-bubble .tail { display: none; }', '#ugf-cal .ugf-cal-askfence { background: rgba(0,0,0,.4); }', '#ugf-cal .ugf-cal-ask { padding: 24px 24px 8px 24px; border-radius: 2px; font: 14px Roboto, arial, sans-serif; color: #616161; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); }', '#ugf-cal .ugf-cal-ask .at { font: 500 20px Roboto, arial, sans-serif; color: #212121; margin-bottom: 20px; }', '#ugf-cal .ugf-cal-ask .ax { margin-bottom: 16px; line-height: 20px; }', '#ugf-cal .ugf-cal-ask .ar { margin-bottom: 12px; } #ugf-cal .ugf-cal-ask .ar label { padding: 8px 0; color: #212121; } #ugf-cal .ugf-cal-ask .ar input { width: 18px; height: 18px; margin: 0 8px 0 0; accent-color: #4285f4; }', '#ugf-cal .ugf-cal-ask .ab { justify-content: flex-end; margin: 0 -16px 0 0; }', '#ugf-cal .ugf-cal-ask button { height: 36px; min-width: 64px; padding: 0 8px; border: 0; border-radius: 2px; background: none; color: #4285f4; font: 500 14px Roboto, arial, sans-serif; text-transform: uppercase; cursor: pointer; }', '#ugf-cal .ugf-cal-ask button:hover { background: rgba(0,0,0,.06); }', '#ugf-cal-edit .reptxt { display: inline-flex; align-items: center; height: 36px; padding: 0 8px; color: #3c4043; }' ]; // ---- 2019 on: Google Material 2 css.c2017 = css.c2017.concat([ '#ugf-cal.editing #ugf-cal-head { display: none !important; }', '#ugf-cal-edit { padding: 0 24px 24px 8px; font: 14px Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-edit .etop { display: flex; align-items: center; gap: 12px; height: 72px; }', '#ugf-cal-edit .etop .ib { display: inline-flex; width: 48px; height: 48px; align-items: center; justify-content: center; border-radius: 50%; color: #5f6368 !important; }', '#ugf-cal-edit .etop .ib:hover { background: rgba(0,0,0,.06); }', '#ugf-cal-edit .title.big { flex: 0 1 640px; font: 22px "Google Sans", Roboto, arial, sans-serif; border: 0; border-bottom: 1px solid #dadce0; background: #f1f3f4; padding: 10px 12px 8px 12px; border-radius: 4px 4px 0 0; outline: none; color: #3c4043; }', '#ugf-cal-edit .title.big:focus { border-bottom: 2px solid #1a73e8; }', '#ugf-cal-edit .etop .save { margin-left: 16px; display: inline-flex; align-items: center; height: 36px; padding: 0 24px; border-radius: 4px; background: #1a73e8; color: #fff !important; font: 500 14px "Google Sans", Roboto, arial, sans-serif; text-decoration: none; }', '#ugf-cal-edit .erow { margin: 4px 0 8px 60px; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }', '#ugf-cal-edit .when input { border: 0; background: #f1f3f4; border-radius: 4px; padding: 8px; color: #3c4043; outline: none; } #ugf-cal-edit .when input:focus { background: #e8eaed; }', '#ugf-cal-edit .when .sd, #ugf-cal-edit .when .ed { width: 118px; } #ugf-cal-edit .to { margin: 0 4px; }', '#ugf-cal-edit select { border: 0; background: #f1f3f4; border-radius: 4px; padding: 8px; font: 14px Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-edit .etabs { display: flex; border-bottom: 1px solid #dadce0; margin: 16px 0 12px 60px; max-width: 640px; } #ugf-cal-edit .etabs span { padding: 10px 16px; color: #5f6368; font: 500 14px "Google Sans", Roboto, arial, sans-serif; } #ugf-cal-edit .etabs span.on { color: #1a73e8; border-bottom: 3px solid #1a73e8; }', '#ugf-cal-edit .mrow { display: flex; align-items: center; gap: 12px; margin: 6px 0 6px 72px; max-width: 628px; color: #5f6368; } #ugf-cal-edit .mrow.top { align-items: flex-start; }', '#ugf-cal-edit .mrow input, #ugf-cal-edit .mrow textarea { flex: 1; border: 0; background: #f1f3f4; border-radius: 4px; padding: 10px; color: #3c4043; outline: none; font: 14px Roboto, arial, sans-serif; }', '#ugf-cal-edit .mrow .cn { display: inline-flex; align-items: center; gap: 8px; color: #3c4043; } #ugf-cal-edit .mrow .dot { width: 14px; height: 14px; border-radius: 50%; }', '#ugf-cal-note { top: auto; bottom: 24px; left: 24px; transform: none; background: #323232; color: #fff; border-radius: 4px; padding: 14px 24px; font: 14px Roboto, arial, sans-serif; box-shadow: 0 3px 5px -1px rgba(0,0,0,.2), 0 6px 10px 0 rgba(0,0,0,.14); }', '#ugf-cal-note a { color: #8ab4f8 !important; text-decoration: none; font-weight: 500; margin-left: 16px; }', '#ugf-cal .ugf-cal-menu { border-radius: 2px; padding: 8px 0; min-width: 176px; font: 14px Roboto, arial, sans-serif; box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2); }', '#ugf-cal .ugf-cal-menu .it { color: #212121 !important; height: 32px; padding: 0 24px 0 16px; }', '#ugf-cal .ugf-cal-menu .it:hover { background: rgba(0,0,0,.06); }', '#ugf-cal .ugf-cal-menu .sep { border-top: 1px solid #e0e0e0; margin: 8px 0; }', '#ugf-cal .ugf-cal-menu .sws { padding: 8px 16px 4px 16px; gap: 6px; } #ugf-cal .ugf-cal-menu .sw { width: 22px; height: 22px; border-radius: 50%; }', '#ugf-cal .ugf-cal-menu .sw:hover { box-shadow: 0 0 0 2px rgba(0,0,0,.12); } #ugf-cal .ugf-cal-menu .sw .mi svg { width: 16px; height: 16px; }', '#ugf-cal-cals .cal .opt { margin-left: auto; display: none; color: #5f6368; } #ugf-cal-cals .cal:hover .opt, #ugf-cal-cals .cal .opt.menuon { display: inline-flex; }', '#ugf-cal-head .ib.menuon { background: rgba(0,0,0,.1); }' ]); css.c2019 = css.c2017.concat([ '#ugf-cal .ugf-cal-menu { border-radius: 4px; font-family: Roboto, arial, sans-serif; box-shadow: 0 1px 2px 0 rgba(60,64,67,.3), 0 2px 6px 2px rgba(60,64,67,.15); }', '#ugf-cal .ugf-cal-menu .it { color: #3c4043 !important; }', '#ugf-cal .ugf-cal-menu .it:hover { background: #f1f3f4; }', '#ugf-cal { font-family: Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-head { border-bottom: 1px solid #dadce0; }', '#ugf-cal-head .logo .name { font: 22px "Google Sans", "Product Sans", Roboto, arial, sans-serif; color: #5f6368; }', '#ugf-cal-head .today { background: #fff; border: 1px solid #dadce0; border-radius: 4px; font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #3c4043 !important; }', '#ugf-cal-head .title { font: 22px "Google Sans", "Product Sans", Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-head .viewsel .vs { background: #fff; border: 1px solid #dadce0; border-radius: 4px; font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #3c4043 !important; }', '#ugf-cal-head .signin { background: #1a73e8; border-radius: 4px; font-family: "Google Sans", Roboto, arial, sans-serif; }', '#ugf-cal-side .create2 { display: inline-flex; align-items: center; gap: 12px; height: 48px; padding: 0 24px 0 12px; margin: 8px 0 16px 8px; border-radius: 24px; background: #fff; color: #3c4043 !important; font: 500 14px "Google Sans", Roboto, arial, sans-serif; letter-spacing: .25px; box-shadow: 0 1px 2px 0 rgba(60,64,67,.302), 0 1px 3px 1px rgba(60,64,67,.149); }', '#ugf-cal-side .create2:hover { box-shadow: 0 1px 3px 0 rgba(60,64,67,.302), 0 4px 8px 3px rgba(60,64,67,.149); background: #fafafb; }', '#ugf-cal-mini .mhead { font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-mini .mgrid th { color: #70757a; }', '#ugf-cal-mini .mgrid td { color: #3c4043; } #ugf-cal-mini .mgrid td.out { color: #70757a; }', '#ugf-cal-mini .mgrid td.cur span { background: #d2e3fc; color: #185abc; }', '#ugf-cal-mini .mgrid td.today span { background: #1a73e8; color: #fff; }', '#ugf-cal-cals .people { background: #f1f3f4; border-radius: 4px; }', '#ugf-cal-cals .sect { border-top: 0; }', '#ugf-cal-cals .sh { font: 500 14px "Google Sans", Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal-cals .cal { color: #3c4043 !important; }', '#ugf-cal-view { border-left: 0; }', '#ugf-cal .ghead .dh { text-align: center; padding-left: 0; border-left: 0; }', '#ugf-cal .ghead .dh .dw { font: 500 11px "Google Sans", Roboto, arial, sans-serif; color: #70757a; letter-spacing: .8px; margin-top: 2px; }', '#ugf-cal .ghead .dh .dn { display: inline-flex; width: 46px; height: 46px; align-items: center; justify-content: center; border-radius: 50%; font: 26px "Google Sans", Roboto, arial, sans-serif; color: #3c4043; margin-top: 2px; }', '#ugf-cal .ghead .dh .dn:hover { background: #f1f3f4; }', '#ugf-cal .ghead .dh.today .dw { color: #1a73e8; } #ugf-cal .ghead .dh.today .dn { background: #1a73e8; color: #fff; }', '#ugf-cal .ghead .tz { font-size: 10px; color: #70757a; padding: 62px 0 0 8px; }', '#ugf-cal .gall, #ugf-cal .ghead { border-bottom: 0; }', '#ugf-cal .gall { border-bottom: 1px solid #dadce0; }', '#ugf-cal .adcol { border-left: 1px solid #dadce0; }', '#ugf-cal .hl span { font-size: 10px; color: #70757a; margin-top: -7px; }', '#ugf-cal .line { border-top: 1px solid #dadce0; }', '#ugf-cal .col { border-left: 1px solid #dadce0; } #ugf-cal .col.today { background: transparent; }', '#ugf-cal .now { border-top: 2px solid #ea4335; } #ugf-cal .now:before { content: ""; position: absolute; left: -6px; top: -7px; width: 12px; height: 12px; border-radius: 50%; background: #ea4335; }', '#ugf-cal .ev.tm { border-radius: 4px; font-size: 12px; padding: 1px 8px; }', '#ugf-cal .ev.ad { border-radius: 4px; }', '#ugf-cal .mhd div { font: 500 11px "Google Sans", Roboto, arial, sans-serif; color: #70757a; text-align: center; border-left: 1px solid #dadce0; letter-spacing: .8px; }', '#ugf-cal .mc { border-left: 1px solid #dadce0; border-bottom: 1px solid #dadce0; }', '#ugf-cal .mc .mn { text-align: center; font: 500 12px "Google Sans", Roboto, arial, sans-serif; color: #3c4043 !important; padding: 4px 0; }', '#ugf-cal .mc.today .mn { color: #1a73e8 !important; }', '#ugf-cal .mc .more { color: #3c4043 !important; }', '#ugf-cal .adate .dn { font: 26px "Google Sans", Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal .aday.today .adate .dn { color: #1a73e8; } #ugf-cal .aday.today .adate .dw { color: #1a73e8; }', '#ugf-cal-loading { background: #202124; border-radius: 4px; }', '#ugf-cal .ugf-cal-bubble { border-radius: 8px; }', '#ugf-cal .ugf-cal-bubble .tt { font: 22px "Google Sans", Roboto, arial, sans-serif; color: #3c4043; }', '#ugf-cal .ugf-cal-bubble.new-b .what { font-family: "Google Sans", Roboto, arial, sans-serif; } #ugf-cal .ugf-cal-bubble.new-b .what:focus { border-bottom-color: #1a73e8; }', '#ugf-cal .ugf-cal-bubble.new-b .acts a { border-radius: 4px; font-family: "Google Sans", Roboto, arial, sans-serif; } #ugf-cal .ugf-cal-bubble.new-b .acts .save { background: #1a73e8; }', '#ugf-cal .ugf-cal-askfence { background: rgba(32,33,36,.6); }', '#ugf-cal .ugf-cal-ask { border-radius: 8px; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2); }', '#ugf-cal .ugf-cal-ask .at { font: 22px "Google Sans", Roboto, arial, sans-serif; color: #202124; }', '#ugf-cal .ugf-cal-ask button { text-transform: none; border-radius: 4px; color: #1a73e8; font: 500 14px "Google Sans", Roboto, arial, sans-serif; letter-spacing: .25px; }', '#ugf-cal .ugf-cal-ask button:hover { background: #f6fafe; } #ugf-cal .ugf-cal-ask .ar input { accent-color: #1a73e8; }' ]); css.c2022 = css.c2019; return common.concat(css[era] || css.c2013).join("\n"); } // ---- end Gplex for Google Calendar ---- // ---- Gplex for Google Maps (4.1) ------------------------------------------ // Google's own Maps app keeps running underneath, hidden, and does the searching; // Gplex draws the page and its own map on top. The map is Google's map tiles, the // flat kind Maps used until 2013, coloured per era through the tile server's own // style setting - which is how the old yellow highways come back. // Assets are Google's own (the 2005-2013 controls, markers and logos still served // from maps.gstatic.com) and, for 2015-2018, the shapes out of the Google Maps UI // kit, inlined so nothing depends on them staying online. // (a function, not a const: the page code reaches this before a const this far // down in the script would exist) function ugfMapsArt() { if (!ugfMapsArt.c) { ugfMapsArt.c = {"logo2005":"data:image/gif;base64,R0lGODlhlgA3APcAAI6Xqvno5ap4cfL2/YV0aP///5yjs61JOzNQjcS6uPbWKvLy8vfVyWfUbbq6uurq6szMzM7JuYup59fX1//Wmd3d3v+tM8LCwfb29pmZme/v8KsVAa2trdra2qSko+3t7eTk5AE2qwA9wr29vra2tvj4+Ojo6AFkBgI7uQFAytTU1LOzs+Hh4ZISAezs7AFF2+bm5sYaAgEtjrCwsBFRFKmpqcXFxf+0RHMTBf/PiNEnEAEmeFSH83zWgJCQkQiUD3R2d4CBgEd/9Oa2Af/ku9erAYiFg4qLigAzmbUoFOJKNQ1M1Y1xA8ifAvT09LyVAP+gERs4dwVN6/KThWSX+G6f+BdMxPJpVhNGtrfM9ETJTNI2IeI9JhY+k/+7VTJq5W5ZCE1YbvLAAsnY9vGFdS9EcXOn+C9XrrSOAP/MANrl+CVb0vV4Zipp8qiGAQ09p//rzP+nImp2kHslGU5tsWN5qxhW3P/Jdxla6UvMUhCeGHmJrTJv8zp19e5ZRa83J//47mJrff/x3XZOSG83L0ZbiGSK3amUjGldS/CmnIV1NItTTFXRXIGJm5UlFevy/BQsYKCgoLBmXCVi59SXj0tjl/riclUPBf/dqjpgst3h6/r10JGkzfnuiz9rzOXr+GyU7ebX1clURP/dDJ9/Apa6+erRav/CZo82KqetuvPAuI7YksKkn7yrqZmHdo209qe6p2FrX7C4yP308tWyLDtz6bu4qRamHqqJEFV4xYOq97KYMF1BNZ3SoKS+9LGel+CCdbvE1/z78rehT/z2VrBVSJ7D9/j6/puKSbmsd8mvT9zPnXuTxX2c47S2uom6i+bKx/7++dPMzPbdWub0599zZE6FUSm4Mf36+dfSzfTJHqeVTf/qEd7U06enp8u9hcjhyZuy4eLcx/fLxPi4rcO9pNm4tBmBHsXO4ffusTPAO6KJhtjBbNFsXzq9QZqBHYeZh/P387evkfvW0ZXmmf+ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAACWADcAAAj/AAsIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo0eBA9SMyUJyjJoBH1NepEavQQNG1/Sce/ZBZcIxumotSSECBQoRKV7gqQXK1yebSBmCc9mjB6NbJ6x1MIEhKcgsPOykeHOGTp09deicQRFUihQ8PLKUsMp2YDwNFWDlufbjRBAHEzRYHUNlEpYze1KtmMGhMIcaAOpgEfGi8QtPwaq2TVrCxYRn6vScoAGEw4QFSAeUEmKlS6PDNTisIOGg9YoaHjJUIvsiRQgZAEBPRroARK88UDnP6CA55SMzfbCUAZDBAwcHECBM6EBdBYQLMzLIWYxkR5RULJzs/0aqodfTzXdB2DwuBEsUH81JQKhgQsMCDPgXfIDRwQaHRm/sAEkQHEBQ03gqlWBecEZcYIJKx5jBgxU7BOGDByN04EJxBmFgggoGvBEFEEZwoIJeCKakICOa0XCEDQ+oZAwVa+wQhhEZXFCBbgtpwEkdPlxoAwgcpsgRBquwuJkPNriQkhpV9BECJEBk4EAF4jlkAgQrrAABkUamhKSSNPgAgZMfvUKFHTaW+BlEC7CgwgRUhSnmKnm0mIGBH6lhhhAh7BBIBjY8CFEJ+i2w1kKzqDIFGWRMkcg4s0QkzCadWKJpJ+kIM9ExA4QqaqiPHFUAknlutueBBs0yTiJTSP+qSgAFsWBDfwVcgGIBxpgxiQwDckBcSvOwsUUMSSShwxZccKEEMLQytIklYhTRRBNFDCFGGtqYwqpCOPEgBA9UVEEFD3zgscRfnOi1AJ56QrDrQAFMwYUOym6hRLPAfLtCATNUMAMMIOlCBYVlHDECwR7NYm8SkrCSQAKtCPCHDjrEsIU5RRIUTSdpPDFMORdcYEsytGg7BC3LdDzQGDwssUYunqzxhRB94GFFJmdUIksFD2CwQA951EXDnvMWQI4SSRQjccUXZ3xAKJKRUMAEENwqEJRCoLBDGat6FAAZXDjyiwMkpL0CBxn8EcPbG1DCI0HCECMGLvKMkDYJa3v/sEu21n6TtECltGEFJ9c5YEAmS9T2hhzOQcfCAhoQbTTSBCXC9CF6d8m22zFs8AcLLguURZReh+GBCnNnNLYSjhySmgM2RGcDCW3DvQErSUdDTBpuHFIY7baT4HcR1qLxzbcFjIaFAWi3NoMHZ6Rgmwxy1DCCClQNXbSq8g5EzhVJCFAYCRdcR8IhGW/QggAwlO4LFW0EGkYNw3I0BfmDNDcCBCwwgQlAMIERrEN3jpDG3DoxiicoojmSEyB/LvAL5BXhCbiIwK6yQCMEpOZ/1nEAABpnmy4UCAag8d7lwleAALBBCXOA4HxAwIICiiIGLcABDi6AJoNIgAd4uE0Y/zhQgdJRRBVkUAIOCJABEkzgA4sqQJwucAC4tUASRRTIJrghBiYwcQUq2NBAMAACGyhjCNZywzZ2VAD2vKEQTeSeBlxQARvkojEokMEeOqCboWlhhSjaXxIIkYECBU0gC+iGEjaAg0sQogZZLAgGQNEGKdwGAQEzokSwQQY2JAEHQfAAnyRZgV+0rwVzSECMCkCMUTQBDKE8U4dYUI4hDKEJbmCCLUxQgiyY4QsyCMOeVnkqFqRCCi/IYyFG6UdAtvCFLejfBRjWwilsYQNz4AUi3NS6UxkCmXksg7A0GREGsMEPjDQCCVgQRYJoAAL3wiEOXNEBJ2wxDWiAZSYPsv8AFdCiWmhggivy8ooqrCGYNXjTQPr5BSmIQAZlcIB6pNiDP4JPL6pgAxeiKUrQmBNfBxBABoyAoyt1DAPNMIsIkBAFD0yAnBBJRBJzeAQHIaQELGgHF0KHg0WcKR2jEIMbwGCEhSUEBuwQwxACqoghSWgJEB1nQWBgiDakQAZRkGozL1qARBgrmjXIRiL8gCxJtGIEHPCAcy7QAeYJBAPhMMv1GgGBblZkCl/FgZl6aJAPUEIJOmAkIRzAAkuMYghDbZChDqKBZaRhCE9ggiKcCIo+LIGl+CvSByTQhxR8bXUprKgz96eDFhBCAAdIwgEOkYDOkeB/HUDhTdEh1xD/IKESsnQIqEZFqk8MAANkuMIWcmiEUR7ECebwAxcEO4MJTOOxuTQCjBKCAXGkQQyRBUMNIGAIPLzgNo1gXUEWEI4+pA60FLXo0eQF3CuUdg7rSIA0IDACtIGQBS7IUkJA0NAXiCAEXXDGRBcyAF8IoQ184EEVqsCDSVjhDGP4QHBLu8QmJaQE0LjCInHwSAiY4rEBJYBNE8ICbWCXCWAQJSfwiIRlMg8DEvgVlTKbXkAC1w/vzcD/bHCB2sVWAzAtwAOY0RjbIKEOE9AvQrIghDWsIROeIFcVrIqEn7EAGDhm5CJGjJBQaJiRvBDlhyEr2REM+CAmUEDIwIAIUUJg/w08CUEIDMBOgmCAB1iw0REIu5atrlcDTphClpcI2w6w4AF2TcgCgkHC/3ZhBMREiBo0gTUScMAAfODDZbMKgQ5Q4l7uGywLFMICDbfgEojY7jKU2gRSMGEFFWhnQVygAKGyWZQTMIBPUBACLMhiXq+wQzCDsCc0+RlpGDAHqFuAiit94D4SwUAF7lgbXtOhngrxkAouQIIZYBoPD41CjipgjlPi4Bf5O4iXt9BIIMxABdmwZRECeogkJ+QDChgCioGQUBBAYA9vQAISet2MMXxiDGawQxeCcAQdkw6Ror0oBrpxrA247xCRnMgDRmAF6/UkBMyg5kFK8AEWdMA6sv/gQRvCTSgQVOCGoWuBTwc3EFX4IQmX4MWeK1CBM16QFMgwrkE24Uow8EKdkwPBBXyAgC7IIARLEAKDJ9EF5liJjwuN+J8LAAKYuw8VLJzIAjqwB6DwxCeccKudKacBDaCDCnxg+ZlMwAorOoIEIi/IFJRw6ipB4AEPiADymoAGUtjizAUBGSnAEAtCxWgBFRjBSAMhhz0YogpfCAEcMdSBeR07fC5IgO42cICMS2RLdBCB6lWPgnY5RBNU6IPc7aMCSVjcfQdQaEECcHNUB2E4Cxh7Mq5F+F2I1yDCUMArERGEhPaRBRDITgYy8IU2XBYBV0/a5/XihAnY/vYbKAb/1W66EGk7IBM+WX0KDKGJhsCeD16DxJ5AAwMqgl8AIJA1NoyFg0EQ++8CYQI2sA1PUIAi83AFYQlFwATMlyMihwEP0AFZ4wxfgAe28QZ0FWmI1ADqUBcngDkFYAIX8AfgtwFbQAnRQi+UAA0MoQEqMAOVIGc/YT1rIAE0RxCaIASXJSDzJ0UdsAKL0AItYHGSEApRxADkMwcEUFKR5AQVQALI4AZugAZPoAziUBybMA0LSABH4AMkgHWS9AEm0AFV5V8+wQyLNRAa4A6acQJRAQvgQA0+yAGoIIS3pzFXECnAIApJQAmAxhAuAAEcIAddMHAhABQvsAagkAWmQhCP/5AFoLCD3tGDBfABgkgAc2CHGyAK1VANgLUBizB9TZQX7vSCrqAIpDCFTUALpmAKCjBvyCCKYKR2A/EBwaAVqycCucBXBdADHkgDbngCM3EfgVgDQSiEQwh+zMYKE8ACULQQJfAA0ecDheB0hoiIdnAzPCAuX2AHS4ACXVAGZRAG/HZ80TiNBDAIqOAI7PgHxSAArTA9HoAXbuUCKrACGUAAiqAI74ALuLALw5AMtrACauUAYXQQAzAGpVAFQvAF/xUCZMETnpB/AwEOsHAEsZCRQAAPsNABQeMhEFADQTAIc6BDOjQHi+AKKwBbLiBrI2cZDjB5ZRAFMlCThihnb/+ABZnwFQaQAUcQBMRmUgNRGQUUG/DhATPQGnwzA/JRATf4AR0wAjWQAUeZlK7BlLfiVmqgC5omAn+RCZXQdBB5dnQQPwIRiGzThRlQA5IDGiCJj0YABHLJcM3xHF+SaPwEffj4k3JJeXLQCI1gABygNn3jATUwA2zlVnFCX2ujGqwxAukzFUpmEL2xbY25Gg4AmdIhW474CkJgB29QB6kwAiNAkD4ABAhwiB+3B7wkRdB3AaTZY/MhRgVAchJIkKLYHCuQPiCAlwiBAXREX2mVm83hHDOwApkpmypQATCgAS5ZmxoAAxVgHdGhAoZmAr45lAtgAtMZHRBgnfShKAX/wTVWgACC6ZhoMz0+MBuqB2B8gigPAAPyKZ8m8AFF4gQP0J3eKR3OGGQHgQEfAAISeB2kGZveaZ0sAAPPRk4UUA8OygAf0HYW4KA3ABFC03ZtB20GMQASYgXitpYkUDtzgjUX4AFyYD23AQCm5xAX+gEuqqEYITRiCAMgUKMwYAIuYB8Y8JwI0aAOmgMCAQgOWg8V6hHGgHkyEAgXsj34ZR+U428zQAfJtANyIHR28hENCgX14AUCgQlDWqQcUQJmcDA7UCUjwEYFURkqkAp2IAKCwmVXiqVECgVQIBB3UA8TCqZ36qBeIAgFQAQOiglaGgdEMBB7uqWAMBBqQAVd/1OmnoGXluiQZSpRcaoSDXoDXlAPcFAAWnqnRXoKQ0qhfxqqQ7qpoBqqYJqDk/BQgUBYCwECtTAle3ZmkTB9EyBkoggBtSqKMRIJDlCpCXGpOVAPOQAHeDqsFQoIWrqpw1qngFoPp1AAghAHW1oA1AqkxqqpAVhJtoEAlAoueBBMPgCnGQACD5ABDwACGVAQ5SoQFTB9PFqpl2qsXjCsd4CsAyEIOXCoo1oPiVoAwxoHBZCpW1qsBOEChlBtIXBtmsQDb5AwojQv5boAGdAb60oQ7ZorMXmrwGoQl8qpUJCpmICvA0uq9dCvA9GgAisINxCqFuCnBfBOVrBrIgAZLv+jBjwgAthnJaYnipFQAuo6fRAgEBkbCRPQGh3rsURasg4KCPjqpcQKByrbr/8asASRAznQqW9VAQaQmhDJGLXQDL6QBSNRCjETAnUAG17CPOVaAg7gDerKrurxrqIYr1f6scOKpwC7tM2aqC0rsM/KpdMKrUJaDxQgEBMarWcJAR5QjQNHG45RG1hABwawNvLRmhirHhAAtxc7EO0qiFKUARWQtATxsdl6B3tboc9Kqv1Kqn56qENaqG/lbx5wBIFQCGdwBlbwYF4BAM7QbTPwP3VSELvKAYAnir9aAJEQIwUiENBBuim7tJxaD5iQugLhozcgCFpKBM9KBNRqAbJSC7BaiqfVa2cwAAG44wNHoJbNkRrHCR0aYrfQOx7PShEAWgGMCRuGqRoj4GOcOb/AWr8VAaDSOQHUKR0VAAIukJ0AjCACfBH5EXwL4AT+qRIBAQA7","logo2007":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAA3CAMAAADZn0ObAAADAFBMVEXy7c0jWMv29vb8/Pz////6+vr+/v68u7xxeI2uGAPy8fEOK2m0s7MTOIgXRahaiuytq6vQzs3h4eHm5eXu7u7e3d40Y8nT09SjoqI8bNPNzc7BwcHhtQT4+PhdhdnZ2dnMLBW3tbYVQJzEwsKysbHg39/09PSpqKjk4+O6uLjw8PDQ0NDn5+fAv7/9/f3X19caT8D7+/uamJkqVK5tmO3KHQWiggKEqvSIpuKHgYRtWxQaUszw9f1oFQlieKnj6vnV0dC6lQJNeNbKycmXjIbOxcHvWEOrrrfWqwSPEwKZfAd3o/Xr6uvMysptj9nb2trwwgSwsbLHoAN3iK3Ny8vFxMTMzMyenp6YseZKfejHx8fq6uqwr68pSY8YSrW1Khfz8/PlTTeLkJ6QkJLE0vK1yPEfW9yFi5ns6+vs7Oz8eWbIyMimcmvd3NwxQ2vo6OjGxsX0Z1OwjQE+cuBVaZejpaZFVn18QTlOb7j9qJv47au6rKekmXHLy8yLb2z5+v5eZXhwZlH6/P/MPivdMBi3ub/SlY2UU0rS1NrR3vaJbgSst8/a1dWmvu60SDmJNSk+W5tCWY2OJBX9uK4BYgWwo6HjQSuGmcSQiG27wtGyo5Hz9/3+/v2aobDCxc0sYNB+WVT5zAbExMa1t73+2AarNiekT0PY3emXqcsTURbO0dfBwsRa02HHsa6ujov7x8CNlar465aJfVH71M7rwyLk26eXu/T/9Q3p7/zKZlmN4ZGkk0/Pt7RGfknMwqAOjhWTvZXih3rW2N3h3stOylU/Ya2ququ9q2eFs/XGyMnZ29+Gw4kgoifXwWxhtWX9/f7/+trX5foYmh/HVkb//vIYbR398vF1bXB81IHmznKThEmvxbD65+QsWS6GcyXVb2Hs3tzZ79rDubi1Y1jIqzT++vmehSNoz243uT/K0Mq5oUT+6XjTq6XXs60qZujr6+yjyqUjiSfvmIvixlY2qDz//17Kp6Lu1izXx7MpZC3u7ePp7enBop3/9ULGydA7wUPVCGinAAAMoklEQVR4Xu3ZY5BkT7YA8L0s2raNtm3btj22bdv627aNpW0bj3mraqpvT+909Ivo3rfx4uWHmeipqexfnsw859yqL6D/kuP/Kuv/WRvOJG1YLsD3nnvuuZ989NEr2P+IldQVq5aJoYA4Qx235wa+5KivvvHV5x744OUX+bAPXzRrV+xkIrv54NTUwWa2t6enJ+PEjaVl/ZvH9NZP/vjy0dphK7xY1qexk4GDvdvWOeSZY9vOUQNeqKcHUkuW1IW0vfVfnx291ekyLZK1uZsjbu7IrHFRKBQXGBQule1N9LboK7GlU7nhtrfe+ACwqouQRZ2tpHc4gZncaiNTwdOYrFb+sKTBVXuwhc1iUIXYkp0xHEG/8QBg+XnmhY88STXSZOQqPE66yocgCAYLTY7cKRZjo80hdC9dvEIsqQReDGszUDGklqYqJxwJLo7ZBVTWxlppZj+y1CyLZ1GsfVFiBtXCdQjnAgQpvRYphTidSzd++8BnR7/F1agWwfq0sJ41IrXU3KNCEdijUxCqJWeVLiKdno0rDDC+YlGMztssWCQhEsySs4zDi2DtfKdez+g0zg8sjtHpc6/hNx9eterIw9+cD/jiJ6sffXT1F764IOnMxyj6ygMvH/1WkyjC+tHjR8CMfSGOFAxUGmbdjJUxRqYNffMvHO4mo768KkerbdUeb29/9ldzA/vJL57Iq6hQll164sO99xazwsLY2NjCqPoM2cqbMB5iMU2+8DJ/367Vbmlvb/9OWnDfAEoaZsFxUQHGRmMajC48juRod6yp4rkeurZ169b9e0mR+kVZ+lpDWk3VS38oK1O+jc1G5ylZYGWKOIPDyYAONh8q72/D5rKOtLcOfT97zQ+0W7dG/3swXGgkWq/FctgMqo2/cBo4uyqn9bTVkzk21tC0Pzo6ujU7ovoP5Y+z+Y7BhkxP9odKpfLn/XerWZS40uQcNqRAF7zsDl4mz8E3h1i6EGtV+7XvWyXvvvtuljY6mrYG7A7pbJ2KzdAz4l2NCx/tVeOtWbcprkyJRiJnXgMumuOuqqzAtc5W7fAM803ZX1PmVTzfFlbJqKM8sAxDSgsoFx0uhcSpQl95I8hCQlMeu01RyCW8mqGt0bTDw3OO/J5CGWBlChfewYEtK1xGRWk/DMNC6zGgoh3oD0bxT1cnTrqYxXw7rILpoy8BVvpaHAc7WKhu1gGKyaqpfjPRq2++bCXK2PtBFrE1jxNTMhvAG9uExcej85PXw24S6ybngp7Ru46+kEo4MH54PZfCD2YLHG78AeF6yOcGMzydt9ufm1nkC11dKwjXRAEPIVYrHmmyldJ9CGw/15MIwgUDyyzL/SqYkqkQYISDp81PTl4vgkmsE/WQnkV1LMj65cCW5HhmpGS4XwBBzz8ArvnmR69OJNRSrL7wCUT+WpaXHnOSjiaBizTCrbETWkQg7mlhzfBVZFbpQHt+vC6YlR5/VZu/4iudlgYhTmL9GixlI8++gAp7daA1Ocs16o5E73PCZaGjf3+6LCbBIm+LvMFUpqyI+fZe9LXCev1IkyZ8LSt/7WWNNNhxEiu4UpcQ/dGRcW3rkE5XW9vksN/LmlnwbH13YJyWnFVDkm8/rs3PXy9AX39aWZBALnGqr5VVxOw2YucLM/QsLj8cxT31gGUTICTWqwPa/HiJaHt76/VjHlE1U1etKcLIR76np0XPYvYt0L5kD+QcTs5KIzVJD+ZspeVffO3sk1eVBd/OFflmwU9eyovZ7e8/z5HpWf67rP/kQIwRkK3IrPHW/PVD+/cPZVs1Yy6DwySEEfJNFPX0ePWs3nkV8ZnQSE1NRX810E4DSyOx0saP05IvrsNWX82LSeDyySziX7L4Oyd72CyqKXwab3NaGBt1orksbf5Fm6lPIDEoij2CYJUjs7CVPV62/lApTDbhXYWTk5zC2Kh6KLANfWHgOIiNp43U84y3A5ZLRSB2S02kyvs6iF9ClsS+MpgUwqxT9SxGls6K3MM6cHlYU5PpMPXDyPxSfaInsUWvt8Ak7jN1K1empFSWxHIgfUcblp0DWCvkdtIzzABgbVKonryknCjIEqnIrLzdCX75htzEFjabag5NegK0KFJFEfnIb88Bp9MyLLA2kgJFZmmgRCJcVpJY1d82uneQV1kPUlqtXMBvByfpMKV/Ft4PrndyvEL1+iVlesFjHvM9rFp5W1sKYLEfCaq6xaz4Wq4EJieIB49raeDSwIj7Po3N5spEL5iiAyGhfX2eBtf5ynqIxeg1CLBniXyQ9ZtZuHV8S3JybbWKrlRWTOxW0Mms9IRNTRIYK53S6/UtKade2/XOZPN00/RYI0JmWbdGg4JT7bt/d7ozkNgCXFfInZbdaRXYT0QBVmeVHX0wGrBWmGb3Knu8NXlTLshXbytB+lwr3Ey6iQUJ8eUizC1M65hhsbz1sVGTzbkGLlgcSmbhwUqxw35fFr7hnNcLXIHzsy43goDo1kVdACzQ8sD7iTmOqfBI3mpPTvaXg95XkpdXMfFjSWTRyF8qEjZJKY1uFGvkMf29/kcK1S0zLuOgE6jILDQ7mnANue/HAjtWyW4BI7BtLjrMAmcCz2ylgeK8N5Jfc1qTe6fvFIFffhrU5vS15kiwynYndHAdxM9Yn8egs6WA2tbMHQOqCOtvNoKFDQFVNG2IHmkzvzyXhZo1KWwC5j1Bn8viQCGW23yMBsb10fAEYAvjpeVETvE516aDcTqsWn0pZlOt1OVEQo8oRSZ+ST3E1lNFCBpm/ZRg9RGv8q/TgCt6y5+LQo3qdjqOz2Eh9jQqWw9gieLcZ0isONDyABZYumr02AFaPu3aCzBAgaZyBZdrkRPPtbhZszZmYqLi7b1nieZZGXOSK2VGcqAbQS/X94AFp/wmpLKDD0aOHn1x+hvfA+/k7aAFYdrPvwPS4JAdU7nnsFCfUOI/xNKz2d5EccmeG/QNmzecSe2OgoBqxO8AFNxsYq4/nE+jte4HyeL6Q4Pl3MzGUEj6d0ofK4hJr/jhD59Qpj+vM1iYHvrsgfkYTvES+/Dme8Gf3v/dl27dunX0Sy/+DMF9fcXxh/PBALb8A6cbBU6YxAq5iiTMXnBx9Hq215sIyWSyC1AgMEWlxmdZCBbqbhu+I42/uGPHjqGsbI1cp5M3gmMeckls/pOPff3rz69dI3+v2kjR0JFwUu6O5UyK2WBOAAvcJlxCPqW20y+1eUaFGI455Zb4iysOrFhx0W+QN0gEMHkTw/voMTR1UmdGmkeawTg0VXluW3GVzTLNpYRyuBu28lzMcttliUSuoDSU2pHZtw6PXSlnutbtlGS6FHIr7L77aZk3AKY517ERuLzsgIhYg3OQ2WRkUsaIBhpc1jQKV1pbO91kLLcV883k7jQ83LBTYmBypX6/X9pkG6viVTW4KBRXscR6d/E+O1/SYFBUD9ZIRP0w6WLjcL/I0WCoHivmeax2DA899XDEh845SvemVbmMvc0gXPoplRsswSoihskZnBWhWyWXKVd0NkWVpgjEaj6LuDiNpbxqis5oZOpsFEVDjUPDb6TDvggAR2B73+hoo9CM3ZNt3JhZWDQ62meHw6XiTGxUYOZOMYViGJTz5IPcg4DFuoPhOOLDfD4Mw8I1B/fBwlGBwNlHB2Y0wpo/u5MvKi0dNvGdfXazCsHnP9FGHmnnvYLPvvJUlHjEUl5u8FgbhXR6UantTS+b1Uv+kIM8I0Kak8wiT44Qi/FF/uf8sUut7gI5Ta1G7zveK+ToZ7hNvMZQ9NxmQS4E2q9heBk/l++CoDgUzYCg+7P2vCNjbeRWRaKDq5wrvQwqz76sLHUGmgSpAWufWl0HAtdVR/yVGqVWd4cYN6PErI0UctOKlngZnQ3CZWXVQUnd4A+0G4oqgfahkLikBKpDZeK6DKgrxCIKoavxLAmgZo9Iq5c3Wl1Qd5wasNAbqXXAA8lQVCYDurquXeEmmejDe80kwE7QCXJ55uVlZcRlxAHWLhkkJlhqEAwI3QdBkCzkMq8EjVLLuVlAar2eyjWKsOVlxWVA3YBVAu3qIlgZ4AaI0dRd3XFAGBzvBtggs6ecEoaq0D5Zc4eLOyh0Ly+rG4KSgqzuEoIF1dVBUaliWfc+KCroQOhXDhHlNfFCRkkJpx5qmXLJjQorhi4vKwkEKLSJcTI1iJYaUpvRLpAzSsKnBxa4eg81s1sSiceEg5WU4UxbNR/+536fCM1PrKARGjPWdvb29j4yTaniNVAUDieM/6+zUBwelRh0TdxQgTU4THbfP/vb17p9/wiLwH18jUNeI3d4TKN0DP+X+VIYR1Swua0NDjchix//Dat94tTJeTzLAAAAAElFTkSuQmCC","logo2010":"data:image/gif;base64,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","gcolor":"data:image/png;base64,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","ctl2005":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAHKBAMAAABPsi6IAAAAHlBMVEUAAAAAAAAAAAD///8AAADMzMwAAAAAAAAAAACIiIjJW3aNAAAACXRSTlMA/xT/P/8VVjF43DyDAAAB60lEQVR4Ae2aNZIcQRBFSyxzUynyhAdQRkYfQGiL2l++woy5stSeyNJt1ayFql+xMPz/UkW/KHhFSxP+R/rcC9God7n/FOEih7eTWCE2gVhVATZXA7h9ywxtYdgvjssuCSx9Evjluy5v4gt6/bDLbsgmssNipWM7LFY6tsPGWRtwcRxvj3j72ATp8YeqOmAdsfmATXzANmIdcPvWY9cemw/YmkoDth5LnbaOiLrIgwYPz/K1cd945HlvPGsYjzssVjq2w2KlYzssVjq2w2KlfJb9Xps9bt/wrXjxO9VNeK+tQHgMpI7Ot28eg2syRViLR0eLwSJaiDxODdtdC3VL1L/b1X6Uwt8ndd+TaQKHqqpxVdGb3vSmN73pTW9605ve9KY3velNb3rTe2O8t7H3Nvbepje96U1vetOb3vy5Zb286U1vetOb3iXE32SKcDWpAsjd6mj5X1O0bFjq6MKHtv6vKbomfbbj2LvYB4g/fdi+EDapA2qXdb5csPGibNNi4B3Ht9/1OYzicDgkjm83zxscLhCvY5rEpqbE58Zbpu4AD6VZYCU+P3bHGOVVEJStHM40/rfLzxDPH2+DcTErbBi7uiFsGLtibBj7L4RF5MLeZZsUxiu25Asqogj/wbUNY1eMDWNXLGYLWdB/d8AHLcFSGSwAAAAASUVORK5CYII=","ctl2008":"data:image/png;base64,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","ctl2010":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAHsCAMAAABbtyWiAAABtlBMVEUAAAAAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEFBQaSkpLFxcXe3t7t7e329vb7+/v+/v4AAAEAAAGamprV1dXw8PD///8AAAGtra3k5OT8/PwAAAGUlJTg4OD9/f0AAAHHx8f19fUAAAFkZGXd3d0AAAGBgYHm5uZ/f3/o6OgAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAAD///////////////////////////////////////////////////////////8AAADz8/PCwsKcnJyDg4PBwcHv7+/09PS2trasrKzY2NiPj4/Kysri4uKwsLCbm5vl5eXv7++ZmZmZmZmZmZmZmZmZmZnMzMwzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzP///////////////////////////////+eBLcZAAAAknRSTlMACxUdJSsvMgwaNF6FqMXd8PsPIGKZzv8ecLLzFl+s9giI3A1KpQ5Vt/+9CQEXESMCIgMpBS4GMQcsJxkkLSYEGyg1NjQ3HyozEhgQMDMgcIBgEPDgkKBQ0EDAMLAa/////////////////////81N/+33+/8g8FC/QP9wENDfbz8wkM/vgODAr3+/328/z++vf40zoAEAAAY6SURBVHgB7NaFlqs6FAbgASqUsTrUUx/BGiznUHd9/8e5Ro0mZch1+5dUv7X3aiP74e8VhuUi0Vg8HotGOJahgHxCeHx6fnlNplLJ15fnp0chwYeT6Uw2lxd9yeeymXSIZqVCsSRiKRUL0letlyvVmkhMrVopB0kg1Bvi3TTqArhLm622GJh2q3mHdrpvoj/v76I/b90OuWr3A6MY/uiSKn+23ggUr9z6xKgstIkUw21BvrVKnUCJbdeVG9qsNEiUhBuVpr/jTBUreyR44WrG17VawFbTWbxjK6ygXpfViiJFitpV4U62RGNL2c6lLJcTqZLjzoV1IU9n84J+sulHkTKP6VPLiaeA5U/85ClxbFrvPQcsf+Inz71j09B4CaBE/GJAz5rWK4kG4VfL9KztJIMpjpOO7VkUTwVTHKfiyLPg11hwtL+m55ON0f9WsZP9Rv8ffTta9J1+bXxHnrV79GuyZ3vWdOn3gmt6Fqbp92AaelZnDNq9bzC6Z2Ug0Z45EjgdHKZq0Z11lmqezxy+T3fG9nn9ZGXExmjO9hiLLocsbGo0d4rWhEfoFR6Ev8sGx7LHQJ4Lf4dyPPTdZbY6DHt3D1XbfwProBwNNzNEy0B/8Acy7iDMrDJwGYjNDKPmePD1jDQYN0fyA4bNn/BXs9lP1MSoh93JNGgmnE5cAj22zZQ1Z3ZvFp05WpkhNHzEEKicMV+QZuDF3OBUAI+UFN3m2eVqvbidvRfr1ZLlbR0XvtKoyUpDa7pYLGbz9Xo+++nJ1BpKbBORimKaVxVJm0RjTjzuxKITTVJUnixxrZuASW9YZeu6W4XdpBlg6mRJ5tC0EfgpyDYhDv8PfeS1eJO1HNZC3MKw1satHdYC3IJ/v30/5o+39D3/b3e/waYnOT/NTUJbfrtf+7LforAWdaRo/CLjUakzCmsh6rBu4hyX7SA9/Dk+QuAqaPRPPssPonj4kX05JAAAAAAA8v+1I3Tv+77v+77v+77v+77v+77v+77v+77v+77v+77v+77v+77v+77v+77vi5u7NqwgBmAAmi00lZlh/zU+KdTK4egY3oGh9f+x1nkf4pH1uCcF1ZLmUhPQZGuBetvEjixbBxoLDNV6FO5MeN1W7nQ41QakeN8uYKk2JnR7ox1dr6MAYHYAxSqWaRm39IK0JMsM79eTTcSiZRbxgSXeJ5Z4j2/rv3if77QcV4Qb3d4U16olI5Ut8Y2eWZB+y3v1/9XLWa/f72+T/78fXdm5CxzHwRgKwHdY5l2xLJWZKypfoczMvf/G5T95al3GN+zJV0wsi3w7SydYxnScZXyC/XrS9UsP/f66viWVfHOhGrSmuH67RdyEatqhue2wtRm3athQDd1v1HhcFNWQ9RmP8y1q+UKxVCxXljVg4RaRea1aI069sqgdZBvUbLVbTSorlrTstx1qad9bVNRZw/3SMlu2S23te5tKqv1KJ9ivgsfMlhbRvVYksj3i9A5+nTmMmR5hGTM90nJOtyD/wIYZVEPWBzbMoBqyUbBhBtWQtYENM6gm3TBzX1tnLJGkkohFTE2R/lcl/YhJamHz3JHBYPO7y2hdy38NtRjoaLjBPmOT8K0sf+roUMtg31qm4Tp6ylhqFargf3796+yHlul4VZossC/uTSrxxn3QcnQlV+ajf5v6P2Zcu+zi2yK2f5lf2xfIr8w/m9SabC71AnHZTAIrD7Cn5x3hbIYins1AxLMZiHg2A0GzGart3PBGtG4HqHZXFsxXqHaKfa7XSj4j3d7i2Uxq0RwmtWgO0+xUCbZwNpPeL5rDTtza+N4GKuz42KKOL33Mso6PrazjYyvr+MjiDnMvFvcD/M7J+gG2sn6AH7OsH2Ar6wfAPvtVfcIOWPiuwwjfdWFsD7wDdva/HfoqcCCGoQD4WIiV0osTHO52eu/L+ExB+r0dCOM8tGyIUIvQSxFKuaSUnIVcqRubtrs9FA7HgpRjtJBzHjilJuqfzpcCqeMZjU3leLlCyLsI2HqDvVtI3VO9plCgYrf3PbR4soAWPwzUDPTIQGkwJqIJQ268fDK93msozD5j0MAYhtxkAXypMfqn4XQMqc8QDdP4M11BaDExAC9/4I4h1dFyRY8xVPjVrdHr9f6LP7f8WeQNZqeMAAAAAElFTkSuQmCC","marker":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAuZJREFUeAGllgOMBVkQRce2bXPtsW3btm0bwdrRhmszztq2bW/X3hr/9OSrb3JGr/vMU1W+hpy4gzqwC245Yh80Am+gdIzADPjaWFeXLnO0pzx/b8oHVzg5kImeLmHsO7AETIHceILnHE2MaS3mKvq0tUqgkQ6BJrqJ4Z8/b6sWduIiyNXUhMWvggBwbnzAJ4kervRtV51AU71Eo51EQ22yjHYQj/3Y00hZPp4s/QqEAJkYgueTPF3pr6F2ojGRSAye+RfyHF8vlr4BzMBJppyxzK+7GwSRTB5YwY99zYKXhRlL145ljuDjzfhreCmKJGLwznUpscSHCDxZWGKkq0Ofttfwpss8/FlbNU1dfSkF2Vgx/DP/TVaId77FyiwN9Flaz8L1ix3szj0AFmBcBvxNPMvxLop0deLxbRbenOnriWvRI3oQsxIJ8TexcLKHSoP8iF0HwiycFP4oSVgW7H8i3LzEUeqSuynKzZnHd1hYyiX2WUetmofSTt/1nBxKAwudwWd7iVHqXRss9+a0eJZ9C3zAQaZdcLG/7WkUREuXByrl5/4WwcfCnIXr4CQm4LVsnPa/aABHS5cPlop/Lhyd7nvACsjEH3xWEuiLOu0iGm6XL8RBNIQHsewbEAbOzUXgp5lrLsfe9Mott92ESJb9ASKA3BRp4no8UZbLPVAsw+xfaSgTjHR0WNgKlMrtIbbW9MdgqyBaOoSpXu4sexwoHQ/w41Z8hGwFYd/uK8xgGXMVUCmrnuhzvw+0nMySm0CipxvL7gEqxxX8cldOCu/lQWm+1lBGWpqaLEwEauVObhws5KXPRFzOspeA2smxMjCg77sbiJd7mZM9C+ekCG3Aj4+XZNM3XfWkr63NwiuBpDyzEXsNPV6Sw7IvgLFU4XZNaCAtRV/JwoeB5DREuDrxxxEWrgPJSXQ3NyU/KwsW1gHJuUhPW+v4QBKA5PgCARC4HEiOHfgVEPABkqMP3gafAHMgN/8DJ6wYsnrivNcAAAAASUVORK5CYII=","markerA":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAzdJREFUeAGllgNsNlkUhmvbtr1Wzd+ubdu2jWDtYG1746xt2/bO+d9TTHG/VPMmT3nnyUHnpmrbxBUUggVwHWCWQAnwBLuOAegH3xhqa9OF9rZ02teTzoCLHezISEeb8LvvwSgwBtvGHTxvb2RIkzGX0mcVuRK1V0vUXUcMf/1FZZ40HxdBzsZGLH4N+AGV8QKfJro503e1hRL1NhB11BC1Vm6mo5r4dz/Vl9BxL3eWfg2Ctsr0wQtJ7s70d2sVUacoEsCZ/yA/6e3B0jeBCZDT64g2v6krllTJ8oL9yM3UWJSig58ayyQPMxOWToLl2INPZuLDuRXhoR/rivgwhdlY0Z2nDopSPHPFwVjiJQJ3FqYbaGvRZ1X5PHThgb7wC5crvPZQHEW7OIpCPPMdOjPX02VpEQunzrOzUb0AwK0+mX5iuVIzXV36sCxHPNdVS5HODiycY+G1x7zdibrrhYPcIgs3zrLu/FBR2FNPGQE+xK5l4XFsinpE4Qn8nGfHbTP4nqtUKcwM9JWFM+fbiy1za/gdz20jLOR5bmm5jqLwO5yfZ2EGv2KfVxdsXAq3xhUJ1czGhXPVG5ZSRd/Xy0spZqEj+HwxMWrjn82WSsTKX8xPldu99nA8/+w74AWW0+dkZEjf1ZdIaJ1F4qy2zJYXxK/hL03lkpeZKQungBwj8PoJbPs/XABy69uAVnnu0up23wcWYFN8wefp/t5EnbVEbVXbC7GI4tAAln0LQoDKnAt+7g+/CLOR5ymCWS8kRLLsTxABtk2qOob+ZOYpvgNFGap/tThTMtDSYmEF2FVuDLK2pD9bKiS0LggPebiy7Amw67iBn2bjIza/QZjb/SlHWcZcCvaUCXfcc380l8tV8iWQ6O7CsnvBnuMMfr315EGe5fKr+XpxJmmoq7MwEewrN/PFwUJuvT/iIpa9DPadkxZ6evRDXfFyuxc62LJwUInQCvz0BC7Yb2uLSFdTk4WXAEV5djo2nJ5IP8myL4GhUuFcfrA/jUZfwsJHgOIURzg78L8j8o2iNImupsbkY2HGwkKgOOfqaGqsLSQBKI43kACBi4Di2IDfAAEvoDi64B3wKTAF2+YsILoXRwAxlxYAAAAASUVORK5CYII=","markerB":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAyFJREFUeAGtlgOMrFkQhce2bXutMZ9tjW3bNoO1g7XtjbO2bdv71zs1uEmblXzN6i/3XKVN1FQwKAUr4DoGrIEKEA60LjswDL6xt7SkC3296WB0OB0CF/v5kIOVJeG778EkcNQkCwXP+zrY02zWpfRZTaFE3fUS9TcRw6+/qC2SlnPSKNDRgcWvgRhVsgjwaX5IIH3XWCrRYAtRTwNRZ60sPfXE3/3UXEF7I0JZ+jVIkJfZghcKQgPp7846ol5FkQLo+Q/y/ZFhLH0TOAFRg/6I+U1TubQle/L4Pm6UIcTZka7dkSOknOCn1iopzMWJv5/dkvmCTxZyUzkKN8oI8SwYSr1QfCak+M0V27OJFxGEsvC4naUFfVZXzJMuL1SImhnkz2Lxnn/zHZK52lhzfxkL587z8RILoE74Y1PZeuw7D2yX+Zz6Gik90I/7l1h47Z7IUGyLZqVCjEjgYm1N+7AICgs00Ewn4qKIXevCvdw0oFyIeIKixBj+jBdGQXgyPloIF8731S4ys5iTyiOVi9xEGUiA/mUWnuAj9nl9iVaLgvmT/by7jr5vFotSzkJ/8PlqfobGbcOyFC8Pji4T99qdudz7HYgA6zUUgI39XXOFhOgqNzaisoxXWxzDX9qqpQgXZ/5+DohyAK/vw2r/hwtARFcDovK8S5ur+z5wAzIVzdGPx0binDYSddWpF2IhypPjWPYtSAJK61zw83DqRZibFtUyzPVKXjrL/gRpQG0dNeXFOHmA70BFGUb/avlJyc7CgoU1QKu6McHTnf7sqJEUokO4IyyYZU8ArSsE/LSYmyZ7gjBv9x/ZzTLmUqBTzYTinvujvVqMki+B/NAglt0LdK5A8Out+7fzXK4fzdfLT5KZqSkL84FedTNfHCzk6MNpF7HsZaB37XezsaEfmsrX417o583CUUOEHuCnJ3AMv20sI2tzcxZeAgyqZ+ezU+mJ4/tZ9iWwN1S4VJwYS5OZl7DwEWBwlacF+vHfEXGjGFr5wc6OFOXmwsJSYwjPtTI321qQPGMII4EECFxkDKEX+A0QiDCG0Bq8Az4FziYa6iwbowJxCQwSeQAAAABJRU5ErkJggg==","markerC":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAytJREFUeAGllgOMP1cUhde2bbvWmn+ubds2ajuoHdS2G6e2bdud23OKl8x6d07yrWbel7n4TdZkkwSDNnA+uBKQC0EnCAfbjh1YAZ/bW1rKkb7eUhYdLuXgaD8fcbCyFFz7CpwCHMGmCQVP+TrYyxlZx8qHvU2azAxosjAshD9/3NesnZeTJoGODhS/CGI2kkWAD/JDAuXLoTZNlkZFZgdFpvr0zA4Ir3070ilFEaGUfgYSgC624OmC0ED5bapfZE4veqalSh6pKZZvhtvV33jPn5CXRIZR+gpwAipL/ijz8+EOTcnALaV7JcTZkQcUw4cnq+us4Nuxbi3MxYnXzgD/xBe8f3ZuKkvRySg4JydVPdkV+3LExdpallOPVPfxzMV7s4VDBKEU1thZWsiH/S1suroRT6Y/CAj/luLloX7nmS9RmauNNaXtFJ55mI+XbgDvdDfyInvH37dmfkjSA/145lwKryiMDMVajKgbOAAKtyUjiyNSGxcldP0jLMKk8EdDwrr4aCU8+3BffckYwqYlYzj6FZoflowgf545j8JafsQ+GmjVDYWN1w9FyXhQlHCmX74aUUPpoNAffHRBfsa6awPp6rXR7yLKvWJ/Lu/9EkSAf7IcgMX+cqRTE1W6Emyy2APy/XiPFuHiLNwWoOIAXirGtP/ky0CVroZEdH1Dqey79t903wJuQJdo8FFNbKTI3JDIdP8WuzcsHclxlH0BksC6ORR8t5J6FHozurEMvT4/L52yX0Aa2DRVpujVI3WlfAeuleHpX+io0+wsLCjsBdvKNQme7vLLZK/G0lcL94UFU/Yw2HZCwLfn5KZxLXR9u6vyIGXkWLCjnB6K99zPEz3qKfkSyA8NouwOsOMEgh9uKNkr7CX386WOOjEzNaUwH+wq1/HFQSFLX0k7irLnTAykxM3GRr4e7hCWe6SfN4UnGBF6gG8fxqfki6F2sTY3p/AYYChPnJWdKg/XlFD2CbA3Kjy3JTFWTsk8hsL7geF0pAX68d8R9UYxmvxgZ0eJcnOhsA0YzqFW5mb/DyQPGE4k0ICAo4DheIEfgYAIYDjW4HXwAXAGm+Zv4+sVIZTLtRkAAAAASUVORK5CYII=","markerD":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAwxJREFUeAGllgNsPXkUhWvbtv23Xdu2bdt2G6wdrG1vnLVt2965e24xyRQvr52TfMXgy7voL1VREGdQApbBtYBZBeXAHSgdPTAEvtbX1KSjttaU4u1OqeC4nQ0ZaGkS7n0HJoAhUBhX8JytgT7NXDhJn1YXCNRVJ1BfIzH88+c1hcLSpTPkaGjA4leBz24yD/BJuIsjfdtQItBAM1F3PVFHjZTuOuJ7PzaVU4KHK0u/AgFAEl3wfISrI/3VUUvUI4p2B8/8C3mSpxtL3wBGQMyAPcr8urFM2JSdd7LnByWEWFnQHclRopQr+LGlUnAzMeL7M5syW/DxfOhpLkV8mIWFgT70RFaiCP/OYokU71wedZF4iMCVhVl6mhr0aW0RN10iHDx9dFupjYeDycXYUPyd3/kWlZnqaLO0lIWzh2ysJANQJPygMp9fJP4uXu9toLOOdnx9kYXXxHu6EvU1KSVkWMgtEK/1N1G2nxexa02Y4OmGi/KEOf7eonD+sK3yJb9QlLFDyY10bn0rlliYzX9in9UVKz0UXh8Sh1JL3zWJQyljoT34bCX8nLJrs63ca2JC+fq3wAOsZdABi/1tU7lA3bsvNl+TLnYd/dxaJXiYGBNvCxBjAF5LxLT/xQEglq4AlMp9Fzam+x4wA5J4g8+yfD2JehqIOmsVCzGIsmA/ln0DgsCOOQh+Gjp9DL1p3l2GXi+HnWXZH+AMUJgMVW58TjKfgdtl+PSvlOUIehoaLKwGSuWGAEtz+qO9WkDp24TRbs4sexwoHRfw40LoGV4LSd/uS49jGXMS7CnTrjjnfm+rEj8lHwLhrk4suwfsOY7gl1uSooh7yfv5WlkOqamqsjAc7Cs38cHBQi596Mwxlr0E9p0kMx0d+r6xjLjco3bWLByRI7QAPz6elUjfNJSStro6C08AWXlm7uJpejwriWVfAH25wsWiQF+aOH+ChQ8D2Sk742jH/46IJ4rchDsbG5KXmQkLS4DsHNRSV9scSBiQHU8gAALHgOxYgV8BAQ8gO9rgbfAJMAYK8z90mwmrFWbGBwAAAABJRU5ErkJggg==","markerE":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAu5JREFUeAGllgOMLVkQhse2bXPtsW3btm0bwdrRhmszztq27eeu99egk5u+w/6Tb1j9pevUOSdX5ZA4gyqwCe5hwDaoBe7g2NEDE+BnfU1Nus7WmrK83Skb3GBnQwZamoT//QbmgOFRMlfwmq2BPi1F3ETfNpYJNNAi0Eg7Mfzz903lwkZUCDkaGrD4XeADlMYDfBPr4ki/tlUJNNZJNNhK1NekyGAL8f/+7KilNA9Xlv4EAoBCdMHrca6OdK6vmWhIKpKAmouQZ3i6sfQDYATEjNmjzZ/ba4R92QsF6VyolHAne67Z6eDPrnrBzcSI/760L7MFX69G38KtcKGCEN8lvFGRJ9bxM7clRBIPEbiysEBPU4O+ba7gRZcIj2wdz/yKzkx1tLm+moXLV9tYSQZwbCEz3EahjnZcv87Cu1M9XbEtOpQKsV4SFFpmRjuo0M+L2LUjTMOk8EelwvFbrpPwRX2pRFjk7y0KV6+xldtyO4XhzVG/wcJCPmLftVSecijN9FuHOJQaFtqD77Ziw469bYBCu3cnRXPtr8AD7GTcARv7145agQaP3thAPIZ/dzcIHibGxLsFiDEA76Vj2hf5MuDWj26V113Ym+5nwAwoxBt8V+DriXPaRtTffOQgaoL9WPYLCAJKcxX4a+KW67E2nQfLsNabMaEsOwNCwKHJU+VhFGXyHSiV4e3fqSkS9DQ0WNgIjpX7AyzN6UxvoyBpHcJEN2eWPQ+OHRfw51p0iOIJwro9lpvCMuYmcKIsuuKe+7+ngd9SvARiXZ1Y9gg4cRzBPw9lJPBa7hzN92qKSE1VlYWx4FR5kC8OFnLrEyHXs+wtcOpkmOno0O/tNTvtXmdnzcIpOUIL8OfzOIa/tFWTtro6C28EsvLKSuQt9HxBBst+APpyhesVgb40F34jC58GslMT4mjHH0fEG0VuYp2NDcnLzISFVUB2rtJSV9sfSAyQHU8gAALXA9mxAv8CAh5AdrTBx+AbYHxU8WUYrAwxlxokGwAAAABJRU5ErkJggg==","markerF":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAu1JREFUeAGllgOMNGkQhte2vTv+bdvm2rZt2w7Oji48m3HOtm37uv63Fp10xtNv8gyrn3R91bIzkVhQAObBrSssgmKgAhbHA/SBbzydnWlXeCgl6FSUCPZEhJGXizPhv+/BCPA2J1OA58O9PGni6D76rDxHoLYqgbpqieHPX1TkCnPHD1K0txeLXwNrgMGowaen4qLpu5oCgXrqidqriVoqpLRXEf/3U10xXVYrWPo12AAkcQcvnFZE098tlUQdEpFhUPMf5Fc1Spa+CXyAmJ5ItPlNbZGwKnsy7QoXGoT/4xru4KeGUkHp58O/T6zKwsEn0ycOcCtcKBHiXY8fawvFOt7m+rPHiIcIFCxM83B2os8q83jR9YRmW8c236EzfzdXri9k4eT2sBBxAFYLmc4aOhQdwfWzLLzlkkZB1FVnUHgkJlLCLeeO6wu76yh9nZbYtSS8rFHiR8PC3gO7JOB3g8KM9TpROL0jXG7LtXQYe4/6ORam8yn2eVW+jUOppO/rxKEUsTASfL5w6jAfAtYL0e4t509w7XdADZbSG+XlSd/VFQto3XIhzpRfGssEtZ8v104CMV7g9SuY9n98MeDWzbfK6y6sTPd9EAAk0YHP09ZqiDpqiForzQ6iaPM6ln0LNgGD2QZ+7juwm6i73rgMaz1/8hDL/gQH7cwkxZ7P4Yx4vgbqy7D3rxZlCB5OTiwsBxbljg3BgfRnc7mA1vWE55SxLHsCWJw48NPMiYPSMwjrdn/yRZYx+4BVGVfgOvdHUxnvpXgROKWIYdm9wOpEg1/vvnqW13Lp1Hy9KIMc7O1ZeArYlLv4wsFCbr3v4G6WvQxsztUANzf6obZoqd1dEaEsHJAjDAI/PYHT8NuaQnJ1dGThXiArz04dO0BPpF1l2ZfAU65wNm/jWho5speFjwDZKToYHcGPI+IVRW5Oxfp6kzbAj4UFQHa2uTg6rA7kJJAdDRAAgd1AdkLAb4CAGsiOK3gHfAp8zRVfA4nhHTfIbG7rAAAAAElFTkSuQmCC","markerG":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAzlJREFUeAGklgNsKFkUhmvbtr1Wzefatm3bRrB2tOHajLO2bds7Z/9T3HTqdv7ke6+de+83c65SlQPiDErBCrgFMGugAriDI0cPDIOv9TU16XJba0r1dqc0cKWdDRloaRLavgOTwPAwmSt4ztZAn2ajrqZPawol6q6XqL+JGP7589oiaTkmjBwNDVj8KvDZT+YBPol3caRvG0slGmwh6mkg6qyV01NP3PZjcwUleriy9CsQAGTRBc8nuDrSX511RL1y0RPZSet8UFUgnnGffyFP9nRj6RvACIgM2qPMr5vKpe2ypkuDyURbmwcIIp3s6YemsvV2ruDH1irJzcSI22bBemzBxwuxoVyKkBUF+qzLbj4TI569UJxJIVYWjHjGY647Hc3Cr4ErC7P1NDXo07pinnRRIp6zYNcc8tdxG/dZf4Yx36IyU531SspYOHeJjZVsAbjUJMyNEO2Wyp/1NVK4ox0Ll1h48wVPV2yLZtGB52ko9HL++WgMNFOOnxexa12YyF8zcLAQz2SLg3aZMNffWwgXLrU9vGTMp9g+WBS5sK+JIjZeuMzCHD5in9WXHGlRdlXQXUffNYtFKWehPfhsNT5iv20jFoFfwCJ+2WJMqCj35rOx/Oxb4AHWM+SAjf1tc4W0vXQM3rWxXYwN+SXiGP7cVi15mBhz2xwQMQCvJWG1/8UFgNIPP3ooFS+XNlf3PWAGZPHm0rN9PXFOG4m66g7eKliI8mA/ln0DgsCeuRj8NBx6BeamZX8Z5nolLpxlf4AwcGAyVflo5abwHbhbhq9/pTxX0tPQYGENOFJuD7A0pz86aqRdpUN4xs2ZZY+DI8cF/LgYGyY7QTxv92WcZxlzNThWZlxxz/3eXs1fKS6BeFcnlt0Djh1H8Mtdyad5LteP5mvluaSmqsrCeHCi3MkXBwu59OGwK1j2Ejhxks10dOj7pvL1ci+3s2bhqBKhBfjxcZySbxrLSFtdnYVXAUV5Zj46lB7PTmbZF0BfqXCpONCXJiOvYuHDQHHKwxzt+M8RcaMoTbwzriwvMxMWlgLFuVhLXW1rQeKA4ngCCRC4AiiOFfgVEPAAiqMN3gaf/D8g5iekGACf7gZfmTl+ggAAAABJRU5ErkJggg==","markerH":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAuVJREFUeAGl1gOMLFkYBeAe27b5bI5t27Zt2wjWjjZcm3HWtm1763/nH1TSqR7WSb52ndTF3Ixil7hAGazCrVvWoRI8YN/RhxH4xkBLi87b2VCajwelw0V7WzLU1iJ89z1MgRHsGjd43s7QgOZCLtNntUUC9TQINNBMjF9/UVcsrIQFkJORIRe/Br6gMp7waaSrE33XVCbQUCtRbyNRV52y3gbi735qqaQkTzcu/RqOglL04IUoNyf6u6ueqE9SJIXf/IfyFC93Ln0TjEHMkAOG+U1zhbBdFuzsQMNXz0uK+DP+jl/zCH5qqxbcTY25dA42YgefLIZf5aHwD/dfCHzN9TGhxIsIbqDI0dfSpM/qS3jSD16Ia77DyMx0dbi0HBTzZ2ytxQU4cCHrb6JAJ3suXAbFLYlebkQDLZJCfKeKtHCwhXL9vYm7NgqTvNzxobSw+JgvPZmTrASfqSzMO+IjFi6etZM75GYK2hzRCihy+U/s84bSQy5KPX3fIi5KBSgc4PO1yKDDbRsM95a4cC77DjxhI8OO2NjftVQK1HuQjd1Av7TXCJ6mJlw4D2IM4fVkrPZ/OADEoe8CQ+V5F7ZW930wB6X4wOc5fl5EfU1E3fW7F2IhKk74c9m3cBxU5jT8PHL1AuZGnE8pzPVqRCCX/QkBsGuy1LB5n8xL5TNQWoa7f7UiT9DX1OTCWthX7jhqZUF/dtYKkqGjMNbdhcuegH3HFX5aCg/gbaE0b/dnJnAZuwwHyqwbzrk/OmrEu+RDINLNmcvuhQPHCX69OyVmYy55f75ekUfqampcGAmHyl18cHAhD30k4AKXvQyHToq5ri790FyxMdzz9jZcOCan0BJ+egLH1rdN5aSjocGFl0BWnl0IvUpP5KRw2ZdgALKyXHLMj6aCL3HhIyA7FQFO9vzviHiiyE2ki4kReZubcmEZyM5pbQ317QWJANnxAgEILoDsWMNvQOAJsqMD78CnYAK75hrsTBEMgmcmJgAAAABJRU5ErkJggg==","markerI":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAvFJREFUeAGl1gNsLnkUBfCpbbufn2371bZt27YVrB1tuDbjrG3b9s595xaTTOrOSX51T787f6TCGgmAXJiBWxfNQQFoYMOxhm74xsbMjI54eVCsQUNxcMzbk2zNzQjf+x4GwQ7WjAqe97K1odHzJ+izkkyRmstFaq8ixh9/UZolTl88TX52tlz8GmyDFaOFT68E+tF3lbkiddYQtVQQNZbKtZQTf++n6gKK1Kq49GvYBbJYwQtXVX70d2MZUausaGX4mf9QHq1Tc+mbYA9SOn0w5jdV+aJUBpMXT1Hpgd10zt+HgtT+8x8/mRwlfZ8n+Km2SFQ72nPpKMzHCz6ZuHSKR1n2SriAC7tOHZGVSfA71wdfIF5EUIGQbG1mSp+VZfNDX2k8qXDF0fE732EyJ0sLLs0DYeygp7u0AJsuZG2VdMbPmwunQLglQqciaq/eemFHNaXs0BN3zRdGYqWoQ1lh6k6DVDhxyEvpyFV0Fj+DrmkQUviIfV6es8VFKaPvq6VFyQfBBz6fvXJ2a9sG494SeonLvgMtzKfLFxv7u+oCEaPLyqJ0atnGxmaXHcNf6opFraMDF46BFFt4PQqr/R8ugBVHX2FU/HFxcXXfB2eQxQCfJ2/XEbVWEjWVrV2Ihcjfu4PLvoU9sGIOwM/dp44SdUjPc8XjNnP5DJf9CadhzSQaCQI9mRrDd+DyMrz6V/NTRWtTUy4sgQ3ljl1uLvRnQ4m4bHQUhqgDuOwJ2HAC4afJS6flJwjP7f6EcC5jJ2BTGVHhnvujvlh6lXwJXFH5c9m9sOn4wa93Rwfzs5w/mq/np5KxkREXXoEt5S6+OLiQR+8+fZTLXoYtJ9rZ0pJ+qMqfH/eItwcX9iopdIWfnsAR/LYyjyxMTLjwOCjKs+MXTtETydFc9iXYgKJMZe/eToPnjnPhI6A4+af9vPnfEelGUZorAQ52pHd25MJcUJwD5ibGSwtyGRRHByIQHAXFcYffgEALimMB78Cn4ABr5hqJiypZla13FgAAAABJRU5ErkJggg==","markerJ":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAvlJREFUeAGllgOQPFcQxuds27f+27Ztnm3btl2IXYhtp1yxbdvOdL4+zGGS1XxVv8P2zm+nX897tYKRRIF0MAaunmYCZAGNYEFcQSv40s3BgTaEBNFZg4bOgU2hweTu6ECofQO6gQcwGhV4JsTdjfp3b6GP85JFqi0UqbGEGP770/wUcXTvdorwcGfxy2DR/8m04KMD0RH0dXG6SM1lRHVFRNX586krJK59X5pFJ7Uqln4BloF5cQHPHlRF0B/VBUT1cpEMvOdvyE/r1Cx9DXgCKc1haPPLkkzRiIwvpMdiT0n/cwffl+eIam9PrvWDyYSAD4f2beNWZBKjQsDXXHp4D9e+BCogxLo62NPHBam86JYLcc3X6MzH2YnrGUAYWBscKA3AYiHTUEw7IkK5PgKEq07oVESNpdYLm0opbome2DUpPKlT40VlwvilBkk4tC5EacsltDMyjOujQIjjLfZJYZpsKN5OTiwwMZQC+qZUGkomEMLAJ+MHdsoem2gvDzrFy4G/rzqyd1L4XUmGrN2rju7j2tdACybTEo4H++vSLHFu67edOUyoSbRs2yDbhj9W5Ipaby+uDwAp7uCVU5j23zgA5rbOd8RtvpeTJGsVHy5OT/cd4AvmxQA+iV2swz4tJqopMD4kDCJz5RKWfQVWgP/MGvBD67aNWBsj2xBrPbZ/B8t+A9uB0Vy04WnGn+EzUC7D3b+UGS+62tuzMA+YleuWBfjRb1V5IlqXCY+oo1j2qGBBosH3w/u2z99BWLd7LhxnGbMFWJQ+Fc65XytzpbvkQ+CAKpJldwGLEwF+uun0YV7Lya35SmY82drYsPAAsCo38MHBQm69dftGlr0gKMhpX2dn+rYkc7LdDaFBLGxXIvQH3z+KnfJVcQY52dmxcDNQlKcG92yjR2NPs+wz4KZUOJK6fDF179rMwgeB4mRujwjlryPSiaI0B6JwLup9vVmYDhRnjaOd7cxA9gPF0QERENgIFCcQ/AwIaIHiOIE3wUfACxjNv66iKPO+3XaMAAAAAElFTkSuQmCC","shadow":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAiCAYAAADYmxC7AAAABGdBTUEAAK/INwWK6QAAAhtJREFUeAHtlYXKG1EQRrsST+ouaB+hOPSp+xx1d3eJezL9gMMyLLHL7zJwWN89fDO5Sc3sxH6rVBxLHUsdSx1LHUsdBKljqUi16DRbW3ysHVWAVLBIlNvGYlGZ284jlZdLtyqUE4nB7efkEHHMvJyp0i0mE+dIRQIp5xIkqUxkKiYOrunBLSQTu48XHMVsi6RPygmNxED0eedYmD6BVFhCPpWiKDsqbEuiCKlrqSE1RqYtmllKXE9DEnIyJT5egzpUEStCsqh9tKvHvRHHI7YB7UOIFzXEKXGabQOhEq1L/dA7KYMZ90a0sOXl04CUEj58RpwXF5Bq5GRIdOESYRAjVhCJ/0VuJOWEyghdFZfZr7k2+aVgURnMGfQhLeyyPxUWsCRkKZ1D6gJC+Tbly9jOwc/TH/FD/BIdzgctnhFJnYaai34zGdIhmd/iOzSZq1nIim7ZlrVpg3T8aj0WI2Sa4hf8FT0SmhtCIUlNeUFbDBhuy8vADEY80xJ/oMnxQIzzMhtLmSqKohkf+CUuMeQFJKIFLWrToh8k0nKpMNBeJlAKsbnERnysRxJUJjMiie/iE1Jtzs8WiWxBiqI1fq4QGvPxz+Id6bQ2SGTrUrSpwgpeRKgvvoqX4qNoykEyW6uQ/76quC4ucLqJzFNmbRyWytaTSpC5Kcq06J54I3pyUWrULkvdEjfEB3FHtLeWzNalbpPSQ3lIaGfrP7yW/RxNGeHVAAAAAElFTkSuQmCC","spot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAArCAYAAACJrvP4AAAC+ElEQVR4AWIgBP7//88DxCGAWssB1pIkCsO1iLG27WCtYG17x3Ywtm3bthlNMLZtz/NrXvStM/cbP/Vln6RSOfq/xqlOi2nO10bxUe26RRKLRdnxiZOnTqVpQO6NOc5AiYSd6O4dRcbAnlJQv4rk/fWt5HzzkbDjEydPHfX0pQr6Q4dcI7RqqZP7Z1z8i/cSLuqop4/+ZCB3iOt214UFVkG9SoikvOijHx1fGAXeqWNm7u9f0Zj2oh+dCoHcOlfkA0oZiB66ZYaBZ53uo/N7pOiWGBqmyF21xKEg24uhQf/mOWJsmaYgYOiiDwfYn5yTRE2X42vNWy/KyKcelZ6PPMCOTzwhEH04ii8ABzMRaNwzj0uXB+8rs4gnAqIPR/HJ4UvgV8wdlICUXOR9+9GHo/jG8enxK+aR+cDI+/ajD0eJ50Vzvv3Yt5h35Acj79ePPhylbetyXuVfA70z9OEoXVy0pbBl40DfGfpwVMy1R1kTRnpBTqM1cZQHh3P2Tiwv1wzynKEPR2HaNI4VNmsQyBcE3bj+UTgYE1kncmCvFQQMXRGpfQsmcre27fNFHVtkFYSeOM459OHcDvw+/mwtzkQ2QOigh64qz7RlrXRmTw1nA4ZOXG+F3z/Iozrkmvm1/80IRD866CkfY1hqeSeOGZnA6EdHJWPaNjdYw/tH0wHRR38q/43Padcx8/75ISUQ9fTRr1IxiUZbR7ZtSulxUk9fsoySZ8+xjxZ1bpkUiDrq6Uv3f/9TXVxk53z3qS+IPHXUq0xMbHuRNWGk77CQp05laiLysoRCbu4vn5cLIk6eOpUN06a52J46zisPRpy8ypaJyOvaMqycrz4sAcInTl5l07RprC3u1qYEDJ+4yraJSI3w5vVmiXO1dYNJPAjYQzo+CDlfvi+A2PGJqyBMG8aegiY1BRg7vgrKYqY53RjUS4Cx4wcGk1isa3zUNTB2/OBgIvVDq5bawNjxg4R96Z07U5T393fCjh8k7E7t2PPEi7rs+Kn0XwF82Z38cjx5pwAAAABJRU5ErkJggg==","iwbox":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFJElEQVR42u3bQYjT6BvH8e+mG8aStKGFlpQGGhoyU9BB8OJV8DIXDyLe9eLBq+xJ9vTHk3j14EXv4snLXASvXgQZB9opKSmk5KWFljQJcQipe9jIqiPLf3ZXnMb+7in5QPq+efI87y8fP37ktFkulwghmE6nzGYzsiy7CFwCdoFtoAPogAbIp/z5FAgAAYyBI+AAeFsqld5dv36df5NfTgOez+d4nsdkMiGO4wvAHnBV07QrtVrtnKZpqKqKoihsbW0hyzKSJJ3qhlarFWmacnx8TBzHRFFEEAQsFosPQRC8Bl4B+4qivG+32xiGQb1e/2/BSZLgui7j8Zgoii4DN6vV6g1d181ms0mj0aBUKvE9k2UZs9mM6XSKEMJdLpcvgOeqqr7pdDqYpkm5XP73YCEEjuPg+34buF2v128ZhmG1220UReFHJI5jJpMJnuc58/n8GfC01WpNLMtC1/V/Dh6NRgyHQ8Iw3CuXy3dN07zW6XRQVZWzkCiKGI/HuK77MkmSx5VKZd+2bbrd7unBg8GAfr9PmqZ3dF2/Z1nWdqvV4izG930cxzkSQjySZflJr9djZ2fn/wcPBgMODw9ZrVa/dbvd+7Zta5VKhbOcMAwZDofBaDR6IEnSw/Pnz38TfQI8Go04ODggTdPfdnZ2/tfr9bZkWWYdkqYp/X7/eDAY/C7L8sPd3d0Tj7f09QI1HA5J0/ROt9u9v05YAFmW6fV6W91u936apneGwyFCiG+DkyTBcRzCMNzTdf2ebdvaOmE/R9u2rem6fi8Mwz3HcUiS5CTYdV1832+Xy+W7lmVtn/X/7N+lUqlgWdZ2uVy+6/t+23XdL8Hz+ZzxeAxw2zTNa2d1NT5NWq0WpmleA26Px2Pm8/lfYM/ziKLocr1ev9XpdChKOp0O9Xr9VhRFlz3P+xO8XC6ZTCYANw3DsM7KS8V/EVVVMQzDAm5OJhOWyyWSEII4ji9Uq9Ub7XaboqXdblOtVm/EcXxBCIE0nU4B9nRdN3/Uu/H3jKIo6LpuAnvT6RRpNpsBXG02mxQ1ue3qbDZDyrLsoqZpVxqNRmHBjUYDTdOuZFl2UQIu1Wq1c9+7nv2RKZVK1Gq1c8AlCdjVNI2iJzfuSsB2kbaiv9uigG0J6BRxdf7Wag10JEDf2toqPDg36hKwllXRP6miAE0C5NN+Sl3H5Ea5+NKv4RvwBrwBb8Ab8Aa8AW/AG/B3BKer1arw0NyYSkCQpmnhwbkxkABxfHxceHBuFBIwjuO48ODcOJaAoyiKCg/OjUcScBAEQeHBufFAAt4uFosPWZYVFptlGYvF4gPwViqVSu+CIHidt1wKmdlsRhAEr0ul0jspb7G8yptqhUxue9VoNJDyRtO+EMIt4modxzFCCBfYbzabSLquoyjK++Vy+SJvjBcqeSP8haIo73VdR6pWq+SN8Oee5zlF2qKiKMLzPAd4njfG/yweDMNAVdU38/n8WT7cUojkwyzPVFV9YxjGX9VSvV4nH2Z56rruS9/31x7r+z6u674EnubDLV+Wh6Zp0mq1JkmSPHYc5ygMw7XFhmGI4zhHSZI8brVaE9M0T9bD5XIZy7KoVCr7QohHw+FwLauoNE0ZDoeBEOJRpVLZtyzri8HxLz4A6LqObdvIsvxkNBo96Pf7x+uE/jRcOhqNHsiy/MS27RMD479+fVG32yVNUw4PDx8OBgPSNF3L8eFer/fNQfHNgPjn+amOAHzKT3XI41N+qmM8n+enOaj1ddb5KN4fYCYYVkTnAvsAAAAASUVORK5CYII=","iwtail":"data:image/png;base64,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","iwclose":"data:image/gif;base64,R0lGODlhDAAMAJEAAGJh2P///////wAAACH5BAEHAAIALAAAAAAMAAwAAAIdFI5pwe0XYINUoghYsllfP32Yl4DfVT2Z5DzGphQAOw==","gwhite":"data:image/png;base64,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","gwhite5":"data:image/png;base64,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","google3":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAAAgCAYAAACILY8rAAAKLUlEQVR4Ae1aA3QkSxd+tm3btrO2bdu2rXAZrRWba9v2JpnMxDM96J5O/vreX3e2tnf0/PJOcs53pk9V3erbX9+69dXt3PQP/FX8lZWV3cHwU2lp6VBVVYMYFmjB+kYzVGHj7mG4qbyB+d7BBWoy3PR74a7za0bcTCLQbFUX7TprXxe915YYuduWtOmEHFkkqUsEkmczR78rb8TCdxcBM/jPJBY3u439dqQbbDttj+gdJp2pMq1E+WWyqUyEz5QStesS06XUw3Ks4FB7Nset5YlYq2Jd2Clj9Glg3HbfPX86sSCE/fbGxAVGJXjwSukEkegJfZZJZ/KZDXeqF5vr9nJE7KLPVjcsA+on9M75KyK2OSbNKZTDmvpJBpG4+vOkotER5kMLUq2bF2VaN02MNO/Xjhm/3nxAiNxvMOe/HH8LsW9SLm0dKOmIrBozjJaVW61piqIudJaLEvbZ4uvNMZV0X2K8AFvuVB0+ZwWxbFkMw4RTYy17iNTas4ymY1fklZxEf+RPhp8ZvufRPYci3AOpdI+bGZ5i1+8AuEab5yX7++3Y+GcZ3kXgMDzwO4nFXA/yOTDX8572EZIcLxNBtEn5MGw8Lkfxm4xgeMQJWfcy9MEYD6RiXH1SGRrMYH11Ge7W2nEJV8+dnTOZh7nc2M0W4QWxn+H5ncwzj7U3Y7jfZcRyJxYEpFq2OjajcOks2ljfNBDDDT7GjTT4io8ZyfClBoiwN8QHtJw8tkJKiIoH5DMnl1M7n+NVwbnXQB71q8UHVqhZwfH2q8HxavFBV3Z4lpdY+1TqP5MjL0/cb4tDkIjykOCGWARTVxqj5BtCzGkJMVL0mkTL/j1rVEUh+5nsnq+4itgBGNQl2HSRiIVe5Tf4UVg2vnQjLzGPIQDX5tT4WEPLOnq9z+dlIvLbNMiFw3y8H1YPiELqQZs9KzTOtvUNvZJ+e5kIeeubOnv2Cq3d8/yeC9KP2KJpryBUmW60+SZbtvcKk87VmW00tQiQ9K6IJSg6XWjB4B4ndJW+Uq/zvXG1AnNiXJwQvc/cELH0huvPkYrJiax8OYwT+4iW2BVbrOnLttgy3IGkF1AUNGeLvtIXcMgp0Gdc5LeJj59C/iinBm1R0u8Akc6BvtPDRbuJuA7ZZM38ZVJJqUt5yPQ3fkGuO2LlnMthjMBCV37rfL4oNa0MTeM8jWJBest1EUu5hikAM93cylWAOJiIrcrzsDvgYIGx5rTkGBBHjhSN6n8E0Yu3XTi8/1Gxz7wpI5Ieyp69KoZItaXdUWo/1OCImr0sFhGs7Kt79FrfnaX23EjY8QONHEHEAdDiSAWph2yxo9aaj/jwdm+Ize/R7jyRmMdWmxSxKtmyb9daY0jQRn3N7y1oz636pYL0xsn9wnnEzjY5IlaXr4SiTdhJvSdW2Pjy2jXOJudMy5ZkaNNFcfCCDdRf0LnZFWq3bX8/myLTfm7yDXa2s+M2UL+8/ROHXYfF5ivkQyDbM7R2CzKsm70h1nJw3xpHumpdX6cYjYsd6aEgP7hwRN9j1I9UoVUSlBMGoaPzIuNlumnCQVs8H/y1ltg1220pq7dZU7XovMjksN9/QV4j52SFCblUJ+SjT9gK+BTX2AQQDZQSFIM+RJUuhF3LpW85t1OVBfLW1/WUElQpKwSqhiKy0TxTgXJNJn7J7fzR1oAddjwRWzh3yg7y3ZwYG4c2bFpYcbnVv5WFdKAWDOxxkkinXEvENkSjb4JlOxHTb5l0ig+exPrv9GbzahtkzqYcZjSri80bU6PIgaIJww7w1NJYkEXN0FY0bsghGmfZtjnCnrM2ypFHD7V0aWc/2PiQI6r1sRHYsMj/4avNR/mDthE2lQ5oQ3rwSKwQkabFQRvz2jXKEvOroY6PsWTWxN3ypQtLNRLsY5HYV9FxWS+HV5pSYsdNkfy3n5TXc+cGsAe6T5Bbn3B8wfonYMzhi/IqipZ2QVI22iwisZNG7OdzNRQetMmvxI4ddpDG2bZtilBzBWIPt3RppxxsdpDGqYzYtMO2GCIW+ZTbtRDs2qJt6ArpuEdihxKxBEpXLS6XRKxMVq3WRQKhE/mh6U5nR9pRGDSBnfcd9YG5ppLzufIybjwHDwQysaxQr6RdGPpQlDbLt9jS0S5fvhBODiHXkkBntm9D49LJLY+lCRqn6LJC1ZIT4UQYcq1oB5CdbctbOgex0sXQC3p5KfnQMlDSK9ei6D3m81u4RltTXynPE7EllAqAmt9aC9mqshw9tMrFavWFLBVPg+Jp5T0iiYordKyN2WdLUFws/4Msl+IhaHzrACmXFAWAxE8OYlfV2ptWL0t15GFOPgCd6ljmFwNusLNfmJNK/TInH3D2gkWg7uHt5iVqVqWo4LrDBfaGoglDD0grgtPZNeXX/iRPHRErLhW8+ca+UqG4y0NMT40x713ONCyc8022bu+6xHiJ60X+EkxGnHQwBykNc0JMPDkIkV08bexey67t62wMRZNH7dNV+lKlfsgwchynLEfUZtyt2o+232s3JK1TGZQjbfbZ0u9SqV/lBwUA0spRL2a+oeKGlLb3rLwWdRDUkL2WW306nL1ObkWuTkLUws+8Hq0vUF/hmEGHyUbMsQ6ghkoKQVekhPYKM53zIKtE4nNBKskOFC1IH5fMnLALDrgDlh7VAMjOfrzzLhDnFid6inbAgrlJ1h3ufPXxklicugxNa+S589tQ80cztC1/7o7uPs0gAfcUIwCRSaJbi6b+Uj7qs1bZUd0aJBRU3qNvZUgD+gZVi25wrnHVQilqdRK/XwCvIL1PdupF32R58zNFWkLlzc8W2i8Gau1Q+gxEW8RuW7Koy0mtTI6y7CP1UtctsVQjyA/+VWJV+tKuPS3m9+pwTj5zioJpDAumuyi1uiu3/ULnbgBHVOy6SAXhm62ZyLu0sXEEMZsG+LSjmesjzEN5CSnAxPISgJSANmFzfJdesGgHzYoUYD8/Nd1+flqa3ZC6Dm1kx4s9j6KYJPqMGjJOgMs2WzOgva8y1YP2Fv6SgbSuK+mIMqq2CIO0Vhy+KBNBgo1Z833sfm8/JlK5rxrehhv9Op31N2V43E0d9mH22xrFEhflt+ZIHZoXQnatPNnx4st88Vg7Pd6y29mGayhRQnwm/19S9giRzrv5mDhAKBuOcjFuElcDtzitbnkDfrR9k9/oSyxzItNLUA5/jZ+pP4d+pgj3ANi9SnYo02nsbibph09GtPRnJ1p3ErkUwUNWSseoP3ijdQMnsQrI0UBL1mNYRfyT0ycotnsqdP9X8BNIwhePalONMpHXdr4xa3aiZef0OMvuFgEmPbWjkofTIVIYSaQ/E3RR3kFfmEeDXFSyqrLaqytVUJNV8SC/eLS2hH0Fse7xOEmus2xjHcqWfe2ZRokIxUdPfGnOKlTDhP/iubOCWM+gXDiM8iqdJrHsNZtTX9Q//qrURBf/NdzMN9k+VJET6g3doJP/6hdMFxWoILZ84H+fkqmdIQ0zbgAAAABJRU5ErkJggg==","qsb":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAAYCAYAAABZY7uwAAADiklEQVR4Ae2XA4xcURSGu7Vt27Z2982aUaPats2ZqRXWQe02Tmojqm1b817N/23+1yzvm7Mo5ybf4s6/OF/OPXNfpvBhMT4U+CRkkCCfIKzcoAEIAdEgHLQEpZhJEwFOT3GHy5jmcOnXglzGR3DP4dYXazM81ZhJE9+/fw8G28BT8JWftwItzYKwKoIoEJsCTUF25sUEufV2QW7jMvieDPcga2AaxGQFq4BqLTNzckGUE09EM1AC5AKFQPV44toCP7Ecl97DkoEOOgj6Yk+DtE4Ot7Ez3mvOVAqy5BhgAigPMoMKYCJ4a0kSC+KxsgRUSqG78oAwZqpK/vlAl14TxX8CEKCPTy6D/Q5WRnPpIdJjFU9O0xQyzeJJCpQKamB1juqHsEoyFwWyeFsAumKpWTiO0Bp1Tp/CTtonFLSNhU+wyU1mbotUUAgLL8E9laRwZot6N5TfZEPB19k9zZWCnHpx5N6aIFtaIOgpCy9vk6vE3GOpoGgWncsLQa2YLWOXZdEFUfDHuKKdbwqrsk1GP/RD7lycTLfeRCDoKwvPbJPLwtwXqSCrKwp5ISiIWRarRnMZeVHwa/AJgsqpsv7TX+ZA7i7AcdTrpqKDKtjkKjP3RCqoJYuubiMnF3MmWb1/ezcOAHSF0V09gzxtOIPuak5PLoGgrSx8ok1uCnObpYJKxRu+eRSCWqqGuWL4drcKRxclO1taTnqRE6+f5DCfKRzSGgt/C5qlkGkB3jHXNjX3oKYsPgyUTKZzLDnRILekgGYTXmVB4Qcp6QqEhftPexV34Wztfp4FndMS+8f4+s02kx+yO0WSlsWTNJkDOQuP1ZR4cjam9qKYnZfAWBLOgeyw9igngjLzSgrQnEZxHLGjlGByA+wGF+LtPQC3wFpIKym/SUOSem3k59ucV+JHDT9QNYXHjWYgd/xOk0pyTMUQxkXR7BJLCo/UEzAPz2PF8f0J7p/T3B4eR5GoQLAFPAZfwBOw2TpWlGOuWypJdu9UWUBRUAYUjj+QTSmUI5dEmk54hmOlN8BjRjCENfefrv88subbO+Q8pqQLyKmvE3KBFSjHXDdBebEgOygplJLwmYM9nYC0epDzkJIuai5PRki6qZBEQX+0JE9tyLlHSafRSYEZKOkGJQkEySW1VuflYAZVMzuIkuZwPz0llaek9BGkeMpvbT2mpDcQEyiTI5ckOGI+fIJ8gtKHH9/5eQq7P5+iAAAAAElFTkSuQmCC","satthumb":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAI9klEQVR4Aa2aBXrjyhKFtYRZwuzkMk+YmZkTJ+ZYZmam8GWGfWQJs4QsoV4fzeue9lUkK3pvvq8iWZYn9XedArei/Pvf+PL0h1Mb84WJ1Zm3E+uzNL42o9nS3grdd8v060Nbs2+7NXI7vHSwe2ZqxXRSfOaHmzqpbjetLaxptr26RdGAn1KRYD97TIVD13FVfc1MkU2cDB8PvxpfncnD6dmtBZramKPFnSXCa5xPb85r19WwB84Iy8bjfSFwj/yZZChIG4sbAsR1dkbJsGoFhNKRUF5V1VfMFJj2A87PbM4/vpkcopGlCZpkDsPxOebw6PIUzW0vaq8X/gu0ebxJd52ScKiay9DJ4bkpRMivPv140xSfKaQTtLm8KSAOdw4o6PdZgkBEACEAuo1G3um7oC9HvqHhhXEGMAuDdACDczjfc21xd5mK+ViPpM5PXKYQkBzu45+pl7J0uH8oIDZXNslx6qBESLUUCWaK4jx2vs7EUmxFOxRPRmiRaX12Y57GVqY0R0cXJ+C0MEQAEeEwkJQM4Xf5TSEAKUO0KnlynDl6onG0d0Sq398XJB1WP1TODs9uHIcO8jjc1CxXqF2vkcN7LjuLc5EDOM6szSFSHAqSkhMcmn8xhPPCSXvbez3RcLtcFFYvDQESYbWgMOcfAcAtpkboutnUorG8v0a8EsF5fo6k1o7rLEJLk9r1lYM16jRytiHuO1Xy+3x0fHAsEnx9aV177fN6KRoM6CHCwbcAINl4NEqZPN202+T0u7DqOhkBYlIqs8gRHBNJ1XJy473b5vvI3bBzj8eDaPRIan97H9eelZWCFddD9EajWasgN6B7zfl5VCXJeVbBRKWaZUc5L+DgCyAgJ0DAnk1wXA8FLt8DfHt9zZxskd/pI7No4L5wLAgnRZnlEDNMXjjKduw8YI2rJlcoOxDPJjiuQ1YRlh9KNh6ldrWiOVjO5uHwsyCqJ4BoIMkRDaw0zwUBA5DJ1RlRandOt9Ev7ECgxHKIZxMc1/CewkNRzqbolmke5TQbTxrKCiUXsP6gT1QnHAXQam8k1o426KFbkSEsJ3Y5n+YQMCQ0AESCnxydCABhtUIOIJAVcsBQVjwaKwfrojLxlZcB8HqdQSASdiAKmYQEoUtwPQDMqqx4NEJRFfLh1akXYHUWTRHDoG2IVDwiQ8DYfQfvAO6uOlRIxckIBNGAk5CV88Spg5Ab4PbprqhUouRKkto927Gc2Bg7+Oz0022TIkFVB6FJqFOvUq2YM23ZlVymr6x4yU2l42y1V+GwzgC3weSErm0FIhoIiSh8f10nNXCpg5AlhEiYRqNVKWnR6NTqWHnDkotonHrOMPAhB0SP4BVrm1WnX+/bTxwCFcjKKI5u3QcgQT883MHYByOGIN16zTQ/eDSSqRiigZUXDW9gclgbPzyX55abHTq6VF6NAd6X1DSO9mRlEA0k9wybnT4b+FKM7J6AgICTlntENhkXAGhkpo5etxrUrBQN32+UCsS7OZw2aoCxRIRW2HA4vjItyu7I4gTGDksDIHJFTmqeD8pdp43VNHSQy+qu2+HXbJVdlNxOo04Oj0PIaYzBACSfiwqIZDhiBIHvGrrpVckm3tVygPSLxktklQzHDBtgrVLCOCJPt/IojhJqaZMA+aC4XW7ye3xiYGtXy31BEBGUXzNZcZCwP9h3HJlcYxPu5oLlRtetFgWEwpMBIIlITFuhfrJChbq7aiM3bMtKboBrh5vYPECP4OUVTlrKBwDoZg3ICkMdQHLJuH1Z6bu5YclVw5e6ylRMpYwgkCt6ANleIis0v99++hGyslV25ZKL3KiVUxwCiWsqJUMALqtQIIgVYu2/S/ViwXS1IStULSuyqhWKcPzZaGSzCfoFAOadGlIyB5BlFQ9FLeUHN8xXZmPJTasJEHZPBiC6aPx42xVRaBZzRlGwBmBPVgnIijXCpi1ZoQFi9fX9wT6AkJXP7dOiARDIKh0NmUXCNFKZWNiwm3vP3bzasGMDUrINoDPXhevFskI3h6xeUnZjl6qplJRoOAyHbJvf66NCOotfDF33ldU/f/z+Ylld14qGVUlJpRNUKxWpWiySXRguq2q+aCk/rIwskBUqH0DiwTCXkq4qKdjI/WzgczpxnWjfpuLRCEXCIXuycr1MVujoGEusyOq7q9azU6sywSbCT998RoOzIzTNYAZnhmnvYPfpptWiVCJhCwRl1+qQCFn9+evPpsmeT8a1/+eX+7YuoZUB5vCXo1/jwca7/U5mU6sz2nZJrVIkgAQuL23LymrZlaNiKKtiVhcFZXhhTIvAN5MDmEWw79nzRRzfpjDH57NZ2/kRCYS4rPp2c4wjf/72i6GsHjoVAaF1Yjj51dg3NDQz8u7BhdjPmaGvx9/Qm6khWthepqOTQ9vR4LJKReMCpJRJmcrq29vrZ98rZ+I9X0M1gPHVac3hcTbSQlL4goEdBcjq86EvECFcRzQwcP1P0fDbkBV2C42ioPB9TZi818+3Qd5MDwECu2t4reVGiSUce66GaNgvu04v7+aWZIWxBJsNchQEAIw/hYGM5GuQ0djyJI0ym91cQGS0696AhyqFvK3eYWNIhKwAoouCggfa8s4ZP5cfWOAcecKjgPu0srs4Y19S3Ny9Q2KnVrUkq58ebjByPypjKzMFvk0OEzDMeezfwGkcvxj+Cl/75GdlrHINsoisahClfN4+hFR2sesHkGa5aArSqpaffrppXCvj69MfovbLuocNzY+xCjSonY8tTWqJjj6BaIyxc5RdgPEcyuczTxhHbEPYkBX+9ED7M4OxtZkCNA6ZoGzCMQYFg8OIDN86Z2Cj8nMALjPcg80rJDf2a+xDcHO6KRMz7uZ4xMpMUfBjeHn51ejK1CMcR2MDjObUhpAUjOl+lD3N/5r1jGHA9FQtPInBOSDsR8JaN0/++08NYIBAJCSHsdqICn+NfMBK42FFD9jyfu92erGQtZAT9mR11agVuPMygAQy/XpsbfqGPet6hDOoNkNzo/xpJK9OYuWXGcwcO/JcQJLjPiR2Jp3+/0TC7X7LJt3C2fHZh8wU2f4DW4DVNvZYUxcAAAAASUVORK5CYII=","openhand":"data:image/x-icon;base64,AAACAAEAICACAAgACAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAgAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAfwAAAP+AAAH/gAAB/8AAA//AAAd/wAAGf+AAAH9gAADbYAAA2yAAAZsAAAGbAAAAGAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////gH///4B///8Af//+AD///AA///wAH//4AB//8AAf//AAD//5AA///gAP//4AD//8AF///AB///5A////5///8=","closedhand":"data:image/x-icon;base64,AAACAAEAICACAAgACAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAgAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAfwAAAP+AAAH/gAAB/8AAAH/AAAB/wAAA/0AAANsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////gH///4B///8Af//+AD///AA///wAH//+AB///wAf//4AH//+AD///yT/////////////////////////////8=","pegv3":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAgCAYAAADwvkPPAAAEe0lEQVR42o2WTWxUVRTHf+feNzMtUyjFVinaCK0g9oMKr/GDWLQkLNRoENGFCSQuXLnSlYnGDQslcefSGCNCDAkkJKIxhaAQkEA6SIBSIQQEJECLtJiZMjPv3XtcvDL0G+7u3Zzzu/97vu4TZlmtHeEnoyWaY0cmsBTnZPj77OncFzPZy3SbYbiq486onHqv27H+BUdjnXJjWNhzzLLjoKU2qytzuRMnHwgLw1UNhZIM7v2sTEuTVy0jqiACkkYv/WPk9S1p5mR0YS534uZ4XzMZVijKr1s3R7Qs8hoXRZwHr+A8xEWRJY1ev3o/Il+U3sm+E2D1TV2pqjSr3nzFaRyJgE4yV+JI5LVup9kMK55cGlbPDJunz3cu9hAljtMvhQieXeKpTvPcjDAFpzprbir7XplyYjD+41x/7mgmCMd2Z1GWgj8vGi4PypFZE1COObxzn5UgjU5VJwRpdNd+K6WIo3eH+tyssEdrtefzHSly540E1YqxgjGCCYQgo5z8y8in21M01Gr3ZF87eWNu3aItMbw4dBJjrnnm+JhoFG5fcBzeJ2z/JcXl2Gg5koVDg9f3zli0HZ3hzpda3bsfrYsJCmh+UMQ7xSsYARMI2TqU+SrbjgXsOmIH+k/nWqeFtSwP9cJ3RaJhCLJw5YAgct/Ex0rTWsXdhXQj2vVBldzOU3PpXK4wIWbPtIerwxYPgsaR4D0sWA4+TjLoHcx/CsSAc8AosqbNUZ3irekSsKGnw0MZUaegQs0TSiqrqAo2UGqbFfVJY2gZuls9TnljCiyKeXtth0+UyJiaSKhfocSjsKD9vkoBXAw9HZ4onkZZdZrFy5Z6jSPBSBJOVSWVFRpWeqrrE4UgGAMuFuY3qDbWaWpZa9hQgbW2hxu72zyUIS3K7+ct1iQd4J2Sbbyvyohy4LwlYxRKyJo2T2BZX4F5ZUNPhwOHXL8tHL1oJuRZ/bhaErh8Szh7zYAfi5tL4mYASjHvrOv0YODbQ5a0nb3PrcD3hy1Y6FnhKd+DLVzclW2q16C2XpUA3X4wIGVn7PJkOljY/YcFA1VzVZsfUx5vDmtNtkrDl9s8WNh/3KIKpWhScwcT67sUo8ZA73GrpGH1ck9Vms6grobje45ZRgoi/VeElGWbVzZXVKSUHw5YNq11xGOHeI+kU/z25a6g58dDlr4Lhvp5ejzo68sVAYlduDGwXHKeJeWYzRUhadi6O8WmVx1EAijlGJznp6H/5MMbI9I0cCbXO2E4DpzJ7QJY3h4+7fy4aBtl8A4Qg0gSSpdMutSZU7kBYGDGeYbi7sFEFMrgvHC3IBW+S0ZiPOvrVImvS5wEyOeFwCp3CkmNAcROYOzZeRCMyqMiMJKHwMBwXiphHHtM/MPARkuRVIbdSEGwFobHXbOcXLA4pf6mgVlrgEwyuwol1BqkUEQlg2ATpTqNkCmwdMCN/qvCx1+n8B5u3hGZVw3f9Fr5uc9gBPqvGjIBNx/qLyhT3xWUbkkGIP2ISvnfvnxVQ1e2OJSY1yzUOH+jrzTZ73/M6/MEVVHjfQAAAABJRU5ErkJggg==","logo2012":"data:image/png;base64,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","logo2013":"data:image/png;base64,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","logo2015L":"data:image/png;base64,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","logo2016L":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAAAlCAYAAAAk9TVSAAAK3ElEQVR42u2afXBc5XXGf+fc3bUtW2BhS3JMaByDDW4nkPgzQJhgSbROJpMMkFLKmCkBTNK0xMlAnNiQYJv6q47jgQY6LU4mgA1OgsNHSZiCJcGQSQoyuCR8h9oWYFNkidrelWXv3ntO/9i7q5W1kpYkghmsM3Nnd3bvc9/3fd5znnPesytNa99hxN4fk2d2+wgL75MlNm79/QgL7xf5ld7YWXXaqGwmM9ecjyla67gidGK8MDYc91/A4RE6/8Tk783Vn06g18uhw3+DarVKrFfEbxQOJ9I9iGxVszXABy6UDk2/4qwINpR81DSs5B89Mi3VmcqsdPHrFQnQQZ6iOgb4koksRHTFebmxawD7oJD/sGuNCI3viee/caR2vCS6H1LkPCm4OoBZD6ptbrwuamamp4DPVZWx8SYkgX96MtldD3xtRFjeJfmvpU4bU2XdjwCfLHKO7VXX5cHocfcC3YXPAyCtjBnTc/hvHbtZRSeb2etJkhtHqP0DyK/q6b4FkSLxuP0ykQgvAw56lO33gHERPST4Ua5Hfk5KNgSJ5CqD3SPUvkvy/zec9ClUFvXKDM0TwuoLyZGt4FkHyHLVB5GkA+8F+abcWDpmEPplB8hkR3x0mMl/Q07+cGDRX5ZUNRujlHQM5+D3NDfWi9rHBU50OGiS2AlUPGb9t35TH1nwcUFPdOxg4FHF+M++bKOyme5z3HWa4AY823LD2J1AvyP/rK1DP6/t0m3SOX/29Eh0hkJS1HdPrJmyE4iGJD8IvQntLW0iDe4aLtJ/+uh556DcLCINhaUKIB66Gs2RRzcCTw2En/Cd357jJjdHJBvQAltKztRRmkV9QPyqJ3L6ZCpzLRy+EWSiSC/X569KtwUuSyJ8eylH6dMGX88vNrVftL9x1kqQv9B4Nu7w9ju79qroitrtbZvKbWqp7JxZlB+3fRLZnuEg/ictTUtcZa2C9DsugKA0iQUNqnwT+P6x94xfunOJR7JWtQw+/1mTmTSIez/82btyyROT3VtBLip7XBGdE4n9QtGgkrW0XbpNOhrmbBCRb5RZDoqejPPvHY2z59V9asc1x559iuS7Uyu9+L1DDayiFXXkHLYACwF+0jp/EcI66S1hQzW2u2q7uE8x9yZVDVRRYINDF3Bnkfhv/fciQdaJFo4dhCjb1Wg3ZQrQpBAoKCIbxPviqzu7/xmhl3jzPabygOJpkHOBBkWrKnWk/Q2zF4vwjd5jEAdV+Tl4h8NcQebH3YCrOp6c83tgXVnyRcyJBV+lzDb+gSZutQD3tFxQj7OxmFOc5yWyCx1ewwwHAg1ON/P7RWVGvsq1W0PVh4GuyUvb6nN9zg/2vCUTFwKvWeynYn46Ht0POgMgEm5Neu5hoKvp6fSZarYY1djZ7M6JYfU10FvJdaXSXzRjq+rQnv/Qj/+nFk+uKjDleGuo8tdAVyEKRuHXOPJveR5YoSZbgDfLyc7bJWXPR1puHCvldKpgDau7KyLfJJ9wFLsaZWzs8ekEyQUEwbER9krkRz+TsMSLKFWqekISvxJYH5K4WonxRjqpqQVB1C9CX0H0MzmPXlSoUjghJHElsN7g7zXOaQ4vHaqtXnQIcn3h1fed0JlZC9wwZKWSCxaixFFibyeFC5P4QYCamqlBZ9fuzzpcVHRjZZSJ/QOwtD/5Is+ViFXtp1enTwdeHmjwKNtTPaAkpao2CnJ1vOMdecK5QHu18C6TqKy0JSTR7m5bBF0Uh+wFwPr4tRCZd0Ue7h1A59pVbAsx3r2IL/Zm1HzT+I5MrmykpvR2C/2GoeVUz5fie9mccw5GybA2CJNX7X9nz1cQ+Uif+43HRfVXAyXcxwwzjeMyQK4Elgw4eqoqM6C3m8yVItP6fDzDqb0hKk8PKlUET4EXDntT47CeWlBDgUHxEfqUwqI44qbmJcmmFCQH+O2ApGZtn6l0KNQNIad/RrxIcRmDcHdwNHmJKKmStkxa0TvV5V8RXjxWR4rkT9a33t5nH/oP4AtxMvrHKJG8HXhXVU8QRTNVeysnMVpid5NCTnE3G8KtTArZ30zjlUgxX8gQHVPBigvVQfuxf0QyK8mLwlcBig5n/E7EbpOoZ4tDJqqot+OyErfPoyqojgks97Mo2zMfyFQynzrqUvsTmR9oTJzD71rzBxe0RdsRPhxL0SeAzQOuS2VmcUoqe/KqKO2QxzuD49WYSe/e7cnzobsVpufzkHwC2D4ApycrXleB7LQLnNXr5eQE7kPttrrmZ349WL4sS/7kYN+z+6JJG4Dr42XMDpJV26OEfrE0S5cNdc/VdFn6XkXPLhGg5fNXpz2/rzQLnBtP/YrQWAN09oucIFHvZpcXFEKQlvirZmK8wRWpIFcW7xH1OUleXgwS8Zb8K48Rky/Cl6Ps2H8BjvQbP5n+OhUEi7i3IPL53jTp84CdmLC/cXbxvtwYrwp65Jxym91vlIO11ctwe7QkEc+TyF/Q0L8ThJwchFB60ZMdH4R8JWX6AuhflSSYza3Lqu9vXVZN67JqEoFvwjia92w9KRnoA5pK1WkqReFKoJNU7EFVTow3r4dE9EMSEUEUbDLyeIWTwjD5gGep8ywULmBS5MkHlTzejJ5EGP4wEYYEZrcZRbk7VZOZe3NVndW5qk5yVZ08sRzRVPcinOsqifJUInG3YemS7fhBKkiclAoSFK5kmBuf7GabIo+p8ePRR0fXjD46msIlC9e82r+Ld2Ra1eFU5h6QL/TPprwGtBuYKpPN7Ix+dbH7Q6nqsZcQk1Wwux+cd50L3+tNzHZIVbcBu8BONbhY0dIqajFwa8np9jpBvlcS6ofUbZsjuwQ/1VwvVqW6dxreB7/g6f9bDbK05FDUpfCfLp52l7NLc1Wpkx+c+nfni9DaR52AR+5oL9bx8QO7XPU+gTfdOUXcLkZ1QgkxVwE/Kj6kHPkApx6Zpr9KZL4ewcriL1VD1fRmkaisnTht3E3lGko/vURkf8OcdQjfHPpo7GtrW3Ys66OdjoTNyXVQAR7WJhpzffCX/MyDrlczdyDypUFwncDESshvu3SbdDTOWS7w3Qrm813g5j67OhD5xW5nMHmSZv1axC8X9JTyrJNG/D41Xw+8NGQ384nGz4GvAinjafYcLkuBRwbC1yzd+TmcVaj2x7s9hzAgPtkYyvw13QtxXyHIR4/B/jIiuCkQb6uE/GJj7Y7XFwi2FvSscutxC5YAj/YLqaHIL9jmb0+TxjWHpkUmHxOhTlwCF94x11cztVXP0e+0OLjt+LJIV9O8M0KLZolIDeYHgiDYMWH7Uy9XUingyNHHUmck1GeZe42qHAgj2THqgmxF+OXLXR9Pdp+p4tPFNecuzwLtGuSmuwevlPyOUlPJeppvGCddDXNnRG6zRKXGkQNm/syk1rYXB5pPxeR/EGzzt6dJw+rM+ZFrGthRvmFolwmyJR/Q/jQwb7jmc9z8XXDJ5kxThNyiyp87vDQqe+STwKE+nR0mpPan0r9RdGYh75T2Yv7kv2TNnHJ8eL05b2lg00ERmJFNpZ5Q49pzw+pfr1iOf3pV91lHpXt9kXgslCB5x3DO6bj6o+x1WzJfU5FbjinReuIe1Jhjbr8JWDms5B9Pmg/wZjTpqzjfV9VRA+dyX9e6bNzSihL/CPnvzt7ilKlu0WIzFij20djzX3f3xwW5HXj2vZhHguPQPsQbu1AWD1O/s2JTRmyE/BHyR+w9tf8HCgFwvTQZCQwAAAAASUVORK5CYII=","google4":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAAxCAYAAAAIlEGVAAAgbklEQVR42u19eZxcVZn2855zb1V19ZJ0J52NQNiM0IkDDGHY6Q4MGkDUUasZGGcTSFhEBnFEHZ3q8mM2FRxHAWmWUZkZnS6XQRCjIOlGFNQggulmXxJClt7X6qp773mf749b3el0tg7Lp+OX9/e7v0519V3OOc95t+d9bwQzkQwtGkDkRCd+tfAjr841LnmEmORhGgWLCFOjAARUGgySpteIbjY29dKWG9Ov7HS9LD20wEGEOCD7L9msQS6nv41by16/JQUtkAmgHPyxkWXi5J2keztVTzAVs6thARBg+UoEQAdoBGhpCFTtFWM2UvmownzfD0Y7trYeVJgEYl60fNoBmYkQAgErv/6B5ZhddSZGSwa6Yx2VTiWdqtSxoL34F1/92RsNLtmrVsmLA4Al1400Gco1dDzX1lR5GgLR2OAmijxEug10sq18OUNwoVLeCvAEGP9o41eBrgjCAlQwKr2g5NeFpdaem+dvO4CA/dQsLTmm/+uvzkHK/77MqQKHizt2qiqQ9sGe0SdA753jz9++BS0g5I3bkLsHTHadh9zK6IiP9B1ML/k5QC6QVBpaLIEafQOit3rFbY8+/6WlpT1eeTX9+mT/CVb8ixX8gEASGpUCsckEvDQ0GO0m3ecj2tuHbp41GD/JARO1z/W676pEanDsb5EwdSi6JEQvjSEhDgljEGlncTTxR1jTGk5oozfXJDXSQ4dEh1/bfZ741beL8ReQhItKz8JFH375xtk/nObbCNAOoGnHNbrACe0EAPOvHjqRii+LX7lCi/2OSkI8z9TUwY30XtZ3c/2tUzXaAZmZVN164dyw0t8OiAEZoirpc7h4S/CXd12BW1f7WNMavtH39HZxRnMSHfrRvkvFq2ylCwAY0IUPm5GR9734lYXdaKNFHkAeuvcFpiCTN+jOyPYvys8XX7PpjCDkzbCpPwcDlWQNdLjnc3299bcjS4PcAbDMWG5d7WPpQgabXqwDp2x7AoQoCEH7wjdFW3s7aYucREs+MvBXJjGr1ZWGI+OnPKfB+iSK5z7zlYUjyNJDs0QzVF5EHjEIGtd5m79wyDiAv557Re8ZpnLO4Tra99ner8y7DqQciJb2U7YsdFiTU/nqXziNUQKQ8QECAmLdm3Nrb6qDe8jf9J0Km7rNlcYiESvq3KDqaPMzNywcQRvtzMEyTTqaXKxxYAQ9tRzv/7fer8y9DhlaCPQAAl5H0MQJ1RIf5Js7nQbZrEEDeORVvTU0/l0Q41EDSqLKalj61KYbFr6E1et9NL9ekyGsr++uEMgnem6aczWyNMhDDzi6r11KAEiCYPnnmy8elrUImsWVru7/e5OqPkwLA4FJVCbc+OBzVbNqb4v9C0SvFywA0HPz/FEAtwKUqUnAA/LaIUPashPDOG2hE9Pa/iYBplncgmv7l4DeFVocUQoENgkEY7d35SRAlh4g0Rt2x9jBfV1gYTZr2tvbze6+a2pqUnkDElUkBHkY1O8mkuwBkYHK6wpZYxMdR5n7ITk4oGWnTB4gU3yY1z+PTfPmEfm8ym4Sqh4AWCeXoqK6QscHIhHju+JQ5FHvnkgevqEQfY1gISDIZIzJ510ZELu/TkdH/PeZjJV83r0GoBjkISJwAPZ6Pttg0QlKbj/miIyB2CxuMijY/10nUy8Xg2Uiebfvs9syGZtpaOBe57E8h9OB4y3JvpQK+7WZQTE2gl4KDAvPvDx77nPlBf6t+xhtE4tfBsArF573FtCd6KgNCp2vJEluNZCXoFx/xLcffFLyeUdAWgDJzWAaJzRKGSjgw3Oq4aVWIOJxCHk4INUABuDhFVjtxLD3C1m1uX8CONI8g8XP0ELEAXCLr9lUIYm5xyMMj4e6g0lUk/BUIIABVEFQlKCoOooV8ZIVDEr/0p2r+82kE+MTEJlUWvvcdNmsSC7nAGDjRecdDoangVgeqdYrdNiHfRWiXaM69jPJ5+PxZWEmNoUXDMxaIdY7QqNifEWTADi+ATnR34Vk2oSmaMs0JE7xD77IElcmPa4gBcOBcySlLuGZas9iKAgxWArdxvc1/sIpvyLffejrAMhs1uzNTDELI3G05rhu/nIk8CEo/hwppjFKAAyRgI9aE0NvUIBU1M2H5n8XQ+4GOb/3uX2CpjyXS67YvkDS6Q8D5lLxKuY6FcD3YCs8aAAgVMCYskuiEGsg5eRHONR34yyv/5nubNYil4tQdnp3hEt7VhhlWBG5HF++YNVZvsG1SaPnVFgfA6UQFZ7FbD+BonMYCRwqNdnz8nvP+I/R0eB6yT3aPwEaA+A0eCnDiXhMBBRuBID9tq9vElg2NZ99xqlm8aMLkol/j5weORIEnxgOw4Zw2K8DTN1gITx280jhX0aKpTEfsKCeXGnxtRfffcr9T73jxEMll1Nms2aPYMlBeR+S/MnczyKlj6MWawB9EH3BeRgJFwGuDgwOQnfwPvSVHoZxgLp5SGINqvEr3l9/lTTDkTC7V5ExWA67tv98W1W53q+u+gThXtBC/zlO9GCUxo6Ihocv1vHRZ6EBtNAfaHEg0KgY6Wjv193I0IVuaOCdPV+ee22ZjtHdxtd78GEmwPLsqlXJTX969s01vjxQZeWc4VLw1e3jhcYxFy0eLwRHbhkbu7R3rPicOofIufoqa66pStufdp1zwlLJQZmF8ZRcZss3Ilk2h6b/t55fKIPl5ff98aWe4JbahGe3jo7dO47gg0vbHu6Z9udPAHji2fNP/R/fIA/qogGnUY1v/xgJ/OSJc046V3K530zXNJNgeWhBPUzwLdTgDAy5ED3Rn0rjwH9Pu8cogO+wDXdj7pzPI4W/wbArwUgVavBv/FHtYSIDH9lF02Rp0Czu8GsH3mu8xLeQSEs4Mnjfxs/Pfue0lMKLi64culsS0XdMsuYMLQ05aGTEr1ylpeEbum9Z8OREJn43iZidfeDdmCG+3J7cPB59d24iuaq/WBoNnDYf/u0HfzBtjC88/c7j/wcmdXfKyim94+PFGs87qmTkvifPO+2EltzDQ0Ygi6kKKmXCdxI4/V3wWV54X+MHqnxp9UjbMza+/vlul1maf7hn/erjfWazhvGMC7NZw9XH+0vv+emjhVLpXUId90E7VAxCj1xcgejeDeeesKAllwOzsRYgIWgB+MP5lUDxXlTwDIxGDpFeLI0D/81b4bMNloRMHuvgIQPKmX3XYDT6OqqYRBRFGAwjzMI1/EHNJ6UZjm2wOyJC8IiPDx4J491FQrQ4WqRG1wJCZDckQAqyNFhNf8tNs/oEA3/CaHyTeCkDjZwYOw9+6oH6K0YXoAUOWZo9qZHdxWz5TMZILqcbR+TOWdauGhwvMiiFVx327Qd/sCGTSbRlMjabhWEWZkOmIXHUvY/1FhQXhmE07JHJoWIpqPXMEb4rfjwHqFGgktNu7ByqfptgyeTz+up7G49KUVoLpUAjF7EUuY+t7OgoMtvorWh9LJRcTiV28yi5nErrY2FbpiGxbO36xwth9OkKA0t1ZjQIwiorhyAMb4qd32x5Jst+i1/4Air5Ryg5Rcl1yMrBu7gePtYgkmY4EXDyWIloMpLyh67EaLQRCVpABUNRhASu5/01J0yCpisvgFBDXi+JyjRFqIx+s/HG+qdBCnLLA4jEhWmtEmL1en/zFw7pR1T8GGxKABgNRiKbnFUvElwTUyjTwuCdgMKdjBUzGducz7sX33Nqc7VnLhwtlXQ8CDoPvbvja8xk7PJ8PmzO510uB5Uc2IUu9+yqVcnl9/50UzEK708bIahuOAgBdR996h3HHGoAFqfelyTEyOI3M/mz10CioYECsBhFX0yAFYYqxTB85vHk/IcIiOQ69pgTyuS7wrZMxmr1+E1DxeD5lBErhBksBq7CyHs7V77tDMnldEO2ISHNcPxx1RlI8VIMRQF8NRD3NRKCkRiIu01BChTtMLISo4jc9UiogAo4BXwVhNE/xnhsA/LN7qCrehcT5l2uNOzgVQhongcoaGm3u1y89fgIWZot2+u/pcWBTvHTBhBoMEaBXrj4mk0VyK2M0NUlOyFmwn+Z+sTPvlWQz+v61cf7cMyOByGTAiPk9wVge3e3lA2arGts9ACwOQ+3dO3a0ovnHrfEJ44QVVNjTYU6HQP5rTBS44myb9IWigg1hJJvAQC0NDnkXlf2S9ACu1fgtQNoagK68mxDHpLLuZfeecrJCcHbh4MgnO17fkh9ojmfd+W8wB4jEQG4rrtblnd0BZ1nHdOa8vjZIh1BwIdwHPwwgIeWLaooO23uOhgBlAZjAErypAhI7iMMb4IjIWgvfBOjqc/Ak4WIoBgF4eEs3pc+Ts698HEBYKycIn5VhQuGS0JYnczENu0hI06LvES4qv8b8FLXIxonXEkgclAUpQ8D0IWGKwTI75S3m+6/rNqwyQjATZsTJ3u+NIyHYZgW+HThCwTkuYoKy0yGks87dMSb8NlVKxo94aVQ/lm1JxgOwk4KvyEm+ubRaztfiBN3IhshJmY4QcOoCKguO+TywdpNIgOx1n8NuZgdLPS+s8Rxrg31MdLhNLwoaRMcV+eoxqfTHgAo74q9r2VHhwKAavSd4cBcL0TCEVoInSixsuuso+bImsf6CvemlgB6JgogDDw4lJDAYLxR9kF0xKCyshKj/IHeg0pZjWEoCKACHkbkXQBiwMAeSWPiGid1gJgFgBAt3P1m7IqX3ZHtNiwApAWp8JJGo7FZAICtz8ouTi53/sWJdeOyFkCJ7uw0hAWqU1WfoBMAWLu2BAAvnXvCAue0WYDL5vj26MEwQqj63aFIbw9rgweW57uCqa6C5+g2WOdApcRpq0BNoqpuvFQ4EeAP0QaD5v3MSJbBUnPxpjqvcs5KFEcJQgAHGrGALSdRLcRFymR1QsLh3qbWg+7PZrOGv7jv1JKLBEpDKgid8f0FUAIi6zpf6Fy5/Im0NSeMRY4BQV+kLhQsB9CRMO5kpJHCKCJ48OBAwM58Y7THDjcUP0Ckqyf3uQOg+KPyDoQTl7axqRd1JSjdUfOv3Vq5XWRst5uxLa7QpedeZFQagbHVUAe6kjPqxYBeuJQ7myTEo+YOH+bn/ZNatMGpEaoCVKjSAuBz7zi+yRP5a6p+YF7SMz3F8OW+IPw7Cfifb1n3640TV1/X2Oi1d3Roc1mze9baRzUqhCLGL9tBpfhGqBcAshZ57r9mAVC3ZkuDeBVrbTp9MBPpHRshCAG6OCmpCkmlwGDQUXGeAFz7yCO1gC4OYgZWqAp1Ont/HqG9sdGioyMSYr0nOIFQiopLeuKp6sGIofpWmPLsOgCCJIxWTGqY3D4BowKQXvAECl4AQQKEK7vFi5GNDHOiovIq48U0DEtq/PRCP8IKkA/FFMG0zVjWHSmpHwzRPwqYahghXLDVS819OdZCN3M6lTRdquuq48IH1XqnDqR6hSgEHS9+7u1/uHpB0l8xGEaIHO/eXgpv2Vyq/vHKsmliFgZdGUE+r9Kxs8/obT+t7qm563o7JVFxDMOCArAMRgCx762/Yvsnem7G9v0iDAVAFhZi3ifwfhUNbG8nJe4tEIgA51KkClQCBhqVxm0welbfnUvWA4KjpC9ZUq1WNSBVIlWAPAgA2svmZqai0E5QAI2deUNABam4sMPVTtHgiiQMIrcIwNPIzyBhmSuf6bAF5KvwcRhKmKgxSO2oH5FHXDgGxOrLwSaMBmOXQKQD2d3k8glAKE5QCWolXKBSUWe00Ne2+QsyjsZ1HhradbcmibuSSVRYqgJKGVfHCmtODMlXukvB3wVF919Hdzzx8nRtEtMA+T2z1bis+9uwqWMRjDGm3cJIUrU1Wuz7G0A+jvZ1duYkpBA5RP3A/9ndt7Wrtz0rNjGbUSkUP+UzGH2y784l6xsb13kdHSujSEMHmChWr5RAHZT6lmdXHZlcuvb50g4ufwbKTmVTFNeJxM4UCYUUyhMcTia9CIUPgxIaCKzbLUO9Gweb8WyVeC+3w+CwHc/FMeREkaXZ2IInFl098FObrDlVS0Pg+LCKTTUvuqr7xi05eRyr6aNVdtTeroEHSBiVth9vvXQ1YUSLg694UfKf4iCiZcc6FAEkOM00xZ9G+kckppd0EDAglFaMlJwbjSgnHf3Ar7bsS5vsTgwAqG++6oqDBYpnSJKAZWlEYVJXzV3T/RZ0rIyQabP7bZoytMjQopEeMrRYTR8Cs9NyiykhSzNvXg8BQG1hCMoeC0IBKTmlAQ62UcXS8gD37fjO65i4w2ikBGPv24w7hRh5KdYp3AjH2PZPHI4nC0D0zLBsoaX8LORIObzVWI3hZQDIosWDCIX2o+oC0niGdA7iJWhTX1ty9cBstEqILA0ytMjSlD97RvxPSbJKSNfnguJ7t7bW9MY9YtM4Me4+aTe/blzK43zRxqV4iJxzaStVAncWGxu9DZmGhOSgks87meEmNMjQ9n9p7mZx0S2SnGVAOsAIGVFsMk0xt8W1G5l906E7hxJx50BeHDoQ/1wYu5YTIyURO9s50XxDhm2ZjF269vkSBZ2+AQWqpLpqz5iQcnbZQTEzfQSjagGBkOqLSKjYmvKjzvKXj6FIALQQmvK/m/hDVJZ5of3g0ehN5kMMAfBncVYip8jQvvqlWY+6YOxy8dIGXtrXYCQQ470tEO9HC64cXIGcxAX1OdH5V/Qtm983cI+pqj3NjQ89xdLQWX2ti9Yj02b3qzTk5Unl+ahTFVUKSTgllLxSOjqiZVi238RyXCaZpQlTieu12LcJfoVHOEeI1WDImVRN45zLu29AszhkYfcLNHvJYXNq6qEs9eWwmdR7DCBOKVBK4BSqvKBc77LPSWvvboyvY6Xei8tFopQxALh26drnh9syGQviVwjwIhLlRwrhkMYiAGfGORbsU6NKDloG1lw4AAYeCgihuGfCMUZeHDK0275cf2tUGnwXqc9IsjZB8SHJqhMkWfHL+R/qWz/vQ31t867qewiCx0xl7So31v9gsTB8Ws+tBz8RM93NbncVd5PqZRr5+MtD5ykAuEh/PBK6UStiCJixKHJV1pzY2bTsAsnnHcupjJkDBkJ05WXoi7WDUPeXUChgJebWjdXiYCSJWdfUXdb9SeQkQhayRz5jr57wNH5Mp9jdHTkUB0DCFPKDQdidMCIEZCyKNGXlhM4z33a6AMpMZkbmUVWPjW9BM+aUQvNvcTY5b+VclADchiQkHjMmIqarREA07V1FT/BL+B7mATgUJSjSsIhwt7wHz7ANdrKwqgya7V+qv8dufuK4KCxcRFe8Mxob7HDB6GMQHGRTdRnjpU+H9ZPR2OB2FAYvGr7jkH5k6e21xGTS2d25gqoL3dqWydjlHV3bVPndSisCqiMpgXOaMPKvjzYeuVg6OqJ1MwQNAYkXPt/skKHtu3VhuwbDl4qXNoAF4rSkx9KwM4nqf6i9rO9G5MrcR5be/gMH4GQnNXexmgKQmYz5g+//ZkCV/1hlxTAeJC0goPsnAEB3d5wD2cOgeuZ1kIBR4l1jkWqN5yVCp7cd97OuX7dlYNGCkFkY1OFmDOMVJOGBAMagSOFsfh/niMBxHfY8ka3wREAQ70Aa1RAoxlEE8SkSgsy00ZVBszl/ynj3F6u/se1fqy/u/nJtU/eX56wgeTOpkQvHCrAJwAVPdd9xxHaspr8LO727EXNqq8lUqiRfzt+H/zAWucCUydqiU3hGFsw2qXt+ffIfzFtZBk1bBnbavMbkbiZjCRgBpix4Xhyy67z+2xbfqeMDl8D6hK0wVI2oarQ07Eyi8pq6K/p/XH/J9mORk2giEkC27NRmGXchTB40yLRZHH+rhyw9dE20bnLPhHw+r20Z2Ib6zi/3B9EDs33rE9TRKHI1nnfqhsaGj0tHR/TY8cd7ZeZ5coBZwHQ2NPjNebjHTzt6TdLao3wRMxxGvxkHP8osTCZfrsVdBpGTMAyHSyFl91+hcCA83MI21MtKRFwPf6o/M8FayxqEbEMFLD6JEIoKeCjhw/IePDNJbO5CHUvcbtNGi+w6D6vX+2X+9BjSWSF8BgXCpP5w3uWv/MEEIblHrEROduzA8k86oi1jgXlGCOYzGXP0umeeGVd+erbvWSFCgZix0LmUkWNTSfeTzjOOPn1lR0fUnMd05zcmd2OnWH9+2lFLd92l5b7qOau3nUUv1Sp++nCWBgHVCAKKX+3TlYoEWxEGrQO3L+zcHw0z+5ItL4hJHEoXlCRRkdCg8MuhOw46eWquZwLlnW9vqPVCeaDGt8f1h1FkIfTF+EXnVi/v6Lptl2qysjx++lFv9yDfrrK2aiRyz4w4vOPUR57aOLXUcGppJb+HK1CNmxAACBCgEgmEeARF/Im8G9snyyHKtED53AQqcBeq0YwQwBg+Le/B9TMu1wQFVz2XQN2rbl7Psn8wlfUfc6M9EUAbk5S6haXCRb23LeqIfZgpLTkTxWBzfrUEYl6AiEAZoirhY7TUig9/b830CoDmfN5taGq4Y47vfbAviNxE/VPKGhsShPI/QuXX1BYeO65j4+BEyP34j4+cY5FoVOqfO+Je2Vs54ayLNtba2dWfInGZ8SvTjApgNB5BRCRRYxmMBhD5CZQPKPhL1eiVRNKNAmlISAauWEmRuZ54h0J4jCpOF5FTxVYAxkC8SrjC1oeHbl98+vTkYBYwOUB/ctrbaut9bU1b8/5AiUDVeSLWKe8g9F+P7ni6cwIsT572tsMV7rK0lb/1RTAURt8bj0qrT/75S9ung2VKEZUnOUS8F81I4CakMBfDAJIAFM8jxGeQxPfkbAwBAL+HNCzOBHA95uIY9KIPET4q78ZX9wmW2ITHumzKWBdfs6miFFb9GmKOoAsBVSM2JQQiaOm63lvm3bgj2BBigoT9wvkXIu1/HYFzUBp4Aii3QvVSjONpVETj6K8eYi4f5jMwzXm4DU0Nn02J+VsRYCxSEgxB2ErP2kAVpYhbIXyVCqdgtRU5OiEi444fWvHI0zft5XUfbZOeefUl3Utt0rtEXJQRmzwUJgm48osbbDJ2hVwJDEcdgRBKC4GBTVpJVEM8v0wLBNBi75gQz0H4C8B7CKoPD965cNMuIdMU0ABAZ9OyCzzwWkJOSFmDamswEDoUIt1IcJBkXdqzByfFYDiMfhERNxz306faphcx73avT2ia7+JgVOA6ABfBQy0qENNePRibDFQFh6EWaQyjAOJ2FHCjvB8b9wqWbNagq0WmOq/1V2yvEs8/XJVHU3WxEH9iUrNP1dIIwMiBFIqIpGqFxaHb+3ofvAwNnURXl6Atr/jS+X+KlP9f8OKC8Unj7kmsn0MHjJYeQ9quwup7+9CSFeZyFIBPNh79xx7M3xM8vdIYOBJB2f9JGEFCBAJgOFJEynsLoVx30i+6usp+zD7UZgZmYqCLr2HFyNjgScZoE1VXCPRQ0M0hUAmIF+cjJAQ4TsiIkH0ENgvxIsU8JapPW4TP9925ZMt+BOE7Vf53NR51EuCtJLksJA8BdA4pBR/YCMNfRqH86NhHnnp8qmmbSVJq6oLzf7AICZwJxUkgDgVxEOKWnF4InobgQSjWybvQu8+ugSmF9PMu33a4msT5Ar6b5GkmMcunhmAwqgC2ABwmZL4ka+YwGHIgDWAiSc3x3XjPdwYWzM8AANLvrkTKfRKel0YYRQDNZH86SUAUvngItBXX3PfU1JcKtWVgm8vtLU82vnWFR3tWSBzrVBeBqCQxbIFXjcXj6vCjYx95esPU82aWU8nSoAuyS3iXpanZ/Mpsz0tXsFQ04qVYYhR60XhpqDBWQH55sMdrNq6LI5Cmdp3JG5L2t8/otfQlMQuDZRCZITu/z76kMljqV288gl7Npwm+36uurXQj/UUC/0kXrTVOnqTK1r6RuQU0gHNe2bQAyfQXJDGrmaVBxiUREpmKel/Htn+u/7ZFH9vPZsBdqJS2DGwmD53JRsoCpqVcBQBgf7sCdurW030/NAXZyRgkrvVog76OtzVIWwamvrtReubNY2c+zxaALYC0ZDLS3t0tTU0dKrk9VbjOlNWYkrhrwtRXqgnaYWbU+VgGy9zLt14Am75FvIpaaAiNSjf648V/3vbvi3r29gx1a3qvhrU3gM7ChQpjSTEGLjpmoHXBb5DNJtDUrnusTWsC0N60183ILEx7e6PpmdfBzjwm53JZBlLf3Tgxl7rnjNr+T218frZlx3VaWqYEof+fNtqXwVK3Zvv7TbI6z2gMMEmFK13Xd0v952MNSw/zwPhlkxPAE071d2pXbz1PbEWejJJg6CRZ57M48M8DrQs+sdsOggPyv1CyWQNQ5l28bf6cy3v751ze7+ZeOezmrNn+SNmMzyzhmdmQAIC61ZszdVcOsXbNtqDuylHOvnTr2ikR1/9zMQdW+I2WFgMII4tLkaipVRcEtCmjwm9NauSZ+B/55QGy9PpbF+c1GLtfbIUPhoCg+rc5ugOAeeNlooP0bLiAImJABwO7NSYk2/fXoRKKWQtjQQpJxk2GXXk5AJjfBylrDwXnx/XWMWWn0EMAIZqa9lNhtYiQAZWAWBHqegBAQ+YAYH4/pGx2iOGY0KbQFQHV5p39nBnI1scEuZxS3SkQowxGQ6v45k6a7ABg/rc7vRN1NHwINilwFAYFlUTNcbNXb4tLRHKfmcL2T68voiDTFlcntq4IZ31w83GwifNhfEO6r/TdufiZ8gssfwdfHX9AXgNgaJAzOvuKV5cg8jaIMVVwQQQxRryUoQv/sbJ//PrN+UPGd9VMO6chaj64ZYXxzDdNxfwj3NiWR6qrF521uQalOAz/7aQsDgDmTQONaN3FmzNMVH0ToGFYiCAGkqj2GBWeBvUupd4PjV4YvuOQybdlzLr6pdk6VnGUhTRD+GGTnm+1sO2Hruj+bOSuxX2vubHwAGB+x6WcvKu5ZNM7jFf5JfHTb4ELwXAMsAmITYLBCEjdBpFuUSpj6vAgqairlUQKOtbbwyj8l6E7Ft4ICH8X3ml8ADBvKmhixr8+s6Eqqp37AUKaoXosRGphPIjxAJMApNzF40pgWBiEyM9FvO+ECL4z2npQ755M1gHA/B6DZuJj3SW9i51Gb4XhoaCbDQGFEqnYHipeJvX50ak8U+M6Dx0rHX5H/oug/wtPK8i9UJHP8QAAAABJRU5ErkJggg==","fav1999":"data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","fav2009":"data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAABILAAASCwAAAAEAAAABAAA+VeMAZMbFAH7k/wBGy/4A/8hpAITk/wAsPNkAE8P8AFXc/wBF2f8A/8BRAP+5OwAh0v8Aqev/AExm6QA21v8A/cpwAAXJ/wAa0f8A/8dmAP/GYgCa6f8A/8NZAFzd/wCT5/8A/8VeAP++SgAq1P8ABc3/ADRI3gADy/8AKc7+AFRx7gCktfgA/sBPAP/CVgBx4f8ALdP/AAHM/wBAWeUA/7tBADpP4QCJ5f8APtj/ACg31gCi6v8A/71GAL/v/wBFydoAJTjUAB5s3wC8y6AANsD9ACvG/gBNauwAnbWRAKPJ9QCmvpQALdT/ABojzgBRZOAAue7/ACBJ1wAyRdwAFsX0AD2y8QAXz/8AEhnKAJXo/wBoheEA18B3AJ3JqQAKx/4AIS3SAN/OjgAJyP4A+MFfAPf4/gD4wWAAXnzxABWn7gAdvv0Aat//ACY01QA3St4ADcr2AGrI+gA5xuoAPMv0ADrM/gAny/UAM9D+ADHV/wBWgu4AS9r/AI+n7gClrvAAjsetAEnW/gA0xNwAOdf/ACfT/wCO5v8AJ1LXAJ+m7QBed+4AR2LpABjP/wANyPoAcbT0AAzO/wALN80AW27nAEvG0QAV0P8A4r9xADjS/gA0XNsAPdf/AC4/2gCe6f8ARV/oAP+4NgB1wbYAQNH+ANLz/wAAzP8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf2J0Hx9YMxAQBBMZFgoifxIlaxERMAQTFBkjChooCwt4DSRlJkcQe3tGGRYKGih6JAUYfRcBSh4RQDlOFiIuCxIrGw99ZGNVHhFIexkjGigbXg8MBSpvHH4eEQEUFgouKxcJXAI4Q2wcfh5hExkKGghSCAkqXztQbiYmcXNMNzckAiQXRDxJMmUSckJaVzU0ZhgqAm13LDFBDzobJVtZAxgVKlYnHXcsPgccfh5LB1ENDRVdJykdd1NFfX19fX19Lz0tIGonKT8GZ3YPfHx8A38vLU82eQBUd3V8fHx8fH9/f38hIA4nKVRof39/f39/f39/TSFpDnBgf39/f39/f4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA4D8AAOB/AAA=","fav2012":"data:image/x-icon;base64,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cv/KgXH/yoFx/8qBcf/KgXH/yX9v/8l/b//Jf2//yX9v/7efkv+Z0tH/jd3m+wAAABf++/v/o8zB/1WulP9Utpr/Wbmc/1y/p/9e6OT/Ye/w/2Lv8P9j6+3/rMPC//709v//////////////////////38K9/8uLff/Rjn//0Y5//9CMff/QjH3/0Ix9/9CMff/QjH3/ypKF/666tP+P6On/hvj6/4j4+v+M4u74AAAAF//8/v//////9/j5/77Z0v+Txbf/ebup/2q8qP9j3Nr/ZuDj/7fq7P////////////////////////////bp6f/Olov/1ZiL/9WYi//VmIv/1ZiK/9WYiv/VmIn/xqqd/6PRzf+J9PX/h/j6/4n4+v+M+Pn/jfn6/5Pl7/cAAAAXZLac/5vMvf/O493/9Pf2///////////////////////////////////////////////////////37Ov/06OY/9qilf/bo5f/26KV/9uilf/ZpJf/u8C5/5jl5P+H+Pj/iPj6/4v4+P+O+Pj/jvn6/5H6+v+W7PT/k8Xb2AAAABdYt5v/Wrqd/1y6nf9duZ//aLyi/33Crf+Sx7f/////////////////////////////////5Ozs/9mrof/fraD/4K2h/9+sof/Ttaz/rtPQ/47y8v+I+Pj/ivj5/4z4+P+O+fn/j/n5/5P4+P+a4u3/osfg/6O62v+TqcfCAAAAF1q6nf9dup7/YLuh/2K9ov9lvqT/Z76k/7/d1P///////////////////////////7/s7v987e7/rNnW/+G1q//Ix8D/oOPi/4j3+P+J9/j/i/f5/473+P+P+fn/kfn5/5fz9f+i2+r/qcXb/6jA2v+mv9r/pr7a/5esx8IAAAAXXrme/2C7oP9jvqL/Zb+j/2jApf9qvKT//v////////////////////////+g5OT/f/Dy/4T19/+G9ff/jvLz/4n3+P+L9/n/jPf5/4/3+P+Q+Pn/kvj5/5zr7/+p1OP/rsXZ/63E2f+sw9n/qsHa/6rB2f+nwNr/mK7GwgAAABdhu6H/Y72j/2a/pP9pwKb/bMKo/3S/p///////////////////////sdfK/37PuP+G8O//iPb4/4r3+P+M9/r/jPf5/5D3+P+R+Pn/lfb3/6Tk6v+w0N3/tMrX/7LH2f+xx9j/sMXZ/6/F2f+txNn/rMPZ/6rB2f+ar8bCAAAAF2S9ov9nv6T/aL+l/2q9pP9qu6L/a7ig//X4+P////////////////+Zy7r/gc6z/4fTvf+L8/H/jvf4/5L3+P+T+Pr/l/f4/67g5f+50Nn/uM7X/7fM1/+yx9T/s8rW/7LK2f+yyNn/scbZ/7DF2f+uxNn/q8TZ/5yxx8IAAAAXZ72i/4bDsP/F39j/7fXz/////////////////////////////////8zk3P+Cy7L/iNG4/4rWwf+S9PH/lfr6/5b6+/+Y+vv/qufp/7vR1/+70Nf/us/X/251vv+MnKv/tMvX/7TL1/+zydn/scjX/7HG2f+vxdn/nrPGwgAAABfV6eL///////////////////////////////////////n7+////////////7zb0f+Iz7X/jNS7/4/Zw/+X9fL/nPr7/537/P+f/Pz/r+jr/7zR1/+60Nj/RD7I/1xmff+fsLj/tMrV/7TL1/+0y9f/s8jY/7LI1/+itcbCAAAAF//////////////////////P5d3/f8Os/3vFsP9/xrH/f8ix/7XYzv///////////9Hm3/+Lz7n/kda+/5Xbxv+e9/T/ovz9/6P8/f+m/P3/sunr/7HC2P8jEt7/Nzxf/3B8gv+Roqr/scbR/7bN2f+0ytf/s8nZ/6S3xsIAAAAX////////////////0OXg/3jDq/9+yrH/gcyz/4POtf+FzrX/hs+2/73e0v///////////9Pm4f+Q07z/l9nC/5neyP+k+fX/qf3+/6r9/v+r////hqbn/ycT7f8oJnL/VV5h/3N/hv+DkZj/orS+/7XK1f+2ytj/pbnFwgAAABf///////////z+/v99xKz/fsmx/4LMtP+EzbX/hs62/4jQuP+L0rn/j9K7/////////////////7PXzP+Z2MP/m9vE/5/gzP+r+vf/rf///6////9Za+f/JxPp/x8UrP9NVVn/XGVp/3SBhv97iI//kJ+n/6q+x/+lucTCAAAAF///////////t9nN/33Jsf+BzLT/hc21/4XOtv+I0Lj/i9O5/47UvP+O07z/////////////////8Pj1/5jUvf+f3cX/od7H/6Tizv+w+/f/pOP7/ycZ2f8lE97/JBHc/zQ5XP9WX2L/Y21w/3aDh/9+ipH/iJee/5iqsssAAAAX//////////+Ix7L/gMuy/4TOtv+Gz7f/idC3/4vSuf+O1Lv/kNW9/5HVvv//////////////////////n9K//6HeyP+j38j/pN/J/6rl0f9cbuX/IxLZ/yMS2P8kEdz/Hxeq/1FYXf9eZmr/aHR2/3eFiP+CkJX/kqKnzQAAABf/////+Pz7/33Gr/+Fzrb/h8+3/4nQuP+M0rr/j9O7/5HVvv+T1sD/ktW+//j8+/////////////////+s1sf/o9/I/6Xfyf+n4Mr/f6LP/yMS2/8kEtv/IxHZ/yQR3P8kEdz/KS14/11laP9mb3L/cn5//3uIjP+PnqLNAAAAF//////4/Pv/gsqz/4fPt/+J0Lj/i9G5/43Tu/+R1b3/kta//5TXwP+b1sH//////////////////////67Wx/+l38n/p+DK/5rKzf8sItn/JBfe/yUX3f8kFd3/IxLZ/yQR3P8kEdz/P01s/2RtcP9ueHr/e4aJ/42bns0AAAAX//////j8+/+FzLT/itC5/4vRuf+O0rv/kdS8/5PWwP+U18D/mNjB/7jg0///////////////////////pdPB/6jhy/+j2Mz/Ul3Z/ych3v8nJtv/Jyfl/yQR3P8kEdz/JBfX/yQR3P8mH77/YnuN/4CLjv+CjpL/jJuezQAAABf/////+Pz7/4jMtv+L0br/jtK8/5HUvf+T1L//ldjB/5fYwv+Y2MP/5/Tv//////////////////b7+f+g2ML/qeLM/3OQ1/8qKeH/KDHe/yo45/8rONH/Ki+F/zE2uf8rK+r/Jhvg/yUT4/9ZbtH/uOnr/7LEx/+er7HIAAAAF///////////jc23/43Tu/+S1b3/lNW+/5bWv/+X2cL/mdrD/7Ddzf//////////////////////wd3T/6jgyv+t483/W3Ld/ys44P8tQeP/Kz/k/y05if8nKzT/JipV/zA95P8nJ+T/Jxvf/0pS5/+4////u+7w/67AwsQAAAAX///////////M5d7/kNS8/5TVvv+V1sD/mNnC/5raw/+h2cX/+f78/////////////////+n08P+i1sD/rOPN/6/kzv9nht7/LkLh/zFL4/8wTuX/JjOS/yswX/8qOJD/LEHj/ykz4/8oI9//T1rk/7j///+4////tufo7AAAABeg2ML////////////Q5+D/m9bE/5jYwf+Y18H/sN3O//f9+///////////////////////u9vO/77k1v+w4s7/seXQ/5G92f8/V+T/LUvd/zhf5P8yVNr/K0XA/zBN4f8vRuT/LDrf/ygo3v92mer/uf///7j///+58vL4AAAAF47Quf+Xy7j/1uji////////////9fv6//v//v////////////////////////////////////////////z//v+949X/tebS/4qz3v8zV+H/MFrb/zxq4/85Ze7/NFXl/y5F3f8sO+H/XnHc/7Xk2/+4/vv/uP///7v29P8AAAAUkNS9/5PVv/+S077/kMu3/6HLvf+Qy7f/kMu3/5DLt/+Qy7f/kMu3/5DLt/+Qy7f/kMu3/5DLt/+g2ML/oNjC/6DYwv+x3Mn/t+jV/4644P9BbOP/OWXf/zZd4P8zUuH/NEzj/2eD4v+769b/u+vW/7vt2/+4/vv/uffy/wAAAAuk3sn/ltfA/5jYwf+a2ML/nNnE/53Zw/+h2cT/otnG/6Pbx/+l3Mj/qN3J/6reyv+s4M3/ruHO/6/hz/+y49D/tOTQ/7Xm0f+66NT/vOnW/53K3/9sl+H/WoHg/2GE4v+GrOD/t+XY/7zr1/+869f/vOvX/7zu3P/D8+v1AAAAA7nd0Xq15NX/teTT/7fm1P+459T/u+fW/73o2f+96dj/wOra/8Pq2v/D69v/xezd/8bs3f/I7t7/ye/g/8zw4P/N8OD/zvDh/8/x4v/Q8uL/0PLi/9Dy4v/Q8uL/0PLi/9Dy4v/Q8uL/0PLi/9Dy4v/Q8uL/0fHj6LTPxSj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AMAAAAOAAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAMAAAAH/////","fav2014":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFrszyPZD0wMDA+NvYzeTXisuq4F1Srq6u7e3tQYn0hy4pP4jt3lFFqcdQqMdP76ultbW1gSwoQbBu79p7MatrmNCz1Ug8QIXsNqxtjcyrLalr3ldM6paPbsGROKxmZL2IstrFUrZ/10s/PIrt1kk9Oa1tOq1mMqplKqdk3lRJGaFf2Es/2Ek8QIbttT82P4fttD00tD41/95H/95I8vLy3Es+3Es/HKJhw8PD3Ek83UxAHqNi3U1A/95J3U5C/91GH6Ni/91FPo/0I6RjJaZj/95GqshSP4703U1BP4/0GqJgJqZjwsLCIaRi3U5BIKRiQIz0gCwnP430MKlkQYr0KadkPo30P4z0G6JgJ6ZjLKdktsCHPpD009PTIqRjJaVjLqllPY/0t8GHJ6ZkqshRQYz0P5D0IaRj/91E+uaHr8ryu7u70tLSP5H0NKplNqtl5ubmKKdkpdW8N6xm39/f8PDwG6JhO65uz8/PQIr0762oQYv05eXlJKVjLahkPY70JKRjPYnts7OztsCGPpH03U9DP69t5u3p7u7u5u7proqH4ODg6LNFy2dfH6Jh9NZO5OTkrcTqXbqIHKBgQYPsXbqHr87zO61sl9CzKqhqPI/05+fnwN/PP69qx6Kf+dlDrNi91UxA1NTUOq506urqcMGR8+i3ecSauGRdPIvtO4ztv7+/0NDQ00g8xpGN1ZaRvt/OWbl9s7yAVLeG3IB4VriH+NzZy1hOrKWlRLFuSbN2roJ+/NxH3lVJr8vyzL28t8GIw19X0XRBHqJi7dDNH6JiyUxCqchQ31lNHaJiy+PX2U1CymBYMapkzuTXVbh99M9Gz0Y72engl2ZLs315uXp1k86sQI700E1C+9tI1U9Ez1I/r8ny5bi06pGKNKxs1pVbQIv0kc6rmtG0xebRy1NJz1dNrZ+etra2xlJJqnpg31ZLWX9UrsvywVhCKKZkw1hP21BFqNa9q9e9PK5s8tRN5e3pz1xTvb29d8Sa3t7e/t1IHaNi3Eo98fHx////VMCZsAAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAALsSURBVHjabNFlWFNRGMBxOiUGiHRJSSjcXWLEmAsZjjFwG45OASUFlRCkw25ssRW7G7sLuxPs7tyG7z138vhh76c9z/+395znXJUeZaNuo9UxQMtGHX6qKOsVZ0JCgvz9/TqMlIOKDi4JZI1GysBuazqXSwJZH3UAT7ftMzFp+jrPxeKRmZmV1YLXjfQorpOvrzMA2kMAna6udoUFbsLUePcMdk02Q6uRznXSo1D0nAG8AbDE1a5k9c2url/x4gw2K/ukNZ3OHUihxMT4APgEwM6uZNkX24m4o7uYx2bxp92l06N6gTmAwkJ7vOniWnyW+2heSrLg+G0AcEQMHEGjXQFQUGCP2wpL8blwQk0y4+w1uGOIk68PXJJG2wnAzW1/86XSLg0LWMDiM6RvzwMICvL3A+D1AIBQKOz83HwVOpuVLAiWzn4fpXgnGe0H8VCpqRMmuGjglnG8KqJLDaYsVyyQbTpBgPh4x8UaliCqiAOkQ0LvHPt3wjr0LcTi790f4ngOW1nZjGDo1D+X75EnnNqLQFwc3s1jp/R14JOdih187Eks8DpQhwCbXYwXa84/txL1UCqGmZZdIBZ81M5FgMVi7dLU3AEZdSpmmpS31BMWTDJWQ4DPFwgEREb7qdjIoqSksj0y2Svt3EgEgmGgSgMUHceLkvI2y2jXjdUCEZCiCUAdIzqIvMPm5i9yI0kQQE4m8XfsSCt0ubxy4/Nn2j//A+MkmUTG0vPzW6HL5TOmHq3bEEgCiUQCHSrGSc/PyopQIcDYLTdeqinAUJjTROakNyRmRUSEI6GzAq7QCww4MGEJDYlM6OG33hErWn4HKoCHhwEnDCYhkezDhkcfInbIJweS7+BhGIa6qiqTyUR9xPhRSIwhgeFgYqCnQY9FXSRSCATaiF6PeizqT0QiXV0kdBCYnpOTU6+6MK26GvXoclG5Lsx9AIsQWPOtbfv69vb2/rW1tfr6+oO8vb37wcyZuaqypafnrwADAIImCi/KO69rAAAAAElFTkSuQmCC","fav2015":"data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAADx8fEAPeD+OkDb/Mqmrpra9IlI//SJSP/0iEf/9IhH//SIR//0iEf/9IhH//SIR//0iEb/9IhG//SIRv/0iEb/9IdG//SHRv/0h0b/9IdG//SHRf/0h0X/9IdF//SGRP/0hkT/9IZE//SGQ//0hkP/8amB0fDw7a3x8fEm8fHxAD3g/jpD2fz3RN3//0HZ+/ymrpPw9IlI//SJSP/0iUj/9IlI//SJSP/0iEf/9IhH//SIR//0iEf/9IhG//SIRv/0iEb/9IhG//SHRv/0h0b/9IdG//SHRf/0h0X/9IdF//SGRP/0hkT/9IZE//Knfezt7Oz68fHx//Hx8e/x8fEmR9DKr0Xd//9F3f//Rd3//0La+/yrrI/69IlJ//SJSP/0iUj/9IlI//SJSP/0iUj/9IhH//SIR//0iEf/9IhH//SIRv/0iEb/9IhG//SIRv/0h0b/9IdG//SHRv/0h0X/9IdF//SGRP/uonf57e3s+vHx8f/x8fH/8fHx/+bm5qZeoRX1StPR30Xd//9F3f//Rd3//0La+/yurJH/9IlJ//SJSf/0iUn/9IlI//SJSP/0iUj/9IlI//SJSP/0iEf/9IhH//SIR//0iEb/9IhG//SIRv/0h0b/9IdG//SHRv/0h0X/86d6/+zr6/vx8fH/8fHx//Hx8f/o6Ojhzc3N+V+hGP9foRj/S9DK50bd//9G3f//Rt3//0Ta+v2urJH/9IlJ//SJSf/0iUn/9IlJ//SJSf/0iUj/9IlI//SJSP/0iEf/9IhH//SIR//0iEf/9IhG//SIRv/0h0b/9IdG//Ooe//s6+r88fHx//Hx8f/x8fH/5ubm7NLS0v/S0tL/X6EZ/1+hGf9foRn/SM7E7kbd//9G3f//Rt3//0fZ+f6urJH/9IpJ//SKSf/0iUn/9IlJ//SJSf/0iUn/9IlI//SJSP/0iUj/9IhH//SIR//0iEf/9IhG//SIRv/zqHv/6+no/fDw8P/w8PD/8PDw/+Hh4fTT09P/09PT/9LS0v9foRn/X6EZ/1+hGf9foRn/S8y/9Ebe//9G3v//Rt7//0fZ+f6urJH/9IpJ//SKSf/0ikn/9IlJ//SJSf/0iUn/9IlI//SJSP/0iUj/9IhH//SIR//0iEf/86h7/+vp6P7u7u7/7e3t/+3t7f/i4uL50dHR/9LS0v/T09P/09PT/2CiGv9gohr/YKIa/2CiGv9gohr/Tc6890be//9G3v//Rt7//0fa+v6vrZL/9IpJ//SKSf/0ikn/9IpJ//SJSf/0iUn/9IlJ//SJSP/0iUj/9IlI//OofP/s6uj+7u7u/+zs7P/q6ur/2tra/M/Pz//Q0ND/0dHR/9PT0//T09P/YKIa/2CiGv9gohr/YKIa/2CiGv9gohr/Tc25+0fe//9H3v//Rt7//0jd/P+vrZL/9IpK//SKSf/0ikn/9IpJ//SJSf/0iUn/9IlJ//SJSP/zqXz/8e/t/+7u7v/t7e3/6urq/9fX1/7Jycn/y8vL/83Nzf/Q0ND/0tLS/9PT0/9hohv/YaIb/2GiG/9hohv/YaIb/2GiG/9gohr/TMq3/kfe//9H3v//R97//0jd/P+vrZL/9IpK//SKSv/0ikn/9IpJ//SKSf/0iUn/86l9//Hv7v/w8PD/7u7u/+rq6v+sr9n/lprK/8XFxf/Gxsb/ysrK/87Ozv/R0dH/0tLS/2GiHP9hohz/YaIc/2GiG/9hohv/YaIb/2GiG/9hohv/Ts26/0fe//9H3v//R97//0nd/P+vrZL/9IpK//SKSv/0ikn/9IpJ//Opff/x7+7/8fHx/+/v7//s7Oz/29vb/3+E0P91fc//wMDA/8LCwv/Hx8f/y8vL/8/Pz//R0dH/YaIc/2GiHP9hohz/YaIc/2GiHP9hohz/YaIc/2GiG/9hohv/Ts26/0je//9H3v//R97//0nd/P+vrZL/9IpK//SKSv/zqX3/8u/u//Ly8v/x8fH/7u7u/93d3f/IyMj/Y2zS/1tk0/+8vLz/vr6+/8LCwv/Jycn/zc3N/9HR0f9iox3/YqMd/2KjHf9iox3/YaIc/2GiHP9hohz/YaIc/2GiHP9hohv/Ts26/0je//9I3v//R97//0nd/P+vrZL/9Kp+//Lv7v/y8vL/8fHx/+/v7//h4eH/ysrK/8DBxP9DT9j/P0za/7Kyuv+7u7v/wMDA/8bGxv/MzMz/0NDQ/2KjHf9iox3/YqMd/2KjHf9iox3/YqMd/2KjHf9hohz/YaIc/2GiHP9hohz/Ts26/0je//9I3v//R97//0nd/f+t6vX/8vLy//Ly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","fav2020":"data:image/x-icon;base64,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","mi":{"bookmark":"","close":"","directions":"","directions_bike":"","directions_bus":"","directions_car":"","directions_transit":"","directions_walk":"","help":"","history":"","language":"","layers":"","link":"","my_location":"","people":"","place":"","print":"","public":"","rate_review":"","satellite":"","settings":"","share":"","swap_vert":"","terrain":"","timeline":"","traffic":""},"gl2016":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAA8CAYAAADVEnAJAAAOvklEQVR42u1dCZBcRRluyM4Sbg9QuUTFYAhy7Zs3G2Nw5r2ZTWKMWBCXQ5QzIncEFIqjGGtnZpdwaEUOIYcFlBwVRBA5wh7hUIIQCFgkJCAWBUWSnZ3N9d7MXgk7/p/sZje72/3umR2rv6quDOyb1zXd3/v77+///37MD0STxapYY6FWT+ev0zP5h7W0sTqWyWdjGaNA/13UU0Yf/ZvT08bbWjr/GH2+Qc8YJyv3FUNMQmK8Qk8XIrGM+Qc9ld8CIjttn33PvC/elD+JSUiMFxAp64igL4GkvrW08TytADVMouIQfnRucazGKg11qe6v62nzryBkIC1l9NO/d0eT2f2YhCR4ia32T2MpMw8iBt20TP79eIN5HJOQBA8a9cuKE8h1uAfEK3EzY+n8TCYhCR4QoI5MJMv9pF1SxlLGTrLyK+nzQvreZfGUeYbWWDhFy5inU7uCFJS7Ymnjdbgidu6Ha/GAMQlJ8ADIXaWlzSdsqiHv6JnCL6Y3bfu8LV8+aX6JHoD59L1/Czadb8cbt3+RSUiCBwHId5YWNmN8AuucTBb3dPsQkfszDxr57vc23pLklgQPDES68yw3gqn8I7OSnQcw+xBb9LTxDO6LIJEktyR4sFJgyuiyUDluYsXiHsxHYBUgCfKXM5LbvsAkJMGDAEhL7sFyC+t9A5OQqESCQ5YTk9tcymC5JSQqjeAgLiQ+AcHXz0kW92ESEpVIcGQDihUTM84kJCqV4JAFBZvKFiYhUakER7SQ8rc38wgeb8zPYhWOjkTtpGxcvSQbDy+m1tauK6vQ8JnaEvytI64ezQJCT3P1pL7mqkt2tExY3NsSatvRGlqF9r/PzROW4G89LdWB9Z+4ZcuBlN58KgXvMhRge4hW5KeQm09y7+0UMZ47bUFu/3ITvKgooQ5N/V5WV69r19WlHbr6JM3LUzQvD3bo4Ztpvuren/XNvZhTaE0Fhe+eGBsrNVyOAcvGI+eAyDRIRTutPa6+SQN8Hr7ruf83WGhnS+icATIX7TQi+5u9raHz8F2fYho1tAI/SkG5XougXYGu/f30jHHwZ98z6xFNHtlQ0OI3wbNR9Ssd8fACGv+c9fyEt+DaDVHlIGYXlDNyNd89MRezCkQ2oUzPxpW1GBQ3LauF34U1YS7R11I1nci6FqR11ya829dW5bp/BMvIOD3gNMktlsp3YsUma38xJ4XiDb8IXkyyPTviylU0znmn8wOi5+Lq2fYseNpcwiV4On9ORVltxvYgl+P6dk39lDc4Dqx5Py2TN+Ke9sUotgeR+3qywp+CqF5ab3Oov6+16kbc0+mKrGWMj8VkFifNYd8VJMGz0Sn7tevhp73OEc317XhQmAj01L7M+7FY4iqJ3DRoC/HDfW26ejfubYfcRMyFIKfP7W67JEetK1KN/UhZDorgm+qO35es9t/9mh/MOeZHRPC1vB/kNS8kiEGmDfGdbAzA2uIHB9RuYhaAtQUhg2i0Klj2rzWYx9LYbMcYjVeCg4g0lo/5PT8QCRgPouWsPlmsHm8ER9kcG4FcXInBpRBbYuUt2p1fDLUEu3G03AxlclZXLidfcI2lu5IIRxkHpI7E4FJY+NVv0UNwMdSS/mfZXmg9y6sn0/+7nPz1NZbuSnMVt38E4UgdWWdhGDYTQW9DTS1yjqK3FA5PpIzptM/6DSkpG0pB8A49cqF476P20ib/PrruZLgxeCA2zjrx4Jwe/iEUFe53NbUHc/l/QXC4VLtZhfop1UTA9fyBU7rIus/DYIk3POqVGGD+UqiuG0tdKS5j1UTQ9QJydpFPPq9YFPdPVvpKuq5X8ICs46krRNpGYYJc2rwX2Z+iB4QegN8FSfCt0RM+l9WUzSIFC3IuE4B87rm8OYLkizmucBcFzVjFhoEUj/MFT3YhW6d8l9kEtFYRySE7shHobQudzyMlEbbQ93yV7f6JxHUikkN2ZCNwcjp/CG0MewRjdq13Rc07wbH558+TsjI3bZotLR6GSKCuJLxvMsvvovyTDQNcD94PJinpJ8wh4MYIBnDUBMP14BKyOeS4f7gxXCveEhrVP7kYacFY/dFpThK0bl8JPiQJfsix3FtziZMOtRUI0iP1NAcvCx6U50Z9EVp3UDJhMMdL5FvZAOB3Cfy5F/huiVifFQWHslrNUYPXwocWWO8XikV3/YuCQ91tex21e5Kc8RHvYCV7ZYSjVwRaJbv9JHhOq1UEKtWNTACQnyKZSZJ+N1htNiEPI3A0kuBXCXy3JaxMgFrCmbiHdi17evgyrvXWwqcwlyBLcBZ3IBPqz4dZ28u41rat2nX/O9tCZwl8+l39JxqMYwTW9jbmElrauN9PgtO4Xc0dz5k1h4yltkA4oKjlsva4ssOumgL5sTNRe8yocK5gkDahdrIsBE/lV3Aeuswwv24xZ2PZbZW3YBmI0JSdPF18mHqymEPCbqgkrjX9F9h+tALs5OnidsoL441d33FN8Ixxmq8E18L3c9yT9WwY4IfTnF4KVcsBqfOksNzbrtcezy0XQ4iWa8Ub87NZiYGDOXkBCy1lnjWM4G28HTnzCAyylZ+HZCleTgnzCJ50SMTf1T8edt4pYbMW9rt+wKJN3V/zkeCYpxWisdykqcfCcND/M+0SG6oWEfuKLQnlQGYFHKIpkOVWlCF9V+MXPG/b5YPCV+YQ/FnPBNfUFt6Of/Aa+MocC+65fyJyC8eC7+ofR91x3LgO5gGQh/0kOAwOL+eHiPqibVJjVdXVx3NaRIcb4+ikWPyA8ZIyi90/J0/io+Flc7SRfL3MBH+9PAQXGyYcX+31XBxfCa6pq71FK5V22m81dEYjh3soODZfEZD8g6Gc4WCBCBtP10VK5wiJsJWzm15dAhcFJGzlBGVWl8hFWcBLmPKyd0osKBzqJ8Fhpd0lvCkv0UbzDATz/DkWWXxcxJ9KUXQs0mGj6UJ4N99OVxbxQr4fT526N3MJbHY4m0y0O4dp4Is4JOztX8lc99//D7Y/d5PZEtrVP04U449V/kTmElixfd1k6uEHnGwa6fp72uM1xwVwbIT5tEVlfUPA5L5Q0PerbASQZCNIpZzLXAIBIkGu+PmD16EShx+UqXbdPwJEvPsicjp4HR54QZAuyVwCK2WQMiHPH0deUOesyAEsKGD3jOoOi0hiEx6GYI5oNnYKJuz7Y4RtjxaFf90GehCx5N1384zwEYPXInFKkCS10m2gBxFL3n37l088wl65obHRzUkIyFmh72/1VUWpU08UqCEbc3pEczVX0ahzN4xkwZ9Zp6yaT/l1ChV8RawM4mQh4znOQ8XdoaMhyYo5BHRYUSBhDF/5TUE0c56LaqBLBQ/NqP5xaq+PwR5Y79/6HqpHrr6mvMfL1OzUlYiLYNxs3JMs/zRmFzz5iSdF0eBe4GUzg+oT5JZY9LV1RqrrCD4h1XNF6ZftCTVuv9RNnUkD3ufE7aEEqHMFBO+lByDuYGM5kxSYPiduj9aw/VuiI6kRDGI2gcNUA0q2gh8+X+CifIC0WGYTIDU088HwPOo0P4xGJzo9+fVxm/khHyALDTkMzAYQgIil8z/AKmDjBNtPEWiyLi5W1opIjgy0Yn09t3gaf4OfKAoLw22B+zBWcTHqL0UkRyospdVy+8ff6Jqridw7RIlW6J/j3i21cCtTotRnuDp0j2sw3kERfMMcZR8a30944zswh0dbVW1hVUaketQ9oHrpNTUMsE3EjPkXh7na/6LBXITBQqIWjiRA5BEH4mO5pL83O3wVyoV2i4yH6jCFA3hlpx6ZgqcdDZ9hWRAVsyh46MPgiYqMreow8RCA6D2t1VMoFD8RDZ8pn2U+cr0tCh766P7c/lENj7QK8YprfohXPWpN+RPgmyNanGjYPglKDOatFAUPNM6nWigoPVCp2hORqZAGB0ndqU89jKz0BXBHxd8PZ/EgOTozhbOjDrRhs+lkaQWyeuTaoErWoNbYSHO9NqiSNag11tFoI4p3ko7nkjUAIXlbGjgMlqZ0QjZ0cP1stwrHmeRzG6UgN1QBaPKuKuq18B1+kxupmgywV3R8h+/kbq1KOvGhYRzGM8GhfJA1fsLPOcJGFRbe4+lIXV+lH/nnYAluLOdsKG2TPKer1wwFadw3+O65ePgi5gAgORHyGk6QhtNEvnvoIhcq2GxyObZ5Wz2N570TXLxvGsoE9dhQtaUrP/Y1EQoJWD4XMayDv+6Xvr4pVlOLSh8PVvvVrBY5gblE34qq2qFKH1ftVQrouO4/3tT9DRSGuKh33UZRzDm+H/wjDqjlPLiOrw3lf/sMRNEGihJyLi1FD97ihjexuX3PDyBURhLq6TQQrzhIwXyRdvo/GlIr3APKCEUkT9/RHHrFAbFfJCnQl/5hLKBWoSTRptV+kIh92EA++CVjX2eu9PvoNqS74uxBUkE2OTlij75zJsapJId3Qs8m1eTXyFdBUTB29FBLoM/iXDxo5tipg9CoIcQyWso3Gm/UTjpyoDj5LmQagvRo9PkZ7NpRTIydOgsI/W0Tj0SInaS+u5BpCNKjUT75M8gtQTFxf+vehwX5ahpYZZQnwrKTOvYaXseOyh2oKNFb87uVeUEF47mQowj+yGlvjNXcRCUR0STXJY1Tr2gz+g65iR+hlhPJc6juoTn81aa68LeZhIQX8I6QwAPBJCTGA6BzM5eAdZfvaJIYd0BwjqLKZyPzEq9gd5cbZBxErsiOsQguX68uURagSATheFTyDN84ujnXBke5ceo8+1D0wiQkSgmUG4LMHNXjP2TNv+xAAj6edyaKljb/xiQkyvEKGlJG3hFo2+/h/BR7D0q+XVCXO4dJSJQD5HfHrGIOJOHeEc0Yk6GPD88apXjGVBzwJA7xG6vkO1Ilyv2mvFvtvqaE/l1DhH8f7oidIFC8saAyCYlyAtaYk97ssZnzmYRESSE+sOdhHwl+M5OQGG+vZYfVJVmvy0Py2xa8SpBJSJQb4vMFzaXIBXJAbAMvh0Wwh0lIVAJAVgr4zBtwXdbgRVWovUTgBrIgop44Ag7pynW39e/LJCQkKgP/BTwUobIIDirVAAAAAElFTkSuQmCC","ddStart":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAtxJREFUeAGtlkO0ZFkQRb9t27ZtG5O2u79SrcKsbGtctm1jVrZtu2Y36sQ302etnby580XEk4GS+IM/wTywuJMFoBkEG2gQKzAWPDexMCa3cHsKyvWgoDwPcotwIFNLY8J3r8BkYKtKFghOWTqaUUZzJP20plhIjtYK2Yl6YiTHasVP64tFliSKrF0tWHwRRAwlCwEPfJKd6bct5UJxooEF1Hqopg/8GX/3x/YK4Z/pztJnIAb0iSU47ZPiQq0Ha4TkeN0A0UBxHUkO14qAbA+WXgF2vYWjrZzN6PetFd2yLGm0GtJaatpVKWw9rVg6vUvmCe5zX7iUrsXh5T68iFJ+DVMqleM3Bf/HEQ8RBLLwexNzI/plfYnAPw4QAqViydEa+mNbuTCzNuF1f7FwhmuYffsEsWBIoTKx9ESd8Ih14u/nsHARN1bG5SoV9iWmIaBP2SEl3sQuFi7WhzC0l3CWPkr2jGsveS4Lf2gfygbthtKGofBObmZjyuuaWOgNHmUrYkiu5W5TODKB174EIaA9Y6yczTH+Ct5KzXbs3VVdO/YM0B0bcMk/y50kh2r4hKBS1nakXSiCi7xYdgs4gT4J59KxgI9T0XZYqRCDqBcRVb4sewHiwKBJAu9Sfgvj3ijtW7Y8mmVfQC5Qmm8B1c3J5PPgwL6dqKNvF+cLYzMjFkqAWlnmFGhLTfurBXrVt9TjdcI3zY1lBw00SAB4myWN6lM6b3HVlDTBFYAsoFGm2XpYUdO+qu4B8RGBkzDLtgGN4wvel41Nbt8yyfHa9t4ZGhqysAxolRV84mAhl576exjLzgGt02iOY/R3HEFcrluEPQvH6yJ0AW9rZmXQb5vLhJGpEQszgU45ltkWSbWQ4vUTYK2rcA6fedL+imDhXqBzmjxinPh2hIUz9CEss3GzIDtvaxb+qQ9hkpGJEXUOpFQfwlAgAIF0fQjdwMdOYYg+hObgOngA7IHSfAXLiZ+EcHMKogAAAABJRU5ErkJggg==","ddEnd":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAABGdBTUEAAK/INwWK6QAAAttJREFUeAGklgOMLVkQht8b27aNtce2bdu2bQRrRxuuzThr27a9XfvXoMdX/Sff4NbpL7dOtc7JiDOoApvglj22QS1wBwpHD0yAr/U1NekyW2vK8nanbHCFnQ0ZaGkSat+BOWAIZMYVPGdroE9LEVfRp41lAg20CDTSTgz//XlTubARFUKOhgYsfhX4nCXzAJ/EujjSt21VAo11Eg22EvU1HWWwhbj2Y0ctpXm4svQrEHBcpguej3N1pL/6momGRNHZYM2/kGd4urH0DWAExIzZo82v22sEUaYI6ODHrnrBzcSIpUv7Mlvw8Wr0NdyKuHjs6kspzNHuVLgmSnHMdQmRxEMEriws0NPUoE+bK3jTxYV8IGqnwjVRiGO+RWemOtpcq2bh8sU2VuIAlBYyw20Uurt+nYU3p3q6Eo10qC4c7aBCPy9i144wDZOiUWnCIn9vUbh6ia3UltspzMmeaxssLORL7LOWShWH0kzfdYhDqWGhPfhsKzZMtdMG7d6cFM2yb4EH2Mm4A07sbztqBbF1RcCV8nN3g+BhYszCZSDGALyWjmn/ixuA2LoM0Crvu7A33feAGTgSb/BZga8nrtM2ov5m2UIMoibYj2XfgCBwai4CP01cczn2pvNsGfZ6MyaUZX+AECAzeecxySeKMvkeeFKGb/9KTZGgp6HBwkagUG4PsDSnP3obheOtszDRzZlljwOF4wJ+XIsOOXoFYd/uy01hGXMVUCqLrrjP/d7TIH5LvgnEujqx7B6gdBzBL3dlJPBe7lyar9UUkdr58yyMBSrlTr5xsJBbnwi5nGUvAZWTYaajQ9+31xC3e5mdNQunpAgtwI+PF6TTN23VpK2uzsIrgaQ8sxJ5DT1ekMGyL4C+VOF6RaAvzYVfycKHgeTUhDja8euIeEeRmlhnY0PyMjNhYRWQnIu01NX2BxIDJMcTCIDA5UByrMCvgIAHkBxt8Db4BPw/fkKKAcqj4hv5aDBTAAAAAElFTkSuQmCC","greenA":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAADMElEQVR4AWLACSboyANxMhBPAuIFQLwQyk4GyxEECIO4gLiRZZLuJyD9X2SW0U/hWUb/ofgnSAwo9xFI1wMxJyHDFFkn6V4DadIDtFYOsHI2URj+rm3btm2v/r+2bbuNa9s2gtq23aiK6zaq29PzXq85yZPMnXnPM7q7uzuf+lwU0/DrMjl6XxRREs8hY7U8+ana3fJEpPnSpPc+GzJ+92bRMC7WRC8WI8s177g2XFFmZ7Es6Qkf73fvCyy7JtOJXhdEhBqufcQO29ZC3Ad1PFPDQakSseIgcvKzVznX8XQ1jg9mNMn8eIW3uQeKqDevOOyqVI7+J2uJU+QZ5Ux1s7OU5nufF1HO/iKyZAdcEHZheKUaGsoBRbL6xVCsKIjKp6VSQJqHykwHroUDLggXeK3L+D70Ck+qAEf9b3k+9TtRSzaOVtRjf4XKHBxwQbjZbU0aDb0sVaJuVhY5+do3/x1bF0QpHcNVZl3ZAVezcAgPKhJW5Eu4u6y+MQB/Y5cqs62Fi3zWZ9CQSxI5uu8rJzyGP99bayAsm5KilIcDLgi7MtThRLVcILlDGHakVFgwIgG7lhtrz7VwwAVhAD/555x9RTTkoqSJhp1MTkFfju57G3beYWNx8xhq+SP7BS4BzXp58hys0ONMHQ3mAEQQoq8K7DymLojQRw1q4Wj9SXG0Wpb8OnZbLg2+INEL1KAWDsXPcwy2XS89L9EJZHFdqFX3jZPOgZ+JO/Jo0HmxRpBBFjWCpua4MqVv/ffhznwadE6sEswhU5/VpTmtSj3lsy5DrRBz7mvSrunzMxDK9/krcTsf/axYDozxI/xBRtCn8Q52u6xOpYEsaQ3G/NZnHBP0bksSg/jS/0RvzaWBZ1jGoM9jf8M2ZScIhjTPNel3Azdk0sDTIkDo+6/PfCEY2oI2ZI3Faw5gGUA/aXvecoOFLPC0Xpb8d8ApEQHuU/G+4jTBmOaxJv1L3p4iAl5r078Jxja+txvhm7IJ8GM8M1oYtTlnc8jGLAKJ2/IOGS2M3Zo7nl+bQBz3jRbyrvAzSyBzV8EAo4UsimoS8n2mm0LozVAjXqYQ2pixDHDfWlv8H4JiKPd9OJuJAAAAAElFTkSuQmCC","greenB":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAADGUlEQVR4Aa2VA4wsWRSG69m27dd297Ntc2zPBGvbY9szwdq2vdEqXts6+/+Vrkr1WDf5UjcHX100lE7H3WsXgEiQDSpBFedqjLkeDopGg2uGZpt+wlOmFtv/nFJslyB/Mobcj3heBUZ1J1s0LNv0EZvMDX4Jf3avJL18IISwZ/eICTnWDMsxf9jpapFYOvge09czSh3/hEGUiOauuAgxa9HzFXoXt5WNGpJt+gDb+yfsGcheOtAjLj6zR9iD3vfgGGkUXgXkxBM7Ubhf5VCuX5AJYdys0bL1MivzOice38Htkys02Sy84Utv63oJwxsTX9xPNCGfOu7IFVpMrwt7eo94Wtbzor6ki8LTAG/aKQko0DgYFBpjZI5tirggNsaOo5cOuii8fVqx44+EF5A0cDAnKDTEIh/ZpW57902ukDihgy4KKyYV2iTheSQMHMxWhVyRzoixw2TR+pnMt2MiHHTpwngEjWhCV8QKnZW756mxzZda29UbhXfOKHFI/HP7Qjh4j4/N7eKB5DVcabs4HXRReAbI8Ud29Ei46wZnu/gx9NJBF4VzcOXfe5rXS/yz+3Q0IZ8au653ytSl47n1kFr24iv7A10Kx/Ac8818w/kndkscCsiBoNAIt7oCsvAHd+p17GEvHcZvythh2ebPV1Z7Je6Zfb2CPeylo+33eQWXrUqf3tcjWMvjYm9nvzh2FPy1ttYnsU/v7RLWsJY9SldjbJ4lAkVirvNL7FN7O4Q51qi1PRnj8q2PzSh2dCpkbnKh7aXe/A0sxHn+vbYGW39ybwiM4RL+ZY3Sm4EVNEwosEoMJEYYm1XieKinHuMq5+HQ/11e5ZWYJyADnCP236Jy9xqlL2Nqof3NuaVOiXl8jwrns0ucnyh9HfNKXRm8zWjICOemGl9On4UQTB2ebf4v+jEIAeayoXmDTenPmFJo/8HXuF7ItCL770p/B87tlcXlbiG4jI/6LVxW4alYUOYSsrbad1+/hSurvFm4bSGrMO+3EKtS/2aJsz4Q3W8hRMs0Ic7TPhDC6ZoQTBsI4YhBkBHMh3dX/j/NiBidxCfDOAAAAABJRU5ErkJggg==","ddVia":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAbklEQVR4AZWRxxGAIBREOdkFZ8qiQvqwHrMnXJ45687Az9lskOl5vVyvhyKj38HqlXrx/NDbbUYcnXMxhBDruoZK3gZQwc+OF9gE4EdvZLoAepzxG4eh9AXQ44zfj8y/ev61jc97VhHz6YLJMb0BCR3NHHabnbcAAAAASUVORK5CYII=","bluedot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADBklEQVR4nLWVTU8bVxSGn2vPmCbIBgNOIwKLpioC2hRQK6tRPpbZIbGIhJR1l/lJ+QPsUDZddUerCiFVLapAQVTUgPmwje2xPeOZ8czNYs4VE8eqVLUd6V3MvaPn3HvOe84oRjyZba2AUQLQw4o3lB5mqPSLADMiK6WsrAHEQAQMUoqBOB1ADUGzAsoBn6SUk3UEFAD9lAJZjwxcDUFzwBgwDhSAvOiu7CEQF+iIHKAH+LIXxRtKm1OYq48JsAiURFPAhOwhgDZwA9QkYFYCxJL3yErlNScnLQKzwDx9f0lf18u6drVI86qA14KsdtS92UP1+Ze7FEsHgC0BI6PMto5VZltn5DR5YAZ4ADzUrfZTfVzZXJ57ZOdnoeND8xTcdy280x8Iov1QvXi1pT77agf4EzgH6pIePyN5tqRIeaCE6y7pg4PNJ2uP7Pvr0FiB83m4mIJ2cZIg/zV05mz99s0mjYslSVleGBagRoGn9FmlvDD9nZ1dhso4VPPQHpOEqXaS4uwDaBdsvf9zWeowEmwcMQ5M6LPjxTuTUHGg2gS3DlxLuXrnibNUDP40+ui3RSmucU4WUJaAjStsYIzGWaHrQuMvgfYlg9Uj8FwIfBgE4Ftwc1WQGhmvZwz448dzcKrQceVT7xJ6DnS7iXo98DwIAojjkQhLfBcn9yMEfHK24578VGRiGnKDxEV+PwF2uom6LkQOTJYcbpvDtLc24Eg2eoCj5h4eBnu/PKb/DeQUqAgGYQLuudDqJtexa6gvnh0m1cQVRpQGDyRqF2iohbW9cO/Hb7mybOz55NsohH4fep7k6BI+7Ydq5dmulLUj1RgAOpMCeyRtWePe/B9q/fstckchzh7UKnBZh1oTOtdgn8BcK1QvX29Rmj0gae0PwEpa2gLukMyJGUxL1y+W9O87Zf3u10VurgtoDZMlRy2sHqrV57sCPQWqJF3nyAEHZrplxWoG/k+GUA1opqBhvKEiYzfjCl8+MMV0SFpjnNth83dj07jifx70Q/D/9tc0IsC/+pm+Bz0JiTMMwUQLAAAAAElFTkSuQmCC","kit":{"more":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE4IDEyIj48ZGVmcz48L2RlZnM+PGc+PHBhdGggZD0iTTAgMGgxOHYyaC0xOHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzYxNjE2MSIvPjxwYXRoIGQ9Ik0wIDVoMTh2MmgtMTh6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2MTYxNjEiLz48cGF0aCBkPSJNMCAxMGgxOHYyaC0xOHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzYxNjE2MSIvPjwvZz48L3N2Zz4=","search":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48L2RlZnM+PGc+PHBhdGggZD0iTTEyLjUwMCAxMS4wMDAgTDExLjcxMCAxMS4wMDAgTDExLjQzMCAxMC43MzAgQzEyLjQxMCA5LjU5MCAxMy4wMDAgOC4xMTAgMTMuMDAwIDYuNTAwIEMxMy4wMDAgMi45MTAgMTAuMDkwIDAuMDAwIDYuNTAwIDAuMDAwIEMyLjkxMCAwLjAwMCAwLjAwMCAyLjkxMCAwLjAwMCA2LjUwMCBDMC4wMDAgMTAuMDkwIDIuOTEwIDEzLjAwMCA2LjUwMCAxMy4wMDAgQzguMTEwIDEzLjAwMCA5LjU5MCAxMi40MTAgMTAuNzMwIDExLjQzMCBMMTEuMDAwIDExLjcxMCBMMTEuMDAwIDEyLjUwMCBMMTYuMDAwIDE3LjQ5MCBMMTcuNDkwIDE2LjAwMCBMMTIuNTAwIDExLjAwMCBMMTIuNTAwIDExLjAwMCBaIE02LjUwMCAxMS4wMDAgQzQuMDEwIDExLjAwMCAyLjAwMCA4Ljk5MCAyLjAwMCA2LjUwMCBDMi4wMDAgNC4wMTAgNC4wMTAgMi4wMDAgNi41MDAgMi4wMDAgQzguOTkwIDIuMDAwIDExLjAwMCA0LjAxMCAxMS4wMDAgNi41MDAgQzExLjAwMCA4Ljk5MCA4Ljk5MCAxMS4wMDAgNi41MDAgMTEuMDAwIEw2LjUwMCAxMS4wMDAgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjYjJiMmIyIi8+PC9nPjwvc3ZnPg==","dir":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZGVmcz48L2RlZnM+PGc+PGc+PHBhdGggZD0iTTIxLjcxMCAxMS4yOTAgTDEyLjcxMCAyLjI5MCBDMTIuMzIwIDEuOTAwIDExLjY5MCAxLjkwMCAxMS4zMDAgMi4yOTAgTDIuMzAwIDExLjI5MCBDMS45MTAgMTEuNjgwIDEuOTEwIDEyLjMxMCAyLjMwMCAxMi43MDAgTDExLjMwMCAyMS43MDAgQzExLjY5MCAyMi4wOTAgMTIuMzIwIDIyLjA5MCAxMi43MTAgMjEuNzAwIEwyMS43MTAgMTIuNzAwIEMyMi4xMDAgMTIuMzIwIDIyLjEwMCAxMS42OTAgMjEuNzEwIDExLjI5MCBMMjEuNzEwIDExLjI5MCBaIE0xNC4wMDAgMTQuNTAwIEwxNC4wMDAgMTIuMDAwIEwxMC4wMDAgMTIuMDAwIEwxMC4wMDAgMTUuMDAwIEw4LjAwMCAxNS4wMDAgTDguMDAwIDExLjAwMCBDOC4wMDAgMTAuNDUwIDguNDUwIDEwLjAwMCA5LjAwMCAxMC4wMDAgTDE0LjAwMCAxMC4wMDAgTDE0LjAwMCA3LjUwMCBMMTcuNTAwIDExLjAwMCBMMTQuMDAwIDE0LjUwMCBMMTQuMDAwIDE0LjUwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2NzlkZjYiLz48cGF0aCBkPSJNMC4wMDAgMC4wMDAgTDI0LjAwMCAwLjAwMCBMMjQuMDAwIDI0LjAwMCBMMC4wMDAgMjQuMDAwIEwwLjAwMCAwLjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9Im5vbmUiLz48L2c+PC9nPjwvc3ZnPg==","place":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDEyIDE3Ij48ZGVmcz48L2RlZnM+PGc+PHBhdGggZD0iTTYuMDAwIDAuMDAwIEMyLjY4MyAwLjAwMCAwLjAwMCAyLjY2MCAwLjAwMCA1Ljk1MCBDMC4wMDAgMTAuNDEzIDYuMDAwIDE3LjAwMCA2LjAwMCAxNy4wMDAgQzYuMDAwIDE3LjAwMCAxMi4wMDAgMTAuNDEzIDEyLjAwMCA1Ljk1MCBDMTIuMDAwIDIuNjYwIDkuMzE3IDAuMDAwIDYuMDAwIDAuMDAwIEw2LjAwMCAwLjAwMCBaIE02LjAwMCA4LjAwMCBDNC44OTYgOC4wMDAgNC4wMDAgNy4xMDQgNC4wMDAgNi4wMDAgQzQuMDAwIDQuODk2IDQuODk2IDQuMDAwIDYuMDAwIDQuMDAwIEM3LjEwNCA0LjAwMCA4LjAwMCA0Ljg5NiA4LjAwMCA2LjAwMCBDOC4wMDAgNy4xMDQgNy4xMDQgOC4wMDAgNi4wMDAgOC4wMDAgTDYuMDAwIDguMDAwIFoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI2IyYjJiMiIvPjwvZz48L3N2Zz4=","zoom":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MSIgaGVpZ2h0PSI2OSIgdmlld0JveD0iMCAwIDQxIDY5Ij48ZGVmcz48ZmlsdGVyIGlkPSJmMSIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+PGZlRHJvcFNoYWRvdyBkeD0iMCIgZHk9IjEiIHN0ZERldmlhdGlvbj0iMiIgZmxvb2QtY29sb3I9IiMwMDAwMDAiIGZsb29kLW9wYWNpdHk9IjAuMyIvPjwvZmlsdGVyPjwvZGVmcz48Zz48cGF0aCBkPSJNOCA2IGgyNSBhMiAyIDAgMCAxIDIgMiB2NTMgYTIgMiAwIDAgMSAtMiAyIGgtMjUgYTIgMiAwIDAgMSAtMiAtMiB2LTUzIGEyIDIgMCAwIDEgMiAtMiB6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNmZmZmZmYiIGZpbHRlcj0idXJsKCNmMSkiLz48cGF0aCBkPSJNMTUgNDdoMTF2M2gtMTF6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2NjY2NjYiLz48Zz48cGF0aCBkPSJNMTUgMTloMTF2M2gtMTF6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2NjY2NjYiLz48cGF0aCBkPSJNMTkgMTVoM3YxMWgtM3oiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzY2NjY2NiIvPjwvZz48cGF0aCBkPSJNMTEuNTAwIDM0LjUwMCBMMjkuNTAwIDM0LjUwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJub25lIiBzdHJva2U9IiNlNmU2ZTYiIHN0cm9rZS13aWR0aD0iMSIvPjwvZz48L3N2Zz4=","loc":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MSIgaGVpZ2h0PSI0MSIgdmlld0JveD0iMCAwIDQxIDQxIj48ZGVmcz48ZmlsdGVyIGlkPSJmMiIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+PGZlRHJvcFNoYWRvdyBkeD0iMCIgZHk9IjEiIHN0ZERldmlhdGlvbj0iMiIgZmxvb2QtY29sb3I9IiMwMDAwMDAiIGZsb29kLW9wYWNpdHk9IjAuMyIvPjwvZmlsdGVyPjwvZGVmcz48Zz48cGF0aCBkPSJNOCA2IGgyNSBhMiAyIDAgMCAxIDIgMiB2MjUgYTIgMiAwIDAgMSAtMiAyIGgtMjUgYTIgMiAwIDAgMSAtMiAtMiB2LTI1IGEyIDIgMCAwIDEgMiAtMiB6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNmZmZmZmYiIGZpbHRlcj0idXJsKCNmMikiLz48Zz48Zz48cGF0aCBkPSJNMjEuMDAwIDI3LjAwMCBDMjQuMzE0IDI3LjAwMCAyNy4wMDAgMjQuMzE0IDI3LjAwMCAyMS4wMDAgQzI3LjAwMCAxNy42ODYgMjQuMzE0IDE1LjAwMCAyMS4wMDAgMTUuMDAwIEMxNy42ODYgMTUuMDAwIDE1LjAwMCAxNy42ODYgMTUuMDAwIDIxLjAwMCBDMTUuMDAwIDI0LjMxNCAxNy42ODYgMjcuMDAwIDIxLjAwMCAyNy4wMDAgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJub25lIiBzdHJva2U9IiNkMWQxZDEiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik0yMS4wMDAgMjUuMDAwIEMyMy4yMDkgMjUuMDAwIDI1LjAwMCAyMy4yMDkgMjUuMDAwIDIxLjAwMCBDMjUuMDAwIDE4Ljc5MSAyMy4yMDkgMTcuMDAwIDIxLjAwMCAxNy4wMDAgQzE4Ljc5MSAxNy4wMDAgMTcuMDAwIDE4Ljc5MSAxNy4wMDAgMjEuMDAwIEMxNy4wMDAgMjMuMjA5IDE4Ljc5MSAyNS4wMDAgMjEuMDAwIDI1LjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2NjY2NjYiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTIwIDEzaDJ2MmgtMnoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI2QxZDFkMSIvPjxwYXRoIGQ9Ik0yMCAyN2gydjJoLTJ6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNkMWQxZDEiLz48cGF0aCBkPSJNMjcgMjBoMnYyaC0yeiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjZDFkMWQxIi8+PHBhdGggZD0iTTEzIDIwaDJ2MmgtMnoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI2QxZDFkMSIvPjwvZz48L2c+PC9nPjwvc3ZnPg==","peg":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDEwIDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImczIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUuMDAxNzEiIHkxPSItNS42ODI5NSIgeDI9IjUuMDAxNzEiIHkyPSIxOCI+PHN0b3Agb2Zmc2V0PSIwLjI0NjQ1MiIgc3RvcC1jb2xvcj0iI2ZmYmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZkNTAwIiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNSIgeTE9IjYiIHgyPSI1IiB5Mj0iOSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2Y4NDFiIiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlMzcxMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxnPjxwYXRoIGQ9Ik00LjM0MCAxOC4wMDAgTDQuMzQwIDEzLjA0NyBMNS43NTggMTMuMDQ3IEw1Ljc1OCAxOC4wMDAgTDcuMDAwIDE4LjAwMCBMNy4xMTMgOS41OTMgQzcuMTEzIDkuNTkzIDkuMjExIDEzLjQ0MyA5LjIxMSAxMy40NDMgQzkuMjExIDEzLjQ0MyAxMC4wMzcgMTMuMDQyIDkuOTk3IDEyLjkxNyBDOC45MzUgOS41OTMgNy43ODMgNi4wNDIgNy43ODMgNi4wNDIgTDUuMDAyIDYuMDUwIEwyLjIyMSA2LjA0MiBDMi4yMjEgNi4wNDIgMS4wNjggOS41OTMgMC4wMDcgMTIuOTE3IEMtMC4wMzMgMTMuMDQyIDAuNzkzIDEzLjQ0MyAwLjc5MyAxMy40NDMgQzAuNzkzIDEzLjQ0MyAyLjg5MCA5LjU5MyAyLjg5MCA5LjU5MyBMMy4wMDMgMTguMDAwIEw0LjM0MCAxOC4wMDAgWiBNNS4wMDAgNi4wMDAgQzYuNjU3IDYuMDAwIDguMDAwIDQuNjU3IDguMDAwIDMuMDAwIEM4LjAwMCAxLjM0MyA2LjY1NyAwLjAwMCA1LjAwMCAwLjAwMCBDMy4zNDMgMC4wMDAgMi4wMDAgMS4zNDMgMi4wMDAgMy4wMDAgQzIuMDAwIDQuNjU3IDMuMzQzIDYuMDAwIDUuMDAwIDYuMDAwIFoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNnMykiIHN0cm9rZT0iIzRkMzkwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMC41NSIvPjxwYXRoIGQ9Ik0zLjAzMCA2LjAxNCBDMy4wMzAgNi4wMTQgNC4wMzEgOC45NTEgNS4wMTkgOC45NDUgQzYuMDA4IDguOTM5IDYuOTc3IDUuOTkwIDYuOTc3IDUuOTkwIEwzLjAzMCA2LjAxNCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjZzQpIi8+PC9nPjwvc3ZnPg==","apps":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48ZGVmcz48L2RlZnM+PGc+PHBhdGggZD0iTTAgMGg0djRoLTR6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0ODU4NzMiLz48cGF0aCBkPSJNMCA2aDR2NGgtNHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzQ4NTg3MyIvPjxwYXRoIGQ9Ik0wIDEyaDR2NGgtNHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzQ4NTg3MyIvPjxwYXRoIGQ9Ik02IDBoNHY0aC00eiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNDg1ODczIi8+PHBhdGggZD0iTTYgNmg0djRoLTR6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0ODU4NzMiLz48cGF0aCBkPSJNNiAxMmg0djRoLTR6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0ODU4NzMiLz48cGF0aCBkPSJNMTIgMGg0djRoLTR6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0ODU4NzMiLz48cGF0aCBkPSJNMTIgNmg0djRoLTR6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM0ODU4NzMiLz48cGF0aCBkPSJNMTIgMTJoNHY0aC00eiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNDg1ODczIi8+PC9nPjwvc3ZnPg==","pin":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDIyIDQwIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9Imc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjExIiB5MT0iMCIgeDI9IjExIiB5Mj0iNDAiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZiNzQ2NyIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjM0NDNiIiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Zz48cGF0aCBkPSJNMTAuMjUzIDQwLjAwMCBMMTAuMjUzIDM4LjA0OSBDOS45MDggMzUuNjc0IDkuMjY0IDMxLjkyOCA4LjMxNyAyOS4xNTggQzcuMTEzIDI1LjY0MCAzLjQzMCAxOS42MDMgMi4wMzQgMTcuMzc0IEMwLjc1MyAxNS41NzYgMC4wMDAgMTMuMzc2IDAuMDAwIDExLjAwMCBDMC4wMDAgNC45MjUgNC45MjUgMC4wMDAgMTEuMDAwIDAuMDAwIEMxNy4wNzUgMC4wMDAgMjIuMDAwIDQuOTI1IDIyLjAwMCAxMS4wMDAgQzIyLjAwMCAxMy4zNzggMjEuMjQ1IDE1LjU4MCAxOS45NjIgMTcuMzgwIEwxOS45NjIgMTcuMzgwIEMxOC41MjIgMTkuNjU5IDE0LjgyOSAyNS42NjUgMTMuNjM0IDI5LjE1OCBDMTIuNjg2IDMxLjkyOCAxMi4wNDIgMzUuNjc0IDExLjY5NyAzOC4wNDkgTDExLjY5NyA0MC4wMDAgTDEwLjI1MyA0MC4wMDAgTDEwLjI1MyA0MC4wMDAgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJ1cmwoI2c1KSIgc3Ryb2tlPSIjYjczODMwIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNMTEuMDAwIDE2LjAwMCBDMTMuMjA5IDE2LjAwMCAxNS4wMDAgMTQuMjA5IDE1LjAwMCAxMi4wMDAgQzE1LjAwMCA5Ljc5MSAxMy4yMDkgOC4wMDAgMTEuMDAwIDguMDAwIEM4Ljc5MSA4LjAwMCA3LjAwMCA5Ljc5MSA3LjAwMCAxMi4wMDAgQzcuMDAwIDE0LjIwOSA4Ljc5MSAxNi4wMDAgMTEuMDAwIDE2LjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM1YzE0MTAiLz48L2c+PC9zdmc+","pointer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMSIgaGVpZ2h0PSIyMSIgdmlld0JveD0iMCAwIDIxIDIxIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9Imc2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjYuMDYwNDciIHkxPSI0Ljk4ODgxIiB4Mj0iMTQuNjQxNSIgeTI9IjE2LjU4MzMiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ExYTFhMSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjk2OTY5IiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Zz48cGF0aCBkPSJNMTAuNTAwIDIxLjAwMCBDMTYuMjk5IDIxLjAwMCAyMS4wMDAgMTYuMjk5IDIxLjAwMCAxMC41MDAgQzIxLjAwMCA0LjcwMSAxNi4yOTkgMC4wMDAgMTAuNTAwIDAuMDAwIEM0LjcwMSAwLjAwMCAwLjAwMCA0LjcwMSAwLjAwMCAxMC41MDAgQzAuMDAwIDE2LjI5OSA0LjcwMSAyMS4wMDAgMTAuNTAwIDIxLjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzNmNDU1MSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMC4yIi8+PHBhdGggZD0iTTEwLjUwMCAxOC4wMDAgQzE0LjY0MiAxOC4wMDAgMTguMDAwIDE0LjY0MiAxOC4wMDAgMTAuNTAwIEMxOC4wMDAgNi4zNTggMTQuNjQyIDMuMDAwIDEwLjUwMCAzLjAwMCBDNi4zNTggMy4wMDAgMy4wMDAgNi4zNTggMy4wMDAgMTAuNTAwIEMzLjAwMCAxNC42NDIgNi4zNTggMTguMDAwIDEwLjUwMCAxOC4wMDAgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJ1cmwoI2c2KSIvPjxnPjxnPjxwYXRoIGQ9Ik00LjAwMCA0LjAwMCBMMTguMDAwIDQuMDAwIEwxOC4wMDAgMTguMDAwIEw0LjAwMCAxOC4wMDAgTDQuMDAwIDQuMDAwIFoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0ibm9uZSIvPjwvZz48L2c+PGc+PGc+PHBhdGggZD0iTTEwLjUwMCA1LjAwMCBDOC41NjUgNS4wMDAgNy4wMDAgNi43MjEgNy4wMDAgOC44NTAgQzcuMDAwIDExLjczOCAxMC41MDAgMTYuMDAwIDEwLjUwMCAxNi4wMDAgQzEwLjUwMCAxNi4wMDAgMTQuMDAwIDExLjczOCAxNC4wMDAgOC44NTAgQzE0LjAwMCA2LjcyMSAxMi40MzUgNS4wMDAgMTAuNTAwIDUuMDAwIEwxMC41MDAgNS4wMDAgWiBNMTAuNTAwIDEwLjAwMCBDOS42NzIgMTAuMDAwIDkuMDAwIDkuMzI4IDkuMDAwIDguNTAwIEM5LjAwMCA3LjY3MiA5LjY3MiA3LjAwMCAxMC41MDAgNy4wMDAgQzExLjMyOCA3LjAwMCAxMi4wMDAgNy42NzIgMTIuMDAwIDguNTAwIEMxMi4wMDAgOS4zMjggMTEuMzI4IDEwLjAwMCAxMC41MDAgMTAuMDAwIEwxMC41MDAgMTAuMDAwIFoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI2ZmZmZmZiIvPjwvZz48L2c+PC9nPjwvc3ZnPg==","dir34":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgdmlld0JveD0iMCAwIDM0IDM0Ij48ZGVmcz48L2RlZnM+PGc+PGc+PHBhdGggZD0iTTMwLjc1NiAxNS45OTQgTDE4LjAwNiAzLjI0NCBDMTcuNDUzIDIuNjkyIDE2LjU2MSAyLjY5MiAxNi4wMDggMy4yNDQgTDMuMjU4IDE1Ljk5NCBDMi43MDYgMTYuNTQ3IDIuNzA2IDE3LjQzOSAzLjI1OCAxNy45OTIgTDE2LjAwOCAzMC43NDIgQzE2LjU2MSAzMS4yOTQgMTcuNDUzIDMxLjI5NCAxOC4wMDYgMzAuNzQyIEwzMC43NTYgMTcuOTkyIEMzMS4zMDggMTcuNDUzIDMxLjMwOCAxNi41NjEgMzAuNzU2IDE1Ljk5NCBMMzAuNzU2IDE1Ljk5NCBaIE0xOS44MzMgMjAuNTQyIEwxOS44MzMgMTcuMDAwIEwxNC4xNjcgMTcuMDAwIEwxNC4xNjcgMjEuMjUwIEwxMS4zMzMgMjEuMjUwIEwxMS4zMzMgMTUuNTgzIEMxMS4zMzMgMTQuODA0IDExLjk3MSAxNC4xNjcgMTIuNzUwIDE0LjE2NyBMMTkuODMzIDE0LjE2NyBMMTkuODMzIDEwLjYyNSBMMjQuNzkyIDE1LjU4MyBMMTkuODMzIDIwLjU0MiBMMTkuODMzIDIwLjU0MiBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM2NzlkZjYiLz48cGF0aCBkPSJNMC4wMDAgMC4wMDAgTDM0LjAwMCAwLjAwMCBMMzQuMDAwIDM0LjAwMCBMMC4wMDAgMzQuMDAwIEwwLjAwMCAwLjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9Im5vbmUiLz48L2c+PC9nPjwvc3ZnPg==","close":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDEwIDEwIj48ZGVmcz48L2RlZnM+PGc+PHBhdGggZD0iTTAuMDk3IDAuMTcyIEw5LjA2OSA5LjE0NCIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJub25lIiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQuNTgyNzkgNC42NTc5KSBzY2FsZSgtMSAxKSB0cmFuc2xhdGUoLTQuNTgyNzkgLTQuNjU3OSkiPjxwYXRoIGQ9Ik0wLjA5NyAwLjE3MiBMOS4wNjkgOS4xNDQiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjY2NjY2NjIiBzdHJva2Utd2lkdGg9IjIiLz48L2c+PC9nPjwvc3ZnPg==","imagery":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNTYiIGhlaWdodD0iNDEiIHZpZXdCb3g9IjAgMCAxNTYgNDEiPjxkZWZzPjxmaWx0ZXIgaWQ9ImY3IiB4PSItNTAlIiB5PSItNTAlIiB3aWR0aD0iMjAwJSIgaGVpZ2h0PSIyMDAlIj48ZmVEcm9wU2hhZG93IGR4PSIwIiBkeT0iMSIgc3RkRGV2aWF0aW9uPSIyIiBmbG9vZC1jb2xvcj0iIzAwMDAwMCIgZmxvb2Qtb3BhY2l0eT0iMC4zIi8+PC9maWx0ZXI+PGxpbmVhckdyYWRpZW50IGlkPSJnOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMi4wMDE3IiB5MT0iNi4zMTcwNSIgeDI9IjIyLjAwMTciIHkyPSIzMCI+PHN0b3Agb2Zmc2V0PSIwLjI0NjQ1MiIgc3RvcC1jb2xvcj0iI2ZmYmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZkNTAwIiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjIiIHkxPSIxOCIgeDI9IjIyIiB5Mj0iMjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2NmODQxYiIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTM3MTAwIiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Zz48cGF0aCBkPSJNOCA2IGgxNDAgYTIgMiAwIDAgMSAyIDIgdjI1IGEyIDIgMCAwIDEgLTIgMiBoLTE0MCBhMiAyIDAgMCAxIC0yIC0yIHYtMjUgYTIgMiAwIDAgMSAyIC0yIHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2Y3KSIvPjxnPjxwYXRoIGQ9Ik0xMzAuNzM2IDE5LjkzNiBMMTM0LjY0MSAxNi4wMjIgTDEzOC42NTggMTkuOTA5IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY2NjY2NiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHBhdGggZD0iTTEzMC43MzYgMjUuOTM2IEwxMzQuNjQxIDIyLjAyMiBMMTM4LjY1OCAyNS45MDkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjY2NjY2IiBzdHJva2Utd2lkdGg9IjIiLz48L2c+PGc+PGltYWdlIHg9IjQ1IiB5PSIxMyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE1IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNRQUFBQWVDQVlBQUFCRTRieFRBQUFBQVhOU1IwSUFyczRjNlFBQUJ2eEpSRUZVV0FsdGw5bVNGRVVVaGs5VlpYVlBMekNBSWpkZStmQStpdy9nbFZlR1lhaEJBRHJBT04yMStuLy95UnFHQ0pPcFhNNzZueVdyaStiSFg2WTFOSmhhTmhyc0c2OXJMTnF4YnpSdGRCMDFkQkt4eWNVOERrZ3YwRkxvY2VXNDJjRE9VMnZidVpGQUFZU1ZOd3NyN0NaYUEyalNrV2JrVml4cUxIcGF5WEJhTmJIQ21pc3RkVVhVc0gxTWFqTnIyV1FiS2JKSDN3SElBT2V5NjFJSXo0YUNaZjBaZ0FRc3BjbFlFR0JVUGdZZ2JlUlpHL1prelVETjBDU0VwcU9nOFg5N1dEeUZxZE5raDVwYVpjajdLZ0RmZHBHcHRHMURKbURDNXlGUzd6VmhBMkNVM0ZrUUp3dUtERkxiRUY5SFU2UlRPR0FJSjQzTDVXMm1HcG9lQm91ZDFJTlZiQ1dOd1RkQXJlWnRlbHJSQTB4VjFYbHJCWk1NaURaQXp4bXlYVTJzMURtenBHeHBUNVRZd3BuM09vSWJKeGpCelpJUXFrc0VObm9LYjVscFVmSlFUMkt2bmhJeEYwaUFRSVJQQm1zK0tUckxNODBMYmRZTUlGcHYxYWFsRHRBeWZLMHFoR2sxVTJJVDBCTzNFcmVCWEcwblpWcmJTZDhDbExYbENFSU0xTW9aT0hDSWNKRXpuT3JQTXA2OXovTXFwUXlERmtod1gyV2hxbGxHUWJEeUFOcVZxUHpTaTVsMmNWcXZkNGFXS3RVTE1tMmpXQ3JheExYcEVvNEVONERZMUg0N3NtRy9tYlhKYXJjdXdMR1FtdnBMWkc3cWRZblczVm12ZW8zbVVRTy9zcjQxSVJuRG1jUWVCMXYzbHhpbVEyQ3ZoVE9yWFVDMmNxNjBRcUVoM1JlNmFvdit0U2hxM3lnYk5tWkRDYzZ5c21Zak5tcy9NdnNsZXBPbHN6bkVPVFRPdkY2K29sZmVKb05EWjhoR1JBVVlUQXJoWXFodkVxYm9OS3dpQUF4U2VwOFN0Tjh4N0t4cnkxOUFFaEJ5WWpxNERReWtiVlFWSDBtR0xsbjJqVytMeVdrY0kzWlVvMDJBSXRXMCtTd2hRREUyUG14anQ1eXgyQlNsZmVxOEtubkpFTkpXNGMxb1FVMG81V0FEbFpVcnpzVVVSVTdVK3BVdVBycWlQVGFyREZqckVVdzE2QnVLcFF3V21hM0hMS0dKL2tIQ0dYSWR6TUZoT2c0MU53UGNDSnR1SFF1S2t5dDhlSnhkTnUwb1RiNlhkSUJaOWRJNkIzNjhnYWVkemNnS1B4ZVNMWTdTV3B5VkRiTGdSc2wrZ2RVQXpwbW9ScXE4UFNGckYzSkNxblFzcGhDSWxIWE8wTENqdmVXMXdZK1lITGtzL3ZtU1hoRWlkTVJJb2JTdlBZMWdUaHBGYmNFQlZDeWpwR0dmVW5MRDJ2TWE4eXk1Q2c2QnBXWjdVOHJTSXlLZWJXRXNtNkZNUytMM0lqdTRwQ3V5YXlTNGdiRDN4MWdkbVdYRnovSndIOW1qcjcxQWJhVjJiT2hya0JkY1V3aytWeGpnZCthMGxvZjdUMUg2dmVEeVlaUmhVYktNSWpVODQ3Mk83Slo2RU4yL1JYS1RZMXQxY2pCZmducktkdytKbFI2cXFwYnk2ODgveGZuYk4zRjYvanAyaDJmUmRMM0lnRk9FQXBhbFJNRVYxemxUMjVFRmZLbFdmSFp1WDVDY2NjSkRMdHc0dGZ5R2FnUmswaHNKWnN2Z2dTeVZ6My85Rm5kdmY0L0QrVFlPdDk5Rk9iK0svdmd5eXY0Y3E3cDBtbFVJZ2VOQndkbVJaZDY2VHJuV25lUncxZ21Zd1ZnV0Z3SXFCcjVGRW1qT1NPWWdTOENXV1FNazJITFk5VUVmVGZmL3hJZVBmMGV6TzBaL2VobkhWMitpbkY1RXV6dEhXMVJTQ1UvV2pPamw1U0tndmxhaXpVMzJWa1lOWkZ6Ymw1Y2krUTVra3UwcitFbnA3UlJWZ3QwQ1hwUnRDZXk3TG1ZSnlLVUV4aGp2L295SHk0Zm9iczVSanEvMDNNYjV4WGR4UGh4amtPOUpYM0dQRWNzUjJYTnV0SUtaTEZUL3lpSjJZVk4rWlpYYm8zWFV6WnNXZmkrbHJ5YnZTaGVEREFzODc0OVd0MktNbllEeG8ycGo0eERMOUNHRys3dVkxUFQ5NVgyMHR5OWphay94RVB0b3lGclRxWFRLQm1IcUQ4L3VDTzF0VTg3NXNPTlBidHhuWUVNUU9nQWRURjBuY2NxODZqOHZJblNaTzBkVDFOZzA4ekNORWxGRTQwTTh2UHNqaG8vdlkycjZHSnNTdTlNM3NmUTNzWGJIbU1wT0R0VG0yR0N3Z0VCbk56NUg2RXh1Y0dWU1BISmpZV2lTNTBWYTl1b2gxVTNuRXRNMEtUdmNzTTZHYUdKdURSOW1UcTJ5dU8vbWFLY2xybS92RkxJeTJ1MVUwdWZxN0dmeGIreWkyVCtMUmZaOE8rV090M0R0cU1TWjBMd1gyN2hKVlVycGx2VjZ6MU1pU3Jlb3BoMlJ5Y0k4S21aZG02SXlya3A5b3dZc0xUOEtOR2FKNHk3aU9neng2ZE83Nks4ZjQzQnoxSGVVYm1XdjIzbDhFV001eGFBZkVWNlcvTWNCcHpTOUcxNTdjTlY4MnFZSjJwVkZ2Zkw1Y2xXd0pmYnFsYmJ2MUxTVWtZN1g3ZWgwRy9yZVYxNkJpMDYyQkhLZDRuUzRrZDAxeG1HTWFiaVBnMG85WFI2aVh6OHFTN3U0bG1OY3UzUDh1d3BZcS9lYk1tMFFLcEVyQjFCWjhPMFVZVm5VMUpNNiszUlVId2pFUDUvdVJGd1U3VDRPKzBQMC9TNHV3eVhLVFJNNy9lcVJYeUxNSlBaYW03alIrd3JkUWFEdzBsSkdaZUE2WDZJZkwzR2E3K0pXZlRjME4zRnA5ZWhDektFQTB4SjRCREo3N2Z0dlR3SWtWT3YxcWd6b1JxaEhyc3FZcWhUSDQ4R2x2Tm52WWxSelQrSUJnQjdybEtxUmJ0Vm9lVU5xZFBxUThXZXY2UFFNeFJrRWRKWDl0cDNWWGRjNERuZXF3RDdHZGgvM3E0TFZNeXpxWFprWXh6RitlUDBtL2dPcG9DcHU4M2Z2R3dBQUFBQkpSVTVFcmtKZ2dnPT0iLz48aW1hZ2UgeD0iNjYiIHk9IjEzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTUiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ01BQUFBZUNBWUFBQUNtUGFjcUFBQUFBWE5TUjBJQXJzNGM2UUFBQ0psSlJFRlVXQWs5bDl1VzQwZ1JSVlBLbE9STFZWK0FnY1hpYS9rTEh2Z25udmdFNElFMTAxTTMyNUpTS2ZZT0ZlTnF0eTBwTStORXhJa1Q0ZTd2Zi92cjN1Y2hwVktTcjI1UHFkVTFiWHZqczNKblQzVzlwWEU0cHpMbU5KYk1zeVYxUFk5eVNsdXI2WHptV2M3cGZyK3pmRXZYeTNNYU9ITlpIeW5ua3VxMnBXVmJ1WGZtOE1iNmE2cDE0ZjdPdmlrOU9MLzBPWlh2Zi9oekdPUS9rR0FCTUd1ZCtlQkxhdnpqMi9ZRklFUEtuVXY2dE84MWRYNEhqQnM2THJoTTNhbmcwNUI2QUdUdVhjdUo3Mk9jNmRrTjQ3NzZ2Z1BFaVoyZXRhZHB1Z0I2U3VWMGVlSkdZMEhtd0RnZCsydHMwcHAzTWNPYktMSE9rL2N3M3ZIdHVPWUxTMW9hSnE4eDVtVXEyRDlBOWdEUmFJOGpzZDgxY2RZUjNweDlUbkxHOFU5eHFFY2ZMei9iYjRhNjNSQjBZVURRN3RyTnBldDcxdUZ0d08zL3YvL3pHTy82ajlzNm1XTVBSc1BPNTZjSWVHcGsvU3pEK0QwTzdnS0FtekhJUnY4T2dDeDBrd2U3aWR6dlJDSEFlQTNkZk40Wk9WN0hIdGE3SlloMWZOZWJ6empGS3RjZUdSRE13VmQ0QTZsY0J2RUVjSVQ0SUs0QWRYZ25iWEpnbDdocDQ5NFcwQU80cDdMR05BR05aNmF6cGczZVpVZ3N6SzdqczMxR04wRHJNTkVKMG1uYmM2MmhmdUFjQ0lrQlAzc2U1SDNtd0h2cXRqdVpXQWpHTFoybWljcmhHbUNtdmpYQXR6V2lKYWs1TWxEdHpiMk42cG01dy8yK3NINWcvUTY0akVPVmlHQ0hQWDEvWVkycE45SnladjJSdHZ1L1UxOWZBRU5wdGtkRVltKzNBTGR4YmJrK2VLU25GRHp1QnhyQUFReXZCUk9HaU5yTzJuaHB3MVR4VEFZYWhLQUkvTmwxeEQvVHlEdGtCTEFsL2ZvUHdQeUxtbjlOUThFVCtMSnVoQTIwSFJYV05rTk9hdENoa1h0ckZTenBNeFlZNm5vaXlzRlc0MFlVQlhYc0U1Z2VRMTlLdlFQSmIwQzV2eHN0Z01ncnRhcG5YN20vL3BPTEQ3YTREMzFBRitibEJhRmIwakNNbWt3TDR0ZTNJZDBlYitnRGtkQlRJdER6Zk44ZXBIRU5mYkVLWVRqaFBvVUQ2cFhwbUtacmFxczhCRGlHZXNKa1BYbDJBQVNRakN1VjFHeUdEUUxXRmJHckFFTWZrTnBVdVpmeElDTlFldmo0ZUUyWDRSQTJTM3J6RDYvV0NyOVE1c3hiaGYyNC9lQU1TQ3ZnL29Sek9GSGdYSENsUk9RTFlCcHJyYWg0cGhyZlAwTmI4Ujd0T2NnRi9CNGxEV1dGZ0tRenZNbW5NVzNZR3dicUdjQXJjdCt4YmlSYXRwUk8zWkd3MitIeE1KNHhTZVhSWGhxcDJTeU1EVkRRWUJ3dVJFOUhhQmtENS9SaktyLzgrRThhVDljSStiWVFHU3lQNkg0dVd6clJReHA5eGNyZDZnMVBxQjVLZE9HQVJocDNQTE9FdDJVaGZWMjYwSk4wSU1Ndm8yeWtMT2s4Q1B5RDlFMmMxOUxiQnpRWUsrdS8wYi91c1VaU2x5dEE4b21XMEdGMDNRSHdKVXFaWFNTRzhvdHdVZnA0bmd0OGVyeW55dHR3RmJ5WjRBM2VVQ3BycWdzTmRiend2ZUU1dmNaMndMN1NYZEpLYnh2RzV5QjE2Y1lBM0VIc3ZaMEI5VHNpQk5nLy92NHZ3V1E5cWxjWVQ2cTIrc1NoRXh2cDJJclhPQVlSRytyN2RQcVc1dm1WMEcvcG9oT2tHWTd5SnAxOGx3ZDllU0tWTkVraXRCRkJnV1drV2hKYmFjOWZWWDAyNGU3VCtTdDdNN29FRjhlSjBzS0k4d0FLbUNvSGpvT0ZpM0N0NzRCaVBJQVg1a3FTN29BNGowK3BQM0U4NGQ5M2VFVGFySXh4SWsyY3BLNjRRV2QwVWgzaEN1OXY3RGtUeld2d1JrcW9WUXYwTU9xbEtXNkVUYUpaV2N0eVQ2ZlRGNjdWbVVielFqZnNWWnkvd3g5WlhnSnN6eHp5U29rREVnUVp3RkZmcEZmbklxTE9TR3pzUTZtVmV5S0ZqYnJzd1RzakU4VkJsQnJ6VGVuY3dFdkNXV1pkeG5DMzRnWE1wN1NYK2taZnNtd2hIMzNGVkJsaW5FVW9JUytHcks2ZENvbk9acGZuSlhrM1N0NlhsV1JFTkQ2UTA4cDlsYWJqWEJWOW1kK2dDaHdMeFlVODlndFRNMDBPUkJnU0RCdUdPQlRSUzBhUC9xSUdBZEtVT2tTeExUaTNBMUtqQ2xySWZYd1hDb1VCajR5MFNod05ONFlzU2g1SDdGdGhzd2NNckVvbkZWUFBDS2tlTllUc1RKWHB2dU9rZzFEREcwblp3WEFqT0pLV0ZmNnNmQWVXYW9JRDNDY0NqWWhwZklDNGNtZUxrVVNCaEVORWhybmxFTmhZUlR3QmFZUnBHaUpVYVJWNTkxSWRPQy9wTnZxU2xhQWlWN2hndWV1MVk0UnpzVHNjTDFiYVFVK1pEd0NNQ01PckhpS1pWa2RNeGMxR0VhQ0ppZzFGVUtwM1UvUWc3MDU2eTZOS1FoYmdrU1ExUWtkN1AzSTd6L1lRU1d6RWFKS0dIQUJIS3ZSZndtcDBpeW94dlRaYXdWaUZSZy9MbEMyS1M1bnI4V3piWWFjQ1dObWJUYWtLdkJJZTA3TFpQVGxrWFI3cCtma25TTXdaQ05hRDlPeHNHcEJ2cWJtejlnREVjVllLYVYySlZpSFVEN3owRjRFdk5XZnNyK0dnTTVPL0JsWWJMaUJYUzVtSU94SFlJTy92UDBJUXl3SktyU2pySzlKc1Y0WmxwSWxVRUFHWmoxWDlJSlVqQjMwUTFqT0hVaTM4bWRxbUFSeUpIc1JhZ1NmbW5QdjhJSFgyb2tlb2M2Tm5uVkY0RzYvZ1puUXNLNDV5aTZwaHFvVGgvVGt0OTNlNHZISFFGYTE1QUd3T2I4RVEzdG1qbkQyZ09DRzE1MllPclBIYlp5RjFHejJJRDBEeWV3bXRRbFVBd0ZEMm9GS0ozTG9nQ1dScy9IVEUzeDBUcWJPemoveFVLUUFxSjFxODFzN2xPVVRKYXRsQmJiUWszY2g4WXhWa2hIRXNwQXJ2SW9jK3crdUZQbldKUTAwYkp0Q2M5ckJQZmFRVHp4VTZxMnB5REFHd0RwZ2VlOTZJa25memUvVENBU0V0cDB4L1FTTjY1aGNadmxBbE1qdmF2K1dtMkFIV2FDSElpTllVSVpZakk4UFl5TDVNaUN0ckV4cFY0YzFBQ3Qzdkd0WFlmZXJKQWhVS2tXbGRwYjlKRDFveGVUYVZGWXJFTUYvU09XVW11WjVoUmMrblRIZGQwUmp1N1Z5djl4a0RkTjdITVM2b25rYktjVlRTM0prQUsrWHRxNWhDK0RQQ2hWVWdnR0JWckt2UXdMU1lPdHRIL01TTm45SlNnRlBuanpmbGc0TXBNdzdjQURFemZhL01LQjBwWE80VnVZYk1HSTQxM0QvbUdIOUhPNERaS3M1NCtzSytWNGhmR1VPK005M2QwdTNqMTVoekpUbUxJL1VMRkxCenY3NzhsK3JpZC9mMUo5TDlEWHNVVDYxOWVubjVtYkF5WXhCV1ZWU2hNalUzWm1NN3F4N09iemZ5YlBkRy81MlZpeUYyUU1jQnhDMVBYeGtEcUJDaWRBRU0yMUJuM29pYzU2MFVpSXJsWU9hY1VtVTdhWnFwT1BsWjZQai9Bd21Fa2xzQkdkejhBQUFBQUVsRlRrU3VRbUNDIi8+PGltYWdlIHg9Ijg3IiB5PSIxMyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE1IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNNQUFBQWRDQVlBQUFBZ3FkV0VBQUFBQVhOU1IwSUFyczRjNlFBQUNvUkpSRUZVU0EwbGwxZHY0K2dWaGwrS1RTVFZyT0kyYlpPZDNVMkNRYTQydjNSL1Q2NENCTWxGa0tzZ000dHBPOFVlVzdaRVNoUjd5Zk14Z0EzMWo2ZTg1M2tQclgvKzlaZCtjM0dseFd5bEwzZTNlandlMWR1T0R0bFJXVm5xNW1hcktxdjE1R0tobjEvOXFPWFpRdi81NzMvVmpWd1ZkYXZrV0txcUtnWGpRTWRES2xtOW9ra294N1BrMkphT3g0UG04N25xdWxKUlpKcE9BZ1d1cnlBWTgvMkRidThmRkU2bTh0eVJSdGJZMC81MDBQdXZINVRtSjZYcFFVVlpxR2xhV1phanplWkNoK05lMlNsVGxoZTZ1ZDBxcXhwVlhhKzJkelNaekFna1V0TjJHazhtZk5ZU1FLYXVzbFNWRGVkbG5OWEx0ajNaanFkVFZpck5Ua3JTdlVRQTNpUlN3dlZQVlM0bkpuSnJaTXVTcllvZjhhZldYS3p1VmZMbys2NWUvdjUzbW9lZUxOdmxBcldpNllMUEd5VjV5dXRLWFNkMW5ORDNOczlORUwwcXQ5WnFOWlY3Ym9zNGxXY1pBWEYrMHlucmEvV09yOUdvbHpNZXFTczZraXZsSk1kY05zRzRucS9lNGdPQzZSdEx1KzFSRHcrUHVyNWM2ZG5sUm9FMzB0Z0x5Q3JYdys2Umk1c0xpd1JhQW1zMWlXYUtZMzV6ZDZmTDFVWi8rdUVuemlwMC8vQ05pcHRLTndUYlUrVllpL1ZjZHVDcW82Vys0K2d5dkNUZ1drNFl6cFhUbmhOdGlLS3A2cUpDQnltSDdsWGxqYnplMVl2cjUrUmREb0htZkg0OFZlcmxrc1JJV1laZW9vREFPdHBieXJWSCt1SGxkOXFjemZUcnUwOVV3NkVDUWlPZVpvdTVuTURXaVArS1JFemxpNktVMVhJYXlUcW1LcjRmeVBjNmhmNllmQzN0dDN0ZGI4NkdiTlBEVHUvZXZkR3JWMzlRZ3VBZTR6MzlydEJJaGVCRzZ0R0lLUEdwSnhEWDF2TFpKWUlOOWJpL1U5TlZhdEdkUzZ1Ym5nbzJwYUpacFBpVUlOaXhHdHFUSHVoTTMybE50WnlxTHNteVE0UUU0dlNhZW1QOStkWDM2R2lreVd5aFg5L21xcWhLakxBckxueXpmVkJSb1I4NVpFSUM0NUMyZG1naTVhSWpCU0ZWNGhkN05OSnh4cEdwakthelFXTnhHbk5HTmt6YzVmVmF4eVpWR3ppNk9KdnJmRDJWNHppdXN1SWtpeEo3YmtnUTR0RlRRZXZ1SDc0TUFqTUNqN2xZazdmMFdhcmJCcEdYT2xzc1NNSm5taG5oRkRFVGJCaUZPcEI1VVRKRktMZG52QzBQYlhGK1hlZnk3VmJMdWE5bDFHbnVPWHAydnFZakpHZDFjdHEySGNiWUJHVjYyRkhxc2lqUVFLdFRucXRXSzMvczZ1N2hEZzIxZW5yMVJGOCs4NXllejZpbTBVaUpqbkpZNU1NUWoxYm5aY3lqdEppT1ZYYUZxdllnUDZxWXJvVVdZMHVYeXhERmpVZ2lGSmNoOEpyS0VVeEJWZWlUYXBpUUlkejVZaVlDVm0ybXBFTGh2SEFwbC9tc0xqdTlldjY5cmhCOTE0Z0xUUFN3M3l2dUt6MTVNZEZ5UFZFNHJlU09LNDBScVJkVVNoTTBsaWREMjA5VmdyNHNMV2ZQcUJLZGNFd3lnY1lrVUpyUmRqeFA0NUV2VTZFa09WQ0h2ZGFiSlgzdnlNNVdpQVlxS2hXZ3BackFiNzY4MS9PbkY1VDZURFdsTFhxb3VuRVVMU0p4bExieEp6VldxNnp4OWJCTmdWbEJwUXFKU3NSbHFnbVE5VnhYSGduT0FzRFptQzQ0dW5tNGtkT1RvdEZFUkphSFk4TC9VV2ZMaFN6WDBwaldnUUcxUE8vSUhvb3JyWGE2ZzZxSDdnYU1CM0tta0xrZ0NRcXN6S0tkbitTTlZ4RFlqQzFpTmUxZ29sSUViZGpnK1F1VmtEVnZDOVZnbzRGcEIwUGsvQ0Nucm10WTRPb0FucTBSQVFRaGgrU3d3OVdNYVNyNDBtalU4QnJJT1VmNXFEL2p5b2Y5bzl6VVI3QXo3USttRFlnSXFEV3R4OGd5MG95MWdad1ovNEwyR2pvUGs5ZlpBeDQ4eW1oQjRBd2JLQUJpQ3RFZFFLTWVGWldvdlNLd2dGSDFhSWtGSFp1bXhvOE9takNhYnVncXZiM0hqNkMxWTdnMGhkRDM2TXFXNHk3d21VWjVrY0FXZTBoc1pMbUswTmFPYXUvM082YXFINElwbWNJZXZSamlXODZVWUdnai9ObmhmODRFYzZ2QnVZOUhESFRseHgxWmhlRGFveUtiOVpwS1UxYWNlVHBkL1IvL1pGcFhKMXE3MHBoSk14cUpUMXZFT0paRHl3TWN1emM0U0I2b21rbG1oV0VtVkljeFI3QXBVa2p1dm1wRVJ4d20wa3p0T0lBenA4eUlpM2J6T0tGRnJjY2t1TDFXeXpFWHg4eklhTWRFMkg1RTVVcnRFOE9RU2x4VlM4T2podFdnUHFHYkVnZGY2OXNPTnVIT1kvQS92SWVwUmdFYUJEWWx3Q3RoZ2g4dXRNSHBTemhrMWFDQnFZMGZFem5IK0lBQitwcUM3S3VMTlZuNG1rMjhRYmlIOUVGMzhTTTZBZUZrWXh6WGhrT0xhSTZPYkl5MVZ0Mk50S2ZFSXlmVTIvZnY5Zm5tVjYxWFYyam5STHM5UlZhazkrLyt3UjZ6R2RhTnBPYWlUSVZOTWpWYWNXeGJIOTk4dysrK2dSRkUrK0xKQlpXWWdlOGpWU2sxWTdKOHZDTTlQdXFFRFlSV29EdzlhVWRnSGtFN2xObzRiazJ2VHlkc2dHUk1xOU1Uc0lQaUlabmIxa1JlR0xHY2ZhUTFIall4MCtjUEh6UlpySFRPRm5CLyt4c0J6Z2N6am5jN1hULzdUczdQUDMrSDVUOUY5ZEtubTF1ZGFNR1k3SXZDMFg2M1ZieExkTXdkaE1zSzRjN0EvZzV2QVhpQmp6RjY4dVV4c1M1ajIxRFpTMXBaRFJYb01GTHp2ZldjTWVlMzVzWEZab1grUm1xcVZOT1FiWThLa1pOKyt1TkxiYzQzY2lJd2JZOHF2dHFDZE15UWJPZlRNN0tIdkxTaXdBSjJENSsxM0Z6ajJna0FPN0dQckprRWkwazRVbks4N1hSa0drOWtPbU95cGlDZXFoR0x4LzZ6b0NLRmVVRmcwWXRya29IWThUMjBQaCtteldIcURHQlBlSjhEQU5uS0NwVjF4aHRtT2ZwTnIzNzhpNExaVW5jM1h5bnRWeVVjM2xzK1lzM0pzbWRaT3JMbjJNUHFPRVlYQnUzR3dhT1FCTWpXWUdJRTZIeW14UVRXRmlrUXRkbWJDczNaZHlQd1ljNEoyWnROa0puWnQ3R01rVzlQMU9CTGg0UTMwRVhDRmxma0pXMXFkUGR0U3pDZllJcWg4NUcyeGV3alp4cHhjTW9CK1Fuc1dqYmU0bEhOK1dDYWhqVTl1MHREZ0JsQkYzbW1GbjZOWVZmSStKWmxQa3pXRHAxOCtQQmErM2czQkR5RlNUQ1A4Y1I3R2tadUVtNjAydFFFOFZVclhzK1dseHJQcGxxd0toajNqVDl1dGJwYWF6bWVVWTJNTzRVelRSRjd6V2hiRnBZQjVrUGZ0QWxwd0krU0pNMDJhQWdQaXdFa3ZCcm9iQUlZNmY1K1J5dm5tZ1lqSk9IS2V2dnZYL29Tb05sUU5UT1pvcDNBOThYR3FoSkkvZTFmZjlkaWM2NERaY3p3cEFBL3F0QUs4TmRpenNLTnE3T293U01iT3pBYWd5V3NxeFpHVmd3d2kzQjhxZzU1SGNiWi9KdUpOTlhPMklFbVRKd05WTTJDNTN5OGZRMHRBZHhzTTh6K0xESkdsdXZONTlmcStOSHErWVl2OXV3dUU4MVhhMzM2OElaeHpEVmRMQWtDRnpWbUI3UXdHdUFGMXRrRUhaaGpXbVYyNndwUEsvTjZhSTI1MVZrc3BzZ0VMV0dhTTV6ZlpwenNrVE1NanBOUWlUaitvdmJ4cTU2dW5zRURYeCszSDVXeWFwWWNsaHZhTW42ejZUbVZPeWpoRGlBTVpod085S2hFVGp2TitKZE1nd2tzQ0Zmc3prQ1JiZm91LzZvOHljRkZ4bXJhODFrRUFqeFdFbFkydXpaK1RndnRZZE04Y3RmZ0pHMnVEN2R2MlZYYVlkbTVPcjlRWE1RczB0enJZR0pBbC9kcEcvdk83bkdMeU56QlIyak1vSUg0RUNOVzQ3aFRwWHVveTQxWjI3TFdnd1d6T0prVnhLeWpTUWFsRFcyV0s2eXUwNGpLSEhkSHBieEpXbmdqM3BUQWlIQzZsalB6R0syeGJwSjdGUUFyUTN4anhPaEZlQWcyMzFMaU13d3ZHaTlaSDNaa05OWCtZUWNTVG5yNjVDV0NOUGRhci9YSUxYTEwzYVF4NFBsMHlkcmFRT2tqM01ubG9yRUw3bERqZUt2OTQ5MnczaWJiYjdwODlselhXQWpkOG5XK2VxSHp6WE4rMW1yTHJVbkdXUGVvdmNkM2JyNTlvclRjZXh0WXBZKzROSlhpTHVDNGovVmc3cFBSV0JDWWxjTFI5Wk9uQ05vRjlkd3ZEWXMrbXg0V0VVNERYVDI5MVBMeUVrWWRsTlZ3aHl2SDkrelNHZmRNV0VpODNlcC9aYTRaL3V2ZzlUNEFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9nPjxwYXRoIGQ9Ik0zNy41MDAgNi40NjggTDM3LjUwMCAzNC41MzIiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjFmMWYxIiBzdHJva2Utd2lkdGg9IjEiLz48Zz48cGF0aCBkPSJNMjEuMzQwIDMwLjAwMCBMMjEuMzQwIDI1LjA0NyBMMjIuNzU4IDI1LjA0NyBMMjIuNzU4IDMwLjAwMCBMMjQuMDAwIDMwLjAwMCBMMjQuMTEzIDIxLjU5MyBDMjQuMTEzIDIxLjU5MyAyNi4yMTEgMjUuNDQzIDI2LjIxMSAyNS40NDMgQzI2LjIxMSAyNS40NDMgMjcuMDM3IDI1LjA0MiAyNi45OTcgMjQuOTE3IEMyNS45MzUgMjEuNTkzIDI0Ljc4MyAxOC4wNDIgMjQuNzgzIDE4LjA0MiBMMjIuMDAyIDE4LjA1MCBMMTkuMjIxIDE4LjA0MiBDMTkuMjIxIDE4LjA0MiAxOC4wNjggMjEuNTkzIDE3LjAwNyAyNC45MTcgQzE2Ljk2NyAyNS4wNDIgMTcuNzkzIDI1LjQ0MyAxNy43OTMgMjUuNDQzIEMxNy43OTMgMjUuNDQzIDE5Ljg5MCAyMS41OTMgMTkuODkwIDIxLjU5MyBMMjAuMDAzIDMwLjAwMCBMMjEuMzQwIDMwLjAwMCBaIE0yMi4wMDAgMTguMDAwIEMyMy42NTcgMTguMDAwIDI1LjAwMCAxNi42NTcgMjUuMDAwIDE1LjAwMCBDMjUuMDAwIDEzLjM0MyAyMy42NTcgMTIuMDAwIDIyLjAwMCAxMi4wMDAgQzIwLjM0MyAxMi4wMDAgMTkuMDAwIDEzLjM0MyAxOS4wMDAgMTUuMDAwIEMxOS4wMDAgMTYuNjU3IDIwLjM0MyAxOC4wMDAgMjIuMDAwIDE4LjAwMCBaIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjZzgpIiBzdHJva2U9IiM0ZDM5MDAiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLW9wYWNpdHk9IjAuNTUiLz48cGF0aCBkPSJNMjAuMDMwIDE4LjAxNCBDMjAuMDMwIDE4LjAxNCAyMS4wMzEgMjAuOTUxIDIyLjAxOSAyMC45NDUgQzIzLjAwOCAyMC45MzkgMjMuOTc3IDE3Ljk5MCAyMy45NzcgMTcuOTkwIEwyMC4wMzAgMTguMDE0IFoiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNnOSkiLz48L2c+PC9nPjwvc3ZnPg=="},"pegfly":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAkCAYAAACXOioTAAAEyUlEQVR42u2XW2wUZRTHf2dmdmfX3ZbeWFoKVRGjLb1gh0IQiD4gweBDTSBGSTQxRmNCxJiIUfHJBxOVGJ/QB/FS1OAN7xEtIJUEiGwBgYIocqm0QGlZSi97mZnjw1bQBsJu0Tf+jyfzze/7zvmf883ANY1RcqUHqmudB4GbgITAtx374r/+p6C6Budlz+Ppux2PKeXKuUHhh90GXX1yqKRAnW072geuGjStztlw2xR/QctTaUXA9xBDgDD6yUZTnm8JUFqo0W072gdzBVmjA/UNTnNlqS5oeS6t6fOIqiAoCpARWTzXU1XkhQ8CO4DaXEHG6EAyw0svLs3gDlyE/H10QUmlRJbM9zQ2TqdV1zrXjxkkcKtT7auvXID8WwrDyF3TfYB7xgwKBxUMUJXLFtVXKI4owLgxg84nhfQAIqKXXKAIhoke6hKA38YMClqsa/nRImihOsqUiiCi4COte0wO7It/fDWpe/jV9RYnekXswAhLBAQME4KWsOQVm6QyVFPvDDTNaJyeC8gcHeju7s5UTa745q1W69GiqMrNFWCZoJ5B4rDL9nVJFhYb+vhUNxirILjpqBnoPd395ZgnQ029s7dUtXZ5RYZyY0DTw76IbxEtC1NYpUy8Q/DOqC5aY8tgSpp374p/kVfDAkytceYsnObVrrovo12H0XR/xFCFyjshEIbOVgiVQSYAaxenmf+2/fmV5qZxGWtFiovAj8L4RgwxVNVTvJTiDivhmHDusGIVIOWTVR+Z6VFd56zNG+R6dPf2g2Eg6kGsCfEz2S2rQjimnNkluMOCGUOWz81o1NaldQ3O5LxA55N0HusxQLMJMW0oqQHfzw4Gu1gIlSid34GYYJTDinkuKY/P8gL1Ho8nDnULRFEvmX15tArMYJatvhKdBL4LPbuEQAHS7HhaWaQzahucutxrBAylAQ9J92drrF62nVDAB7tEiExUzu2DoycFJiDLZrqkPVbnBVLlJElI9SlijnSCXrSWXayICOOqlK82m1hRaJ7laXFY51TXObGcQUBXYlDwhiE1PDJ6Lm4CVbBLFcOGRAK+3mJilMH99R4iPJszSITOkwkhbMPGXwyMEW9cWOFDqBRcDxZV+zzxTkBTg0gkDKrU5AwKWBzb3ykUxVQ/ajOxgqgYwsBxMEbaPFSSdWJ1sY8KMu2Z0NBrbdbBcWFdmvMIaprROCmZkc7iAuXISeH4m0lNgwyeyNo9VApiwNkDgjWsLNsU5MMdZoTenUN5meHnne1/7t0Tl7at7XKdzevvb7HEMsAugv4jgmGB+kKoTElmYGmty40x3Z/fCBolX1mzod3ACKCBAkHTSuKUgCihMsHzhdkxXx+b7d4wtcbZk9M1cSn19XSfOquVK59c4Jq+CV4/vNdmMdfx8XzBsqH/tMi8Sb4mPCnvMyqtnlPdm/M+EUDE5o2WnyxMAasQaib4On+lTTCoFExULZqqnB9Gmm9xSbo0jCl1AK7P6g1xAyOEWgXQWOHLH2ck3bTc5tMtphSWQ6Ra2HDMwjbJ5HQfXUq/d8Q7UMdb32qa987ziMcNbIv0zvZ2e2XKeXfF2sADwMGwzfdVJbqiI9+P/H/q9lmNpb0Dsirj8lAgyInxEa3bur397LV/pf9VfwEILPoG+N+37wAAAABJRU5ErkJggg=="}; } return ugfMapsArt.c; } function ugfMapsWanted() { const h = window.location.host; const p = window.location.pathname || ""; if (h !== "www.google.com" && h !== "maps.google.com") { return false; } if (h === "www.google.com" && !/^\/maps(\/|$)/.test(p)) { return false; } // Directions, Street View, My Maps, embeds and the rest stay Google's: Gplex // hands those to the real app rather than half-doing them if (/^\/maps\/(d|contrib|timeline|embed|preview|api|reserve|vt|about|lists|saved|_)(\/|$)/.test(p)) { return false; } // Street View opens in Gplex's own viewer; photos and the rest stay Google's if ((/,\d+(\.\d+)?a,/.test(p) || /!1e1\b|!3m\d+!1e3/.test(window.location.href) || /[?&](map_action=pano|layer=c(&|$)|cbll=)/.test(window.location.search || "")) && !ugfMapsStreetFromUrl()) { return false; } // and Maps inside a frame (Gplex's Street View runs Google's viewer in one) is left alone try { if (window.top !== window.self) { return false; } } catch (e) { return false; } let on = null; try { on = window.localStorage.getItem("UGF_MAPS_ON"); } catch (e) {} return on !== "false"; } // Which Google Maps a layout gets. Maps began in February 2005, so everything // older shows the 2005 beta. The old-browser (legacy) layouts get classic Maps, // which is what Google kept serving to old browsers. function ugfMapsEra() { const l = String(layout || "2015"); if (l === "2022") { return "m2022"; } if (l === "2019") { return "m2019"; } if (["2015", "2016", "2016C", "2018", "2018M"].indexOf(l) > -1) { return "m2015"; } if (l === "2014") { return "m2014"; } if (["2012", "2013", "2013L", "2015L", "2016L"].indexOf(l) > -1) { return "m2011"; } if (l === "2010N") { return "m2010"; } if (l === "2007" || l === "2009") { return "m2007"; } if (l === "2006") { return "m2006"; } return "m2005"; } function ugfMapsYear() { if (UGF_LATE2015) { return "2015"; } const m = String(layout || "").match(/(\d{4})/); const y = m ? parseInt(m[1], 10) : 2015; return String(Math.max(2005, y)); } // The tile colours for each period, as the tile server's style rules. // 2015 is sampled straight off the map in the UI kit; 2016-2018 is the lighter // map with yellow highways and wide white main roads. function ugfMapsPalette() { // late 2015 and early 2016 still had the 2015 map; the lighter one came on 25 July 2016 const l = (UGF_LATE2015 || UGF_EARLY2016 && String(layout) === "2016") ? "2015" : String(layout || "2015"); const set = function(rules) { return rules.join(","); }; const oldIcons = ["s.t:2|s.e:l.i|p.v:off", "s.t:4|p.v:off"]; if (l === "2022") { return ""; // the present-day map as Google draws it } if (["2016", "2016C", "2016L", "2018", "2018M", "2019"].indexOf(l) > -1) { return set([ "s.t:5|s.e:g.f|p.c:#ffebe9e5", "s.t:6|s.e:g.f|p.c:#ffaadaff", "s.t:40|s.e:g.f|p.c:#ffc0ecae", "s.t:49|s.e:g.f|p.c:#fffdd964", "s.t:49|s.e:g.s|p.c:#ffe8b74a", "s.t:50|s.e:g.f|p.c:#ffffffff", "s.t:50|s.e:g.s|p.c:#ffd9d6cf", "s.t:50|s.e:g|p.w:2.2", "s.t:51|s.e:g.f|p.c:#ffffffff", "s.t:51|s.e:g.s|p.c:#ffe0ddd6", "s.t:2|s.e:l.i|p.v:off" ]); } if (["2013", "2013L", "2014", "2015", "2015L"].indexOf(l) > -1) { return set([ "s.t:5|s.e:g.f|p.c:#ffe8e4dc", "s.t:6|s.e:g.f|p.c:#ffa3ccff", "s.t:40|s.e:g.f|p.c:#ffcadfaa", "s.t:49|s.e:g.f|p.c:#fff99c24", "s.t:49|s.e:g.s|p.c:#ffe49309", "s.t:50|s.e:g.f|p.c:#fffee068", "s.t:50|s.e:g.s|p.c:#ffeac452", "s.t:51|s.e:g.f|p.c:#ffffffff", "s.t:51|s.e:g.s|p.c:#ffd8d4cb", "s.t:2|s.e:l.i|p.v:off", "s.t:4|s.e:l.i|p.v:off" ]); } if (["2007", "2009", "2010N", "2012"].indexOf(l) > -1) { return set([ "s.t:5|s.e:g.f|p.c:#fff2efe9", "s.t:6|s.e:g.f|p.c:#ff99b3cc", "s.t:40|s.e:g.f|p.c:#ffc9dfaf", "s.t:49|s.e:g.f|p.c:#fffcc563", "s.t:49|s.e:g.s|p.c:#ffd69a3a", "s.t:50|s.e:g.f|p.c:#fffff4a4", "s.t:50|s.e:g.s|p.c:#ffd8c874", "s.t:51|s.e:g.f|p.c:#ffffffff", "s.t:51|s.e:g.s|p.c:#ffc9c9c9", "s.e:l.t.f|p.c:#ff222222", "s.e:l.t.s|p.c:#ffffffff" ].concat(oldIcons)); } // 2005-2006: the original map - pale yellow roads, orange-yellow freeways with // a dark edge, the grey-blue water return set([ "s.t:5|s.e:g.f|p.c:#fff2efe9", "s.t:6|s.e:g.f|p.c:#ff99b3cc", "s.t:40|s.e:g.f|p.c:#ffc9dfaf", "s.t:49|s.e:g.f|p.c:#fffdd35c", "s.t:49|s.e:g.s|p.c:#ffb5842b", "s.t:50|s.e:g.f|p.c:#ffffffa1", "s.t:50|s.e:g.s|p.c:#ffc0b16f", "s.t:51|s.e:g.f|p.c:#ffffffff", "s.t:51|s.e:g.s|p.c:#ffbfbfbf", "s.e:l.t.f|p.c:#ff222222", "s.e:l.t.s|p.c:#ffffffff" ].concat(oldIcons)); } function ugfMapsLang() { try { return String(navigator.language || "en").split("-")[0] || "en"; } catch (e) { return "en"; } } function ugfMapsTileUrl(type, x, y, z) { // "m,traffic" and the like: a base map with Google's own overlay drawn in const parts = String(type).split(","); const extra = parts.slice(1).join(","); type = parts[0]; const style = (type === "m" || type === "p") ? ugfMapsPalette() : ""; // From zoom 17 in, the "m" roadmap stops telling highways, main roads and side // streets apart - every road comes out as plain "road" in today's blue-grey and // the era colours have nothing to hold on to. The "r" roadmap is the same map // with the road classes kept all the way in, so the styled map uses that. if (type === "m" && style) { type = "r"; } const retina = (window.devicePixelRatio || 1) > 1.4 ? "&scale=2" : ""; return "https://mt" + ((x + y) % 4) + ".google.com/vt/lyrs=" + type + (extra ? "," + extra : "") + "&x=" + x + "&y=" + y + "&z=" + z + "&hl=" + encodeURIComponent(ugfMapsLang()) + retina + (style ? "&apistyle=" + encodeURIComponent(style) : ""); } // ---- the map --------------------------------------------------------------- function ugfMapsCreate(host, opts) { const T = 256; const m = { z: 4, type: "m", ov: [], minZ: 2, maxZ: 21, markers: [], moveFns: [], clickFns: [], zoomFns: [] }; let cx = 0; let cy = 0; host.innerHTML = ugfTT(""); host.classList.add("ugf-maps-canvas"); host.tabIndex = 0; const pane = document.createElement("div"); pane.className = "ugf-maps-pane"; host.appendChild(pane); const overlay = document.createElement("div"); overlay.className = "ugf-maps-overlay"; host.appendChild(overlay); // routes are drawn in one SVG under the markers const SVGNS = "http://www.w3.org/2000/svg"; const routeSvg = document.createElementNS(SVGNS, "svg"); routeSvg.setAttribute("class", "ugf-maps-route"); overlay.appendChild(routeSvg); m.routes = []; // The route is drawn once per zoom level, for the view and a screen's worth // round it, and dragging only slides it along; it is redrawn when the zoom // changes, the routes change, or the map is dragged out of the drawn area. // (Redrawing thousands of points on every frame of a drag is what made the map // crawl with directions up.) let routeBuilt = null; m.routesVer = 0; const routeGroup = document.createElementNS(SVGNS, "g"); routeSvg.appendChild(routeGroup); const buildRoutes = function(left, top, s, w) { while (routeGroup.firstChild) { routeGroup.removeChild(routeGroup.firstChild); } const x0 = Math.round(left - s.w * 0.75); const y0 = Math.round(top - s.h * 0.75); const x1 = x0 + Math.round(s.w * 2.5); const y1 = y0 + Math.round(s.h * 2.5); routeSvg.setAttribute("width", x1 - x0); routeSvg.setAttribute("height", y1 - y0); m.routes.forEach(function(rt) { if (!rt.pts || rt.pts.length < 2) { return; } // world pixels for every point, worked out once per zoom level if (rt._pz !== m.z) { rt._xs = new Float64Array(rt.pts.length); rt._ys = new Float64Array(rt.pts.length); rt.pts.forEach(function(q, k) { const p = project(q.lat, q.lng, m.z); rt._xs[k] = p.x; rt._ys[k] = p.y; }); rt._pz = m.z; } const xs = rt._xs; const ys = rt._ys; // the copy of the world nearest the view, from the route's first point const shift = -Math.round((xs[0] - left - s.w / 2) / w) * w; let d = ""; let open = false; let lx = 0; let ly = 0; for (let k = 0; k < xs.length; k++) { const x = xs[k] + shift; const y = ys[k]; if (k > 0) { const px = xs[k - 1] + shift; const py = ys[k - 1]; // leave out stretches nowhere near the drawn area if (Math.max(x, px) < x0 || Math.min(x, px) > x1 || Math.max(y, py) < y0 || Math.min(y, py) > y1) { open = false; continue; } if (!open) { d += "M" + (px - x0).toFixed(1) + " " + (py - y0).toFixed(1); open = true; lx = px; ly = py; } // and points that land on the same pixel as the last one if (k < xs.length - 1 && Math.abs(x - lx) < 1.5 && Math.abs(y - ly) < 1.5) { continue; } d += "L" + (x - x0).toFixed(1) + " " + (y - y0).toFixed(1); lx = x; ly = y; } } if (!d) { return; } (rt.layers || []).forEach(function(ly2) { const path = document.createElementNS(SVGNS, "path"); path.setAttribute("d", d); path.setAttribute("fill", "none"); path.setAttribute("stroke", ly2.color); path.setAttribute("stroke-width", ly2.width); path.setAttribute("stroke-opacity", ly2.opacity === undefined ? 1 : ly2.opacity); path.setAttribute("stroke-linecap", "round"); path.setAttribute("stroke-linejoin", "round"); if (ly2.dash) { path.setAttribute("stroke-dasharray", ly2.dash); } if (rt.onclick) { path.setAttribute("class", "hit"); path.addEventListener("click", function(ev) { ev.stopPropagation(); rt.onclick(); }); } routeGroup.appendChild(path); }); }); routeBuilt = { z: m.z, ver: m.routesVer, x0: x0, y0: y0, x1: x1, y1: y1, w: s.w, h: s.h }; }; const drawRoutes = function(left, top, s, w) { const b = routeBuilt; if (!b || b.z !== m.z || b.ver !== m.routesVer || b.w !== s.w || b.h !== s.h || left < b.x0 + s.w * 0.25 || left + s.w > b.x1 - s.w * 0.25 || top < b.y0 + s.h * 0.25 || top + s.h > b.y1 - s.h * 0.25) { buildRoutes(left, top, s, w); } // moved as one layer by the graphics card, so a drag repaints nothing routeSvg.style.transform = "translate3d(" + Math.round(routeBuilt.x0 - left) + "px," + Math.round(routeBuilt.y0 - top) + "px,0)"; }; let front = null; let back = null; const ws = function(z) { return T * Math.pow(2, z); }; const project = function(lat, lng, z) { let s = Math.sin(lat * Math.PI / 180); s = Math.max(-0.9999, Math.min(0.9999, s)); const w = ws(z); return { x: (lng + 180) / 360 * w, y: (0.5 - Math.log((1 + s) / (1 - s)) / (4 * Math.PI)) * w }; }; const unproject = function(x, y, z) { const w = ws(z); const n = Math.PI - 2 * Math.PI * y / w; return { lat: 180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))), lng: x / w * 360 - 180 }; }; const size = function() { return { w: host.clientWidth || 800, h: host.clientHeight || 600 }; }; const setPx = function(x, y) { const w = ws(m.z); const s = size(); cx = ((x % w) + w) % w; // keep the poles from sliding into view past the edge of the world const half = Math.min(s.h / 2, w / 2); cy = Math.max(half, Math.min(w - half, y)); }; const layer = function(z) { const d = document.createElement("div"); d.className = "ugf-maps-layer"; d._tiles = {}; d._z = z; d._pending = 0; // Tiles are placed from where the view was when the layer was made, not // from the corner of the world: past zoom 16 the world is wider than the // 33 million pixels a browser can position anything at, and tiles placed // that far out all pile up in one corner - which is what left the map // blank close in. d._ox = Math.round(cx); d._oy = Math.round(cy); pane.appendChild(d); return d; }; const place = function() { const s = size(); const left = cx - s.w / 2; const top = cy - s.h / 2; const w = ws(m.z); m.markers.forEach(function(mk) { const p = project(mk.lat, mk.lng, m.z); let x = p.x - left; // the copy of the world nearest the view x -= Math.round((x - s.w / 2) / w) * w; mk.el.style.left = Math.round(x - mk.ax) + "px"; mk.el.style.top = Math.round(p.y - top - mk.ay) + "px"; }); if (m.routes.length || routeGroup.firstChild) { drawRoutes(left, top, s, w); } }; // The tile server has nothing worth showing past zoom 20 - out of town the // roads simply stop being drawn and the map goes blank - so the last two // steps in are zoom 20's tiles, enlarged, the way Maps itself overzooms. const NATIVE = 20; const draw = function() { const s = size(); const tz = Math.min(m.z, NATIVE); const k = Math.pow(2, m.z - tz); const D = T * k; const n = Math.pow(2, tz); const left = cx - s.w / 2; const top = cy - s.h / 2; const kind = m.type + (m.ov.length ? "," + m.ov.join(",") : ""); // (a long pan - round the world at the date line - starts a fresh layer // too, so nothing in it strays far from its origin) if (!front || front._z !== m.z || front._type !== kind || Math.abs(cx - front._ox) > 4e6 || Math.abs(cy - front._oy) > 4e6) { if (front) { if (back) { back.remove(); } back = front; } front = layer(m.z); front._type = kind; } const want = {}; const tx0 = Math.floor(left / D) - 1; const tx1 = Math.floor((left + s.w) / D) + 1; const ty0 = Math.max(0, Math.floor(top / D) - 1); const ty1 = Math.min(n - 1, Math.floor((top + s.h) / D) + 1); for (let ty = ty0; ty <= ty1; ty++) { for (let tx = tx0; tx <= tx1; tx++) { const key = tx + "/" + ty; want[key] = true; if (front._tiles[key]) { continue; } const img = document.createElement("img"); img.className = "ugf-maps-tile"; img.draggable = false; img.alt = ""; img.style.left = (tx * D - front._ox) + "px"; img.style.top = (ty * D - front._oy) + "px"; if (k > 1) { img.style.width = D + "px"; img.style.height = D + "px"; } front._pending++; const lay = front; img.onerror = function() { // one retry through another of the tile servers, then leave the gap if (!img._retried) { img._retried = true; const src = img.src; setTimeout(function() { img.src = src.replace(/\/\/mt(\d)\./, function(a, d) { return "//mt" + ((parseInt(d, 10) + 1) % 4) + "."; }); }, 400); return; } img.style.visibility = "hidden"; img.onload(); }; img.onload = function() { if (img._done) { return; } img._done = true; lay._pending--; img.classList.add("in"); if (lay === front && lay._pending <= 0 && back) { back.remove(); back = null; } }; img.src = ugfMapsTileUrl(kind, ((tx % n) + n) % n, ty, tz); front.appendChild(img); front._tiles[key] = img; } } Object.keys(front._tiles).forEach(function(key) { if (!want[key]) { front._tiles[key].remove(); delete front._tiles[key]; } }); front.style.transform = "translate(" + Math.round(front._ox - left) + "px," + Math.round(front._oy - top) + "px)"; if (back) { const k = Math.pow(2, m.z - back._z); back.style.transform = "translate(" + (back._ox * k - left) + "px," + (back._oy * k - top) + "px) scale(" + k + ")"; } place(); const ll = unproject(cx, cy, m.z); m.lat = ll.lat; m.lng = ((ll.lng + 540) % 360) - 180; m.moveFns.forEach(function(fn) { try { fn(); } catch (e) {} }); }; const api = { el: host, project: project, unproject: unproject, view: function() { return { lat: m.lat, lng: m.lng, z: m.z, type: m.type }; }, setView: function(lat, lng, z) { if (z !== undefined && z !== null) { m.z = Math.max(m.minZ, Math.min(m.maxZ, Math.round(z))); } const p = project(lat, lng, m.z); setPx(p.x, p.y); draw(); }, // zoom about a point on screen (the middle when none is given), with the // old tiles scaled into place until the new ones arrive zoomTo: function(nz, sx, sy) { nz = Math.max(m.minZ, Math.min(m.maxZ, Math.round(nz))); if (nz === m.z) { return; } const s = size(); if (sx === undefined) { sx = s.w / 2; sy = s.h / 2; } const k = Math.pow(2, nz - m.z); const fx = cx + (sx - s.w / 2); const fy = cy + (sy - s.h / 2); const old = front; m.z = nz; setPx(fx * k - (sx - s.w / 2), fy * k - (sy - s.h / 2)); if (old) { old.style.transition = "transform .22s ease-out"; setTimeout(function() { old.style.transition = ""; }, 260); } draw(); m.zoomFns.forEach(function(fn) { try { fn(m.z); } catch (e) {} }); }, zoomIn: function() { api.zoomTo(m.z + 1); }, zoomOut: function() { api.zoomTo(m.z - 1); }, panBy: function(dx, dy) { setPx(cx + dx, cy + dy); draw(); }, panTo: function(lat, lng) { const p = project(lat, lng, m.z); const sx = cx; const sy = cy; let dx = p.x - sx; const w = ws(m.z); dx -= Math.round(dx / w) * w; const dy = p.y - sy; const t0 = performance.now(); const step = function(t) { const f = Math.min(1, (t - t0) / 350); const e = f < 0.5 ? 2 * f * f : 1 - Math.pow(-2 * f + 2, 2) / 2; setPx(sx + dx * e, sy + dy * e); draw(); if (f < 1) { requestAnimationFrame(step); } }; requestAnimationFrame(step); }, setType: function(t) { m.type = t; draw(); }, // routes: [{ pts: [{lat, lng}], layers: [{color, width, opacity, dash}], onclick }] setRoutes: function(list) { m.routes = list || []; m.routesVer++; place(); }, // the traffic, transit and cycling layers (one at a time, as in Maps) setOverlay: function(name) { m.ov = name ? [name] : []; draw(); }, overlay: function() { return m.ov[0] || ""; }, fit: function(points, pad) { if (!points.length) { return; } if (points.length === 1) { api.setView(points[0].lat, points[0].lng, Math.max(m.z, 15)); return; } const s = size(); pad = pad || 60; let z = m.maxZ - 4; for (; z > m.minZ; z--) { const ps = points.map(function(q) { return project(q.lat, q.lng, z); }); const xs = ps.map(function(q) { return q.x; }); const ys = ps.map(function(q) { return q.y; }); if (Math.max.apply(null, xs) - Math.min.apply(null, xs) < s.w - pad * 2 && Math.max.apply(null, ys) - Math.min.apply(null, ys) < s.h - pad * 2) { break; } } let la = 0; let ln = 0; points.forEach(function(q) { la += q.lat; ln += q.lng; }); api.setView(la / points.length, ln / points.length, z); }, addMarker: function(mk) { overlay.appendChild(mk.el); m.markers.push(mk); place(); return mk; }, removeMarker: function(mk) { const i = m.markers.indexOf(mk); if (i > -1) { m.markers.splice(i, 1); } mk.el.remove(); }, clearMarkers: function() { m.markers.slice().forEach(api.removeMarker); }, screenToLatLng: function(sx, sy) { const s = size(); const ll = unproject(cx + sx - s.w / 2, cy + sy - s.h / 2, m.z); ll.lng = ((ll.lng + 540) % 360) - 180; return ll; }, metersPerPixel: function() { return 156543.03392 * Math.cos(m.lat * Math.PI / 180) / Math.pow(2, m.z); }, onMove: function(fn) { m.moveFns.push(fn); }, onClick: function(fn) { m.clickFns.push(fn); }, onZoom: function(fn) { m.zoomFns.push(fn); }, redraw: function() { draw(); } }; // dragging, with a little glide when let go let drag = null; let glide = 0; host.addEventListener("pointerdown", function(ev) { if (ev.button !== 0 || ev.target.closest(".ugf-maps-marker, .ugf-maps-iw, .ugf-maps-ctl, .hit")) { return; } cancelAnimationFrame(glide); drag = { x: ev.clientX, y: ev.clientY, sx: ev.clientX, sy: ev.clientY, t: performance.now(), vx: 0, vy: 0, moved: false }; try { host.setPointerCapture(ev.pointerId); } catch (e) {} host.classList.add("dragging"); }); host.addEventListener("pointermove", function(ev) { if (!drag) { return; } const dx = ev.clientX - drag.x; const dy = ev.clientY - drag.y; const now = performance.now(); const dt = Math.max(1, now - drag.t); drag.vx = dx / dt; drag.vy = dy / dt; drag.x = ev.clientX; drag.y = ev.clientY; drag.t = now; if (Math.abs(ev.clientX - drag.sx) + Math.abs(ev.clientY - drag.sy) > 3) { drag.moved = true; } api.panBy(-dx, -dy); }); const end = function(ev) { if (!drag) { return; } const d = drag; drag = null; host.classList.remove("dragging"); if (!d.moved) { const r = host.getBoundingClientRect(); const sx = ev.clientX - r.left; const sy = ev.clientY - r.top; const ll = api.screenToLatLng(sx, sy); m.clickFns.forEach(function(fn) { try { fn(ll, sx, sy, ev); } catch (e) {} }); return; } let vx = d.vx * 16; let vy = d.vy * 16; if (performance.now() - d.t > 80 || Math.abs(vx) + Math.abs(vy) < 2) { return; } const step = function() { vx *= 0.9; vy *= 0.9; api.panBy(-vx, -vy); if (Math.abs(vx) + Math.abs(vy) > 0.5) { glide = requestAnimationFrame(step); } }; glide = requestAnimationFrame(step); }; host.addEventListener("pointerup", end); host.addEventListener("pointercancel", end); let wheelAcc = 0; let wheelAt = 0; host.addEventListener("wheel", function(ev) { ev.preventDefault(); const now = performance.now(); wheelAcc += ev.deltaMode === 1 ? ev.deltaY * 30 : ev.deltaY; if (Math.abs(wheelAcc) < 60 || now - wheelAt < 200) { return; } const r = host.getBoundingClientRect(); api.zoomTo(m.z + (wheelAcc < 0 ? 1 : -1), ev.clientX - r.left, ev.clientY - r.top); wheelAcc = 0; wheelAt = now; }, { passive: false }); host.addEventListener("dblclick", function(ev) { if (ev.target.closest(".ugf-maps-marker, .ugf-maps-iw, .ugf-maps-ctl, .hit")) { return; } const r = host.getBoundingClientRect(); api.zoomTo(m.z + 1, ev.clientX - r.left, ev.clientY - r.top); }); host.addEventListener("keydown", function(ev) { if (ev.target !== host) { return; } const k = ev.key; if (k === "ArrowLeft") { api.panBy(-100, 0); } else if (k === "ArrowRight") { api.panBy(100, 0); } else if (k === "ArrowUp") { api.panBy(0, -100); } else if (k === "ArrowDown") { api.panBy(0, 100); } else if (k === "+" || k === "=") { api.zoomIn(); } else if (k === "-" || k === "_") { api.zoomOut(); } else { return; } ev.preventDefault(); }); window.addEventListener("resize", function() { draw(); }); if (opts && opts.lat !== undefined) { m.z = Math.max(m.minZ, Math.min(m.maxZ, opts.z || 4)); const p = project(opts.lat, opts.lng, m.z); setPx(p.x, p.y); } return api; } // ---- where to look, and what Google found --------------------------------- // /maps/@37.77,-122.41,13z, /maps/place/Name/@..., /maps/search/pizza/@..., // the old ?q= and ?ll=&z= addresses, or the last view for a bare /maps function ugfMapsParseUrl() { const href = window.location.href; const path = decodeURIComponent(window.location.pathname || ""); const out = { kind: "view", q: "", name: "" }; const at = path.match(/@(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?),(\d+(?:\.\d+)?)(z|m)/); if (at) { out.lat = parseFloat(at[1]); out.lng = parseFloat(at[2]); const v = parseFloat(at[3]); out.z = at[4] === "z" ? v : Math.round(Math.max(3, Math.min(20, 27 - Math.log(v) / Math.LN2))); } const sv = ugfMapsStreetFromUrl(); if (sv && (sv.lat || sv.lng)) { out.lat = sv.lat; out.lng = sv.lng; out.z = 17; } if (sv) { out.street = sv; } let m = path.match(/^\/maps\/place\/([^/@]+)/); if (m) { out.kind = "place"; out.name = m[1].replace(/\+/g, " "); } // directions: /maps/dir///@.../data=...!3e, or ?api=1&origin=&destination= if (/^\/maps\/dir(\/|$)/.test(path)) { out.kind = "dir"; const segs = []; (window.location.pathname || "").replace(/^\/maps\/dir\/?/, "").split("/").some(function(seg) { if (/^@/.test(seg) || /^data=/.test(seg)) { return true; } let t = seg; try { t = decodeURIComponent(seg.replace(/\+/g, " ")); } catch (e) {} segs.push(t); return false; }); if (segs.length > 2 && segs[segs.length - 1] === "") { segs.pop(); // the slash at the end } const qs0 = window.location.search || ""; const qp = function(k) { const mm = qs0.match(new RegExp("[?&]" + k + "=([^&]*)")); return mm ? decodeURIComponent(mm[1].replace(/\+/g, " ")) : ""; }; out.from = segs.length > 1 ? segs[0] : qp("origin"); out.to = segs.length > 1 ? segs[segs.length - 1] : (segs[0] || qp("destination")); const md = href.match(/!3e(\d)/); const tm = { driving: 0, bicycling: 1, walking: 2, transit: 3 }[qp("travelmode")]; out.mode = md ? parseInt(md[1], 10) : (tm !== undefined ? tm : 0); return out; } m = path.match(/^\/maps\/search\/([^/@]+)/); if (m) { out.kind = "search"; out.q = m[1].replace(/\+/g, " "); } const pin = href.match(/!3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+)?)/); if (pin) { out.pin = { lat: parseFloat(pin[1]), lng: parseFloat(pin[2]) }; } const qs = window.location.search || ""; const q = qs.match(/[?&]q=([^&]+)/); if (q && out.kind === "view") { out.kind = "search"; out.q = decodeURIComponent(q[1].replace(/\+/g, " ")); } const ll = qs.match(/[?&]ll=(-?[\d.]+),(-?[\d.]+)/); if (ll && out.lat === undefined) { out.lat = parseFloat(ll[1]); out.lng = parseFloat(ll[2]); const z = qs.match(/[?&]z=(\d+)/); out.z = z ? parseInt(z[1], 10) : 13; } return out; } function ugfMapsMine(el) { return !!(el && el.closest && el.closest('#ugf-maps, [id^="ugf-maps-"]')); } // Read what the hidden app came up with: one place, or a list of them. Every // result carries its position in its link (!3d!4d), which is what // this goes by rather than anything Google words differently per language. function ugfMapsHarvest(done) { let tries = 0; let lastSig = ""; let stable = 0; const clean = function(t) { return String(t || "").replace(/\s+/g, " ").trim(); }; const iv = setInterval(function() { tries++; const path = window.location.pathname || ""; if (/^\/maps\/place\//.test(path)) { const u = ugfMapsParseUrl(); let h1 = null; document.querySelectorAll("h1").forEach(function(h) { if (!h1 && !ugfMapsMine(h) && clean(h.textContent)) { h1 = h; } }); if (!h1 && tries < 16) { return; } clearInterval(iv); const get = function(sel) { const el = [].filter.call(document.querySelectorAll(sel), function(e) { return !ugfMapsMine(e); })[0]; return el ? clean(el.textContent) : ""; }; const web = [].filter.call(document.querySelectorAll('a[data-item-id="authority"]'), function(e) { return !ugfMapsMine(e); })[0]; const pos = u.pin || (u.lat !== undefined ? { lat: u.lat, lng: u.lng } : null); done({ kind: "place", items: pos ? [{ name: h1 ? clean(h1.textContent) : u.name, lat: pos.lat, lng: pos.lng, lines: [get('[data-item-id="address"]'), get('button[jsaction*="category"]'), get('[data-item-id^="phone"]')].filter(Boolean), web: web ? web.getAttribute("href") : "", href: window.location.href.split("?")[0] }] : [] }); return; } const seen = {}; const items = []; document.querySelectorAll('a[href*="/maps/place/"]').forEach(function(a) { if (ugfMapsMine(a)) { return; } const href = a.getAttribute("href") || ""; const p = href.match(/!3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+)?)/); if (!p || seen[href]) { return; } seen[href] = true; let name = clean(a.getAttribute("aria-label") || a.textContent); if (!name) { const m = href.match(/\/maps\/place\/([^/]+)/); name = m ? decodeURIComponent(m[1]).replace(/\+/g, " ") : ""; } const card = a.closest('[role="article"]') || a.parentElement; const lines = []; String(card ? ugfMapsReadText(card) : "").split("\n").forEach(function(t) { t = ugfMapsClean(t); if (t && t !== name && t.length < 90 && lines.indexOf(t) === -1 && !/^(directions|website|call|share|save|order online|reserve a table|·)$/i.test(t)) { lines.push(t); } }); items.push({ name: name, lat: parseFloat(p[1]), lng: parseFloat(p[2]), lines: lines.slice(0, 3), href: href.split("?")[0] }); }); const sig = items.map(function(i) { return i.href; }).join("|"); if (items.length && sig === lastSig) { stable++; } else { stable = 0; } lastSig = sig; if ((items.length && stable >= 3) || tries > 60) { clearInterval(iv); done({ kind: items.length ? "list" : "none", items: items.slice(0, 20) }); } }, 400); } // Google's app is hidden (visibility), and hidden text reads back empty through // innerText - so read a copy laid out, off screen, inside Gplex's own page. function ugfMapsReadText(el) { const host = document.querySelector("#ugf-maps") || document.body; const box = document.createElement("div"); box.setAttribute("style", "position:fixed;left:-99999px;top:0;width:400px;visibility:visible;"); box.appendChild(el.cloneNode(true)); host.appendChild(box); let t = ""; try { t = box.innerText || ""; } catch (e) {} box.remove(); return t; } // The classic (2011-2013 style) header logo, the same one Gplex's results pages // show for the layout, cut out of Google's own sprite so it has no white box behind // it on the grey header. function ugfMapsHeadLogo() { const A = ugfMapsArt(); const l = String(layout || ""); if (l === "2012") { return 'Google'; } if (l === "2015L") { return 'Google'; } if (l === "2016L") { return 'Google'; } return 'Google'; } // The tab icon Maps had in each period: Google's own "G" until Maps got an icon // of its own, the map with the red pin (2009), the "g" and pin (2012), its flat // redraw (2014), the folded Material map (Sep 2015) and the 2020 pin. function ugfMapsFavicon() { const A = ugfMapsArt(); const l = String(layout || "2015"); if (l === "2022") { return A.fav2020; } if (["2016", "2016C", "2018", "2018M", "2019"].indexOf(l) > -1) { return A.fav2015; } if (l === "2014" || l === "2015") { return A.fav2014; } if (["2013", "2013L", "2015L", "2016L"].indexOf(l) > -1) { return A.fav2012; } if (["2009", "2010N", "2012"].indexOf(l) > -1) { return A.fav2009; } return A.fav1999; } function ugfMapsSetFavicon() { const href = ugfMapsFavicon(); if (!href) { return; } ugfApplyFavicon(href); // Google puts its own icon back as the app loads, so keep ours on top const mo = new MutationObserver(function(muts) { for (let i = 0; i < muts.length; i++) { for (let j = 0; j < muts[i].addedNodes.length; j++) { const n = muts[i].addedNodes[j]; if (n.nodeType === 1 && n.tagName === "LINK" && /icon/.test(n.getAttribute("rel") || "") && !ugfIsOurFavicon(n)) { ugfApplyFavicon(href); return; } } } }); mo.observe(document.head || document.documentElement, { childList: true, subtree: true }); ugfKeepFavicon(function() { return href; }); let ticks = 0; const iv = setInterval(function() { ugfApplyFavicon(href); if (++ticks > 30) { clearInterval(iv); } }, 500); } // Searching, done by Gplex itself: the same request Google's app makes for its // result list (www.google.com/search?tbm=map), read straight into Gplex's own // list - so a search never reloads the page or passes through Google's app, and // there is no way for it to end up on the modern page. null means the request did // not work out, and the caller falls back to letting Google's app search. function ugfMapsClean(t) { // Google puts icon-font glyphs (the wheelchair, the dot) in its text return String(t || "").replace(/[-]/g, "").replace(/\s*·\s*(·\s*)+/g, " · ") .replace(/^\s*·\s*|\s*·\s*$/g, "").replace(/\s+/g, " ").trim(); } function ugfMapsFetch(q, v, size, done) { if (window.location.host !== "www.google.com") { done(null); return; } const w = Math.max(320, Math.round(size.w || 1024)); const h = Math.max(240, Math.round(size.h || 768)); const mpp = 156543.03392 * Math.cos(v.lat * Math.PI / 180) / Math.pow(2, v.z); const pb = "!4m8!1m3!1d" + (mpp * h * 4.35).toFixed(2) + "!2d" + v.lng.toFixed(6) + "!3d" + v.lat.toFixed(6) + "!3m2!1i" + w + "!2i" + h + "!4f13.1!7i20!10b1"; const url = "/search?tbm=map&authuser=0&hl=" + encodeURIComponent(ugfMapsLang()) + "&q=" + encodeURIComponent(q) + "&pb=" + encodeURIComponent(pb); ugfMapsGet(url, function(t, why) { let res = null; if (t !== null) { try { res = ugfMapsParseSearch(ugfMapsJson(t)); } catch (e) { why = "unexpected reply (" + e.message + ")"; } } if (!res) { console.log("[Gplex] Maps: search request failed (" + why + "), letting Google's app search"); } done(res); }); } // Google's replies start with )]}' to stop them being run as script function ugfMapsJson(t) { t = String(t || ""); const i = t.indexOf("["); if (i < 0) { throw new Error("no data in the reply"); } return JSON.parse(t.slice(i)); } // One request to Google, by whichever way gets through from a userscript: its own // fetch, the page's fetch, then XMLHttpRequest. cb(text) or cb(null, why). function ugfMapsGet(url, cb) { const ways = []; let own = null; try { own = typeof fetch === "function" ? fetch : null; } catch (e) {} if (own) { ways.push(["fetch", own]); } try { const pw = typeof unsafeWindow !== "undefined" ? unsafeWindow : null; if (pw && pw !== window && typeof pw.fetch === "function" && pw.fetch !== own) { ways.push(["page fetch", pw.fetch.bind(pw)]); } } catch (e) {} ways.push(["XMLHttpRequest", null]); const why = []; const next = function(i) { if (i >= ways.length) { cb(null, why.join("; ")); return; } let settled = false; const ok = function(t) { if (!settled) { settled = true; clearTimeout(timer); cb(String(t), ""); } }; const bad = function(r) { if (!settled) { settled = true; clearTimeout(timer); why.push(ways[i][0] + ": " + r); next(i + 1); } }; const timer = setTimeout(function() { bad("timed out"); }, 15000); const f = ways[i][1]; if (f) { try { f(url, { credentials: "include" }).then(function(r) { if (!r.ok) { throw new Error("HTTP " + r.status); } return r.text(); }).then(ok).catch(function(e) { bad((e && e.message) || "failed"); }); } catch (e) { bad(e.message); } return; } try { const x = new XMLHttpRequest(); x.open("GET", url, true); x.withCredentials = true; x.onload = function() { if (x.status >= 200 && x.status < 300) { ok(x.responseText); } else { bad("HTTP " + x.status); } }; x.onerror = function() { bad("network error"); }; x.send(); } catch (e) { bad(e.message); } }; next(0); } function ugfMapsIsPlace(a) { return Array.isArray(a) && a.length > 18 && Array.isArray(a[9]) && typeof a[9][2] === "number" && typeof a[9][3] === "number" && typeof a[11] === "string" && a[11] !== ""; } function ugfMapsParseSearch(d) { let found = []; // the result list: one entry per place, the place itself at [14] const list = d && d[0] && Array.isArray(d[0][1]) ? d[0][1] : []; list.forEach(function(r) { if (Array.isArray(r) && ugfMapsIsPlace(r[14])) { found.push(r[14]); } }); if (!found.length) { // otherwise take the first place anywhere in the answer const walk = function(a, depth) { if (found.length || !Array.isArray(a) || depth > 14) { return; } if (ugfMapsIsPlace(a)) { found.push(a); return; } for (let i = 0; i < a.length; i++) { walk(a[i], depth + 1); } }; walk(d, 0); } const seen = {}; const items = []; found.forEach(function(a) { const key = String(a[10] || a[11] + a[9][2]); if (seen[key]) { return; } seen[key] = true; const lat = a[9][2]; const lng = a[9][3]; let addr = ""; if (Array.isArray(a[2]) && a[2].length) { addr = a[2].filter(function(x) { return typeof x === "string"; }).slice(0, 2).join(", "); } addr = addr || (typeof a[39] === "string" ? a[39] : "") || (typeof a[18] === "string" ? a[18] : ""); if (!Array.isArray(a[13]) && typeof a[18] === "string" && a[18] !== a[11]) { addr = a[18]; // a town or a street, not a business: its full name reads best } let phone = ""; try { phone = a[178][0][1][0][0] || a[178][0][0] || ""; } catch (e) {} let cat = Array.isArray(a[13]) && typeof a[13][0] === "string" ? a[13][0] : ""; let rating = ""; try { if (typeof a[4][7] === "number") { rating = a[4][7].toFixed(1) + (typeof a[4][8] === "number" ? " (" + a[4][8] + ")" : ""); } } catch (e) {} let web = ""; try { web = typeof a[7][0] === "string" && /^https?:/.test(a[7][0]) ? a[7][0] : ""; } catch (e) {} const name = ugfMapsClean(a[11]); const lines = []; [addr, phone, [rating, cat].filter(Boolean).join(" · ")].forEach(function(l) { l = ugfMapsClean(l); if (l && l !== name && lines.indexOf(l) === -1) { lines.push(l); } }); items.push({ name: name, lat: lat, lng: lng, lines: lines, web: web, href: "https://www.google.com/maps/place/" + encodeURIComponent(name).replace(/%20/g, "+") + "/@" + lat.toFixed(7) + "," + lng.toFixed(7) + ",17z" + (a[10] ? "/data=!4m5!3m4!1s" + a[10] + "!8m2!3d" + lat + "!4d" + lng : "") }); }); return { kind: items.length === 1 ? "place" : (items.length ? "list" : "none"), items: items.slice(0, 20) }; } // Directions, done by Gplex itself: the request Google's app makes for a route // (www.google.com/maps/preview/directions), read into Gplex's own panel and drawn // on Gplex's map. mode: 0 driving, 1 bicycling, 2 walking, 3 transit. // (a function, not a const: this part of the script is reached before a const // this far down would exist) function ugfMapsDirPb() { return "!6m61!1m5!18b1!30b1!31m1!1b1!34e1!2m4!5m1!6e2!20e3!39b1!6m32!32i1!49b1!63m0!66b1!85b1!114b1!149b1!206b1!209b1!212b1!215b1!216b1!222b1!223b1!232b1!234b1!235b1!246b1!253b1!260b1!262b1!266b1!270b1!271b1!273b1!277b1!280b1!281b1!291m0!294b1!302i300!303i100!10b1!12b1!13b1!14b1!16b1!17m1!3e1!20m5!1e0!2e3!5e2!6b1!14b1!46m1!1b0!96b1!99b1"; } function ugfMapsPbText(s) { return String(s).replace(/\*/g, "*2A").replace(/!/g, "*21"); } function ugfMapsRoute(from, to, mode, v, size, done) { if (window.location.host !== "www.google.com") { done(null, "not on www.google.com"); return; } const w = Math.max(320, Math.round(size.w || 1024)); const h = Math.max(240, Math.round(size.h || 768)); const mpp = 156543.03392 * Math.cos(v.lat * Math.PI / 180) / Math.pow(2, v.z); const pb = "!1m2!1s" + ugfMapsPbText(from) + "!6e0!1m2!1s" + ugfMapsPbText(to) + "!6e0" + "!3m12!1m3!1d" + (mpp * h * 4.35).toFixed(2) + "!2d" + v.lng.toFixed(6) + "!3d" + v.lat.toFixed(6) + "!2m3!1f0.0!2f0.0!3f0.0!3m2!1i" + w + "!2i" + h + "!4f13.1" + ugfMapsDirPb().replace("!20m5!1e0!", "!20m5!1e" + (parseInt(mode, 10) || 0) + "!") + "!15m1!7e81"; const url = "/maps/preview/directions?authuser=0&hl=" + encodeURIComponent(ugfMapsLang()) + "&pb=" + encodeURIComponent(pb); ugfMapsGetRoute(url, done); } // the reply for a directions request (ours, or the one Google's page asked for) function ugfMapsGetRoute(url, done) { ugfMapsGet(url, function(t, why) { let res = null; if (t !== null) { try { res = ugfMapsParseRoute(ugfMapsJson(t)); } catch (e) { why = "unexpected reply (" + e.message + ")"; console.log("[Gplex] Maps: directions reply began: " + String(t).slice(0, 160)); } } if (!res) { console.log("[Gplex] Maps: directions request failed (" + why + ")"); } done(res, why); }); } function ugfMapsStripTags(s) { return String(s || "").replace(/<[^>]*>/g, "").replace(/&/g, "&").replace(/'/g, "'") .replace(/"/g, '"').replace(/\s+/g, " ").trim(); } function ugfMapsParseRoute(d) { const root = d && d[0]; if (!root) { return { ok: false, routes: [] }; } const pt = function(a) { return Array.isArray(a) && typeof a[2] === "number" && typeof a[3] === "number" ? { lat: a[2], lng: a[3] } : null; }; // the two ends, as Google understood them const ends = []; (Array.isArray(root[0]) ? root[0] : []).forEach(function(wp) { let found = null; const walk = function(a, depth) { if (found || !Array.isArray(a) || depth > 6) { return; } if (typeof a[0] === "string" && pt(a[2])) { found = { name: a[0], lat: a[2][2], lng: a[2][3] }; return; } a.forEach(function(x) { walk(x, depth + 1); }); }; walk(wp, 0); ends.push(found); }); const lines = Array.isArray(root[7]) ? root[7] : []; const routes = []; (Array.isArray(root[1]) ? root[1] : []).forEach(function(r, ri) { if (!Array.isArray(r) || !Array.isArray(r[0])) { return; } // one route in a shape this does not know should not cost the others try { const s = r[0]; const steps = []; const rides = []; const isStep = function(a) { return Array.isArray(a) && Array.isArray(a[2]) && ((Array.isArray(a[14]) && a[14].length && a[14].every(function(f) { return Array.isArray(f) && Array.isArray(f[1]) && typeof f[1][0] === "string"; })) || (typeof a[1] === "string" && /^ 12) { return; } // transit: a ride, with its line, where it heads, and where you get on and off if (Array.isArray(a[5]) && Array.isArray(a[5][0]) && typeof a[5][0][0] === "string" && Array.isArray(a[5][1]) && typeof a[5][1][0] === "string") { let line = ""; let kind = ""; let head = ""; let when = ""; // the heading is in pieces: 4 the vehicle, 5 the line, 7 where it heads ((a[0] && Array.isArray(a[0][14])) ? a[0][14] : []).forEach(function(f) { if (!Array.isArray(f)) { return; } const txt = Array.isArray(f[1]) && typeof f[1][0] === "string" ? f[1][0] : (Array.isArray(f[2]) && typeof f[2][3] === "string" ? f[2][3] : ""); if (f[0] === 4) { kind = txt; } else if (f[0] === 5) { line = txt; } else if (f[0] === 7) { head = txt; } }); line = (kind && kind !== line ? kind + " " : "") + line; try { when = String(a[0][3][1] || ""); } catch (e) {} const tm = function(stop) { const t = (Array.isArray(stop[3]) ? stop[3] : stop[2]) || []; return typeof t[2] === "string" ? t[2].replace(/\u202f/g, " ") : ""; }; const on = a[5][0]; const off = a[5][1]; rides.push(line); steps.push({ text: (line || "Transit") + (head ? " toward " + head : ""), note: on[0] + (tm(on) ? " " + tm(on) : "") + " to " + off[0] + (tm(off) ? " " + tm(off) : "") + (typeof a[5][2] === "number" ? " (" + a[5][2] + " stops)" : ""), dist: "", time: when, at: pt(on[4]), transit: true }); return; } // a long route comes in sections: a summary line ("Get on I-95 N...") // with the turns under it - the turns are what the list shows if (isStep(a[0]) && Array.isArray(a[1]) && a[1].some(function(x) { return Array.isArray(x) && isStep(x[0]); })) { walk(a[1], depth + 1); return; } const frags = Array.isArray(a[14]) && a[14].length && a[14].every(function(f) { return Array.isArray(f) && Array.isArray(f[1]) && typeof f[1][0] === "string"; }) ? a[14] : null; if ((frags || (typeof a[1] === "string" && /^ 0, routes: routes, from: ends[0] || null, to: ends[ends.length - 1] || null }; } // Where Google's own page put the view when it loaded: for an address with no // position in it, that is the area Google places you in from your connection. // ipOnly: only when the address itself gave no position. function ugfMapsAppView(ipOnly) { let st = null; try { const w = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; st = w.APP_INITIALIZATION_STATE; } catch (e) {} let v = null; try { if (st && Array.isArray(st[0]) && Array.isArray(st[0][0])) { v = st[0][0]; } else { [].some.call(document.scripts, function(sc) { const m = /APP_INITIALIZATION_STATE\s*=\s*\[\[\[\s*([-\d.eE]+)\s*,\s*([-\d.eE]+)\s*,\s*([-\d.eE]+)/.exec(sc.textContent || ""); if (m) { v = [parseFloat(m[1]), parseFloat(m[2]), parseFloat(m[3])]; return true; } return false; }); } } catch (e) {} if (!v || !isFinite(v[0]) || !isFinite(v[1]) || !isFinite(v[2]) || v[0] <= 0) { return null; } if (ugfMapsAppView.first === undefined) { ugfMapsAppView.first = /@-?\d/.test(window.location.pathname) ? "url" : "ip"; } if (ipOnly && ugfMapsAppView.first === "url") { return null; } const lat = v[2]; const lng = v[1]; // the view is given as a distance across it; turn that back into a zoom const z = Math.log(156543.03392 * Math.cos(lat * Math.PI / 180) * 768 * 4.35 / v[0]) / Math.LN2; return { lat: lat, lng: lng, z: Math.max(3, Math.min(17, Math.round(z))) }; } function ugfMapsToast(shell, text) { let t = shell.querySelector("#ugf-maps-toast"); if (!t) { t = document.createElement("div"); t.id = "ugf-maps-toast"; shell.appendChild(t); } t.textContent = text; t.classList.add("on"); clearTimeout(ugfMapsToast.t); ugfMapsToast.t = setTimeout(function() { t.classList.remove("on"); }, 4000); } // ---- the page -------------------------------------------------------------- function ugfMapsEsc(s) { return String(s === undefined || s === null ? "" : s).replace(/[&<>"']/g, function(c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } function ugfMapsSearchUrl(q, v) { return "https://www.google.com/maps/search/" + encodeURIComponent(q).replace(/%20/g, "+") + "/@" + v.lat.toFixed(6) + "," + v.lng.toFixed(6) + "," + v.z + "z"; } // A place as directions want it: its name and address when it has them (which // reads well in the box and finds the right spot), otherwise its position function ugfMapsDirLabel(item) { if (!item) { return ""; } if (item.name && item.name !== "Dropped pin" && item.lines && item.lines[0]) { return item.name + ", " + item.lines[0]; } return item.lat.toFixed(6) + "," + item.lng.toFixed(6); } function ugfMapsDirUrl(item, from) { const enc = function(t) { return encodeURIComponent(t).replace(/%20/g, "+").replace(/%2C/g, ","); }; const label = ugfMapsDirLabel(item); return "https://www.google.com/maps/dir/" + (from ? enc(label) + "/" : "/" + enc(label)); } function ugfMapsStreetUrl(lat, lng) { return "https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=" + lat.toFixed(6) + "," + lng.toFixed(6); } // A Street View address, in any of its spellings: // /maps/@lat,lng,3a,75y,210h,90t/data=!3m6!1e1!3m4!1s!2e0... // /maps/@?api=1&map_action=pano&viewpoint=lat,lng&heading=&pitch=&pano= // the old ?layer=c&cbll=lat,lng&cbp=12,heading,,zoom,pitch function ugfMapsStreetFromUrl() { const href = window.location.href; let path = window.location.pathname || ""; try { path = decodeURIComponent(path); } catch (e) {} const qs = window.location.search || ""; const q = function(k) { const m = qs.match(new RegExp("[?&]" + k + "=([^&]*)")); try { return m ? decodeURIComponent(m[1]) : ""; } catch (e) { return ""; } }; const num = function(v, d) { const n = parseFloat(v); return isFinite(n) ? n : d; }; let m = path.match(/@(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?),[\d.]+a(?:,([\d.]+)y)?(?:,(-?[\d.]+)h)?(?:,(-?[\d.]+)t)?/); if (m) { // photos (!1e2), satellite (!1e3) and the like are not Street View if (/!1e[02-9]\b/.test(href) && !/!1e1\b/.test(href)) { return null; } const pano = (href.match(/!1s([\w-]{10,})!2e0/) || [])[1] || ""; return { lat: num(m[1], 0), lng: num(m[2], 0), heading: num(m[4], 0), pitch: m[5] ? num(m[5], 90) - 90 : 0, pano: pano }; } if (/[?&]map_action=pano\b/.test(qs)) { m = q("viewpoint").match(/(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)/); if (!m && !q("pano")) { return null; } return { lat: m ? num(m[1], 0) : 0, lng: m ? num(m[2], 0) : 0, heading: num(q("heading"), 0), pitch: num(q("pitch"), 0), pano: q("pano").replace(/[^\w-]/g, "") }; } m = q("cbll").match(/(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)/); if (m) { const cbp = q("cbp").split(","); return { lat: num(m[1], 0), lng: num(m[2], 0), heading: num(cbp[1], 0), pitch: -num(cbp[4], 0), pano: q("panoid").replace(/[^\w-]/g, "") }; } return null; } // ---- Street View, inside Gplex -------------------------------------------------- // Google's own panorama viewer (the one Google hands out for embedding, keyless and // on www.google.com itself) opens in the map, as Street View did from 2008 on: // in the map pane beside the results on classic Maps, over the whole page from the // new Maps of 2013. Its present-day overlays are taken off; the panorama, the // arrows to walk along and Google's attribution stay. function ugfMapsStreetEmbedUrl(lat, lng, at) { at = at || {}; const f = function(n) { return (Math.round((n || 0) * 100) / 100).toString(); }; const tail = "!2m2!1d" + lat.toFixed(6) + "!2d" + lng.toFixed(6) + "!3f" + f(at.heading) + "!4f" + f(at.pitch) + "!5f0.7820865974627469"; return "https://www.google.com/maps/embed?origin=mfe&pb=" + (at.pano ? "!6m8!1m7!1s" + at.pano + tail : "!6m7!1m6" + tail); } function ugfMapsStreetView(shell, era, lat, lng, name, at) { const modern = ["m2014", "m2015", "m2019", "m2022"].indexOf(era) > -1; const old = shell.querySelector("#ugf-maps-sv"); if (old) { old.remove(); } const sv = document.createElement("div"); sv.id = "ugf-maps-sv"; sv.setAttribute("era", era); const where = lat.toFixed(6) + ", " + lng.toFixed(6); const title = name && name !== "Dropped pin" ? name : "Street View"; const bar = modern ? '' : ''; sv.innerHTML = trusted_policy.createHTML(bar + ''); sv.querySelector(".t").textContent = title; sv.querySelector(".c").textContent = where; const frame = sv.querySelector("iframe"); frame.src = ugfMapsStreetEmbedUrl(lat, lng, at); // take Google's present-day overlays off the viewer once it has drawn them const hide = [".gm-iv-address", ".gm-iv-container", ".gm-fullscreen-control", ".gm-iv-profile-link", 'button[title="Keyboard shortcuts"]', 'button[aria-label="Keyboard shortcuts"]']; if (era !== "m2019" && era !== "m2022") { // the round compass and the dark zoom buttons came with the 2018 Maps hide.push(".gm-bundled-control", ".gm-compass", ".gmnoprint.gm-bundled-control-on-bottom"); } // where you are standing, as Google's viewer names it (it follows you as you walk) const named = !!(name && name !== "Dropped pin"); const follow = function() { try { const d = frame.contentDocument; const a = d && d.querySelector(".gm-iv-short-address-description"); const b = d && d.querySelector(".gm-iv-long-address-description"); const t1 = a ? a.textContent.trim() : ""; const t2 = b ? b.textContent.trim() : ""; if (t1 && !named) { sv.querySelector(".t").textContent = t1; sv.querySelector(".c").textContent = t2 || where; } else if (t1 && named) { sv.querySelector(".c").textContent = t1 + (t2 ? ", " + t2 : ""); } } catch (e) {} }; // the copyright line carries the period's year, as the map's own small print does const year = ugfMapsYear(); let yearWatch = null; const dateIt = function() { try { const d = frame.contentDocument; if (!d || !d.body) { return; } d.querySelectorAll(".gm-style-cc span, .gm-style-cc a, .gm-style-cc div").forEach(function(el) { [].forEach.call(el.childNodes, function(n) { if (n.nodeType === 3 && /\u00a9\s*(19|20)\d\d/.test(n.nodeValue)) { const v = n.nodeValue.replace(/(\u00a9\s*)(19|20)\d\d/g, "$1" + year); if (v !== n.nodeValue) { n.nodeValue = v; } } }); }); if (!yearWatch) { yearWatch = new MutationObserver(dateIt); yearWatch.observe(d.body, { childList: true, subtree: true, characterData: true }); } } catch (e) {} }; const walk = setInterval(function() { if (!sv.isConnected) { clearInterval(walk); if (yearWatch) { yearWatch.disconnect(); } return; } follow(); dateIt(); }, 1000); frame.addEventListener("load", dateIt); // zoom, as the period's own buttons, working Google's (hidden) ones const press = function(label) { try { const d = frame.contentDocument; const bt = d && (d.querySelector('button[aria-label="' + label + '"]') || d.querySelector('button[title="' + label + '"]')); if (bt) { bt.click(); } } catch (e) {} }; if (modern && era !== "m2019" && era !== "m2022") { const K = ugfMapsArt().kit; const z = document.createElement("div"); z.className = "ugf-maps-ctl zoom15 svzoom"; z.innerHTML = trusted_policy.createHTML(''); z.querySelector(".zi").addEventListener("click", function() { press("Zoom in"); }); z.querySelector(".zo").addEventListener("click", function() { press("Zoom out"); }); sv.appendChild(z); } const dress = function() { try { const d = frame.contentDocument; if (!d || !d.head || d.getElementById("ugf-sv-css")) { return; } const st = d.createElement("style"); st.id = "ugf-sv-css"; st.textContent = hide.join(", ") + " { display: none !important; }"; d.head.appendChild(st); } catch (e) {} }; frame.addEventListener("load", dress); let tries = 0; const again = setInterval(function() { dress(); if (++tries > 20 || !sv.isConnected) { clearInterval(again); } }, 250); const close = function(ev) { if (ev) { ev.preventDefault(); } sv.remove(); document.removeEventListener("keydown", onKey, true); // opened from a Street View address: the address becomes the map's again, // so a reload comes back to the map if (ugfMapsStreetFromUrl()) { try { history.replaceState(null, "", "/maps/@" + lat.toFixed(7) + "," + lng.toFixed(7) + ",17z"); } catch (e) {} } }; const onKey = function(ev) { if (ev.key === "Escape") { close(ev); } }; document.addEventListener("keydown", onKey, true); sv.querySelector(".back").addEventListener("click", close); (modern ? shell : (shell.querySelector("#ugf-maps-mapwrap") || shell)).appendChild(sv); ugfMapsTranslate(sv); return sv; } // Pegman: click him for Street View where the map is centred, or drag him onto the // map and let go where you want to stand function ugfMapsPegman(el, map, open) { const A = ugfMapsArt(); let drag = null; el.addEventListener("pointerdown", function(ev) { if (ev.button !== 0) { return; } ev.preventDefault(); ev.stopPropagation(); drag = { sx: ev.clientX, sy: ev.clientY, moved: false, ghost: null }; try { el.setPointerCapture(ev.pointerId); } catch (e) {} }); el.addEventListener("pointermove", function(ev) { if (!drag) { return; } if (!drag.moved && Math.abs(ev.clientX - drag.sx) + Math.abs(ev.clientY - drag.sy) > 4) { drag.moved = true; const g = document.createElement("img"); g.src = A.pegfly; g.alt = ""; g.id = "ugf-maps-pegfly"; document.documentElement.appendChild(g); drag.ghost = g; } if (drag.ghost) { // held by the head, feet where the pointer is drag.ghost.style.left = (ev.clientX - 13) + "px"; drag.ghost.style.top = (ev.clientY - 33) + "px"; } }); const end = function(ev) { if (!drag) { return; } const d = drag; drag = null; if (d.ghost) { d.ghost.remove(); } if (ev.type === "pointercancel") { return; } if (!d.moved) { const v = map.view(); open(v.lat, v.lng); return; } const r = map.el.getBoundingClientRect(); const x = ev.clientX - r.left; const y = ev.clientY - r.top; if (x < 0 || y < 0 || x > r.width || y > r.height) { return; // let go off the map: nothing happens, as on Maps } const ll = map.screenToLatLng(x, y); open(ll.lat, ll.lng); }; el.addEventListener("pointerup", end); el.addEventListener("pointercancel", end); el.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); }); el.style.touchAction = "none"; } function ugfMapsScale(map) { const mpp = map.metersPerPixel(); const us = /^en-(US|LR|MM)$/i.test(navigator.language || "") || /^en$/i.test(navigator.language || ""); const nice = function(max, units) { for (let i = units.length - 1; i >= 0; i--) { if (units[i][0] <= max) { return units[i]; } } return units[0]; }; if (us) { const ft = mpp * 3.28084 * 90; const u = ft < 5280 ? nice(ft, [[10, "10 ft"], [20, "20 ft"], [50, "50 ft"], [100, "100 ft"], [200, "200 ft"], [500, "500 ft"], [1000, "1000 ft"], [2000, "2000 ft"]]) : nice(ft / 5280, [[0.5, "0.5 mi"], [1, "1 mi"], [2, "2 mi"], [5, "5 mi"], [10, "10 mi"], [20, "20 mi"], [50, "50 mi"], [100, "100 mi"], [200, "200 mi"], [500, "500 mi"], [1000, "1000 mi"], [2000, "2000 mi"]]); const px = ft < 5280 ? u[0] / 3.28084 / mpp : u[0] * 1609.344 / mpp; return { px: Math.round(px), label: u[1] }; } const mm = mpp * 90; const u = mm < 1000 ? nice(mm, [[5, "5 m"], [10, "10 m"], [20, "20 m"], [50, "50 m"], [100, "100 m"], [200, "200 m"], [500, "500 m"]]) : nice(mm / 1000, [[1, "1 km"], [2, "2 km"], [5, "5 km"], [10, "10 km"], [20, "20 km"], [50, "50 km"], [100, "100 km"], [200, "200 km"], [500, "500 km"], [1000, "1000 km"], [2000, "2000 km"]]); const px = mm < 1000 ? u[0] / mpp : u[0] * 1000 / mpp; return { px: Math.round(px), label: u[1] }; } function ugfMapsIdentity() { let name = ""; try { name = typeof GM_getValue === "function" ? String(GM_getValue("UGF_USERNAME", "") || "") : ""; } catch (e) {} const a = document.querySelector('a[aria-label*="@"]'); // the Maps page names the account too, the way Gmail's does name = name || ugfGmailIdentity().name || ""; const signedIn = !!a || !!name; return { name: name.split(" ")[0] || "", signedIn: signedIn }; } // The Google bar, one per period, as Gplex draws it on google.com function ugfMapsGbar(era) { const who = ugfMapsIdentity(); const esc = ugfMapsEsc; // late 2012 to 2013: the +You bar (bold links, +Name first, nothing on the right) const lay = String(layout || ""); const plusBar = lay === "2013"; const dark = era === "m2011" || plusBar; const apps = dark ? [["Search", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], ["Maps", ""], ["Play", "https://play.google.com/"], ["YouTube", "https://www.youtube.com/"], ["News", "https://news.google.com/"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"], ["Drive", "https://drive.google.com/"], ["Calendar", "https://calendar.google.com/"]].filter(ugfDvGbarKeep) : [["Web", "https://www.google.com/"], ["Images", "https://www.google.com/imghp"], [era === "m2010" ? "Videos" : "Video", "https://www.google.com/videohp"], ["Maps", ""], ["News", "https://news.google.com/"], ["Shopping", "https://www.google.com/shopping"], ["Gmail", "https://mail.google.com/"], [ugfDocsLabel(), "https://docs.google.com/document/"]].filter(ugfDvGbarKeep); // Late 2012-2013 (layout 2013, not the legacy 2013L) is the +You bar: +Name leads // the links, the current product is just the white highlight, and the right side // is only the gear - the name / count / Share / photo block sits in the header. const late = plusBar; let links = late ? '+' + esc(ugfGmailPlusName()) + "" : ""; apps.forEach(function(a) { links += a[1] ? '' + esc(a[0]) + "" : '' + esc(a[0]) + ""; }); links += '' + (dark ? "More" : "more") + " ▾"; const right = late ? "" : era === "m2011" ? (who.name ? '' + esc(who.name) + "" : 'Sign in') : 'iGoogle|' + 'Search settings|' + (who.name ? '' + esc(who.name) + "" : 'Sign in'); return '
' + '
' + links + '
' + right + "
"; } // The header account block of the +You years, as Gplex draws it on Gmail and // Search: +Name, the notification count, Share, then the photo with a caret. // 2014 slots the app launcher in after the name. Signed out, it is Sign in. function ugfMapsAccount(withApps) { const esc = ugfMapsEsc; const id = ugfGmailIdentity(); if (!id.name && !id.email && !ugfMapsIdentity().signedIn) { return ''; } return ''; } function ugfMapsMain() { const era = ugfMapsEra(); const A = ugfMapsArt(); const K = A.kit; const esc = ugfMapsEsc; const year = ugfMapsYear(); const url = ugfMapsParseUrl(); console.log("[Gplex] Maps: layout " + layout + " (" + era + ")" + (UGF_VERSION ? " - Gplex " + UGF_VERSION : "")); const style = document.createElement("style"); style.id = "ugf-maps-styles"; style.textContent = ugfMapsCss(); (document.head || document.documentElement).appendChild(style); document.documentElement.setAttribute("gplex-maps", era); ugfMapsSetFavicon(); const shell = document.createElement("div"); shell.id = "ugf-maps"; shell.setAttribute("era", era); const classic = ["m2005", "m2006", "m2007", "m2010", "m2011"].indexOf(era) > -1; let searchVal = url.kind === "search" ? url.q : (url.kind === "place" ? url.name : ""); let html = ""; if (era === "m2005" || era === "m2006") { html = '
' + '' + '' + '
' + '
Maps
' + '
'; } else if (era === "m2007" || era === "m2010" || era === "m2011") { const logo = era === "m2007" ? 'Google Maps' : (era === "m2010" ? 'Google maps' : ugfMapsHeadLogo()); const btn = era === "m2011" ? '' : '"; html = ugfMapsGbar(era) + '
" + '
' + btn + (era === "m2011" ? "" : 'Show search options') + "
" + (era === "m2011" && String(layout || "") === "2013" ? ugfMapsAccount(false) : "") + "
" + '
' + (era === "m2011" ? "" : '') + '
'; } else { // 2014 onward: the map fills the window and everything floats on it const newer = era === "m2019" || era === "m2022"; html = '
' + '
' + (era === "m2014" ? "" : '') + '' + (era === "m2014" ? '' : '' + '') + "
" + (newer ? '
' : "") + '
' + '
' + (era === "m2014" ? "" : '') + (era === "m2014" ? ugfMapsAccount(true) // 2015 on: the account is the round photo, as on Search and Gmail : ugfMapsIdentity().signedIn && (ugfGmailIdentity().name || ugfGmailIdentity().email) ? '' + ugfGmailAvatar() + "" : '') + "
" + '
'; } shell.innerHTML = trusted_policy.createHTML(html); document.body.appendChild(shell); // ---- the map itself let knownView = false; let start = { lat: 39.5, lng: -98.35, z: era === "m2005" || era === "m2006" ? 3 : 4 }; try { const saved = JSON.parse(localStorage.getItem("UGF_MAPS_VIEW") || "null"); if (saved && isFinite(saved.lat)) { start = saved; knownView = true; } } catch (e) {} // no position in the address and none saved: start where Google itself // placed you (it goes by your connection) ugfMapsAppView.first = /@-?\d/.test(window.location.pathname) ? "url" : "ip"; if (url.lat === undefined && !knownView) { const av = ugfMapsAppView(true); if (av) { start = av; knownView = true; } } if (url.lat !== undefined) { start = { lat: url.lat, lng: url.lng, z: url.z }; } const host = shell.querySelector("#ugf-maps-map"); const map = ugfMapsCreate(host, start); map.setView(start.lat, start.lng, start.z); if (!knownView && url.lat === undefined) { // Google's page may still be on its way in: take its view when it lands, // unless the map has been moved by then let tries = 0; const iv = setInterval(function() { const cur = map.view(); if (++tries > 25 || Math.abs(cur.lat - start.lat) > 1e-4 || cur.z !== start.z) { clearInterval(iv); return; } const av = ugfMapsAppView(true); if (av) { clearInterval(iv); map.setView(av.lat, av.lng, av.z); } }, 200); } ugfMapsControls(shell, map, era); // a Street View address opens straight into Street View, the map waiting behind it if (url.street) { ugfMapsStreetView(shell, era, url.street.lat, url.street.lng, "", url.street); } // keep the address in step with the map, as Maps does, without disturbing // whatever place or search the app below is showing let urlTimer = 0; map.onMove(function() { clearTimeout(urlTimer); urlTimer = setTimeout(function() { const v = map.view(); const at = "@" + v.lat.toFixed(7) + "," + v.lng.toFixed(7) + "," + v.z + "z"; try { localStorage.setItem("UGF_MAPS_VIEW", JSON.stringify({ lat: v.lat, lng: v.lng, z: v.z })); } catch (e) {} const p = window.location.pathname; let next = /@[^/]*/.test(p) ? p.replace(/@[^/]*/, at) : (/\/data=/.test(p) ? p.replace(/\/data=/, "/" + at + "/data=") : p.replace(/\/?$/, "/" + at)); if (!/^\/maps/.test(next)) { next = "/maps/" + at; } try { history.replaceState(history.state, "", next + (window.location.search || "")); } catch (e) {} }, 400); }); // ---- results const panel = shell.querySelector("#ugf-maps-panel"); const card = shell.querySelector("#ugf-maps-card"); let results = []; let markers = []; let iw = null; const closeIw = function() { if (iw) { map.removeMarker(iw); iw = null; } if (card) { card.innerHTML = ugfTT(""); card.classList.remove("on"); } }; const itemActions = function(it) { return '
Directions' + (classic ? ' - From here' : "") + ' - Search nearby' + (it.web ? ' - Website' : "") + "
"; }; const showItem = function(it, i) { closeIw(); markers.forEach(function(mk, j) { mk.el.classList.toggle("sel", j === i); }); if (classic) { // the info window: Google's own bubble, cut from its sprite const el = document.createElement("div"); el.className = "ugf-maps-iw"; el.innerHTML = trusted_policy.createHTML('
Close' + '
' + esc(it.name) + "
" + it.lines.map(function(l) { return '
' + esc(l) + "
"; }).join("") + itemActions(it) + '
'); iw = map.addMarker({ lat: it.lat, lng: it.lng, el: el, ax: 38, ay: 200 }); el.querySelector(".x").addEventListener("click", closeIw); // the anchor depends on how tall the bubble came out requestAnimationFrame(function() { iw.ay = el.offsetHeight + 85 + 32; map.redraw(); }); } else if (card) { const t = map.project(it.lat, it.lng, 17); const n = Math.pow(2, 17); const thumb = ugfMapsTileUrl("s", ((Math.floor(t.x / 256) % n) + n) % n, Math.floor(t.y / 256), 17); card.innerHTML = trusted_policy.createHTML('
' + '
' + esc(it.name) + "
" + (it.lines[0] ? '
' + esc(it.lines[0]) + "
" : "") + '
' + it.lat.toFixed(6) + ", " + it.lng.toFixed(6) + "
" + '' + 'Close'); card.classList.add("on"); card.querySelector(".x").addEventListener("click", closeIw); card.querySelector(".thumb").title = "Street View"; card.querySelector(".thumb").addEventListener("click", function() { ugfMapsStreetView(shell, era, it.lat, it.lng, it.name); }); } }; const markerFor = function(it, i) { const el = document.createElement("img"); el.className = "ugf-maps-marker"; let ax = 10; let ay = 34; if (classic) { el.src = i < 10 ? A["marker" + "ABCDEFGHIJ".charAt(i)] : A.marker; } else { el.src = A.spot; ax = 11; ay = 40; } el.alt = it.name; el.title = it.name; el.addEventListener("click", function(ev) { ev.stopPropagation(); showItem(it, i); }); return map.addMarker({ lat: it.lat, lng: it.lng, el: el, ax: ax, ay: ay }); }; const letter = function(i) { return i < 10 ? "ABCDEFGHIJ".charAt(i) : ""; }; const renderPanel = function(state) { if (!panel) { return; } let h = ""; if (state === "searching") { h = '
Searching…
'; } else if (state === "none") { h = '
We could not find ' + esc(searchVal) + ".
" + '
Check the spelling, or try a different search.
'; } else if (results.length) { if (classic) { h = '
' + (results.length === 1 ? "" : "Results 1-" + results.length) + "
"; } results.forEach(function(it, i) { h += '
' + (classic ? '' : "") + '
' + esc(it.name) + "" + it.lines.map(function(l) { return '
' + esc(l) + "
"; }).join("") + (classic ? itemActions(it) : "") + "
"; }); } else if (era === "m2005" || era === "m2006") { h = '' + '
Example searches
' + '
Go to a location:
' + '
' + '
' + '
Find a business:
' + '
' + '
' + '
Get directions:
' + '
' + '
' + '

Drag the map with your mouse, or double-click to center.

'; } else if (classic) { h = '" + '

Search for places, addresses and businesses - try coffee, ' + 'San Francisco or hotels near LAX.

'; } panel.innerHTML = trusted_policy.createHTML(h); panel.classList.toggle("on", !!h); panel.querySelectorAll(".res").forEach(function(r) { r.addEventListener("click", function(ev) { if (ev.target.closest(".acts a")) { return; } ev.preventDefault(); const i = parseInt(r.getAttribute("data-i"), 10); const it = results[i]; map.panTo(it.lat, it.lng); showItem(it, i); }); }); panel.querySelectorAll("form[data-q]").forEach(function(f) { f.addEventListener("submit", function(ev) { ev.preventDefault(); const q = f.querySelector("input").value; if (f.getAttribute("data-dir")) { const parts = q.split(/\s+to\s+/i); openDir(parts[0], parts.slice(1).join(" to "), 0); return; } runSearch(q); }); }); panel.querySelectorAll("a[data-try]").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); runSearch(a.getAttribute("data-try")); }); }); ugfMapsLinks(panel, map); ugfMapsTranslate(shell); }; const showResults = function(res) { results = res.items || []; markers.forEach(function(mk) { map.removeMarker(mk); }); markers = results.map(markerFor); renderPanel(res.kind === "none" ? "none" : "list"); if (results.length) { map.fit(results); if (results.length === 1) { showItem(results[0], 0); } } }; const mapSize = function() { return { w: host.clientWidth || window.innerWidth, h: host.clientHeight || window.innerHeight }; }; // Google's app below is the fallback: read whatever it comes up with const harvest = function() { ugfMapsHarvest(function(res) { if (res.kind === "none" && url.pin) { return; // the address already told us where it is } showResults(res); }); }; let searchSeq = 0; let pointer = null; // A search typed here stays here: the list comes from Gplex's own request and // the address bar is updated in place, so the page never reloads. const runSearch = function(q, plain) { q = String(q || "").trim(); if (!q) { return; } // "seattle to 98109": directions, as Maps always read it const trip = plain ? null : q.match(/^\s*(?:from\s+)?(.+?)\s+to\s+(.+?)\s*$/i); if (trip && trip[1].length > 1 && trip[2].length > 1) { openDir(trip[1], trip[2], 0, q); return; } if (dir) { dir = null; dirSeq++; clearDirMap(); showDirUi(false); } const seq = ++searchSeq; const v = map.view(); searchVal = q; shell.querySelector("#ugf-maps-q").value = q; closeIw(); if (pointer) { map.removeMarker(pointer); pointer = null; } results = []; markers.forEach(function(mk) { map.removeMarker(mk); }); markers = []; renderPanel("searching"); try { history.pushState({ ugfMaps: q }, "", ugfMapsSearchUrl(q, v).replace(/^https:\/\/www\.google\.com/, "")); } catch (e) {} ugfMapsFetch(q, v, mapSize(), function(res) { if (seq !== searchSeq) { return; } if (!res) { window.location.href = ugfMapsSearchUrl(q, v); return; } showResults(res); }); }; // ---- directions: Gplex's own, from Google's route service, drawn on this map const DIR_MODES = { 0: { icon: "directions_car", by: "By car", word: "Driving" }, 3: { icon: "directions_transit", by: "By public transit", word: "Transit" }, 2: { icon: "directions_walk", by: "Walking", word: "Walking" }, 1: { icon: "directions_bike", by: "Bicycling", word: "Bicycling" } }; // what each period offered: driving only at first, walking from 2008, then // transit and cycling const dirModes = era === "m2005" || era === "m2006" ? [0] : (era === "m2007" ? [0, 2] : [0, 3, 2, 1]); let dir = null; let dirSeq = 0; let dirMarks = []; const dirIcon = function(end) { if (era === "m2005" || era === "m2006" || era === "m2007") { return { src: end ? A.ddEnd : A.ddStart, ax: 10, ay: 34 }; } if (classic) { return { src: end ? A.greenB : A.greenA, ax: 10, ay: 34 }; } return end ? { src: A.spot, ax: 11, ay: 40 } : { src: A.ddVia, ax: 5, ay: 5 }; }; const dirLine = function(sel, mode) { if (classic) { return sel ? [{ color: "#0000ff", width: 5, opacity: 0.5 }] : null; } const modern = era === "m2019" || era === "m2022"; const core = modern ? "#4285f4" : "#00b3fd"; const edge = modern ? "#1967d2" : "#0a7fc4"; if (!sel) { return [{ color: "#8e9093", width: 9 }, { color: "#bcbfc2", width: 6 }]; } if (mode === 2) { return [{ color: core, width: 8, dash: "0 12" }]; // on foot: a line of dots } return [{ color: edge, width: 9 }, { color: core, width: 6 }]; }; const clearDirMap = function() { map.setRoutes([]); dirMarks.forEach(function(mk) { map.removeMarker(mk); }); dirMarks = []; }; const drawDir = function() { clearDirMap(); if (!dir || !dir.res || !dir.res.ok) { return; } const list = []; dir.res.routes.forEach(function(r, i) { if (i === dir.sel) { return; } const ly = dirLine(false, dir.mode); if (ly) { list.push({ pts: r.path, layers: ly, onclick: function() { dir.sel = i; dir.details = false; drawDir(); renderDir(); } }); } }); list.push({ pts: dir.res.routes[dir.sel].path, layers: dirLine(true, dir.mode) }); map.setRoutes(list); [dir.res.from, dir.res.to].forEach(function(p, end) { if (!p) { return; } const ic = dirIcon(end === 1); const el = document.createElement("img"); el.className = "ugf-maps-marker"; el.src = ic.src; el.alt = p.name || ""; el.title = p.name || ""; dirMarks.push(map.addMarker({ lat: p.lat, lng: p.lng, el: el, ax: ic.ax, ay: ic.ay })); }); }; const fitDir = function() { const pts = dir && dir.res && dir.res.ok ? dir.res.routes[dir.sel].path : []; if (!pts.length) { return; } let a = { lat: 90, lng: 180 }; let b = { lat: -90, lng: -180 }; pts.forEach(function(p) { a = { lat: Math.min(a.lat, p.lat), lng: Math.min(a.lng, p.lng) }; b = { lat: Math.max(b.lat, p.lat), lng: Math.max(b.lng, p.lng) }; }); map.fit([a, b], classic ? 40 : 80); if (!classic && map.el.clientWidth > 900) { // keep the route clear of the directions card on the left const c = map.screenToLatLng(map.el.clientWidth / 2 - 200, map.el.clientHeight / 2); map.setView(c.lat, c.lng, map.view().z); } }; // "Your location" (or "My location"): ask the browser where we are const isHere = function(t) { return /^\s*(your|my|current)\s+location\s*$/i.test(String(t || "")); }; const resolvePlace = function(t, cb) { if (!isHere(t)) { cb(String(t || "").trim()); return; } try { navigator.geolocation.getCurrentPosition(function(p) { cb(p.coords.latitude.toFixed(6) + "," + p.coords.longitude.toFixed(6)); }, function() { cb(null); }, { timeout: 15000, maximumAge: 60000 }); } catch (e) { cb(null); } }; const dirPath = function() { const enc = function(t) { return encodeURIComponent(t).replace(/%20/g, "+").replace(/%2C/g, ","); }; const v = map.view(); return "/maps/dir/" + enc(dir.from) + "/" + enc(dir.to) + "/@" + v.lat.toFixed(7) + "," + v.lng.toFixed(7) + "," + v.z + "z" + "/data=!4m2!4m1!3e" + dir.mode; }; // the page's own directions request, when this page was opened as directions let dirPreload = null; if (url.kind === "dir") { const ln = document.querySelector('link[href*="/maps/preview/directions"]'); dirPreload = ln ? ln.getAttribute("href") : null; } const dirKey = function() { const enc = function(t) { return encodeURIComponent(t).replace(/%20/g, "+").replace(/%2C/g, ","); }; return "/maps/dir/" + enc(dir.from) + "/" + enc(dir.to) + "/data=!4m2!4m1!3e" + dir.mode; }; const runDir = function(push) { if (!dir) { return; } dir.from = String(dir.from || "").trim(); dir.to = String(dir.to || "").trim(); if (!dir.from || !dir.to) { dir.status = "form"; renderDir(true); return; } const seq = ++dirSeq; dir.status = "loading"; dir.res = null; dir.sel = 0; dir.details = false; clearDirMap(); renderDir(false); if (push !== false) { try { history.pushState({ ugfMaps: "dir" }, "", dirPath()); } catch (e) {} } resolvePlace(dir.from, function(f) { resolvePlace(dir.to, function(t) { if (seq !== dirSeq || !dir) { return; } if (!f || !t) { dir.status = "noloc"; renderDir(false); return; } // the first run on a directions page uses the request Google's own // page made for it; after that, Gplex asks itself let pre = dirPreload; dirPreload = null; // only when it asked for the same way of travelling (with no mode in // the address, Google's page asks for "best", which mixes them) if (pre) { let pm = null; try { pm = decodeURIComponent(pre).match(/!20m5!1e(\d+)!/); } catch (e) {} if (!pm || parseInt(pm[1], 10) !== dir.mode) { pre = null; } } const ask = pre ? function(f2, t2, m2, v2, sz2, cb) { ugfMapsGetRoute(pre, function(r2, why2) { if (r2) { cb(r2, why2); } else { ugfMapsRoute(f2, t2, m2, v2, sz2, cb); } }); } : ugfMapsRoute; ask(f, t, dir.mode, map.view(), mapSize(), function(res, why) { if (seq !== dirSeq || !dir) { return; } const tryKey = dirKey(); if (!res) { // Gplex's own request did not get through: load the directions // page itself once, and read the request Google's page makes let tried = ""; try { tried = sessionStorage.getItem("UGF_MAPS_DIRTRY") || ""; } catch (e) {} if (tried !== tryKey && !isHere(dir.from) && !isHere(dir.to)) { try { sessionStorage.setItem("UGF_MAPS_DIRTRY", tryKey); } catch (e) {} window.location.href = "https://www.google.com" + tryKey; return; } } else { try { sessionStorage.removeItem("UGF_MAPS_DIRTRY"); } catch (e) {} } dir.why = why || ""; if (res && !res.ok && dir.fallbackQ) { // "pizza to go" is a search, not a trip const q = dir.fallbackQ; closeDir(); runSearch(q, true); return; } dir.res = res; dir.status = !res ? "error" : (res.ok ? "ok" : "none"); if (res && res.ok) { drawDir(); fitDir(); } renderDir(false); }); }); }); }; const openDir = function(from, to, mode, fallbackQ, push) { closeIw(); if (pointer) { map.removeMarker(pointer); pointer = null; } results = []; markers.forEach(function(mk) { map.removeMarker(mk); }); markers = []; mode = parseInt(mode, 10) || 0; dir = { from: from || "", to: to || "", mode: dirModes.indexOf(mode) > -1 ? mode : 0, res: null, sel: 0, status: "form", details: false, fallbackQ: fallbackQ || "" }; showDirUi(true); if (dir.from && dir.to) { runDir(push); } else { renderDir(true); } }; const closeDir = function() { dir = null; dirSeq++; clearDirMap(); showDirUi(false); renderPanel("idle"); const v = map.view(); try { history.replaceState(null, "", "/maps/@" + v.lat.toFixed(7) + "," + v.lng.toFixed(7) + "," + v.z + "z"); } catch (e) {} }; const showDirUi = function(on) { const omni = shell.querySelector("#ugf-maps-omni"); if (!omni) { return; // the older pages keep it all in the side panel } let box = omni.querySelector("#ugf-maps-dirbox"); if (on && !box) { box = document.createElement("div"); box.id = "ugf-maps-dirbox"; omni.insertBefore(box, omni.firstChild); } if (!on && box) { box.remove(); } omni.classList.toggle("dir", !!on); }; const icon = function(n) { return '' + (A.mi[n] || "") + ""; }; const dirStatus = function() { if (!dir) { return ""; } if (dir.status === "loading") { return '
Loading…
'; } if (dir.status === "noloc") { return '
Your location could not be determined.
' + '
Allow this page to use your location, or type a starting point.
'; } if (dir.status === "error") { return '
Directions could not be loaded right now.
Please try again.' + (dir.why ? ' (' + esc(dir.why) + ")" : "") + "
"; } if (dir.status === "none") { return '
We could not calculate ' + (DIR_MODES[dir.mode].word.toLowerCase()) + ' directions between ' + esc(dir.from) + ' and ' + esc(dir.to) + ".
"; } return ""; }; // the older pages: the form and the turn list in the side panel const classicDir = function() { const r = dir.res && dir.res.ok ? dir.res.routes[dir.sel] : null; const old = era === "m2005" || era === "m2006"; let modeUi = ""; if (dirModes.length > 1) { if (era === "m2011") { modeUi = '
' + dirModes.map(function(m) { return '' + icon(DIR_MODES[m].icon) + ""; }).join("") + "
"; } else { modeUi = '"; } } let h = '
' + '
' + (era === "m2011" ? "Get directions" : "Get Directions") + '' + (old ? "close" : "Close") + "
" + (era === "m2011" ? modeUi : "") + '
' + (old ? 'Start address' : 'A') + '
' + '
' + (old ? 'End address' : 'B') + '
' + '
' + (era === "m2011" ? "" : modeUi) + '' + (old ? "Reverse" : "Reverse directions") + "
" + '" + "
"; h += dirStatus(); if (r) { h += '
' + esc(DIR_MODES[dir.mode].word) + " directions to " + '' + esc((dir.res.to && dir.res.to.name) || dir.to) + "" + '
' + esc(r.dist) + (r.time ? " – about " + esc(r.time) : "") + (r.span ? " (" + esc(r.span) + ")" : "") + "
"; if (dir.res.routes.length > 1) { h += '
Suggested routes
' + dir.res.routes.map(function(x, i) { return '' + esc(x.via || "Route " + (i + 1)) + '' + esc(x.dist) + ", " + esc(x.time) + ""; }).join("") + "
"; } h += '" + r.steps.map(function(st, i) { return '"; }).join("") + '
' + esc((dir.res.from && dir.res.from.name) || dir.from) + "
' + (i + 1) + '.' + esc(st.text) + (st.note ? '
' + esc(st.note) + "
" : "") + '
' + esc(st.dist || st.time) + "
' + esc((dir.res.to && dir.res.to.name) || dir.to) + "
" + '
These directions are for planning purposes only. You may find that construction projects, traffic, weather, or other events may cause conditions to differ from the map results, and you should plan your route accordingly.
'; } return h; }; // 2014 on: the fields up top in place of the search box, the routes under them const modernBox = function() { return '
' + dirModes.map(function(m) { return '' + icon(DIR_MODES[m].icon) + ""; }).join("") + '' + icon("close") + "
" + '
"; }; const modernList = function() { let h = dirStatus(); if (dir.res && dir.res.ok) { dir.res.routes.forEach(function(r, i) { h += '
' + icon(DIR_MODES[dir.mode].icon) + '
' + esc(r.time) + '' + esc(r.dist) + "
" + '
' + (r.span ? esc(r.span) + " · " : "") + (r.via ? (r.span ? "" : "via ") + esc(r.via) : "") + "
" + (i === dir.sel ? '' + (dir.details ? "Hide details" : "Details") + "" : "") + "
"; if (i === dir.sel && dir.details) { h += '
' + r.steps.map(function(st, k) { return '
' + esc(st.text) + (st.note ? '
' + esc(st.note) + "
" : "") + '
' + esc(st.dist || st.time) + "
"; }).join("") + "
"; } }); } return h; }; const renderDir = function(focus) { if (!dir || !panel) { return; } let box = null; if (classic) { panel.innerHTML = trusted_policy.createHTML(classicDir()); panel.classList.add("on"); box = panel; } else { box = shell.querySelector("#ugf-maps-dirbox"); box.innerHTML = trusted_policy.createHTML(modernBox()); const lh = modernList(); panel.innerHTML = trusted_policy.createHTML(lh); panel.classList.toggle("on", !!lh); } const fIn = box.querySelector(".dfrom"); const tIn = box.querySelector(".dto"); const go = function() { dir.from = fIn.value; dir.to = tIn.value; dir.fallbackQ = ""; runDir(); }; [fIn, tIn].forEach(function(inp) { inp.addEventListener("input", function() { dir.from = fIn.value; dir.to = tIn.value; }); inp.addEventListener("keydown", function(ev) { if (ev.key === "Enter") { ev.preventDefault(); go(); } }); }); const gob = box.querySelector(".dgo"); if (gob) { gob.addEventListener("click", go); } box.querySelector(".dclose").addEventListener("click", function(ev) { ev.preventDefault(); closeDir(); }); box.querySelector(".dswap").addEventListener("click", function(ev) { ev.preventDefault(); const f = fIn.value; dir.from = tIn.value; dir.to = f; dir.fallbackQ = ""; runDir(); }); box.querySelectorAll(".dm").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); dir.from = fIn.value; dir.to = tIn.value; dir.mode = parseInt(a.getAttribute("data-mode"), 10) || 0; runDir(); }); }); const sel = box.querySelector(".dsel"); if (sel) { sel.addEventListener("change", function() { dir.from = fIn.value; dir.to = tIn.value; dir.mode = parseInt(sel.value, 10) || 0; runDir(); }); } panel.querySelectorAll(".alt, .rt").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); const i = parseInt(a.getAttribute("data-i"), 10); if (ev.target.closest(".det")) { dir.details = !dir.details; } else if (i !== dir.sel) { dir.sel = i; dir.details = false; drawDir(); fitDir(); } renderDir(false); }); }); panel.querySelectorAll(".st").forEach(function(tr) { tr.addEventListener("click", function() { const st = dir.res.routes[dir.sel].steps[parseInt(tr.getAttribute("data-i"), 10)]; if (st && st.at) { map.setView(st.at.lat, st.at.lng, Math.max(map.view().z, 16)); } }); }); ugfMapsTranslate(shell); if (focus) { (fIn.value ? tIn : fIn).focus(); } }; // back and forward: the page for that address, from the top window.addEventListener("popstate", function(ev) { if (ev.state && ev.state.ugfMaps !== undefined || /^\/maps/.test(window.location.pathname)) { window.location.reload(); } }); if (url.kind === "search" || url.kind === "place") { renderPanel("searching"); if (url.pin) { showResults({ kind: "place", items: [{ name: url.name || url.q, lat: url.pin.lat, lng: url.pin.lng, lines: [] }] }); } const q0 = url.kind === "search" ? url.q : url.name; const v0 = url.lat !== undefined ? { lat: url.lat, lng: url.lng, z: url.z } : map.view(); // with nowhere to search around yet (a first visit from a link like // maps?q=pizza) Google's app does it, placing it by where you are const nowhere = url.lat === undefined && !knownView; (nowhere ? function(q, v, sz, cb) { cb(null); } : ugfMapsFetch)(q0, v0, mapSize(), function(res) { if (!res) { harvest(); return; } if (url.pin) { // a place link: keep its own position, take the details of the match let best = null; let bestD = 1e9; res.items.forEach(function(it) { const d = Math.abs(it.lat - url.pin.lat) + Math.abs(it.lng - url.pin.lng); if (d < bestD) { bestD = d; best = it; } }); if (best && bestD < 0.02) { showResults({ kind: "place", items: [best] }); } return; } showResults(res); }); } else if (url.kind === "dir") { renderPanel("idle"); dir = null; setTimeout(function() { openDir(url.from, url.to, url.mode, "", false); }, 0); } else { renderPanel("idle"); } // ---- search box, chips and clicks on the map const form = shell.querySelector("#ugf-maps-form"); form.addEventListener("submit", function(ev) { ev.preventDefault(); const q = String(shell.querySelector("#ugf-maps-q").value || "").trim(); if (q) { runSearch(q); } }); shell.querySelectorAll("#ugf-maps-head .tabs a").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); if (a.getAttribute("data-tab") === "dir") { openDir("", "", 0); } else { if (dir) { closeDir(); } shell.querySelector("#ugf-maps-q").focus(); } }); }); const chips = shell.querySelector("#ugf-maps-chips"); if (chips) { ["Restaurants", "Hotels", "Things to do", "Transit", "Parking", "Pharmacies", "ATMs"].forEach(function(c) { const b = document.createElement("button"); b.type = "button"; b.textContent = c; b.addEventListener("click", function() { runSearch(c); }); chips.appendChild(b); }); } map.onClick(function(ll) { if (dir && (!String(dir.from).trim() || !String(dir.to).trim())) { const at = ll.lat.toFixed(6) + "," + ll.lng.toFixed(6); if (!String(dir.from).trim()) { dir.from = at; } else { dir.to = at; } runDir(); return; } if (classic) { closeIw(); return; } // 2014 onward: a click drops the small grey pointer and says where it is if (pointer) { map.removeMarker(pointer); pointer = null; } if (card && card.classList.contains("on")) { closeIw(); return; } const el = document.createElement("img"); el.className = "ugf-maps-marker"; el.src = K.pointer; pointer = map.addMarker({ lat: ll.lat, lng: ll.lng, el: el, ax: 10, ay: 10 }); showItem({ name: "Dropped pin", lat: ll.lat, lng: ll.lng, lines: [] }, -1); }); // any other link to a Maps search on the page ("Search nearby" and the like) // is run here too rather than reloading shell.addEventListener("click", function(ev) { const a = ev.target.closest && ev.target.closest("a[href]"); if (!a || ev.defaultPrevented || ev.button !== 0 || ev.ctrlKey || ev.metaKey || ev.shiftKey) { return; } const hr = String(a.getAttribute("href")); const dm = hr.match(/^https:\/\/www\.google\.com\/maps\/dir\/([^?#]*)/); if (dm) { ev.preventDefault(); const segs = dm[1].split("/").map(function(t) { try { return decodeURIComponent(t.replace(/\+/g, " ")); } catch (e) { return t; } }); openDir(segs[0] || "", segs[1] || "", dir ? dir.mode : 0); return; } const m = hr.match(/^https:\/\/www\.google\.com\/maps\/search\/([^/@?#]+)/); if (m) { ev.preventDefault(); runSearch(decodeURIComponent(m[1].replace(/\+/g, " "))); } }); // The account menu from the +You block (2013, 2014) or the photo (2015 on), and // the app launcher from the nine dots (2014 on) - the same menus Gplex gives // Gmail. The name on the older bars is a plain link to the Google Account page. const menuChrome = era === "m2019" || era === "m2022" ? "m2018" : "m2013"; const burger = shell.querySelector("#ugf-maps-omni .menu"); if (burger) { ugfMapsDrawer(shell, map, era, burger); } shell.querySelectorAll("#ugf-maps-account .pfpwrap, #ugf-maps-account .plusname, #ugf-maps-topright .me").forEach(function(el) { el.style.cursor = "pointer"; el.addEventListener("click", function(ev) { if (ev.button !== 0 || ev.ctrlKey || ev.metaKey || ev.shiftKey) { return; } ev.preventDefault(); ev.stopPropagation(); ugfGmailAccountMenu(el, menuChrome); }); }); shell.querySelectorAll("#ugf-maps-account .ic.grid, #ugf-maps-topright .apps").forEach(function(el) { el.addEventListener("click", function(ev) { if (ev.button !== 0 || ev.ctrlKey || ev.metaKey || ev.shiftKey) { return; } ev.preventDefault(); ev.stopPropagation(); ugfGmailAppsMenu(el, menuChrome); }); }); ugfMapsLinks(shell, map); ugfMapsTranslate(shell); } // The side menu behind the three lines (2015 on): the map layers at the top, then // your places and sharing, then the help and settings links - each period's own // set and wording. Layers switch here; the rest go where Maps sent them. function ugfMapsDrawer(shell, map, era, burger) { const A = ugfMapsArt(); const esc = ugfMapsEsc; const l = String(layout || ""); // late 2015 keeps 2015's menu, but under the new logo of September 2015 const v2015 = l === "2015" || UGF_LATE2015 || (UGF_EARLY2016 && l === "2016"); const v2022 = era === "m2022"; const icon = function(n) { return '' + (A.mi[n] || "") + ""; }; const here = function() { const v = map.view(); return { lat: v.lat.toFixed(6), lng: v.lng.toFixed(6), z: v.z }; }; const earthUrl = function() { const h = here(); const alt = Math.round(156543.03392 * Math.cos(h.lat * Math.PI / 180) / Math.pow(2, h.z) * 800); return "https://earth.google.com/web/@" + h.lat + "," + h.lng + "," + alt + "a,0d"; }; // [label, icon, action] - action is a layer, a function name or a link const layers = v2022 ? [] : [ ["Satellite", "satellite", "type:y"], ["Traffic", "traffic", "ov:traffic"], [v2015 ? "Public transit" : "Transit", "directions_bus", "ov:transit"], [v2015 ? "Bicycling" : "Biking", "directions_bike", "ov:bike"], ["Terrain", "terrain", "type:p"], ["Google Earth", "public", "earth"] ]; const yours = (v2022 ? [["Saved", "bookmark", "https://www.google.com/maps/saved"]] : [["Your places", "place", "https://www.google.com/maps/saved"]]) .concat([["Your contributions", "rate_review", "https://www.google.com/maps/contrib/"]]) .concat(era === "m2019" || v2022 ? [["Location sharing", "people", "https://www.google.com/maps?gplex=false"]] : []) .concat(v2015 ? [] : [["Your timeline", "timeline", "https://timeline.google.com/"]]) .concat([["Share or embed map", "link", "share"], ["Print", "print", "print"]]); const edit = [["Add a missing place", "", "https://support.google.com/maps/answer/6320846"]] .concat(v2015 ? [] : [["Add your business", "", "https://business.google.com/"]]) .concat([["Edit the map", "", "https://support.google.com/maps/answer/3094088"]]); const help = [["Tips and tricks", "", "https://www.google.com/maps/about/"], [v2015 ? "Help" : "Get help", "", "https://support.google.com/maps"]] .concat(v2015 ? [["Send feedback", "", "https://support.google.com/maps/answer/3094045"]] : [["Consumer information", "", "https://support.google.com/maps/answer/9057034"]]); const prefs = [["Language", "", "https://myaccount.google.com/language"], ["Search settings", "", "https://www.google.com/gplex"], [era === "m2015" && l !== "2018" && l !== "2018M" ? "History" : "Maps activity", "", "https://myactivity.google.com/product/maps"]]; const logo = v2015 && !UGF_LATE2015 && !(UGF_EARLY2016 && l === "2016") ? 'Google' : 'Google'; const scrim = document.createElement("div"); scrim.id = "ugf-maps-scrim"; const box = document.createElement("div"); box.id = "ugf-maps-drawer"; box.setAttribute("era", era); shell.appendChild(scrim); shell.appendChild(box); const row = function(r) { const act = r[2]; const isLink = /^https?:/.test(act); return '' + (r[1] ? icon(r[1]) : "") + '' + esc(r[0]) + ""; }; const group = function(rows) { return rows.length ? '
' + rows.map(row).join("") + "
" : ""; }; const paint = function() { const v = map.view(); box.innerHTML = trusted_policy.createHTML('
' + logo + 'Maps
' + '
' + group(layers) + group(yours) + group(edit) + group(help) + group(prefs) + "
"); box.querySelectorAll(".row").forEach(function(a) { const act = a.getAttribute("data-act"); const on = (act === "type:" + v.type) || (act === "ov:" + map.overlay()); a.classList.toggle("on", on); }); }; const open = function() { paint(); shell.classList.add("drawer-open"); }; const close = function() { shell.classList.remove("drawer-open"); }; burger.addEventListener("click", function(ev) { ev.preventDefault(); ev.stopPropagation(); if (shell.classList.contains("drawer-open")) { close(); } else { open(); } }); scrim.addEventListener("click", close); document.addEventListener("keydown", function(ev) { if (ev.key === "Escape") { close(); } }); box.addEventListener("click", function(ev) { const a = ev.target.closest && ev.target.closest(".row"); if (!a) { return; } const act = a.getAttribute("data-act"); if (/^https?:/.test(act)) { return; // an ordinary link } ev.preventDefault(); const v = map.view(); if (act.indexOf("type:") === 0) { const t = act.slice(5); map.setType(v.type === t ? "m" : t); paint(); return; // the menu stays open, so a second layer can be picked } if (act.indexOf("ov:") === 0) { const o = act.slice(3); map.setOverlay(map.overlay() === o ? "" : o); paint(); return; } close(); if (act === "earth") { window.open(earthUrl(), "_blank"); } else if (act === "print") { setTimeout(function() { window.print(); }, 50); } else if (act === "share") { const h = here(); try { window.prompt("Link to share", "https://www.google.com/maps/@" + h.lat + "," + h.lng + "," + h.z + "z"); } catch (e) {} } }); } // Print / Send / Link on the older pages function ugfMapsLinks(root, map) { root.querySelectorAll("a[data-link]").forEach(function(a) { if (a._wired) { return; } a._wired = true; a.addEventListener("click", function(ev) { ev.preventDefault(); const what = a.getAttribute("data-link"); const v = map.view(); const link = "https://www.google.com/maps/@" + v.lat.toFixed(6) + "," + v.lng.toFixed(6) + "," + v.z + "z"; if (what === "print") { window.print(); } else if (what === "send" || what === "email") { window.location.href = "mailto:?subject=" + encodeURIComponent("Google Maps") + "&body=" + encodeURIComponent(link); } else { try { window.prompt("Paste link in email or IM", link); } catch (e) {} } }); }); } // Gplex's own words in the interface language; search results stay as Google wrote them function ugfMapsTranslate(root) { try { if (typeof ugfI18nTree === "function" && UGF_LANG !== "en") { ugfI18nTree(root); } } catch (e) {} } // ---- controls, per period --------------------------------------------------- function ugfMapsControls(shell, map, era) { const A = ugfMapsArt(); const K = A.kit; const wrap = shell.querySelector("#ugf-maps-mapwrap"); const add = function(cls, html) { const d = document.createElement("div"); d.className = "ugf-maps-ctl " + cls; d.innerHTML = trusted_policy.createHTML(html); wrap.appendChild(d); return d; }; const street = function(lat, lng) { ugfMapsStreetView(shell, era, lat, lng, ""); }; const knobSync = []; map.onMove(function() { knobSync.forEach(function(fn) { fn(); }); }); // 2005-2010: the large pan/zoom control, with its slider const slider = function(ctl, rail, knob, top, per, levels) { const sync = function() { const z = map.view().z; const i = Math.max(0, Math.min(levels - 1, levels - 1 - (z - 2))); knob.style.top = (top + i * per) + "px"; }; knobSync.push(sync); rail.addEventListener("click", function(ev) { const r = rail.getBoundingClientRect(); const i = Math.floor((ev.clientY - r.top) / per); map.zoomTo(2 + (levels - 1 - i)); }); sync(); }; if (era === "m2005" || era === "m2006") { const levels = 18; const c = add("large2005", '' + ''); c.querySelector(".up").onclick = function() { map.panBy(0, -Math.round(map.el.clientHeight / 2)); }; c.querySelector(".dn").onclick = function() { map.panBy(0, Math.round(map.el.clientHeight / 2)); }; c.querySelector(".lf").onclick = function() { map.panBy(-Math.round(map.el.clientWidth / 2), 0); }; c.querySelector(".rt").onclick = function() { map.panBy(Math.round(map.el.clientWidth / 2), 0); }; c.querySelector(".ct").onclick = function() { const v = map.view(); map.setView(v.lat, v.lng, v.z); }; c.querySelector(".zi").onclick = map.zoomIn; c.querySelector(".zo").onclick = map.zoomOut; slider(c, c.querySelector(".rail"), c.querySelector(".knob"), 84, 8, levels); } else if (era === "m2007") { const levels = 20; const c = add("large2008", '' + ''); c.querySelector(".up").onclick = function() { map.panBy(0, -200); }; c.querySelector(".dn").onclick = function() { map.panBy(0, 200); }; c.querySelector(".lf").onclick = function() { map.panBy(-200, 0); }; c.querySelector(".rt").onclick = function() { map.panBy(200, 0); }; c.querySelector(".zi").onclick = map.zoomIn; c.querySelector(".zo").onclick = map.zoomOut; ugfMapsPegman(c.querySelector(".peg"), map, street); slider(c, c.querySelector(".rail"), c.querySelector(".knob"), 118, 8, levels); } else if (era === "m2010" || era === "m2011") { const levels = 20; const c = add("large2010", '' + ''); c.querySelector(".up").onclick = function() { map.panBy(0, -200); }; c.querySelector(".dn").onclick = function() { map.panBy(0, 200); }; c.querySelector(".lf").onclick = function() { map.panBy(-200, 0); }; c.querySelector(".rt").onclick = function() { map.panBy(200, 0); }; c.querySelector(".zi").onclick = map.zoomIn; c.querySelector(".zo").onclick = map.zoomOut; ugfMapsPegman(c.querySelector(".peg"), map, street); slider(c, c.querySelector(".rail"), c.querySelector(".knob"), 116, 8, levels); } // map types if (era === "m2005" || era === "m2006" || era === "m2007" || era === "m2010") { const types = era === "m2005" || era === "m2006" ? [["m", "Map"], ["s", "Satellite"], ["y", "Hybrid"]] : (era === "m2007" ? [["m", "Map"], ["y", "Satellite"], ["p", "Terrain"]] : [["m", "Map"], ["y", "Satellite"], ["p", "Terrain"]]); const t = add("types " + (era === "m2010" ? "v3" : "v2"), types.map(function(x) { return '" + x[1] + ""; }).join("")); t.querySelectorAll("a").forEach(function(a) { a.addEventListener("click", function(ev) { ev.preventDefault(); map.setType(a.getAttribute("data-t")); t.querySelectorAll("a").forEach(function(o) { o.classList.toggle("on", o === a); }); }); }); } else if (era === "m2011" || era === "m2014") { // the imagery thumbnail: a real satellite tile of where you are const t = add(era === "m2011" ? "thumb11" : "thumb14", '' + (era === "m2011" ? "Satellite" : "Earth") + ""); const paint = function() { const v = map.view(); const on = v.type !== "m"; const zz = Math.max(2, v.z - 2); const p = map.project(v.lat, v.lng, zz); const n = Math.pow(2, zz); t.querySelector(".img").style.backgroundImage = 'url("' + ugfMapsTileUrl(on ? "m" : "s", ((Math.floor(p.x / 256) % n) + n) % n, Math.floor(p.y / 256), zz) + '")'; t.querySelector(".lbl").textContent = on ? "Map" : (era === "m2011" ? "Satellite" : "Earth"); }; let pt = 0; map.onMove(function() { clearTimeout(pt); pt = setTimeout(paint, 300); }); t.addEventListener("click", function() { map.setType(map.view().type === "m" ? "y" : "m"); paint(); }); paint(); } if (era === "m2014" || era === "m2015" || era === "m2019" || era === "m2022") { // bottom right: my location, zoom, and (2015-2018) the imagery strip with Pegman const loc = add("loc15", ''); loc.title = "Your location"; // Your location: the browser's position, marked with Maps' blue dot; if the // browser will not say, the rough area Google placed you in let dot = null; loc.addEventListener("click", function() { const put = function(lat, lng, z, exact) { if (dot) { map.removeMarker(dot); dot = null; } if (exact) { const el = document.createElement("img"); el.className = "ugf-maps-marker ugf-maps-me"; el.src = A.bluedot; el.alt = "Your location"; el.title = "Your location"; dot = map.addMarker({ lat: lat, lng: lng, el: el, ax: 11, ay: 11 }); } map.setView(lat, lng, z); }; const rough = function() { const v = ugfMapsAppView(true); if (v) { put(v.lat, v.lng, Math.min(v.z, 12), false); } ugfMapsToast(shell, "Your location could not be determined."); }; try { navigator.geolocation.getCurrentPosition(function(p) { put(p.coords.latitude, p.coords.longitude, Math.max(map.view().z, 15), true); }, rough, { timeout: 15000, maximumAge: 60000 }); } catch (e) { rough(); } }); const z = add("zoom15", ''); z.querySelector(".zi").onclick = map.zoomIn; z.querySelector(".zo").onclick = map.zoomOut; if (era === "m2015") { const im = add("imagery15", ''); ugfMapsPegman(im.querySelector(".peg"), map, street); im.querySelector(".more").onclick = function() { map.setType(map.view().type === "m" ? "y" : "m"); }; } else { const pg = add("peg14", ''); pg.title = "Street View"; ugfMapsPegman(pg, map, street); } if (era === "m2019" || era === "m2022") { const t = add("layers19", 'Layers'); const paint = function() { const v = map.view(); const zz = Math.max(2, v.z - 1); const p = map.project(v.lat, v.lng, zz); const n = Math.pow(2, zz); t.querySelector(".img").style.backgroundImage = 'url("' + ugfMapsTileUrl(v.type === "m" ? "s" : "m", ((Math.floor(p.x / 256) % n) + n) % n, Math.floor(p.y / 256), zz) + '")'; }; let pt = 0; map.onMove(function() { clearTimeout(pt); pt = setTimeout(paint, 300); }); t.addEventListener("click", function() { map.setType(map.view().type === "m" ? "y" : "m"); paint(); }); paint(); } } // the Google mark and the small print, as each period set them on the map const y = ugfMapsYear(); const foot = add("foot " + era, ""); const scaleBar = function() { const s = ugfMapsScale(map); return '' + s.label + ''; }; const paintFoot = function() { let h = ""; if (era === "m2005" || era === "m2006") { h = '©' + y + " Google" + scaleBar() + 'Map data ©' + y + " NAVTEQ™, TeleAtlas"; } else if (era === "m2007") { h = '' + scaleBar() + 'Map data ©' + y + ' Google - Terms of Use'; } else if (era === "m2010" || era === "m2011") { h = '' + scaleBar() + 'Map data ©' + y + ' Google - Terms of Use'; } else { // 2014 on: the mark sits at the bottom middle; the small print at the right h = '' + 'Map data ©' + y + ' Google Terms' + 'Privacy' + (era === "m2019" || era === "m2022" ? "Send Product Feedback" : "Send feedback") + "" + scaleBar() + ""; } foot.innerHTML = trusted_policy.createHTML(h); }; let ft = 0; map.onMove(function() { clearTimeout(ft); ft = setTimeout(paintFoot, 150); }); paintFoot(); } // The account and app menus are Gmail's own, so their look is taken from the Gmail // stylesheet rather than kept twice. function ugfMapsMenuCss() { const g = ugfGmailCss(); const cut = function(from, to) { const i = g.indexOf(from); const j = i > -1 ? g.indexOf(to, i + from.length) : -1; return i > -1 && j > -1 ? g.slice(i, j) : ""; }; return cut("/* ---------- account dropdown ---------- */", "/* ----------") + "\n" + cut("#ugf-gmail-appsmenu {", "/* late 2012-2013"); } function ugfMapsCss() { const A = ugfMapsArt(); const u = function(k) { return 'url("' + A[k] + '")'; }; return [ // Google's own app stays in place, hidden, so it can keep doing the searching 'html[gplex-maps] body > *:not(#ugf-maps):not(#ugf-maps-gbarwrap):not(#ugf-maps-styles):not(#ugf-gmail-accmenu):not(#ugf-gmail-appsmenu):not(#ugf-gmail-accfence):not(script):not(style) { visibility: hidden !important; pointer-events: none !important; }', // the account menu (shared with Gmail) opens above the Maps page 'html[gplex-maps] #ugf-gmail-accfence { z-index: 2147483600 !important; }', 'html[gplex-maps] #ugf-gmail-accmenu { z-index: 2147483601 !important; text-align: left; }', 'html[gplex-maps] #ugf-gmail-appsmenu { z-index: 2147483601 !important; text-align: left; }', 'html[gplex-maps] #ugf-gmail-accmenu a, html[gplex-maps] #ugf-gmail-appsmenu a { text-decoration: none; }', ugfMapsMenuCss(), // the name on the Google bar goes to the Google Account page, as on Search and Gmail '#ugf-maps-gbar a.who { color: #00c !important; font-weight: bold; text-decoration: none !important; }', '#ugf-maps-gbar.dark a.who { color: #fff !important; }', '#ugf-maps-gbar a.who:hover { text-decoration: underline !important; }', // 2015 on: the round photo at the top right '#ugf-maps-topright .me { display: block; width: 32px; height: 32px; border-radius: 50%; cursor: pointer; box-shadow: 0 1px 4px rgba(0,0,0,.3); }', '#ugf-maps-topright .me .pfp { display: block; width: 32px; height: 32px; border-radius: 50%; object-fit: cover; }', '#ugf-maps-topright .me .pfp.letter { background: #c62828; color: #fff; font: 16px Roboto, arial, sans-serif; display: flex; align-items: center; justify-content: center; text-transform: uppercase; }', '#ugf-maps-topright .apps { cursor: pointer; }', '#ugf-maps-account .ic.grid { cursor: pointer; }', // routes and the blue dot '.ugf-maps-route { position: absolute; left: 0; top: 0; overflow: visible; pointer-events: none; will-change: transform; }', '.ugf-maps-route path.hit { pointer-events: visibleStroke; cursor: pointer; }', '#ugf-maps-toast { position: absolute; left: 50%; bottom: 40px; transform: translateX(-50%); background: #323232; color: #fff; font: 13px Roboto, arial, sans-serif; padding: 10px 18px; border-radius: 2px; z-index: 60; opacity: 0; pointer-events: none; transition: opacity .2s; }', '#ugf-maps-toast.on { opacity: 1; }', // directions, the older pages '#ugf-maps-panel .dirf { margin: 0 0 10px 0; }', '#ugf-maps-panel .dhd { display: flex; justify-content: space-between; align-items: baseline; margin: 0 0 8px 0; font-size: 13px; }', '#ugf-maps-panel .dhd a { font-size: 12px; }', '#ugf-maps-panel .drow { display: flex; align-items: center; gap: 6px; margin: 0 0 5px 0; }', '#ugf-maps-panel .drow img { width: 20px; height: 34px; flex: 0 0 20px; }', '#ugf-maps-panel .drow .dl { width: 84px; flex: 0 0 84px; font-size: 12px; }', '#ugf-maps-panel .drow input { flex: 1; min-width: 0; font: 13px arial, sans-serif; border: 1px solid #7f9db9; padding: 2px 3px; }', '#ugf-maps[era="m2011"] #ugf-maps-panel .drow input { border: 1px solid #d9d9d9; border-top-color: #c0c0c0; padding: 5px 6px; }', '#ugf-maps-panel .dbar { display: flex; align-items: center; gap: 10px; margin: 4px 0 8px 26px; font-size: 12px; }', '#ugf-maps-panel .dsel { font: 12px arial, sans-serif; }', '#ugf-maps-panel .dgo { font: 13px arial, sans-serif; margin-left: 26px; }', '#ugf-maps-panel .dgo.blue { font: bold 11px arial, sans-serif; color: #fff; background: linear-gradient(#4d90fe, #4787ed); border: 1px solid #3079ed; border-radius: 2px; padding: 6px 12px; cursor: pointer; }', '#ugf-maps-panel .dmodes { display: flex; gap: 0; margin: 0 0 8px 26px; }', '#ugf-maps-panel .dmodes .dm { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 27px; border: 1px solid #dcdcdc; background: linear-gradient(#f5f5f5, #f1f1f1); margin-right: -1px; }', '#ugf-maps-panel .dmodes .dm.on { background: #eee; box-shadow: inset 0 1px 2px rgba(0,0,0,.2); border-color: #ccc; }', '#ugf-maps-panel .dmodes .dm svg { width: 18px; height: 18px; fill: #666; display: block; }', '#ugf-maps-panel .dmodes .dm.on svg { fill: #333; }', '#ugf-maps-panel .dsum { margin: 12px 0 8px 0; }', '#ugf-maps-panel .dtot { color: #333; margin-top: 3px; }', '#ugf-maps-panel .dalts { margin: 0 0 10px 0; }', '#ugf-maps-panel .dah { font-weight: bold; font-size: 12px; margin-bottom: 3px; color: #333; }', '#ugf-maps-panel .alt { display: flex; justify-content: space-between; gap: 8px; padding: 4px 6px; text-decoration: none; font-size: 12px; }', '#ugf-maps-panel .alt.sel { background: #e5ecf9; color: #000 !important; }', '#ugf-maps-panel .alt .m { color: #666; white-space: nowrap; }', '#ugf-maps-panel .dsteps { border-collapse: collapse; width: 100%; font-size: 12px; }', '#ugf-maps-panel .dsteps td { padding: 5px 4px; border-top: 1px solid #e5e5e5; vertical-align: top; }', '#ugf-maps-panel .dsteps tr.end td { background: #f3f3f3; font-weight: bold; vertical-align: middle; }', '#ugf-maps-panel .dsteps tr.end img { display: block; }', '#ugf-maps-panel .dsteps tr.st { cursor: pointer; }', '#ugf-maps-panel .dsteps tr.st:hover td { background: #f5f8fe; }', '#ugf-maps-panel .dsteps .n { width: 22px; text-align: right; color: #333; }', '#ugf-maps-panel .dsteps .dd { white-space: nowrap; text-align: right; color: #666; }', '#ugf-maps-panel .note { color: #777; font-size: 11px; margin-top: 2px; }', '#ugf-maps-panel .dnote { color: #777; font-size: 11px; margin: 10px 0; line-height: 1.4; }', // directions, 2014 on '#ugf-maps-omni.dir #ugf-maps-form, #ugf-maps-omni.dir #ugf-maps-chips { display: none !important; }', '#ugf-maps-dirbox { background: #fff; box-shadow: 0 2px 4px rgba(0,0,0,.2); border-radius: 2px 2px 0 0; font: 13px Roboto, arial, sans-serif; }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox { background: #4285f4; }', '#ugf-maps-dirbox .dhead { padding: 8px 12px 12px 12px; }', '#ugf-maps-dirbox .dmodes { display: flex; align-items: center; gap: 6px; margin: 0 0 8px 40px; }', '#ugf-maps-dirbox .dm { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 32px; border-radius: 16px; }', '#ugf-maps-dirbox .dm svg, #ugf-maps-dirbox .dclose svg, #ugf-maps-dirbox .dswap svg { display: block; fill: #757575; }', '#ugf-maps-dirbox .dm.on { background: #e8f0fe; } #ugf-maps-dirbox .dm.on svg { fill: #1a73e8; }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox .dm svg, #ugf-maps[era="m2015"] #ugf-maps-dirbox .dclose svg, #ugf-maps[era="m2015"] #ugf-maps-dirbox .dswap svg { fill: rgba(255,255,255,.7); }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox .dm.on { background: rgba(0,0,0,.15); } #ugf-maps[era="m2015"] #ugf-maps-dirbox .dm.on svg { fill: #fff; }', '#ugf-maps-dirbox .dclose { margin-left: auto; display: block; }', '#ugf-maps-dirbox .dflds { position: relative; padding-right: 36px; }', '#ugf-maps-dirbox .dfld { display: flex; align-items: center; height: 36px; }', '#ugf-maps-dirbox .dot { display: block; width: 8px; height: 8px; border-radius: 50%; border: 2px solid #757575; margin: 0 20px 0 14px; flex: 0 0 auto; }', '#ugf-maps-dirbox .dot.b { border-color: #db4437; background: #db4437; }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox .dot { border-color: #fff; } #ugf-maps[era="m2015"] #ugf-maps-dirbox .dot.b { background: #fff; }', '#ugf-maps-dirbox input { flex: 1; min-width: 0; height: 32px; border: 0; border-bottom: 1px solid #e0e0e0; outline: none; background: transparent; font: 14px Roboto, arial, sans-serif; color: #222; padding: 0 4px; }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox input { color: #fff; border-bottom-color: rgba(255,255,255,.5); }', '#ugf-maps[era="m2015"] #ugf-maps-dirbox input::placeholder { color: rgba(255,255,255,.7); }', '#ugf-maps-dirbox .dswap { position: absolute; right: 0; top: 24px; }', '#ugf-maps-omni.dir #ugf-maps-panel { border-radius: 0 0 2px 2px; margin-top: 0; }', '#ugf-maps-omni #ugf-maps-panel .rt { display: flex; gap: 18px; padding: 14px 18px; border-bottom: 1px solid #e6e6e6; cursor: pointer; font: 13px Roboto, arial, sans-serif; }', '#ugf-maps-omni #ugf-maps-panel .rt.sel { border-left: 4px solid #4285f4; padding-left: 14px; }', '#ugf-maps-omni #ugf-maps-panel .rt .mi svg { display: block; fill: #757575; }', '#ugf-maps-omni #ugf-maps-panel .rt .rtx { flex: 1; min-width: 0; }', '#ugf-maps-omni #ugf-maps-panel .rt .l1 { display: flex; justify-content: space-between; }', '#ugf-maps-omni #ugf-maps-panel .rt .tm { font-size: 15px; color: #0f9d58; font-weight: 500; }', '#ugf-maps-omni #ugf-maps-panel .rt .ds { color: #757575; }', '#ugf-maps-omni #ugf-maps-panel .rt .via { color: #222; margin-top: 3px; }', '#ugf-maps-omni #ugf-maps-panel .rt .det { display: inline-block; margin-top: 8px; color: #4285f4 !important; font-weight: 500; text-transform: uppercase; font-size: 12px; text-decoration: none; }', '#ugf-maps-omni #ugf-maps-panel .steps { border-bottom: 1px solid #e6e6e6; }', '#ugf-maps-omni #ugf-maps-panel .steps .st { display: flex; gap: 12px; padding: 10px 18px 10px 60px; cursor: pointer; font: 13px Roboto, arial, sans-serif; }', '#ugf-maps-omni #ugf-maps-panel .steps .st:hover { background: #f5f5f5; }', '#ugf-maps-omni #ugf-maps-panel .steps .tx { flex: 1; }', '#ugf-maps-omni #ugf-maps-panel .steps .dd { color: #757575; white-space: nowrap; }', '#ugf-maps-omni #ugf-maps-panel .steps .note { font-size: 12px; color: #757575; }', // the side menu (2015 on) '#ugf-maps-scrim { position: absolute; inset: 0; z-index: 40; background: rgba(0,0,0,.4); opacity: 0; pointer-events: none; transition: opacity .2s; }', '#ugf-maps.drawer-open #ugf-maps-scrim { opacity: 1; pointer-events: auto; }', '#ugf-maps-drawer { position: absolute; left: 0; top: 0; bottom: 0; width: 300px; z-index: 41; background: #fff; box-shadow: 0 0 20px rgba(0,0,0,.3); transform: translateX(-110%); transition: transform .2s ease-out; display: flex; flex-direction: column; font: 14px Roboto, arial, sans-serif; visibility: hidden; }', '#ugf-maps.drawer-open #ugf-maps-drawer { transform: none; visibility: visible; }', '#ugf-maps-drawer .head { display: flex; align-items: center; height: 64px; padding: 0 24px; flex: 0 0 auto; }', '#ugf-maps-drawer .head img { display: block; }', '#ugf-maps-drawer .head .mp { color: #757575; font: 22px Roboto, arial, sans-serif; margin-left: 5px; position: relative; top: -1px; }', '#ugf-maps-drawer .list { overflow-y: auto; flex: 1; padding-bottom: 8px; }', '#ugf-maps-drawer .grp { border-top: 1px solid #e6e6e6; padding: 8px 0; }', '#ugf-maps-drawer .grp:first-child { border-top: 0; padding-top: 0; }', '#ugf-maps-drawer a.row { display: flex; align-items: center; height: 40px; padding: 0 24px; color: #333 !important; text-decoration: none !important; cursor: pointer; }', '#ugf-maps-drawer a.row:not(.wi) { height: 32px; font-size: 13px; color: #666 !important; }', '#ugf-maps-drawer a.row:hover { background: #f1f1f1; }', '#ugf-maps-drawer a.row .ic { display: block; width: 24px; height: 24px; margin-right: 24px; font-style: normal; }', '#ugf-maps-drawer a.row .ic svg { display: block; fill: #757575; }', '#ugf-maps-drawer a.row.on { color: #4285f4 !important; }', '#ugf-maps-drawer a.row.on .ic svg { fill: #4285f4; }', '#ugf-maps-drawer[era="m2019"] a.row.on, #ugf-maps-drawer[era="m2022"] a.row.on { color: #1a73e8 !important; }', '#ugf-maps-drawer[era="m2019"] a.row.on .ic svg, #ugf-maps-drawer[era="m2022"] a.row.on .ic svg { fill: #1a73e8; }', 'html[gplex-maps], html[gplex-maps] body { overflow: hidden !important; }', '#ugf-maps { position: fixed; inset: 0; z-index: 2147483000; background: #fff; font: 13px arial, sans-serif; color: #000; display: flex; flex-direction: column; visibility: visible; text-align: left; }', '#ugf-maps * { box-sizing: content-box; }', '#ugf-maps a { color: #00c; cursor: pointer; }', '#ugf-maps-body { flex: 1; display: flex; min-height: 0; position: relative; }', '#ugf-maps-mapwrap { position: relative; flex: 1; min-width: 0; overflow: hidden; }', '#ugf-maps-map { position: absolute; inset: 0; overflow: hidden; background: #e5e3df; outline: none; cursor: ' + u("openhand") + ' 8 8, grab; touch-action: none; user-select: none; }', '#ugf-maps-map.dragging { cursor: ' + u("closedhand") + ' 8 8, grabbing; }', '.ugf-maps-pane, .ugf-maps-layer { position: absolute; left: 0; top: 0; }', '.ugf-maps-layer { transform-origin: 0 0; }', '.ugf-maps-tile { position: absolute; width: 256px; height: 256px; max-width: none; user-select: none; -webkit-user-drag: none; opacity: 0; transition: opacity .2s; }', '.ugf-maps-tile.in { opacity: 1; }', '#ugf-maps[era="m2005"] .ugf-maps-tile, #ugf-maps[era="m2006"] .ugf-maps-tile, #ugf-maps[era="m2007"] .ugf-maps-tile { transition: none; }', '.ugf-maps-overlay { position: absolute; inset: 0; pointer-events: none; }', '.ugf-maps-marker { position: absolute; pointer-events: auto; cursor: pointer; }', '.ugf-maps-ctl { position: absolute; z-index: 5; }', '.ugf-maps-ctl i, .ugf-maps-ctl b { position: absolute; display: block; cursor: pointer; }', // ---- 2005-2006 '#ugf-maps[era="m2005"] #ugf-maps-head, #ugf-maps[era="m2006"] #ugf-maps-head { display: flex; align-items: flex-start; padding: 5px 8px 3px 8px; }', '#ugf-maps-head .logo img { display: block; border: 0; }', '#ugf-maps-head .mid { margin: 5px 0 0 12px; }', '#ugf-maps-head .tabs { font-size: 13px; margin: 0 0 3px 1px; }', '#ugf-maps-head .tabs b { margin-right: 14px; }', '#ugf-maps-head .tabs a { margin-right: 14px; }', '#ugf-maps[era="m2005"] #ugf-maps-q, #ugf-maps[era="m2006"] #ugf-maps-q { width: 440px; font: 13px arial, sans-serif; padding: 1px 2px; border: 1px solid #7f9db9; }', '#ugf-maps-head input[type="submit"] { font: 13px arial, sans-serif; margin-left: 5px; }', '#ugf-maps-head .help { margin: 6px 0 0 auto; font-size: 11px; line-height: 13px; }', '#ugf-maps-titlebar { background: #ffe9c6; border-top: 1px solid #dbbd95; font: bold 16px arial, sans-serif; padding: 2px 8px 3px 8px; margin: 0 8px; }', '#ugf-maps[era="m2005"] #ugf-maps-body, #ugf-maps[era="m2006"] #ugf-maps-body { padding: 8px; }', '#ugf-maps[era="m2005"] #ugf-maps-mapwrap, #ugf-maps[era="m2006"] #ugf-maps-mapwrap { border: 1px solid #979797; }', '#ugf-maps[era="m2005"] #ugf-maps-panel, #ugf-maps[era="m2006"] #ugf-maps-panel { width: 280px; flex: 0 0 280px; padding: 0 0 0 10px; overflow-y: auto; }', '#ugf-maps-panel .links { margin: 2px 0 14px 0; }', '#ugf-maps-panel .links a { margin-right: 12px; }', '#ugf-maps-panel .eh { color: #e98b39; font: bold 16px arial, sans-serif; margin-bottom: 8px; }', '#ugf-maps-panel .ex { font-weight: bold; margin: 8px 0 5px 0; }', '#ugf-maps-panel .examples form { margin: 0 0 3px 0; display: flex; gap: 4px; }', '#ugf-maps-panel .examples input:not([type]) { width: 170px; font: 13px arial, sans-serif; border: 1px solid #7f9db9; padding: 1px 2px; }', '#ugf-maps-panel .examples input[type="submit"] { font: 13px arial, sans-serif; }', '#ugf-maps-panel .drag { margin-top: 14px; }', '.large2005 { left: 7px; top: 7px; width: 59px; height: 400px; }', '.large2005 i { background-image: ' + u("ctl2005") + '; width: 17px; height: 17px; }', '.large2005 .up { left: 20px; top: 0; background-position: -20px 0; }', '.large2005 .lf { left: 0; top: 20px; background-position: 0 -20px; }', '.large2005 .ct { left: 20px; top: 20px; background-position: -20px -20px; }', '.large2005 .rt { left: 40px; top: 20px; background-position: -40px -20px; }', '.large2005 .dn { left: 20px; top: 40px; background-position: -20px -40px; }', '.large2005 .zi { left: 20px; top: 65px; background-position: -20px -65px; }', '.large2005 .rail { left: 21px; top: 85px; width: 17px; background-position: -21px -85px; }', '.large2005 .zo { left: 20px; background-position: -20px -365px; }', '.large2005 .knob { left: 19px; width: 22px; height: 14px; background-position: 0 -384px; cursor: default; }', // ---- 2007-2013 headers and the Google bar '#ugf-maps-gbar { display: flex; align-items: center; justify-content: space-between; font: 13px arial, sans-serif; flex: 0 0 auto; }', '#ugf-maps-gbar .left, #ugf-maps-gbar .right { display: flex; align-items: center; }', '#ugf-maps-gbar .sepr { color: #ccc; margin: 0 8px; }', '#ugf-maps-gbar.plain { background: #fff; padding: 3px 10px 5px 10px; }', '#ugf-maps-gbar.plain .left { gap: 11px; }', '#ugf-maps-gbar.plain a { color: #00c; text-decoration: underline; }', '#ugf-maps-gbar a.here { color: #000 !important; font-weight: bold; text-decoration: none !important; cursor: default; }', '#ugf-maps-gbar .who { color: #00c; font-weight: bold; }', '#ugf-maps-gbar.g2010 { background: linear-gradient(#fff, #fafafa); border-bottom: 1px solid #e5e5e5; padding: 0 10px; height: 29px; }', '#ugf-maps-gbar.g2010 .left { gap: 13px; height: 29px; }', '#ugf-maps-gbar.g2010 a { color: #00c; line-height: 26px; height: 29px; border-top: 3px solid transparent; box-sizing: border-box; text-decoration: none; }', '#ugf-maps-gbar.g2010 a.here { border-top-color: #4d90fe; }', '#ugf-maps-gbar.dark { background: #2d2d2d; height: 30px; padding: 0 14px; color: #ccc; }', '#ugf-maps-gbar.dark .left { gap: 13px; height: 30px; }', '#ugf-maps-gbar.dark a { color: #ccc !important; line-height: 27px; height: 30px; border-top: 3px solid transparent; box-sizing: border-box; text-decoration: none; }', '#ugf-maps-gbar.dark a:hover { color: #fff !important; }', '#ugf-maps-gbar.dark a.here { color: #fff !important; border-top-color: #dd4b39; }', '#ugf-maps-gbar.dark .who { color: #fff; }', '#ugf-maps-gbar.dark a.plus { color: #fff !important; font-weight: bold; }', '#ugf-maps-gbar.dark.late { padding: 0 4px; height: 29px; } #ugf-maps-gbar.dark.late .left { gap: 0; height: 29px; }', '#ugf-maps-gbar.dark.late a { border-top: 0; line-height: 29px; height: 29px; font-weight: bold; color: #bbb !important; padding: 0 9px; }', '#ugf-maps-gbar.dark.late a.here, #ugf-maps-gbar.dark.late a:hover { color: #fff !important; } #ugf-maps-gbar.dark.late a.plus { color: #bbb !important; }', // 2014 and 2015: the bar sits above the full-window map '#ugf-maps-gbarwrap { position: fixed; top: 0; left: 0; right: 0; z-index: 2147483001; visibility: visible; text-align: left; }', 'html[gplex-maps-bar] #ugf-maps { top: 29px; }', '#ugf-maps-gbar.dark .gear { display: inline-flex; align-items: center; border: 0; line-height: normal; }', '#ugf-maps-gbar.dark .gear svg { fill: #ccc; display: block; }', '#ugf-maps-gbar.dark .gear:hover svg { fill: #fff; }', '#ugf-maps-account { display: flex; align-items: center; gap: 10px; font: 13px arial, sans-serif; }', '#ugf-maps[era="m2011"] #ugf-maps-account, #ugf-maps[era="m2011"] #ugf-maps-head > .signin { margin-left: auto; }', '#ugf-maps-account .plusname { color: #666; font-size: 13px; text-decoration: none; }', '#ugf-maps-account .plusname:hover { text-decoration: underline; }', '#ugf-maps-account .nbox { min-width: 26px; height: 26px; box-sizing: border-box; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #777; font-size: 12px; display: inline-flex; align-items: center; justify-content: center; padding: 0 6px; }', '#ugf-maps-account .sharebtn { height: 26px; box-sizing: border-box; border: 1px solid #dcdcdc; border-radius: 2px; background: linear-gradient(#f5f5f5, #f1f1f1); color: #444; font-size: 12px; display: inline-flex; align-items: center; gap: 5px; padding: 0 10px; cursor: pointer; }', '#ugf-maps-account .sharebtn b { font-size: 14px; font-weight: normal; color: #777; }', '#ugf-maps-account .pfpwrap { display: inline-flex; align-items: center; gap: 3px; border: 1px solid #dcdcdc; border-radius: 2px; padding: 1px 4px 1px 1px; background: #fff; cursor: pointer; }', '#ugf-maps-account .pfpwrap .car { font-style: normal; color: #777; font-size: 9px; }', '#ugf-maps-account .pfp { width: 24px; height: 24px; border-radius: 1px; display: block; object-fit: cover; }', '#ugf-maps-account .pfp.letter { background: #c62828; color: #fff; font-size: 14px; display: flex; align-items: center; justify-content: center; text-transform: uppercase; }', '#ugf-maps-account .ic { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; }', '#ugf-maps-account .ic svg { fill: #666; display: block; }', '#ugf-maps-account .ic:hover svg { fill: #333; }', '#ugf-maps-head > .signin { display: inline-flex; align-items: center; height: 29px; padding: 0 12px; background: linear-gradient(#dd4b39, #d14836); border: 1px solid #c53727; border-radius: 2px; color: #fff !important; font: bold 13px arial, sans-serif; text-decoration: none; }', '#ugf-maps[era="m2014"] #ugf-maps-account { background: rgba(255,255,255,.92); padding: 4px 8px; border-radius: 2px; box-shadow: 0 1px 4px rgba(0,0,0,.2); }', '#ugf-maps[era="m2007"] #ugf-maps-head, #ugf-maps[era="m2010"] #ugf-maps-head, #ugf-maps[era="m2011"] #ugf-maps-head { display: flex; align-items: center; padding: 4px 10px 8px 10px; border-bottom: 1px solid #c9d7f1; }', '#ugf-maps[era="m2011"] #ugf-maps-head { border-bottom: 1px solid #e5e5e5; padding: 14px 16px; background: #f1f1f1; }', '#ugf-maps[era="m2010"] #ugf-maps-head { border-bottom: 1px solid #e5e5e5; }', '#ugf-maps[era="m2007"] #ugf-maps-form, #ugf-maps[era="m2010"] #ugf-maps-form { margin-left: 14px; display: flex; align-items: center; gap: 6px; }', '#ugf-maps[era="m2007"] #ugf-maps-q, #ugf-maps[era="m2010"] #ugf-maps-q { width: 420px; font: 16px arial, sans-serif; padding: 2px 3px; border: 1px solid #7e9db9; }', '#ugf-maps[era="m2007"] #ugf-maps-form input[type="submit"] { font: 13px arial, sans-serif; }', '#ugf-maps-form .grad { font: bold 13px arial, sans-serif; color: #444; background: linear-gradient(#fff, #e6e6e6); border: 1px solid #aaa; border-radius: 2px; padding: 4px 10px; }', '#ugf-maps-form .opts { font-size: 12px; margin-left: 6px; }', '#ugf-maps[era="m2011"] #ugf-maps-head .logo img { margin: -1px 24px -1px 4px; }', '#ugf-maps[era="m2011"] #ugf-maps-head .logo img.l2012 { margin: -3px 20px -3px 0; }', '#ugf-maps[era="m2011"] #ugf-maps-form { display: flex; align-items: center; }', '#ugf-maps[era="m2011"] #ugf-maps-q { width: 520px; height: 23px; font: 16px arial, sans-serif; padding: 2px 8px; border: 1px solid #d9d9d9; border-top-color: #c0c0c0; border-radius: 1px 0 0 1px; outline: none; }', '#ugf-maps[era="m2011"] #ugf-maps-q:focus { border-color: #4d90fe; }', '#ugf-maps-form button.blue { width: 72px; height: 29px; border: 1px solid #3079ed; background: linear-gradient(#4d90fe, #4787ed); border-radius: 0 2px 2px 0; cursor: pointer; padding: 0; box-sizing: border-box; }', '#ugf-maps-form button.blue i, #ugf-maps-form button.go14 i { display: block; width: 24px; height: 24px; margin: 0 auto; background: ' + u("qsb") + ' -48px 0; transform: scale(.75); }', '#ugf-maps[era="m2007"] #ugf-maps-panel, #ugf-maps[era="m2010"] #ugf-maps-panel, #ugf-maps[era="m2011"] #ugf-maps-panel { width: 326px; flex: 0 0 326px; overflow-y: auto; border-right: 1px solid #c9d7f1; padding: 8px 10px; box-sizing: border-box !important; }', '#ugf-maps[era="m2011"] #ugf-maps-panel { border-right: 1px solid #e5e5e5; }', '#ugf-maps-links { position: absolute; top: 0; right: 10px; z-index: 6; font-size: 12px; padding: 3px 0; }', '#ugf-maps-links a { margin-left: 12px; }', '#ugf-maps[era="m2007"] #ugf-maps-links + #ugf-maps-map, #ugf-maps[era="m2010"] #ugf-maps-links + #ugf-maps-map { top: 20px; }', '#ugf-maps-panel .btns { display: flex; gap: 6px; margin: 0 0 12px 0; }', '#ugf-maps-panel .b { display: inline-block; font: bold 11px arial, sans-serif; color: #444 !important; text-decoration: none; padding: 5px 10px; border: 1px solid #c6c6c6; border-radius: 2px; background: linear-gradient(#f8f8f8, #f1f1f1); }', '#ugf-maps-panel .b.red { color: #fff !important; background: linear-gradient(#dd4b39, #d14836); border-color: #c53727; text-transform: none; }', '#ugf-maps-panel .tips { color: #444; line-height: 1.5; }', '#ugf-maps-panel .status { margin: 8px 0; color: #444; }', '#ugf-maps-panel .hint { color: #666; }', '#ugf-maps-panel .rhead { color: #666; font-size: 12px; margin: 0 0 6px 0; }', '#ugf-maps-panel .res { display: flex; gap: 6px; padding: 5px 0 7px 0; cursor: pointer; }', '#ugf-maps-panel .res .mk { width: 20px; height: 34px; flex: 0 0 20px; }', '#ugf-maps-panel .res .n { font-weight: bold; }', '#ugf-maps-panel .res .l { color: #333; font-size: 12px; }', '#ugf-maps-panel .acts { font-size: 12px; margin-top: 2px; color: #666; }', '.large2008 { left: 14px; top: 10px; width: 59px; height: 360px; }', '.large2008 i { background-image: ' + u("ctl2008") + '; }', '.large2008 .peg { left: 19px; top: 0; width: 21px; height: 32px; background-position: -5px -460px; }', '.large2008 .peg:hover { background-position: -35px -460px; }', '.large2008 .pad { left: 3px; top: 36px; width: 54px; height: 55px; background-position: -3px -2px; cursor: default; }', '.large2008 b { width: 18px; height: 18px; }', '.large2008 .up { left: 21px; top: 38px; } .large2008 .dn { left: 21px; top: 72px; } .large2008 .lf { left: 4px; top: 55px; } .large2008 .rt { left: 38px; top: 55px; }', '.large2008 .zi { left: 20px; top: 98px; width: 20px; height: 22px; background-position: -20px -65px; }', '.large2008 .rail { left: 20px; top: 120px; width: 20px; background-position: -20px -90px; }', '.large2008 .zo { left: 20px; width: 20px; height: 22px; background-position: -20px -361px; }', '.large2008 .knob { left: 21px; width: 18px; height: 12px; background-position: -2px -384px; cursor: default; }', '.large2010 { left: 14px; top: 10px; width: 59px; height: 360px; }', '.large2010 i { background-image: ' + u("ctl2010") + '; }', '.large2010 .peg { left: 20px; top: 0; width: 19px; height: 32px; background: ' + u("pegv3") + ' no-repeat; }', '.large2010 .pad { left: 3px; top: 36px; width: 52px; height: 54px; background-position: -3px -2px; cursor: default; }', '.large2010 b { width: 17px; height: 17px; }', '.large2010 .up { left: 21px; top: 38px; } .large2010 .dn { left: 21px; top: 72px; } .large2010 .lf { left: 4px; top: 55px; } .large2010 .rt { left: 38px; top: 55px; }', '.large2010 .zi { left: 20px; top: 98px; width: 18px; height: 20px; background-position: -2px -428px; }', '.large2010 .rail { left: 20px; top: 120px; width: 18px; background-position: -20px -84px; }', '.large2010 .zo { left: 19px; width: 19px; height: 19px; background-position: -1px -62px; }', '.large2010 .knob { left: 20px; width: 18px; height: 11px; background-position: -1px -384px; cursor: default; }', '.types { top: 7px; right: 7px; display: flex; gap: 3px; }', '#ugf-maps[era="m2007"] .types, #ugf-maps[era="m2010"] .types { top: 27px; }', '#ugf-maps[era="m2007"] .large2008, #ugf-maps[era="m2010"] .large2010 { top: 30px; }', '.types.v2 a { display: block; min-width: 5em; text-align: center; background: #fff; border: 1px solid #000; color: #000 !important; font: 12px arial, sans-serif; padding: 0 3px; line-height: 17px; text-decoration: none; }', '.types.v2 a.on { font-weight: bold; }', '.types.v3 { gap: 0; box-shadow: rgba(0,0,0,.4) 0 2px 4px; }', '.types.v3 a { display: block; background: #fff; border: 1px solid #717b87; color: #000 !important; font: 12px arial, sans-serif; padding: 1px 6px; line-height: 17px; text-decoration: none; margin-left: -1px; }', '.types.v3 a.on { font-weight: bold; }', '.thumb11 { top: 10px; right: 10px; width: 64px; height: 64px; border: 2px solid #fff; box-shadow: 0 1px 4px rgba(0,0,0,.4); cursor: pointer; overflow: hidden; }', '.thumb14 { left: 10px; bottom: 26px; width: 72px; height: 72px; border: 2px solid #fff; border-radius: 2px; box-shadow: 0 1px 4px rgba(0,0,0,.3); cursor: pointer; overflow: hidden; }', '.thumb11 .img, .thumb14 .img, .layers19 .img { position: absolute; inset: 0; background-size: 256px 256px; background-position: center; }', '.thumb11 .lbl, .thumb14 .lbl, .layers19 .lbl { position: absolute; left: 0; right: 0; bottom: 0; color: #fff; font: bold 11px arial, sans-serif; text-align: center; padding: 3px 0; background: linear-gradient(transparent, rgba(0,0,0,.6)); }', // ---- the info window, out of Google's own bubble '.ugf-maps-iw { position: absolute; pointer-events: auto; cursor: default; min-width: 220px; max-width: 300px; font: 13px arial, sans-serif; }', '.ugf-maps-iw .box { position: relative; border-style: solid; border-width: 20px; border-image: ' + u("iwbox") + ' 25 fill / 20px stretch; padding: 0; }', '.ugf-maps-iw .box > * { position: relative; }', '.ugf-maps-iw .x { position: absolute; right: -8px; top: -8px; cursor: pointer; }', '.ugf-maps-iw .t { font-weight: bold; margin: 0 14px 4px 0; }', '.ugf-maps-iw .l { color: #333; font-size: 12px; }', '.ugf-maps-iw .acts { font-size: 12px; margin-top: 6px; }', '.ugf-maps-iw .tail { position: absolute; left: 30px; bottom: -86px; width: 98px; height: 96px; pointer-events: none; }', '.ugf-maps-marker.sel { z-index: 3; }', // ---- small print on the map '.foot { left: 0; right: 0; bottom: 0; height: 20px; pointer-events: none; font: 11px arial, sans-serif; color: #000; }', '.foot a { pointer-events: auto; }', '.foot .copy { position: absolute; bottom: 2px; white-space: nowrap; }', '.foot .copy.l { left: 5px; } .foot .copy.r { right: 5px; }', '.foot .glogo { position: absolute; left: 2px; bottom: 0; pointer-events: none; }', '.foot.m2007 .glogo { height: 26px; bottom: 2px; }', '.foot .scale { position: absolute; left: 80px; bottom: 3px; }', '.foot.m2005 .scale, .foot.m2006 .scale { left: 100px; }', '.foot .scale i { position: static; display: block; height: 4px; border: 2px solid #000; border-top: 0; margin-top: 1px; cursor: default; }', '.foot .scale .sl { font-size: 11px; }', // ---- 2014 onward: everything floats on the map '#ugf-maps[era="m2014"], #ugf-maps[era="m2015"], #ugf-maps[era="m2019"], #ugf-maps[era="m2022"] { font-family: Roboto, arial, sans-serif; }', '#ugf-maps-omni { position: absolute; left: 8px; top: 8px; width: 392px; z-index: 10; }', '#ugf-maps-omni #ugf-maps-form { display: flex; align-items: center; height: 48px; background: #fff; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.2), 0 -1px 0 rgba(0,0,0,.02); position: relative; }', '#ugf-maps-omni .menu { width: 18px; height: 12px; margin: 0 27px 0 19px; cursor: pointer; display: block; }', '#ugf-maps-omni .menu img { display: block; }', '#ugf-maps-omni #ugf-maps-q { flex: 1; min-width: 0; border: 0; outline: none; font: 15px Roboto, arial, sans-serif; color: #000; background: transparent; padding: 0; height: 24px; }', '#ugf-maps-omni .go { width: 18px; height: 18px; border: 0; background: none; padding: 0; margin: 0 17px 0 12px; cursor: pointer; }', '#ugf-maps-omni .go img, #ugf-maps-omni .dir img { display: block; }', '#ugf-maps-omni .sep { width: 1px; height: 28px; background: #ddd; }', '#ugf-maps-omni .dir { margin: 0 15px 0 15px; display: block; }', '#ugf-maps[era="m2014"] #ugf-maps-q { padding-left: 16px !important; }', '#ugf-maps-omni button.go14 { height: 48px; width: 64px; border: 0; background: #4d90fe; border-radius: 0 2px 2px 0; cursor: pointer; padding: 0; }', '#ugf-maps-omni #ugf-maps-panel { display: none; background: #fff; box-shadow: 0 2px 4px rgba(0,0,0,.2); border-radius: 0 0 2px 2px; margin-top: -2px; max-height: calc(100vh - 150px); overflow-y: auto; position: relative; }', '#ugf-maps-omni #ugf-maps-panel.on { display: block; border-top: 1px solid #e6e6e6; }', '#ugf-maps-omni #ugf-maps-panel .res { display: block; padding: 11px 16px 11px 64px; border-bottom: 1px solid #e6e6e6; cursor: pointer; position: relative; }', '#ugf-maps-omni #ugf-maps-panel .res:before { content: ""; position: absolute; left: 22px; top: 12px; width: 12px; height: 17px; background: url("' + A.kit.place + '") no-repeat; }', '#ugf-maps-omni #ugf-maps-panel .res .n { font: 500 13px Roboto, arial, sans-serif; color: #000 !important; text-decoration: none; }', '#ugf-maps-omni #ugf-maps-panel .res .l { font: 12px Roboto, arial, sans-serif; color: #8c8c8c; margin-top: 2px; }', '#ugf-maps-omni #ugf-maps-panel .status, #ugf-maps-omni #ugf-maps-panel .hint { padding: 0 16px 0 64px; font: 13px Roboto, arial, sans-serif; }', '#ugf-maps-omni #ugf-maps-panel .status { padding-top: 12px; } #ugf-maps-omni #ugf-maps-panel .hint { padding-bottom: 12px; color: #8c8c8c; }', '#ugf-maps-topright { position: absolute; top: 16px; right: 20px; z-index: 10; display: flex; align-items: center; gap: 22px; }', '#ugf-maps-topright .apps img { display: block; }', '#ugf-maps-topright .signin { display: flex; align-items: center; height: 29px; padding: 0 12px; background: #4285f4; border: 1px solid #4285f4; border-radius: 2px; color: #fff !important; font: bold 14px Roboto, arial, sans-serif; text-decoration: none; }', '#ugf-maps-topright .who { font: 500 13px Roboto, arial, sans-serif; color: #000; background: #fff; padding: 6px 10px; border-radius: 2px; box-shadow: 0 1px 4px rgba(0,0,0,.3); }', '.loc15 { right: 14px; bottom: 106px; width: 41px; height: 41px; cursor: pointer; }', '.zoom15 { right: 14px; bottom: 46px; width: 41px; height: 69px; }', '.loc15 img, .zoom15 img, .imagery15 img, .peg14 img { display: block; }', '.zoom15 .zi, .zoom15 .zo { position: absolute; left: 6px; width: 29px; height: 28px; cursor: pointer; }', '.zoom15 .zi { top: 6px; } .zoom15 .zo { top: 35px; }', '.imagery15 { right: 14px; bottom: 14px; width: 156px; height: 41px; }', '.imagery15 .peg { position: absolute; left: 6px; top: 6px; width: 31px; height: 29px; cursor: pointer; }', '.imagery15 .more { position: absolute; left: 37px; top: 6px; width: 113px; height: 29px; cursor: pointer; }', // ---- Street View (4.5.4 / 5.0.5) '#ugf-maps-pegfly { position: fixed; z-index: 2147483647; pointer-events: none; width: 26px; height: 36px; }', '#ugf-maps-sv { position: absolute; inset: 0; z-index: 40; background: #000; display: flex; flex-direction: column; }', '#ugf-maps-sv .pano { flex: 1; width: 100%; border: 0; display: block; min-height: 0; }', // classic Maps: a plain strip over the panorama saying where you stand '#ugf-maps-sv .svbar { display: flex; align-items: center; gap: 10px; padding: 4px 8px; background: #fff; border-bottom: 1px solid #979797; font: 13px arial, sans-serif; color: #000; }', '#ugf-maps-sv .svbar .c { color: #676767; font-size: 11px; }', '#ugf-maps-sv .svbar .back { margin-left: auto; color: #00c !important; text-decoration: underline; }', '#ugf-maps-sv[era="m2010"] .svbar, #ugf-maps-sv[era="m2011"] .svbar { background: #f1f1f1; border-bottom-color: #c5c5c5; }', // new Maps: the dark card at the top left, with the way back to the map '#ugf-maps-sv .svcard { position: absolute; left: 12px; top: 12px; z-index: 2; display: flex; align-items: center; gap: 12px; max-width: 360px; padding: 10px 16px 10px 10px; background: rgba(34,34,34,.8); color: #fff; font: 13px Roboto, arial, sans-serif; box-shadow: 0 1px 4px rgba(0,0,0,.3); }', '#ugf-maps-sv .svcard .back { color: #fff !important; text-decoration: none; font-size: 22px; line-height: 22px; padding: 0 4px; }', '#ugf-maps-sv .svcard .t { font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', '#ugf-maps-sv .svcard .c { font-size: 12px; color: #bbb; margin-top: 2px; }', '#ugf-maps-sv[era="m2019"] .svcard, #ugf-maps-sv[era="m2022"] .svcard { border-radius: 8px; }', '#ugf-maps-sv[era="m2019"] .svcard .t, #ugf-maps-sv[era="m2022"] .svcard .t { font-family: "Google Sans", Roboto, arial, sans-serif; }', '#ugf-maps .thumb { cursor: pointer; }', '#ugf-maps-sv .svzoom { right: 14px; bottom: 30px; z-index: 2; }', '.peg14 { right: 20px; bottom: 20px; width: 29px; height: 29px; background: #fff; border-radius: 2px; box-shadow: 0 1px 4px rgba(0,0,0,.3); cursor: pointer; display: flex; align-items: center; justify-content: center; }', '#ugf-maps[era="m2014"] .loc15, #ugf-maps[era="m2019"] .loc15, #ugf-maps[era="m2022"] .loc15 { bottom: 146px; }', '#ugf-maps[era="m2014"] .zoom15, #ugf-maps[era="m2019"] .zoom15, #ugf-maps[era="m2022"] .zoom15 { bottom: 86px; }', '#ugf-maps[era="m2014"] .peg14 { bottom: 52px; right: 20px; }', '#ugf-maps[era="m2019"] .peg14, #ugf-maps[era="m2022"] .peg14 { bottom: 52px; }', '#ugf-maps[era="m2019"] #ugf-maps-omni #ugf-maps-form { border-radius: 8px; }', '#ugf-maps[era="m2022"] #ugf-maps-omni #ugf-maps-form { border-radius: 24px; }', '#ugf-maps-chips { position: absolute; left: 404px; top: 8px; display: flex; gap: 8px; white-space: nowrap; }', '#ugf-maps-chips button { height: 32px; padding: 0 12px; border: 0; border-radius: 16px; background: #fff; box-shadow: 0 1px 2px rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15); font: 500 14px Roboto, arial, sans-serif; color: #3c4043; cursor: pointer; margin-top: 8px; }', '.layers19 { left: 16px; bottom: 26px; width: 74px; height: 74px; border: 2px solid #fff; border-radius: 8px; box-shadow: 0 1px 4px rgba(0,0,0,.3); cursor: pointer; overflow: hidden; }', '#ugf-maps-card { display: none; position: absolute; left: 50%; bottom: 21px; width: 384px; height: 72px; margin-left: -192px; background: #fff; border-radius: 2px; box-shadow: 0 1px 4px rgba(0,0,0,.3); z-index: 9; }', '#ugf-maps-card.on { display: block; }', '#ugf-maps-card .thumb { position: absolute; left: 3px; top: 4px; width: 96px; height: 64px; background-size: cover; background-position: center; cursor: pointer; }', '#ugf-maps-card .txt { position: absolute; left: 114px; top: 11px; right: 70px; }', '#ugf-maps-card .t { font: bold 12px Roboto, arial, sans-serif; line-height: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', '#ugf-maps-card .a { font: 12px Roboto, arial, sans-serif; line-height: 14px; margin-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', '#ugf-maps-card .c { font: 12px Roboto, arial, sans-serif; line-height: 14px; margin-top: 4px; color: #989898; }', '#ugf-maps-card .d { position: absolute; left: 323px; top: 19px; display: block; }', '#ugf-maps-card .d img { display: block; width: 34px; height: 34px; }', '#ugf-maps-card .x { position: absolute; right: 5px; top: 5px; cursor: pointer; padding: 2px; }', '.foot.m2014, .foot.m2015, .foot.m2019, .foot.m2022 { height: 13px; left: auto; right: 0; }', '.foot.m2014 .copy.r, .foot.m2015 .copy.r, .foot.m2019 .copy.r, .foot.m2022 .copy.r { position: static; display: flex; align-items: center; gap: 14px; background: rgba(255,255,255,.7); padding: 0 6px 0 4px; height: 13px; font: 10px Roboto, arial, sans-serif; color: #444; }', '.foot.m2014 .copy.r a, .foot.m2015 .copy.r a, .foot.m2019 .copy.r a, .foot.m2022 .copy.r a { color: #444 !important; text-decoration: none; }', '.foot.m2014 .scale, .foot.m2015 .scale, .foot.m2019 .scale, .foot.m2022 .scale { position: static; display: flex; align-items: center; gap: 4px; }', '.foot.m2014 .scale i, .foot.m2015 .scale i, .foot.m2019 .scale i, .foot.m2022 .scale i { height: 3px; border-width: 1px; border-color: #444; margin: 2px 0 0 0; }', '.foot.m2014 .scale .sl, .foot.m2015 .scale .sl, .foot.m2019 .scale .sl, .foot.m2022 .scale .sl { font-size: 10px; }', '.foot .glogo.mid { position: fixed; left: 50%; bottom: 14px; margin-left: -31px; }', '.foot .glogo.mid[width="70"] { margin-left: -35px; bottom: 12px; }', '#ugf-maps[era="m2019"] .foot .glogo.mid, #ugf-maps[era="m2022"] .foot .glogo.mid { margin-left: -43px; bottom: 8px; }' ].join("\n"); } // ---- end Gplex for Google Maps ---- // ---- Shopping results (Froogle on the older layouts, Google Shopping from 2012) ---- const UGF_PRICE_RE = /(?:[$£€¥₹]\s?\d[\d.,]*|\d[\d.,]*\s?(?:USD|EUR|GBP|CAD|AUD))/; const UGF_RATING_RE = /^\d(?:\.\d)?\s*(?:★|stars?)?\s*(?:\(\d[\d,]*\))?$/i; function ugfShopText(el) { const out = []; el.querySelectorAll("span, div, h3, h4, a").forEach(function(n) { if (n.children.length) { return; } const t = (n.textContent || "").replace(/\s+/g, " ").trim(); if (t && out.indexOf(t) === -1) { out.push(t); } }); return out; } function ugfFindShoppingCards() { const scope = document.querySelector("#rso") || document.querySelector("#search") || document.querySelector("#center_col") || document.body; if (!scope) { return []; } const out = []; const seen = {}; scope.querySelectorAll("img").forEach(function(img) { if (img.closest("#ugf")) { return; } const w = parseInt(img.getAttribute("width") || "0", 10) || img.naturalWidth || Math.round(img.getBoundingClientRect().width); if (w < 60) { return; } let card = null; let el = img; for (let i = 0; i < 8 && el.parentElement; i++) { el = el.parentElement; if (UGF_PRICE_RE.test(el.textContent || "")) { card = el; break; } } if (!card) { return; } const a = card.querySelector("a[href]"); if (!a) { return; } const href = ugfLensDecodeHref(a.getAttribute("href") || ""); if (!href || href.indexOf("javascript") === 0) { return; } const lines = ugfShopText(card); let price = ""; let title = ""; let merchant = ""; let rating = ""; lines.forEach(function(t) { if (!price && UGF_PRICE_RE.test(t) && t.length < 40) { price = (t.match(UGF_PRICE_RE) || [t])[0]; return; } if (!rating && UGF_RATING_RE.test(t)) { rating = t; return; } if (t.length > title.length && t.length > 12 && !UGF_PRICE_RE.test(t)) { title = t; } }); lines.forEach(function(t) { if (!merchant && t !== title && t !== price && t !== rating && t.length > 1 && t.length < 32 && !UGF_PRICE_RE.test(t) && !/^\d+$/.test(t)) { merchant = t; } }); if (!title) { title = (img.getAttribute("alt") || "").trim(); } const key = href + "|" + title; if (!title || seen[key]) { return; } seen[key] = true; out.push({ href: href, title: title, price: price, merchant: merchant, rating: rating, thumbnail: ugfNewsThumbSrc(img), origImg: img }); }); if (out.length < 6) { ugfFindShoppingByPrice(scope, out, seen); } return out.slice(0, 60); } // second pass for cards whose thumbnail has not loaded yet: start from the price instead function ugfFindShoppingByPrice(scope, out, seen) { const priceNodes = []; scope.querySelectorAll("span, div, b, strong").forEach(function(n) { if (n.children.length || priceNodes.length > 200) { return; } const t = (n.textContent || "").replace(/\s+/g, " ").trim(); if (t && t.length < 24 && UGF_PRICE_RE.test(t)) { priceNodes.push({ el: n, text: (t.match(UGF_PRICE_RE) || [t])[0] }); } }); priceNodes.forEach(function(p) { let card = null; let el = p.el; for (let i = 0; i < 8 && el.parentElement; i++) { el = el.parentElement; if (el.querySelector("a[href]") && (el.textContent || "").replace(/\s+/g, " ").trim().length > 25) { card = el; break; } } if (!card) { return; } const a = card.querySelector("a[href]"); const href = ugfLensDecodeHref(a.getAttribute("href") || ""); if (!href || href.indexOf("javascript") === 0) { return; } const lines = ugfShopText(card); let title = ""; let merchant = ""; let rating = ""; lines.forEach(function(t) { if (UGF_PRICE_RE.test(t)) { return; } if (!rating && UGF_RATING_RE.test(t)) { rating = t; return; } if (t.length > title.length && t.length > 12) { title = t; } }); lines.forEach(function(t) { if (!merchant && t !== title && t !== rating && t.length > 1 && t.length < 32 && !UGF_PRICE_RE.test(t)) { merchant = t; } }); if (!title) { return; } const key = href + "|" + title; if (seen[key]) { return; } for (let i = 0; i < out.length; i++) { if (out[i].title === title) { return; } } seen[key] = true; const img = card.querySelector("img"); out.push({ href: href, title: title, price: p.text, merchant: merchant, rating: rating, thumbnail: img ? ugfNewsThumbSrc(img) : "", origImg: img }); }); } // ---- google.com/...?gbv=1 : the no-JavaScript page, whose markup predates everything else we parse ---- function ugfBasicHref(a) { let href = a.getAttribute("href") || ""; if (href.indexOf("/url?") === 0 || href.indexOf("https://www.google.com/url?") === 0) { try { const u = new URL(href, "https://www.google.com"); href = u.searchParams.get("q") || u.searchParams.get("url") || ""; } catch (e) { href = ""; } } return /^https?:\/\//.test(href) ? href : ""; } function ugfFindBasicResults() { const scope = document.querySelector("#main") || document.querySelector("#center_col") || document.body; if (!scope) { return []; } const out = []; const seen = {}; // (6.5.3) the results' titles are headings: once there are any, links without one (the page's // own "Sign in", "Privacy", "Learn more"...) aren't results const headed = !!scope.querySelector("a[href] h3"); scope.querySelectorAll("a[href]").forEach(function(a) { if (a.closest("#ugf") || (headed && !a.querySelector("h3"))) { return; } const href = ugfBasicHref(a); if (!href || /^https?:\/\/(www\.)?google\.[^/]+\//.test(href) || seen[href]) { return; } const heading = a.querySelector("h3") || a.querySelector("div, span"); const title = ((heading ? heading.textContent : a.textContent) || "").replace(/\s+/g, " ").trim(); if (!title || title.length < 3) { return; } // climb only while this is still the one result in the container, so snippets don't bleed between results // (Google's lightweight pages mark each result's box with "xpd": that box is the result) let card = a.closest(".xpd") || a.parentElement || a; let guard = a.closest(".xpd") ? 5 : 0; while (card.parentElement && guard++ < 5) { const outer = card.parentElement; if (outer.querySelectorAll('a[href^="/url?"], a[href*="/url?q="]').length !== 1) { break; } card = outer; } let description = ""; card.querySelectorAll("div, span, td").forEach(function(n) { // (6.5.3) not the link itself: its title and address aren't the description if (n.querySelector("a") || n.contains(a) || a.contains(n)) { return; } const t = (n.textContent || "").replace(/\s+/g, " ").trim(); if (t.length > description.length && t !== title && t.length > 20) { description = n.innerHTML; } }); // (6.5.4) video results: the thumbnail beside the result, and "Duration: 25:59" under it let thumbImg = null; card.querySelectorAll("img").forEach(function(im) { const w = parseInt(im.getAttribute("width") || im.style.width || "0", 10); if (!thumbImg && !a.contains(im) && (!w || w > 30)) { thumbImg = im; } }); const dur = /Duration:\s*([0-9]{1,2}(?::[0-9]{2}){1,2})/.exec(card.textContent || ""); if (dur) { const cut = description.search(/(\s*)?Duration:/i); if (cut > 0) { description = description.slice(0, cut); } } seen[href] = true; out.push({ href: href, title: title, description: description, thumbImg: thumbImg, duration: dur ? dur[1] : "" }); }); return out; } function ugfParseBasic() { const results = ugfFindBasicResults(); let itemNo = 0; results.forEach(function(r) { if (location === "videos" && r.thumbImg) { // (6.5.4) the Videos tab of the lightweight page: video results with their thumbnails let thumb = r.thumbImg.getAttribute("src") || ""; const yt = ugfExtractYtId(r.href); if ((!thumb || thumb.indexOf("data:image/gif") > -1 || thumb.length < 100) && yt) { thumb = "https://i.ytimg.com/vi/" + yt + "/mqdefault.jpg"; } linkList.push({videoResult: { itemNo: itemNo, type: "video", href: r.href, title: ugfNewsBold(r.title), unmoddedTitle: r.title, description: r.description || "", thumbnail: thumb, duration: r.duration || "", origImg: r.thumbImg, origImgId: r.thumbImg.id || "" }}); createItem(linkList[linkList.length - 1], "videoResult"); itemNo++; return; } linkList.push({searchResult: { itemNo: itemNo, type: "result", href: r.href, title: ugfNewsBold(r.title), unmoddedTitle: r.title, description: r.description || "" }}); createItem(linkList[linkList.length - 1], "searchResult"); itemNo++; }); if (itemNo > 0) { document.querySelector("html").setAttribute("results-arrived", ""); } return itemNo; } function ugfShopFallback(why) { const h = document.querySelector("html"); if (!h.hasAttribute("shopping-results")) { return; } console.log("[Gplex] Shopping: " + why + "; showing Google's page instead"); const shell = document.querySelector("#ugf"); if (shell) { shell.remove(); } h.removeAttribute("shopping-loading"); h.removeAttribute("shopping-results"); h.removeAttribute("shopping-browse"); h.removeAttribute("gplex"); h.setAttribute("disabled", ""); } function ugfShopWatchdog() { setTimeout(function() { if (document.querySelector(".ugf-shop-result")) { return; } const found = ugfFindShoppingCards().length; const h = document.querySelector("html"); console.log("[Gplex] Shopping watchdog: cards=" + found + ", confirmed-sv=" + h.hasAttribute("confirmed-sv") + ", shell=" + !!document.querySelector("#ugf") + ", inputs=" + document.querySelectorAll("input, textarea").length); if (found) { // the page is readable, the normal path just never got there try { started = false; parseHTMLNeo("shopping"); return; } catch (e) { console.log("[Gplex] Shopping watchdog parse failed", e); } } ugfShopFallback("nothing rendered after 20s"); }, 20000); } function ugfShopEnsureShell() { if (!document.body) { return; } if (!document.querySelector("textarea") && !document.querySelector("input")) { const ta = document.createElement("textarea"); ta.style.display = "none"; try { ta.value = new URLSearchParams(window.location.search).get("q") || ""; } catch (e) {} document.body.appendChild(ta); } if (!document.querySelector("#result-stats")) { const rs = document.createElement("div"); rs.id = "result-stats"; rs.style.display = "none"; rs.innerHTML = trusted_policy.createHTML(""); document.body.appendChild(rs); } } function ugfParseShopping() { const cards = ugfFindShoppingCards(); if (!cards.length) { // nothing we can read (the "For you" browse page is mostly widgets) - hand the page back to Google ugfShopFallback("no product cards found"); return; } document.querySelector("html").removeAttribute("shopping-loading"); let itemNo = 0; cards.forEach(function(card) { linkList.push({shoppingResult: { itemNo: itemNo, type: "shopping", href: card.href, title: card.title, price: card.price, merchant: card.merchant, rating: card.rating, thumbnail: card.thumbnail, origImg: card.origImg }}); createItem(linkList[linkList.length - 1], "shoppingResult"); itemNo++; }); if (itemNo > 0) { document.querySelector("html").setAttribute("results-arrived", ""); } ugfShoppingNav(); } function ugfShoppingNav() { ["#ugf-all-tab", "#ugf-all-item", "#gp-gbar-search"].forEach(function(sel) { const e = document.querySelector(sel); if (e) { e.classList.remove("active"); } }); // light up whichever era link stands for Shopping (Froogle before 2011) document.querySelectorAll("#ugf-era-nav a, .ugf-era-nav a, #ugf-top a, .ugf-tab").forEach(function(a) { const t = (a.textContent || "").trim(); if (ugfIsShoppingLink(t) || t === ugfT("Froogle") || t === ugfT("Shopping")) { a.classList.add("active"); } else if (t === "Web" || t === "All" || t === ugfT("Web") || t === ugfT("All")) { a.classList.remove("active"); } }); } function ugfRenderShoppingItem(item) { const container = document.querySelector("#ugf-search-results-container"); if (!container) { return; } const el = document.createElement("div"); el.className = "ugf-search-result ugf-shop-result"; const hasThumb = item.thumbnail && item.thumbnail.indexOf("data:image/gif") !== 0; el.innerHTML = trusted_policy.createHTML( '
' + (hasThumb ? '' : '') + '
' + '' + ugfEscapeHtml(item.title) + '' + (item.price ? '
' + ugfEscapeHtml(item.price) + '
' : '') + (item.merchant ? '
' + ugfEscapeHtml(item.merchant) + '
' : '') + (item.rating ? '
' + ugfEscapeHtml(item.rating) + '
' : '') + '
' + '
'); container.insertBefore(el, container.children[item.itemNo] || null); if (!hasThumb && item.origImg) { let tries = 0; const t = setInterval(function() { tries++; const src = ugfNewsThumbSrc(item.origImg); if (src) { clearInterval(t); const a = document.createElement("a"); a.className = "ugf-shop-thumb"; a.href = item.href; const img = document.createElement("img"); img.src = src; a.appendChild(img); const inner = el.querySelector(".ugf-shop-result-inner"); const ph = inner.querySelector(".ugf-shop-thumb-empty"); if (ph) { inner.replaceChild(a, ph); } else { inner.insertBefore(a, inner.firstChild); } } else if (tries >= 100) { clearInterval(t); } }, 150); } } function ugfNewsPickThumb(container, card) { let best = null; let bestScore = -1; container.querySelectorAll("img").forEach(function(img) { if (img.closest('[role="heading"]')) { return; } const aw = parseInt(img.getAttribute("width") || "0", 10); const ah = parseInt(img.getAttribute("height") || "0", 10); const nw = img.naturalWidth || 0; const st = (img.getAttribute("style") || "") + " " + (img.parentElement ? img.parentElement.getAttribute("style") || "" : ""); const sw = parseInt((st.match(/width:\s*(\d+)px/) || [0, 0])[1], 10); const size = Math.max(aw, ah, nw > 1 ? nw : 0, sw); if (size > 0 && size < 36) { return; // favicon } const src = img.getAttribute("src") || ""; if (/favicon|faviconV2|\/s2\/favicons/.test(src)) { return; } const afterHeading = card.heading.compareDocumentPosition(img) & Node.DOCUMENT_POSITION_FOLLOWING; let score = size; if (/^dimg_/.test(img.id || "")) { score += 1000; } if (afterHeading) { score += 500; } if (size === 0 && !afterHeading && !/^dimg_/.test(img.id || "")) { score = 1; // unknown size before the headline: only if nothing better } if (score > bestScore) { best = img; bestScore = score; } }); return best; } function ugfNewsThumbSrc(img) { const ok = function(v) { return v && v.indexOf("data:image/gif") !== 0 && v.length >= 40 ? v : ""; }; return ok(img.getAttribute("src") || "") || ok(ugfGetDeferredImage(img.id)) || ok(img.getAttribute("data-src") || "") || ok(img.getAttribute("data-iurl") || "") || ok(((img.getAttribute("srcset") || img.getAttribute("data-srcset") || "").split(",")[0] || "").trim().split(" ")[0]) || ok(img.currentSrc || ""); } function ugfParseNews() { const cards = ugfFindNewsCards(document); let itemNo = 0; cards.forEach(function(card) { const container = ugfNewsCardContainer(card, cards); const title = card.heading.textContent.replace(/\s+/g, " ").trim(); const blocks = ugfNewsTextBlocks(container).filter(function(b) { return !card.heading.contains(b.el) && b.text !== title; }); let source = ""; let time = ""; let snippet = ""; blocks.forEach(function(b) { const before = card.heading.compareDocumentPosition(b.el) & Node.DOCUMENT_POSITION_PRECEDING; if (before) { if (!source && b.text.length < 80) { source = b.text; } } else if ((UGF_NEWS_TIME_RE.test(b.text) || UGF_NEWS_TIME_RE_INTL.test(b.text)) && b.text.length < 40) { time = b.text; } else if (b.text.length > snippet.length) { snippet = b.text; } }); if (!source) { try { source = new URL(card.href).hostname.replace(/^www\./, ""); } catch (e) {} } const imgEl = ugfNewsPickThumb(container, card); const thumb = imgEl ? ugfNewsThumbSrc(imgEl) : ""; if (!imgEl && container.querySelector("img")) { console.log("[Gplex] News: no thumbnail picked in card", card.href); } linkList.push({newsResult: { itemNo: itemNo, type: "news", href: card.href, title: title, source: source, time: time, description: snippet, thumbnail: thumb, origImg: imgEl }}); createItem(linkList[linkList.length - 1], "newsResult"); itemNo++; }); if (itemNo > 0) { document.querySelector("html").setAttribute("results-arrived", ""); } } function ugfRenderNewsItem(item) { const container = document.querySelector("#ugf-search-results-container"); if (!container) { return; } const el = document.createElement("div"); el.className = "ugf-search-result ugf-news-result"; const meta = [item.source, item.time].filter(Boolean).map(ugfEscapeHtml).join(' - '); const hasThumb = item.thumbnail && item.thumbnail.indexOf("data:image/gif") !== 0; el.innerHTML = trusted_policy.createHTML( '
' + '
' + '' + ugfNewsBold(item.title) + '' + '
' + meta + '
' + '
' + ugfNewsBold(item.description) + '
' + '
' + (hasThumb ? '' : '') + '
'); container.insertBefore(el, container.children[item.itemNo] || null); if (!hasThumb && item.origImg) { let tries = 0; try { item.origImg.loading = "eager"; } catch (e) {} const t = setInterval(function() { tries++; const src = ugfNewsThumbSrc(item.origImg); if (src) { clearInterval(t); const a = document.createElement("a"); a.className = "ugf-news-result-thumb"; a.href = item.href; const img = document.createElement("img"); img.src = src; a.appendChild(img); el.querySelector(".ugf-news-result-inner").appendChild(a); } else if (tries >= 100) { clearInterval(t); console.log("[Gplex] News: no thumbnail found for", item.href, item.origImg.outerHTML.slice(0, 300)); } }, 150); } } // ---- 2000-2005 results pages, measured from Dec 2000 / Nov 2002 / Apr 2003 captures ---- function ugfClassicEras() { return ["gplex2000", "gplex2001", "gplex2002", "gplex2003"]; } function ugfClassicSerpActive() { const h = document.querySelector("html"); const loc = h.getAttribute("location") || ""; return ugfClassicEras().indexOf(ugfRetroEra()) > -1 && loc !== "gplex" && !/home$/.test(loc); } function ugfClassicResultsLine() { const span = document.querySelector("#ugf-search-results-header span"); if (!span || span.getAttribute("data-classic")) { return; } const txt = span.textContent || ""; const nums = txt.match(/\d[\d.,   ]*\d|\d/g); const count = nums && nums.length ? nums[0].trim() : ""; const secs = nums && nums.length > 1 ? nums[nums.length - 1].trim() : ""; let first = 0; try { first = parseInt(new URLSearchParams(window.location.search).get("start") || "0", 10) || 0; } catch (e) {} first = first + 1; const q = ugfEscapeHtml(searchValue || ""); const onNews = document.querySelector("html").hasAttribute("news-results"); const onImagesPage = document.querySelector("html").getAttribute("location") === "images"; let right = "Results " + first + " - " + (first + 9) + "" + (count ? " of about " + ugfEscapeHtml(count) + "" : "") + "."; if (secs) { right += " Search took " + ugfEscapeHtml(secs) + " seconds."; } span.setAttribute("data-classic", "1"); span.innerHTML = trusted_policy.createHTML('Searched ' + (onNews ? "news" : (onImagesPage ? "images" : "the web")) + ' for ' + q + '.' + right + ''); } function ugfClassicUrlLines(root) { (root || document).querySelectorAll("#ugf-search-results-container .ugf-search-result:not([data-classic-url])").forEach(function(res) { const link = res.querySelector(".ugf-search-result-link"); const inner = res.querySelector(".ugf-search-result-inner") || res; if (!link) { return; } res.setAttribute("data-classic-url", "1"); const href = link.getAttribute("href") || ""; let shown = href.replace(/^https?:\/\//, ""); if (shown.length > 60) { shown = shown.slice(0, 57) + "..."; } const line = document.createElement("div"); line.className = "ugf-classic-urlline"; const u = document.createElement("span"); u.className = "ugf-classic-url"; u.textContent = shown; line.appendChild(u); const add = function(label, url) { line.appendChild(document.createTextNode(" - ")); const a = document.createElement("a"); a.className = "ugf-classic-sub"; a.href = url; a.textContent = label; line.appendChild(a); }; add("Cached", "https://web.archive.org/web/2/" + href); add("Similar pages", "https://www.google.com/search?q=" + encodeURIComponent("related:" + href.replace(/^https?:\/\//, ""))); inner.appendChild(line); }); } // 2000-2005 results footer, from the Apr 2003 capture: Result Page label, bottom search box, // "Dissatisfied?" line, blue link bar and copyright. function ugfClassicFooter() { const h = document.querySelector("html"); if (h.getAttribute("location") === "images" || document.querySelector("#ugf-classic-bottom")) { return; } const era = ugfRetroEra(); const year = { gplex2000: "2000", gplex2001: "2001", gplex2002: "2002", gplex2003: "2003", gplex2005: "2005" }[era] || "2003"; let q = ""; try { q = new URLSearchParams(window.location.search).get("q") || ""; } catch (e) {} ugf2009WaitFor("#ugf-footer", function(footer) { if (document.querySelector("#ugf-classic-bottom")) { return; } const box = document.createElement("div"); box.id = "ugf-classic-bottom"; const row = document.createElement("div"); row.className = "ugf-cb-search"; const input = document.createElement("input"); input.type = "text"; input.value = q; const go = function(query) { if (query.trim()) { window.location = "https://www.google.com/search?q=" + encodeURIComponent(query.trim()); } }; input.addEventListener("keydown", function(ev) { if (ev.key === "Enter") { go(input.value); } }); const btn = document.createElement("button"); btn.textContent = "Google Search"; btn.addEventListener("click", function() { go(input.value); }); const within = document.createElement("a"); within.href = "#"; within.textContent = "Search within results"; within.addEventListener("click", function(ev) { ev.preventDefault(); const extra = input.value.trim() === q.trim() ? "" : input.value.trim(); go(extra ? q + " " + extra : q); }); row.appendChild(input); row.appendChild(btn); row.appendChild(within); const dis = document.createElement("div"); dis.className = "ugf-cb-dissatisfied"; dis.appendChild(document.createTextNode("Dissatisfied with your search results? ")); const help = document.createElement("a"); help.href = "https://support.google.com/websearch"; help.textContent = "Help us improve."; dis.appendChild(help); const bar = document.createElement("div"); bar.className = "ugf-cb-bar"; [["Google Home", "https://www.google.com/"], ["Advertise with Us", "https://ads.google.com/"], ["Business Solutions", "https://www.google.com/services/"], ["Services & Tools", "https://www.google.com/intl/en/options/"], ["Jobs, Press, & Help", "https://about.google/"]].forEach(function(l, i) { if (i > 0) { bar.appendChild(document.createTextNode(" - ")); } const a = document.createElement("a"); a.href = l[1]; a.textContent = l[0]; bar.appendChild(a); }); const copy = document.createElement("div"); copy.className = "ugf-cb-copy"; copy.textContent = "©" + year + " Google"; box.appendChild(row); box.appendChild(dis); box.appendChild(bar); box.appendChild(copy); footer.appendChild(box); }); } function ugfClassicSerp() { const loc0 = document.querySelector("html").getAttribute("location") || ""; if (ugfRetroEra() === "gplex2005" && loc0 !== "gplex" && loc0 !== "images" && !/home$/.test(loc0)) { document.querySelector("html").setAttribute("era-urlline", ""); ugf2009WaitFor("#ugf-search-results-container", function(container) { ugfClassicUrlLines(container); new MutationObserver(function() { ugfClassicUrlLines(container); }).observe(container, { childList: true }); }); } if (!ugfClassicSerpActive()) { return; } const era = ugfRetroEra(); const h = document.querySelector("html"); h.setAttribute("era-serp-classic", era === "gplex2000" || era === "gplex2001" ? "notabs" : "tabs"); const q = searchValue || (function() { try { return new URLSearchParams(window.location.search).get("q") || ""; } catch (e) { return ""; } })(); ugf2009WaitFor("#ugf-topbar #ugf-search", function(searchEl) { const outer = searchEl.parentElement; if (!outer.querySelector("#ugf-classic-links")) { const row = document.createElement("div"); row.id = "ugf-classic-links"; const links = [["Advanced Search", "https://www.google.com/advanced_search?q=" + encodeURIComponent(q)], ["Preferences", "https://www.google.com/preferences"]]; if (h.getAttribute("era-serp-classic") === "tabs") { links.push(["Language Tools", "https://www.google.com/language_tools"]); } links.push(["Search Tips", "https://www.google.com/intl/en/help/basics.html"]); links.forEach(function(l) { const a = document.createElement("a"); a.href = l[1]; a.textContent = l[0]; row.appendChild(a); }); outer.insertBefore(row, searchEl); } }); ugf2009WaitFor("#ugf-topbar #ugf-search .searchbtn-small", function(btn) { btn.textContent = "Google Search"; if (h.getAttribute("era-serp-classic") === "notabs" && !btn.parentElement.querySelector(".ugf-classic-lucky")) { const lucky = document.createElement("button"); lucky.className = "searchbtn-small ugf-classic-lucky"; lucky.textContent = "I'm Feeling Lucky"; lucky.addEventListener("click", function() { const v = document.querySelector("#ugf-search-value").value; window.location = "https://www.google.com/search?q=" + encodeURIComponent(v) + "&btnI=I%27m+Feeling+Lucky"; }); btn.parentElement.appendChild(lucky); } }); if (h.getAttribute("era-serp-classic") === "tabs") { ugf2009WaitFor("#ugf-topbar .ugf-era-nav", function(nav) { const header = document.querySelector("#ugf-search-results-header"); if (!header) { return; } nav.classList.add("ugf-classic-tabs"); const more = nav.querySelector("a.more"); if (more) { more.remove(); } if (era === "gplex2002" && !Array.from(nav.querySelectorAll("a")).some(function(a) { return a.textContent.trim() === "News"; })) { const news = document.createElement("a"); news.href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&tbm=nws"; news.textContent = "News"; news.className = "ugf-classic-wide"; if (document.querySelector("html").hasAttribute("news-results")) { nav.querySelectorAll("a.active").forEach(function(a) { a.classList.remove("active"); }); news.classList.add("active"); } nav.appendChild(news); } const mainInner = document.querySelector("#ugf-main-inner"); if (mainInner) { mainInner.insertBefore(header, mainInner.firstChild); } header.parentElement.insertBefore(nav, header); }); } else { ugf2009WaitFor("#ugf-search-results-header", function(header) { const mainInner = document.querySelector("#ugf-main-inner"); if (mainInner && header.parentElement !== mainInner) { mainInner.insertBefore(header, mainInner.firstChild); } }); } ugfClassicFooter(); ugf2009WaitFor("#ugf-search-results-container", function(container) { ugfClassicUrlLines(container); new MutationObserver(function() { ugfClassicUrlLines(container); }).observe(container, { childList: true }); }); } function ugfEscapeHtml(t) { return String(t == null ? "" : t) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """); } function ugfParseResultsFrom(doc) { const out = []; const heads = doc.querySelectorAll("h3"); heads.forEach(function(h) { const a = h.closest("a[href]"); if (!a) { return; } let href = a.getAttribute("href") || ""; if (href.indexOf("/url?") === 0) { try { href = new URLSearchParams(href.split("?")[1]).get("q") || href; } catch (e) {} } if (href.indexOf("http") !== 0) { return; } if (href.indexOf("google.com/search") > -1) { return; } const title = (h.textContent || "").trim(); if (!title) { return; } let desc = ""; let block = a.closest("div[data-hveid]") || a.parentElement; for (let hop = 0; hop < 4 && block; hop++) { const spans = block.querySelectorAll("div > span, div[data-sncf] span"); for (let i = 0; i < spans.length; i++) { const t = (spans[i].textContent || "").trim(); if (t.length > 40 && t.indexOf(title) === -1) { desc = t; break; } } if (desc) { break; } block = block.parentElement; } out.push({ title: title, href: href, desc: desc }); }); return out; } // 1997-1998: the "N results" dropdown limits how many result pages the Goooogle pager offers // (10 results = page 1 only, 30 = pages 1-3, 100 = pages 1-10). function ugfEraPageLimit() { const era = ugfRetroEra(); if (era !== "gplex1997" && era !== "gplex1998") { return; } let num = 10; let start = 0; try { const sp = new URLSearchParams(window.location.search); num = parseInt(sp.get("num") || "", 10) || parseInt(localStorage.getItem("UGF_ERA_NUM") || "10", 10) || 10; start = parseInt(sp.get("start") || "0", 10) || 0; } catch (e) {} const maxPages = Math.max(1, Math.min(10, Math.round(num / 10))); const curPage = Math.floor(start / 10) + 1; const h = document.querySelector("html"); h.setAttribute("era-max-pages", String(maxPages)); if (curPage >= maxPages) { h.setAttribute("era-last-page", ""); } } // ---- Reverse image search (Google Lens) themed as "Search by image" (2011-2016) / "Google Lens" (2017+) ---- // Google's Lens page stays visible until enough visual matches are found; if parsing fails it is left untouched. // ---- "Search by image" (2011-2016) and "Google Lens" (2017+) entry: camera icon + panel, no Google page needed ---- const UGF_CAMERA_SVG = ''; function ugfSbiSearchUrl(u) { u = (u || "").trim(); if (!/^https?:\/\//i.test(u)) { return false; } window.location = "https://lens.google.com/uploadbyurl?url=" + encodeURIComponent(u); return true; } function ugfSbiUploadForm() { const form = document.createElement("form"); form.method = "POST"; form.enctype = "multipart/form-data"; form.style.display = "none"; const file = document.createElement("input"); file.type = "file"; file.name = "encoded_image"; file.accept = "image/*"; form.appendChild(file); const send = function() { if (!file.files || !file.files.length) { return; } form.action = "https://lens.google.com/v3/upload?hl=" + encodeURIComponent(UGF_LANG_HL) + "&re=df&ep=gsbubb&st=" + Date.now(); form.submit(); }; file.addEventListener("change", send); return { form: form, file: file, send: send }; } function ugfSbiHandleDrop(ev, up) { ev.preventDefault(); const dt = ev.dataTransfer; if (!dt) { return; } if (dt.files && dt.files.length) { try { up.file.files = dt.files; up.send(); return; } catch (e) {} } const uri = (dt.getData("text/uri-list") || dt.getData("text/plain") || "").split("\n")[0]; ugfSbiSearchUrl(uri); } function ugfSbiBuildPanel(style) { const panel = document.createElement("div"); panel.id = "ugf-sbi-panel"; panel.className = "ugf-sbi-" + style; const up = ugfSbiUploadForm(); panel.appendChild(up.form); const close = document.createElement("a"); close.className = "ugf-sbi-close"; close.href = "#"; close.textContent = "×"; close.addEventListener("click", function(ev) { ev.preventDefault(); panel.remove(); }); if (style === "sbi") { const title = document.createElement("div"); title.className = "ugf-sbi-title"; title.textContent = "Search by image"; const desc = document.createElement("div"); desc.className = "ugf-sbi-desc"; desc.textContent = "Search Google with an image instead of text. Try dragging an image here."; const tabs = document.createElement("div"); tabs.className = "ugf-sbi-tabs"; const tUrl = document.createElement("a"); tUrl.href = "#"; tUrl.textContent = "Paste image URL"; tUrl.className = "active"; const tUp = document.createElement("a"); tUp.href = "#"; tUp.textContent = "Upload an image"; tabs.appendChild(tUrl); tabs.appendChild(tUp); const bodyUrl = document.createElement("div"); bodyUrl.className = "ugf-sbi-body"; const inp = document.createElement("input"); inp.type = "text"; const btn = document.createElement("button"); btn.textContent = "Search by image"; btn.addEventListener("click", function() { ugfSbiSearchUrl(inp.value); }); inp.addEventListener("keydown", function(ev) { if (ev.key === "Enter") { ugfSbiSearchUrl(inp.value); } }); bodyUrl.appendChild(inp); bodyUrl.appendChild(btn); const bodyUp = document.createElement("div"); bodyUp.className = "ugf-sbi-body"; bodyUp.style.display = "none"; const pick = document.createElement("button"); pick.className = "ugf-sbi-choose"; pick.textContent = "Choose File"; const none = document.createElement("span"); none.className = "ugf-sbi-none"; none.textContent = "No file chosen"; pick.addEventListener("click", function() { up.file.click(); }); up.file.addEventListener("change", function() { if (up.file.files && up.file.files[0]) { none.textContent = up.file.files[0].name; } }); bodyUp.appendChild(pick); bodyUp.appendChild(none); tUrl.addEventListener("click", function(ev) { ev.preventDefault(); tUrl.className = "active"; tUp.className = ""; bodyUrl.style.display = ""; bodyUp.style.display = "none"; }); tUp.addEventListener("click", function(ev) { ev.preventDefault(); tUp.className = "active"; tUrl.className = ""; bodyUp.style.display = ""; bodyUrl.style.display = "none"; }); panel.appendChild(close); panel.appendChild(title); panel.appendChild(desc); panel.appendChild(tabs); panel.appendChild(bodyUrl); panel.appendChild(bodyUp); setTimeout(function() { inp.focus(); }, 0); } else { const title = document.createElement("div"); title.className = "ugf-sbi-title"; title.textContent = "Search any image with Google Lens"; const drop = document.createElement("div"); drop.className = "ugf-sbi-drop"; drop.innerHTML = trusted_policy.createHTML('
' + UGF_CAMERA_SVG + '
Drag an image here or upload a file
'); drop.querySelector(".ugf-sbi-upload").addEventListener("click", function(ev) { ev.preventDefault(); up.file.click(); }); const or = document.createElement("div"); or.className = "ugf-sbi-or"; or.innerHTML = trusted_policy.createHTML("OR"); const row = document.createElement("div"); row.className = "ugf-sbi-body"; const inp = document.createElement("input"); inp.type = "text"; inp.placeholder = "Paste image link"; const btn = document.createElement("button"); btn.textContent = "Search"; btn.addEventListener("click", function() { ugfSbiSearchUrl(inp.value); }); inp.addEventListener("keydown", function(ev) { if (ev.key === "Enter") { ugfSbiSearchUrl(inp.value); } }); row.appendChild(inp); row.appendChild(btn); panel.appendChild(close); panel.appendChild(title); panel.appendChild(drop); panel.appendChild(or); panel.appendChild(row); } panel.addEventListener("dragover", function(ev) { ev.preventDefault(); panel.classList.add("ugf-sbi-dragging"); }); panel.addEventListener("dragleave", function() { panel.classList.remove("ugf-sbi-dragging"); }); panel.addEventListener("drop", function(ev) { panel.classList.remove("ugf-sbi-dragging"); ugfSbiHandleDrop(ev, up); }); return panel; } function ugfSbiCamera() { const style = ugfLensStyle(); if (!style) { return; } const h = document.querySelector("html"); const loc = h.getAttribute("location") || ""; const onImages = loc === "images" || ugfHomeVertical === "images"; const lensEverywhere = h.hasAttribute("gplex2022") && /home$/.test(loc); if (!onImages && !lensEverywhere && loc !== "lens") { return; } const sel = /home$/.test(loc) ? "#ugf-hp-search #ugf-searchbar" : "#ugf-top #ugf-searchbar"; ugf2009WaitFor(sel, function(bar) { if (bar.querySelector(".ugf-sbi-camera")) { return; } h.setAttribute("sbi-camera", style); const cam = document.createElement("a"); cam.href = "#"; cam.className = "ugf-sbi-camera"; cam.title = style === "lens" ? "Search by image (Google Lens)" : "Search by image"; cam.innerHTML = trusted_policy.createHTML(UGF_CAMERA_SVG); cam.addEventListener("click", function(ev) { ev.preventDefault(); const open = document.querySelector("#ugf-sbi-panel"); if (open) { open.remove(); return; } const panel = ugfSbiBuildPanel(style); bar.appendChild(panel); }); bar.appendChild(cam); }); } function ugfLensStyle() { const h = document.querySelector("html"); const era = ugfRetroEra(); if (era === "gplex2022") { return "lens"; } if (era) { return null; } const layout = h.getAttribute("layout") || ""; if (["2017", "2018", "2018M", "2019"].indexOf(layout) > -1) { return "lens"; } if (["2011", "2012", "2013", "2013L", "2014", "2015", "2015L", "2016", "2016C", "2016L"].indexOf(layout) > -1) { return "sbi"; } return null; } function ugfLensDecodeHref(href) { if (href.indexOf("/url?") === 0 || href.indexOf("https://www.google.com/url?") === 0) { try { const u = new URL(href, "https://www.google.com"); return u.searchParams.get("q") || u.searchParams.get("url") || href; } catch (e) {} } return href; } function ugfLensImgSrc(img) { let src = img.getAttribute("src") || ""; if (!src || src.indexOf("data:image/gif") === 0 || (src.indexOf("data:") === 0 && src.length < 100)) { src = img.getAttribute("data-src") || ugfGetDeferredImage(img.id) || ""; } return src; } function ugfFindLensCards() { const out = []; const seen = {}; document.querySelectorAll("a[href]").forEach(function(a) { if (a.closest("#ugf")) { return; } const href = ugfLensDecodeHref(a.getAttribute("href") || ""); if (!/^https?:\/\//.test(href) || seen[href]) { return; } let host = ""; try { host = new URL(href).hostname; } catch (e) { return; } if (/(^|\.)google\.[a-z.]+$/.test(host) || /gstatic\.com$|googleusercontent\.com$|googleadservices\.com$/.test(host)) { return; } const img = a.querySelector("img"); if (!img) { return; } const r = img.getBoundingClientRect(); const w = r.width || parseInt(img.getAttribute("width") || "0", 10); if (w < 50) { return; } const thumb = ugfLensImgSrc(img); if (!thumb) { return; } let title = (a.getAttribute("aria-label") || "").trim(); if (!title) { const texts = []; a.querySelectorAll("*").forEach(function(e) { if (!e.children.length) { const t = (e.textContent || "").replace(/\s+/g, " ").trim(); if (t.length > 3 && t.indexOf(host.replace(/^www\./, "")) === -1) { texts.push(t); } } }); texts.sort(function(x, y) { return y.length - x.length; }); title = texts[0] || img.getAttribute("alt") || host; } seen[href] = true; out.push({ href: href, title: title, source: host.replace(/^www\./, ""), thumb: thumb }); }); return out; } function ugfFindLensQueryImage() { let best = null; let bestArea = 0; document.querySelectorAll("img").forEach(function(img) { if (img.closest("#ugf")) { return; } const a = img.closest("a[href]"); if (a && /^https?:\/\//.test(ugfLensDecodeHref(a.getAttribute("href") || "")) && !/google\./.test(a.getAttribute("href") || "")) { return; } const r = img.getBoundingClientRect(); const area = r.width * r.height; if (r.width >= 80 && r.height >= 60 && area > bestArea && ugfLensImgSrc(img)) { best = img; bestArea = area; } }); return best; } function ugfLensTheme() { const h = document.querySelector("html"); if (h.getAttribute("location") !== "lens") { return; } const style = ugfLensStyle(); if (!style) { return; } // show the themed shell straight away; Google's Lens page keeps rendering off-screen so it can be parsed h.setAttribute("lens-page", style); h.setAttribute("lens-loading", ""); h.removeAttribute("disabled"); ugfLensStartShell(style); let polls = 0; let lastCount = -1; const timer = setInterval(function() { polls++; const cards = ugfFindLensCards(); const status = document.querySelector("#ugf-lens-loading"); if (status) { status.textContent = "Loading... " + cards.length + " result" + (cards.length === 1 ? "" : "s") + " found"; } const ready = (cards.length >= 4 && cards.length === lastCount) || (polls > 20 && cards.length >= 2); lastCount = cards.length; if (ready) { clearInterval(timer); ugfBuildLensPage(style, cards, ugfFindLensQueryImage()); } else if (polls > 40) { clearInterval(timer); console.log("[Gplex] Lens: only " + cards.length + " visual matches found; showing Google's page instead"); const shell = document.querySelector("#ugf"); if (shell) { shell.remove(); } h.removeAttribute("lens-loading"); h.removeAttribute("lens-page"); h.setAttribute("disabled", ""); } }, 300); } function ugfLensImagesTab() { ["#ugf-all-tab", "#ugf-all-item", "#gp-gbar-search"].forEach(function(sel) { const e = document.querySelector(sel); if (e) { e.classList.remove("active"); } }); ["#ugf-images-tab", "#ugf-images-item", "#gp-gbar-images"].forEach(function(sel) { const e = document.querySelector(sel); if (e) { e.classList.add("active"); } }); } function ugfLensStartShell(style) { const ensure = function() { if (!document.body) { return false; } if (!document.querySelector("textarea") && !document.querySelector("input")) { const ta = document.createElement("textarea"); ta.style.display = "none"; document.body.appendChild(ta); } if (!document.querySelector("#result-stats")) { const rs = document.createElement("div"); rs.id = "result-stats"; rs.style.display = "none"; rs.innerHTML = trusted_policy.createHTML(""); document.body.appendChild(rs); } return true; }; ensure(); document.title = style === "lens" ? "Google Lens" : "Google Search by image"; createPageShell("lens"); ugf2009WaitFor("#ugf-search-results-container", function(container) { if (container.querySelector("#ugf-lens")) { return; } const load = document.createElement("div"); load.id = "ugf-lens-loading"; load.textContent = "Loading... 0 results found"; container.innerHTML = ugfTT(""); container.appendChild(load); ugfLensImagesTab(); }); } function ugfBuildLensPage(style, cards, qImg) { const h = document.querySelector("html"); const qSrc = qImg ? ugfLensImgSrc(qImg) : ""; const qW = qImg ? (qImg.naturalWidth || 0) : 0; const qH = qImg ? (qImg.naturalHeight || 0) : 0; h.removeAttribute("lens-loading"); ugf2009WaitFor("#ugf-top #ugf-searchbar", function(bar) { if (bar.querySelector(".ugf-lens-chip")) { return; } const chip = document.createElement("span"); chip.className = "ugf-lens-chip"; if (qSrc) { const ci = document.createElement("img"); ci.src = qSrc; chip.appendChild(ci); } const lab = document.createElement("span"); lab.textContent = style === "lens" ? "Google Lens" : "image"; chip.appendChild(lab); const x = document.createElement("a"); x.href = "https://www.google.com/imghp"; x.textContent = "×"; x.title = "Remove image"; chip.appendChild(x); bar.insertBefore(chip, bar.firstChild); const input = bar.querySelector("#ugf-search-value"); if (input) { input.value = ""; input.placeholder = ""; } }); ugf2009WaitFor("#ugf-search-results-container", function(container) { const loadingNote = container.querySelector("#ugf-lens-loading"); if (loadingNote) { loadingNote.remove(); } const box = document.createElement("div"); box.id = "ugf-lens"; const top = document.createElement("div"); top.className = "ugf-lens-top"; if (qSrc) { const qi = document.createElement("img"); qi.className = "ugf-lens-query"; qi.src = qSrc; top.appendChild(qi); } const info = document.createElement("div"); info.className = "ugf-lens-info"; if (style === "lens") { info.innerHTML = trusted_policy.createHTML('
Google Lens
' + cards.length + ' visual matches
'); } else { info.innerHTML = trusted_policy.createHTML('
Search by image
' + (qW && qH ? '
Image size:
' + qW + " × " + qH + "
" : "") + '
' + cards.length + " matches found
"); } top.appendChild(info); box.appendChild(top); const grid = document.createElement("div"); grid.className = "ugf-lens-grid"; const head1 = document.createElement("div"); head1.className = "ugf-lens-heading"; head1.textContent = style === "lens" ? "Visual matches" : "Visually similar images"; box.appendChild(head1); cards.slice(0, style === "lens" ? 60 : 16).forEach(function(c) { const a = document.createElement("a"); a.className = "ugf-lens-card"; a.href = c.href; a.title = c.title; const im = document.createElement("img"); im.src = c.thumb; a.appendChild(im); if (style === "lens") { const t = document.createElement("div"); t.className = "ugf-lens-card-title"; t.textContent = c.title; const so = document.createElement("div"); so.className = "ugf-lens-card-source"; so.textContent = c.source; a.appendChild(so); a.appendChild(t); } grid.appendChild(a); }); box.appendChild(grid); if (style === "sbi") { const head2 = document.createElement("div"); head2.className = "ugf-lens-heading"; head2.textContent = "Pages that include matching images"; box.appendChild(head2); cards.slice(0, 10).forEach(function(c) { const r = document.createElement("div"); r.className = "ugf-search-result ugf-lens-page-result"; r.innerHTML = trusted_policy.createHTML( '' + ''); box.appendChild(r); }); } container.innerHTML = ugfTT(""); container.appendChild(box); h.setAttribute("results-arrived", ""); ugfLensImagesTab(); }); } function ugfContinuousScroll() { if (!document.querySelector("html").hasAttribute("gplex2022")) { return; } const loc = document.querySelector("html").getAttribute("location") || ""; if (loc === "home" || loc === "structured-home" || loc === "gplex" || loc === "news" || loc === "images") { return; } ugf2009WaitFor("#ugf-search-results-container", function(container) { let q = ""; let start = 0; try { const sp = new URLSearchParams(window.location.search); q = sp.get("q") || ""; start = parseInt(sp.get("start") || "0", 10) || 0; } catch (e) { return; } if (!q) { return; } let nextStart = start + 10; let loading = false; let pagesLoaded = 0; const maxPages = 8; const status = document.createElement("div"); status.className = "ugf-scroll-status"; container.parentElement.appendChild(status); function loadMore() { if (loading || pagesLoaded >= maxPages) { return; } loading = true; status.textContent = "Loading more results\u2026"; fetch("https://www.google.com/search?q=" + encodeURIComponent(q) + "&start=" + nextStart, { credentials: "same-origin" }) .then(function(r) { return r.text(); }) .then(function(html) { const doc = new DOMParser().parseFromString(ugfTT(html), "text/html"); const results = ugfParseResultsFrom(doc); if (!results.length) { console.warn("[Gplex] continuous scroll: no results parsed from start=" + nextStart + " (Google markup may have changed)"); status.textContent = ""; pagesLoaded = maxPages; return; } results.forEach(function(res) { const el = document.createElement("div"); el.classList.add("ugf-search-result"); el.innerHTML = ugfTT(` `); container.appendChild(el); }); nextStart += 10; pagesLoaded++; status.textContent = ""; loading = false; }) .catch(function(err) { console.warn("[Gplex] continuous scroll fetch failed:", err); status.textContent = ""; loading = false; pagesLoaded = maxPages; }); } window.addEventListener("scroll", function() { if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 900) { loadMore(); } }); }); } function ugfRetroFooter() { const era = ugfRetroEra(); if (!era) { return; } const conf = UGF_RETRO_CHROME[era]; if (!conf || !conf.footer) { return; } ugf2009WaitFor("#ugf-structured-hp-footer-left", function(left) { if (left.querySelector(".ugf-era-footer-link")) { return; } Array.from(left.children).forEach(function(el) { el.style.display = "none"; }); conf.footer.forEach(function(item, i) { if (i > 0) { const dash = document.createElement("span"); dash.className = "ugf-era-footer-dash"; dash.textContent = "-"; left.appendChild(dash); } const a = document.createElement("a"); a.className = "ugf-era-footer-link"; a.href = item[1]; a.textContent = item[0]; left.appendChild(a); if (conf.footerBreakAfter && (i + 1) === conf.footerBreakAfter) { left.appendChild(document.createElement("br")); } }); }); if (conf.copyright) { ugf2009WaitFor("#ugf-structured-hp-footer-right", function(right) { if (right.querySelector(".ugf-era-copyright")) { return; } Array.from(right.children).forEach(function(el) { el.style.display = "none"; }); const span = document.createElement("span"); span.className = "ugf-era-copyright"; span.textContent = conf.copyright; right.appendChild(span); }); } } function ugfRetroExtras() { const era = ugfRetroEra(); if (!era) { return; } const conf = UGF_RETRO_CHROME[era]; if (!conf) { return; } const loc = document.querySelector("html").getAttribute("location") || ""; if (loc.indexOf("home") === -1) { return; } ugf2009WaitFor("#ugf-hp-search", function(hpSearch) { if (document.querySelector(".ugf-era-extras")) { return; } const holder = document.createElement("div"); holder.className = "ugf-era-extras"; if (conf.indexNote) { const note = document.createElement("div"); note.className = "ugf-era-index-note"; note.textContent = conf.indexNote; hpSearch.appendChild(note); } if (conf.bigLink) { const big = document.createElement("div"); big.className = "ugf-era-big-link"; const a = document.createElement("a"); a.href = conf.bigLink[1]; a.textContent = conf.bigLink[0]; big.appendChild(a); holder.appendChild(big); } if (conf.extraLinks) { const row = document.createElement("div"); row.className = "ugf-era-extra-links"; conf.extraLinks.forEach(function(item) { const a = document.createElement("a"); a.href = item[1]; a.textContent = item[0]; row.appendChild(a); }); holder.appendChild(row); } if (conf.subscribe) { const box = document.createElement("div"); box.className = "ugf-era-subscribe"; const h = document.createElement("div"); h.className = "ugf-era-subscribe-heading"; h.textContent = conf.subscribe.heading; box.appendChild(h); const row = document.createElement("div"); row.className = "ugf-era-subscribe-row"; const input = document.createElement("input"); input.type = "text"; input.value = conf.subscribe.placeholder; row.appendChild(input); const btn = document.createElement("button"); btn.textContent = conf.subscribe.button; row.appendChild(btn); const arc = document.createElement("a"); arc.href = conf.subscribe.archiveHref; arc.textContent = conf.subscribe.archive; row.appendChild(arc); box.appendChild(row); holder.appendChild(box); } if (holder.children.length) { hpSearch.parentElement.insertBefore(holder, hpSearch.nextSibling); } }); } function ugfRetroLogoLinks() { const era = ugfRetroEra(); if (!era) { return; } const conf = UGF_RETRO_CHROME[era]; if (!conf || !conf.logoLinks) { return; } const loc = document.querySelector("html").getAttribute("location") || ""; if (loc.indexOf("home") === -1) { return; } ugf2009WaitFor("#ugf-hp-logo", function(logo) { if (document.querySelector(".ugf-era-logo-links")) { return; } const wrap = document.createElement("div"); wrap.className = "ugf-era-logo-links"; conf.logoLinks.forEach(function(item) { const a = document.createElement("a"); a.href = item[1]; a.textContent = item[0]; wrap.appendChild(a); }); logo.parentElement.insertBefore(wrap, logo.nextSibling); }); } function ugfRetroPromo() { const era = ugfRetroEra(); if (!era) { return; } const conf = UGF_RETRO_CHROME[era]; if (!conf || !conf.promo) { return; } const loc = document.querySelector("html").getAttribute("location") || ""; if (loc.indexOf("home") === -1) { return; } ugf2009WaitFor("#ugf-hp-search", function(hpSearch) { if (document.querySelector(".ugf-era-promo")) { return; } if (conf.indexLine) { const idx = document.createElement("div"); idx.className = "ugf-era-index"; idx.textContent = conf.indexLine; hpSearch.parentElement.insertBefore(idx, hpSearch.nextSibling); } const div = document.createElement("div"); div.className = "ugf-era-promo"; div.appendChild(document.createTextNode(conf.promo[0])); const a = document.createElement("a"); a.href = conf.promo[2]; a.textContent = conf.promo[1]; div.appendChild(a); div.appendChild(document.createTextNode(conf.promo[3] || "")); hpSearch.parentElement.insertBefore(div, hpSearch.nextSibling); if (conf.promoTagline) { const tag = document.createElement("div"); tag.className = "ugf-era-promo-tagline"; tag.textContent = conf.promoTagline; div.parentElement.insertBefore(tag, div.nextSibling); } }); } function ugfRetroChrome() { const era = ugfRetroEra(); if (!era) { return; } const conf = UGF_RETRO_CHROME[era]; if (conf.navAbove) { ugf2009WaitFor("#ugf-search", function(searchEl) { if (document.querySelector(".ugf-era-nav") || document.querySelector(".ugf-era-count") || document.querySelector(".ugf-era-above-links")) { return; } let q = ""; try { q = new URLSearchParams(window.location.search).get("q") || ""; } catch (e) { q = ""; } const onImages = document.querySelector("html").getAttribute("location") === "images" || ugfHomeVertical === "images"; if (conf.aboveLinks) { const row = document.createElement("div"); row.className = "ugf-era-above-links"; conf.aboveLinks.forEach(function(item, i) { if (i > 0) { const dash = document.createElement("span"); dash.textContent = " - "; row.appendChild(dash); } const a = document.createElement("a"); a.href = item[1]; a.textContent = item[0]; row.appendChild(a); }); searchEl.parentElement.insertBefore(row, searchEl); } if (conf.aboveBox) { const line = document.createElement("div"); line.className = "ugf-era-count"; line.textContent = conf.aboveBox; searchEl.parentElement.insertBefore(line, searchEl); } if (!conf.left || !conf.left.length) { return; } const nav = document.createElement("div"); nav.className = "ugf-era-nav" + (conf.tabs ? " ugf-era-tabs" : ""); conf.left.forEach(function(item) { let href = item[1]; if (q) { if (item[0] === "Images") { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&udm=2"; } else if (item[0] === "News") { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&tbm=nws"; } else if (item[0] === "Web") { href = "https://www.google.com/search?q=" + encodeURIComponent(q); } else if (ugfIsShoppingLink(item[0])) { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&udm=28"; } } const a = document.createElement("a"); a.href = href; a.textContent = item[0]; const onNewsTab = document.querySelector("html").hasAttribute("news-results"); const onVideoTab = ugfHomeVertical === "videos"; if ((onImages && item[0] === "Images") || (onNewsTab && item[0] === "News") || (onVideoTab && (item[0] === "Video" || item[0] === "Videos")) || (ugfOnShopping() && ugfIsShoppingLink(item[0])) || (!onImages && !onNewsTab && !onVideoTab && !ugfOnShopping() && item[0] === "Web")) { a.className = "active"; } nav.appendChild(a); }); if (!conf.tabs) { const moreLink = document.createElement("a"); moreLink.href = "https://www.google.com/intl/en/options/"; moreLink.className = "more"; moreLink.textContent = "more \u00bb"; nav.appendChild(moreLink); } searchEl.parentElement.insertBefore(nav, searchEl); }); } ugf2009WaitFor("#gp-gbar-inner", function(bar) { if (conf.navAbove) { const more2 = bar.querySelector("#gp-gbar-more"); Array.from(bar.children).forEach(function(el) { if (el.classList && el.classList.contains("gp-gbar-link")) { el.style.display = "none"; } }); if (more2) { more2.style.display = "none"; } const right2 = bar.querySelector("#gp-gbar-right"); if (right2 && !right2.querySelector(".ugf-retro-gbar")) { const anchor2 = right2.firstElementChild; conf.right.forEach(function(item) { const link = ugfRetroGbarLink(item[0], item[1], false); const sep = document.createElement("span"); sep.className = "ugf-retro-gbar-sep"; sep.textContent = "|"; if (anchor2) { right2.insertBefore(link, anchor2); right2.insertBefore(sep, anchor2); } else { right2.appendChild(link); right2.appendChild(sep); } }); } return; } if (bar.querySelector(".ugf-retro-gbar")) { return; } const more = bar.querySelector("#gp-gbar-more"); const right = bar.querySelector("#gp-gbar-right"); Array.from(bar.children).forEach(function(el) { if (el.classList && el.classList.contains("gp-gbar-link") && el !== more) { el.style.display = "none"; } }); const onImages = document.querySelector("html").getAttribute("location") === "images" || ugfHomeVertical === "images"; const onVideoHome = ugfHomeVertical === "videos"; let q = ""; try { q = new URLSearchParams(window.location.search).get("q") || ""; } catch (e) { q = ""; } conf.left.forEach(function(item) { const onNews = document.querySelector("html").hasAttribute("news-results"); const onShopping = ugfOnShopping(); const isActive = (onImages && item[0] === "Images") || (onNews && item[0] === "News") || (onVideoHome && (item[0] === "Video" || item[0] === "Videos")) || (onShopping && ugfIsShoppingLink(item[0])) || (!onImages && !onNews && !onVideoHome && !onShopping && item[0] === "Web"); let href = item[1]; if (q) { if (item[0] === "Images") { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&udm=2"; } else if (item[0] === "Video" || item[0] === "Videos") { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&tbm=vid"; } else if (item[0] === "News") { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&tbm=nws"; } else if (item[0] === "Web") { href = "https://www.google.com/search?q=" + encodeURIComponent(q); } else if (ugfIsShoppingLink(item[0])) { href = "https://www.google.com/search?q=" + encodeURIComponent(q) + "&udm=28"; } } const link = ugfRetroGbarLink(item[0], href, isActive); if (more) { bar.insertBefore(link, more); } else { bar.appendChild(link); } }); if (more) { const moreSpan = more.querySelector(".gp-gbar-link-inner span"); if (moreSpan) { moreSpan.textContent = "more"; } } if (right) { const anchorEl = right.firstElementChild; conf.right.forEach(function(item) { const link = ugfRetroGbarLink(item[0], item[1], false); const sep = document.createElement("span"); sep.className = "ugf-retro-gbar-sep"; sep.textContent = "|"; if (anchorEl) { right.insertBefore(link, anchorEl); right.insertBefore(sep, anchorEl); } else { right.appendChild(link); right.appendChild(sep); } }); } }); } function ugf2009WaitFor(selector, callback) { let tries = 0; const interval = setInterval(function() { const element = document.querySelector(selector); if (element) { clearInterval(interval); callback(element); } else if (++tries > 150) { clearInterval(interval); } }, 100); } // Classic Google put the buttons in the same centred cell as the search box (input
buttons) function ugfEraHomeButtons() { const era = ugfRetroEra(); if (!era || era === "gplex2010" || era === "gplex2022") { return; } const loc = document.querySelector("html").getAttribute("location") || ""; if (!/home$/.test(loc)) { return; } if (era === "gplex2009") { ugf2009WaitFor("#ugf-structured-hp-footer-left .ugf-structured-hp-footer-link", function() { const labels = ["Advertising Programs", "Business Solutions", "About Google"]; document.querySelectorAll("#ugf-structured-hp-footer-left .ugf-structured-hp-footer-link").forEach(function(a, i) { if (labels[i]) { a.textContent = labels[i]; } }); }); } ugf2009WaitFor("#ugf-hp-search #ugf-search-outer", function(outer) { const row = document.querySelector("#ugf-hp-buttons-row"); if (row && row.parentElement !== outer) { outer.appendChild(row); } }); } // imghp / videohp: logo label, button labels, active tabs function ugfVerticalHome() { if (!ugfHomeVertical) { return; } const isImages = ugfHomeVertical === "images"; const isShopping = ugfHomeVertical === "shopping"; const shopEra = ugfRetroEra(); const froogle = ["gplex2003", "gplex2005", "gplex2006"].indexOf(shopEra) > -1; const productSearch = shopEra === "gplex2007"; const shopName = froogle ? "Froogle" : (productSearch ? "Product Search" : "Shopping"); document.title = isShopping ? (froogle ? "Froogle" : (productSearch ? "Google Product Search" : "Google Shopping")) : (isImages ? "Google Images" : "Google Videos"); ugf2009WaitFor("#ugf-hp-logo-companion", function(comp) { if (!comp.querySelector("#ugf-hp-vertical-label")) { const lab = document.createElement("div"); lab.id = "ugf-hp-vertical-label"; const old = document.querySelector("html").hasAttribute("legacy-gbar"); if (isShopping) { lab.textContent = (froogle || productSearch) ? shopName : (old ? "Shopping" : "shopping"); } else { lab.textContent = isImages ? (old ? "Images" : "images") : (old ? "Video" : "videos"); } comp.appendChild(lab); } }); const label = isShopping ? (productSearch ? "Search Products" : "Search " + shopName) : (isImages ? "Search Images" : "Search Video"); ugf2009WaitFor("#ugf-hp-buttons", function(row) { const relabel = function() { const retro = row.querySelectorAll("button.searchbtn"); if (retro.length) { retro[0].textContent = label; for (let i = 1; i < retro.length; i++) { retro[i].style.display = "none"; } } const s2 = document.querySelector("#ugf-search-btn-2 span"); if (s2) { s2.textContent = label; } return retro.length; }; relabel(); let n = 0; const t = setInterval(function() { n++; if (relabel() || n > 30) { clearInterval(t); } }, 100); }); if (isShopping) { ugf2009WaitFor("#ugf-top, #ugf-hp-search", function() { ugfShoppingNav(); setTimeout(ugfShoppingNav, 500); }); } ugf2009WaitFor("#gp-gbar-inner", function() { const search = document.querySelector("#gp-gbar-search"); const images = document.querySelector("#gp-gbar-images"); if (isImages && search && images) { search.classList.remove("active"); images.classList.add("active"); } }); } function ugf2009Buttons() { const btnEra = ugfRetroEra(); if (!btnEra || btnEra === "gplex2010") { return; } if (!/home$/.test(document.querySelector("html").getAttribute("location") || "")) { ugf2009WaitFor("#ugf-search", function(searchBar) { if (searchBar.querySelector(".searchbtn-small")) { return; } const sBtn = document.createElement("button"); sBtn.classList.add("searchbtn-small"); sBtn.addEventListener("click", function() { document.querySelector("#ugf-search-btn").click(); }); sBtn.innerText = "Search"; searchBar.appendChild(sBtn); }); } else { ugf2009WaitFor("#ugf-hp-buttons", function(btnRow) { if (btnRow.querySelector(".searchbtn")) { return; } const gsBtn = document.createElement("button"); gsBtn.classList.add("searchbtn"); gsBtn.addEventListener("click", function() { document.querySelector("#ugf-search-btn-2").click(); }); gsBtn.innerText = "Google Search"; const iflBtn = document.createElement("button"); iflBtn.classList.add("searchbtn"); iflBtn.addEventListener("click", function() { document.querySelector("#ugf-lucky-btn").click(); }); const eraConf = UGF_RETRO_CHROME[ugfRetroEra()]; iflBtn.innerText = (eraConf && eraConf.luckyLabel) ? eraConf.luckyLabel : "I\'m Feeling Lucky"; const eraConf2 = UGF_RETRO_CHROME[ugfRetroEra()]; if (eraConf2 && eraConf2.resultsDropdown) { const sel = document.createElement("select"); sel.className = "ugf-era-results-select"; eraConf2.resultsDropdown.forEach(function(opt) { const o = document.createElement("option"); o.textContent = opt; o.value = String(parseInt(opt, 10) || 10); sel.appendChild(o); }); let savedNum = "10"; try { savedNum = localStorage.getItem("UGF_ERA_NUM") || "10"; } catch (e) {} sel.value = savedNum; if (!sel.value) { sel.value = "10"; } sel.addEventListener("change", function() { try { localStorage.setItem("UGF_ERA_NUM", sel.value); } catch (e) {} }); btnRow.appendChild(sel); } btnRow.appendChild(gsBtn); btnRow.appendChild(iflBtn); }); } } ugf2009Buttons(); ugfEraHomeButtons(); ugfVerticalHome(); ugfEraPageLimit(); ugfClassicSerp(); ugfLensTheme(); ugfSbiCamera(); ugfI18nStart(); ugfRetroChrome(); ugfRetroFooter(); ugfContinuousScroll(); ugfSetFavicon(); ugfRetroPromo(); ugfRetroLogoLinks(); ugfRetroExtras(); })(); });