From a698f1264fb90a47b87588603abd1ffe4cd16067 Mon Sep 17 00:00:00 2001 From: Joey Korkames Date: Sun, 4 Oct 2026 22:41:42 -0700 Subject: [PATCH 01/10] add Home Assistant app --- sites/Home_Assistant/icon.png | Bin 0 -> 15092 bytes sites/Home_Assistant/main.js | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 sites/Home_Assistant/icon.png create mode 100644 sites/Home_Assistant/main.js diff --git a/sites/Home_Assistant/icon.png b/sites/Home_Assistant/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4a915d652c19ed9033db7a6581f9cd7dac18ab GIT binary patch literal 15092 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 bJv{HYJov|Bo~B}IVf|~WUso%*Y#sU^fHn)k literal 0 HcmV?d00001 diff --git a/sites/Home_Assistant/main.js b/sites/Home_Assistant/main.js new file mode 100644 index 0000000..52f796a --- /dev/null +++ b/sites/Home_Assistant/main.js @@ -0,0 +1,46 @@ +/*eslint-env applescript*/ +/*eslint-env es6*/ +/*eslint eqeqeq:0, quotes:0, space-infix-ops:0, curly:0*/ +"use strict"; + +const {app, BrowserWindow, WebView} = require('@MacPin'); +let browser = new BrowserWindow(); + +const ha = { + url: "http://homeassistant", +}; +let haTab = new WebView(ha); // start loading right away + +function unhideApp(tab) { + if (tab) browser.tabSelected = tab; + browser.unhideApp(); +}; + +const setAgent = function(agent, tab) { tab.userAgent = agent; }; +// looks like a reload has to be done for this to take full effect. + +app.on("decideNavigationForClickedURL", function(url, tab, mainFrame) { + return false; +}); + +app.on("postedDesktopNotification", (note, tab) => { + console.log(Date() + `[${tab.url}] posted HTML5 desktop notification: ${note.id}`); + console.log(JSON.stringify(note)); + return false +}); + +app.on('handleClickedNotification', (note) => { + console.log("App signals a clicked notification: "+ JSON.stringify(note)); + return false; +}); + + +app.on('AppWillFinishLaunching', (AppUI) => { + browser.addShortcut('UA: default', [false], setAgent); + + AppUI.browserController = browser; // make sure main app menu can get at our shortcuts +}); + +app.on('AppFinishedLaunching', function(launchURLs) { + browser.tabSelected = haTab; +}); From b6f5350d83c981589bb69ec9a67367085e5c033f Mon Sep 17 00:00:00 2001 From: Joey Korkames Date: Sun, 4 Oct 2026 22:42:45 -0700 Subject: [PATCH 02/10] support getusermedia on insecure http:// sites TODO: add an initializer flag to gate this --- Sources/MacPin/WebView.swift | 6 ++++++ modules/WebKitPrivates/WKProcessPoolPrivate.h | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/Sources/MacPin/WebView.swift b/Sources/MacPin/WebView.swift index 9ce2708..8575da1 100644 --- a/Sources/MacPin/WebView.swift +++ b/Sources/MacPin/WebView.swift @@ -682,6 +682,11 @@ final class MPWebView: WKWebView, WebViewScriptExports { configuration.processPool = configuration.processPool ?? (MPWebView.self.sharedWebProcessPool)! } + // if makeInsecure: + //configuration.processPool._registerURLSchemeAsSecure("http") + //configuration.processPool._registerURLSchemeAsBypassingContentSecurityPolicy("http") + //configuration.processPool._registerURLSchemeAsBypassingContentSecurityPolicy("https") + self.init(frame: CGRect.zero, configuration: configuration) // This is the real init() // its an ObjC++ ctor which is why we couldn't override its impl to do these defaultings @@ -702,6 +707,7 @@ final class MPWebView: WKWebView, WebViewScriptExports { if let context = context { "http".withCString { http in WKContextRegisterURLSchemeAsBypassingContentSecurityPolicy(context, WKStringCreateWithUTF8CString(http)) // FIXME: makeInsecure() toggle! + WKContextRegisterURLSchemeAsSecure(context, WKStringCreateWithUTF8CString(http)) // FIXME: makeInsecure() toggle! } "https".withCString { https in WKContextRegisterURLSchemeAsBypassingContentSecurityPolicy(context, WKStringCreateWithUTF8CString(https)) diff --git a/modules/WebKitPrivates/WKProcessPoolPrivate.h b/modules/WebKitPrivates/WKProcessPoolPrivate.h index e888558..f3ebb0c 100644 --- a/modules/WebKitPrivates/WKProcessPoolPrivate.h +++ b/modules/WebKitPrivates/WKProcessPoolPrivate.h @@ -35,6 +35,11 @@ //- (void)_automationCapabilitiesDidChange WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA); //- (void)_setAutomationSession:(_WKAutomationSession *)automationSession WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA); +- (void)_registerURLSchemeAsCanDisplayOnlyIfCanRequest:(NSString *)scheme WK_API_AVAILABLE(macos(10.14), ios(12.0)); +- (void)_registerURLSchemeAsSecure:(NSString *)scheme WK_API_AVAILABLE(macos(12.0), ios(15.0)); +- (void)_registerURLSchemeAsBypassingContentSecurityPolicy:(NSString *)scheme WK_API_AVAILABLE(macos(12.0), ios(15.0)); +- (void)_setDomainRelaxationForbiddenForURLScheme:(NSString *)scheme WK_API_AVAILABLE(macos(12.0), ios(15.0)); + // Test only. Returns web processes running web pages (does not include web processes running service workers) - (size_t)_webPageContentProcessCount WK_API_AVAILABLE(macos(10.13.4), ios(11.3)); From 1ce67ea173c531a6a4b3f75276b2ce8ad945b47c Mon Sep 17 00:00:00 2001 From: Joey Korkames Date: Mon, 5 Oct 2026 12:34:20 -0700 Subject: [PATCH 03/10] archive Hangouts git remembers --- README.md | 2 +- sites/Hangouts/app.js | 194 ----------------------- sites/Hangouts/convopopper.js | 26 --- sites/Hangouts/icon.png | Bin 26531 -> 0 bytes sites/Hangouts/notifier.js | 287 ---------------------------------- sites/Hangouts/screenshot.jpg | Bin 96847 -> 0 bytes sites/Hangouts/style.css | 13 -- sites/Hangouts/styler.js | 143 ----------------- 8 files changed, 1 insertion(+), 664 deletions(-) delete mode 100644 sites/Hangouts/app.js delete mode 100644 sites/Hangouts/convopopper.js delete mode 100644 sites/Hangouts/icon.png delete mode 100644 sites/Hangouts/notifier.js delete mode 100644 sites/Hangouts/screenshot.jpg delete mode 100644 sites/Hangouts/style.css delete mode 100644 sites/Hangouts/styler.js diff --git a/README.md b/README.md index 9e956c0..bff670d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Custom URL schemes can also be registered to launch a MacPin App from any other ### MetaVerses * [Facebook.app](https://m.facebook.com/home.php) (mobile version!) -* [Messenger.app](https://www.messenger.com/hangouts) +* [Messenger.app](https://www.messenger.com/) * [WhatsApp.app](https://web.whatsapp.com) ### et cetera diff --git a/sites/Hangouts/app.js b/sites/Hangouts/app.js deleted file mode 100644 index ecc8b3b..0000000 --- a/sites/Hangouts/app.js +++ /dev/null @@ -1,194 +0,0 @@ -/*eslint-env applescript*/ -/*eslint-env es6*/ -/*eslint eqeqeq:0, quotes:0, space-infix-ops:0, curly:0*/ -"use strict"; - -var hangouts = { - transparent: true, - postinject: ["notifier"], // "convopopper"], - preinject: ["styler"], - subscribeTo: ['unhideApp', 'HangoutsRosterReady', 'SwitchToThisTab'], - style: [ "style" ], - url: "https://hangouts.google.com" -}; -var hangoutsAlt = Object.assign({}, hangouts, {url: "https://plus.google.com/u/1/hangouts"}); -$.browser.addShortcut("Google Hangouts", hangouts); -var hangoutsTab = new $.WebView(hangouts); // start loading right way, its a big Closure app -$.browser.addShortcut("Log into Google Account", "https://accounts.google.com/signin"); -$.browser.addShortcut("Open Hangouts tab using secondary Google account", hangoutsAlt); -$.browser.addShortcut("Install Google Voice & Video plugin", "https://encrypted.google.com/tools/dlpage/hangoutplugin"); -$.browser.addShortcut("Get Contacts.app -> Hangouts.app plugin", "http://github.com/kfix/MacPin/tree/master/extras/AddressBookHangoutsPlugin"); -$.browser.addShortcut("Get OSX service for text-selected numbers", "http://github.com/kfix/MacPin/tree/master/extras/Call%20Phone%20with%20Hangouts.workflow"); -$.browser.addShortcut("Google Voice call history", "https://www.google.com/voice/?pli=1#history") -$.browser.addShortcut("(secondary account) Google Voice call history", "https://www.google.com/voice/b/1?pli=1#history") -//var gaia; // your numeric Google ID - -var delegate = {}; // our delegate to receive events from the webview app - -delegate.DidWindowOpenForURL = function(url, child, parent) { child.subscribeTo("SwitchToThisTab"); } //all popped-up tabs can select themselves - -delegate.decideNavigationForClickedURL = function(url) { - if ( - !url.startsWith("https://talkgadget.google.com") - && !url.startsWith("https://accounts.google.com") - && !url.startsWith("https://hangouts.google.com") - && !url.startsWith("https://plus.google.com/hangouts/") - && !url.startsWith("https://www.google.com/a/") - && !url.startsWith("https://voice.google.com") - && !url.startsWith("https://g.co") - ) { // open all links externally except those above - $.app.openURL(url); - return true; - } - if (url.startsWith("https://www.google.com/url?q=")) { - // stripping obnoxious google redirector - url = decodeURIComponent(url.slice(29)); - $.app.openURL(url); - return true; - } - return false; -}; -delegate.decideNavigationForMIME = function() { return false; }; -delegate.decideWindowOpenForURL = function(url) { - if (url.startsWith("https://plus.google.com/hangouts/_/")) { //G+ hangouts a/v chat - if (useChromeAV) - $.app.openURL(url, "com.google.Chrome"); - else - $.browser.tabSelected = new $.WebView({url: url}); - return true; - } - - /* - if (url.startsWith("//talkgadget.google.com/u/0/talkgadget/_/frame")) { - $.browser.tabSelected = new $.WebView({url: url}); // chat pop-out should change tab to new chat tab, and not change size - return true; //doesn't work because parent webViewConfig is not passed through - } - */ - - return false; -}; - -delegate.handleUserInputtedInvalidURL = function(query) { - // assuming the invalid url is a phone number - // check for all-nums or at-sign - hangoutsTab.evalJS("xssRoster(['inputAddress', '"+query+"']);"); - return true; // tell MacPin to stop validating the URL -}; - -delegate.launchURL = function(url) { // $.app.openURL(/[sms|hangouts|tel]:.*/) calls this - console.log("app.js: launching " + url); - var comps = url.split(':'), - scheme = comps.shift(), - addr = comps.shift().replace(/\//g, ''); // de-slashed - switch (scheme) { - case 'hangouts': - // this could be a gmail address or email address that has been linked to a google account, or the Full Name linked to such addresses - // http://handleopenurl.com/scheme/hangouts - // https://productforums.google.com/forum/#!topic/hangouts/-FgLeX50Jck - $.browser.unhideApp(); //user might have switched apps while waiting for roster to load - $.browser.tabSelected = hangoutsTab; - hangoutsTab.evalJS("xssRoster(['inputAddress', '"+addr+"'], ['checkFirstFoundContact']);"); //calls into AppTab[1]:notifier.js - case 'sms': - $.browser.unhideApp(); //user might have switched apps while waiting for roster to load - $.browser.tabSelected = hangoutsTab; - hangoutsTab.evalJS("xssRoster(['inputAddress', '"+addr+"'], ['sendSMS']);"); //calls into AppTab[1]:notifier.js - break; - case 'tel': - // TODO: interpret commas as 2-sec delays and pounds as pounds - if ($.app.pathExists('/Library/Internet Plug-Ins/googletalkbrowserplugin.plugin')) { - // use NPAPI GoogleVoice & Video (Vidyo) plugin in the WebView - // window.a also seems to have a list of loaded plugins - $.browser.unhideApp(); //user might have switched apps while waiting for roster to load - $.browser.tabSelected = hangoutsTab; - hangoutsTab.evalJS("xssRoster(['inputAddress', '"+addr+"'], ['makeCall']);"); // Hangouts now does in-frame phone calls! - // TODO: use callback to get new chatbox frame name, simulate keypress events over it? - } else if ($.app.doesAppExist("com.google.Chrome")) { - // use Chrome's NaCL+WebRTC Hangouts client for A/V chats ( https://webrtchacks.com/hangout-analysis-philipp-hancke/ ) - $.app.openURL("https://plus.google.com/hangouts/_/?hl=en&hpn="+addr+"&hip="+addr+"&hnc=0", "com.google.Chrome"); - } else { - // no plugin or chrome ... - $.browser.tabSelected = new $.WebView({url: "https://encrypted.google.com/tools/dlpage/hangoutplugin"}); //prompt to install plugin - // so how bout that WebRTC in WebKit??? - // https://blog.mozilla.org/webrtc/firefox-is-now-supported-by-google-hangouts-and-meet/ should we pretend to be FireFox 60? - $.app.openURL("tel:"+addr, "com.apple.facetime"); // maybe they have iPhone w/Handoff, so try call w/ facetime - } - break; - case 'https': - if (!url.startsWith("//accounts.google.com")) { $.browser.tabSelected.load_url(url); break; } - default: - $.app.openURL(url); - } -}; - -delegate.SwitchToThisTab = function(tab, msg) { - if (tab) $.browser.tabSelected = tab; -}; - -delegate.receivedHTML5DesktopNotification = function(tab, note) { - if (tab.gaia) note.tag += '__' + tab.gaia // add your Google ID to the notification tag - console.log(Date() + ' [posted HTML5 notification] ' + note); - $.app.postHTML5Notification(note); - return true; -}; - -delegate.handleClickedNotification = function(note) { - let {title, subtitle, msg, id} = note; - console.log("JS: opening user notification for: "+ [title, subtitle, msg, id]); - //$.browser.tabSelected = hangoutsTab; - //hangoutsTab.evalJS('rosterClickOn("button[cpar='+"'"+id+"'"+']");'); - var src = id.split('__'), - cpar = src.shift(), - gaia = src.shift(); - //var [cpar, gaia] = id.split('__'); //ES6...OSX 10.11 ? - for (var tab of $.browser.tabs) { - if ((tab.cpar == cpar) && (tab.gaia == gaia)) { - // a popped out tab already exists for this conversation - $.browser.tabSelected = tab; - } else if (tab.gaia == gaia) { - $.browser.tabSelected = tab; - hangoutsTab.evalJS('rosterClickOn("button[cpar='+"'"+cpar+"'"+']");'); - } - } - return true; -}; - -delegate.unhideApp = function(tab) { - $.browser.tabSelected = tab; - $.browser.unhideApp(); -}; - -delegate.AppFinishedLaunching = function() { - //$.app.registerURLScheme('sms'); // `open -a Messages.app imessage:18004444444` still works - //$.app.registerURLScheme('tel'); // `open -a Facetime.app tel:18004444444` still works - //$.app.registerURLScheme('hangouts'); - // OSX Yosemite safari recognizes and launches sms and tel links to any associated app - // https://github.com/WebKit/webkit/blob/ce77bdb93dbd24df1af5d44a475fe29b5816f8f9/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm#L691 - // https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007899 - $.browser.tabSelected = hangoutsTab; -}; - -//addEventListener('HangoutsRosterReady', function(e){...}, false); ?? -delegate.HangoutsRosterReady = function(tab) { // notifier.js will call this when roster div is created - if ($.launchedWithURL != '') { //app was launched by an opened URL or a clicked notification - probably a [sms|tel]: link - this.launchURL($.launchedWithURL); - $.launchedWithURL = ''; - } -/* - // this is your UID for G+: https://developers.google.com/apis-explorer/#p/plus/v1/plus.people.get?userId=me&_h=6& - // GET https://www.googleapis.com/plus/v1/people/me?key={YOUR_API_KEY} - tab.evalJS('myGAIA();', function(res, err) { - if (res != '') { - var gaia = res; - console.log("Logged in as https://plus.google.com/"+gaia); - tab.gaia = gaia; - //Object.defineProperty(tab, 'gaia', {value: gaia, writable: false}); - } else { - console.log(err); - //$.browser.tabSelected = new $.WebView({url: hangouts.url}); // G+ login prompt - } - }); -*/ - $.browser.addShortcut("Test call to MCI ANAC", "tel:18004444444"); -}; - -delegate; //return this to macpin diff --git a/sites/Hangouts/convopopper.js b/sites/Hangouts/convopopper.js deleted file mode 100644 index 7d41f96..0000000 --- a/sites/Hangouts/convopopper.js +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-env browser */ -/*eslint eqeqeq:0, quotes:0, space-infix-ops:0, curly:0*/ - -if ((window.name == 'preld') || ~window.name.indexOf('gtn_')) { //frame-id ^gtn_ this is a chatbox iframe - var btn; - function autoPop() { - // auto-tab all opened chats (via window.open) - if (btn = document.querySelector('button[title="Pop-out"]')) { - console.log("got a pop-out button!"); - console.log(btn); - //btn.click(); - // goog.testing.events.fireClickSequence() - // https://google.github.io/closure-library/api/source/closure/goog/testing/events/events.js.src.html#l165 - // https://github.com/google/closure-library/blob/master/closure/goog/testing/events/events.js#L165 - // https://github.com/google/closure-library/blob/master/closure/goog/events/browserevent.js - // https://developers.google.com/closure/library/docs/introduction#evs - // https://developers.google.com/closure/library/docs/closurebuilder - btn[Object.keys(btn)[0]].$.click[0].proxy(); // btn.closure_lm_54596 ... - } - - //setTimeout(webkit.messageHandlers.SwitchToThisTab.postMessage, 3000, []); - } - - setTimeout(autoPop, 4000); - webkit.messageHandlers.SwitchToThisTab.postMessage([]); -}; diff --git a/sites/Hangouts/icon.png b/sites/Hangouts/icon.png deleted file mode 100644 index 839e9ac4be70f022e11ed178cc9bf5371aadc0a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26531 zcmbSy1ydbO(C*=IfCIrLxVyUtI5-4%d4s#VyE_T)PH?vX!8N!9cMAu1*UNWreShF? z)z;Kb?X%s})z57AOiz@uqBIH;0TKWJK#`S^Pz3;BEdS>Q!+-R6|1+BZXh1Gvvg+WE z%NJ}K`SEPvt*-5=YUDxY=g8xgCaSE=4gi2NcE2i3$T5$~Ytqq;DvgcH z{!<0OnqaYD$zjPANx;Iweu4$Faj~)SfD)x3E&S?qGXS`Bf^?ls{4D%TSoX*%IDkwG z_K3ioI0pbg29T8yRrkz3>GXKn)ATxj_loD@-0T|suj5$1-U@yf*isL>)YcaIi5(<{ zL|^=pxVDBa#%-8nAX7kn13CDXS&wr3+3{NsjtAjx@F}yt&-2+YMbZ?PGg5*H83HRQ zPRa=xPG~3VsfQFLv5-Kbu=hPH~1a&c7hRx|4 zMa_;f<)t#HC-?EhrC_pl(D{dC;K;sICXR%O=4Xz0Wx%!rrm{+O*m`ko%ukgwSidyB zda!PC$G#@Y^pU~oa=7aI5Bf|QOG%E@PI$pA9|;FaO2IJW*^s)R%E0Xm|F z0FD9hz>AVeFB}Mp9_$L9gv*DSh6`1c$V8ux3S|Mc0+3lANbIjp+u2AL(_7!Wczs`j zU^GJ{W`nUUWlyrNPP_U1=5N-(f#|nWVgRwg zPcR`_YF=6~Q8(9xM)BFo2QkV}7*tZ@kR?Gr4J7?=eZM zU6@n;sbv(eK|bg!GJZ)QI~;zAm=Th*HGD;3U}R5NAlo=5!X4N!!=*9b<+=c_+V>R8 z;qfGgU8CGoJ^{#l7*o{sD9yU`<=5K)J@xf$Y~rgz*b<_|A0%?;I^+JW?4sgDWlrld zJOb+yRB^|2vA{(kgVks12BojicSQ-mn*SUH$wS{0Csjl1gb}%f9N>e+Kq+`M$;dRx zL^K>a@)piyLsep}Y>~>lz)bq_Q+VFm+Kgs{lkCmz(;frg_sbtNU#Xa7f>K>4bVPii z=M&}@29<0?laNw|iuMeQ5c7j+1>$zAeDec30`BBkf{GHz*J;4t=HdN4hA%*Z&Ed4t*?GY<6Z5SK2x&@uwCHLaS% zytexZ(%;-oqKWmANKFH2P``JFDSl(?yNQazFG}S9=B*Vc@WT-&rt=BmQ?0414$Rc$ zVUYo_++TJ*l^8rCP0;mSmpD!x5pgw(ej*xvRjC)?4CBV)RK|hR;r^tdVK{d~fcsKP zz?=7_7^lYfirJu5u*oU0Ui3rQpx1vakI&`ucOE!>-a~UHkr-c_kw$gls5`@hb;KvQ zjtZh%2l*l`cc(@Fi!78Eqzr@oL(i~3M^rLTRN|bJKB*|?h?;b5!4HkF{`P*Rha2$n zw;(P#_KRx%aCV%*qrq@a!y8=fNO=Y?o%|zrU7x{Di922nqE|LDmp!YE$1ZiQgEM^t6v^B=X0&jS?my^xJjUX10p+ zxhkF@7LYSI(6>4^>?;Y5+6UL9E#iukI`~|n9P1RP*$%)ziNW;LA^kK^wyZ389rI-Q z$@4LrlmMTLU+=HO1-vw}LRPIv)P4<*#}0f)UJ;!Kdi;`YG9#wB4$fFO)xjyc_y`qn zj=hAP=d*5NuB0)F6_8a&K5t3P{*oyEs!>HF242K4cD(jW&j~Jj|C)!n;as29RKEgV zCRyskb`om6>&#=8SL4)rUiA97;7I0_YwhxsAH0=pZGmD|LU0|+MEzI?_M@j%(;KSt zM#M$@Zoo?CzuKJ5NK_!G7!g~m)2*Gu!(#VYpSja|f5(I8WruHpU7jq!1OF}F#eF7DCZMLXvdF>R%ZHdWjU$x3XJ(7zC-Z5gMF&Y{=T2&f#-{=kX8GE;Au#Nk9Sd9~Btp<C7T)mS5f*s?NuN)DU!3EDfK;`QWCzZ>laBhItr6FvWc1JKut}nFV=$eeN70;g^mzf>iLkn5b?kuBh3k;zb8iN>Kt3Z zYaG4jqp8h@dO2?=TW`hF7#!r3Yu4qA;FMPna&rD!>pY1$&k@#ik-bE%R~ zYqs_3yVe5jYRC8^5Q9*#8nq4X%M{iPsF^CTLrbJF(~Za6>SzFdmpS z6rWfSaF`n-@)jk`OCN>kl|%buxBD8GRlsV#WQt>G@^4uA87qsSEaM_!&>p!BH9jn@ z$hj|1_xbzDLw~Kv0(NAY zDg381$?vb9=+6^{z=;Xgi+UNCrp}?wz1YB5b|N7^yaoBGAbI~fYrM_Y>z(gi-QN}D zD5Ugn5qAoYS$_-l&!yRXn>raKmFS%Y{0YI%ojJcEu15LXXpJgey%NZz<`$B5zxMPL zz~B9SLXJX0{~2*BxN`G-#>#C+sZH#7KSpjzPY2#;ZfFb-`w(xL1rcc1Pi`o-bx_`{ z&D#iX8vPhuFt&CGBEvEK^Ud@1rL?O6tn>=~>>0&gx^pq;}MI+0DI z8lSPfkaH@p-$Zrodm8V(QFO6VF(z_UW5CVXubN5u_fKjmyZdruOaJM#44I`y6id%i zPitndyJ;SZ=G*!3f$-Rg*qc8emuQKm`wpvCzw}0IzLbwWv&qgf}^>ndUG7y%}*_xSW zyb6Z*A!+R2&NIo|`qa182(QE+GH!SPTEAnZDFLVTnfD3Vs*N0xNXcrZ&V6mXw{)T+ znrR*y(1Ka1)83jCo9LL2rhE7P$S=R$0%7^&P)LQu_&3jWv(0ga(R19}igwNbbOK(p zR4H4TptC_#5uX>fFo>p#)7l#RxG7CsW=#MzK1Sq;wsVEu@kAC2LWvJJ568b$16P z{(V{IfKk+lmYQ1Eorplj=)(riQ?g4<1)ka{J^!n+y56&{%F{is7(@m5M9+_y(uqhUX1VaYNe4$dpL{HJW6+FfXWYo{ySpEg6}yPxRJGmbIS? zWn6KBsLk7Zzi_42q3gHj#O`yr-6kD5oPgM5*VVd%koWBqYo>g5lZ%x|>g^S{OIDD% zSoUhxygE!QG_ky(P=k$^z0-d8#t65j?O`1Dxu)a!(rA^3K_)0Z^4k9)w>vW{{jCbd z|3NLrN16MU-G|q3R>pr_Ft0Mvp;`naHpo?{&1`%-Fur2N{Vc-s&39ooxAM&2aH%B@ zsG3i?l_JuycWzEw`c^R7JU>-M6i6;lKPgVDcbmszv(850=(tx&J-$!l!kMwg$n$cS zF)yUG=67CaCnuD_|!=(kpr^WAbE`D1*K1ba5+j7`xl zT{bT$SS&O}7m;7XjB|N}leha2XIW2c&F%OD&8V91^M9o~;A{9Tsy6@dY4HU2Sbj4t z5^s{GJTnnwfX1&YSjsYz4`aL0@On)qIPiPSyNI-24;ihdN)FgA?f)~w0`EQ3Ln)VKMpb!d@G>+R+gs(>=CPul;!4R&&v4X(VsQR zaMpHp_TisevkAcUpub(u@r%SfLeEi&Dtgb^@;~J;4h6m*HnjMFH6v1kHG5ro(y~V6 zb94Ppuk*B*uJVZt%TZMGS1*D|U;ed8PgcKwZzw0emVX2ANxh2^5YM_5&zjjeEYW*1 zHglLaCUG8@>`$8F=3GtBa-*FRwAjf?#_#{Hh2i-CvchV2v(B>Yv4GN3&LLTx=9fhdA;U4a>_XC-_HUQ{8Tt zD+qUJt2I<)8fBC1Zk64-JI$2txVU>Z6{=`)M*b4*Bk27#eP2d9y!R507yaFq?x^6( zB>*h#ceCf2Tdd0&B49Oh+v4n*AN!)+Gd_5Hr&NIOt)(_+fWY|QsqUx5bL6RpJ+?dG z>(Pe+atiBsPwB_SIZ-m|6LckdEM&h)=#3$VR#+K&_>&AQIdmJ3`D|cZ(x?t=59cqw z_6}yn3!FwCqpGLU?pIPT)1`a23;N4ma{bd;48qt(&Gu_Bnh&)u5rR3fS93@6A9Vn(BJO&_{|SD={ID8^LF=s%1djS9ca)@6@rrn z!q68LAyD=uYW5}SXQ$`nzCn#vIgy7H^I6-^X5TBEPamMs*M_qmB>(OFxGp0g{#RXs z2)mu}Lau(hf(SLZeyb;}HK_tUX^6D%DM4cXiORrjj{ z4AXvb!npZJ%buCSH}o~1b9r23N=uU_+FM~?@H?^h=z);pK2 z5B$gy`2X31yT(C4d1S2hT1GUtn|zS97=iXD7e1ZDl9s-dhLJwwD3YJj$yE6Vm6D3p}- zQVG||MvJgXDjB-#AP`EUC@TN;{0|=)IzxCkoSm6H2QN9CH#Xn9beb=O_ANN%ry2eV zp3bb-x4%}mjz$t6!D+bY{wIB>$KM+wwmv)N#lt(Ems)QpDV18)uP>Zouvpyof1278 z1_f%2{D!H#GOUCsBQ!!lJ)scUTBH7(OwPG$r8bkpZmIj~Ey`0-2Vvi9!B5^!ZYs53 zok(Ouq33mYcXxj!yLn~cKk^$xNyZvs=j(P4NmESoslcTjX3{s0+xuE@RT+iEH?%rP_=Iqn@c+#BK!aHJ>3ib$iv zk{d7<*{UlEoHeO!^4R(mn(u*Dwq6|2G_JRF3*%uR&(j_@q>hK zH{ULPMptw>c{qtiU(5W>x+jXE7DDo8+KyxIexxHiVITsInQge9NC!Zhj8?I5C@H6< zb3Dg4ndXtC7v#l9KQP!(dl_$Uy>6&2D-W8&Ua5Z^@@TR(PCz4_%KWeU7*PGkv+t-MgTO-!n%r;bZmeyk6Z{$b+*@YAEqKFo=J#!Jx=wv zYQiTZTDrk3eneJ8P8(>O?-@(Hc%0>*4-}TT%rHf2|5Sdh@Q|2=yZk5oy+VuMo(_N{ zrSosA7Mp&tRh=;42q)m?uA;oNn9O9#1oAyDgx%9l_G|6&eCmzIC2BZCdxoJbvpFsI zI^_OkzV7req6vu$Ch$+)=6~#rTVI$<dlFTE>~B7|I^|UrO-N0i zocb-%Nqm0wx`}Zil;79+mR@z8m{xO8E;r=&sz*tsLc^>P;iJ+JBau~gHLP$f_i7&} z&Pgh2_EdGx6Q^4@GiT>#NUk^BM2opQW~$dgK_T-gYj7gI@2TnX(K+f!H<#}Z`?wnN zr*nzrBTJ0~X{{Xa-V+;m9^vd|*g?u1Hf2b=$ylsj{nrTg5Kysd{&%05>$fsn&F_n* zzs~9@y4WOMsD1`HX4?~hAe<=4u~&$MlYEb-{Vk=qvozDl0ImW(<-JU7XhP{QGTg^J z!tdQ#j~*DT6H;>wU9|Z5^;*@834jVHrn6vL9OdX>pN-_%3>Ww4BXxi#bFGJlTQLUJ zsWZarxSRWZCe36Q`au&!18BXFCVhJ9&`h5FGP|ThcuD$inpnRbJLBe$g~eBAL{R&-O--s>RYSz`w^S-;<0^Nz;{+2&^)a{!kZqNX3bU_ZYRwk^RL;G@YL5NdMX}d>0t`oYZC#Jw^vNH4*SR7m~Z=? z*Ob~PITGC7MTcv;rmK}uD1Of`3rZkBdm1EtY}~ajaW_|~9U1CP7_9#6bO%E2>>##6 z?DWK>szxwIdX#qJj4G5u3=P(o)L5MSa+~*dlMaq10+(YPj1-klVKNX?8(48yc&5~i z6%nbOw2}5Ij7}FWxT|^ZMuLIL+$fRAg1SOqd=~0X5#|87D1me?29C{j4e5l6SM^)0tzWNsNCilQvtoA2g>b)?y~3jMwb>NWch{}ML&jO4u6 zy4plvX%G}o^G0Ns;|#V<*VYiO%6`7~c{^#`jA^>SlLu_H-Z?t zm?P23SKEYpc?)^0dTIBIc?$n{ji}4VxwJGR`8p=hsS(Hm(&wosA#~>4Dx8>548<`I z#ZrXsY~$LkE7n$G)^+-V1)C@uOavrYgOnF4)s8i%I&nVIet!(WBu7Qo#GXi;L=05+ z2C#Usm^C?g-u=-0=LZK*oG_Bw#l>0a#iB<5O8962xIv7g?`k@-V%g7DAq`YFD>27tKh)daB>>T z39!jQCa;RZ`ma%Tkp(I%KNbx3OX{7xQIPH3^^HJe4H6!T8K4RQHtv}mfuEuiVyc{O z>EnEFvF9(R=i6wB#QQQ05G+7}%PThLm?k3m(3kfNWgeR{D{gS=UjJw2Y?ovkv#N9f zO=heCf?)n$prEE}AJTAUnWe@-`x)bO)Dbrxc?o(Mofpn9z z{t_wx$}gVp;mEiaWcgy6$TYow?6^H+R#Qzt=ycYDCnHT3oQcJkUz1K&Bo4@IuWYPG zx1a^}H1!eZ2<6`xgiZF30g~nIZUu3bBe#>(KW0iggSQ3`RvQx@wg8__{Qo3O zmS);l&4EXSFtfppY{9qgj2R_4{zt|ars5J6n02(QI zW-SWY1V+W-t=k|+pwnE+B9cSd7`%+bQ1J+7+in?fE>h_?qo-|$1!@oI4>pZDfXaep3G!d2$s0r{l5&3(>|$7 z&eo4T(g=G?o2yN}W8ULNOph_yLI^A%mMDh;91-_(^CJ?^j{KXpcGG+dk_xz5ZYn$&s6=QR~bt3^~ZatQcA{)Iv) zUE)9#%_yH;S>tbfML-IPD;NZzql&L4@V>H^=fI}Bh;iwn{$jlWkgtt7Wv>05HWM$v z>?V2}E+Hh3q~GA+dJ6AeML^IXF}xImI$BakrIOFA{?D{=HOQ8#C@MfM@6+~8XDh^f z5aSH2?QaXubvY}!OPXP6J~A-Q1`pumk0`H$qWJcc%Vt8bj?&^Xj4FrkfX?K{03f=% zch0)YG>%}{^I;Ys9r#rr!R?}W7>6;Qm0ACVER}$Dz_}?}vt_jKCbC?CG;-X7m69E$9 zXlnGY<~XGRS4x`;=_zDn*x-Zztp&iOpSFD+_rfuW9oqa6N_Jq29<+@Hqm2^57*4xJ zK8O$T(AzFoXr&B3B3i&82bhV&{>ST-Yoci^Qw%xAcWRIiNaeGd*?Ph?@>vkZnwNev zDG5yE-E!+2PE}lH7EYOqBw41&p~F8$>xHX`=KJ}^t>Tl)_3=kjHh%%({|{L93iEdD zfb7pHNg{ndlNDLWFH%FRIj30NMIJvzfT*q{4J5M+H*M{htICQBR58vsqtDC};!S1+ zw95@~Q7psP$bezClFMg9e?+RY}DAwNI)qwJM0)t zbjbkiR_3=#-E>Y)2Lp&r!qo8yD)vi5GKp{@mT{u}m}ZO%YbE$I^h38Wsk)qkLtyFT zkgWqArFgz>A@pv8zL>^Bg_$&&;eSFNKJPeUd!v6}LZ21~z^;k<_R;`D^OPc(%!4cD zyF`@;aBy}Sr`s1%5dXmP?-RbfZ?Wvq_ zX^Y7NVZT+TOEJ*jlyw6%t7~5@MNV@0VKvza$C@V*41cba z2r+>UmXZwi?1$S$P9Cxf@6!b$={Y_x- zOcj5Y>>QS_DriOEtr6?5axnt)A*APVCh?rG#=!9WRl$gg}k>U#(3_n7|pL zyz%i5F+0d#qapvLr(;wkMn)$Tf71G@hc~4w0HZgf<>n8LM70?yB$XNcFP_ z2`11OPYs?o$>}(e3O5ZLi4TY%JHG9ASy zib*{^kgT&!092v4>?Mg~mY-HZa@mxaFQX-6O0egZKS9S33uNc{?>#dTi<%y2S711_ zu8hH_9B3L_uP?bYRCGOW)D1&7l-=SsH}*u%ZiJ$ZgQ0>d{|8?|T1)qxN-`f2z*k1{ z?iAnr58KMiD2|$0Y-?n}GD~ssMHC{jj}rfB<0-o0j?OqC9w|wp(0Dq^nhJ!)zi4Sz z^SAd{W3`*Mkc1kxr(JUKyVsUc8nl17{P`?4UUN^-cG{Fo3|L+yNvHI5T>DKA_>d8DpX5Tl@R= z6xd{t#fM2boBg9YKz=|c5jzMT01oQWXHYo2^u=o%9x6hN(@KBW4XP?*fzvoaP=2&&rlhL1p-@r*y3*<>Afnql@- z_ueNB?iWf<%XYKK0S#yPjS~*ik@)g(cG*B}mXyv;o&H%?tVt@EF>y;&FrMtZUG)S# z@&d;KN|PN7#gP|bKY>0x{6zHrHN%oJ&3t4mKiGa;PZ~JXsU7V?`tYSg5-Z@WgCc`s zuAF31Fdz&)YIImW8UY2c)zPgVs(9Y6Gv*J=>WaBb2giQkiNNi-9F%=I33HEQarM$H z@+&f`PUOKR82e11H?HFByc1_}#s`%T)f5T*Q?EqP7tE<6lz~M(t+HR%VzWV(rzAQi zWfG;O6I?~8#O^-Z0{bYqpN(yKq;uslB^5G?tO)K!t zhr5Y3EB#9vP?*}WmFARb@?H{lQuk61!2q8A_Y>aBj;BFzje_|8k`jh_U%^$f5R@se zkKcll*gKoThA@y12lpj4##=LxO27R!_c!wf{j3uM7Yv&x_YkwILSX}+e191tIaw$& zVl1psRO2sX=d|sKtb|bUhdrTT&48Sn6{yFKG1>Xb=Px>n#tmOAgPeC`#Ea>5jL2m{ zH$<~!7PEy0E5+FRcMsp>^w3rbzKCcpMt`zdi^uy1apY7XkEimSjyu|K*T1QJ4cE%4 zg4dM&e&bAJhwv3#%Xe=pnRomh6&Oi%&hJ^3%yLl2cj@Rg+ezW7g6yF1LNyrj8PJ1* zEim78zmvM*=6!Gvzj~h#FBqPI^o5)}&jiy3=hhQl?;Ljj7Q5pQ`HvB~I~tQE$Rbs5 zh`nK-b_q-6;GrIEp_B;(3uivn!X8rg98!N(U`!nzBb+OMz2LKr_>}gTro2M-Lft2Kh>dyi0eu$z< zQ5A_u0$z({=`tazc=7Y%MKBx$IS_ENi+jYTx^nK4U=rnm;AHc%(DliJsvb%b#j!^2 zieOrt1Z4+Yx`s)8NwQNGQ7ek&S;f=XS?y*MH7!lERiM;g zU&m4=?^IW-6+-EMBRN`T^rJNpgy&+ zPG*-H@VU0a(SILltJ*~eF*97!x_%RwOpa#xe5h572!K)(eXED_2Iws2$VNk81FcW8 z4S=|eS4Xm>Apr~*!nJec7O71?j8A%flGo;U%hb+;Ckge6%Bc?0J(l_K_JlmNtIgK^ zB{NN;{5vf0A;$2hO3@G(?G$HpAe@)b&xnFh+ZQ79DUX>4(H)wzrgrj0uUZNP0B(o6 z1C{!Zzz5DBL_saf4oC^4w|J*zY}32g*qImjhw{0?7+a-{#D9;(Qn7-&;*HQK6o6#$ zz`)KrS9S~w6;)9Cj673?Hwg`zt!EN)S^>AKfD#A@s4#e*d+2SDh0pk1@Q)6jdN?#% z@czgB+OUzeAiCx+3T8l(1bz=D=G;$udLYVN$ko1>+4rqAk0llQxqfO{C7u?()l%92 z{+hxTuy$$C0R4*>BzGw0e#`a~^|MIm;t_QevWDp!L8!>l2neUDN^&YOO0AXs6)^`GL6{cX2QN-GAASNGMoi@54GMU zRPQvi&e89QOZ|zco}1a}VZ%|vx!WGHAPGFO?XRm%OV#ukj?Mqa~ZH2kD zJh25?d;rI#S}0T}Mwv9BTete5?xWV}r!6ar0CUmSlQ(8aweU@?M|US>i5IJu176?> zYhOTHe$scFrH(_mrAw_m!axX?{G~N;E z#BLOsA}c0YPjk3V+v%sicjvAH{{k zNGMM>k4z9aat7W4Ft0UJs1Ta~hQPo!)_3jwC2lA(CpbA0kcD$l{(Mv?WfDKOcXx$?$GDRgK_*lxJU!Cc7BQ$-rvb(=&D z{3vEZeOA>r=<<3NGNr1>g^y7)MO=V0LohtPmP{q%7|(PVUOf4C;uU?X)k-60%7+y< z<)|3#2D^pSD21eEs1Ub#{I};O;|N&2*!>?bj@ENt;4{tK!wG)`!L5##W+}v{@k@FU z3nHYmCbW+XyOO2%PlYtx!oU|bzb*}nx$L83%ozx$J&L_ymnJB3p1Zw2{FKlu#=9kI z{boyOm{$Pu{S~lTHEuq~v+ueO8a#Lx|rkRugXnNQ8@)-HIO& zWsE~ZapMBqrk2Si3O6oj{yd#vGuV(6nC&&fL?Pi4rRc(KQM?>ZD?2y`I7GVqPAM~6 z1i8!wxpZmieDgrLnsj94H3SFR<9$>C4M}Xd2*30jtlLsaQTV~sG1|gK632W8ric9$ zjk-ilqM5#1KhD>w5E6`3Ih~FFgC07Xd8$6SNx;f+@b23PM+B*}!2GCBm#j2;zVZ*e zMUS(Y8Lpd}xfQva7;(T@WEAdLMbz@g{VWOSWpiEA%^p^#Iz^bfvq{$o#Os8zElr@d zM;)a`1Rxp0-xdrw9o!E++qVj2(}52Ck_)=PM;-+zwoz@dFJ`2JJ|fJxzyWP^*mF+J}u;> zdAG8S?%f@im46o6NeV`%K^VPOc4-V6YdxkokhnSd&Z&-#C1hqF%9NJYTmkb1*^n7? zUzAoh-wtgBkbjuj=GV6c{WR!Ti0qU9x^&57?22yl+g>6bVo25>U5hjoT%#4$yf4fB z$#vom&*Zn@xWzIa86Z=?zxvaZA+rl_NmzUEiRhtU>gSEfxMLbgmc>bGR3f`RSeqU%i{p%tE;eH<*yG#_QoVro^R4=9_ z7NRv7D3Nx$1wp9t9oqjL9LE~Y4)d1l@6rc8XxdDzJkhC$&yyx6g5-Ur6a-QugEd4h@holDbKdg=;^9 zX4^=8@p*pExIZ z0R+buXdW+sMJFmgrB45IsoqMrUGc%sJ~gC71;<|XHckkEh*Z-dikT1>E<&UN(mx`( z>ui3y-Ly`;`fhW^8^5GCX=v8L^(%Z~3?|e|iM?6f+ylavq*>R@-|MNNqq?S$DLr^z zr`xmPI>nLJe)NsHv|sE^8=i}b*_~W>$=?FRh`RGjahw;Elwc{En{Wm`&LNPjnT7GL z5DRQSY$~`qLG2^uvh@y(!vc=$X${RB)f3pz1gywWdoZntd)h}!?c1X(_P2D~w@G); zETVD#b6gD<{1VYBZre`XB1ENLvISiYh-y%gDw(ia!9EkVb6#4yt)Y}&N+hKqotOb& z?uH}VM3xU79|$|&DEMU+JwBXOB)c4yMaduFAx~ku*@;DFJ!0;Xv2}YT?&D6PwVYJl zcg*8iyBI%+F!bMRhjR3~r13zVNO#~fsy$r2{9h8KpSnu&@w*DuW36D%itCNN>;Zz6 z1DGA)e$b8@pusYn7n7Px_9h>W2~8K_2YagAeZ7QaSU562&7!YZqhRZ=cLe zchSHk0PW04p)IeW7cJENw41#&oZWcow=bCY%Qb)|#r8O>m9D|+E^}aR#-m|>GTil z7i@7bM2|>34^Lsq4dGPCgK_dsAXBG&dzu$uYKZ7s*kM7o46KGRY%aaG{by#U&)|v% zmX;?5+?Q-UVn|IJ3&*tqx~{gA02**E-oHUyLyEUphPCVKkzx{kYwHb{B2h$iOgk}3 zYk{{J-+JOq0rYN&pX>k&R#Zsyw8sW+RBR!zG9?h$313Ui=gXw~n1+_Wgx1Mq({i@R z(Grd#Z&;$HI6WkAQx=$IO0k*WcSX13@s#oUTS9(cyp}rjVpvbE)0yyw}K!qGtzqnniE_i+y{90agLmJtx*lfs`6()!2{( zs!CL?CeBcui9eeC${nDjVPYd>f?3c+Tv+gUeNpk5j-kv@IPrf#WCEdG{n*u{i;b!GlPT13wqf*uCs* zrD+&7@!}AP!CSgBZQk(4@W_08fg0a~&k##x#9Lb6DtyHH22(6cr{1=_EEQ-I_T(|= zXvY8M{u9D7A;o^p7@kqA(QrYh=M?3Cbv(SM_4BXE|A;=V@n-)mny9xJ3~w13Mkf!< z^y&$Hl+*UfEE9doq0-Ao(eCtF(E3H(k$bq^$UjT9^15_1%68m4W{3Q=DeGzS`Ev^W z!)1}jw%mUK(GwZp9&kpSzF&DU-AjE55I#f@cB7(; zhqK?u4cO#9i#xU{x^%kD(>jIo_;OlRd|S->uaz_vwv4<0p9pdVw-Txm^!2c0`24eE z_0nuj&;|4lo6wp6FXFwPTMIS6(K*6~6BPb;R6q*-Qd=DwY1`?uHfI|{yMhlXPe-nc z2w|an-)#BC!z3@v)=GrKpxZO)@Ke>j6!e!~H(})a30oy_1jUYPp*mxJW$~^~(QFf~?Pn!X1$a`?>1Sd`_T0{cZZux;1xnOJ@wJCDn^4zFK`AixgrBV$Cm zDBV0#NdwUzM>%O688ej*qmUf{hv=5XnkL)6Ze0(7bojdIA=u5o@M)b^R@lpX>)8|P z^&<(eH{;sd;sI?B65I3 z7)*afc3V&@h0AXA^|!v;N3O}TSHbJ|b%L|__Gom%BbTn3Jk;VPl)4EXo;zN6?lat0 zFmPS}k$LFF{H#^`!+wx|V>&$V9{C4({^_?4n4XzBSIG$MgIuc)BRELQOIzNC47FdI z7ThN!EM%YPM0b5>>9X8l=wgZ>e31rsNS=@rsj%aeN1d0qf{l_JbRuZ$a|UY5!(HkL zeBRZ%+lqb29R0jDljKb=$`B^aWT*PpfZjatB2~I=Tta0{99KFw~NqxkOkQwJOg`bjY zcQ;A9VF*ie&IxalDgv`=)5!XP4v{%bZcKv3Hfel4G0g@S!>G36jX`Yn8=OB-gIfBD zGysjC^1A+2s*)x>MJl0i+-;jI z9fM1;H$N?OfBl;9`)Y1bBA-P6nEf+DB@2m}goqn@UB$Z9&peYdHaNKIVAjn$ao;;F zUc=pShG8s(pkH&eHVZj+*py0sg2#Bm1qqsh@XoKd$3mQdO!9FtJI26}y4-Or;sE$W z{((g=&99t(6#8-JFwrEdOa1$oA6>_SVbR8Miam)x}8C%ksAk!mXSS5K5kOZ$|?2yZ#cESVPU zU*_%V;H4RQW>X}R;6IqROoRhyoPXRoRkJBIh@Hn@I7=@UZNfTzUF;{8-wmW+6LF2I zC`)H$-d+8m0NT0-|AJDjC=C{us$Qf5`q8mB%UD-fahs~`jy&jwZc+k7(Wmz8zN1w0 zicO;9jY?QzPDoBMtl5V@H>vE??EakeBf0&~3_u0wDm4Sg+*nL!wc=Agj z(M|fs&do2cP><;(z6d6{rT5j#jd)2cbxF}K&7q>-xkJ)t?L@!M{Xm>*HuXl{eSdjW zJbZ-Aejm*~_89~}|7_myplkU}U%H*yIDs3eU9Q2f_9HItVMIf*$?x*7EZ%h_uFzxFUU&!XolCB zCNL>&NtwRivn=17z8S`Oy2h+76i#=ZlD4<%3ffZCp@{N@E)T!jF8st9QqBl&Q0cE$ z5()h;z>W3I@7XTUaH-Y06GzV7EF=^x>ZZnhnu@bdzdGFk6^MoPE%y}(q}-bHO9c{> zyA!n|G0v%!pXxt3+1u}CNw6>{WG0K>Iz||qp`&A1m&8{Ti2mhHt}t6`eAaq+>F3=_ z_z49VYZvX;d6~Dw7-n`a@!VGF9c!G2wyXMJoA;1UE~E_+AhFZQ2LY71t;+}qT=j zg}~SVd>s0LaMHFT8)`h3L;W)ajc+BJjGS36fAuAsxV@AuUhP@0UHqw5<~MRM!(aV` zaJe;W|6=SUNCtKp#pY3*3@itsi}JC+8J|)9d)oIcuJOriscRz{>|BOdR9cmV$n!Zq z>x&&oq+i#}OmwK!+?r*UYtu0qkNLgFJsu&sr+mH~7}fvQc*FE#^Anw#c1i|>h8I?~ z3dwS#Ec9O_Z!k@@+hUJeZ7?tuHrSy!jy4@#(DpyP>m<8$a%?atxk+e9>+FrcsJut@)#oK{zyeUa^DLzH8TYnKqkD)}2Z=;mHT)tJn+WB<2u&o&L{oASb`?1s zzXl98{7xTpW<13oR$^4hSe87o(nVasm)BJ4DId+1ffn4j2AM!m&-2D>l zc?gj(<43h!ne@sUKe;u}tK_skgPRwE)IxLOA}6y_c_&Yna_h#NPNpCO{Kn@Q8uAB9 ztlxBA#+6vZZf`n~^Fy(VmtYnS;H*M>uihGUyR@^tH!x}kTzO5@zph~Hzxp<25cx0k zd;M=MKnbl&`p7<8mP)}&1_`p|y>~;;|LN+)GBHg*bD&0se4ex&cf%lx}$9tyk%-ncpK6h-2j%^|alt@Fy$6H!7w`-&kKvz=CJ| zI-HdRM`)BRmQkKXDX%fZOP4b2_V>}2gSPwx>y3Z!9Jbx2?9F_>O>sysYVHgW{mz*Y zVwDG|Xc=4y2`x`G`|KvPF^s?G?mn)Xzh@dt4zQ>evqsh^$wm8=aEzM|!fusnnNvZM zvirLwdDm@NzrfN|*2$EqS$a&w@1b_>Kd$mKa@JIx$K!qd%&xA71`dImA+KFDMW!Z} z3|f?S@!4A2EYNu70@>iZvnLjKIY1gi8oroZsV=%$=4AFJ|72zd2(r)~JG|~k?fXsP zJuSN8UE{Z?H4QQSvCvLO!LTBHNCZHjA`hBMTckf4G2HiTg-{fk(TbkOs&OhTEAbiGE3%<-n zKKSDwTQjF#O>n^Xy&{lI>71-T;L^BBYIn)dou1VA#L_}TWidVX8x<;DkS5GCuSY1dC#h%MmvX_Si=Edop%k`1n>e8Wuu#4K-fD=l1zYgnHg-$f;Oz82g1+qx6Udy?&Kw+o-&{`*?~6Ct7sTdte5nHZ zxjztAv&3HKVd5c`?3TR1efK2khqnn5Kb@V9gq$?1dSP)*%|35rlL;Qjn#9RSV6}2K ztivCByN(;tD2nc*8T3y&(g}rkfBO3W4HivKo%n2X{S@b!gSaJetyf7NSZ)uZ3-!gd# zj^^z~L%U7ljR8%|BTrZk34gFh0k})m&5uS;!Qd_cBg2gr&gp6!AnGbjaT#jZg+=d{ zooB^8hr?Q@WhR%MclYLz;M?RF+O~2>qsU#)>^y3^Zkob5elK%}kR{i+kKfK1{JX00 zO@~W!_)xT=QPiPfvRVDBXE&(RGh8>R{dc#7isR&QdIiz|@~{rwjyHW0hW!Pj%PsGX zMQi+;7)se_5q0>i>aOO2DG=SPMpC???87bEczP&F#6zo(+0~@t(S0eS@taz`2ysl! zF$RC}g<4)=3-qG^hq@arnq;7ef%+xD9?x%nM*!uBP%1dA+D>e_C0QZ(J_;0cggGH% zT_l37q)eqWF0AfepEHH0my?L^{2&7B{0FR?1|zYmHMA&qVIYbY+)5AR6IVkKr+=G{ z$428<+;LW7%ORCogX9)?rV7dC;$12HHz@CJ_&X`3(})7PFGCViAkqn*H#;b5dw-%2 z^|yvK*3nf-Ym{dCltPjcFisdzERE+>AHJkWJeua|GDq>z-Z;)z8`#v6>FhB(C@cz5 znQP2eK7JxkxugHM66YR}qXjcX862%QaGPf~%`N(|ap%%TZFh#wIoUG^%YKbAG*;gg zh4QMg)0@;XT3DNXy6lfM%0%}*TV13!@9D~e+_luR!lxyjz>gVGjXg@0zeTvn3~p!h z;kHv_jk{sz8~hDBo0o%%ya0E&(67juy5TCEzrh zHL-rWmaNy6OM8g1hhdJKuee#5LE*(`#&&8e2f=0Pc zWLkXHa)VvTpzC4#3cDm#S1({xJo^m}l8o(VS4jF`t|(^HnGXZu-Xx`y-^7#a7mWVn zO&;q>GjE0JmtT%lK~0Z|tL>*RSR7hhKZ*9|Qz!XVka52&cCsT+3pIZ0)O;jo&z()g zlk$6xjv(kYh|@riS;$437}?@&{{Tky?(Dwbm6;50qQ^^OrP1O*xmu< zNFW%X^1g4a#l!cm>n0R=k<*E0g11=bWmzl%`9zEbM_(VqOI8x(y>@SqSfE1IQkP;V z^IA))k)p*fE|H(Nf30Hd(5UXnW=26RILGNS-@c^)vx%LWyiq6c>T~exF!fCr@~4|_oTGSuM(ZhoGLC5}r=p*zupG(Xd(F}D*R_*h z>SUBpY$1kpry2EddWCe?1kY5Nsr%w`bbM^Xj7in()n=}tP)-JL;Gt{rW5FEuI@dk=b`BvJa}U? z`9IRV-%%YJQymuWcJGkJ4T?rXFTQ9DBnWdayrjqt1G%?K)qDj1(Q|NjVwN;MrXM|1 z-x(`cr<^%8-%FQhxOGsY9!)H)V}B4V!+;Y8z}I~$jpHmSUD~;ghgMFXsj-4%K*ooa z(9S;q_CuESmg~SqbUC)qxgETGxRL6=enz&P?<#_Y(@2>cNITXBU&-rhrS&TeSn)Ih z)EJnkUC-M}sXh}txOSO+#i6bHbMy`hO^Fa1>`={Oi|r5$b-RP!1h<*@Bj+(JCKue` zB;_Cg7#hCW0GO^ZiUN&;XTGdByKd^H+fE3EDH)Tgd=QILdex_0wNXYV&hKo6ZjI*v zh$jH^A>}o2y*~55e|4?S>f=|Il+`=QhO@;qz2Vo2Y}pww#s8x~Y-?X<-qe+NDvI(q zcwSkTze1;+x)j&{7+TovuFluKbQnq^CUAHI`c0}I@zFf8rHQ7zXI zrwwKP^}Ym2HL!p?ULWbhn6GP~*G1A+Q3KnkND-w)x_TCmsC(R1BTRkHm*X9qD3zUD zQ6XVEkD@!Vo+FiEl|;)$6D7>3_!~gAV2o^LI%Yx$yOp$y_|+1m$#*mEx{{sTHY4?C ziAwzIEkIrP384rR^)MWR9I-cHaJ5oT6C%b~PGC~OKYc8{+YT>mq`1woe23?#1anw> zy~Q@|0~zqYnK&<0RqfP*ri(g02`3pUBw5~@QB3VFw%fP*fNTU6r4oe{m81S9 zDfMfhvY?^-3g7&?)9~^LZR~XC{w&dpr?3`?{>z}mrGVD~O=>d8)t^wYzWxKa(n5~> z%aSv`@U{iaXA@#RF@VN*K{>hsBxm zWjb+?03?MqOftOz&Rk^2__Cm>wwL)cSg>H7-z8BUqJ#4I-F__4-nZ;C0@`DaX8kg8 zT={6p&Z8r}ikxtdA3B)!d8Vp8#ElV^=eEzs7t$clqC~RH>6m1o{VQmq zz+akUQJtQ^;rF?u)b6JG6I2X9WcsV};a!ebw9Q@}an`fS1Ypr5LVuK!_XV3&(wH$q zi1O*utL;-a`=#eY1;fwDXdpz(-%0^k5+Nm_L}&}ZuGZHrlp}E0efR^UITuVeyZRA= zYCUFks#TszI~pe1OXdGs*kYBEm&-i`@U7p9hE3e`v7fp)szT$^9&b=me}kVEZ8eeq zX;N;E*)m(SO(M;Ig;&uwdz?__b9jvC>|~$FCoj6${__`}bAiVp`bl2GY9Zo2M=BxR z4U5|b49T&Z9Onjqq>1p`;n6_!aw!a}#8%E_Hb6zdUYn=~m?ls~fh9I^+|p*&fq_S! z%T*@Mi>P~-#LD%Nl#thdT%cZEl+ZF-z)|5YHxjlGaxw4HsD1Eh8pkE+*pKog4f!OM zUvgFbrw(A7&DZ(K7G7tQI$Cwe#FOzC4}ah^2A5W|JeGBw^UT`o`4hbrI@KnXS-9pH z)vt{mQPmgsVFSzfChAod>nL+%D5rKwqa@AeB9!PSvb{-GFH_inJI~K zam}QA%hbvQyCtwPl08U#x8hqQl@Zk4v93>&a9GaIi%+C8I4<^N1OLtF{^auJ+V5ik zk3o+U)MjNa)wp=%Ln@7;hDdtp@es){Qr_yMjt^%JUjunnqG#4JtM{03#nqrE4D?3w zA7h@4OOowk3@PjMiMs#=g}sC$A)sdM+mnya#eIh&W59@tIxp$prx z#^+^HaUoOCZXtdxJ}EAF)^FB<=tF+rM+G?>-?&aDANJAY>$0j@By3Nck}5JyRjOYy z2j~6Z5I8=-qp_a?uHIr0yB)j-5A0G|S}2q3t*@37kEj;6))% zj!6hUE#p^hus&uhgE=Pi=B$JUE&^2_ivShY!bP%5tE2(3-$ET@e-qJZN;^=D8}A5LD7~ zb)LH?HrQgDL$x=W8~w3%XZy5BebaXVA)TRevN@Ke6hOda43K~yxHJGvNzCw*C1qIN zdMkX0ja5f8?fb6*P-0VN(NG!J>;xiw<*xJ=1_kKTwjSUEH?m0}l8=tklTdX`CFATYAVw)ep3L~>N4bVkhVIun5C@=D* z=3vZ;<_pj8>)DSbTt_^3+h<%shn2;#*)r{bTC3?0(RLsh10mn=O8U_Am}SM^_|ZZr z%}DolT!)&^rlB47KaN_k*0AMoMCoqMtsFy46Kepk_w>2#QX65{l5<(s`?#IM=f~HQ zFWrW9E9NbQ+JXW$V!n~U{pZH$6{)$*-NwUggV5eBq>xRk03Yj3!)zUOmVHq!@k8rl zMmQd#+K8K|Qv@^sv@LmCK(_kh`r z?_T<$e^x9UjCz^d-LEfoKdYhGANUKYmqK%q@NIzMO0gnAx(0(*2_6F^H%s4#azRK4 z%%1EMjNS%V$Ci(w5d|FZXq)8k_R|M}--2E#1x==E)7-mliw<7hh}5VVb`vs|0N zD|Em|DNYCviApMog#XsV3>C~DNq^(gusgTwO}Ug}qGw}hm(%z4I0zDtUe`_T@U0bb zY;!GGU0bP;QAcW9p)2uw&R|?~4gviM`?$KadIAedxI-jLbtv+D23D``dd>^Hu$T}5 z_>otrb&+P)A&Wr12`DHu@-j^Q2)CiaD520ehUxWQS0A-hQu}w0&L@u(sIfS2_Z$pj zw`2;i`f<6dm(oI8NA_suc{NoYU%vVJG`X8DQNO?f!ID*OM%vr+pKRvi^6`NVl16yAM1tE>h8K+z{SPg z_nAl8>r+lBb)yUYLLIE^AY}1^9w!&_5N3NEcD#5NHH_U&$o#x;XA!IM<^gy7on&kf zKQeF;!lO+OLtunuO!*A|r2S8Oyu7!-P93~?2V$Zhv zA7$EKH%6?{CdP~ocv<+kE;>wF$F8m#8o^3S+jXEpnS`s(z|!l>C;S1iOdmdkR2%e+ z`={DjUP(cO?(Rrh=6PQPOI+)1O&lT@V+D^);S0I44?iYeHnl4vvPEJ_CEjDLk*$1%j5n6M*7Vn zB-RL6j_2Kugw-hstQBlmI1YKa43*i0i+k7(dW zW`#rT(N=MlVb(`;=8vZZ(LhIu0@qXWK+P%i9IG0TL^NURD^D~0Vfh6lrRkoE?_q|f za#_(+3%WIHfBxMu+#i|PRBk%^$l0PKW;t-2tr;5?1@q!VT`w2Ng}-6Lw(MY+0{2?J zW|OPVa?c}x+UWLaW z`JQ)8rfm)WyPA7be<&b-#zQ@I`&hLxdij!B!k=%$^PcA-nWfD-@|XTsBF6oTnWEyh zo-c_#;*Jz?Wiun0GZf;i3NO(%qhw<<3-I> z+NO0a0$|_?^&)0zbkYtJ-Dq#x+jaI0igvFSwyD*Z9igReA2mF{GLqXe6@xC2NhTV!P-t?J*aXAW^l{`)f826vI>=tPB z=i3e$MqCXRqzK*=21p7CyyI%G@1b{`RG7R)FS4Ixuyq}JC}W-Di6`H0D#(p5h;AS- z?|#m>8BE`^s^=B0cf`9BlXeW7r&F4KQVq07#k4~cAH`#Ly{qF``bEKF2jhT%%~`j9{c$N8$GtMuFAfq&wW6W>A5vj#|FwS2FU zaI3SzHxkJ?ObBp*{Uc7?ovA;boFGnBSec$}6RAp*W+ja7L`?~C#~%UnmL$YW^xShM zC@m1fDOVIoT;Szu=<^0_;jDLSihR#RZpf%CH>QSXKQFAFXYM|$%qB6Bad(433~MoA z?oWSZ;A3T~1d3tFnYS?lH9r5)>Bxc-YL8;{hIuyd~jF6o2=h(R^Ln-s0A>gE##;>H)b(`i?$oIVS^7W~Znyl)iz}V4rJSie zjXboBOwXVN$_HsxiVg)s3pY(f+vWx9dww)KoV4G@+=~}nvh|Tgu|jolG?BvwKGz!I zbv+f~tc>-5tkIJSNVRE|bbNyjXZDBY%6`XouSz%2C{2n-qKdDzj&+h5Eu||i!C6K- zA=65L{Z$mv=h?g3z#m2{oqr{M4hAqahGT&lYB8mp?9uI^6nYUfSisAs&WLKL5YFZBQbI>A_0aRSTn?Qyu@skMN|303SKWy}sy|nk z@%OKKPS}@|27|DW%i75lPN;lE^Ecz#(>^6z(T1hA%NjxfP)RO2nHpZcRdu6q^Ju#1 zw#DjEX%q!(b^&>xHtuk?rt7A_@T53n=*?dT2*o}6MbRWsI0rxknn}?sNv?C5T-_~C zY_2DngkS3a6Exw=0)Q}1>t80?&q!}v?Qk(Upd{9%;zGhoN=>PDCy`VHQ!ggF zBeZH{bam0t#2sqinNq>m0PLMqfhw%}bakHm{TO>WoZlAb7V6Cp?Q|!$uz>a{I69$% zoxWSY`=vRTq$h0ij>+$Jl5n0wEbp!qKl)E9rfiinvmb;t?baM+ke>h=Hlfc7B1eTz zyQV9EmO4#5eT~Hvdqw>2;WsI&2~T>983CgTGFIMqy@UZ*BnBmR zE%s%&611q0+aDIpPigc^?dv)E7$_i$Z34c`{d|S$WU$4T5N2!u_ja z&+Xn*{Sqh6c*CdLYkrD%G|^l&|IwI;VJXjtETWv#SB##2p3YrDtzw%vZCL&jttJY43myviX-}|-Etlk&6m7q%$z3)eUXJ!3CE;2n_+sT zFA3`4?;#<4jKDUGcTSZ-S5unkR%hu3RU^3v$&&h_N%xW`qpfhC2xssI&fwmE)XXzD zQ9ZcP@PXx&ruIGJ=gtB9n{qyhXxj%#=t*^~6}*gTC0M1gkX1W0>M!m>O95j~cj0?! z8uPAn7ML8aD_@8@>B12V#bv$|iD_#}d#x8kHi#u8Lr|I6@X{*zcP&YfT~s13CS*~u z@@PA8RDn^IVLb0M^gnjqZ7qdj@~bT=ObkW$k$CXxsM!2Q*j7&P_ipAZjfi0iwm9*Z z{_&TXsop>`yCUnjpaEqRrV1;QC~XxRC4_^>ky@rZ;3jB}mj5kwe7?FaUlj3mHex0pC1m zq&yMX%_%2|85hMGVR~5&s`cc@zeSkL`kSTyl${c7p-Z6`Or(ohTp}3DPQ4^KFMq{~ zxo8>BixF&%g$SSTW{`u=KgF>Kos=XyH`Ps7D9>_LC=pwS)6h5m z^o6c!{Yrvzy$9unpS7su>O(d2g5CS+c@e;HD zH*zd&2%BEh@^e(uT;_UT*J5%M6$mtl0QL7h;#l7jYddb~Tf_tpDXfMB*@HM^kUZC#TUsUT({&KhByi$S&D~=0+Il?6c+(@>~@sG7{8%m zvkJte^O^|zVPiAVZ$t%UD2ItHQQ5^NLzKtm4iKpzGAxGBEh@+}K7z1SeD=76I!q3R z*iWHH0~H3b6TiaKKVZb??yIt3AV_q71o+FN$LG>wmZI{IN$dQPCP4i^AMf&`;0T)m8C#Qy+*ikwIQ diff --git a/sites/Hangouts/notifier.js b/sites/Hangouts/notifier.js deleted file mode 100644 index efca1a6..0000000 --- a/sites/Hangouts/notifier.js +++ /dev/null @@ -1,287 +0,0 @@ -function xss_eval(event) { - console.log('origin['+event.origin +'] called @'+window.name+'.postMessage() -> req: '+event.data); - - if ( event.origin != "https://hangouts.google.com" ) return; //only handle messages from main frame - - var calls = event.data.slice(); - for (argv of calls) { - func = argv.shift(); - if ( eval("typeof "+func+" === 'function'") ){ - console.log('@'+window.name+'.xss_eval() -> '+func+'() -> args: ' + argv); - func = eval(func) - //res = func.apply(this, argv); //splat - res = func(...argv); //spread - //event.source is origin's .window, could send result of func there with postMessage() - } - } - -} - -if (window == top) { - window.dispatchEvent(new Event('resize')); //resize the roster per styler.js on cold reloads in fullscreen - /* - delete all the junk nodes in between these - */ - - //function gotoConversations() { document.querySelector('div[data-tooltip="Conversations"]') ;} //need to do a goog.closure.events.CLICK - function getRoster() { return document.getElementById('gtn-roster-iframe-id-b'); } - function xssRoster() { /* ([func1, arg1, arg2], [func2, arg1, arg2])*/ - // make arg[0] == iframe.id ? - getRoster().contentWindow.postMessage(Array.prototype.slice.call(arguments), '*'); // ordered dispatch - //for (var i = 0; i < arguments.length; i++) { // immediate dispatch - // var call = arguments[i]; - // getRoster().contentWindow.postMessage(call, '*'); - //} - } - - function myGAIA(){ return document.querySelector('a[aria-label^=Profile]').getAttribute('href').split('/').pop(); } - - function rosterClickOn(sel) { xssRoster(['clickOn', sel]); } - - //addEventListener("message", xss_eval, false); // intercept new chat window dispositions in the main content pane - -} else { - function evalMain(req) { top.postMessage([req], '*'); } - //addEventListener("message", xss_eval, false); // intercept loooots of data to individual chat iframes - // https://github.com/tdryer/hangups/blob/master/hangups/pblite.py - // https://github.com/tdryer/hangups/blob/master/hangups/schemas.py - // http://protobuf.axo.io/#objc -} - -if (window.name == 'gtn-roster-iframe-id-b') { -//IIFE? - - var roster; - - function clickOn(sel) { if (el = document.querySelector(sel)) el.click(); } - function getTopConversation() { return document.querySelector('button[cpar]'); } //gets 1st convers in roster - // cpar=_ - // SMS forwarded messages have ephermeral GAIA's (persist for length of conversation history?) - // cathartic messages just have cpar= - - function notifyMessages(msgs) { - for (el of msgs) { // el should be a