Merge mozilla-central to UX
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Sat, 09 Nov 2013 17:46:29 -0800
changeset 170548 ca6578e7546cb35c5d8994401011ffb4c3845175
parent 170547 bc9083bc302364d17538275eab18ace498f9f913 (current diff)
parent 168816 16949049f03d35250fc483dc4404e38482e8a780 (diff)
child 170549 c31c950dbf9a2a6c87d9203e8da929ef82085944
push idunknown
push userunknown
push dateunknown
milestone28.0a1
Merge mozilla-central to UX
content/media/test/Makefile.in
js/src/tests/ecma_6/Math/hypot-approx.js
js/src/tests/ecma_6/Math/hypot-exact.js
layout/base/nsDisplayList.cpp
modules/libpref/src/init/all.js
toolkit/content/widgets/findbar.xml
toolkit/themes/osx/global/findBar.css
toolkit/themes/windows/global/findBar.css
--- a/accessible/src/atk/AccessibleWrap.cpp
+++ b/accessible/src/atk/AccessibleWrap.cpp
@@ -978,19 +978,18 @@ AccessibleWrap::HandleAccEvent(AccEvent*
     case nsIAccessibleEvent::EVENT_TEXT_INSERTED:
         return FireAtkTextChangedEvent(aEvent, atkObj);
 
     case nsIAccessibleEvent::EVENT_FOCUS:
       {
         a11y::RootAccessible* rootAccWrap = accWrap->RootAccessible();
         if (rootAccWrap && rootAccWrap->mActivated) {
             // Fire state change event for focus
-            nsRefPtr<AccEvent> stateChangeEvent =
-              new AccStateChangeEvent(accessible, states::FOCUSED, true);
-            return FireAtkStateChangeEvent(stateChangeEvent, atkObj);
+            atk_object_notify_state_change(atkObj, ATK_STATE_FOCUSED, true);
+            return NS_OK;
         }
       } break;
 
     case nsIAccessibleEvent::EVENT_NAME_CHANGE:
       {
         nsAutoString newName;
         accessible->Name(newName);
 
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -745,17 +745,16 @@ pref("layers.orientation.sync.timeout", 
 // pressure.
 pref("webgl.can-lose-context-in-foreground", false);
 
 // Allow nsMemoryInfoDumper to create a fifo in the temp directory.  We use
 // this fifo to trigger about:memory dumps, among other things.
 pref("memory_info_dumper.watch_fifo.enabled", true);
 pref("memory_info_dumper.watch_fifo.directory", "/data/local");
 
-pref("general.useragent.enable_overrides", true);
 // See ua-update.json.in for the packaged UA override list
 pref("general.useragent.updates.enabled", true);
 pref("general.useragent.updates.url", "https://dynamicua.cdn.mozilla.net/0/%APP_ID%");
 pref("general.useragent.updates.interval", 604800); // 1 week
 pref("general.useragent.updates.retry", 86400); // 1 day
 
 // Make <audio> and <video> talk to the AudioChannelService.
 pref("media.useAudioChannelService", true);
--- a/b2g/app/ua-update.json.in
+++ b/b2g/app/ua-update.json.in
@@ -38,22 +38,18 @@
   // bug 826720, olx.com.br
   "olx.com.br": "\\(Mobile#(Android; Mobile",
   // bug 826845, techtudo.com.br
   "techtudo.com.br": "\\(Mobile#(Android; Mobile",
   // bug 826958, ebay.com
   "ebay.com": "\\(Mobile#(Android; Mobile",
   // bug 827622, bing.com
   "bing.com": "\\(Mobile#(Android; Mobile",
-  // bug 827625, pagseguro.uol.com.br
-  "pagseguro.uol.com.br": "\\(Mobile#(Android; Mobile",
   // bug 827626, magazineluiza.com.br
   "magazineluiza.com.br": "\\(Mobile#(Android; Mobile",
-  // bug 827627, bol.uol.com.br
-  "bol.uol.com.br": "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",
   // bug 827628, groupon.com.br
   "groupon.com.br": "\\(Mobile#(Android; Mobile",
   // bug 827630, vagalume.com.br
   "vagalume.com.br": "\\(Mobile#(Android; Mobile",
   // bug 827631, climatempo.com.br
   "climatempo.com.br": "\\(Mobile#(Android; Mobile",
   // bug 827632, tecmundo.com.br
   "tecmundo.com.br": "\\(Mobile#(Android; Mobile",
@@ -78,18 +74,16 @@
   // bug 827678, marca.com
   "marca.com": "\\(Mobile#(Android; Mobile",
   // bug 828354, gazeta.pl
   "gazeta.pl": "\\(Mobile#(Android; Mobile",
   // bug 828360, sport.pl
   "sport.pl": "\\(Mobile#(Android; Mobile",
   // bug 828364, nk.pl
   "nk.pl": "\\(Mobile#(Android; Mobile",
-  // bug 828366, wyborcza.biz
-  "wyborcza.biz": "\\(Mobile#(Android; Mobile",
   // bug 828369, money.pl
   "money.pl": "\\(Mobile#(Android; Mobile",
   // bug 828371, ingbank.pl
   "ingbank.pl": "\\(Mobile#(Android; Mobile",
   // bug 828378, wyborcza.pl
   "wyborcza.pl": "\\(Mobile#(Android; Mobile",
   // bug 828380, deser.pl
   "deser.pl": "\\(Mobile#(Android; Mobile",
@@ -210,36 +204,32 @@
   // bug 878258, blackhatteam.com
   "blackhatteam.com": "\\(Mobile#(Android; Mobile",
   // bug 878260, cdm.me
   "cdm.me": "\\(Mobile#(Android; Mobile",
   // bug 878262, download.com
   "download.com": "\\(Mobile#(Android; Mobile",
   // bug 878264, haber.ba
   "haber.ba": "\\(Mobile#(Android; Mobile",
-  // bug 878268, jutarnji.hr
-  "jutarnji.hr": "\\(Mobile#(Android; Mobile",
   // bug 878271, kurir-info.rs
   "kurir-info.rs": "\\(Mobile#(Android; Mobile",
   // bug 878273, livescore.com
   "livescore.com": "\\(Mobile#(Android; Mobile",
   // bug 878275, mondo.rs
   "mondo.rs": "\\(Mobile#(Android; Mobile",
   // bug 878277, naslovi.net
   "naslovi.net": "\\(Mobile#(Android; Mobile",
   // bug 878284, softonic.com
   "softonic.com": "\\(Mobile#(Android; Mobile",
   // bug 878286, yandex.ru
   "yandex.ru": "\\(Mobile#(Android; Mobile",
   // bug 878630, ask.com
   "ask.com": "\\(Mobile#(Android; Mobile",
   // bug 878632, banorte.com
   "banorte.com": "\\(Mobile#(Android; Mobile",
-  // bug 878634, buenastareas.com
-  "buenastareas.com": "\\(Mobile#(Android; Mobile",
   // bug 878637, eluniversal.com.mx
   "eluniversal.com.mx": "\\(Mobile#(Android; Mobile",
   // bug 878640, hootsuite.com
   "hootsuite.com": "\\(Mobile#(Android; Mobile",
   // bug 878642, mercadolibre.com.mx
   "mercadolibre.com.mx": "\\(Mobile#(Android; Mobile",
   // bug 878645, olx.com.mx
   "olx.com.mx": "\\(Mobile#(Android; Mobile",
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,4 +1,4 @@
 {
-    "revision": "6ce2fe088a1113ac761dfa1f6a6a09fb7f38f787", 
+    "revision": "cc492bd8ccdfb6f02734b7e13d970c605c8a4f87", 
     "repo_path": "/integration/gaia-central"
 }
--- a/b2g/config/helix/releng-helix.tt
+++ b/b2g/config/helix/releng-helix.tt
@@ -1,12 +1,12 @@
 [
 {
-"size": 86149048,
-"digest": "4ff723d8a372e2af95e62efb8739517943f362b515b4cee78006137a8dbc97f3b42edbd2e17429eaa7fa16b7f24594ed058b7032bcb7aa2ecfe9788a212dda4d",
+"size": 60589756,
+"digest": "29f6a7f09edbcc777ab155de64b4c7ff8c79ea25021bacc95a44d2ee8b7b13caa72991294b05dac1d841128a90eced3f52bcc3399ead4452f6170742e0e52fc1",
 "algorithm": "sha512",
 "filename": "helix-ics.tar.xz"
 },
 {
 "size": 1570553,
 "digest": "ea03de74df73b05e939c314cd15c54aac7b5488a407b7cc4f5f263f3049a1f69642c567dd35c43d0bc3f0d599d0385a26ab2dd947a6b18f9044e4918b382eea7",
 "algorithm": "sha512",
 "filename": "Adreno200-AU_LINUX_ANDROID_ICS_CHOCO_CS.04.00.03.06.001.zip"
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
-<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1383344509000">
+<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1383954148000">
   <emItems>
       <emItem  blockID="i454" id="sqlmoz@facebook.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                                 <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i58" id="webmaster@buzzzzvideos.info">
@@ -32,24 +32,32 @@
       <emItem  blockID="i107" os="WINNT" id="{ABDE892B-13A8-4d1b-88E6-365A6E755758}">
                         <versionRange  minVersion="0" maxVersion="15.0.5" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i88" id="anttoolbar@ant.com">
                         <versionRange  minVersion="2.4.6.4" maxVersion="2.4.6.4" severity="1">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i433" id="{c95a4e8e-816d-4655-8c79-d736da1adb6d}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i65" id="activity@facebook.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i66" id="youtubeer@youtuber.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i224" id="{336D0C35-8A85-403a-B9D2-65C292C39087}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i105" id="{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i117" id="{ce7e73df-6a44-4028-8079-5927a588c948}">
                         <versionRange  minVersion="0" maxVersion="1.0.8" severity="1">
                     </versionRange>
                   </emItem>
@@ -85,18 +93,18 @@
       <emItem  blockID="i64" id="royal@facebook.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i72" os="WINNT" id="{4ED1F68A-5463-4931-9384-8FFF5ED91D92}">
                         <versionRange  minVersion="3.4.1" maxVersion="3.4.1.194" severity="1">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i433" id="{c95a4e8e-816d-4655-8c79-d736da1adb6d}">
-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+      <emItem  blockID="i474" id="{906000a4-88d9-4d52-b209-7a772970d91f}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i40" id="{28387537-e3f9-4ed7-860c-11e69af4a8a0}">
                         <versionRange  minVersion="0.1" maxVersion="4.3.1.00" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i430" id="1chtw@facebook.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
@@ -116,28 +124,36 @@
       <emItem  blockID="i77" id="{fa277cfc-1d75-4949-a1f9-4ac8e41b2dfd}">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i174" id="info@thebflix.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i478" id="{7e8a1050-cf67-4575-92df-dcc60e7d952d}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i84" id="pink@rosaplugin.info">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i172" id="info@bflix.info">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i140" id="mozillahmpg@mozilla.org">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i467" id="plugin@analytic-s.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i360" id="ytd@mybrowserbar.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i5" id="support@daemon-tools.cc">
                         <versionRange  minVersion=" " maxVersion="1.0.0.5">
                     </versionRange>
                   </emItem>
@@ -154,27 +170,35 @@
                     </versionRange>
                   </emItem>
       <emItem  blockID="i443" id="{B40794A0-7477-4335-95C5-8CB9BBC5C4A5}">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                                 <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i475" id="{B21F5E31-B8E8-41CD-B74C-168A71A10E49}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i11" id="yslow@yahoo-inc.com">
                         <versionRange  minVersion="2.0.5" maxVersion="2.0.5">
                       <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
                               <versionRange  minVersion="3.5.7" maxVersion="*" />
                           </targetApplication>
                     </versionRange>
                   </emItem>
       <emItem  blockID="i62" id="jid0-EcdqvFOgWLKHNJPuqAnawlykCGZ@jetpack">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i472" id="linksicle@linksicle.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i99" id="pfzPXmnzQRXX6@2iABkVe.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i19" id="{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}">
                         <versionRange  minVersion="1.1b1" maxVersion="1.1b1">
                     </versionRange>
                   </emItem>
@@ -189,26 +213,18 @@
       <emItem  blockID="i111" os="WINNT" id="{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}">
                         <versionRange  minVersion="0" maxVersion="15.0.5" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i136" id="Adobe@flash.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i38" id="{B7082FAA-CB62-4872-9106-E42DD88EDE45}">
-                        <versionRange  minVersion="0.1" maxVersion="3.3.0.*">
-                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
-                              <versionRange  minVersion="3.7a1" maxVersion="*" />
-                          </targetApplication>
-                    </versionRange>
-                                <versionRange  minVersion="3.3.1" maxVersion="*">
-                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
-                              <versionRange  minVersion="5.0a1" maxVersion="*" />
-                          </targetApplication>
+      <emItem  blockID="i466" id="afext@anchorfree.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i98" id="youtubeeing@youtuberie.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i442" id="pennerdu@faceobooks.ws">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
@@ -250,16 +266,20 @@
                               <versionRange  minVersion="9.0a1" maxVersion="9.0" />
                           </targetApplication>
                     </versionRange>
                   </emItem>
       <emItem  blockID="i18" id="msntoolbar@msn.com">
                         <versionRange  minVersion=" " maxVersion="6.*">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i358" id="lfind@nijadsoft.net">
+                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i228" id="crossriderapp5060@crossrider.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i465" id="trtv3@trtv.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
@@ -308,16 +328,20 @@
       <emItem  blockID="i352" id="vpyekkifgv@vpyekkifgv.org">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i258" id="helperbar@helperbar.com">
                         <versionRange  minVersion="0" maxVersion="1.0" severity="1">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i468" id="05dd836e-2cbd-4204-9ff3-2f8a8665967d@a8876730-fb0c-4057-a2fc-f9c09d438e81.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i398" id="{377e5d4d-77e5-476a-8716-7e70a9272da0}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i447" id="{B18B1E5C-4D81-11E1-9C00-AFEB4824019B}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
@@ -364,27 +388,35 @@
       <emItem  blockID="i17" id="{3252b9ae-c69a-4eaf-9502-dc9c1f6c009e}">
                         <versionRange  minVersion="2.2" maxVersion="2.2">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i115" id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i477" id="mbrnovone@facebook.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i446" id="{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i7" id="{2224e955-00e9-4613-a844-ce69fccaae91}">
                         </emItem>
       <emItem  blockID="i52" id="ff-ext@youtube">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i224" id="{336D0C35-8A85-403a-B9D2-65C292C39087}">
+      <emItem  blockID="i471" id="firefox@luckyleap.net">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
+      <emItem  blockID="i320" id="torntv@torntv.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i43" id="supportaccessplugin@gmail.com">
                         </emItem>
       <emItem  blockID="i340" id="chiang@programmer.net">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
@@ -464,32 +496,44 @@
       <emItem  blockID="i76" id="crossriderapp3924@crossrider.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i432" id="lugcla21@gmail.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i196" id="info@wxdownloadmanager.com">
-                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+      <emItem  blockID="i91" id="crossriderapp4926@crossrider.com">
+                        <versionRange  minVersion="0" maxVersion="0.81.43" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i435" id="pluggets@gmail.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i67" id="youtube2@youtube2.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i460" id="{845cab51-d8d2-472f-8bd9-2b44642d97c2}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i38" id="{B7082FAA-CB62-4872-9106-E42DD88EDE45}">
+                        <versionRange  minVersion="0.1" maxVersion="3.3.0.*">
+                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+                              <versionRange  minVersion="3.7a1" maxVersion="*" />
+                          </targetApplication>
+                    </versionRange>
+                                <versionRange  minVersion="3.3.1" maxVersion="*">
+                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+                              <versionRange  minVersion="5.0a1" maxVersion="*" />
+                          </targetApplication>
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i6" id="{3f963a5b-e555-4543-90e2-c3908898db71}">
                         <versionRange  minVersion=" " maxVersion="8.5">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i56" id="flash@adobe.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
@@ -542,30 +586,30 @@
       <emItem  blockID="i336" id="CortonExt@ext.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i103" id="kdrgun@gmail.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i320" id="torntv@torntv.com">
-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+      <emItem  blockID="i476" id="mbroctone@facebook.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i3" id="langpack-vi-VN@firefox.mozilla.org">
                         <versionRange  minVersion="2.0" maxVersion="2.0">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i326" id="/^((support2_en@adobe14\.com)|(XN4Xgjw7n4@yUWgc\.com)|(C7yFVpIP@WeolS3acxgS\.com)|(Kbeu4h0z@yNb7QAz7jrYKiiTQ3\.com)|(aWQzX@a6z4gWdPu8FF\.com)|(CBSoqAJLYpCbjTP90@JoV0VMywCjsm75Y0toAd\.com)|(zZ2jWZ1H22Jb5NdELHS@o0jQVWZkY1gx1\.com))$/">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i358" id="lfind@nijadsoft.net">
-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+      <emItem  blockID="i470" id="extension@FastFreeConverter.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i162" id="{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i354" id="{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
@@ -615,18 +659,22 @@
                     </versionRange>
                   </emItem>
       <emItem  blockID="i61" id="youtube@youtube3.com">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                                 <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i91" id="crossriderapp4926@crossrider.com">
-                        <versionRange  minVersion="0" maxVersion="0.81.43" severity="1">
+      <emItem  blockID="i196" id="info@wxdownloadmanager.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
+      <emItem  blockID="i469" id="OKitSpace@OKitSpace.es">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i167" id="{b64982b1-d112-42b5-b1e4-d3867c4533f8}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i101" id="{3a12052a-66ef-49db-8c39-e5b0bd5c83fa}">
                         <versionRange  minVersion="0" maxVersion="*">
@@ -659,16 +707,20 @@
       <emItem  blockID="i356" id="{341f4dac-1966-47ff-aacf-0ce175f1498a}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i70" id="psid-vhvxQHMZBOzUZA@jetpack">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                   </emItem>
+      <emItem  blockID="i473" id="{81b13b5d-fba1-49fd-9a6b-189483ac548a}">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i437" id="{4933189D-C7F7-4C6E-834B-A29F087BFD23}">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i165" id="{EEF73632-A085-4fd3-A778-ECD82C8CB297}">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
@@ -749,26 +801,26 @@
       <emItem  blockID="i163" id="info@allpremiumplay.info">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
       <emItem  blockID="i455" id="7d51fb17-b199-4d8f-894e-decaff4fc36a@a298838b-7f50-4c7c-9277-df6abbd42a0c.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i21" id="support@update-firefox.com">
-                        </emItem>
+      <emItem  blockID="i374" id="update@firefox.com">
+                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                    </versionRange>
+                  </emItem>
       <emItem  blockID="i322" id="jid0-Y6TVIzs0r7r4xkOogmJPNAGFGBw@jetpack">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                   </emItem>
-      <emItem  blockID="i374" id="update@firefox.com">
-                        <versionRange  minVersion="0" maxVersion="*" severity="3">
-                    </versionRange>
-                  </emItem>
+      <emItem  blockID="i21" id="support@update-firefox.com">
+                        </emItem>
     </emItems>
 
   <pluginItems>
       <pluginItem  blockID="p26">
       <match name="name" exp="^Yahoo Application State Plugin$" />      <match name="description" exp="^Yahoo Application State Plugin$" />      <match name="filename" exp="npYState.dll" />                                    <versionRange >
                                 <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
                               <versionRange  minVersion="3.0a1" maxVersion="3.*" />
                           </targetApplication>
--- a/browser/components/sessionstore/test/browser_625016.js
+++ b/browser/components/sessionstore/test/browser_625016.js
@@ -40,16 +40,22 @@ function setup() {
 }
 
 function onSaveState() {
   // Double check that we have no closed windows
   is(ss.getClosedWindowCount(), 0, "no closed windows on first save");
 
   Services.obs.addObserver(observe1, "sessionstore-state-write", false);
 
+  try {
+    ss.getWindowValue(newWin, "foobar");
+  } catch (e) {
+    ok(false, "window is untracked!");
+  }
+
   // Now close the new window, which should trigger another save event
   newWin.close();
 }
 
 function observe1(aSubject, aTopic, aData) {
   info("observe1: " + aTopic);
   switch (aTopic) {
     case "sessionstore-state-write":
--- a/browser/devtools/inspector/breadcrumbs.js
+++ b/browser/devtools/inspector/breadcrumbs.js
@@ -369,26 +369,16 @@ HTMLBreadcrumbs.prototype = {
   empty: function BC_empty()
   {
     while (this.container.hasChildNodes()) {
       this.container.removeChild(this.container.firstChild);
     }
   },
 
   /**
-   * Re-init the cache and remove all the buttons.
-   */
-  invalidateHierarchy: function BC_invalidateHierarchy()
-  {
-    this.inspector.hideNodeMenu();
-    this.nodeHierarchy = [];
-    this.empty();
-  },
-
-  /**
    * Set which button represent the selected node.
    *
    * @param aIdx Index of the displayed-button to select
    */
   setCursor: function BC_setCursor(aIdx)
   {
     // Unselect the previously selected button
     if (this.currentIndex > -1 && this.currentIndex < this.nodeHierarchy.length) {
@@ -610,17 +600,19 @@ HTMLBreadcrumbs.prototype = {
     }
   },
 
   /**
    * Update the breadcrumbs display when a new node is selected.
    */
   update: function BC_update(reason)
   {
-    this.inspector.hideNodeMenu();
+    if (reason !== "markupmutation") {
+      this.inspector.hideNodeMenu();
+    }
 
     let cmdDispatcher = this.chromeDoc.commandDispatcher;
     this.hadFocus = (cmdDispatcher.focusedElement &&
                      cmdDispatcher.focusedElement.parentNode == this.container);
 
     if (!this.selection.isConnected()) {
       this.cutAfter(-1); // remove all the crumbs
       return;
--- a/browser/devtools/markupview/markup-view.js
+++ b/browser/devtools/markupview/markup-view.js
@@ -982,17 +982,18 @@ MarkupView.prototype = {
     this.tooltip.destroy();
     delete this.tooltip;
   },
 
   /**
    * Initialize the preview panel.
    */
   _initPreview: function() {
-    if (!Services.prefs.getBoolPref("devtools.inspector.markupPreview")) {
+    this._previewEnabled = Services.prefs.getBoolPref("devtools.inspector.markupPreview");
+    if (!this._previewEnabled) {
       return;
     }
 
     this._previewBar = this.doc.querySelector("#previewbar");
     this._preview = this.doc.querySelector("#preview");
     this._viewbox = this.doc.querySelector("#viewbox");
 
     this._previewBar.classList.remove("disabled");
@@ -1012,16 +1013,19 @@ MarkupView.prototype = {
       this._boundUpdatePreview, true);
     this._updatePreview();
   },
 
   /**
    * Move the preview viewbox.
    */
   _updatePreview: function() {
+    if (!this._previewEnabled) {
+      return;
+    }
     let win = this._frame.contentWindow;
 
     if (win.scrollMaxY == 0) {
       this._previewBar.classList.add("disabled");
       return;
     }
 
     this._previewBar.classList.remove("disabled");
@@ -1047,16 +1051,19 @@ MarkupView.prototype = {
     this._viewbox.setAttribute("style", "height:" + height +
       ";transform: translateY(" + top + ")");
   },
 
   /**
    * Hide the preview while resizing, to avoid slowness.
    */
   _resizePreview: function() {
+    if (!this._previewEnabled) {
+      return;
+    }
     let win = this._frame.contentWindow;
     this._previewBar.classList.add("hide");
     win.clearTimeout(this._resizePreviewTimeout);
 
     win.setTimeout(function() {
       this._updatePreview();
       this._previewBar.classList.remove("hide");
     }.bind(this), 1000);
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js
@@ -40,16 +40,18 @@ function ifWebGLSupported() {
   let globalCreated = observe("content-document-global-created");
   reload(target);
 
   yield globalDestroyed;
   let programs = yield front.getPrograms();
   is(programs.length, 0,
     "There should be no cached program actors yet.");
 
+  yield once(front, "program-linked");
+  yield once(front, "program-linked");
   yield globalCreated;
   let programs = yield front.getPrograms();
   is(programs.length, 2,
     "There should be 2 cached program actors now.");
 
   yield checkHighlightingInTheSecondPage(programs[0], programs[1]);
   ok(true, "The cached programs behave correctly after navigating forward and reloading.");
 
--- a/browser/locales/en-US/searchplugins/bingmetrofx.xml
+++ b/browser/locales/en-US/searchplugins/bingmetrofx.xml
@@ -2,16 +2,17 @@
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
     <ShortName>Bing</ShortName>
     <Description>Bing. Search by Microsoft.</Description>
     <InputEncoding>UTF-8</InputEncoding>
     <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAD/AAAAJgAAACAgAAAAAAAA+AMAACUBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAADGSURBVDjLY/i/TPQ/JZiBOgZsd/z/f08AhCbLgJdH/4MBiKaaAWtUIK4i4DJUA95d/v//xsz//788+o8VPN4GMRCnATAAMuByF8IFx3NR1dxbjscAkCTI+dicDDIIBkAuxWoALs0wDLIABH5+QDIA5DeY0wmFPMhrMAA34Gw1QhAtkFAwyHWwAIZahkiJoBiAOQ1kILpmkMHIaqBRy4BiOihgYACkCBQ2IIwcrSBDkNIFZl7YaARxAShcYAaAMCxaaZOZKMAAOzkOfhyf540AAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAO/SURBVFjDxZRJTxRBFMfrJiC7enKJ28nEGL+AXo2J+gFcrkr0C4gLKjCAoILKIgKyjSZG40FFMephHERcLm4XVzTRi7I4DHRPL8/3qqq7q6d7ZIgRO/mFzlT1+/3fq6ZZ8lzB9smq3JGxQwtgPhmvyHk1XpO3kZF8/EgOjB2eX8hJbkY3/4WjOTBRkQuMbuaVCsHEsVwOoxTzhpROHs8TnMjDAMe8hX/KcQFJOZVIFQaYPEE//mMqBb9QyKlGInmQiFCASpkG0WPVoF7m5xio63OmSvCreqEgIkjUILVEPjCeRhIWQF2fCwmCZI5QSqeIunyYOilg7iZEf5QWYDQG6nrW1OQLaj08aQFM1RdAskHApmhRkopHAgHU9ayp84RJop6Q0lMFME2cRs4UYoA674HQAHIt2bgUtNt7+R76PYzUUAS0gb2QbF8npA35rjTpSKV4urEQZhopQL0YCUEFfAG+xEC7s4//netFz+iDZZA8XSiEUsrFTUUwc1bAnHRE6nEk6+K012U4AtbX8JD25Cjo17e6wplzRaAR55FmCnAG5RIqlOnihQb3wXTLMnf/tAp11roc9HtlfG/6lbpf5ko5LcWgI2xGngVhPKkJ7/hNP2hYXN3LaZLjVEZKaO0rwHwbDdQx7uzkUr2VKIFUWwkGOItFJMZIMID54SaoewRFvpH6xup2WQzWx1v+YtoE6G1CnLqAtGMA9yHEfBoMoPesB3WPdr5Y0OyhN4txujgdRjcEG7q3i4uNi6UcphYyn9YGHlDXOS0enkzSVsw71J0OkfTLelEHRkepoBMDqMnN+MHgBMJEUpZSueBJeYe8y5AAT8rBRDGniwLIxDx12MiGyr11pTNV5iLHysEOreHyYL2rG1G8CMxLApZe0PqU9uLoE2Bc2+TvTOlQFTpQd9aNzfxZ37/y6G0utYhuAfN1QHSvBPvHy0AI6kYIJYqQztJwxkrykfKg/OcrsC6vdsVWj4D5Cjn0rgL7Wzz4QUiMgv26FayBbWD2r+JnyOnHwgPbwX7TyvcEPmLf42BdWe1KrZ7FYPUKmJM+DCu2P7Rg1lfiC9jxA5641xPbRB8FwBeCMDNB5/VgN9jvLmcXhqTvr4D9cI9P6Ir7/DDnbcyEe2YOeI72XRz3YDo7cMxrgl2GSDn9AmZiUZWAsOcPhHWYSahIVRh/IWYjrKvZZBmlSwTRJQAISxdk7CobWYYuXXHUA5wARlfJkD1XyawyD1Bk6Rhdpc+Z1lG4Fm+G/1bkEhX8SczlnaXP8Juz5TddEmZvDz4eOQAAAABJRU5ErkJggg==</Image>
+    <Image width="74" height="74">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABKCAIAAACTslUmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDOUM2QjI5MUY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDOUM2QjI5MkY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM5QzZCMjhGRjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM5QzZCMjkwRjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2BWCTAWgAAA21JREFUeNrsm11IU2EYx3d2vvblttK0iSusFpFtIlkYKajYRTeRXfiBdBXVhVYXIQVdRxHRRUQ3EWSRQVJa3XRRVpSGReVXgVo5ZlNjqftw29nOV29eiOdk6j5yR3lexnjZzvOc97f3fZ%2Fn%2FxzeYb8uO1Srt6lVq7oBHuABHuABHuABHuABHuABHuABHuABHuABHuABHuABHuClrhFJ9JV%2Bume2H%2F3%2BOtDaALMHeIAHoWW5GkYb1Lp0jNKjvhidFoITYjS4ovEwMqeAsO4iLHZyvR3TmmVfi4yP8wxx7o8o3nJjvSsGD5Fo8qvovAO42brQZRoTaS1EL23RMX5yOPL5MdP7ADErFw9T45qCWt3eeoxOi8kQX5urKzml3X0k3HUj%2FOGOSuATGkYSjw7MTesLNMHn5n1ukfGqcAqjjbg5R23InPdKtFADTxqFwPgKCC1orJH%2BR9Gv7UJoUh6%2B07Ko3BLacYjIypMMzuIw1Tb57x%2FlvS7lzh4%2F5Qq2X2SdHYt6oGzl%2BtJGtTFbYu51%2BZoPi2GvEvMe63rna65bCtsfpTrU7r1dxf74INmN5g2GinNKTOu8ZzDQdkJk%2FEs3ESOBQNtJFD8ls7p1n2zdKgJv%2Btl5kWVitRIj08HnF%2BRawF6pLDw0A9xod7xLukvwj879hLTuVBieZzChSCs1V6dZUo3Hs1LfZILSVJouuRTjybITYdmBxEu8lQxOpG%2BROh9JMR7rfCtxbcikbBXxuaK37Zcpb9bZmWI8prdFJhH15WeQIonVD0p0KLnLlj3T9zDVi3PSyXy6J%2FGuzzDVNOEZthhUYtZ2Y%2FVN2dQhbY2UauojZ%2BjNVW6sT3IDo8VUd1e75zhGahaJJZReV9xgrLklU9hI94Q6r6dec87WeMbKa6hy%2FTtZRwaest9ecmP9Qnhq7hZFQYjaXIqkCUbq5OnB3e1vrUe2SsGbKc41%2BrKztP0g6s6vS9gQqhswQoOqQYyg%2F6VeUFEbenFJ5CKKqPfku8ji0Jc1ovd4cvrPL6FXV9iR94n%2B0P%2F5JDxGbSqm86upjUUqfPEsL%2FJRdriD6WmZSQNiEm6%2FPAf9MY2RtBYS2QXEOhsq59TaNZgmbWb9BYTQhOAf5zwDSKCiKJLcp2YY%2FI8B8AAP8AAP8AAP8AAP8AAP8AAP8ABPYe23AAMAXYk%2FgLbQd%2FsAAAAASUVORK5CYII%3D</Image>
     <Url type="application/x-suggestions+json" template="http://api.bing.com/osjson.aspx">
         <Param name="query" value="{searchTerms}"/>
         <Param name="form" value="MOZW"/>
     </Url>
     <Url type="text/html" method="GET" template="http://www.bing.com/search">
         <Param name="q" value="{searchTerms}"/>
         <MozParam name="pc" condition="pref" pref="ms-pc"/>
         <Param name="form" value="MOZW"/>
--- a/browser/locales/en-US/searchplugins/googlemetrofx.xml
+++ b/browser/locales/en-US/searchplugins/googlemetrofx.xml
@@ -2,16 +2,17 @@
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
 <ShortName>Google</ShortName>
 <Description>Google Search</Description>
 <InputEncoding>UTF-8</InputEncoding>
 <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB9AQAAJgAAACAgAAAAAAAA8gIAAKMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFESURBVDjLpZNJSwNBEIXnt4lE4kHxovgT9BDwJHqPy0HEEOJBiAuCRg+KUdC4QS4KrpC4gCBGE3NQ48JsnZ6eZ3UOM6gjaePhQU93v6+qq2q0pqgeJj2S8EdJT1hr0OxBtKCD5iEd8QxDYpvhvOBAuMDKURX9C9aPu4GA1GEVkzvMg10UBfYveWAWgYAP00V01fa+R9M2bA51wJvhIn3qR+ybt3D3JNQBE5sMjCIOLFpoHzOwdsLRO22qA6R6kiZiWwxUvy/PUQZIhYZ1vFM9cvcOOsYNdcBgysISdSJBnZjJMlR0Fw8vAp0xoz5gao/h+NZBy4i/10XGwrPA+hmvDyhVRG2Avu/LwcrkFADZa16L1h330w1RNgc3DiJzCpPYRm1bpveXX11clQR28xwblHpk1vq1iP/5mcoS0CoXDZiL0vsJ+dzfl+3T/VYAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAK5SURBVFjDxVfrSxRRFJ9/Jta/oyWjF5XQm6D6EkHRgygIIgjUTcueVgqVWSRRkppEUQYWWB8ye1iGWilWlo/Ude489s7M6Zw7D9dlt53dmd29cFiWvXvO77x+51xpaaUsoSxBaUWZQ4ECy5xji2xKZDyCMlMEw6lCNiOSgwZKJK1SkcKeSealfP64t0mBjl4Ow39MkDUL0p2RSROOtqhZdeUEYM1pBl39XCg/fEeFtWcY7G9W4csvUxjlBkCsQ4Nt9QyWVfvT6RsAKXw3aoDGATZeYIt+W1kjw7cJG0RctWDTRebbKd8A6h5pwsDb70ba3w/eUr3wt/cmwgfw6Yft4TNMQaY7o1P2ncm4FT4ANQH/jQBJ2xv7kqIXEADDql8eS3+n8bku7oxNm+EDIM/dU92upb3T/NJGeaNbDx/AsbsLRUY5Xn92caWXY5d8RV6gWllxSg4fAEnTC90DQW13BLlgXR2D3dcUeDVkwOthA1bXspxILWcm3HdThcfvufB26LcJpkOEAz9NKI/lzqpSEC7feol5EWnpSeSlIxCALUkApmULdjUqxQVAQnl3D/X/yQda4QBEq2TYc12By091MQ17Bg3R88nHKlQbVmHvj89awNBLYrwT9zXY2aBAxTkGFdiSxP/Jp6FLDw+AS7GfsdJTJ2EqSO5khD43nGfBARy/ZxOQgZHe7GPM1jzUvChUtmnBAXQPcKGMJp3fdFGq6NByEhiAO4b/YptFfQJwNyQ/bZkVQGcf90Ja25ndIyrKBOa/f8wIpwi3X1G8UcxNu7ozUS7tiH0jBswwS3RIaF1w6LYKU/ML2+8sGnjygQswtKrVIy/Qd9qQP6LnO64q4fPAKpxyZIymHo1jWk6p1ag2BsdNwQMHcC+M5kHFJX+YlPxpVlbCx2mZ5DzPI04k4kUwHHdskU3pH76iftG8yWlkAAAAAElFTkSuQmCC</Image>
+<Image width="74" height="74">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABKCAIAAACTslUmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBN0E5NEYwRUYzMDQxMUUyQjUzMEMyNEUyNjY3NEQyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBN0E5NEYwRkYzMDQxMUUyQjUzMEMyNEUyNjY3NEQyNyI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE3QTk0RjBDRjMwNDExRTJCNTMwQzI0RTI2Njc0RDI3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE3QTk0RjBERjMwNDExRTJCNTMwQzI0RTI2Njc0RDI3Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2BTc4b7gAAA3xJREFUeNrs2WtIU1EcAPBz7r17XKdrEVNpc4qGsqz5IFOhUMikB2JIEvQUoi%2BRHzT6sIiiIrOIiIK%2B9PhSSZAVEfUlUb9VYhphqDOdZpqv%2BWxzj3t2OjclyUcQeefuOOfDOGyw7Xf%2F5%2FzP%2F38v3FQ6AUJ3MCCkB%2BVRHuVRHuVRHuVRHuVRHuVRHuVRHuVRnix5eLn%2FGA4qHlxuHgwSHpZyceEV58Fg3ntcYH4m0cTszFClJTAxaxgt%2F8cVsfWja888zTZBimsnOS9MBcuL1WYjc%2BWp5%2B4rZIpmy4tUqXGsTwBnHk232AXHOEZ%2BeR4MLAMqj%2FH5aYrS265PHYLTjVu7hRO3nG19SMEBa7EaISCdTXLe9s2K7ESuqVMYnZxLEh4fqHziIRNdGDyQp5Txsb4nS%2Fz3w5PzE%2BDnLqFjAJFJnkXOPLOBJa967SIZ4m2bmEu0vPyLMkssy7Hz3xwYE0M6OOGXMa%2FZLoYogodbUxTzPuKVYkhfNPhkzHtY652ZlBWqIzRzS5RjwLYU7kMXqq7zSpu612Zapfv2%2FhG%2FC%2BGsRI4EMNPM2YfwDzc2RDKn9vFOD7DemfZIGzwAA%2FDwOSmWK8xWJJsYPwZmI8tCsmjR8ZtOAYVEUdbeI1ztETehXgdfX4ggk%2Fc2IQC2QLezv4%2B%2FomxlTBQTaryRcVzbIoYxUgsfnNRsWZBO5bc4IQTxBsYSz5n0bJQOxuln86dGDa8f5W%2B8hFVvvHLl5aYrSgvUqzXg%2BTtvQ7vQO4QmXZis0ZIdykM5KgItK1B7faC6XiqhhJmztEh1OFfVZEfWe67RBWUnkVcc5EnfQDqj3eemxqawnPZeZjJHbCQ9nr6%2FiI2M%2Bibf2appMiFCyzpOZqllV4aYNuzDyDGxZFhqGn1fHXimLZQZL0rH%2FOromL%2FfThidEkvqjm9IZjxbv3%2BmFcrLWDL7a8PheiPb%2BEXoHfTLjFdV63GJHTk4v5%2Ffm6tc2BCRg%2BHiEX5yGl967JZlzbkhgbtcwkevEpenYwrXtQid3xEpqdVKmGRg81O5tn5UUeXuG%2FbLkkcGkeSmczkbFclGVhcOOQjGXXhgzP%2BxW6hpRq1dgqT3gAPUMfxflQpXdu%2FhIL46wX4THq44bzaGcJlNQfYADC%2FrhgueB2AgtPce5VEe5VEe5VEe5VEe5VEe5VEe5VEe5VHeP4yfAgwAufYl8QJfZAAAAAAASUVORK5CYII%3D</Image>
 <Url type="application/x-suggestions+json" method="GET" template="https://www.google.com/complete/search?client=metrofirefox&amp;q={searchTerms}"/>
 <Url type="text/html" method="GET" template="https://www.google.com/search">
   <Param name="q" value="{searchTerms}"/>
   <Param name="ie" value="utf-8"/>
   <Param name="oe" value="utf-8"/>
   <Param name="client" value="metrofirefox"/>
 </Url>
 <SearchForm>https://www.google.com/</SearchForm>
--- a/browser/locales/en-US/searchplugins/metrolist.txt
+++ b/browser/locales/en-US/searchplugins/metrolist.txt
@@ -1,4 +1,4 @@
 bingmetrofx
 googlemetrofx
-wikipedia
-yahoo
+wikipediametrofx
+yahoometrofx
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/searchplugins/wikipediametrofx.xml
@@ -0,0 +1,20 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikipedia (en)</ShortName>
+<Description>Wikipedia, the free encyclopedia</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAA4AQAAJgAAACAgAAAAAAAAJAMAAGQBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAEFSURBVDjLxZPRDYJAEESJoQjpgBoM/9IBtoAl4KcUQQlSAjYgJWAH0gPmyNtkzEEuxkQTPzawc3Ozc3MQTc/JfVPR/wW6a+eKQ+Hyfe54B2wvrfXVqXLDfTCMd3j0VHksrTcH9bl2aZq+BCgEwCCPj9E4TdPYGj0C9CYAKdkmBrIIxiIYbvpbb2sSl8AiA+ywAbJE5YLpCImLU/WRDyIAWRgu4k1s4v50ODru4haYSCk4ntkuM0wcMAINXiPKTJQ9CfgB40phBr8DyFjGKkKEhYhCY4iCDgpAYAM2EZBlhJnsZxQUYBNkSkfBvjDd0ttPeR0mxREQ+OhfYOJ6EmL+l/qzn2kGli9cAF3BOfkAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAIKSURBVFjD7ZdBSgNRDIYLguAB7FLwAkXwBl0JgiDYjQcY8ARduBJKu3I5C0EoWDxAT9AL9AK9QBeCIHQlCM/3DZOSmeZNZ2r1bQyEGV7yXv7kJZlJq6XIOXfs+crzwPPTnvnR863n05ZFufDD/T595Q4eauM37u/pWYwfeX53cegcABcuHg0AkEQE8AKAu4gAXv8BrAEMh0PXbrddt9t1vV4v406nk62laeqm02n2LjKYIuK5WCyyfeiLDF32yLn6TJ5mBFarlev3+9nBMMqsabkYhmezWcEd2ctTE/tYBwhgt14BhtmAV2VaLpdrAHioCW+VdwWy9IMAUBQjJcQFTwGqvcTD+Xy+oc8askZJyAYrnKEokCeWLpQkSSZvBIANYgSDVVEQQJaeyHQu1QIgiQNb6AmrTtaQ9+RFSLa1D4iXgfsrVITloeSFFZlaAEjAUMaXo2DJWQtVRe1OKF5aJUkf0NdglXO5VzQGoI2USwwD3LEl590CtdO3QBoT5WSFV+Q63Oha17ITgMlkslGSGBWPdeNiDR2SL1B6zQFINmOAkFOW5eTSURCdvX6OdUlapaWjsKX0dgOg26/VWHSUKhrPz35ISKwq76R9Wx+kKgC1f0o5mISsypUG3kPj2L/lDzKYvEUwzoh2JtPRdQQAo1jD6afne88H1oTMeH6ZK+x7PB/lQ/CJtvkNEgDh1dr/bVYAAAAASUVORK5CYII=</Image>
+<Image width="74" height="74">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABKCAIAAACTslUmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFOUFERjZERUY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFOUFERjZERkY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU5QURGNkRDRjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU5QURGNkRERjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2B0WY7JQAAAuJJREFUeNrs2j1IamEYB3BTTLAQ%2BqKhgkgJbSilhqAGlyYzUiRqKSmCcKwlnFqkIXERggSjkGgMpxoikNAlcwpSCJIoKroJFZWCt3P%2FdOAgd%2Fa9F%2BP%2FDHJ8zgf8fN7zPs9gnSRJqp8batWPDvLII4888sgjjzzyyCOPPPLII4888sgjjzzyyCOPvP%2FK29zcHBkZsdlsQ0NDDofj8PBQTprN5sHBwdHR0YODg3K5vLGxgWt6e3tdLtev71hYWOjv7%2B%2Fr6xseHsb1VfZJVYrX19ejoyOdTodn7u%2FvF4tFJF9eXpaXl5Fxu90fHx%2FIvL29gWGxWG5ubn5%2FR6FQALirqyubzeKsVNVQVfdxXq8XmJWVla%2BvLznz%2BPjY3d3d1NR0dnaGr%2Bl0uqOj4%2BTkRLnl%2Bvq6s7Nze3tbEhBV5iUSifr6egCurq6UZCgUgnlpaQnHs7OzY2NjlbcEg0H4Ufwa4CEmJiaACQQCSub%2B%2Fh6rsbGxcXd312QyJZNJ5RRW78DAwPr6uiQmqs%2FDG4gCGo3Gp6cnJRkOh2HW6%2FV%2Bv19Zt4h4PN7T04P1WTO89%2Fd3u90OTCQSUZKgooBIHh8fV17sdDp9Pp8kLFQiHhqLxSCxWq2VO6HH45F3HSWTyWSwqWCzqTEeuhlaGTBwyhkY5N2%2Fra3t4uJCTs7Pz09OTkoiQ8jU0tLSMjMzg4O9vb3Pz08cRKPRqamp1dVVrNKdnR1kbm9vT09P5%2BbmxI4tgn62h4cH1Eqj0aRSqVwuB3A%2Bn0cPbG5ubm1tfX5%2B3trawnxTKpWEVk%2BztrYm4ldDG8A4gjaI6uEToxk6fkNDAzZJFA0qtAeUDsKarB7i8vKyvb1dq9UaDIbz83M5CRW%2BqtVqDKLwS4JDJfTpi4uLyrwiB5oemgGSGFYk8SGWh6KNj4%2Fj3atMYuCcnp6%2Bu7v7B7w6%2FmWOPPLII4888sgjjzzyyCOPPPLII4888sgjjzzyyCPv7%2FgjwAC5b9U654qBRwAAAABJRU5ErkJggg%3D%3D</Image>
+<Url type="application/x-suggestions+json" method="GET" template="http://en.wikipedia.org/w/api.php">
+  <Param name="action" value="opensearch"/>
+  <Param name="search" value="{searchTerms}"/>
+</Url>
+<Url type="text/html" method="GET" template="http://en.wikipedia.org/wiki/Special:Search">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<SearchForm>http://en.wikipedia.org/wiki/Special:Search</SearchForm>
+</SearchPlugin>
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/searchplugins/yahoometrofx.xml
@@ -0,0 +1,19 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Yahoo</ShortName>
+<Description>Yahoo Search</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAANAQAAJgAAACAgAAAAAAAA/AMAADMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAADUSURBVDjLY2AYPmBPzZn/65L2/W8SmoeClwXt+g+SQ1ZbxTTrPwzDNaNrRMYghciGoBgA03xv37P/MABiT9Jb9x9ZIbIhMP48p03/GUBOhNkE8gIIgBSCFPz++QeMX11697+MqQtsKLIBYAPRnXtu3i2wJpDBIBqkCKQ5iykPTIMMgLkOqwEgDLIR5hKQRhiGBRrI6fAARPYCDIM0ggCyZhCGeQHkVRibAeZfGAYFILLfYa5AjwmMNIBuG7rT0aMRHAPYElKf0jK4RlwJCaQG7oWhDwAW40nUCGVbdgAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAA8NJREFUWMPtVmtsDFEU3j+IR7s7d4SISEMi6pUQ/CIRjyAVhBDxChJtvRptbXdn1iMtjbfW7s7caQmNRxVRVLWVVCtCEQklS6mttI3Eo+GPCvHKce5sdzqdndn10489ycnMnLn33O9+59xzrs0Wl7jE5X+X7Q4pyc3R+QJPRZHQPA+Rc5mKnJwuEt8Yp+1w/1g+xAR/sofQXzj/ucjTUoGXdwicvEKwKzOtJzmUNTih1sMrEE1ForQzYC5eHm3lS3AoE03nE9oWOZijGxHl+1gLW4A5n2Ur6Gv06UqgoywAnOi5a0LLQ44oCKhuImvKvpk9Jgiefs1J9I7ssSk7HWEC9qmbKHO1QYjmUrcTBXKIBE7ih+3Ep6qbger6J8Zm4rdzgDIo7Ntp9w83GVPksh1MCCEk8nJmxCfkJ5VAU9Ub+Nz2BdofvYNgfTs01bTCi+pWeFAcUEFkcV7I5I5pyr4ZSEHHEDLxKAwgiy8YGsmUvCREOyelsOwMU7978HE4tagCrm67A3opT70NxyZdhG1cIRRNvwJV7ga4nF4H5RvroNrTALV7HsLR8aXqJsKLuDl5msawAUCGzdeni3rlSk9qqLqrVMdBKBhbpgEIXAui7QCkoZ6YXQHPLge1f50d3yBwvQUOJZ/FUEk6X7LXFIA++/GjySyOLPE2OQ5BSUqlttBN4T6sTdwL6+z7oFpoUG2VOXchG0OQ4Tiq5okhIZ+YAUC7pM/85+bZHErENPt+qMy6p4E4vaAGGsua1XcWCgbSieNE8xMRNAMg8NLibgZ4+soqm1lSZWNybXUcgUBFiwbi+5cfcGD4GdiMdhcyJVqeBvrMDACrrt0M8LTS+kwruIAE6Rh374RLGoALq2phvT1f3bkQ/TgWGQGg7a2h5NKFuNBLKycsDBswDIW6hCyZdwNWJ+5R2YlaE+zSrAgGCK2OrPs8XWtBIewaeBz2J5+GKqE7D+56G6E45SocHn3OsjqiPaBfgxUm1tSMVTJqKBjFvikX4WPTJ+ho/gzNt9rhNRamV7Vt0Hb/HZSurFFPixmAbCIP03qB3T/ZwynjevQHrIJptrRepr1ArzsHFkPekJNqrMNlOSdK4iHFfzCs0w2bC+obFmvHrPRj0ZoTyQShmWah0Dcny8ZE6A0xQeL1/pbZcnsbfBX+00UELxwuHPwQEf+M0Xha8YJykl1OzPxkEF8iMlCPx72zqzou/ScArFZ7HPIMVk5x4mN00oG0fwgp/Yi2Fnyewf+pmf0Kh0TfjH+qh6NbRI76jLkQl7jE5S+qIPrIdKZBVAAAAABJRU5ErkJggg==</Image>
+<Image width="74" height="74">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABKCAIAAACTslUmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDOUM2QjI5NUY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDOUM2QjI5NkY0MkExMUUyQjUzMEMyNEUyNjY3NEQyNyI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM5QzZCMjkzRjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM5QzZCMjk0RjQyQTExRTJCNTMwQzI0RTI2Njc0RDI3Ii8%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8%2BaVyByAAABG1JREFUeNrsmmtMU2cYgFtKS%2B%2F0gqVQadVUJIgUjCaMLXMbg%2BEtKgiCZMmybFli%2FEHiH7c%2F27JLMpct%2FFiyiyYTIxiic8FFjMapW4MDWWSU4gUUSnX0tPTGSq%2FQdu8oq66nHkhT0868X86P97u8b8%2BT73sv30npR4rbaM9uy6A90w3xEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxEA%2FxSC3zqVpn8Vjql9eoKpWywhyOhMPJZodCYZ%2FT57a6iRGLoXdyXGsIzYfi6j5%2FsKKottBpdDomnQ7jDAgTvZPpggdgFe9sLm%2FWsLjM2CkuU5gvyCuVlzeXum2e%2FqMDg526UDAWksFkSFaL4Yl0HUbnsa3taYGXWyzb1bY9WyFcciVPyn3l8JbiHUXdref%2FMrkoVpqGiLTwvZWbFE3te5fDFm3yktyWjkaxUkSFN5wGeNkrhXVf7SQfyCUbP5df%2F80uCkWTzpz60PLaB1VZgqw579zZA%2Bf87sA%2FLpSZEVwIHlk8Vvl%2BTWG1%2Bkm6YpUIwsnVI1ry1Lw%2FaLkznWI8RVme6jklCEw2s%2BbDKtt9%2B2DnkOG6EUaq3t2iadzAYDFAHv9lYvqeLarFFrJ5OVwIsCCXNWn6vhvwOn0xloEtOBdMMV7R9nWLEp0GjgRPwSbFyeYu%2B4Tjxvc3S%2BrWR%2FBc5lndab3z4QwtvBBdVvBebK1cfJssxtpX1bozetLJJBJ7pWT6Xr5GHjMCB3XnF9uAykW4tG29kUHYxrcvvKGqUEJ62H%2By4cC1t0p2Fz8yUionW57SmVKPJ8gVkAdl63JeOvQCCIOndFP%2FBvern2shs7d07FOU58fGGDmfbIQYNqcejyvmxB3f2FJWsFkRDoUvvn85GAj%2B%2FMk1Y5%2Bx6fhevowXx4go1ojH7nU%2BmEk9HgTM%2BBN02taPa5jsTOuYrb2%2Bc7L%2FQcOxOo6IvUwjpkRPZpLxKMoOyIfgciDYxu21H1VzJZzlGyH0lrTA%2B%2FMPE3XijgiigmyKZVOk4mtqKD12b%2FTSGMUsnR6tlZ%2F4o1BY37tyPyJ7HV7I5uCxpkTjSpLznuE3I6E3QwEZM%2B53%2Bd1Wj%2FnWYtlhvPFQKBfA%2FUiYFxtpR7pvQ1aMyAPHb%2F5%2BYpAv44N6wq%2FEqF5Rm0RCYpjYsGd9BuM%2F%2B9P15tlfv%2BydHrVGuncujA6d1kOxtqpS%2BfgyuBx1t%2FZEQgs9gw4Nti4wG0ij66zlrrXnvUs7PqulM%2BjRwYZvd4fDYUjxFIqA8ePBnzx2T6Sbo5a%2B3tUElQ3cZc8fvpgwZPLve7A5%2FtnAtk9rouGRxWdRqwDDuUM9ltuPimaBnA%2B1jnSNRKISz3vn0%2Btby4TW0F7fMfzDCPkOHrtpnrm%2BowMnGk89zrZQAC2GWShuljRCFc%2Be6p%2BNBXJBYY16daVSqpZGAwl4FJy66btWuDqMXRn3zfjiKio25kFRDh54%2Fev%2BNMXDD4GIh3iIh3iIh3iIh3iIh3iIh3iIh3iIh3iI939pfwswANago8DqAlG2AAAAAElFTkSuQmCC</Image>
+<Url type="application/x-suggestions+json" method="GET"
+     template="http://ff.search.yahoo.com/gossip?output=fxjson&amp;command={searchTerms}" />
+<Url type="text/html" method="GET" template="http://search.yahoo.com/search">
+  <Param name="p" value="{searchTerms}"/>
+  <Param name="ei" value="UTF-8"/>
+  <MozParam name="fr" condition="pref" pref="yahoo-fr" />
+</Url>
+<SearchForm>http://search.yahoo.com/</SearchForm>
+</SearchPlugin>
--- a/browser/metro/base/content/ContentAreaObserver.js
+++ b/browser/metro/base/content/ContentAreaObserver.js
@@ -127,17 +127,17 @@ var ContentAreaObserver = {
     this.styles["window-width"].width = newWidth + "px";
     this.styles["window-width"].maxWidth = newWidth + "px";
     this.styles["window-height"].height = newHeight + "px";
     this.styles["window-height"].maxHeight = newHeight + "px";
 
     this._updateViewState();
 
     this.updateContentArea(newWidth, this._getContentHeightForWindow(newHeight));
-    this._disatchBrowserEvent("SizeChanged");
+    this._dispatchBrowserEvent("SizeChanged");
   },
 
   updateContentArea: function cao_updateContentArea (width, height) {
     let oldHeight = parseInt(this.styles["content-height"].height);
     let oldWidth = parseInt(this.styles["content-width"].width);
 
     let newWidth = width || this.width;
     let newHeight = height || this.contentHeight;
@@ -157,17 +157,17 @@ var ContentAreaObserver = {
       return;
 
     this.styles["content-height"].height = newHeight + "px";
     this.styles["content-height"].maxHeight = newHeight + "px";
     this.styles["content-width"].width = newWidth + "px";
     this.styles["content-width"].maxWidth = newWidth + "px";
 
     this.updateViewableArea(newWidth, this._getViewableHeightForContent(newHeight));
-    this._disatchBrowserEvent("ContentSizeChanged");
+    this._dispatchBrowserEvent("ContentSizeChanged");
   },
 
   updateViewableArea: function cao_updateViewableArea (width, height) {
     let oldHeight = parseInt(this.styles["viewable-height"].height);
     let oldWidth = parseInt(this.styles["viewable-width"].width);
 
     let newWidth = width || this.width;
     let newHeight = height || this.viewableHeight;
@@ -181,17 +181,17 @@ var ContentAreaObserver = {
     this.styles["viewable-width"].maxWidth = newWidth + "px";
 
     this.updateAppBarPosition();
 
     // Update the back/tab button states. If the keyboard is up
     // these are hidden.
     BrowserUI._updateButtons();
 
-    this._disatchBrowserEvent("ViewableSizeChanged");
+    this._dispatchBrowserEvent("ViewableSizeChanged");
   },
 
   updateAppBarPosition: function updateAppBarPosition(aForceDown) {
     // Adjust the app and find bar position above the soft keyboard
     let keyboardHeight = aForceDown ? 0 : Services.metro.keyboardHeight;
     Elements.navbar.style.bottom = keyboardHeight + "px";
     Elements.contextappbar.style.bottom = keyboardHeight + "px";
     Elements.findbar.style.bottom = keyboardHeight + "px";
@@ -327,17 +327,17 @@ var ContentAreaObserver = {
   },
 
   _dispatchWindowEvent: function _dispatchWindowEvent(aEventName, aDetail) {
     let event = document.createEvent("UIEvents");
     event.initUIEvent(aEventName, true, false, window, aDetail);
     window.dispatchEvent(event);
   },
 
-  _disatchBrowserEvent: function (aName, aDetail) {
+  _dispatchBrowserEvent: function (aName, aDetail) {
     setTimeout(function() {
       let event = document.createEvent("Events");
       event.initEvent(aName, true, false);
       Elements.browsers.dispatchEvent(event);
     }, 0);
   },
 
   _initStyles: function _initStyles() {
--- a/browser/metro/base/content/ContextCommands.js
+++ b/browser/metro/base/content/ContextCommands.js
@@ -165,18 +165,19 @@ var ContextCommands = {
     aRichListItem.childNodes[0].setAttribute("value", "");
     aRichListItem.setAttribute("searchString", "");
     BrowserUI.addAndShowTab(defaultURI, Browser.selectedTab);
   },
 
   // Link specific
 
   openLinkInNewTab: function cc_openLinkInNewTab() {
-    Browser.addTab(ContextMenuUI.popupState.linkURL, false, Browser.selectedTab);
+    let tab = Browser.addTab(ContextMenuUI.popupState.linkURL, false, Browser.selectedTab);
     ContextUI.peekTabs(kOpenInNewTabAnimationDelayMsec);
+    Elements.tabList.strip.ensureElementIsVisible(tab.chromeTab);
   },
 
   copyLink: function cc_copyLink() {
     this.clipboard.copyString(ContextMenuUI.popupState.linkURL,
                               this.docRef);
   },
 
   bookmarkLink: function cc_bookmarkLink() {
--- a/browser/metro/base/content/ContextUI.js
+++ b/browser/metro/base/content/ContextUI.js
@@ -17,17 +17,16 @@ var ContextUI = {
   /*******************************************
    * init
    */
 
   init: function init() {
     Elements.browsers.addEventListener('URLChanged', this, true);
     Elements.browsers.addEventListener("AlertActive", this, true);
     Elements.browsers.addEventListener("AlertClose", this, true);
-    Elements.tabList.addEventListener('TabSelect', this, true);
     Elements.panelUI.addEventListener('ToolPanelShown', this, false);
     Elements.panelUI.addEventListener('ToolPanelHidden', this, false);
 
     window.addEventListener("touchstart", this, true);
     window.addEventListener("mousedown", this, true);
     window.addEventListener("MozEdgeUIStarted", this, true);
     window.addEventListener("MozEdgeUICanceled", this, true);
     window.addEventListener("MozEdgeUICompleted", this, true);
--- a/browser/metro/base/content/bindings/browser.js
+++ b/browser/metro/base/content/bindings/browser.js
@@ -578,16 +578,17 @@ let ContentScroll =  {
   },
 
   receiveMessage: function(aMessage) {
     let json = aMessage.json;
     switch (aMessage.name) {
       case "Content:SetWindowSize": {
         let cwu = content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
         cwu.setCSSViewport(json.width, json.height);
+        sendAsyncMessage("Content:SetWindowSize:Complete", {});
         break;
       }
     }
   },
 
   handleEvent: function(aEvent) {
     switch (aEvent.type) {
       case "pagehide":
--- a/browser/metro/base/content/bindings/grid.xml
+++ b/browser/metro/base/content/bindings/grid.xml
@@ -686,16 +686,17 @@
 
             let sheets = this.ownerDocument.styleSheets;
             // The (first matching) rules that will give us tile type => width/height values
             // The keys in this object are string-matched against the selectorText
             // of rules in our stylesheet. Quoted values in a selector will always use " not '
             let typeSelectors = {
               'richgriditem' : "default",
               'richgriditem[tiletype="thumbnail"]': "thumbnail",
+              'richgriditem[search]': "search",
               'richgriditem[compact]': "compact"
             };
             let rules, sheet;
             for (let i=0; (sheet=sheets[i]); i++) {
               if (sheet.href && sheet.href.endsWith( this._tileStyleSheetName )) {
                 rules = sheet.cssRules;
                 break;
               }
new file mode 100644
--- /dev/null
+++ b/browser/metro/base/content/bindings/tabprompts.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<bindings
+   xmlns="http://www.mozilla.org/xbl"
+   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+   xmlns:xbl="http://www.mozilla.org/xbl">
+
+  <binding id="tabmodalprompt"
+           extends="chrome://global/content/tabprompts.xml#tabmodalprompt">
+
+    <implementation>
+      <method name="metroInit">
+        <parameter name="args"/>
+        <parameter name="linkedTab"/>
+        <parameter name="onCloseCallback"/>
+        <body>
+          <![CDATA[
+            this.init(args, linkedTab, onCloseCallback);
+
+            this.ui.infoTitle.removeAttribute("hidden");
+
+            let infoContainer = document.getAnonymousElementByAttribute(this, "anonid", "infoContainer");
+            infoContainer.setAttribute("align", "start");
+            infoContainer.classList.add("infoContainer");
+          ]]>
+        </body>
+      </method>
+
+
+      <method name="onResize">
+        <body>
+          <![CDATA[
+            // Overwrite base onResize method. It's no-op for metro.
+          ]]>
+        </body>
+      </method>
+
+    </implementation>
+
+  </binding>
+
+</bindings>
--- a/browser/metro/base/content/bindings/tabs.xml
+++ b/browser/metro/base/content/bindings/tabs.xml
@@ -154,20 +154,26 @@
 
             this._selectedTab = val;
             this.strip.ensureElementIsVisible(val);
           ]]>
         </setter>
       </property>
 
       <method name="addTab">
+        <parameter name="aIndex"/>
         <body>
           <![CDATA[
             let tab = document.createElement("documenttab");
-            this.strip.appendChild(tab);
+            if (aIndex >= 0) {
+              let child = this.strip.children[aIndex];
+              this.strip.insertBefore(tab, child);
+            } else {
+              this.strip.appendChild(tab);
+            }
             return tab;
           ]]>
         </body>
       </method>
 
       <method name="removeTab">
         <parameter name="aTab"/>
         <body>
--- a/browser/metro/base/content/bindings/urlbar.xml
+++ b/browser/metro/base/content/bindings/urlbar.xml
@@ -505,17 +505,17 @@
         <xul:label class="meta-section-title"
                    value="&autocompleteResultsHeader.label;"/>
         <richgrid anonid="results" rows="3" flex="1"
                   seltype="single" nocontext="true" deferlayout="true"/>
       </xul:vbox>
 
       <xul:vbox class="meta-section" flex="1">
         <xul:label anonid="searches-header" class="meta-section-title"/>
-        <richgrid anonid="searches" rows="3" flex="1"
+        <richgrid anonid="searches" rows="3" flex="1" search="true"
                   seltype="single" nocontext="true" deferlayout="true"/>
       </xul:vbox>
     </content>
 
     <implementation implements="nsIAutoCompletePopup, nsIObserver">
       <constructor>
         <![CDATA[
           this.hidden = true;
@@ -731,22 +731,28 @@
               return;
 
             this._engines = Services.search.getVisibleEngines();
 
             while (this._searches.itemCount > 0)
               this._searches.removeItemAt(0, true);
 
             this._engines.forEach(function (anEngine) {
-              let item = this._searches.appendItem(anEngine.name, anEngine.name, true);
+              let item = this._searches.appendItem("", anEngine.name, true);
               item.setAttribute("autocomplete", "true");
               item.setAttribute("search", "true");
 
-              let iconURI = anEngine.iconURI ? anEngine.iconURI.spec : "";
-              item.setAttribute("iconURI", iconURI);
+              let largeImage = anEngine.getIconURLBySize(74,74);
+              if (largeImage) {
+                item.setAttribute("iconsize", "large");
+                item.setAttribute("iconURI", largeImage);
+              } else if (anEngine.iconURI && anEngine.iconURI.spec) {
+                item.setAttribute("iconURI", anEngine.iconURI.spec);
+                item.setAttribute("customColor", "#fff");
+              }
             }.bind(this));
 
             this._searches.arrangeItems();
           ]]>
         </body>
       </method>
 
       <method name="updateSearchEngineHeader">
--- a/browser/metro/base/content/browser-ui.js
+++ b/browser/metro/base/content/browser-ui.js
@@ -428,16 +428,17 @@ var BrowserUI = {
   },
 
   /*********************************
    * Tab management
    */
 
   /**
    * Open a new tab in the foreground in response to a user action.
+   * See Browser.addTab for more documentation.
    */
   addAndShowTab: function (aURI, aOwner) {
     ContextUI.peekTabs(kNewTabAnimationDelayMsec);
     return Browser.addTab(aURI || kStartURI, true, aOwner);
   },
 
   setOnTabAnimationEnd: function setOnTabAnimationEnd(aCallback) {
     Elements.tabs.addEventListener("animationend", function onAnimationEnd() {
--- a/browser/metro/base/content/browser.css
+++ b/browser/metro/base/content/browser.css
@@ -198,8 +198,12 @@ dialog.content-dialog {
 textbox {
   -moz-binding: url("chrome://browser/content/bindings/bindings.xml#textbox");
 }
 
 /* used in about:config */
 textbox[type="search"] {
   -moz-binding: url("chrome://browser/content/bindings/bindings.xml#search-textbox");
 }
+
+tabmodalprompt {
+  -moz-binding: url("chrome://browser/content/bindings/tabprompts.xml#tabmodalprompt");
+}
--- a/browser/metro/base/content/browser.js
+++ b/browser/metro/base/content/browser.js
@@ -365,24 +365,25 @@ var Browser = {
   getTabModalPromptBox: function(aBrowser) {
     let browser = (aBrowser || getBrowser());
     let stack = browser.parentNode;
     let self = this;
 
     let promptBox = {
       appendPrompt : function(args, onCloseCallback) {
           let newPrompt = document.createElementNS(XUL_NS, "tabmodalprompt");
+          newPrompt.setAttribute("promptType", args.promptType);
           stack.appendChild(newPrompt);
           browser.setAttribute("tabmodalPromptShowing", true);
           newPrompt.clientTop; // style flush to assure binding is attached
 
           let tab = self.getTabForBrowser(browser);
           tab = tab.chromeTab;
 
-          newPrompt.init(args, tab, onCloseCallback);
+          newPrompt.metroInit(args, tab, onCloseCallback);
           return newPrompt;
       },
 
       removePrompt : function(aPrompt) {
           stack.removeChild(aPrompt);
 
           let prompts = this.listPrompts();
           if (prompts.length) {
@@ -441,20 +442,50 @@ var Browser = {
     }
     return null;
   },
 
   createTabId: function createTabId() {
     return this._tabId++;
   },
 
+  /**
+   * Create a new tab and add it to the tab list.
+   *
+   * If you are opening a new foreground tab in response to a user action, use
+   * BrowserUI.addAndShowTab which will also show the tab strip.
+   *
+   * @param aURI String specifying the URL to load.
+   * @param aBringFront Boolean (optional) Open the new tab in the foreground?
+   * @param aOwner Tab object (optional) The "parent" of the new tab.
+   *   This is the tab responsible for opening the new tab.  When the new tab
+   *   is closed, we will return to a parent or "sibling" tab if possible.
+   * @param aParams Object (optional) with optional properties:
+   *   index: Number specifying where in the tab list to insert the new tab.
+   *   flags, postData, charset, referrerURI: See loadURIWithFlags.
+   */
   addTab: function browser_addTab(aURI, aBringFront, aOwner, aParams) {
     let params = aParams || {};
+
+    if (aOwner && !('index' in params)) {
+      // Position the new tab to the right of its owner...
+      params.index = this._tabs.indexOf(aOwner) + 1;
+      // ...and to the right of any siblings.
+      while (this._tabs[params.index] && this._tabs[params.index].owner == aOwner) {
+        params.index++;
+      }
+    }
+
     let newTab = new Tab(aURI, params, aOwner);
-    this._tabs.push(newTab);
+
+    if (params.index >= 0) {
+      this._tabs.splice(params.index, 0, newTab);
+    } else {
+      this._tabs.push(newTab);
+    }
 
     if (aBringFront)
       this.selectedTab = newTab;
 
     this._announceNewTab(newTab, params, aBringFront);
     return newTab;
   },
 
@@ -476,19 +507,18 @@ var Browser = {
     ContentAreaUtils.saveDocument(this.selectedBrowser.contentWindow.document);
   },
 
   /*
    * helper for addTab related methods. Fires events related to
    * new tab creation.
    */
   _announceNewTab: function _announceNewTab(aTab, aParams, aBringFront) {
-    let getAttention = ("getAttention" in aParams ? aParams.getAttention : !aBringFront);
     let event = document.createEvent("UIEvents");
-    event.initUIEvent("TabOpen", true, false, window, getAttention);
+    event.initUIEvent("TabOpen", true, false, window, 0);
     aTab.chromeTab.dispatchEvent(event);
     aTab.browser.messageManager.sendAsyncMessage("Browser:TabOpen");
   },
 
   _doCloseTab: function _doCloseTab(aTab) {
     if (this._tabs.length === 1) {
       Browser.addTab(this.getHomePage());
     }
@@ -585,23 +615,23 @@ var Browser = {
     this._selectedTab = tab;
 
     if (lastTab)
       lastTab.active = false;
 
     if (tab)
       tab.active = true;
 
+    BrowserUI.update();
+
     if (isFirstTab) {
-      // Don't waste time at startup updating the whole UI; just display the URL.
       BrowserUI._titleChanged(browser);
     } else {
       // Update all of our UI to reflect the new tab's location
       BrowserUI.updateURI();
-      BrowserUI.update();
 
       let event = document.createEvent("Events");
       event.initEvent("TabSelect", true, false);
       event.lastTab = lastTab;
       tab.chromeTab.dispatchEvent(event);
     }
 
     tab.lastSelected = Date.now();
@@ -1025,31 +1055,31 @@ nsBrowserAccess.prototype = {
     if (aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW) {
       let url = aURI ? aURI.spec : "about:blank";
       let newWindow = openDialog("chrome://browser/content/browser.xul", "_blank",
                                  "all,dialog=no", url, null, null, null);
       // since newWindow.Browser doesn't exist yet, just return null
       return null;
     } else if (aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWTAB) {
       let owner = isExternal ? null : Browser.selectedTab;
-      let tab = Browser.addTab("about:blank", true, owner, { getAttention: true });
+      let tab = Browser.addTab("about:blank", true, owner);
       if (isExternal)
         tab.closeOnExit = true;
       browser = tab.browser;
     } else if (aWhere == OPEN_APPTAB) {
       Browser.tabs.forEach(function(aTab) {
         if ("appURI" in aTab.browser && aTab.browser.appURI.spec == aURI.spec) {
           Browser.selectedTab = aTab;
           browser = aTab.browser;
         }
       });
 
       if (!browser) {
         // Make a new tab to hold the app
-        let tab = Browser.addTab("about:blank", true, null, { getAttention: true });
+        let tab = Browser.addTab("about:blank", true);
         browser = tab.browser;
         browser.appURI = aURI;
       } else {
         // Just use the existing browser, but return null to keep the system from trying to load the URI again
         browser = null;
       }
     } else { // OPEN_CURRENTWINDOW and illegal values
       browser = Browser.selectedBrowser;
@@ -1294,37 +1324,54 @@ Tab.prototype = {
 
   isLoading: function isLoading() {
     return this._loading;
   },
 
   create: function create(aURI, aParams, aOwner) {
     this._eventDeferred = Promise.defer();
 
-    this._chromeTab = Elements.tabList.addTab();
+    this._chromeTab = Elements.tabList.addTab(aParams.index);
     this._id = Browser.createTabId();
     let browser = this._createBrowser(aURI, null);
 
     let self = this;
     function onPageShowEvent(aEvent) {
       browser.removeEventListener("pageshow", onPageShowEvent);
       if (self._eventDeferred) {
         self._eventDeferred.resolve(self);
       }
       self._eventDeferred = null;
     }
     browser.addEventListener("pageshow", onPageShowEvent, true);
+    browser.addEventListener("DOMWindowCreated", this, false);
+    Elements.browsers.addEventListener("SizeChanged", this, false);
+
     browser.messageManager.addMessageListener("Content:StateChange", this);
     Services.obs.addObserver(this, "metro_viewstate_changed", false);
 
     if (aOwner)
       this._copyHistoryFrom(aOwner);
     this._loadUsingParams(browser, aURI, aParams);
   },
 
+  updateViewport: function (aEvent) {
+    // <meta name=viewport> is not yet supported; just use the browser size.
+    this.browser.setWindowSize(this.browser.clientWidth, this.browser.clientHeight);
+  },
+
+  handleEvent: function (aEvent) {
+    switch (aEvent.type) {
+      case "DOMWindowCreated":
+      case "SizeChanged":
+        this.updateViewport();
+        break;
+    }
+  },
+
   receiveMessage: function(aMessage) {
     switch (aMessage.name) {
       case "Content:StateChange":
         // update the thumbnail now...
         this.updateThumbnail();
         // ...and in a little while to capture page after load.
         if (aMessage.json.stateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
           clearTimeout(this._updateThumbnailTimeout);
@@ -1343,16 +1390,18 @@ Tab.prototype = {
           this.updateThumbnail();
         }
         break;
     }
   },
 
   destroy: function destroy() {
     this._browser.messageManager.removeMessageListener("Content:StateChange", this);
+    this._browser.removeEventListener("DOMWindowCreated", this, false);
+    Elements.browsers.removeEventListener("SizeChanged", this, false);
     Services.obs.removeObserver(this, "metro_viewstate_changed", false);
     clearTimeout(this._updateThumbnailTimeout);
 
     Elements.tabList.removeTab(this._chromeTab);
     this._chromeTab = null;
     this._destroyBrowser();
   },
 
--- a/browser/metro/base/content/browser.xul
+++ b/browser/metro/base/content/browser.xul
@@ -205,17 +205,17 @@
 
     <html:div id="overlay-back" class="overlay-button"
               observes="cmd_back"></html:div>
     <html:div id="overlay-plus" class="overlay-button"
               observes="cmd_back"></html:div>
 
     <!-- Navigation bar -->
     <appbar id="navbar" mousethrough="never" visible="true">
-      <hbox id="progress-container" layer="true">
+      <hbox id="progress-container" layer="true" observes="bcast_windowState">
         <hbox id="progress-control" />
       </hbox>
 
       <vbox id="toolbar-overlay" flex="1">
         <!-- Autocomplete -->
         <scrollbox flex="1">
           <hbox id="urlbar-autocomplete" observes="bcast_windowState"/>
         </scrollbox>
--- a/browser/metro/base/content/contenthandlers/FormHelper.js
+++ b/browser/metro/base/content/contenthandlers/FormHelper.js
@@ -170,17 +170,17 @@ FormAssistant.prototype = {
       case "FormAssist:ChoiceChange": {
         // ChoiceChange could happened once we have move to another element or
         // to nothing, so we should keep the used wrapper in mind.
         this._selectWrapper = getWrapperForElement(currentElement);
         this._selectWrapper.fireOnChange();
 
         // New elements can be shown when a select is updated so we need to
         // reconstruct the inner elements array and to take care of possible
-        // focus change, this is why we use "self.currentElement" instead of 
+        // focus change, this is why we use "self.currentElement" instead of
         // using directly "currentElement".
         this._executeDelayed(function(self) {
           let currentElement = self.currentElement;
           if (!currentElement)
             return;
           self._currentElement = currentElement;
         });
         break;
@@ -339,17 +339,17 @@ FormAssistant.prototype = {
     if (!(aElement instanceof HTMLIFrameElement)) {
       let element = aElement;
 
       // Retrieve the top element that is editable
       if (element instanceof HTMLHtmlElement)
         element = element.ownerDocument.body;
       else if (element instanceof HTMLDocument)
         element = element.body;
-    
+
       while (element && !this._isEditable(element))
         element = element.parentNode;
 
       // Return the container frame if we are into a nested editable frame
       if (element && element instanceof HTMLBodyElement && element.ownerDocument.defaultView != content.document.defaultView)
         return element.ownerDocument.defaultView.frameElement;
     }
 
@@ -472,29 +472,32 @@ FormAssistant.prototype = {
         return new Rect(scroll.x + rect.left, scroll.y + rect.top, rect.width, rect.height);
       }
     }
 
     return new Rect(0, 0, 0, 0);
   },
 
   /** Gets a rect bounding important parts of the element that must be seen when assisting. */
-  _getRect: function _formHelperGetRect() {
+  _getRect: function _formHelperGetRect(aOptions={}) {
     const kDistanceMax = 100;
     let element = this.currentElement;
     let elRect = getBoundingContentRect(element);
-    let labels = this._getLabels();
-    for (let i=0; i<labels.length; i++) {
-      let labelRect = labels[i].rect;
-      if (labelRect.left < elRect.left) {
-        let isClose = Math.abs(labelRect.left - elRect.left) - labelRect.width < kDistanceMax &&
-                      Math.abs(labelRect.top - elRect.top) - labelRect.height < kDistanceMax;
-        if (isClose) {
-          let width = labelRect.width + elRect.width + (elRect.left - labelRect.left - labelRect.width);
-          return new Rect(labelRect.left, labelRect.top, width, elRect.height).expandToIntegers();
+
+    if (aOptions.alignToLabel) {
+      let labels = this._getLabels();
+      for (let i=0; i<labels.length; i++) {
+        let labelRect = labels[i].rect;
+        if (labelRect.left < elRect.left) {
+          let isClose = Math.abs(labelRect.left - elRect.left) - labelRect.width < kDistanceMax &&
+                        Math.abs(labelRect.top - elRect.top) - labelRect.height < kDistanceMax;
+          if (isClose) {
+            let width = labelRect.width + elRect.width + (elRect.left - labelRect.left - labelRect.width);
+            return new Rect(labelRect.left, labelRect.top, width, elRect.height).expandToIntegers();
+          }
         }
       }
     }
     return elRect;
   },
 
   _getLabels: function formHelperGetLabels() {
     let associatedLabels = [];
--- a/browser/metro/base/content/helperui/MenuUI.js
+++ b/browser/metro/base/content/helperui/MenuUI.js
@@ -239,16 +239,19 @@ var ContextMenuUI = {
       xPos: coords.x,
       yPos: coords.y,
       source: aMessage.json.source
     }));
     return true;
   },
 
   hide: function hide () {
+    for (let command of this.commands.querySelectorAll("richlistitem[selected]")) {
+      command.removeAttribute("selected");
+    }
     this._menuPopup.hide();
     this._popupState = null;
   },
 
   reset: function reset() {
     this._popupState = null;
   }
 };
--- a/browser/metro/base/jar.mn
+++ b/browser/metro/base/jar.mn
@@ -23,16 +23,17 @@ chrome.jar:
   content/bindings/urlbar.xml                  (content/bindings/urlbar.xml)
   content/bindings/appbar.xml                  (content/bindings/appbar.xml)
   content/bindings/flyoutpanel.xml             (content/bindings/flyoutpanel.xml)
   content/bindings/selectionoverlay.xml        (content/bindings/selectionoverlay.xml)
   content/bindings/cssthrobber.xml             (content/bindings/cssthrobber.xml)
   content/bindings/popup.xml                   (content/bindings/popup.xml)
   content/bindings/circularprogress.xml        (content/bindings/circularprogress.xml)
   content/bindings/notification.xml            (content/bindings/notification.xml)
+  content/bindings/tabprompts.xml              (content/bindings/tabprompts.xml)
 
 * content/flyoutpanels/FlyoutPanelsUI.js       (content/flyoutpanels/FlyoutPanelsUI.js)
 * content/flyoutpanels/AboutFlyoutPanel.js     (content/flyoutpanels/AboutFlyoutPanel.js)
   content/flyoutpanels/PrefsFlyoutPanel.js     (content/flyoutpanels/PrefsFlyoutPanel.js)
 
   content/helperui/AlertsHelper.js             (content/helperui/AlertsHelper.js)
   content/helperui/IndexedDB.js                (content/helperui/IndexedDB.js)
   content/helperui/MenuUI.js                   (content/helperui/MenuUI.js)
--- a/browser/metro/base/tests/mochitest/browser_snappedState.js
+++ b/browser/metro/base/tests/mochitest/browser_snappedState.js
@@ -88,16 +88,17 @@ gTests.push({
 
     ok(!topsites.hasAttribute("expanded"), "topsites is collapsed");
     ok(bookmarks.hasAttribute("expanded"), "bookmarks is expanded");
     ok(!history.hasAttribute("expanded"), "history is collapsed");
   },
   tearDown: restoreViewstate
 });
 
+/* Disabled because it breaks at specific screen sizes (bug 936735).
 gTests.push({
   desc: "Test Snapped scrolls vertically",
   setUp: function() {
 
     // Populate with mock data and expand bookmarks
     BookmarksTestHelper.setup();
     sendElementTap(Browser.selectedBrowser.contentWindow, getNarrowTitle("start-bookmarks"));
 
@@ -109,16 +110,18 @@ gTests.push({
     ok(Browser.selectedBrowser.contentWindow.scrollMaxY !== 0, "Snapped scrolls vertically");
     ok(Browser.selectedBrowser.contentWindow.scrollMaxX === 0, "Snapped does not scroll horizontally");
   },
   tearDown: function() {
     BookmarksTestHelper.restore();
     yield restoreViewstate();
   }
 });
+*/
+
 gTests.push({
   desc: "Test tile selection is cleared and disabled",
   setUp: function() {
     BookmarksTestHelper.setup();
     HistoryTestHelper.setup();
     showStartUI();
   },
   run: function() {
@@ -178,16 +181,17 @@ gTests.push({
 
     ok(wideTitleVisible("start-topsites"), "topsites wide title is visible");
     ok(wideTitleVisible("start-bookmarks"), "bookmarks wide title is visible");
     ok(wideTitleVisible("start-history"), "history wide title is visible");
   },
   tearDown: restoreViewstate
 });
 
+/* Disabled because it breaks at specific screen sizes (bug 936735).
 gTests.push({
   desc: "Test portrait scrolls vertically",
   setUp: function() {
     // Populate with mock data
     BookmarksTestHelper.setup();
     HistoryTestHelper.setup();
 
     yield setUpPortrait();
@@ -197,8 +201,9 @@ gTests.push({
     ok(Browser.selectedBrowser.contentWindow.scrollMaxX === 0, "Portrait does not scroll horizontally");
   },
   tearDown: function() {
     BookmarksTestHelper.restore();
     HistoryTestHelper.restore();
     yield restoreViewstate();
   }
 });
+*/
--- a/browser/metro/base/tests/mochitest/head.js
+++ b/browser/metro/base/tests/mochitest/head.js
@@ -346,16 +346,32 @@ function waitForEvent(aSubject, aEventNa
     aSubject.removeEventListener(aEventName, listener);
     return aEventOrError;
   }
   aSubject.addEventListener(aEventName, listener, false);
   return eventDeferred.promise.then(cleanup, cleanup);
 }
 
 /**
+ * Wait for an nsIMessageManager IPC message.
+ */
+function waitForMessage(aName, aMessageManager) {
+  let deferred = Promise.defer();
+  let manager = aMessageManager || messageManager;
+  function listener(aMessage) {
+    deferred.resolve(aMessage);
+  }
+  manager.addMessageListener(aName, listener);
+  function cleanup(aEventOrError) {
+    manager.removeMessageListener(aName, listener);
+  }
+  return deferred.promise.then(cleanup, cleanup);
+}
+
+/**
  * Waits a specified number of miliseconds.
  *
  * Usage:
  *    let wait = yield waitForMs(2000);
  *    ok(wait, "2 seconds should now have elapsed");
  *
  * @param aMs the number of miliseconds to wait for
  * @returns a Promise that resolves to true after the time has elapsed
--- a/browser/metro/base/tests/mochitest/helpers/ViewStateHelper.js
+++ b/browser/metro/base/tests/mochitest/helpers/ViewStateHelper.js
@@ -17,16 +17,18 @@ function setSnappedViewstate() {
   // Reduce browser width to simulate small screen size.
   let fullWidth = browser.clientWidth;
   let padding = fullWidth - snappedSize;
 
   browser.style.borderRight = padding + "px solid gray";
 
   // Communicate viewstate change
   ContentAreaObserver._updateViewState("snapped");
+  ContentAreaObserver._dispatchBrowserEvent("SizeChanged");
+  yield waitForMessage("Content:SetWindowSize:Complete", browser.messageManager);
 
   // Make sure it renders the new mode properly
   yield waitForMs(0);
 }
 
 function setPortraitViewstate() {
   ok(isLandscapeMode(), "setPortraitViewstate expects landscape mode to work.");
 
@@ -38,22 +40,25 @@ function setPortraitViewstate() {
 
   browser.style.borderRight = padding + "px solid gray";
 
   // cap the height to create more even surface for testing on
   if (fullHeight > maxPortraitHeight)
     browser.style.borderBottom = (fullHeight - maxPortraitHeight) + "px solid gray";
 
   ContentAreaObserver._updateViewState("portrait");
+  ContentAreaObserver._dispatchBrowserEvent("SizeChanged");
 
   // Make sure it renders the new mode properly
   yield waitForMs(0);
 }
 
 function restoreViewstate() {
   ContentAreaObserver._updateViewState("landscape");
+  ContentAreaObserver._dispatchBrowserEvent("SizeChanged");
+
   ok(isLandscapeMode(), "restoreViewstate should restore landscape mode.");
 
   Browser.selectedBrowser.style.removeProperty("border-right");
   Browser.selectedBrowser.style.removeProperty("border-bottom");
 
   yield waitForMs(0);
 }
--- a/browser/metro/components/SessionStore.js
+++ b/browser/metro/components/SessionStore.js
@@ -724,24 +724,21 @@ SessionStore.prototype = {
         let tabs = data.windows[0].tabs;
         let selected = data.windows[0].selected;
         if (selected > tabs.length) // Clamp the selected index if it's bogus
           selected = 1;
 
         for (let i=0; i<tabs.length; i++) {
           let tabData = tabs[i];
 
-          // Add a tab, but don't load the URL until we need to
-          let params = { getAttention: false, delayLoad: true };
-
           // We must have selected tabs as soon as possible, so we let all tabs be selected
           // until we get the real selected tab. Then we stop selecting tabs. The end result
           // is that the right tab is selected, but we also don't get a bunch of errors
           let bringToFront = (i + 1 <= selected) && aBringToFront;
-          let tab = window.Browser.addTab(tabData.entries[tabData.index - 1].url, bringToFront, null, params);
+          let tab = window.Browser.addTab(tabData.entries[tabData.index - 1].url, bringToFront);
 
           // Start a real load for the selected tab
           if (i + 1 == selected) {
             let json = {
               uri: tabData.entries[tabData.index - 1].url,
               flags: null,
               entries: tabData.entries,
               index: tabData.index
--- a/browser/metro/profile/metro.js
+++ b/browser/metro/profile/metro.js
@@ -38,18 +38,18 @@ pref("prompts.tab_modal.enabled", true);
 
 // Enable off main thread compositing
 pref("layers.offmainthreadcomposition.enabled", true);
 pref("layers.async-pan-zoom.enabled", true);
 pref("layers.componentalpha.enabled", false);
 
 // Prefs to control the async pan/zoom behaviour
 pref("apz.touch_start_tolerance", "0.1"); // dpi * tolerance = pixel threshold
-pref("apz.pan_repaint_interval", "50");   // prefer 20 fps
-pref("apz.fling_repaint_interval", "50"); // prefer 20 fps
+pref("apz.pan_repaint_interval", 50);   // prefer 20 fps
+pref("apz.fling_repaint_interval", 50); // prefer 20 fps
 pref("apz.fling_friction", "0.002");
 pref("apz.fling_stopped_threshold", "0.2");
 
 // 0 = free, 1 = standard, 2 = sticky
 pref("apz.axis_lock_mode", 2);
 pref("apz.cross_slide.enabled", true);
 
 // Enable Microsoft TSF support by default for imes.
--- a/browser/metro/theme/browser.css
+++ b/browser/metro/theme/browser.css
@@ -455,16 +455,19 @@ documenttab[selected] .documenttab-selec
   position: absolute;
   top: -@progress_height@;
   height: @progress_height@;
   width: 100%;
   background-color: hsla(210,5%,80%,1);
   box-shadow: 0 1px 0 hsla(210,5%,50%,.1) inset;
   -moz-user-focus: ignore;
 }
+#progress-container[startpage] {
+  visibility: collapse;
+}
 
 #progress-control {
   display: block;
   height: @progress_height@;
   background-image: -moz-linear-gradient(left, hsla(200,100%,83%,.5),
                                          hsla(200,100%,83%,0)),
                     -moz-linear-gradient(top, #1ab2ff, #0091ff);
   border-right: 1px solid #0082e5;
--- a/browser/metro/theme/defines.inc
+++ b/browser/metro/theme/defines.inc
@@ -35,16 +35,17 @@
 
 %define thumbnail_width 232px
 %define thumbnail_height 148px
 
 %define grid_column_width 131px
 %define grid_double_column_width 262px
 %define grid_row_height 86px
 %define grid_double_row_height 172px
+%define grid_search_width 86px
 
 %define compactgrid_column_width 62px
 %define compactgrid_row_height 62px
 
 %define tile_border_color #dbdcde
 %define tile_spacing 12px
 %define tile_side_margin 6px
 
@@ -73,16 +74,17 @@
 %define font_normal 16px
 %define font_snormal 15px
 %define font_small 12px
 %define font_xsmall 11px
 
 %define touch_row 47px
 %define touch_button_small 37px
 %define touch_action_minwidth 133px
+%define touch_action_snapped_minwidth 80px
 
 %define margin_large 16px
 %define margin_xnormal 7px
 %define margin_normal 5px
 
 %define padding_xxnormal 8px
 %define padding_xnormal 7px
 %define padding_normal 5px
--- a/browser/metro/theme/platform.css
+++ b/browser/metro/theme/platform.css
@@ -73,36 +73,36 @@ button {
 button:not([disabled]):hover {
   background: linear-gradient(to bottom, hsl(210, 5%, 75%), hsl(210, 5%, 73%));
   border-color: hsl(210, 5%, 71%);
   color: hsl(0, 0%, 10%);
 }
 
 /* Default button colors */
 
-.button-default,
+button[default],
 .notification-button-default {
   background: linear-gradient(to bottom, hsl(35, 100%, 50%), hsl(30, 100%, 50%));
   border-color: hsl(30, 100%, 48%);
   color: white;
 }
 
-.button-default:not([disabled]):hover,
+button[default]:not([disabled]):hover,
 .notification-button-default:not([disabled]):hover {
   background: linear-gradient(to bottom, hsl(25, 100%, 47%), hsl(25, 100%, 45%));
   border-color: hsl(25, 100%, 43%);
   color: white;
 }
 
 /* Pushed button colors (both default and non-default */
 
 /* Note: these need enough specificity to override all the :hover rules above. */
 button:not([disabled]):hover:active,
 button:not([disabled])[checked="true"],
-.button-default:not([disabled])[checked="true"],
+button[default]:not([disabled])[checked="true"],
 .notification-button-default:not([disabled])[checked="true"] {
   background: linear-gradient(to bottom, hsl(210, 5%, 28%), hsl(210, 5%, 25%));
   border-color: hsl(216, 4%, 27%);
   color: white;
 }
 
 /* Disabled button colors (both default and non-default */
 
@@ -546,35 +546,92 @@ notificationbox[count="3"] .notification
     overflow: visible;
   }
 
 }
 
 /* Prompts ----------------------------------------------------------------- */
 
 .mainContainer {
-/* TODO: These values should probably come from somewhere. Maybe the same as the width of our overlay buttons? */
-  padding-left: 60px;
-  padding-right: 60px;
+  padding: 5vh 10vw;
 }
 
 .info\.title {
   font-size: @metro_font_large@;
+  border-bottom: 1px solid #C7C7C7;
+  padding-bottom: @metro_spacing_normal@;
+  width: 100%;
+  margin-left: 0;
+  margin-right: 0;
 }
 
 .info\.body {
   font-size: @metro_font_normal@;
+  padding-bottom: @metro_spacing_normal@;
+  height: 100%;
+  max-height: 30vh;
+  max-width: 55vw;
 }
 
 .buttonContainer {
   background-color: transparent;
-  padding: 0;
   border: none;
 }
 
+.buttonContainer > button {
+  min-width: @touch_action_minwidth@;
+  margin: 5px 0 5px @metro_spacing_xnormal@;
+}
+
+/* set all the things to display block to allow body to grow with content and
+  obey overflow auto. Except on authentication prompts because a grid is used to
+  align labels and textboxes. */
+tabmodalprompt:not([promptType="promptUserAndPass"]) .info\.body,
+tabmodalprompt:not([promptType="promptUserAndPass"]) .infoContainer,
+tabmodalprompt:not([promptType="promptUserAndPass"]) .topContainer,
+tabmodalprompt:not([promptType="promptUserAndPass"]) .topContainer > rows > row:not([hidden]),
+tabmodalprompt:not([promptType="promptUserAndPass"]) .topContainer > rows {
+  display: block;
+}
+
+tabmodalprompt:not([promptType="promptUserAndPass"]) .infoContainer {
+  overflow: auto;
+}
+
+.topContainer > rows > row > label {
+  margin-left: 0;
+}
+
+.topContainer > rows > row > checkbox {
+  -moz-margin-start: 0;
+  -moz-padding-start: 0;
+}
+
+.topContainer > rows > row > textbox {
+  font-size: @metro_font_normal@;
+  height: 40px;
+  margin: 5px 0;
+  width: 100%;
+}
+
+.topContainer > rows > row > textbox[focused] {
+  border-color: @metro_orange@ !important;
+}
+
+@media (max-width: 600px) {
+  .mainContainer {
+    padding: 5vh 5vw;
+    width: 90vw;
+  }
+
+  .buttonContainer > button {
+    min-width: @touch_action_snapped_minwidth@;
+  }
+}
+
 /*.meta -------------------------------------------------------------------- */
 
 .meta {
   background-color: @panel_light_color@;
 }
 
 /* needs to observe the viewstate */
 .meta-section-container {
--- a/browser/metro/theme/tiles.css
+++ b/browser/metro/theme/tiles.css
@@ -16,16 +16,20 @@
 richgriditem {
   width: @grid_double_column_width@;
   height: @grid_row_height@;
 }
 richgriditem[tiletype="thumbnail"] {
   width: @grid_double_column_width@;
   height: @grid_double_row_height@;
 }
+richgriditem[search] {
+  width: @grid_search_width@;
+  height: @grid_row_height@;
+}
 richgriditem[compact] {
   width: auto;
   height: @compactgrid_row_height@;
 }
 /*
  *****************************************************
  */
 richgrid {
@@ -41,16 +45,21 @@ richgrid > .richgrid-grid {
   -moz-column-gap: 0;
   -moz-column-count: auto;
   display: block;
   -moz-box-sizing: content-box;
   overflow-x: hidden; /* clipping will only kick in if an explicit width is set */
   transition: 100ms transform ease-out;
 }
 
+richgrid[search] > .richgrid-grid {
+  -moz-column-width: auto;
+  min-width: 0;
+}
+
 richgriditem {
   display: block;
   position: relative;
   width: @grid_double_column_width@;
   height: @grid_row_height@;
   -moz-box-sizing: border-box;
   -moz-column-gap: 0;
   overflow:hidden;
@@ -78,16 +87,20 @@ richgriditem {
   top: 0;
   bottom: 0;
   right: 0;
   left: 10px;
   padding: 8px;
   background-color: #fff;
 }
 
+richgriditem[search] .tile-start-container {
+  background-color: transparent;
+}
+
 richgriditem:not([tiletype="thumbnail"]) .tile-start-container {
   background-image: none!important;
 }
 
 .tile-icon-box {
   position: absolute;
   top: 50%;
   margin-top: -17px;
@@ -115,16 +128,48 @@ richgriditem[iconsize="large"] .tile-ico
 }
 
 richgriditem[iconsize="large"] .tile-icon-box > image,
 .tile-icon-box > image[src=""] {
   width: 24px;
   height: 24px;
 }
 
+richgriditem[search] .tile-icon-box {
+  padding: 0;
+  border: 0;
+  left: 50%;
+  margin-left: -13px;
+  margin-top: -8px;
+}
+
+richgriditem[search][iconsize="large"] .tile-icon-box {
+  left: 0;
+  top: 0;
+  margin: 0;
+}
+
+richgriditem[search][iconsize="large"] .tile-start-container {
+  left: 0;
+  padding: 0;
+}
+
+richgriditem[search][iconsize="large"] .tile-icon-box > image {
+  width: 74px;
+  height: 74px;
+}
+
+richgriditem[search] .tile-desc {
+  display: none;
+}
+
+richgriditem[search] .tile-content {
+  border: 0;
+}
+
 .tile-desc {
   display: block;
   position: absolute;
   top: 6px;
   left: 52px; /* label goes to the right of the favicon */
   right: 0;
   padding: 1em 6px 6px 12px;
   background: white;
@@ -156,20 +201,16 @@ richgriditem.collapsed > .tile-content {
 }
 
 richgriditem:active {
   z-index: 2;
 }
 
 /* thumbnail variation */
 
-richgriditem[tiletype="thumbnail"] .tile-start-container {
-  background-image: url("chrome://browser/skin/images/firefox-watermark.png");
-}
-
 richgriditem[tiletype="thumbnail"] {
   width: @grid_double_column_width@;
   height: @grid_double_row_height@;
   -moz-box-pack: end;
   padding: 0px;
   color: #1a1a1a;
 }
 
@@ -182,26 +223,43 @@ richgriditem[tiletype="thumbnail"] .tile
 }
 
 richgriditem[tiletype="thumbnail"] > .tile-content > .tile-desc {
   /* ensure thumbnail labels get their color from the parent richgriditem element */
   color: inherit;
 }
 
 /* thumbnail tiles use a screenshot thumbnail as the background */
-richgriditem[tiletype="thumbnail"] > .tile-content > .tile-start-container {
+
+richgriditem[tiletype="thumbnail"] > .tile-content > .tile-start-container,
+richgriditem[tiletype="thumbnail"] > .tile-content > .tile-start-container::after {
   background-size: cover;
   background-position: top left;
   background-repeat: no-repeat;
   position: absolute;
   top: 0;
   bottom: 0;
   right: 0;
   left: 0;
 }
+
+richgriditem[tiletype="thumbnail"] > .tile-content > .tile-start-container::after {
+  pointer-events:none;
+  content: "";
+  display: block;
+  opacity: 0;
+  background-color: #fff;
+  background-image: url("chrome://browser/skin/images/firefox-watermark.png")!important;
+  transition: @metro_animation_duration@ opacity ease-in;
+}
+
+richgriditem[tiletype="thumbnail"]:not([customImage]) > .tile-content > .tile-start-container::after {
+  opacity: 1;
+}
+
 richgriditem[tiletype="thumbnail"] .tile-icon-box {
   top: auto;
   left: 10px;
   bottom: 6px;
   margin-top: 0;
   z-index: 1;
   box-shadow: 0px 0px 2px 2px rgba(0, 0, 0, 0.05), 0px 2px 0px rgba(0, 0, 0, 0.1);
 }
@@ -295,17 +353,17 @@ richgriditem[tiletype="thumbnail"]:not([
   background-size: @grid_row_height@;
 }
 
 /* Snapped-view variation
    We use the compact, single-column grid treatment for <=320px */
 
 @media (max-width: 330px) {
 
-  richgrid > .richgrid-grid {
+  richgrid:not([search]) > .richgrid-grid {
     -moz-column-width: auto!important; /* let it flow */
     -moz-column-count: auto!important; /* let it flow */
     height: auto; /* let it flow */
     min-width: 280px;
     transition: 100ms transform ease-out;
   }
 
   richgriditem {
@@ -313,17 +371,17 @@ richgriditem[tiletype="thumbnail"]:not([
     overflow: hidden;
     height: @compactgrid_row_height@;
   }
 
   .tile-desc {
     padding: 0.5em 4px 4px 4px;
   }
 
-  .tile-content {
+  richgriditem:not([search]) > .tile-content {
     left: 0;
     right: 0;
   }
 
   richgriditem {
     width: auto;
   }
 }
--- a/build/pymake/make.py
+++ b/build/pymake/make.py
@@ -12,20 +12,11 @@ import pymake.command, pymake.process
 import gc
 
 if __name__ == '__main__':
   sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
   sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0)
 
   gc.disable()
 
-  # This is meant as a temporary workaround until issues with many targets
-  # and prerequisites is addressed. Bug 874210 tracks.
-  #
-  # The default recursion limit for CPython is 1000.
-  try:
-      sys.setrecursionlimit(10000)
-  except Exception:
-      print >>sys.stderr, 'Unable to increase Python recursion limit.'
-
   pymake.command.main(sys.argv[1:], os.environ, os.getcwd(), cb=sys.exit)
   pymake.process.ParallelContext.spin()
   assert False, "Not reached"
--- a/build/pymake/pymake/data.py
+++ b/build/pymake/pymake/data.py
@@ -775,17 +775,18 @@ class RemakeTargetParallel(object):
             if not self.rulesremaining:
                 self.target.notifydone(self.makefile)
             return
 
         if self.rlist[0].depsremaining != 0:
             return
 
         self.currunning = True
-        self.rlist.pop(0).runcommands(self.indent, self.commandscb)
+        rule = self.rlist.pop(0)
+        self.makefile.context.defer(rule.runcommands, self.indent, self.commandscb)
 
     def commandscb(self, error):
         assert error in (True, False)
         if error:
             self.target.error = True
             self.makefile.error = True
 
         assert self.currunning
@@ -839,21 +840,25 @@ class RemakeRuleContext(object):
         else:
             self.resolvecb(error=self.error, didanything=self.didanything)
 
     def _resolvedepsserial(self):
         self.resolvelist = list(self.deps)
         self._depfinishedserial(False, False)
 
     def _startdepparallel(self, d):
+        dep, weak = d
+        if weak:
+            depfinished = self._weakdepfinishedparallel
+        else:
+            depfinished = self._depfinishedparallel
         if self.makefile.error:
             depfinished(True, False)
         else:
-            dep, weak = d
-            dep.make(self.makefile, self.targetstack, weak and self._weakdepfinishedparallel or self._depfinishedparallel)
+            dep.make(self.makefile, self.targetstack, depfinished)
 
     def _weakdepfinishedparallel(self, error, didanything):
         if error:
             self.remake = True
         self._depfinishedparallel(False, didanything)
 
     def _depfinishedparallel(self, error, didanything):
         assert error in (True, False)
--- a/build/pymake/pymake/process.py
+++ b/build/pymake/pymake/process.py
@@ -410,16 +410,20 @@ class PythonJob(Job):
                 pass # sys.exit(0) is not a failure
             else:
                 print >>sys.stderr, e
                 traceback.print_exc()
                 return -127
         finally:
             os.environ.clear()
             os.environ.update(oldenv)
+            # multiprocessing exits via os._exit, make sure that all output
+            # from command gets written out before that happens.
+            sys.stdout.flush()
+            sys.stderr.flush()
         return 0
 
 def job_runner(job):
     """
     Run a job. Called in a Process pool.
     """
     return job.run()
 
--- a/content/base/public/nsIObjectLoadingContent.idl
+++ b/content/base/public/nsIObjectLoadingContent.idl
@@ -20,17 +20,17 @@ class nsNPAPIPluginInstance;
 
 /**
  * This interface represents a content node that loads objects.
  *
  * Please make sure to update the MozObjectLoadingContent WebIDL
  * interface to mirror this interface when changing it.
  */
 
-[scriptable, uuid(070bfc7f-f8b8-4e84-aa31-a0bfaffa8e8e)]
+[scriptable, uuid(16c14177-52eb-49d3-9842-a1a0b92be11a)]
 interface nsIObjectLoadingContent : nsISupports
 {
   /**
    * See notes in nsObjectLoadingContent.h
    */
   const unsigned long TYPE_LOADING  = 0;
   const unsigned long TYPE_IMAGE    = 1;
   const unsigned long TYPE_PLUGIN   = 2;
@@ -129,16 +129,24 @@ interface nsIObjectLoadingContent : nsIS
 
   /**
    * This method will play a plugin that has been stopped by the
    * click-to-play plugins or play-preview features.
    */
   void playPlugin();
 
   /**
+   * Forces a re-evaluation and reload of the tag, optionally invalidating its
+   * click-to-play state.  This can be used when the MIME type that provides a
+   * type has changed, for instance, to force the tag to re-evalulate the
+   * handler to use.
+   */
+  void reload(in boolean aClearActivation);
+
+  /**
    * This attribute will return true if the current content type has been
    * activated, either explicitly or by passing checks that would have it be
    * click-to-play or play-preview.
    */
   readonly attribute boolean activated;
 
   [noscript] void stopPluginInstance();
 
--- a/content/base/src/nsObjectLoadingContent.cpp
+++ b/content/base/src/nsObjectLoadingContent.cpp
@@ -2394,16 +2394,24 @@ nsObjectLoadingContent::UnloadObject(boo
   }
 
   // InstantiatePluginInstance checks this after re-entrant calls and aborts if
   // it was cleared from under it
   mInstantiating = false;
 
   mScriptRequested = false;
 
+  if (!mInstanceOwner) {
+    // The protochain is normally thrown out after a plugin stops, but if we
+    // re-enter while stopping a plugin and try to load something new, we need
+    // to throw away the old protochain in the nested unload.
+    TeardownProtoChain();
+    mIsStopping = false;
+  }
+
   // This call should be last as it may re-enter
   StopPluginInstance();
 }
 
 void
 nsObjectLoadingContent::NotifyStateChanged(ObjectType aOldType,
                                            nsEventStates aOldState,
                                            bool aSync,
@@ -2781,19 +2789,27 @@ nsObjectLoadingContent::DoStopPlugin(nsP
 #if defined(XP_MACOSX)
     aInstanceOwner->HidePluginWindow();
 #endif
 
     nsRefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
     NS_ASSERTION(pluginHost, "No plugin host?");
     pluginHost->StopPluginInstance(inst);
   }
-  TeardownProtoChain();
+
   aInstanceOwner->Destroy();
 
+  // If we re-enter in plugin teardown UnloadObject will tear down the
+  // protochain -- the current protochain could be from a new, unrelated, load.
+  if (!mIsStopping) {
+    LOG(("OBJLC [%p]: Re-entered in plugin teardown", this));
+    return;
+  }
+
+  TeardownProtoChain();
   mIsStopping = false;
 }
 
 NS_IMETHODIMP
 nsObjectLoadingContent::StopPluginInstance()
 {
   // Clear any pending events
   mPendingInstantiateEvent = nullptr;
@@ -2890,16 +2906,27 @@ nsObjectLoadingContent::PlayPlugin()
   if (mType == eType_Null && mFallbackType >= eFallbackClickToPlay) {
     return LoadObject(true, true);
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
+nsObjectLoadingContent::Reload(bool aClearActivation)
+{
+  if (aClearActivation) {
+    mActivated = false;
+    mPlayPreviewCanceled = false;
+  }
+
+  return LoadObject(true, true);
+}
+
+NS_IMETHODIMP
 nsObjectLoadingContent::GetActivated(bool *aActivated)
 {
   *aActivated = Activated();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsObjectLoadingContent::GetPluginFallbackType(uint32_t* aPluginFallbackType)
--- a/content/base/src/nsObjectLoadingContent.h
+++ b/content/base/src/nsObjectLoadingContent.h
@@ -174,16 +174,20 @@ class nsObjectLoadingContent : public ns
     uint32_t GetContentTypeForMIMEType(const nsAString& aMIMEType)
     {
       return GetTypeOfContent(NS_ConvertUTF16toUTF8(aMIMEType));
     }
     void PlayPlugin(mozilla::ErrorResult& aRv)
     {
       aRv = PlayPlugin();
     }
+    void Reload(bool aClearActivation, mozilla::ErrorResult& aRv)
+    {
+      aRv = Reload(aClearActivation);
+    }
     bool Activated() const
     {
       return mActivated;
     }
     nsIURI* GetSrcURI() const
     {
       return mURI;
     }
--- a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h
+++ b/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h
@@ -68,17 +68,17 @@ protected:
   // mVideoDecoderSlots is the array of slots that represent a media resource.
   ResourceSlot mVideoDecoderSlots[VIDEO_DECODER_COUNT];
   // The maximum number of hardware decoders available on the device.
   int mVideoDecoderCount;
 
   // The lock protects mVideoDecoderSlots and mVideoCodecRequestQueue called
   //  from multiple threads.
   Mutex mLock;
-  typedef Vector<sp<IBinder> > Fifo;
+  typedef List<sp<IBinder> > Fifo;
   // Queue of media resource requests.
   // Hold IMediaResourceManagerClient that requesting a media resource as IBinder.
   Fifo mVideoCodecRequestQueue;
 
   // ALooper is a message loop used in stagefright.
   // It creates a thread for messages and handles messages in the thread.
   // ALooper is a clone of Looper in android Java.
   // http://developer.android.com/reference/android/os/Looper.html
deleted file mode 100644
--- a/content/media/test/Makefile.in
+++ /dev/null
@@ -1,401 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Media tests should be backend independent, i.e., not conditioned on
-# MOZ_OGG, MOZ_WAVE etc. (The only exception is the can_play_type tests,
-# which necessarily depend on the backend(s) configured.) As far as possible,
-# each test should work with any resource type. This makes it
-# easy to add new backends and reduces the amount of test duplication.
-
-# For each supported backend, resources that can be played by that backend
-# should be added to the lists in manifest.js. Media tests that aren't
-# testing for a bug in handling a specific resource type should pick one of
-# the lists in manifest.js and run the test for each resource in the list
-# that is supported in the current build (the canPlayType API is useful
-# for this).
-
-# To test whether a valid resource can simply be played through correctly,
-# and optionally that its metadata is read correctly, just
-# add it to gPlayTests in manifest.js. To test whether an invalid
-# resource correctly throws an error (and does not cause a crash or hang),
-# just add it to gErrorTests in manifest.js.
-
-# To test for a specific bug in handling a specific resource type,
-# make the test first check canPlayType for the type, and if it's not
-# supported, just do ok(true, "Type not supported") and stop the test.
-
-
-# Disabled for too many intermittent failures (bug 897108)
-#		test_playback_rate_playpause.html \
-
-MOCHITEST_FILES = \
-		allowed.sjs \
-		can_play_type_ogg.js \
-		can_play_type_wave.js \
-		can_play_type_webm.js \
-		can_play_type_dash.js \
-		can_play_type_mpeg.js \
-		cancellable_request.sjs \
-		dynamic_redirect.sjs \
-		dynamic_resource.sjs \
-		file_access_controls.html \
-		fragment_play.js \
-		fragment_noplay.js \
-		manifest.js \
-		reactivate_helper.html \
-		redirect.sjs \
-		referer.sjs \
-		seek1.js \
-		seek2.js \
-		seek3.js \
-		seek4.js \
-		seek5.js \
-		seek6.js \
-		seek7.js \
-		seek8.js \
-		seek9.js \
-		seek10.js \
-		seek11.js \
-		seek12.js \
-		seek13.js \
-		seekLies.sjs \
-		test_access_control.html \
-		test_audio1.html \
-		test_audio2.html \
-		test_autoplay.html \
-		test_bug448534.html \
-		test_bug463162.xhtml \
-		test_bug495145.html \
-		test_bug495300.html \
-		test_bug654550.html \
-		test_bug686942.html \
-		test_bug883173.html \
-		test_bug895305.html \
-		test_bug895091.html \
-		test_bug919265.html \
-		test_can_play_type.html \
-		test_can_play_type_mpeg.html \
-		test_closing_connections.html \
-		test_constants.html \
-		test_controls.html \
-		test_currentTime.html \
-		test_decode_error.html \
-		test_defaultMuted.html \
-		test_delay_load.html \
-		test_error_on_404.html \
-		test_info_leak.html \
-		test_invalid_reject.html \
-		test_load.html \
-		test_load_candidates.html \
-		test_load_same_resource.html \
-		test_load_source.html \
-		test_loop.html \
-		test_metadata.html \
-		test_no_load_event.html \
-		test_networkState.html \
-		test_new_audio.html \
-		test_paused.html \
-		test_paused_after_ended.html \
-		test_play_events.html \
-		test_play_events_2.html \
-		test_playback_errors.html \
-		test_seekable1.html \
-		test_preload_actions.html \
-		test_preload_attribute.html \
-		test_progress.html \
-		test_reactivate.html \
-		test_readyState.html \
-		test_replay_metadata.html \
-		test_seek2.html \
-		test_seek_out_of_range.html \
-		test_source.html \
-		test_source_write.html \
-		test_source_null.html \
-		test_standalone.html \
-		test_volume.html \
-		test_video_to_canvas.html \
-		test_audiowrite.html \
-		test_mediarecorder_avoid_recursion.html \
-		test_mediarecorder_creation.html \
-		test_mediarecorder_record_audiocontext.html \
-		test_mediarecorder_record_immediate_stop.html \
-		test_mediarecorder_record_no_timeslice.html \
-		test_mediarecorder_record_nosrc.html \
-		test_mediarecorder_record_session.html \
-		test_mediarecorder_record_stopms.html \
-		test_mediarecorder_record_timeslice.html \
-		test_mediarecorder_reload_crash.html \
-		test_mediarecorder_state_transition.html \
-		test_mozHasAudio.html \
-		test_source_media.html \
-		test_autoplay_contentEditable.html \
-		test_decoder_disable.html \
-		test_playback.html \
-		test_seekLies.html \
-		test_media_sniffer.html \
-		contentType.sjs \
-		test_streams_srcObject.html \
-		test_reset_src.html \
-		test_streams_autoplay.html \
-		test_streams_element_capture.html \
-		test_streams_element_capture_reset.html \
-		test_streams_element_capture_createObjectURL.html \
-		test_streams_gc.html \
-		test_streams_tracks.html \
-		$(filter disabled-for-intermittent-failures--bug-608634, test_error_in_video_document.html) \
-		test_texttrack.html \
-		test_texttrackcue.html \
-		test_trackevent.html \
-		test_texttrackregion.html \
-		test_timeupdate_small_files.html \
-		test_unseekable.html \
-		test_VideoPlaybackQuality.html \
-		test_VideoPlaybackQuality_disabled.html \
-		test_webvtt_disabled.html \
-		$(NULL)
-
-# Don't run in suite
-ifndef MOZ_SUITE
-MOCHITEST_FILES += test_play_twice.html
-else
-$(filter disabled-pending-investigation--bug-598252, test_play_twice.html)
-endif
-
-# These tests are disabled until we figure out random failures.
-# When these tests are fixed, we should also make them backend-independent.
-#		test_resume.html \
-# Bug 492821:
-#   test_videoDocumentTitle.html
-# Bug 493692:
-#   test_preload_suspend.html
-# Bug 567954 and Bug 574586:
-#   test_mixed_principals.html
-# Disabled since we don't play Wave files standalone, for now
-#		test_audioDocumentTitle.html
-# Bug 751539:
-#		test_played.html
-
-# Disabled since it causes random memory corruption, bug 921622, so
-# the best-case scenario is that it results in random crashes while it
-# runs, like bug 918417, bug 920827, bug 923996, bug 928225, bug 929521
-# bug 930982, bug 932193. Worst-case but quite likely, it causes random
-# crashes and failures in other tests which run after it. Don't even think
-# about reenabling it on any platform unless you *know* that you have fixed
-# that. Then don't think about reenabling it on Windows until you know that
-# you have fixed the timeouts of bug 832768, bug 814533, bug 840742
-#		test_playback_rate.html \
-
-# The below tests are disabled on Windows due to frequent timeouts.
-# Bug 832768 and Bug 864682:
-#		test_buffered.html
-#		test_bug465498.html
-# Bug 707777:
-#		test_bug493187.html
-# Bug 897843:
-#		test_media_selection.html
-# Bug 832678, bug 795271, and bug 857424
-#		test_seek.html
-ifneq ($(OS_ARCH), WINNT)
-MOCHITEST_FILES += \
-		test_buffered.html \
-		test_bug465498.html \
-		test_bug493187.html \
-		test_media_selection.html \
-		test_seek.html \
-		$(NULL)
-endif
-
-# sample files
-MOCHITEST_FILES += \
-		320x240.ogv \
-		448636.ogv \
-		audio-overhang.ogg \
-		audio-gaps.ogg \
-		badtags.ogg \
-		beta-phrasebook.ogg \
-		big-buck-bunny-unseekable.mp4 \
-		bogus.ogv \
-		bug495129.ogv \
-		bug495794.ogg \
-		bug461281.ogg \
-		bug482461.ogv \
-		bug482461-theora.ogv \
-		bug498380.ogv \
-		bug498855-1.ogv \
-		bug498855-2.ogv \
-		bug498855-3.ogv \
-		bug499519.ogv \
-		bug500311.ogv \
-		bug500311.ogv^headers^ \
-		bug501279.ogg \
-		bug504613.ogv \
-		bug504644.ogv \
-		bug504843.ogv \
-		bug506094.ogv \
-		bug516323.ogv \
-		bug516323.indexed.ogv \
-		bug520493.ogg \
-		bug520500.ogg \
-		bug520908.ogv \
-		bug520908.ogv^headers^ \
-		bug523816.ogv \
-		bug533822.ogg \
-		bug557094.ogv \
-		bug556821.ogv \
-		bug580982.webm \
-		bug603918.webm \
-		bug604067.webm \
-		chain.ogv \
-		chain.ogg \
-		chain.opus \
-		variable-samplerate.ogg \
-		variable-samplerate.opus \
-		variable-channel.ogg \
-		variable-channel.opus \
-		chained-video.ogv \
-		chained-audio-video.ogg \
-		variable-preskip.opus \
-		dirac.ogg \
-		multiple-bos.ogg \
-		no-cues.webm \
-		owl.mp3 \
-		owl-funnier-id3.mp3 \
-		owl-funny-id3.mp3 \
-		split.webm \
-		seek.ogv \
-		seek.webm \
-		seek.yuv \
-		short-video.ogv \
-		small-shot.ogg \
-		small-shot.m4a \
-		small-shot.mp3 \
-		sound.ogg \
-		spacestorm-1000Hz-100ms.ogg \
-		test-1-mono.opus \
-		test-2-stereo.opus \
-		test-3-LCR.opus \
-		test-4-quad.opus \
-		test-5-5.0.opus \
-		test-6-5.1.opus \
-		test-7-6.1.opus \
-		test-8-7.1.opus \
-		vbr.mp3 \
-		video-overhang.ogg \
-		file_a4_tone.ogg \
-		detodos.opus \
-		notags.mp3 \
-		id3tags.mp3 \
-		basic.vtt \
-		region.vtt \
-		long.vtt \
-		bug883173.vtt \
-		$(NULL)
-
-# Wave sample files
-MOCHITEST_FILES += \
-		big.wav \
-		bogus.wav \
-		r11025_msadpcm_c1.wav \
-		r11025_s16_c1.wav \
-		r11025_s16_c1_trailing.wav \
-		r11025_u8_c1.wav \
-		r11025_u8_c1_trunc.wav \
-		r16000_u8_c1_list.wav \
-		wavedata_u8.wav \
-		wavedata_s16.wav \
-		wave_metadata_bad_len.wav \
-		wave_metadata_bad_no_null.wav \
-		wave_metadata_bad_utf8.wav \
-		wave_metadata_unknown_tag.wav \
-		wave_metadata_utf8.wav \
-		wave_metadata.wav \
-		audio.wav \
-		$(NULL)
-
-# Media plugin sample files
-MOCHITEST_FILES += \
-		gizmo.mp4 \
-		$(NULL)
-
-# Other files
-MOCHITEST_FILES += \
-		bogus.duh \
-		invalid-m0c0.opus \
-		invalid-m0c3.opus \
-		invalid-m1c0.opus \
-		invalid-m1c9.opus \
-		invalid-m2c0.opus \
-		invalid-m2c1.opus \
-		invalid-cmap-short.opus \
-		invalid-cmap-s0c0.opus \
-		invalid-cmap-s0c2.opus \
-		invalid-cmap-s1c2.opus \
-		$(NULL)
-
-# These tests contain backend-specific tests. Try to write backend
-# independent tests rather than adding to this list.
-ifdef MOZ_OGG
-MOCHITEST_FILES += \
-		test_can_play_type_ogg.html \
-		noContentLength.sjs \
-		test_seekable3.html \
-		test_a4_tone.html \
-		file_audio_event_adopt_iframe.html \
-		test_audio_event_adopt.html \
-		test_referer.html \
-		test_bug686137.html \
-		test_contentDuration1.html \
-		test_contentDuration2.html \
-		test_contentDuration3.html \
-		test_contentDuration4.html \
-		test_contentDuration5.html \
-		test_contentDuration6.html \
-		test_contentDuration7.html \
-		contentDuration1.sjs \
-		contentDuration2.sjs \
-		contentDuration3.sjs \
-		contentDuration4.sjs \
-		contentDuration5.sjs \
-		contentDuration6.sjs \
-		contentDuration7.sjs \
-		test_framebuffer.html \
-		test_seekable2.html \
-		test_chaining.html \
-		$(NULL)
-# Temporarily disabled for bug 754860
-#		test_bug726904.html
-else
-MOCHITEST_FILES += \
-		test_can_play_type_no_ogg.html \
-		$(NULL)
-endif
-
-ifdef MOZ_WEBM
-MOCHITEST_FILES += \
-		test_can_play_type_webm.html \
-		$(NULL)
-else
-MOCHITEST_FILES += \
-		test_can_play_type_no_webm.html \
-		$(NULL)
-endif
-
-ifdef MOZ_WAVE
-MOCHITEST_FILES += \
-		test_can_play_type_wave.html \
-		$(NULL)
-
-
-# Bug 759221
-MOCHITEST_FILES += \
-		test_fragment_play.html \
-		test_fragment_noplay.html \
-		test_wave_data_u8.html \
-		test_wave_data_s16.html \
-		$(NULL)
-else
-MOCHITEST_FILES += \
-		test_can_play_type_no_wave.html \
-		$(NULL)
-endif
new file mode 100644
--- /dev/null
+++ b/content/media/test/mochitest.ini
@@ -0,0 +1,326 @@
+# Media tests should be backend independent, i.e., not conditioned on ogg,
+# wave etc. (The only exception is the can_play_type tests, which
+# necessarily depend on the backend(s) configured.) As far as possible, each
+# test should work with any resource type. This makes it easy to add new
+# backends and reduces the amount of test duplication.
+
+# For each supported backend, resources that can be played by that backend
+# should be added to the lists in manifest.js. Media tests that aren't
+# testing for a bug in handling a specific resource type should pick one of
+# the lists in manifest.js and run the test for each resource in the list
+# that is supported in the current build (the canPlayType API is useful for
+# this).
+
+# To test whether a valid resource can simply be played through correctly,
+# and optionally that its metadata is read correctly, just add it to
+# gPlayTests in manifest.js. To test whether an invalid resource correctly
+# throws an error (and does not cause a crash or hang), just add it to
+# gErrorTests in manifest.js.
+
+# To test for a specific bug in handling a specific resource type, make the
+# test first check canPlayType for the type, and if it's not supported, just
+# do ok(true, "Type not supported") and stop the test.
+
+[DEFAULT]
+support-files =
+  320x240.ogv
+  448636.ogv
+  allowed.sjs
+  audio-gaps.ogg
+  audio-overhang.ogg
+  audio.wav
+  badtags.ogg
+  basic.vtt
+  beta-phrasebook.ogg
+  big-buck-bunny-unseekable.mp4
+  big.wav
+  bogus.duh
+  bogus.ogv
+  bogus.wav
+  bug461281.ogg
+  bug482461-theora.ogv
+  bug482461.ogv
+  bug495129.ogv
+  bug495794.ogg
+  bug498380.ogv
+  bug498855-1.ogv
+  bug498855-2.ogv
+  bug498855-3.ogv
+  bug499519.ogv
+  bug500311.ogv
+  bug500311.ogv^headers^
+  bug501279.ogg
+  bug504613.ogv
+  bug504644.ogv
+  bug504843.ogv
+  bug506094.ogv
+  bug516323.indexed.ogv
+  bug516323.ogv
+  bug520493.ogg
+  bug520500.ogg
+  bug520908.ogv
+  bug520908.ogv^headers^
+  bug523816.ogv
+  bug533822.ogg
+  bug556821.ogv
+  bug557094.ogv
+  bug580982.webm
+  bug603918.webm
+  bug604067.webm
+  bug883173.vtt
+  can_play_type_dash.js
+  can_play_type_mpeg.js
+  can_play_type_ogg.js
+  can_play_type_wave.js
+  can_play_type_webm.js
+  cancellable_request.sjs
+  chain.ogg
+  chain.ogv
+  chain.opus
+  chained-audio-video.ogg
+  chained-video.ogv
+  contentDuration1.sjs
+  contentDuration2.sjs
+  contentDuration3.sjs
+  contentDuration4.sjs
+  contentDuration5.sjs
+  contentDuration6.sjs
+  contentDuration7.sjs
+  contentType.sjs
+  detodos.opus
+  dirac.ogg
+  dynamic_redirect.sjs
+  dynamic_resource.sjs
+  file_a4_tone.ogg
+  file_access_controls.html
+  file_audio_event_adopt_iframe.html
+  fragment_noplay.js
+  fragment_play.js
+  gizmo.mp4
+  id3tags.mp3
+  invalid-cmap-s0c0.opus
+  invalid-cmap-s0c2.opus
+  invalid-cmap-s1c2.opus
+  invalid-cmap-short.opus
+  invalid-m0c0.opus
+  invalid-m0c3.opus
+  invalid-m1c0.opus
+  invalid-m1c9.opus
+  invalid-m2c0.opus
+  invalid-m2c1.opus
+  long.vtt
+  manifest.js
+  multiple-bos.ogg
+  no-cues.webm
+  noContentLength.sjs
+  notags.mp3
+  owl-funnier-id3.mp3
+  owl-funny-id3.mp3
+  owl.mp3
+  r11025_msadpcm_c1.wav
+  r11025_s16_c1.wav
+  r11025_s16_c1_trailing.wav
+  r11025_u8_c1.wav
+  r11025_u8_c1_trunc.wav
+  r16000_u8_c1_list.wav
+  reactivate_helper.html
+  redirect.sjs
+  referer.sjs
+  region.vtt
+  seek.ogv
+  seek.webm
+  seek.yuv
+  seek1.js
+  seek10.js
+  seek11.js
+  seek12.js
+  seek13.js
+  seek2.js
+  seek3.js
+  seek4.js
+  seek5.js
+  seek6.js
+  seek7.js
+  seek8.js
+  seek9.js
+  seekLies.sjs
+  short-video.ogv
+  small-shot.m4a
+  small-shot.mp3
+  small-shot.ogg
+  sound.ogg
+  spacestorm-1000Hz-100ms.ogg
+  split.webm
+  test-1-mono.opus
+  test-2-stereo.opus
+  test-3-LCR.opus
+  test-4-quad.opus
+  test-5-5.0.opus
+  test-6-5.1.opus
+  test-7-6.1.opus
+  test-8-7.1.opus
+  variable-channel.ogg
+  variable-channel.opus
+  variable-preskip.opus
+  variable-samplerate.ogg
+  variable-samplerate.opus
+  vbr.mp3
+  video-overhang.ogg
+  wave_metadata.wav
+  wave_metadata_bad_len.wav
+  wave_metadata_bad_no_null.wav
+  wave_metadata_bad_utf8.wav
+  wave_metadata_unknown_tag.wav
+  wave_metadata_utf8.wav
+  wavedata_s16.wav
+  wavedata_u8.wav
+
+[test_access_control.html]
+[test_audio1.html]
+[test_audio2.html]
+[test_autoplay.html]
+[test_bug448534.html]
+[test_bug463162.xhtml]
+[test_bug495145.html]
+[test_bug495300.html]
+[test_bug654550.html]
+[test_bug686942.html]
+[test_bug883173.html]
+[test_bug895305.html]
+[test_bug895091.html]
+[test_bug919265.html]
+[test_can_play_type.html]
+[test_can_play_type_mpeg.html]
+[test_closing_connections.html]
+[test_constants.html]
+[test_controls.html]
+[test_currentTime.html]
+[test_decode_error.html]
+[test_defaultMuted.html]
+[test_delay_load.html]
+[test_error_on_404.html]
+[test_info_leak.html]
+[test_invalid_reject.html]
+[test_load.html]
+[test_load_candidates.html]
+[test_load_same_resource.html]
+[test_load_source.html]
+[test_loop.html]
+[test_metadata.html]
+[test_no_load_event.html]
+[test_networkState.html]
+[test_new_audio.html]
+[test_paused.html]
+[test_paused_after_ended.html]
+[test_play_events.html]
+[test_play_events_2.html]
+[test_playback_errors.html]
+[test_seekable1.html]
+[test_preload_actions.html]
+[test_preload_attribute.html]
+[test_progress.html]
+[test_reactivate.html]
+[test_readyState.html]
+[test_replay_metadata.html]
+[test_seek2.html]
+[test_seek_out_of_range.html]
+[test_source.html]
+[test_source_write.html]
+[test_source_null.html]
+[test_standalone.html]
+[test_volume.html]
+[test_video_to_canvas.html]
+[test_audiowrite.html]
+[test_mediarecorder_creation.html]
+[test_mediarecorder_avoid_recursion.html]
+[test_mediarecorder_record_timeslice.html]
+[test_mediarecorder_record_audiocontext.html]
+[test_mediarecorder_record_stopms.html]
+[test_mediarecorder_record_nosrc.html]
+[test_mozHasAudio.html]
+[test_source_media.html]
+[test_autoplay_contentEditable.html]
+[test_decoder_disable.html]
+[test_mediarecorder_record_no_timeslice.html]
+[test_mediarecorder_reload_crash.html]
+[test_mediarecorder_record_immediate_stop.html]
+[test_mediarecorder_record_session.html]
+[test_playback.html]
+[test_seekLies.html]
+[test_media_sniffer.html]
+[test_streams_srcObject.html]
+[test_reset_src.html]
+[test_streams_autoplay.html]
+[test_streams_element_capture.html]
+[test_streams_element_capture_reset.html]
+[test_streams_element_capture_createObjectURL.html]
+[test_streams_gc.html]
+[test_streams_tracks.html]
+[test_texttrack.html]
+[test_texttrackcue.html]
+[test_trackevent.html]
+[test_texttrackregion.html]
+[test_timeupdate_small_files.html]
+[test_unseekable.html]
+[test_VideoPlaybackQuality.html]
+[test_VideoPlaybackQuality_disabled.html]
+[test_webvtt_disabled.html]
+
+# [test_audioDocumentTitle.html] # disabled - See bug 475110
+# [test_error_in_video_document.html] # disabled - See bug 608634
+# [test_mixed_principals.html] # disabled - See bug 567954 and 574586
+# [test_playback_rate_playpause.html] # disabled - See bug 897108
+# [test_played.html] # disabled - See bug 751539
+# [test_preload_suspend.html] # disabled - See bug 493692
+# [test_resume.html] # disabled - No bug :-(
+# [test_videoDocumentTitle.html] # disabled - See bug 492821
+
+# [test_playback_rate.html] # disabled - See bug 921622
+# Disabled since it causes random memory corruption, bug 921622, so
+# the best-case scenario is that it results in random crashes while it
+# runs, like bug 918417, bug 920827, bug 923996, bug 928225, bug 929521
+# bug 930982, bug 932193. Worst-case but quite likely, it causes random
+# crashes and failures in other tests which run after it. Don't even think
+# about reenabling it on any platform unless you *know* that you have fixed
+# that. Then don't think about reenabling it on Windows until you know that
+# you have fixed the timeouts of bug 832768, bug 814533, bug 840742
+
+[test_play_twice.html] skip-if = appname == "seamonkey" # See bug 598252
+
+[test_buffered.html] skip-if = os == "win" # See bug 832768 and 864682
+[test_bug465498.html] skip-if = os == "win" # See bug 832768 and 864682
+[test_bug493187.html] skip-if = os == "win" # See bug 707777
+[test_media_selection.html] skip-if = os == "win" # See bug 897843
+[test_seek.html] skip-if = os == "win" # See bug 832678, 795271, and 857424
+
+# The tests below contain backend-specific tests. Write backend independent
+# tests rather than adding to this list.
+
+[test_can_play_type_ogg.html] run-if = ogg
+[test_can_play_type_no_ogg.html] skip-if = ogg
+[test_a4_tone.html] run-if = ogg
+[test_audio_event_adopt.html] run-if = ogg
+[test_bug686137.html] run-if = ogg
+[test_chaining.html] run-if = ogg
+[test_contentDuration1.html] run-if = ogg
+[test_contentDuration2.html] run-if = ogg
+[test_contentDuration3.html] run-if = ogg
+[test_contentDuration4.html] run-if = ogg
+[test_contentDuration5.html] run-if = ogg
+[test_contentDuration6.html] run-if = ogg
+[test_contentDuration7.html] run-if = ogg
+[test_framebuffer.html] run-if = ogg
+[test_referer.html] run-if = ogg
+[test_seekable2.html] run-if = ogg
+[test_seekable3.html] run-if = ogg
+# [test_bug726904.html] run-if = ogg # disabled - See bug 754860
+
+[test_can_play_type_webm.html] run-if = webm
+[test_can_play_type_no_webm.html] skip-if = webm
+
+[test_can_play_type_wave.html] run-if = wave
+[test_can_play_type_no_wave.html] skip-if = wave
+[test_fragment_noplay.html] run-if = wave
+[test_fragment_play.html] run-if = wave
+[test_wave_data_s16.html] run-if = wave
+[test_wave_data_u8.html] run-if = wave
--- a/content/media/test/moz.build
+++ b/content/media/test/moz.build
@@ -1,6 +1,7 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+MOCHITEST_MANIFESTS += ['mochitest.ini']
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -189,16 +189,21 @@
 
 static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
 
 #if defined(DEBUG_bryner) || defined(DEBUG_chb)
 //#define DEBUG_DOCSHELL_FOCUS
 #define DEBUG_PAGE_CACHE
 #endif
 
+#ifdef XP_WIN
+#include <process.h>
+#define getpid _getpid
+#endif
+
 using namespace mozilla;
 using namespace mozilla::dom;
 
 // True means sUseErrorPages has been added to preferences var cache.
 static bool gAddedPreferencesVarCache = false;
 
 bool nsDocShell::sUseErrorPages = false;
 
@@ -791,18 +796,21 @@ nsDocShell::nsDocShell():
     if (gDocShellLeakLog)
         PR_LOG(gDocShellLeakLog, PR_LOG_DEBUG, ("DOCSHELL %p created\n", this));
 #endif
 
 #ifdef DEBUG
   // We're counting the number of |nsDocShells| to help find leaks
   ++gNumberOfDocShells;
   if (!PR_GetEnv("MOZ_QUIET")) {
-      printf("++DOCSHELL %p == %ld [id = %llu]\n", (void*) this,
-             gNumberOfDocShells, SafeCast<unsigned long long>(mHistoryID));
+      printf_stderr("++DOCSHELL %p == %ld [pid = %d] [id = %llu]\n",
+                    (void*) this,
+                    gNumberOfDocShells,
+                    getpid(),
+                    SafeCast<unsigned long long>(mHistoryID));
   }
 #endif
 }
 
 nsDocShell::~nsDocShell()
 {
     Destroy();
 
@@ -820,18 +828,21 @@ nsDocShell::~nsDocShell()
     if (gDocShellLeakLog)
         PR_LOG(gDocShellLeakLog, PR_LOG_DEBUG, ("DOCSHELL %p destroyed\n", this));
 #endif
 
 #ifdef DEBUG
     // We're counting the number of |nsDocShells| to help find leaks
     --gNumberOfDocShells;
     if (!PR_GetEnv("MOZ_QUIET")) {
-        printf("--DOCSHELL %p == %ld [id = %llu]\n", (void*) this,
-               gNumberOfDocShells, SafeCast<unsigned long long>(mHistoryID));
+        printf_stderr("--DOCSHELL %p == %ld [pid = %d] [id = %llu]\n",
+                      (void*) this,
+                      gNumberOfDocShells,
+                      getpid(),
+                      SafeCast<unsigned long long>(mHistoryID));
     }
 #endif
 }
 
 nsresult
 nsDocShell::Init()
 {
     nsresult rv = nsDocLoader::Init();
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -232,16 +232,25 @@ class nsIScriptTimeoutHandler;
 #ifdef ANDROID
 #include <android/log.h>
 #endif
 
 #ifdef PR_LOGGING
 static PRLogModuleInfo* gDOMLeakPRLog;
 #endif
 
+#ifdef XP_LINUX
+#include <unistd.h> // for getpid()
+#endif
+
+#ifdef XP_WIN
+#include <process.h>
+#define getpid _getpid
+#endif
+
 static const char kStorageEnabled[] = "dom.storage.enabled";
 
 using namespace mozilla;
 using namespace mozilla::dom;
 using namespace mozilla::dom::ipc;
 using mozilla::TimeStamp;
 using mozilla::TimeDuration;
 
@@ -1116,20 +1125,22 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalW
       gDumpFile = stdout;
     }
   }
 
   mSerial = ++gSerialCounter;
 
 #ifdef DEBUG
   if (!PR_GetEnv("MOZ_QUIET")) {
-    printf("++DOMWINDOW == %d (%p) [serial = %d] [outer = %p]\n", gRefCnt,
-           static_cast<void*>(static_cast<nsIScriptGlobalObject*>(this)),
-           gSerialCounter,
-           static_cast<void*>(static_cast<nsIScriptGlobalObject*>(aOuterWindow)));
+    printf_stderr("++DOMWINDOW == %d (%p) [pid = %d] [serial = %d] [outer = %p]\n",
+                  gRefCnt,
+                  static_cast<void*>(static_cast<nsIScriptGlobalObject*>(this)),
+                  getpid(),
+                  gSerialCounter,
+                  static_cast<void*>(static_cast<nsIScriptGlobalObject*>(aOuterWindow)));
   }
 #endif
 
 #ifdef PR_LOGGING
   if (gDOMLeakPRLog)
     PR_LOG(gDOMLeakPRLog, PR_LOG_DEBUG,
            ("DOMWINDOW %p created outer=%p", this, aOuterWindow));
 #endif
@@ -1192,19 +1203,23 @@ nsGlobalWindow::~nsGlobalWindow()
       // Data URLs can be very long, so truncate to avoid flooding the log.
       const uint32_t maxURLLength = 1000;
       if (url.Length() > maxURLLength) {
         url.Truncate(maxURLLength);
       }
     }
 
     nsGlobalWindow* outer = static_cast<nsGlobalWindow*>(mOuterWindow.get());
-    printf("--DOMWINDOW == %d (%p) [serial = %d] [outer = %p] [url = %s]\n",
-           gRefCnt, static_cast<void*>(static_cast<nsIScriptGlobalObject*>(this)),
-           mSerial, static_cast<void*>(static_cast<nsIScriptGlobalObject*>(outer)), url.get());
+    printf_stderr("--DOMWINDOW == %d (%p) [pid = %d] [serial = %d] [outer = %p] [url = %s]\n",
+                  gRefCnt,
+                  static_cast<void*>(static_cast<nsIScriptGlobalObject*>(this)),
+                  getpid(),
+                  mSerial,
+                  static_cast<void*>(static_cast<nsIScriptGlobalObject*>(outer)),
+                  url.get());
   }
 #endif
 
 #ifdef PR_LOGGING
   if (gDOMLeakPRLog)
     PR_LOG(gDOMLeakPRLog, PR_LOG_DEBUG,
            ("DOMWINDOW %p destroyed", this));
 #endif
--- a/dom/bluetooth/BluetoothCommon.h
+++ b/dom/bluetooth/BluetoothCommon.h
@@ -93,16 +93,17 @@ extern bool gBluetoothDebugFlag;
  * When receiving a query about current play status from remote device, we'll
  * dispatch an event.
  */
 #define REQUEST_MEDIA_PLAYSTATUS_ID          "requestmediaplaystatus"
 
 // Bluetooth address format: xx:xx:xx:xx:xx:xx (or xx_xx_xx_xx_xx_xx)
 #define BLUETOOTH_ADDRESS_LENGTH 17
 #define BLUETOOTH_ADDRESS_NONE   "00:00:00:00:00:00"
+#define BLUETOOTH_ADDRESS_BYTES  6
 
 BEGIN_BLUETOOTH_NAMESPACE
 
 enum BluetoothSocketType {
   RFCOMM = 1,
   SCO    = 2,
   L2CAP  = 3,
   EL2CAP = 4
--- a/dom/bluetooth/BluetoothServiceBluedroid.cpp
+++ b/dom/bluetooth/BluetoothServiceBluedroid.cpp
@@ -58,25 +58,29 @@ private:
   BluetoothSignal mSignal;
 };
 
 /**
  *  Static variables
  */
 static bluetooth_device_t* sBtDevice;
 static const bt_interface_t* sBtInterface;
+static bool sAdapterDiscoverable = false;
 static bool sIsBtEnabled = false;
-static bool sAdapterDiscoverable = false;
 static nsString sAdapterBdAddress;
 static nsString sAdapterBdName;
 static uint32_t sAdapterDiscoverableTimeout;
+static InfallibleTArray<nsString> sAdapterBondedAddressArray;
+static InfallibleTArray<BluetoothNamedValue> sRemoteDevicesPack;
 static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sBondingRunnableArray;
 static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sChangeDiscoveryRunnableArray;
+static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sGetPairedDeviceRunnableArray;
 static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sSetPropertyRunnableArray;
 static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sUnbondingRunnableArray;
+static nsTArray<int> sRequestedDeviceCountArray;
 
 /**
  *  Static callback functions
  */
 static void
 ClassToIcon(uint32_t aClass, nsAString& aRetIcon)
 {
   switch ((aClass & 0x1f00) >> 8) {
@@ -163,17 +167,18 @@ AdapterStateChangeCallback(bt_state_t aS
   if (aStatus == BT_STATE_ON) {
     sIsBtEnabled = true;
     signalName = NS_LITERAL_STRING("AdapterAdded");
   } else {
     sIsBtEnabled = false;
     signalName = NS_LITERAL_STRING("Disabled");
   }
 
-  BluetoothSignal signal(signalName, NS_LITERAL_STRING(KEY_MANAGER), BluetoothValue(true));
+  BluetoothSignal signal(signalName, NS_LITERAL_STRING(KEY_MANAGER),
+                         BluetoothValue(true));
   nsRefPtr<DistributeBluetoothSignalTask>
     t = new DistributeBluetoothSignalTask(signal);
   if (NS_FAILED(NS_DispatchToMainThread(t))) {
     NS_WARNING("Failed to dispatch to main thread!");
   }
 }
 
 static void
@@ -246,23 +251,40 @@ AdapterPropertiesChangeCallback(bt_statu
       propertiesArray.AppendElement(
         BluetoothNamedValue(NS_LITERAL_STRING("Discoverable"), propertyValue));
     } else if (p.type == BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT) {
       propertyValue = sAdapterDiscoverableTimeout = *(uint32_t*)p.val;
       propertiesArray.AppendElement(
         BluetoothNamedValue(NS_LITERAL_STRING("DiscoverableTimeout"),
                             propertyValue));
     } else if (p.type == BT_PROPERTY_ADAPTER_BONDED_DEVICES) {
-      //FIXME: This will be implemented in the later patchset
-      return;
+      // We have to cache addresses of bonded devices. Unlike BlueZ,
+      // bluedroid would not send an another BT_PROPERTY_ADAPTER_BONDED_DEVICES
+      // event after bond completed
+      bt_bdaddr_t* deviceBdAddressTypes = (bt_bdaddr_t*)p.val;
+      int numOfAddresses = p.len / BLUETOOTH_ADDRESS_BYTES;
+      BT_LOGD("Adapter property: BONDED_DEVICES. Count: %d", numOfAddresses);
+
+      // Whenever reloading paired devices, force refresh
+      sAdapterBondedAddressArray.Clear();
+
+      for (int index = 0; index < numOfAddresses; index++) {
+        nsAutoString deviceBdAddress;
+        BdAddressTypeToString(deviceBdAddressTypes + index, deviceBdAddress);
+        sAdapterBondedAddressArray.AppendElement(deviceBdAddress);
+      }
+
+      propertyValue = sAdapterBondedAddressArray;
+      propertiesArray.AppendElement(
+        BluetoothNamedValue(NS_LITERAL_STRING("Devices"), propertyValue));
     } else if (p.type == BT_PROPERTY_UUIDS) {
       //FIXME: This will be implemented in the later patchset
       return;
     } else {
-      BT_LOGR("Unhandled adapter property type: %d", p.type);
+      BT_LOGD("Unhandled adapter property type: %d", p.type);
       return;
     }
 
     BluetoothValue value(propertiesArray);
     BluetoothSignal signal(NS_LITERAL_STRING("PropertyChanged"),
                            NS_LITERAL_STRING(KEY_ADAPTER), value);
     nsRefPtr<DistributeBluetoothSignalTask>
       t = new DistributeBluetoothSignalTask(signal);
@@ -274,50 +296,86 @@ AdapterPropertiesChangeCallback(bt_statu
     if (!sSetPropertyRunnableArray.IsEmpty()) {
       DispatchBluetoothReply(sSetPropertyRunnableArray[0], BluetoothValue(true),
                              EmptyString());
       sSetPropertyRunnableArray.RemoveElementAt(0);
     }
   }
 }
 
+/*
+ * RemoteDevicePropertiesChangeCallback will be called, as the
+ * following conditions:
+ * 1. When BT is turning on, bluedroid automatically execute this callback
+ * 2. When get_remote_device_properties()
+ */
 static void
 RemoteDevicePropertiesChangeCallback(bt_status_t aStatus,
                                      bt_bdaddr_t *aBdAddress,
                                      int aNumProperties,
                                      bt_property_t *aProperties)
 {
   MOZ_ASSERT(!NS_IsMainThread());
 
-  // First, get remote device bd_address since it will be the key of
-  // return name value pair.
+  if (sRequestedDeviceCountArray.IsEmpty()) {
+    MOZ_ASSERT(sGetPairedDeviceRunnableArray.IsEmpty());
+    return;
+  }
+
+  sRequestedDeviceCountArray[0]--;
+
+  InfallibleTArray<BluetoothNamedValue> props;
+
   nsString remoteDeviceBdAddress;
   BdAddressTypeToString(aBdAddress, remoteDeviceBdAddress);
-
-  InfallibleTArray<BluetoothNamedValue> deviceProperties;
+  props.AppendElement(
+    BluetoothNamedValue(NS_LITERAL_STRING("Address"), remoteDeviceBdAddress));
 
   for (int i = 0; i < aNumProperties; ++i) {
     bt_property_t p = aProperties[i];
 
     if (p.type == BT_PROPERTY_BDNAME) {
       BluetoothValue propertyValue = NS_ConvertUTF8toUTF16((char*)p.val);
-      deviceProperties.AppendElement(
+      props.AppendElement(
         BluetoothNamedValue(NS_LITERAL_STRING("Name"), propertyValue));
     } else if (p.type == BT_PROPERTY_CLASS_OF_DEVICE) {
       uint32_t cod = *(uint32_t*)p.val;
-      deviceProperties.AppendElement(
+      props.AppendElement(
         BluetoothNamedValue(NS_LITERAL_STRING("Class"), BluetoothValue(cod)));
+
       nsString icon;
       ClassToIcon(cod, icon);
-      deviceProperties.AppendElement(
+      props.AppendElement(
         BluetoothNamedValue(NS_LITERAL_STRING("Icon"), BluetoothValue(icon)));
     } else {
-      BT_LOGR("Other non-handled device properties. Type: %d", p.type);
+      BT_LOGD("Other non-handled device properties. Type: %d", p.type);
     }
   }
+
+  // Use address as the index
+  sRemoteDevicesPack.AppendElement(
+    BluetoothNamedValue(remoteDeviceBdAddress, props));
+
+  if (sRequestedDeviceCountArray[0] == 0) {
+    MOZ_ASSERT(!sGetPairedDeviceRunnableArray.IsEmpty());
+
+    if (sGetPairedDeviceRunnableArray.IsEmpty()) {
+      BT_LOGR("No runnable to return");
+      return;
+    }
+
+    DispatchBluetoothReply(sGetPairedDeviceRunnableArray[0],
+                           sRemoteDevicesPack, EmptyString());
+
+    // After firing it, clean up cache
+    sRemoteDevicesPack.Clear();
+
+    sRequestedDeviceCountArray.RemoveElementAt(0);
+    sGetPairedDeviceRunnableArray.RemoveElementAt(0);
+  }
 }
 
 static void
 DeviceFoundCallback(int aNumProperties, bt_property_t *aProperties)
 {
   MOZ_ASSERT(!NS_IsMainThread());
 
   BluetoothValue propertyValue;
@@ -439,30 +497,48 @@ SspRequestCallback(bt_bdaddr_t* aRemoteB
 }
 
 static void
 BondStateChangedCallback(bt_status_t aStatus, bt_bdaddr_t* aRemoteBdAddress,
                          bt_bond_state_t aState)
 {
   MOZ_ASSERT(!NS_IsMainThread());
 
+  nsAutoString remoteAddress;
+  BdAddressTypeToString(aRemoteBdAddress, remoteAddress);
+  bool bonded;
+
   if (aState == BT_BOND_STATE_BONDING) {
-    //We don't need to handle bonding state
+    // We don't need to handle bonding state
     return;
+  } else if (aState == BT_BOND_STATE_NONE) {
+    bonded = false;
+    sAdapterBondedAddressArray.RemoveElement(remoteAddress);
+  } else if (aState == BT_BOND_STATE_BONDED) {
+    bonded = true;
+    sAdapterBondedAddressArray.AppendElement(remoteAddress);
   }
 
-  bool bonded = (aState == BT_BOND_STATE_BONDED);
-  nsAutoString remoteAddress;
-  BdAddressTypeToString(aRemoteBdAddress, remoteAddress);
+  // Update bonded address list to BluetoothAdapter
+  InfallibleTArray<BluetoothNamedValue> propertiesChangeArray;
+  propertiesChangeArray.AppendElement(
+    BluetoothNamedValue(NS_LITERAL_STRING("Devices"),
+                        sAdapterBondedAddressArray));
+  BluetoothValue value(propertiesChangeArray);
+  BluetoothSignal signal(NS_LITERAL_STRING("PropertyChanged"),
+                         NS_LITERAL_STRING(KEY_ADAPTER),
+                         BluetoothValue(propertiesChangeArray));
+  NS_DispatchToMainThread(new DistributeBluetoothSignalTask(signal));
+
+  // Update bonding status to gaia
   InfallibleTArray<BluetoothNamedValue> propertiesArray;
   propertiesArray.AppendElement(
     BluetoothNamedValue(NS_LITERAL_STRING("address"), remoteAddress));
   propertiesArray.AppendElement(
     BluetoothNamedValue(NS_LITERAL_STRING("status"), bonded));
-
   BluetoothSignal newSignal(NS_LITERAL_STRING(PAIRED_STATUS_CHANGED_ID),
                             NS_LITERAL_STRING(KEY_ADAPTER),
                             BluetoothValue(propertiesArray));
   NS_DispatchToMainThread(new DistributeBluetoothSignalTask(newSignal));
 
   if (bonded && !sBondingRunnableArray.IsEmpty()) {
     DispatchBluetoothReply(sBondingRunnableArray[0],
                            BluetoothValue(true), EmptyString());
@@ -629,38 +705,74 @@ BluetoothServiceBluedroid::GetDefaultAda
   MOZ_ASSERT(NS_IsMainThread());
 
   nsRefPtr<BluetoothReplyRunnable> runnable(aRunnable);
 
   BluetoothValue v = InfallibleTArray<BluetoothNamedValue>();
   v.get_ArrayOfBluetoothNamedValue().AppendElement(
     BluetoothNamedValue(NS_LITERAL_STRING("Name"), sAdapterBdName));
 
+  v.get_ArrayOfBluetoothNamedValue().AppendElement(
+    BluetoothNamedValue(NS_LITERAL_STRING("Devices"),
+                        sAdapterBondedAddressArray));
+
   nsAutoString replyError;
   DispatchBluetoothReply(runnable.get(), v, replyError);
 
   runnable.forget();
 
   return NS_OK;
 }
 
 nsresult
 BluetoothServiceBluedroid::GetConnectedDevicePropertiesInternal(
   uint16_t aProfileId, BluetoothReplyRunnable* aRunnable)
 {
+  MOZ_ASSERT(NS_IsMainThread());
+
+  //FIXME: This will be implemented in later patches
+  DispatchBluetoothReply(aRunnable, BluetoothValue(true), EmptyString());
+
   return NS_OK;
-
 }
 
 nsresult
 BluetoothServiceBluedroid::GetPairedDevicePropertiesInternal(
   const nsTArray<nsString>& aDeviceAddress, BluetoothReplyRunnable* aRunnable)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
+  if (!IsReady()) {
+    NS_NAMED_LITERAL_STRING(errorStr, "Bluetooth service is not ready yet!");
+    DispatchBluetoothReply(aRunnable, BluetoothValue(), errorStr);
+    return NS_OK;
+  }
+
+  int requestedDeviceCount = aDeviceAddress.Length();
+  if (requestedDeviceCount == 0) {
+    InfallibleTArray<BluetoothNamedValue> emptyArr;
+    DispatchBluetoothReply(aRunnable, BluetoothValue(emptyArr), EmptyString());
+    return NS_OK;
+  }
+
+  for (int i = 0; i < requestedDeviceCount; i++) {
+    // Retrieve all properties of devices
+    bt_bdaddr_t addressType;
+    StringToBdAddressType(aDeviceAddress[i], &addressType);
+    int ret = sBtInterface->get_remote_device_properties(&addressType);
+    if (ret != BT_STATUS_SUCCESS) {
+      DispatchBluetoothReply(aRunnable, BluetoothValue(true),
+                             NS_LITERAL_STRING("GetPairedDeviceFailed"));
+      return NS_OK;
+    }
+  }
+
+  sRequestedDeviceCountArray.AppendElement(requestedDeviceCount);
+  sGetPairedDeviceRunnableArray.AppendElement(aRunnable);
+
   return NS_OK;
 }
 
 nsresult
 BluetoothServiceBluedroid::StartDiscoveryInternal(
   BluetoothReplyRunnable* aRunnable)
 {
   MOZ_ASSERT(NS_IsMainThread());
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1285,23 +1285,43 @@ ContentChild::RecvGarbageCollect()
 bool
 ContentChild::RecvCycleCollect()
 {
     nsJSContext::GarbageCollectNow(JS::gcreason::DOM_IPC);
     nsJSContext::CycleCollectNow();
     return true;
 }
 
+#ifdef MOZ_NUWA_PROCESS
+static void
+OnFinishNuwaPreparation ()
+{
+    MakeNuwaProcess();
+}
+#endif
+
 static void
 PreloadSlowThings()
 {
     // This fetches and creates all the built-in stylesheets.
     nsLayoutStylesheetCache::UserContentSheet();
 
     TabChild::PreloadSlowThings();
+
+#ifdef MOZ_NUWA_PROCESS
+    // After preload of slow things, start freezing threads.
+    if (IsNuwaProcess()) {
+        // Perform GC before freezing the Nuwa process to reduce memory usage.
+        ContentChild::GetSingleton()->RecvGarbageCollect();
+
+        MessageLoop::current()->
+                PostTask(FROM_HERE,
+                         NewRunnableFunction(OnFinishNuwaPreparation));
+    }
+#endif
 }
 
 bool
 ContentChild::RecvAppInfo(const nsCString& version, const nsCString& buildID,
                           const nsCString& name, const nsCString& UAName)
 {
     mAppInfo.version.Assign(version);
     mAppInfo.buildID.Assign(buildID);
--- a/dom/plugins/base/nsPluginInstanceOwner.cpp
+++ b/dom/plugins/base/nsPluginInstanceOwner.cpp
@@ -1040,23 +1040,23 @@ nsresult nsPluginInstanceOwner::EnsureCa
   if (mCachedAttrParamValues)
     return NS_OK;
 
   NS_PRECONDITION(((mNumCachedAttrs + mNumCachedParams) == 0) &&
                     !mCachedAttrParamNames,
                   "re-cache of attrs/params not implemented! use the DOM "
                     "node directy instead");
 
-  // Convert to a 16-bit count. Subtract 2 in case we add an extra
-  // "src" or "wmode" entry below.
+  // Convert to a 16-bit count. Subtract 3 in case we add an extra
+  // "src", "wmode", or "codebase" entry below.
   uint32_t cattrs = mContent->GetAttrCount();
-  if (cattrs < 0x0000FFFD) {
+  if (cattrs < 0x0000FFFC) {
     mNumCachedAttrs = static_cast<uint16_t>(cattrs);
   } else {
-    mNumCachedAttrs = 0xFFFD;
+    mNumCachedAttrs = 0xFFFC;
   }
 
   // Check if we are java for special codebase handling
   const char* mime = nullptr;
   bool isJava = NS_SUCCEEDED(mInstance->GetMIMEType(&mime)) && mime &&
                 nsPluginHost::IsJavaMIMEType(mime);
 
   // now, we need to find all the PARAM tags that are children of us
@@ -1076,17 +1076,17 @@ nsresult nsPluginInstanceOwner::EnsureCa
   // Making DOM method calls can cause our frame to go away.
   nsCOMPtr<nsIPluginInstanceOwner> kungFuDeathGrip(this);
 
   nsCOMPtr<nsIDOMHTMLCollection> allParams;
   NS_NAMED_LITERAL_STRING(xhtml_ns, "http://www.w3.org/1999/xhtml");
   mydomElement->GetElementsByTagNameNS(xhtml_ns, NS_LITERAL_STRING("param"),
                                        getter_AddRefs(allParams));
   if (allParams) {
-    uint32_t numAllParams; 
+    uint32_t numAllParams;
     allParams->GetLength(&numAllParams);
     for (uint32_t i = 0; i < numAllParams; i++) {
       nsCOMPtr<nsIDOMNode> pnode;
       allParams->Item(i, getter_AddRefs(pnode));
       nsCOMPtr<nsIDOMElement> domelement = do_QueryInterface(pnode);
       if (domelement) {
         // Ignore params without a name attribute.
         nsAutoString name;
@@ -1139,22 +1139,35 @@ nsresult nsPluginInstanceOwner::EnsureCa
   nsAutoString data;
   if (mContent->Tag() == nsGkAtoms::object &&
       !mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
       mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::data, data) &&
       !data.IsEmpty()) {
     mNumCachedAttrs++;
   }
 
-  // "plugins.force.wmode" preference is forcing wmode type for plugins
-  // possible values - "opaque", "transparent", "windowed"
-  nsAdoptingCString wmodeType = Preferences::GetCString("plugins.force.wmode");
-  if (!wmodeType.IsEmpty()) {
+  // "plugins.force.wmode" forces us to send a specific "wmode" parameter,
+  // used by flash to select a rendering mode. Common values include
+  // "opaque", "transparent", "windowed", "direct"
+  nsCString wmodeType;
+  nsAdoptingCString wmodePref = Preferences::GetCString("plugins.force.wmode");
+  if (!wmodePref.IsEmpty()) {
     mNumCachedAttrs++;
+    wmodeType = wmodePref;
   }
+#if defined(XP_WIN) || defined(XP_LINUX)
+  // Bug 923745 - Until we support windowed mode plugins in content processes,
+  // force flash to use a windowless rendering mode. This hack should go away
+  // when bug 923746 lands. (OS X plugins always use some native widgets, so
+  // unfortunately this does not help there)
+  else if (XRE_GetProcessType() == GeckoProcessType_Content) {
+    mNumCachedAttrs++;
+    wmodeType.AssignLiteral("transparent");
+  }
+#endif
 
   // (Bug 738396) java has quirks in its codebase parsing, pass the
   // absolute codebase URI as content sees it.
   bool addCodebase = false;
   nsAutoCString codebaseStr;
   if (isJava) {
     nsCOMPtr<nsIObjectLoadingContent> objlc = do_QueryInterface(mContent);
     NS_ENSURE_TRUE(objlc, NS_ERROR_UNEXPECTED);
--- a/dom/system/gonk/RILContentHelper.js
+++ b/dom/system/gonk/RILContentHelper.js
@@ -445,17 +445,17 @@ IccCardLockError.prototype = {
     this.retryCount = retryCount;
   },
 };
 
 function RILContentHelper() {
   this.updateDebugFlag();
 
   this.numClients = gNumRadioInterfaces;
-  debug("Number of clients: " + this.numClients);
+  if (DEBUG) debug("Number of clients: " + this.numClients);
 
   this.rilContexts = [];
   this.voicemailInfos = [];
   this.voicemailStatuses = [];
   for (let clientId = 0; clientId < this.numClients; clientId++) {
     this.rilContexts[clientId] = {
       cardState:            RIL.GECKO_CARDSTATE_UNKNOWN,
       networkSelectionMode: RIL.GECKO_NETWORK_SELECTION_UNKNOWN,
@@ -600,17 +600,17 @@ RILContentHelper.prototype = {
     this.getRilContext = function getRilContext(clientId) {
       return this.rilContexts[clientId];
     };
 
     for (let cId = 0; cId < this.numClients; cId++) {
       let rilContext =
         cpmm.sendSyncMessage("RIL:GetRilContext", {clientId: cId})[0];
       if (!rilContext) {
-        debug("Received null rilContext from chrome process.");
+        if (DEBUG) debug("Received null rilContext from chrome process.");
         continue;
       }
       this.rilContexts[cId].cardState = rilContext.cardState;
       this.rilContexts[cId].networkSelectionMode = rilContext.networkSelectionMode;
       this.updateIccInfo(cId, rilContext.iccInfo);
       this.updateConnectionInfo(rilContext.voice, this.rilContexts[cId].voiceConnectionInfo);
       this.updateConnectionInfo(rilContext.data, this.rilContexts[cId].dataConnectionInfo);
     }
@@ -905,17 +905,17 @@ RILContentHelper.prototype = {
         lockType: lockType,
         requestId: requestId
       }
     });
     return request;
   },
 
   sendMMI: function sendMMI(clientId, window, mmi) {
-    debug("Sending MMI " + mmi);
+    if (DEBUG) debug("Sending MMI " + mmi);
     if (!window) {
       throw Components.Exception("Can't get window object",
                                  Cr.NS_ERROR_UNEXPECTED);
     }
     let request = Services.DOMRequest.createRequest(window);
     let requestId = this.getRequestId(request);
     // We need to save the global window to get the proper MMIError
     // constructor once we get the reply from the parent process.
@@ -927,17 +927,17 @@ RILContentHelper.prototype = {
         mmi: mmi,
         requestId: requestId
       }
     });
     return request;
   },
 
   cancelMMI: function cancelMMI(clientId, window) {
-    debug("Cancel MMI");
+    if (DEBUG) debug("Cancel MMI");
     if (!window) {
       throw Components.Exception("Can't get window object",
                                  Cr.NS_ERROR_UNEXPECTED);
     }
     let request = Services.DOMRequest.createRequest(window);
     let requestId = this.getRequestId(request);
     cpmm.sendAsyncMessage("RIL:CancelMMI", {
       clientId: clientId,
@@ -1438,55 +1438,55 @@ RILContentHelper.prototype = {
     let index = listeners.indexOf(listener);
     if (index != -1) {
       listeners.splice(index, 1);
       if (DEBUG) debug("Unregistered listener: " + listener);
     }
   },
 
   registerMobileConnectionMsg: function registerMobileConnectionMsg(clientId, listener) {
-    debug("Registering for mobile connection related messages");
+    if (DEBUG) debug("Registering for mobile connection related messages");
     this.registerListener("_mobileConnectionListeners", clientId, listener);
     cpmm.sendAsyncMessage("RIL:RegisterMobileConnectionMsg");
   },
 
   unregisterMobileConnectionMsg: function unregisteMobileConnectionMsg(clientId, listener) {
     this.unregisterListener("_mobileConnectionListeners", clientId, listener);
   },
 
   registerVoicemailMsg: function registerVoicemailMsg(listener) {
-    debug("Registering for voicemail-related messages");
+    if (DEBUG) debug("Registering for voicemail-related messages");
     // To follow the listener registration scheme, we add a dummy clientId 0.
     // All voicemail events are routed to listener for client id 0.
     // See |handleVoicemailNotification|.
     this.registerListener("_voicemailListeners", 0, listener);
     cpmm.sendAsyncMessage("RIL:RegisterVoicemailMsg");
   },
 
   unregisterVoicemailMsg: function unregisteVoicemailMsg(listener) {
     // To follow the listener unregistration scheme, we add a dummy clientId 0.
     // All voicemail events are routed to listener for client id 0.
     // See |handleVoicemailNotification|.
     this.unregisterListener("_voicemailListeners", 0, listener);
   },
 
   registerCellBroadcastMsg: function registerCellBroadcastMsg(listener) {
-    debug("Registering for Cell Broadcast related messages");
+    if (DEBUG) debug("Registering for Cell Broadcast related messages");
     //TODO: Bug 921326 - Cellbroadcast API: support multiple sim cards
     this.registerListener("_cellBroadcastListeners", 0, listener);
     cpmm.sendAsyncMessage("RIL:RegisterCellBroadcastMsg");
   },
 
   unregisterCellBroadcastMsg: function unregisterCellBroadcastMsg(listener) {
     //TODO: Bug 921326 - Cellbroadcast API: support multiple sim cards
     this.unregisterListener("_cellBroadcastListeners", 0, listener);
   },
 
   registerIccMsg: function registerIccMsg(clientId, listener) {
-    debug("Registering for ICC related messages");
+    if (DEBUG) debug("Registering for ICC related messages");
     this.registerListener("_iccListeners", clientId, listener);
     cpmm.sendAsyncMessage("RIL:RegisterIccMsg");
   },
 
   unregisterIccMsg: function unregisterIccMsg(clientId, listener) {
     this.unregisterListener("_iccListeners", clientId, listener);
   },
 
@@ -1569,17 +1569,19 @@ RILContentHelper.prototype = {
       return;
     }
 
     Services.DOMRequest.fireDetailedError(request, detailedError);
   },
 
   receiveMessage: function receiveMessage(msg) {
     let request;
-    debug("Received message '" + msg.name + "': " + JSON.stringify(msg.json));
+    if (DEBUG) {
+      debug("Received message '" + msg.name + "': " + JSON.stringify(msg.json));
+    }
 
     let data = msg.json.data;
     let clientId = msg.json.clientId;
     switch (msg.name) {
       case "RIL:CardStateChanged":
         if (this.rilContexts[clientId].cardState != data.cardState) {
           this.rilContexts[clientId].cardState = data.cardState;
           this._deliverEvent(clientId,
@@ -1778,19 +1780,21 @@ RILContentHelper.prototype = {
     if (errorMsg) {
       this.fireRequestError(requestId, errorMsg);
     } else {
       this.fireRequestSuccess(requestId, result);
     }
   },
 
   handleGetAvailableNetworks: function handleGetAvailableNetworks(message) {
-    debug("handleGetAvailableNetworks: " + JSON.stringify(message));
+    if (DEBUG) debug("handleGetAvailableNetworks: " + JSON.stringify(message));
     if (message.errorMsg) {
-      debug("Received error from getAvailableNetworks: " + message.errorMsg);
+      if (DEBUG) {
+        debug("Received error from getAvailableNetworks: " + message.errorMsg);
+      }
       this.fireRequestError(message.requestId, message.errorMsg);
       return;
     }
 
     let networks = message.networks;
     for (let i = 0; i < networks.length; i++) {
       let network = networks[i];
       let info = new MobileNetworkInfo();
@@ -1941,17 +1945,17 @@ RILContentHelper.prototype = {
     if (!message.success) {
       Services.DOMRequest.fireError(request, message.errorMsg);
       return;
     }
     Services.DOMRequest.fireSuccess(request, null);
   },
 
   handleSendCancelMMI: function handleSendCancelMMI(message) {
-    debug("handleSendCancelMMI " + JSON.stringify(message));
+    if (DEBUG) debug("handleSendCancelMMI " + JSON.stringify(message));
     let request = this.takeRequest(message.requestId);
     let requestWindow = this._windowsMap[message.requestId];
     delete this._windowsMap[message.requestId];
     if (!request) {
       return;
     }
 
     let success = message.success;
@@ -2008,17 +2012,17 @@ RILContentHelper.prototype = {
       }
       let handler = listener[name];
       if (typeof handler != "function") {
         throw new Error("No handler for " + name);
       }
       try {
         handler.apply(listener, args);
       } catch (e) {
-        debug("listener for " + name + " threw an exception: " + e);
+        if (DEBUG) debug("listener for " + name + " threw an exception: " + e);
       }
     }
   },
 
   /**
    * Helper for guarding us again invalid reason values for call forwarding.
    */
   _isValidCFReason: function _isValidCFReason(reason) {
--- a/dom/system/gonk/ril_worker.js
+++ b/dom/system/gonk/ril_worker.js
@@ -9900,30 +9900,29 @@ let StkCommandParamsFactory = {
     }
     textMsg.text = ctlv.value.identifier;
 
     return textMsg;
   },
 
   processSetupCall: function processSetupCall(cmdDetails, ctlvs) {
     let call = {};
-
-    for (let i = 0; i < ctlvs.length; i++) {
-      let ctlv = ctlvs[i];
-      if (ctlv.tag == COMPREHENSIONTLV_TAG_ALPHA_ID) {
-        if (!call.confirmMessage) {
-          call.confirmMessage = ctlv.value.identifier;
-        } else {
-          call.callMessage = ctlv.value.identifier;
-          break;
-        }
-      }
-    }
-
-    let ctlv = StkProactiveCmdHelper.searchForTag(COMPREHENSIONTLV_TAG_ADDRESS, ctlvs);
+    let iter = Iterator(ctlvs);
+
+    let ctlv = StkProactiveCmdHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+    if (ctlv) {
+      call.confirmMessage = ctlv.value.identifier;
+    }
+
+    ctlv = StkProactiveCmdHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+    if (ctlv) {
+      call.callMessage = ctlv.value.identifier;
+    }
+
+    ctlv = StkProactiveCmdHelper.searchForTag(COMPREHENSIONTLV_TAG_ADDRESS, ctlvs);
     if (!ctlv) {
       RIL.sendStkTerminalResponse({
         command: cmdDetails,
         resultCode: STK_RESULT_REQUIRED_VALUES_MISSING});
       throw new Error("Stk Set Up Call: Required value missing : Adress");
     }
     call.address = ctlv.value.number;
 
@@ -10425,18 +10424,22 @@ let StkProactiveCmdHelper = {
     let s = "";
     for (let i = 0; i < length; i++) {
       s += String.fromCharCode(GsmPDUHelper.readHexOctet());
     }
     return {url: s};
   },
 
   searchForTag: function searchForTag(tag, ctlvs) {
-    for (let i = 0; i < ctlvs.length; i++) {
-      let ctlv = ctlvs[i];
+    let iter = Iterator(ctlvs);
+    return this.searchForNextTag(tag, iter);
+  },
+
+  searchForNextTag: function searchForNextTag(tag, iter) {
+    for (let [index, ctlv] in iter) {
       if ((ctlv.tag & ~COMPREHENSIONTLV_FLAG_CR) == tag) {
         return ctlv;
       }
     }
     return null;
   },
 };
 StkProactiveCmdHelper[COMPREHENSIONTLV_TAG_COMMAND_DETAILS] = function COMPREHENSIONTLV_TAG_COMMAND_DETAILS(length) {
--- a/dom/system/gonk/tests/test_ril_worker_stk.js
+++ b/dom/system/gonk/tests/test_ril_worker_stk.js
@@ -337,16 +337,57 @@ add_test(function test_write_length() {
   do_check_eq(pduHelper.readHexOctet(), (length >> 16) & 0xff);
   do_check_eq(pduHelper.readHexOctet(), (length >> 8) & 0xff);
   do_check_eq(pduHelper.readHexOctet(), length & 0xff);
 
   run_next_test();
 });
 
 // Test Proactive commands.
+/**
+ * Verify Proactive command helper : searchForNextTag
+ */
+add_test(function test_stk_proactive_command_search_next_tag() {
+  let worker = newUint8Worker();
+  let pduHelper = worker.GsmPDUHelper;
+  let berHelper = worker.BerTlvHelper;
+  let stkHelper = worker.StkProactiveCmdHelper;
+
+  let tag_test = [
+    0xD0,
+    0x3C,
+    0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x31,
+    0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x32,
+    0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x33,
+    0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x34,
+    0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x35];
+
+  for (let i = 0; i < tag_test.length; i++) {
+    pduHelper.writeHexOctet(tag_test[i]);
+  }
+
+  let berTlv = berHelper.decode(tag_test.length);
+  let iter = Iterator(berTlv.value);
+  let tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+  do_check_eq(tlv.value.identifier, "alpha id 1");
+
+  tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+  do_check_eq(tlv.value.identifier, "alpha id 2");
+
+  tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+  do_check_eq(tlv.value.identifier, "alpha id 3");
+
+  tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+  do_check_eq(tlv.value.identifier, "alpha id 4");
+
+  tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter);
+  do_check_eq(tlv.value.identifier, "alpha id 5");
+
+  run_next_test();
+});
 
 /**
  * Verify Proactive Command : Refresh
  */
 add_test(function test_stk_proactive_command_refresh() {
   let worker = newUint8Worker();
   let pduHelper = worker.GsmPDUHelper;
   let berHelper = worker.BerTlvHelper;
--- a/dom/webidl/HTMLObjectElement.webidl
+++ b/dom/webidl/HTMLObjectElement.webidl
@@ -158,16 +158,25 @@ interface MozObjectLoadingContent {
   /**
    * This method will play a plugin that has been stopped by the
    * click-to-play plugins or play-preview features.
    */
   [ChromeOnly, Throws]
   void playPlugin();
 
   /**
+   * Forces a re-evaluation and reload of the tag, optionally invalidating its
+   * click-to-play state.  This can be used when the MIME type that provides a
+   * type has changed, for instance, to force the tag to re-evalulate the
+   * handler to use.
+   */
+  [ChromeOnly, Throws]
+  void reload(boolean aClearActivation);
+
+  /**
    * This attribute will return true if the current content type has been
    * activated, either explicitly or by passing checks that would have it be
    * click-to-play or play-preview.
    */
   [ChromeOnly]
   readonly attribute boolean activated;
 
   /**
--- a/dom/webidl/SVGFEComponentTransferElement.webidl
+++ b/dom/webidl/SVGFEComponentTransferElement.webidl
@@ -8,8 +8,10 @@
  *
  * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
  * liability, trademark and document use rules apply.
  */
 
 interface SVGFEComponentTransferElement : SVGElement {
   readonly attribute SVGAnimatedString in1;
 };
+
+SVGFEComponentTransferElement implements SVGFilterPrimitiveStandardAttributes;
--- a/dom/webidl/SVGFEGaussianBlurElement.webidl
+++ b/dom/webidl/SVGFEGaussianBlurElement.webidl
@@ -12,8 +12,10 @@
 
 interface SVGFEGaussianBlurElement : SVGElement {
   readonly attribute SVGAnimatedString in1;
   readonly attribute SVGAnimatedNumber stdDeviationX;
   readonly attribute SVGAnimatedNumber stdDeviationY;
 
   void setStdDeviation(float stdDeviationX, float stdDeviationY);
 };
+
+SVGFEGaussianBlurElement implements SVGFilterPrimitiveStandardAttributes;
--- a/editor/txmgr/tests/TestTXMgr.cpp
+++ b/editor/txmgr/tests/TestTXMgr.cpp
@@ -4573,21 +4573,26 @@ aggregation_batch_stress_test()
   printf("-----------------------------------------------------\n");
 
   AggregateTransactionFactory factory(3, 4, BATCH_FLAG);
 
   int32_t iterations =
 #ifdef DEBUG
   10
 #else
+#if defined(MOZ_ASAN) || defined(MOZ_WIDGET_ANDROID)
+  // See Bug 929985: 500 is too many for ASAN and Android, 100 is safe.
+  100
+#else
   //
   // 500 iterations sends 2,630,250 transactions through the system!!
   //
   500
 #endif
+#endif
   ;
   return stress_test(&factory, iterations);
 }
 
 int
 main (int argc, char *argv[])
 {
   ScopedXPCOM xpcom("nsITransactionManager");
--- a/gfx/2d/MacIOSurface.cpp
+++ b/gfx/2d/MacIOSurface.cpp
@@ -1,9 +1,16 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+// vim:set ts=2 sts=2 sw=2 et cin:
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
 #include "MacIOSurface.h"
+#include <OpenGL/gl.h>
 #include <QuartzCore/QuartzCore.h>
 #include <dlfcn.h>
 #include "mozilla/RefPtr.h"
 #include "mozilla/Assertions.h"
 
 using namespace mozilla;
 // IOSurface signatures
 #define IOSURFACE_FRAMEWORK_PATH \
--- a/gfx/layers/FrameMetrics.h
+++ b/gfx/layers/FrameMetrics.h
@@ -137,17 +137,18 @@ public:
   // an area bigger than the region we're compositing to. If we used the
   // viewport dimensions to calculate the displayport, we'd run into situations
   // where we're prerendering the wrong regions and the content may be clipped,
   // or too much of it prerendered. If the composition dimensions are the same as the
   // viewport dimensions, there is no need for this and we can just use the viewport
   // instead.
   //
   // This value is valid for nested scrollable layers as well, and is still
-  // relative to the layer tree origin.
+  // relative to the layer tree origin. This value is provided by Gecko at
+  // layout/paint time.
   ScreenIntRect mCompositionBounds;
 
   // ---------------------------------------------------------------------------
   // The following metrics are all in CSS pixels. They are not in any uniform
   // space, so each is explained separately.
   //
 
   // The area of a frame's contents that has been painted, relative to the
@@ -221,33 +222,30 @@ public:
   //
   // This is valid on any layer unless it has no content.
   CSSRect mScrollableRect;
 
   // ---------------------------------------------------------------------------
   // The following metrics are dimensionless.
   //
 
-  // The resolution that the current frame has been painted at.
-  //
-  // Every time this frame is composited and the compositor samples its
-  // transform, this metric is used to create a transform which is
-  // post-multiplied into the parent's transform. Since this only happens when
-  // we walk the layer tree, the resulting transform isn't stored here. Thus the
-  // resolution of parent layers is opaque to this metric.
+  // The incremental resolution that the current frame has been painted at
+  // relative to the parent frame's resolution. This information is provided
+  // by Gecko at layout/paint time.
   ParentLayerToLayerScale mResolution;
 
   // The cumulative resolution that the current frame has been painted at.
   // This is the product of our mResolution and the mResolutions of our parent frames.
+  // This information is provided by Gecko at layout/paint time.
   LayoutDeviceToLayerScale mCumulativeResolution;
 
   // The "user zoom". Content is painted by gecko at mResolution * mDevPixelsPerCSSPixel,
   // but will be drawn to the screen at mZoom. In the steady state, the
   // two will be the same, but during an async zoom action the two may
-  // diverge.
+  // diverge. This information is initialized in Gecko but updated in the APZC.
   CSSToScreenScale mZoom;
 
   // The conversion factor between CSS pixels and device pixels for this frame.
   // This can vary based on a variety of things, such as reflowing-zoom. The
   // conversion factor for device pixels to layers pixels is just the
   // resolution.
   CSSToLayoutDeviceScale mDevPixelsPerCSSPixel;
 
--- a/gfx/layers/composite/APZCTreeManager.cpp
+++ b/gfx/layers/composite/APZCTreeManager.cpp
@@ -633,37 +633,42 @@ APZCTreeManager::FindTargetAPZC(AsyncPan
 AsyncPanZoomController*
 APZCTreeManager::GetAPZCAtPoint(AsyncPanZoomController* aApzc, const gfxPoint& aHitTestPoint)
 {
   // The comments below assume there is a chain of layers L..R with L and P having APZC instances as
   // explained in the comment on GetInputTransforms. This function will recurse with aApzc at L and P, and the
   // comments explain what values are stored in the variables at these two levels. All the comments
   // use standard matrix notation where the leftmost matrix in a multiplication is applied first.
 
-  // ancestorUntransform takes points from aApzc's parent APZC's screen coordinates
+  // ancestorUntransform takes points from aApzc's parent APZC's layer coordinates
   // to aApzc's screen coordinates.
   // It is OC.Inverse() * NC.Inverse() * MC.Inverse() at recursion level for L,
   //   and RC.Inverse() * QC.Inverse()                at recursion level for P.
   gfx3DMatrix ancestorUntransform = aApzc->GetAncestorTransform().Inverse();
 
-  // Hit testing for this layer is performed in aApzc's screen coordinates.
-  gfxPoint hitTestPointForThisLayer = ancestorUntransform.ProjectPoint(aHitTestPoint);
-  APZC_LOG("Untransformed %f %f to screen coordinates %f %f for hit-testing APZC %p\n",
+  // hitTestTransform takes points from aApzc's parent APZC's layer coordinates to
+  // the hit test space (which is aApzc's transient coordinates).
+  // It is OC.Inverse() * NC.Inverse() * MC.Inverse() * LC.Inverse() * LN.Inverse() at L,
+  //   and RC.Inverse() * QC.Inverse() * PC.Inverse() * PN.Inverse()                at P.
+  gfx3DMatrix hitTestTransform = ancestorUntransform
+                               * aApzc->GetCSSTransform().Inverse()
+                               * aApzc->GetNontransientAsyncTransform().Inverse();
+  gfxPoint hitTestPointForThisLayer = hitTestTransform.ProjectPoint(aHitTestPoint);
+  APZC_LOG("Untransformed %f %f to transient coordinates %f %f for hit-testing APZC %p\n",
            aHitTestPoint.x, aHitTestPoint.y,
            hitTestPointForThisLayer.x, hitTestPointForThisLayer.y, aApzc);
 
-  // myUntransform takes points from aApzc's screen coordinates
+  // childUntransform takes points from aApzc's parent APZC's layer coordinates
   // to aApzc's layer coordinates (which are aApzc's children's screen coordinates).
-  // It is LA.Inverse() * LC.Inverse() at L
-  //   and PA.Inverse() * PC.Inverse() at P.
-  gfx3DMatrix myUntransform = gfx3DMatrix(aApzc->GetCurrentAsyncTransform()).Inverse()
-                            * aApzc->GetCSSTransform().Inverse();
-
-  // Hit testing for child layers is performed in aApzc's layer coordinates.
-  gfxPoint hitTestPointForChildLayers = myUntransform.ProjectPoint(hitTestPointForThisLayer);
+  // It is OC.Inverse() * NC.Inverse() * MC.Inverse() * LC.Inverse() * LA.Inverse() at L
+  //   and RC.Inverse() * QC.Inverse() * PC.Inverse() * PA.Inverse()                at P.
+  gfx3DMatrix childUntransform = ancestorUntransform
+                               * aApzc->GetCSSTransform().Inverse()
+                               * gfx3DMatrix(aApzc->GetCurrentAsyncTransform()).Inverse();
+  gfxPoint hitTestPointForChildLayers = childUntransform.ProjectPoint(aHitTestPoint);
   APZC_LOG("Untransformed %f %f to layer coordinates %f %f for APZC %p\n",
            aHitTestPoint.x, aHitTestPoint.y,
            hitTestPointForChildLayers.x, hitTestPointForChildLayers.y, aApzc);
 
   // This walks the tree in depth-first, reverse order, so that it encounters
   // APZCs front-to-back on the screen.
   for (AsyncPanZoomController* child = aApzc->GetLastChild(); child; child = child->GetPrevSibling()) {
     AsyncPanZoomController* match = GetAPZCAtPoint(child, hitTestPointForChildLayers);
@@ -682,100 +687,121 @@ APZCTreeManager::GetAPZCAtPoint(AsyncPan
 /* This function sets the aTransformToApzcOut and aTransformToGeckoOut out-parameters
    to some useful transformations that input events may need applied. This is best
    illustrated with an example. Consider a chain of layers, L, M, N, O, P, Q, R. Layer L
    is the layer that corresponds to the returned APZC instance, and layer R is the root
    of the layer tree. Layer M is the parent of L, N is the parent of M, and so on.
    When layer L is displayed to the screen by the compositor, the set of transforms that
    are applied to L are (in order from top to bottom):
 
-        L's CSS transform      (hereafter referred to as transform matrix LC)
-        L's async transform    (hereafter referred to as transform matrix LA)
-        M's CSS transform      (hereafter referred to as transform matrix MC)
-        M's async transform    (hereafter referred to as transform matrix MA)
+        L's transient async transform       (hereafter referred to as transform matrix LT)
+        L's nontransient async transform    (hereafter referred to as transform matrix LN)
+        L's CSS transform                   (hereafter referred to as transform matrix LC)
+        M's transient async transform       (hereafter referred to as transform matrix MT)
+        M's nontransient async transform    (hereafter referred to as transform matrix MN)
+        M's CSS transform                   (hereafter referred to as transform matrix MC)
         ...
-        R's CSS transform      (hereafter referred to as transform matrix RC)
-        R's async transform    (hereafter referred to as transform matrix RA)
+        R's transient async transform       (hereafter referred to as transform matrix RT)
+        R's nontransient async transform    (hereafter referred to as transform matrix RN)
+        R's CSS transform                   (hereafter referred to as transform matrix RC)
 
-   Therefore, if we want user input to modify L's async transform, we have to first convert
-   user input from screen space to the coordinate space of L's async transform. Doing this
-   involves applying the following transforms (in order from top to bottom):
-        RA.Inverse()
+   Also, for any layer, the async transform is the combination of its transient and non-transient
+   parts. That is, for any layer L:
+                  LA === LT * LN
+        LA.Inverse() === LN.Inverse() * LT.Inverse()
+
+   If we want user input to modify L's transient async transform, we have to first convert
+   user input from screen space to the coordinate space of L's transient async transform. Doing
+   this involves applying the following transforms (in order from top to bottom):
         RC.Inverse()
+        RN.Inverse()
+        RT.Inverse()
         ...
-        MA.Inverse()
         MC.Inverse()
+        MN.Inverse()
+        MT.Inverse()
+        LC.Inverse()
+        LN.Inverse()
    This combined transformation is returned in the aTransformToApzcOut out-parameter.
 
    Next, if we want user inputs sent to gecko for event-dispatching, we will need to strip
    out all of the async transforms that are involved in this chain. This is because async
    transforms are stored only in the compositor and gecko does not account for them when
    doing display-list-based hit-testing for event dispatching. Therefore, given a user input
    in screen space, the following transforms need to be applied (in order from top to bottom):
-        RA.Inverse()
         RC.Inverse()
+        RN.Inverse()
+        RT.Inverse()
         ...
-        MA.Inverse()
         MC.Inverse()
-        LA.Inverse()
+        MN.Inverse()
+        MT.Inverse()
         LC.Inverse()
+        LN.Inverse()
+        LT.Inverse()
         LC
         MC
         ...
         RC
    This sequence can be simplified and refactored to the following:
         aTransformToApzcOut
-        LA.Inverse()
+        LT.Inverse()
+        LC
         MC
         ...
         RC
    Since aTransformToApzcOut is already one of the out-parameters, we set aTransformToGeckoOut
-   to the remaining transforms (LA.Inverse() * MC * ... * RC), so that the caller code can
+   to the remaining transforms (LT.Inverse() * LC * ... * RC), so that the caller code can
    combine it with aTransformToApzcOut to get the final transform required in this case.
 
    Note that for many of these layers, there will be no AsyncPanZoomController attached, and
    so the async transform will be the identity transform. So, in the example above, if layers
-   L and P have APZC instances attached, MA, NA, OA, QA, and RA will be identity transforms.
-   Additionally, for space-saving purposes, each APZC instance stores its layers individual
+   L and P have APZC instances attached, MT, MN, NT, NN, OT, ON, QT, QN, RT and RN will be
+   identity transforms.
+   Additionally, for space-saving purposes, each APZC instance stores its layer's individual
    CSS transform and the accumulation of CSS transforms to its parent APZC. So the APZC for
    layer L would store LC and (MC * NC * OC), and the layer P would store PC and (QC * RC).
-   The APZCs also obviously have LA and PA, so all of the above transformation combinations
+   The APZCs also obviously have LT, LN, PT, and PN, so all of the above transformation combinations
    required can be generated.
  */
 void
 APZCTreeManager::GetInputTransforms(AsyncPanZoomController *aApzc, gfx3DMatrix& aTransformToApzcOut,
                                     gfx3DMatrix& aTransformToGeckoOut)
 {
   // The comments below assume there is a chain of layers L..R with L and P having APZC instances as
   // explained in the comment above. This function is called with aApzc at L, and the loop
   // below performs one iteration, where parent is at P. The comments explain what values are stored
   // in the variables at these two levels. All the comments use standard matrix notation where the
   // leftmost matrix in a multiplication is applied first.
 
   // ancestorUntransform is OC.Inverse() * NC.Inverse() * MC.Inverse()
   gfx3DMatrix ancestorUntransform = aApzc->GetAncestorTransform().Inverse();
   // asyncUntransform is LA.Inverse()
   gfx3DMatrix asyncUntransform = gfx3DMatrix(aApzc->GetCurrentAsyncTransform()).Inverse();
+  // nontransientAsyncTransform is LN
+  gfx3DMatrix nontransientAsyncTransform = aApzc->GetNontransientAsyncTransform();
+  // transientAsyncUntransform is LT.Inverse()
+  gfx3DMatrix transientAsyncUntransform = nontransientAsyncTransform * asyncUntransform;
 
-  // aTransformToApzcOut is initialized to OC.Inverse() * NC.Inverse() * MC.Inverse()
-  aTransformToApzcOut = ancestorUntransform;
-  // aTransformToGeckoOut is initialized to LA.Inverse() * MC * NC * OC
-  aTransformToGeckoOut = asyncUntransform * aApzc->GetAncestorTransform();
+  // aTransformToApzcOut is initialized to OC.Inverse() * NC.Inverse() * MC.Inverse() * LC.Inverse() * LN.Inverse()
+  aTransformToApzcOut = ancestorUntransform * aApzc->GetCSSTransform().Inverse() * nontransientAsyncTransform.Inverse();
+  // aTransformToGeckoOut is initialized to LT.Inverse() * LC * MC * NC * OC
+  aTransformToGeckoOut = transientAsyncUntransform * aApzc->GetCSSTransform() * aApzc->GetAncestorTransform();
 
   for (AsyncPanZoomController* parent = aApzc->GetParent(); parent; parent = parent->GetParent()) {
     // ancestorUntransform is updated to RC.Inverse() * QC.Inverse() when parent == P
     ancestorUntransform = parent->GetAncestorTransform().Inverse();
     // asyncUntransform is updated to PA.Inverse() when parent == P
     asyncUntransform = gfx3DMatrix(parent->GetCurrentAsyncTransform()).Inverse();
-    // untransformSinceLastApzc is RC.Inverse() * QC.Inverse() * PA.Inverse() * PC.Inverse()
-    gfx3DMatrix untransformSinceLastApzc = ancestorUntransform * asyncUntransform * parent->GetCSSTransform().Inverse();
+    // untransformSinceLastApzc is RC.Inverse() * QC.Inverse() * PC.Inverse() * PA.Inverse()
+    gfx3DMatrix untransformSinceLastApzc = ancestorUntransform * parent->GetCSSTransform().Inverse() * asyncUntransform;
 
-    // aTransformToApzcOut is RC.Inverse() * QC.Inverse() * PA.Inverse() * PC.Inverse() * OC.Inverse() * NC.Inverse() * MC.Inverse()
+    // aTransformToApzcOut is RC.Inverse() * QC.Inverse() * PC.Inverse() * PA.Inverse() * OC.Inverse() * NC.Inverse() * MC.Inverse() * LC.Inverse() * LN.Inverse()
     aTransformToApzcOut = untransformSinceLastApzc * aTransformToApzcOut;
-    // aTransformToGeckoOut is LA.Inverse() * MC * NC * OC * PC * QC * RC
+    // aTransformToGeckoOut is LT.Inverse() * LC * MC * NC * OC * PC * QC * RC
     aTransformToGeckoOut = aTransformToGeckoOut * parent->GetCSSTransform() * parent->GetAncestorTransform();
 
     // The above values for aTransformToApzcOut and aTransformToGeckoOut when parent == P match
     // the required output as explained in the comment above GetTargetAPZC. Note that any missing terms
     // are async transforms that are guaranteed to be identity transforms.
   }
 }
 
--- a/gfx/layers/ipc/AsyncPanZoomController.cpp
+++ b/gfx/layers/ipc/AsyncPanZoomController.cpp
@@ -445,18 +445,16 @@ nsEventStatus AsyncPanZoomController::On
   ScreenIntPoint point = GetFirstTouchScreenPoint(aEvent);
 
   switch (mState) {
     case ANIMATING_ZOOM:
       // We just interrupted a double-tap animation, so force a redraw in case
       // this touchstart is just a tap that doesn't end up triggering a redraw.
       {
         ReentrantMonitorAutoEnter lock(mMonitor);
-        // Bring the resolution back in sync with the zoom.
-        SetZoomAndResolution(mFrameMetrics.mZoom);
         RequestContentRepaint();
         ScheduleComposite();
       }
       // Fall through.
     case FLING:
       CancelAnimation();
       // Fall through.
     case NOTHING:
@@ -912,19 +910,16 @@ bool AsyncPanZoomController::DoFling(con
   if (mState != FLING) {
     return false;
   }
 
   bool shouldContinueFlingX = mX.FlingApplyFrictionOrCancel(aDelta),
        shouldContinueFlingY = mY.FlingApplyFrictionOrCancel(aDelta);
   // If we shouldn't continue the fling, let's just stop and repaint.
   if (!shouldContinueFlingX && !shouldContinueFlingY) {
-    // Bring the resolution back in sync with the zoom, in case we scaled down
-    // the zoom while accelerating.
-    SetZoomAndResolution(mFrameMetrics.mZoom);
     SendAsyncScrollEvent();
     RequestContentRepaint();
     mState = NOTHING;
     return false;
   }
 
   CSSPoint overscroll; // overscroll is ignored for flings
   ScreenPoint offset(aDelta.ToMilliseconds() * mX.GetVelocity(),
@@ -955,17 +950,17 @@ void AsyncPanZoomController::SetComposit
 }
 
 void AsyncPanZoomController::ScrollBy(const CSSPoint& aOffset) {
   mFrameMetrics.mScrollOffset += aOffset;
 }
 
 void AsyncPanZoomController::ScaleWithFocus(float aScale,
                                             const CSSPoint& aFocus) {
-  SetZoomAndResolution(CSSToScreenScale(mFrameMetrics.mZoom.scale * aScale));
+  mFrameMetrics.mZoom.scale *= aScale;
   // We want to adjust the scroll offset such that the CSS point represented by aFocus remains
   // at the same position on the screen before and after the change in zoom. The below code
   // accomplishes this; see https://bugzilla.mozilla.org/show_bug.cgi?id=923431#c6 for an
   // in-depth explanation of how.
   mFrameMetrics.mScrollOffset = (mFrameMetrics.mScrollOffset + aFocus) - (aFocus / aScale);
 }
 
 bool AsyncPanZoomController::EnlargeDisplayPortAlongAxis(float aSkateSizeMultiplier,
@@ -1108,17 +1103,17 @@ void AsyncPanZoomController::RequestCont
   if (fabsf(oldDisplayPort.x - newDisplayPort.x) < EPSILON &&
       fabsf(oldDisplayPort.y - newDisplayPort.y) < EPSILON &&
       fabsf(oldDisplayPort.width - newDisplayPort.width) < EPSILON &&
       fabsf(oldDisplayPort.height - newDisplayPort.height) < EPSILON &&
       fabsf(mLastPaintRequestMetrics.mScrollOffset.x -
             mFrameMetrics.mScrollOffset.x) < EPSILON &&
       fabsf(mLastPaintRequestMetrics.mScrollOffset.y -
             mFrameMetrics.mScrollOffset.y) < EPSILON &&
-      mFrameMetrics.mCumulativeResolution == mLastPaintRequestMetrics.mCumulativeResolution) {
+      mFrameMetrics.mZoom == mLastPaintRequestMetrics.mZoom) {
     return;
   }
 
   SendAsyncScrollEvent();
 
   // Cache the zoom since we're temporarily changing it for
   // acceleration-scaled painting.
   CSSToScreenScale actualZoom = mFrameMetrics.mZoom;
@@ -1197,18 +1192,16 @@ bool AsyncPanZoomController::SampleConte
           mStartZoomToMetrics.mScrollOffset.x * (1 - sampledPosition),
         mEndZoomToMetrics.mScrollOffset.y * sampledPosition +
           mStartZoomToMetrics.mScrollOffset.y * (1 - sampledPosition)
       ));
 
       requestAnimationFrame = true;
 
       if (aSampleTime - mAnimationStartTime >= ZOOM_TO_DURATION) {
-        // Bring the resolution in sync with the zoom.
-        SetZoomAndResolution(mFrameMetrics.mZoom);
         mState = NOTHING;
         SendAsyncScrollEvent();
         RequestContentRepaint();
       }
 
       break;
     }
     default:
@@ -1264,16 +1257,23 @@ ViewTransform AsyncPanZoomController::Ge
                          * mLastContentPaintMetrics.LayersPixelsPerCSSPixel();
 
   return ViewTransform(-translation,
                        mFrameMetrics.mZoom
                      / mLastContentPaintMetrics.mDevPixelsPerCSSPixel
                      / mFrameMetrics.GetParentResolution());
 }
 
+gfx3DMatrix AsyncPanZoomController::GetNontransientAsyncTransform() {
+  ReentrantMonitorAutoEnter lock(mMonitor);
+  return gfx3DMatrix::ScalingMatrix(mLastContentPaintMetrics.mResolution.scale,
+                                    mLastContentPaintMetrics.mResolution.scale,
+                                    1.0f);
+}
+
 void AsyncPanZoomController::NotifyLayersUpdated(const FrameMetrics& aLayerMetrics, bool aIsFirstPaint) {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
   mLastContentPaintMetrics = aLayerMetrics;
 
   bool isDefault = mFrameMetrics.IsDefault();
   mFrameMetrics.mMayHaveTouchListeners = aLayerMetrics.mMayHaveTouchListeners;
   APZC_LOG_FM(aLayerMetrics, "%p got a NotifyLayersUpdated with aIsFirstPaint=%d", this, aIsFirstPaint);
@@ -1297,18 +1297,27 @@ void AsyncPanZoomController::NotifyLayer
     mPaintThrottler.ClearHistory();
     mPaintThrottler.SetMaxDurations(gNumPaintDurationSamples);
 
     mX.CancelTouch();
     mY.CancelTouch();
 
     mFrameMetrics = aLayerMetrics;
     mState = NOTHING;
-  } else if (!mFrameMetrics.mScrollableRect.IsEqualEdges(aLayerMetrics.mScrollableRect)) {
+  } else {
+    // If we're not taking the aLayerMetrics wholesale we still need to pull
+    // in some things into our local mFrameMetrics because these things are
+    // determined by Gecko and our copy in mFrameMetrics may be stale.
     mFrameMetrics.mScrollableRect = aLayerMetrics.mScrollableRect;
+    mFrameMetrics.mCompositionBounds = aLayerMetrics.mCompositionBounds;
+    float parentResolutionChange = aLayerMetrics.GetParentResolution().scale
+                                 / mFrameMetrics.GetParentResolution().scale;
+    mFrameMetrics.mZoom.scale *= parentResolutionChange;
+    mFrameMetrics.mResolution = aLayerMetrics.mResolution;
+    mFrameMetrics.mCumulativeResolution = aLayerMetrics.mCumulativeResolution;
   }
 
   if (needContentRepaint) {
     RequestContentRepaint();
   }
 }
 
 const FrameMetrics& AsyncPanZoomController::GetFrameMetrics() {
@@ -1324,17 +1333,17 @@ void AsyncPanZoomController::UpdateCompo
 
   // If the window had 0 dimensions before, or does now, we don't want to
   // repaint or update the zoom since we'll run into rendering issues and/or
   // divide-by-zero. This manifests itself as the screen flashing. If the page
   // has gone out of view, the buffer will be cleared elsewhere anyways.
   if (aCompositionBounds.width && aCompositionBounds.height &&
       oldCompositionBounds.width && oldCompositionBounds.height) {
     float adjustmentFactor = float(aCompositionBounds.width) / float(oldCompositionBounds.width);
-    SetZoomAndResolution(CSSToScreenScale(mFrameMetrics.mZoom.scale * adjustmentFactor));
+    mFrameMetrics.mZoom.scale *= adjustmentFactor;
 
     // Repaint on a rotation so that our new resolution gets properly updated.
     RequestContentRepaint();
   }
 }
 
 void AsyncPanZoomController::ZoomToRect(CSSRect aRect) {
   SetState(ANIMATING_ZOOM);
@@ -1474,28 +1483,16 @@ bool AsyncPanZoomController::IsPanningSt
   return (aState == PANNING || aState == PANNING_LOCKED_X || aState == PANNING_LOCKED_Y);
 }
 
 void AsyncPanZoomController::TimeoutTouchListeners() {
   mTouchListenerTimeoutTask = nullptr;
   ContentReceivedTouch(false);
 }
 
-void AsyncPanZoomController::SetZoomAndResolution(const CSSToScreenScale& aZoom) {
-  mMonitor.AssertCurrentThreadIn();
-  LayoutDeviceToParentLayerScale parentResolution = mFrameMetrics.GetParentResolution();
-  mFrameMetrics.mZoom = aZoom;
-  // We use ScreenToLayerScale(1) below in order to ask gecko to render
-  // what's currently visible on the screen. This is effectively turning
-  // the async zoom amount into the gecko zoom amount.
-  mFrameMetrics.mCumulativeResolution = aZoom / mFrameMetrics.mDevPixelsPerCSSPixel * ScreenToLayerScale(1);
-  // The parent resolution will not have changed.
-  mFrameMetrics.mResolution = mFrameMetrics.mCumulativeResolution / parentResolution;
-}
-
 void AsyncPanZoomController::UpdateZoomConstraints(bool aAllowZoom,
                                                    const CSSToScreenScale& aMinZoom,
                                                    const CSSToScreenScale& aMaxZoom) {
   if (gAsyncZoomDisabled) {
     return;
   }
   mAllowZoom = aAllowZoom;
   mMinZoom = (MIN_ZOOM > aMinZoom ? MIN_ZOOM : aMinZoom);
--- a/gfx/layers/ipc/AsyncPanZoomController.h
+++ b/gfx/layers/ipc/AsyncPanZoomController.h
@@ -196,16 +196,23 @@ public:
    * Returns the incremental transformation corresponding to the async pan/zoom
    * in progress. That is, when this transform is multiplied with the layer's
    * existing transform, it will make the layer appear with the desired pan/zoom
    * amount.
    */
   ViewTransform GetCurrentAsyncTransform();
 
   /**
+   * Returns the part of the async transform that will remain once Gecko does a
+   * repaint at the desired metrics. That is, in the steady state:
+   * gfx3DMatrix(GetCurrentAsyncTransform()) === GetNontransientAsyncTransform()
+   */
+  gfx3DMatrix GetNontransientAsyncTransform();
+
+  /**
    * Recalculates the displayport. Ideally, this should paint an area bigger
    * than the composite-to dimensions so that when you scroll down, you don't
    * checkerboard immediately. This includes a bunch of logic, including
    * algorithms to bias painting in the direction of the velocity.
    */
   static const CSSRect CalculatePendingDisplayPort(
     const FrameMetrics& aFrameMetrics,
     const gfx::Point& aVelocity,
@@ -446,24 +453,16 @@ protected:
    * after we get our first touch event in a batch, under the condition that we
    * have touch listeners. If a notification comes indicating whether or not
    * content preventDefaulted a series of touch events before the timeout, the
    * timeout should be cancelled.
    */
   void TimeoutTouchListeners();
 
   /**
-   * Utility function that sets the zoom and resolution simultaneously. This is
-   * useful when we want to repaint at the current zoom level.
-   *
-   * *** The monitor must be held while calling this.
-   */
-  void SetZoomAndResolution(const mozilla::CSSToScreenScale& aZoom);
-
-  /**
    * Timeout function for mozbrowserasyncscroll event. Because we throttle
    * mozbrowserasyncscroll events in some conditions, this function ensures
    * that the last mozbrowserasyncscroll event will be fired after a period of
    * time.
    */
   void FireAsyncScrollOnTimeout();
 
 private:
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -13,16 +13,18 @@
 
 #include "prlog.h"
 
 #include "gfxPlatform.h"
 
 #ifdef XP_WIN
 #include <process.h>
 #define getpid _getpid
+#else
+#include <unistd.h>
 #endif
 
 #include "nsXULAppAPI.h"
 #include "nsDirectoryServiceUtils.h"
 #include "nsDirectoryServiceDefs.h"
 
 #if defined(XP_WIN)
 #include "gfxWindowsPlatform.h"
--- a/js/src/frontend/BytecodeEmitter.cpp
+++ b/js/src/frontend/BytecodeEmitter.cpp
@@ -1139,22 +1139,18 @@ TryConvertFreeName(BytecodeEmitter *bce,
      * When parsing inner functions lazily, parse nodes for outer functions no
      * longer exist and only the function's scope chain is available for
      * resolving upvar accesses within the inner function.
      */
     if (bce->emitterMode == BytecodeEmitter::LazyFunction) {
         // The only statements within a lazy function which can push lexical
         // scopes are try/catch blocks. Use generic ops in this case.
         for (StmtInfoBCE *stmt = bce->topStmt; stmt; stmt = stmt->down) {
-            switch (stmt->type) {
-              case STMT_TRY:
-              case STMT_FINALLY:
+            if (stmt->type == STMT_CATCH)
                 return true;
-              default:;
-            }
         }
 
         size_t hops = 0;
         FunctionBox *funbox = bce->sc->asFunctionBox();
         if (funbox->hasExtensibleScope())
             return false;
         if (funbox->function()->isNamedLambda() && funbox->function()->atom() == pn->pn_atom)
             return false;
--- a/js/src/gc/Zone.cpp
+++ b/js/src/gc/Zone.cpp
@@ -33,16 +33,17 @@ JS::Zone::Zone(JSRuntime *rt)
     gcBytes(0),
     gcTriggerBytes(0),
     gcHeapGrowthFactor(3.0),
     isSystem(false),
     usedByExclusiveThread(false),
     scheduledForDestruction(false),
     maybeAlive(true),
     gcMallocBytes(0),
+    gcMallocGCTriggered(false),
     gcGrayRoots(),
     data(nullptr),
     types(this)
 {
     /* Ensure that there are no vtables to mess us up here. */
     JS_ASSERT(reinterpret_cast<JS::shadow::Zone *>(this) ==
               static_cast<JS::shadow::Zone *>(this));
 
@@ -107,33 +108,35 @@ Zone::markTypes(JSTracer *trc)
         JS_ASSERT(type == i.get<types::TypeObject>());
     }
 }
 
 void
 Zone::resetGCMallocBytes()
 {
     gcMallocBytes = ptrdiff_t(gcMaxMallocBytes);
+    gcMallocGCTriggered = false;
 }
 
 void
 Zone::setGCMaxMallocBytes(size_t value)
 {
     /*
      * For compatibility treat any value that exceeds PTRDIFF_T_MAX to
      * mean that value.
      */
     gcMaxMallocBytes = (ptrdiff_t(value) >= 0) ? value : size_t(-1) >> 1;
     resetGCMallocBytes();
 }
 
 void
 Zone::onTooMuchMalloc()
 {
-    TriggerZoneGC(this, gcreason::TOO_MUCH_MALLOC);
+    if (!gcMallocGCTriggered)
+        gcMallocGCTriggered = TriggerZoneGC(this, JS::gcreason::TOO_MUCH_MALLOC);
 }
 
 void
 Zone::sweep(FreeOp *fop, bool releaseTypes)
 {
     /*
      * Periodically release observed types for all scripts. This is safe to
      * do when there are no frames for the zone on the stack.
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -245,17 +245,26 @@ struct Zone : public JS::shadow::Zone,
     bool                         scheduledForDestruction;
     bool                         maybeAlive;
 
     /*
      * Malloc counter to measure memory pressure for GC scheduling. It runs from
      * gcMaxMallocBytes down to zero. This counter should be used only when it's
      * not possible to know the size of a free.
      */
-    ptrdiff_t                    gcMallocBytes;
+    mozilla::Atomic<ptrdiff_t, mozilla::ReleaseAcquire> gcMallocBytes;
+
+    /*
+     * Whether a GC has been triggered as a result of gcMallocBytes falling
+     * below zero.
+     *
+     * This should be a bool, but Atomic only supports 32-bit and pointer-sized
+     * types.
+     */
+    mozilla::Atomic<uint32_t, mozilla::ReleaseAcquire> gcMallocGCTriggered;
 
     /* This compartment's gray roots. */
     js::Vector<js::GrayRoot, 0, js::SystemAllocPolicy> gcGrayRoots;
 
     /* Per-zone data for use by an embedder. */
     void *data;
 
     Zone(JSRuntime *rt);
@@ -273,20 +282,18 @@ struct Zone : public JS::shadow::Zone,
 
     void resetGCMallocBytes();
     void setGCMaxMallocBytes(size_t value);
     void updateMallocCounter(size_t nbytes) {
         /*
          * Note: this code may be run from worker threads.  We
          * tolerate any thread races when updating gcMallocBytes.
          */
-        ptrdiff_t oldCount = gcMallocBytes;
-        ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes);
-        gcMallocBytes = newCount;
-        if (JS_UNLIKELY(newCount <= 0 && oldCount > 0))
+        gcMallocBytes -= ptrdiff_t(nbytes);
+        if (JS_UNLIKELY(isTooMuchMalloc()))
             onTooMuchMalloc();
     }
 
     bool isTooMuchMalloc() const {
         return gcMallocBytes <= 0;
      }
 
     void onTooMuchMalloc();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u16-from-mdim-array.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.ArrayType(TypedObject.uint16, 3);
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+function foo() {
+  for (var i = 0; i < 10000; i += 9) {
+    var vec = new VecPointType([
+      [i,   i+1, i+2],
+      [i+3, i+4, i+5],
+      [i+6, i+7, i+8]]);
+    var sum = vec[0][0] + vec[0][1] + vec[0][2];
+    assertEq(sum, 3*i + 3);
+    sum = vec[1][0] + vec[1][1] + vec[1][2];
+    assertEq(sum, 3*i + 12);
+    sum = vec[2][0] + vec[2][1] + vec[2][2];
+    assertEq(sum, 3*i + 21);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u16-from-struct-array-in-struct.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.StructType({x: TypedObject.uint16,
+                                            y: TypedObject.uint16,
+                                            z: TypedObject.uint16});
+
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+var PairVecType = new TypedObject.StructType({fst: VecPointType,
+                                              snd: VecPointType});
+
+function foo() {
+  for (var i = 0; i < 5000; i += 9) {
+    var p = new PairVecType({fst: [{x:    i, y: i+1, z:i+2},
+                                   {x:  i+3, y: i+4, z:i+5},
+                                   {x:  i+6, y: i+7, z:i+8}],
+                             snd: [{x:  i+9, y:i+10, z:i+11},
+                                   {x: i+12, y:i+13, z:i+14},
+                                   {x: i+15, y:i+16, z:i+17}]
+                            });
+    var sum;
+
+    sum = p.fst[0].x + p.fst[0].y + p.fst[0].z;
+    assertEq(sum, 3*i + 3);
+    sum = p.fst[1].x + p.fst[1].y + p.fst[1].z;
+    assertEq(sum, 3*i + 12);
+    sum = p.fst[2].x + p.fst[2].y + p.fst[2].z;
+    assertEq(sum, 3*i + 21);
+
+    sum = p.snd[0].x + p.snd[0].y + p.snd[0].z;
+    assertEq(sum, 3*i + 30);
+    sum = p.snd[1].x + p.snd[1].y + p.snd[1].z;
+    assertEq(sum, 3*i + 39);
+    sum = p.snd[2].x + p.snd[2].y + p.snd[2].z;
+    assertEq(sum, 3*i + 48);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u16-from-struct-array.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.StructType({x: TypedObject.uint16,
+                                            y: TypedObject.uint16,
+                                            z: TypedObject.uint16});
+
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+function foo() {
+  for (var i = 0; i < 10000; i += 9) {
+    var vec = new VecPointType([
+      {x: i,   y:i+1, z:i+2},
+      {x: i+3, y:i+4, z:i+5},
+      {x: i+6, y:i+7, z:i+8}]);
+    var sum = vec[0].x + vec[0].y + vec[0].z;
+    assertEq(sum, 3*i + 3);
+    sum = vec[1].x + vec[1].y + vec[1].z;
+    assertEq(sum, 3*i + 12);
+    sum = vec[2].x + vec[2].y + vec[2].z;
+    assertEq(sum, 3*i + 21);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u16-from-u16-array-in-struct.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var Vec3u16Type = new TypedObject.ArrayType(TypedObject.uint16, 3);
+var PairVec3u16Type = new TypedObject.StructType({fst: Vec3u16Type,
+                                                  snd: Vec3u16Type});
+
+function foo_u16() {
+  for (var i = 0; i < 15000; i += 6) {
+    var p = new PairVec3u16Type({fst: [i, i+1, i+2],
+                                 snd: [i+3,i+4,i+5]});
+    var sum = p.fst[0] + p.fst[1] + p.fst[2];
+    assertEq(sum, 3*i + 3);
+    sum = p.snd[0] + p.snd[1] + p.snd[2];
+    assertEq(sum, 3*i + 12);
+  }
+}
+
+foo_u16();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u16-from-u16-array.js
@@ -0,0 +1,19 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var Vec3u16Type = new TypedObject.ArrayType(TypedObject.uint16, 3);
+
+function foo_u16() {
+  for (var i = 0; i < 30000; i += 3) {
+    var vec = new Vec3u16Type([i, i+1, i+2]);
+    var sum = vec[0] + vec[1] + vec[2];
+    assertEq(sum, 3*i + 3);
+  }
+}
+
+foo_u16();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u32-from-mdim-array.js
@@ -0,0 +1,27 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.ArrayType(TypedObject.uint32, 3);
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+function foo() {
+  for (var i = 0; i < 10000; i += 9) {
+    var vec = new VecPointType([
+      [i,   i+1, i+2],
+      [i+3, i+4, i+5],
+      [i+6, i+7, i+8]]);
+    var sum = vec[0][0] + vec[0][1] + vec[0][2];
+    assertEq(sum, 3*i + 3);
+    sum = vec[1][0] + vec[1][1] + vec[1][2];
+    assertEq(sum, 3*i + 12);
+    sum = vec[2][0] + vec[2][1] + vec[2][2];
+    assertEq(sum, 3*i + 21);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u32-from-struct-array-in-struct.js
@@ -0,0 +1,45 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.StructType({x: TypedObject.uint32,
+                                            y: TypedObject.uint32,
+                                            z: TypedObject.uint32});
+
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+var PairVecType = new TypedObject.StructType({fst: VecPointType,
+                                              snd: VecPointType});
+
+function foo() {
+  for (var i = 0; i < 5000; i += 9) {
+    var p = new PairVecType({fst: [{x:    i, y: i+1, z:i+2},
+                                   {x:  i+3, y: i+4, z:i+5},
+                                   {x:  i+6, y: i+7, z:i+8}],
+                             snd: [{x:  i+9, y:i+10, z:i+11},
+                                   {x: i+12, y:i+13, z:i+14},
+                                   {x: i+15, y:i+16, z:i+17}]
+                            });
+    var sum;
+
+    sum = p.fst[0].x + p.fst[0].y + p.fst[0].z;
+    assertEq(sum, 3*i + 3);
+    sum = p.fst[1].x + p.fst[1].y + p.fst[1].z;
+    assertEq(sum, 3*i + 12);
+    sum = p.fst[2].x + p.fst[2].y + p.fst[2].z;
+    assertEq(sum, 3*i + 21);
+
+    sum = p.snd[0].x + p.snd[0].y + p.snd[0].z;
+    assertEq(sum, 3*i + 30);
+    sum = p.snd[1].x + p.snd[1].y + p.snd[1].z;
+    assertEq(sum, 3*i + 39);
+    sum = p.snd[2].x + p.snd[2].y + p.snd[2].z;
+    assertEq(sum, 3*i + 48);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u32-from-struct-array.js
@@ -0,0 +1,30 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var PointType = new TypedObject.StructType({x: TypedObject.uint32,
+                                            y: TypedObject.uint32,
+                                            z: TypedObject.uint32});
+
+var VecPointType = new TypedObject.ArrayType(PointType, 3);
+
+function foo() {
+  for (var i = 0; i < 10000; i += 9) {
+    var vec = new VecPointType([
+      {x: i,   y:i+1, z:i+2},
+      {x: i+3, y:i+4, z:i+5},
+      {x: i+6, y:i+7, z:i+8}]);
+    var sum = vec[0].x + vec[0].y + vec[0].z;
+    assertEq(sum, 3*i + 3);
+    sum = vec[1].x + vec[1].y + vec[1].z;
+    assertEq(sum, 3*i + 12);
+    sum = vec[2].x + vec[2].y + vec[2].z;
+    assertEq(sum, 3*i + 21);
+  }
+}
+
+foo();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u32-from-u32-array-in-struct.js
@@ -0,0 +1,24 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var Vec3u32Type = new TypedObject.ArrayType(TypedObject.uint32, 3);
+var PairVec3u32Type = new TypedObject.StructType({fst: Vec3u32Type,
+                                                  snd: Vec3u32Type});
+
+function foo_u32() {
+  for (var i = 0; i < 15000; i += 6) {
+    var p = new PairVec3u32Type({fst: [i, i+1, i+2],
+                                 snd: [i+3,i+4,i+5]});
+    var sum = p.fst[0] + p.fst[1] + p.fst[2];
+    assertEq(sum, 3*i + 3);
+    sum = p.snd[0] + p.snd[1] + p.snd[2];
+    assertEq(sum, 3*i + 12);
+  }
+}
+
+foo_u32();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/TypedObject/jit-read-u32-from-u32-array.js
@@ -0,0 +1,19 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+if (!this.hasOwnProperty("TypedObject"))
+  quit();
+
+var Vec3u32Type = new TypedObject.ArrayType(TypedObject.uint32, 3);
+
+function foo_u32() {
+  for (var i = 0; i < 30000; i += 3) {
+    var vec = new Vec3u32Type([i, i+1, i+2]);
+    var sum = vec[0] + vec[1] + vec[2];
+    assertEq(sum, 3*i + 3);
+  }
+}
+
+foo_u32();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/basic/bug934997.js
@@ -0,0 +1,30 @@
+function test1() {
+    var BUGNUMBER = '';
+    var summary = '';
+    var actual = '';
+    test(BUGNUMBER);
+    function test() {
+	try   {
+	    (function () { eval("'foo'.b()", arguments) })();
+	}  catch(ex)  {
+	    actual = ex + '';
+	}
+    }
+    assertEq(actual, 'TypeError: "foo".b is not a function');
+}
+test1();
+
+function test2() {
+    var BUGNUMBER = '';
+    var summary = '';
+    function g() {
+	'use strict';
+	try {
+	    eval('function foo() { var a, arguments, b;}');
+	} catch (x) {
+	    return (x instanceof SyntaxError);
+	}
+    };
+    assertEq(g(), true);
+}
+test2();
rename from js/src/tests/ecma_6/Math/hypot-approx.js
rename to js/src/jit-test/tests/basic/hypot-approx.js
--- a/js/src/tests/ecma_6/Math/hypot-approx.js
+++ b/js/src/jit-test/tests/basic/hypot-approx.js
@@ -1,8 +1,10 @@
+loadRelativeToScript("../../../tests/ecma_6/Math/shell.js");
+
 for (var i = -20; i < 20; i++) {
     assertEq(Math.hypot(+0, i), Math.abs(i));
     assertEq(Math.hypot(-0, i), Math.abs(i));
 }
 
 // The implementation must avoid underlow.
 // The implementation must avoid overflow, where possible.
 // The implementation must minimise rounding errors.
@@ -16,10 +18,8 @@ assertNear(Math.hypot(1e300, 1e300), 1.4
 assertNear(Math.hypot(1e100, 1e200, 1e300), 1e300);
 
 assertNear(Math.hypot(1e3, 1e-3), 1000.0000000005);
 assertNear(Math.hypot(1e-300, 1e300), 1e300);
 assertNear(Math.hypot(1e3, 1e-3, 1e3, 1e-3), 1414.2135623738021555);
 
 for (var i = 1, j = 1; i < 2; i += 0.05, j += 0.05)
     assertNear(Math.hypot(i, j), Math.sqrt(i * i + j * j));
-
-reportCompare(0, 0, "ok");
rename from js/src/tests/ecma_6/Math/hypot-exact.js
rename to js/src/jit-test/tests/basic/hypot-exact.js
--- a/js/src/tests/ecma_6/Math/hypot-exact.js
+++ b/js/src/jit-test/tests/basic/hypot-exact.js
@@ -50,11 +50,8 @@ assertEq(Math.hypot(+0, -0), +0);
 
 assertEq(Math.hypot(-0, -0, -0), +0);
 assertEq(Math.hypot(+0, -0, -0), +0);
 assertEq(Math.hypot(-0, +0, -0), +0);
 assertEq(Math.hypot(+0, +0, -0), +0);
 
 // The length property of the hypot function is 2.
 assertEq(Math.hypot.length, 2);
-
-
-reportCompare(0, 0, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug936361.js
@@ -0,0 +1,3 @@
+
+x = ParallelArray([1942], function() {})
+x + watch.call(x, "length", (function() {}));
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -414,16 +414,21 @@ ICStub::trace(JSTracer *trc)
         MarkObject(trc, &stub->templateObject(), "baseline-newarray-template");
         break;
       }
       case ICStub::NewObject_Fallback: {
         ICNewObject_Fallback *stub = toNewObject_Fallback();
         MarkObject(trc, &stub->templateObject(), "baseline-newobject-template");
         break;
       }
+      case ICStub::Rest_Fallback: {
+        ICRest_Fallback *stub = toRest_Fallback();
+        MarkObject(trc, &stub->templateObject(), "baseline-rest-template");
+        break;
+      }
       default:
         break;
     }
 }
 
 void
 ICFallbackStub::unlinkStub(Zone *zone, ICStub *prev, ICStub *stub)
 {
--- a/js/src/jit/BaselineIC.h
+++ b/js/src/jit/BaselineIC.h
@@ -5868,17 +5868,17 @@ class ICRest_Fallback : public ICFallbac
 
     static inline ICRest_Fallback *New(ICStubSpace *space, IonCode *code,
                                        JSObject *templateObject) {
         if (!code)
             return nullptr;
         return space->allocate<ICRest_Fallback>(code, templateObject);
     }
 
-    JSObject *templateObject() {
+    HeapPtrObject &templateObject() {
         return templateObject_;
     }
 
     class Compiler : public ICStubCompiler {
       protected:
         RootedObject templateObject;
         bool generateStubCode(MacroAssembler &masm);
 
--- a/js/src/jit/CodeGenerator.cpp
+++ b/js/src/jit/CodeGenerator.cpp
@@ -2996,16 +2996,31 @@ bool CodeGenerator::visitAtan2D(LAtan2D 
     masm.passABIArg(y);
     masm.passABIArg(x);
     masm.callWithABI(JS_FUNC_TO_DATA_PTR(void *, ecmaAtan2), MacroAssembler::DOUBLE);
 
     JS_ASSERT(ToFloatRegister(lir->output()) == ReturnFloatReg);
     return true;
 }
 
+bool CodeGenerator::visitHypot(LHypot *lir)
+{
+    Register temp = ToRegister(lir->temp());
+    FloatRegister x = ToFloatRegister(lir->x());
+    FloatRegister y = ToFloatRegister(lir->y());
+
+    masm.setupUnalignedABICall(2, temp);
+    masm.passABIArg(x);
+    masm.passABIArg(y);
+    masm.callWithABI(JS_FUNC_TO_DATA_PTR(void *, ecmaHypot), MacroAssembler::DOUBLE);
+
+    JS_ASSERT(ToFloatRegister(lir->output()) == ReturnFloatReg);
+    return true;
+}
+
 bool
 CodeGenerator::visitNewParallelArray(LNewParallelArray *lir)
 {
     Register objReg = ToRegister(lir->output());
     JSObject *templateObject = lir->mir()->templateObject();
 
     OutOfLineNewParallelArray *ool = new OutOfLineNewParallelArray(lir);
     if (!addOutOfLineCode(ool))
--- a/js/src/jit/CodeGenerator.h
+++ b/js/src/jit/CodeGenerator.h
@@ -174,16 +174,17 @@ class CodeGenerator : public CodeGenerat
     bool visitGetPropertyPolymorphicV(LGetPropertyPolymorphicV *ins);
     bool visitGetPropertyPolymorphicT(LGetPropertyPolymorphicT *ins);
     bool emitSetPropertyPolymorphic(LInstruction *lir, Register obj,
                                     Register scratch, const ConstantOrRegister &value);
     bool visitSetPropertyPolymorphicV(LSetPropertyPolymorphicV *ins);
     bool visitSetPropertyPolymorphicT(LSetPropertyPolymorphicT *ins);
     bool visitAbsI(LAbsI *lir);
     bool visitAtan2D(LAtan2D *lir);
+    bool visitHypot(LHypot *lir);
     bool visitPowI(LPowI *lir);
     bool visitPowD(LPowD *lir);
     bool visitRandom(LRandom *lir);
     bool visitMathFunctionD(LMathFunctionD *ins);
     bool visitMathFunctionF(LMathFunctionF *ins);
     bool visitModD(LModD *ins);
     bool visitMinMaxI(LMinMaxI *lir);
     bool visitBinaryV(LBinaryV *lir);
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -1630,17 +1630,17 @@ IonCompile(JSContext *cx, JSScript *scri
 
     AutoFlushCache afc("IonCompile", cx->runtime()->jitRuntime());
 
     AutoTempAllocatorRooter root(cx, temp);
     types::CompilerConstraintList *constraints = types::NewCompilerConstraintList();
     if (!constraints)
         return AbortReason_Alloc;
 
-    IonBuilder *builder = alloc->new_<IonBuilder>(cx, temp, graph, constraints,
+    IonBuilder *builder = alloc->new_<IonBuilder>((JSContext *) nullptr, cx->compartment(), temp, graph, constraints,
                                                   &inspector, info, baselineFrame);
     if (!builder)
         return AbortReason_Alloc;
 
     JS_ASSERT(!GetIonScript(builder->script(), executionMode));
     JS_ASSERT(CanIonCompile(builder->script(), executionMode));
 
     RootedScript builderScript(cx, builder->script());
--- a/js/src/jit/IonAnalysis.cpp
+++ b/js/src/jit/IonAnalysis.cpp
@@ -2100,17 +2100,17 @@ jit::AnalyzeNewScriptProperties(JSContex
     CompileInfo info(script, fun,
                      /* osrPc = */ nullptr, /* constructing = */ false,
                      DefinitePropertiesAnalysis);
 
     AutoTempAllocatorRooter root(cx, &temp);
 
     types::CompilerConstraintList *constraints = types::NewCompilerConstraintList();
     BaselineInspector inspector(script);
-    IonBuilder builder(cx, &temp, &graph, constraints,
+    IonBuilder builder(cx, cx->compartment(), &temp, &graph, constraints,
                        &inspector, &info, /* baselineFrame = */ nullptr);
 
     if (!builder.build()) {
         if (builder.abortReason() == AbortReason_Alloc)
             return false;
         return true;
     }
 
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -32,23 +32,23 @@
 #include "jit/CompileInfo-inl.h"
 
 using namespace js;
 using namespace js::jit;
 
 using mozilla::DebugOnly;
 using mozilla::Maybe;
 
-IonBuilder::IonBuilder(JSContext *cx, TempAllocator *temp, MIRGraph *graph,
+IonBuilder::IonBuilder(JSContext *analysisContext, JSCompartment *comp, TempAllocator *temp, MIRGraph *graph,
                        types::CompilerConstraintList *constraints,
                        BaselineInspector *inspector, CompileInfo *info, BaselineFrame *baselineFrame,
                        size_t inliningDepth, uint32_t loopDepth)
-  : MIRGenerator(cx->compartment(), temp, graph, info),
+  : MIRGenerator(comp, temp, graph, info),
     backgroundCodegen_(nullptr),
-    cx(cx),
+    analysisContext(analysisContext),
     baselineFrame_(baselineFrame),
     abortReason_(AbortReason_Disable),
     reprSetHash_(nullptr),
     constraints_(constraints),
     analysis_(info->script()),
     thisTypes(nullptr),
     argTypes(nullptr),
     typeArray(nullptr),
@@ -64,22 +64,23 @@ IonBuilder::IonBuilder(JSContext *cx, Te
     nonStringIteration_(false),
     lazyArguments_(nullptr),
     inlineCallInfo_(nullptr)
 {
     script_.init(info->script());
     pc = info->startPC();
 
     JS_ASSERT(script()->hasBaselineScript());
+    JS_ASSERT(!!analysisContext == (info->executionMode() == DefinitePropertiesAnalysis));
 }
 
 void
 IonBuilder::clearForBackEnd()
 {
-    cx = nullptr;
+    JS_ASSERT(!analysisContext);
     baselineFrame_ = nullptr;
 
     // The GSN cache allocates data from the malloc heap. Release this before
     // later phases of compilation to avoid leaks, as the top level IonBuilder
     // is not explicitly destroyed. Note that builders for inner scripts are
     // constructed on the stack and will release this memory on destruction.
     gsn.purge();
 }
@@ -277,22 +278,22 @@ IonBuilder::canInlineTarget(JSFunction *
     if (target->getParent() != &script()->global()) {
         IonSpew(IonSpew_Inlining, "Cannot inline due to scope mismatch");
         return false;
     }
 
     // Allow constructing lazy scripts when performing the definite properties
     // analysis, as baseline has not been used to warm the caller up yet.
     if (target->isInterpreted() && info().executionMode() == DefinitePropertiesAnalysis) {
-        if (!target->getOrCreateScript(context()))
+        if (!target->getOrCreateScript(analysisContext))
             return false;
 
-        RootedScript script(context(), target->nonLazyScript());
+        RootedScript script(analysisContext, target->nonLazyScript());
         if (!script->hasBaselineScript() && script->canBaselineCompile()) {
-            MethodStatus status = BaselineCompile(context(), script);
+            MethodStatus status = BaselineCompile(analysisContext, script);
             if (status != Method_Compiled)
                 return false;
         }
     }
 
     if (!target->hasScript()) {
         IonSpew(IonSpew_Inlining, "Cannot inline due to lack of Non-Lazy script");
         return false;
@@ -3812,21 +3813,22 @@ IonBuilder::inlineScriptedCall(CallInfo 
                                                  this->info().executionMode());
     if (!info)
         return false;
 
     MIRGraphExits saveExits;
     AutoAccumulateExits aae(graph(), saveExits);
 
     // Build the graph.
-    JS_ASSERT(!cx->isExceptionPending());
-    IonBuilder inlineBuilder(cx, &temp(), &graph(), constraints(), &inspector, info, nullptr,
+    JS_ASSERT_IF(analysisContext, !analysisContext->isExceptionPending());
+    IonBuilder inlineBuilder(analysisContext, compartment,
+                             &temp(), &graph(), constraints(), &inspector, info, nullptr,
                              inliningDepth_ + 1, loopDepth_);
     if (!inlineBuilder.buildInline(this, outerResumePoint, callInfo)) {
-        if (cx->isExceptionPending()) {
+        if (analysisContext && analysisContext->isExceptionPending()) {
             IonSpew(IonSpew_Abort, "Inline builder raised exception.");
             abortReason_ = AbortReason_Error;
             return false;
         }
 
         // Inlining the callee failed. Mark the callee as uninlineable only if
         // the inlining was aborted for a non-exception reason.
         if (inlineBuilder.abortReason_ == AbortReason_Disable) {
@@ -5969,20 +5971,23 @@ IonBuilder::testSingletonProperty(JSObje
     // reconfigured as a getter/setter then the type information for the
     // property will change and trigger invalidation.
 
     while (obj) {
         if (!ClassHasEffectlessLookup(obj->getClass()))
             return nullptr;
 
         types::TypeObjectKey *objType = types::TypeObjectKey::get(obj);
+        if (analysisContext)
+            objType->ensureTrackedProperty(analysisContext, NameToId(name));
+
         if (objType->unknownProperties())
             return nullptr;
 
-        types::HeapTypeSetKey property = objType->property(NameToId(name), context());
+        types::HeapTypeSetKey property = objType->property(NameToId(name));
         if (property.isOwnProperty(constraints())) {
             if (obj->hasSingletonType())
                 return property.singleton(constraints());
             return nullptr;
         }
 
         if (ClassHasResolveHook(compartment, obj->getClass(), name))
             return nullptr;
@@ -6044,20 +6049,22 @@ IonBuilder::testSingletonPropertyTypes(M
 
         // For property accesses which may be on many objects, we just need to
         // find a prototype common to all the objects; if that prototype
         // has the singleton property, the access will not be on a missing property.
         for (unsigned i = 0; i < types->getObjectCount(); i++) {
             types::TypeObjectKey *object = types->getObject(i);
             if (!object)
                 continue;
+            if (analysisContext)
+                object->ensureTrackedProperty(analysisContext, NameToId(name));
 
             if (object->unknownProperties())
                 return false;
-            types::HeapTypeSetKey property = object->property(NameToId(name), context());
+            types::HeapTypeSetKey property = object->property(NameToId(name));
             if (property.isOwnProperty(constraints()))
                 return false;
 
             if (JSObject *proto = object->proto().toObjectOrNull()) {
                 // Test this type.
                 if (testSingletonProperty(proto, name) != singleton)
                     return false;
             } else {
@@ -6182,34 +6189,37 @@ IonBuilder::getStaticName(JSObject *stat
             return pushConstant(UndefinedValue());
         if (name == names().NaN)
             return pushConstant(compartment->runtimeFromAnyThread()->NaNValue);
         if (name == names().Infinity)
             return pushConstant(compartment->runtimeFromAnyThread()->positiveInfinityValue);
     }
 
     types::TypeObjectKey *staticType = types::TypeObjectKey::get(staticObject);
+    if (analysisContext)
+        staticType->ensureTrackedProperty(analysisContext, NameToId(name));
+
     if (staticType->unknownProperties()) {
         *psucceeded = false;
         return true;
     }
 
-    types::HeapTypeSetKey property = staticType->property(id, context());
+    types::HeapTypeSetKey property = staticType->property(id);
     if (!property.maybeTypes() ||
         !property.maybeTypes()->definiteProperty() ||
         property.configured(constraints(), staticType))
     {
         // The property has been reconfigured as non-configurable, non-enumerable
         // or non-writable.
         *psucceeded = false;
         return true;
     }
 
     types::TemporaryTypeSet *types = bytecodeTypes(pc);
-    bool barrier = PropertyReadNeedsTypeBarrier(context(), constraints(), staticType,
+    bool barrier = PropertyReadNeedsTypeBarrier(analysisContext, constraints(), staticType,
                                                 name, types, /* updateObserved = */ true);
 
     JSObject *singleton = types->getSingleton();
 
     JSValueType knownType = types->getKnownTypeTag();
     if (!barrier) {
         if (singleton) {
             // Try to inline a known constant value.
@@ -6418,23 +6428,26 @@ GetElemKnownType(bool needsHoleCheck, ty
 bool
 IonBuilder::jsop_getelem()
 {
     MDefinition *index = current->pop();
     MDefinition *obj = current->pop();
 
     bool emitted = false;
 
+    if (!getElemTryTypedObject(&emitted, obj, index) || emitted)
+        return emitted;
+
     if (!getElemTryDense(&emitted, obj, index) || emitted)
         return emitted;
 
     if (!getElemTryTypedStatic(&emitted, obj, index) || emitted)
         return emitted;
 
-    if (!getElemTryTyped(&emitted, obj, index) || emitted)
+    if (!getElemTryTypedArray(&emitted, obj, index) || emitted)
         return emitted;
 
     if (!getElemTryString(&emitted, obj, index) || emitted)
         return emitted;
 
     if (!getElemTryArguments(&emitted, obj, index) || emitted)
         return emitted;
 
@@ -6456,16 +6469,223 @@ IonBuilder::jsop_getelem()
     if (!resumeAfter(ins))
         return false;
 
     types::TemporaryTypeSet *types = bytecodeTypes(pc);
     return pushTypeBarrier(ins, types, true);
 }
 
 bool
+IonBuilder::getElemTryTypedObject(bool *emitted, MDefinition *obj, MDefinition *index)
+{
+    JS_ASSERT(*emitted == false);
+
+    TypeRepresentationSet objTypeReprs;
+    if (!lookupTypeRepresentationSet(obj, &objTypeReprs))
+        return false;
+
+    if (!objTypeReprs.allOfArrayKind())
+        return true;
+
+    TypeRepresentationSet elemTypeReprs;
+    if (!objTypeReprs.arrayElementType(*this, &elemTypeReprs))
+        return false;
+
+    size_t elemSize;
+    if (!elemTypeReprs.allHaveSameSize(&elemSize))
+        return true;
+
+    switch (elemTypeReprs.kind()) {
+    case TypeRepresentation::Struct:
+    case TypeRepresentation::Array:
+        return getElemTryComplexElemOfTypedObject(emitted,
+                                                  obj,
+                                                  index,
+                                                  objTypeReprs,
+                                                  elemTypeReprs,
+                                                  elemSize);
+    case TypeRepresentation::Scalar:
+        return getElemTryScalarElemOfTypedObject(emitted,
+                                                 obj,
+                                                 index,
+                                                 objTypeReprs,
+                                                 elemTypeReprs,
+                                                 elemSize);
+    }
+
+    MOZ_ASSUME_UNREACHABLE("Bad kind");
+}
+
+static MIRType
+MIRTypeForTypedArrayRead(ScalarTypeRepresentation::Type arrayType,
+                         bool observedDouble);
+
+bool
+IonBuilder::getElemTryScalarElemOfTypedObject(bool *emitted,
+                                              MDefinition *obj,
+                                              MDefinition *index,
+                                              TypeRepresentationSet objTypeReprs,
+                                              TypeRepresentationSet elemTypeReprs,
+                                              size_t elemSize)
+{
+    JS_ASSERT(objTypeReprs.allOfArrayKind());
+
+    // Must always be loading the same scalar type
+    if (elemTypeReprs.length() != 1)
+        return true;
+    ScalarTypeRepresentation *elemTypeRepr = elemTypeReprs.get(0)->asScalar();
+
+    // Get the length.
+    size_t lenOfAll = objTypeReprs.arrayLength();
+    if (lenOfAll >= size_t(INT_MAX)) // int32 max is bound
+        return true;
+    MInstruction *length = MConstant::New(Int32Value(int32_t(lenOfAll)));
+
+    *emitted = true;
+    current->add(length);
+
+    // Ensure index is an integer.
+    MInstruction *idInt32 = MToInt32::New(index);
+    current->add(idInt32);
+    index = idInt32;
+
+    // Typed-object accesses usually in bounds (bail out otherwise).
+    index = addBoundsCheck(index, length);
+
+    // Find location within the owner object.
+    MDefinition *owner;
+    MDefinition *indexFromOwner;
+    if (obj->isNewDerivedTypedObject()) {
+        MNewDerivedTypedObject *ins = obj->toNewDerivedTypedObject();
+        MDefinition *ownerOffset = ins->offset();
+
+        // Typed array offsets are expressed in units of the (array)
+        // element alignment.  The binary data uses byte units for
+        // offsets (such as the owner offset here).
+
+        MConstant *alignment = MConstant::New(Int32Value(elemTypeRepr->alignment()));
+        current->add(alignment);
+
+        MDiv *scaledOffset = MDiv::NewAsmJS(ownerOffset, alignment, MIRType_Int32);
+        current->add(scaledOffset);
+
+        MAdd *scaledOffsetPlusIndex = MAdd::NewAsmJS(scaledOffset, index,
+                                                     MIRType_Int32);
+        current->add(scaledOffsetPlusIndex);
+
+        owner = ins->owner();
+        indexFromOwner = scaledOffsetPlusIndex;
+    } else {
+        owner = obj;
+        indexFromOwner = index;
+    }
+
+    // Load the element data.
+    MTypedObjectElements *elements = MTypedObjectElements::New(owner);
+    current->add(elements);
+
+    // Load the element.
+    MLoadTypedArrayElement *load = MLoadTypedArrayElement::New(elements, indexFromOwner, elemTypeRepr->type());
+    current->add(load);
+    current->push(load);
+
+    // If we are reading in-bounds elements, we can use knowledge about
+    // the array type to determine the result type, even if the opcode has
+    // never executed. The known pushed type is only used to distinguish
+    // uint32 reads that may produce either doubles or integers.
+    types::TemporaryTypeSet *resultTypes = bytecodeTypes(pc);
+    bool allowDouble = resultTypes->hasType(types::Type::DoubleType());
+    MIRType knownType = MIRTypeForTypedArrayRead(elemTypeRepr->type(), allowDouble);
+    // Note: we can ignore the type barrier here, we know the type must
+    // be valid and unbarriered.
+    load->setResultType(knownType);
+    load->setResultTypeSet(resultTypes);
+
+    return true;
+}
+
+bool
+IonBuilder::getElemTryComplexElemOfTypedObject(bool *emitted,
+                                               MDefinition *obj,
+                                               MDefinition *index,
+                                               TypeRepresentationSet objTypeReprs,
+                                               TypeRepresentationSet elemTypeReprs,
+                                               size_t elemSize)
+{
+    JS_ASSERT(objTypeReprs.allOfArrayKind());
+
+    MDefinition *type = loadTypedObjectType(obj);
+    MInstruction *elemType = MLoadFixedSlot::New(type, JS_TYPEOBJ_SLOT_ARRAY_ELEM_TYPE);
+    current->add(elemType);
+
+    // Get the length.
+    size_t lenOfAll = objTypeReprs.arrayLength();
+    if (lenOfAll >= size_t(INT_MAX)) // int32 max is bound
+        return true;
+    MInstruction *length = MConstant::New(Int32Value(int32_t(lenOfAll)));
+
+    *emitted = true;
+    current->add(length);
+
+    // Ensure index is an integer.
+    MInstruction *idInt32 = MToInt32::New(index);
+    current->add(idInt32);
+    index = idInt32;
+
+    // Typed-object accesses usually in bounds (bail out otherwise).
+    index = addBoundsCheck(index, length);
+
+    // Convert array index to element data offset.
+    MConstant *alignment = MConstant::New(Int32Value(elemSize));
+    current->add(alignment);
+
+    // Since we passed the bounds check, it is impossible for the
+    // result of multiplication to overflow; so enable imul path.
+    MMul *indexAsByteOffset = MMul::New(index, alignment, MIRType_Int32,
+                                        MMul::Integer);
+    current->add(indexAsByteOffset);
+
+    // Find location within the owner object.
+    MDefinition *owner;
+    MDefinition *indexAsByteOffsetFromOwner;
+    if (obj->isNewDerivedTypedObject()) {
+        MNewDerivedTypedObject *ins = obj->toNewDerivedTypedObject();
+        MDefinition *ownerOffset = ins->offset();
+
+        MAdd *offsetPlusScaledIndex = MAdd::NewAsmJS(ownerOffset,
+                                                     indexAsByteOffset,
+                                                     MIRType_Int32);
+        current->add(offsetPlusScaledIndex);
+
+        owner = ins->owner();
+        indexAsByteOffsetFromOwner = offsetPlusScaledIndex;
+    } else {
+        owner = obj;
+        indexAsByteOffsetFromOwner = indexAsByteOffset;
+    }
+
+    // Load the element data.
+    MTypedObjectElements *elements = MTypedObjectElements::New(owner);
+    current->add(elements);
+
+    // Create the derived type object.
+    MInstruction *derived = new MNewDerivedTypedObject(elemTypeReprs,
+                                                       elemType,
+                                                       owner,
+                                                       indexAsByteOffsetFromOwner);
+
+    types::TemporaryTypeSet *resultTypes = bytecodeTypes(pc);
+    derived->setResultTypeSet(resultTypes);
+    current->add(derived);
+    current->push(derived);
+
+    return true;
+}
+
+bool
 IonBuilder::getElemTryDense(bool *emitted, MDefinition *obj, MDefinition *index)
 {
     JS_ASSERT(*emitted == false);
 
     if (!ElementAccessIsDenseNative(obj, index))
         return true;
 
     // Don't generate a fast path if there have been bounds check failures
@@ -6543,17 +6763,17 @@ IonBuilder::getElemTryTypedStatic(bool *
             load->setInfallible();
     }
 
     *emitted = true;
     return true;
 }
 
 bool
-IonBuilder::getElemTryTyped(bool *emitted, MDefinition *obj, MDefinition *index)
+IonBuilder::getElemTryTypedArray(bool *emitted, MDefinition *obj, MDefinition *index)
 {
     JS_ASSERT(*emitted == false);
 
     ScalarTypeRepresentation::Type arrayType;
     if (!ElementAccessIsTypedArray(obj, index, &arrayType))
         return true;
 
     // Emit typed getelem variant.
@@ -6698,17 +6918,17 @@ IonBuilder::getElemTryCache(bool *emitte
     // of this getelem.
     bool nonNativeGetElement = inspector->hasSeenNonNativeGetElement(pc);
     if (index->mightBeType(MIRType_Int32) && nonNativeGetElement)
         return true;
 
     // Emit GetElementCache.
 
     types::TemporaryTypeSet *types = bytecodeTypes(pc);
-    bool barrier = PropertyReadNeedsTypeBarrier(context(), constraints(), obj, nullptr, types);
+    bool barrier = PropertyReadNeedsTypeBarrier(analysisContext, constraints(), obj, nullptr, types);
 
     // Always add a barrier if the index might be a string, so that the cache
     // can attach stubs for particular properties.
     if (index->mightBeType(MIRType_String))
         barrier = true;
 
     // See note about always needing a barrier in jsop_getprop.
     if (needsToMonitorMissingProperties(types))
@@ -6746,17 +6966,17 @@ IonBuilder::jsop_getelem_dense(MDefiniti
     if (JSOp(*pc) == JSOP_CALLELEM && !index->mightBeType(MIRType_String)) {
         // Indexed call on an element of an array. Populate the observed types
         // with any objects that could be in the array, to avoid extraneous
         // type barriers.
         if (!AddObjectsForPropertyRead(obj, nullptr, types))
             return false;
     }
 
-    bool barrier = PropertyReadNeedsTypeBarrier(context(), constraints(), obj, nullptr, types);
+    bool barrier = PropertyReadNeedsTypeBarrier(analysisContext, constraints(), obj, nullptr, types);
     bool needsHoleCheck = !ElementAccessIsPacked(constraints(), obj);
 
     // Reads which are on holes in the object do not have to bail out if
     // undefined values have been observed at this access site and the access
     // cannot hit another indexed property on the object or its prototypes.
     bool readOutOfBounds =
         types->hasType(types::Type::UndefinedType()) &&
         !ElementAccessHasExtraIndexedProperty(constraints(), obj);
@@ -7596,21 +7816,24 @@ IonBuilder::objectsHaveCommonPrototype(t
 
             // Look for a getter/setter on the class itself which may need
             // to be called.
             if (isGetter && clasp->ops.getGeneric)
                 return false;
             if (!isGetter && clasp->ops.setGeneric)
                 return false;
 
-            // Note: freezePropertiesForCommonPropFunc will freeze the property
-            // type sets later on if optimizing.
+            // Test for isOwnProperty() without freezing. If we end up
+            // optimizing, freezePropertiesForCommonPropFunc will freeze the
+            // property type sets later on.
             types::HeapTypeSetKey property = type->property(NameToId(name));
-            if (property.maybeTypes() && !property.maybeTypes()->empty())
-                return false;
+            if (types::TypeSet *types = property.maybeTypes()) {
+                if (!types->empty() || types->configuredProperty())
+                    return false;
+            }
             if (JSObject *obj = type->singleton()) {
                 if (types::CanHaveEmptyPropertyTypesForOwnProperty(obj))
                     return false;
             }
 
             JSObject *proto = type->proto().toObjectOrNull();
             if (proto == foundProto)
                 break;
@@ -7851,17 +8074,17 @@ IonBuilder::jsop_getprop(PropertyName *n
 {
     bool emitted = false;
 
     // Try to optimize arguments.length.
     if (!getPropTryArgumentsLength(&emitted) || emitted)
         return emitted;
 
     types::TemporaryTypeSet *types = bytecodeTypes(pc);
-    bool barrier = PropertyReadNeedsTypeBarrier(context(), constraints(),
+    bool barrier = PropertyReadNeedsTypeBarrier(analysisContext, constraints(),
                                                 current->peek(-1), name, types);
 
     // Always use a call if we are doing the definite properties analysis and
     // not actually emitting code, to simplify later analysis. Also skip deeper
     // analysis if there are no known types for this operation, as it will
     // always invalidate when executing.
     if (info().executionMode() == DefinitePropertiesAnalysis || types->empty()) {
         MDefinition *obj = current->peek(-1);
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -200,17 +200,17 @@ class IonBuilder : public MIRGenerator
         static CFGState CondSwitch(IonBuilder *builder, jsbytecode *exitpc, jsbytecode *defaultTarget);
         static CFGState Label(jsbytecode *exitpc);
         static CFGState Try(jsbytecode *exitpc, MBasicBlock *successor);
     };
 
     static int CmpSuccessors(const void *a, const void *b);
 
   public:
-    IonBuilder(JSContext *cx, TempAllocator *temp, MIRGraph *graph,
+    IonBuilder(JSContext *analysisContext, JSCompartment *comp, TempAllocator *temp, MIRGraph *graph,
                types::CompilerConstraintList *constraints,
                BaselineInspector *inspector, CompileInfo *info, BaselineFrame *baselineFrame,
                size_t inliningDepth = 0, uint32_t loopDepth = 0);
 
     bool build();
     bool buildInline(IonBuilder *callerBuilder, MResumePoint *callerResumePoint,
                      CallInfo &callInfo);
 
@@ -430,21 +430,34 @@ class IonBuilder : public MIRGenerator
     bool setElemTryArguments(bool *emitted, MDefinition *object,
                              MDefinition *index, MDefinition *value);
     bool setElemTryCache(bool *emitted, MDefinition *object,
                          MDefinition *index, MDefinition *value);
 
     // jsop_getelem() helpers.
     bool getElemTryDense(bool *emitted, MDefinition *obj, MDefinition *index);
     bool getElemTryTypedStatic(bool *emitted, MDefinition *obj, MDefinition *index);
-    bool getElemTryTyped(bool *emitted, MDefinition *obj, MDefinition *index);
+    bool getElemTryTypedArray(bool *emitted, MDefinition *obj, MDefinition *index);
+    bool getElemTryTypedObject(bool *emitted, MDefinition *obj, MDefinition *index);
     bool getElemTryString(bool *emitted, MDefinition *obj, MDefinition *index);
     bool getElemTryArguments(bool *emitted, MDefinition *obj, MDefinition *index);
     bool getElemTryArgumentsInlined(bool *emitted, MDefinition *obj, MDefinition *index);
     bool getElemTryCache(bool *emitted, MDefinition *obj, MDefinition *index);
+    bool getElemTryScalarElemOfTypedObject(bool *emitted,
+                                           MDefinition *obj,
+                                           MDefinition *index,
+                                           TypeRepresentationSet objTypeReprs,
+                                           TypeRepresentationSet elemTypeReprs,
+                                           size_t elemSize);
+    bool getElemTryComplexElemOfTypedObject(bool *emitted,
+                                            MDefinition *obj,
+                                            MDefinition *index,
+                                            TypeRepresentationSet objTypeReprs,
+                                            TypeRepresentationSet elemTypeReprs,
+                                            size_t elemSize);
 
     // Typed array helpers.
     MInstruction *getTypedArrayLength(MDefinition *obj);
     MInstruction *getTypedArrayElements(MDefinition *obj);
 
     bool jsop_add(MDefinition *left, MDefinition *right);
     bool jsop_bitnot();
     bool jsop_bitop(JSOp op);
@@ -545,16 +558,17 @@ class IonBuilder : public MIRGenerator
     InliningStatus inlineArrayConcat(CallInfo &callInfo);
 
     // Math natives.
     InliningStatus inlineMathAbs(CallInfo &callInfo);
     InliningStatus inlineMathFloor(CallInfo &callInfo);
     InliningStatus inlineMathRound(CallInfo &callInfo);
     InliningStatus inlineMathSqrt(CallInfo &callInfo);
     InliningStatus inlineMathAtan2(CallInfo &callInfo);
+    InliningStatus inlineMathHypot(CallInfo &callInfo);
     InliningStatus inlineMathMinMax(CallInfo &callInfo, bool max);
     InliningStatus inlineMathPow(CallInfo &callInfo);
     InliningStatus inlineMathRandom(CallInfo &callInfo);
     InliningStatus inlineMathImul(CallInfo &callInfo);
     InliningStatus inlineMathFRound(CallInfo &callInfo);
     InliningStatus inlineMathFunction(CallInfo &callInfo, MMathFunction::Function function);
 
     // String natives.
@@ -691,32 +705,22 @@ class IonBuilder : public MIRGenerator
     types::CompilerConstraintList *constraints() {
         return constraints_;
     }
 
     bool isInlineBuilder() const {
         return callerBuilder_ != nullptr;
     }
 
-    JSContext *context() {
-        // JSContexts are only available to IonBuilder when running on the main
-        // thread, which after bug 785905 will only occur when doing eager
-        // analyses with no available baseline information. Until this bug is
-        // completed, both the |cx| member and |context()| may be used.
-        if (info().executionMode() == DefinitePropertiesAnalysis)
-            return cx;
-        return nullptr;
-    }
-
     JSAtomState &names() { return compartment->runtimeFromAnyThread()->atomState; }
 
   private:
     bool init();
 
-    JSContext *cx;
+    JSContext *analysisContext;
     BaselineFrame *baselineFrame_;
     AbortReason abortReason_;
     TypeRepresentationSetHash *reprSetHash_;
 
     // Constraints for recording dependencies on type information.
     types::CompilerConstraintList *constraints_;
 
     // Basic analysis information about the script.
--- a/js/src/jit/LIR-Common.h
+++ b/js/src/jit/LIR-Common.h
@@ -2364,16 +2364,43 @@ class LAtan2D : public LCallInstructionH
         return getTemp(0);
     }
 
     const LDefinition *output() {
         return getDef(0);
     }
 };
 
+class LHypot : public LCallInstructionHelper<1, 2, 1>
+{
+  public:
+    LIR_HEADER(Hypot)
+    LHypot(const LAllocation &x, const LAllocation &y, const LDefinition &temp) {
+        setOperand(0, x);
+        setOperand(1, y);
+        setTemp(0, temp);
+    }
+
+    const LAllocation *x() {
+        return getOperand(0);
+    }
+
+    const LAllocation *y() {
+        return getOperand(1);
+    }
+
+    const LDefinition *temp() {
+        return getTemp(0);
+    }
+
+    const LDefinition *output() {
+        return getDef(0);
+    }
+};
+
 // Double raised to an integer power.
 class LPowI : public LCallInstructionHelper<1, 2, 1>
 {
   public:
     LIR_HEADER(PowI)
     LPowI(const LAllocation &value, const LAllocation &power, const LDefinition &temp) {
         setOperand(0, value);
         setOperand(1, power);
--- a/js/src/jit/LOpcodes.h
+++ b/js/src/jit/LOpcodes.h
@@ -100,16 +100,17 @@
     _(NegD)                         \
     _(NegF)                         \
     _(AbsI)                         \
     _(AbsD)                         \
     _(AbsF)                         \
     _(SqrtD)                        \
     _(SqrtF)                        \
     _(Atan2D)                       \
+    _(Hypot)                        \
     _(PowI)                         \
     _(PowD)                         \
     _(Random)                       \
     _(MathFunctionD)                \
     _(MathFunctionF)                \
     _(NotI)                         \
     _(NotD)                         \
     _(NotF)                         \
--- a/js/src/jit/Lowering.cpp
+++ b/js/src/jit/Lowering.cpp
@@ -1217,16 +1217,29 @@ LIRGenerator::visitAtan2(MAtan2 *ins)
     MDefinition *x = ins->x();
     JS_ASSERT(x->type() == MIRType_Double);
 
     LAtan2D *lir = new LAtan2D(useRegisterAtStart(y), useRegisterAtStart(x), tempFixed(CallTempReg0));
     return defineReturn(lir, ins);
 }
 
 bool
+LIRGenerator::visitHypot(MHypot *ins)
+{
+    MDefinition *x = ins->x();
+    JS_ASSERT(x->type() == MIRType_Double);
+
+    MDefinition *y = ins->y();
+    JS_ASSERT(y->type() == MIRType_Double);
+
+    LHypot *lir = new LHypot(useRegisterAtStart(x), useRegisterAtStart(y), tempFixed(CallTempReg0));
+    return defineReturn(lir, ins);
+}
+
+bool
 LIRGenerator::visitPow(MPow *ins)
 {
     MDefinition *input = ins->input();
     JS_ASSERT(input->type() == MIRType_Double);
 
     MDefinition *power = ins->power();
     JS_ASSERT(power->type() == MIRType_Int32 || power->type() == MIRType_Double);
 
--- a/js/src/jit/Lowering.h
+++ b/js/src/jit/Lowering.h
@@ -131,16 +131,17 @@ class LIRGenerator : public LIRGenerator
     bool visitRsh(MRsh *ins);
     bool visitUrsh(MUrsh *ins);
     bool visitFloor(MFloor *ins);
     bool visitRound(MRound *ins);
     bool visitMinMax(MMinMax *ins);
     bool visitAbs(MAbs *ins);
     bool visitSqrt(MSqrt *ins);
     bool visitAtan2(MAtan2 *ins);
+    bool visitHypot(MHypot *ins);
     bool visitPow(MPow *ins);
     bool visitRandom(MRandom *ins);
     bool visitMathFunction(MMathFunction *ins);
     bool visitAdd(MAdd *ins);
     bool visitSub(MSub *ins);
     bool visitMul(MMul *ins);
     bool visitDiv(MDiv *ins);
     bool visitMod(MMod *ins);
--- a/js/src/jit/MCallOptimize.cpp
+++ b/js/src/jit/MCallOptimize.cpp
@@ -42,16 +42,18 @@ IonBuilder::inlineNativeCall(CallInfo &c
     if (native == js::math_floor)
         return inlineMathFloor(callInfo);
     if (native == js::math_round)
         return inlineMathRound(callInfo);
     if (native == js_math_sqrt)
         return inlineMathSqrt(callInfo);
     if (native == math_atan2)
         return inlineMathAtan2(callInfo);
+    if (native == js::math_hypot)
+        return inlineMathHypot(callInfo);
     if (native == js_math_max)
         return inlineMathMinMax(callInfo, true /* max */);
     if (native == js_math_min)
         return inlineMathMinMax(callInfo, false /* max */);
     if (native == js_math_pow)
         return inlineMathPow(callInfo);
     if (native == js_math_random)
         return inlineMathRandom(callInfo);
@@ -321,17 +323,17 @@ IonBuilder::inlineArrayPopShift(CallInfo
         return InliningStatus_NotInlined;
 
     callInfo.unwrapArgs();
 
     types::TemporaryTypeSet *returnTypes = getInlineReturnTypeSet();
     bool needsHoleCheck = thisTypes->hasObjectFlags(constraints(), types::OBJECT_FLAG_NON_PACKED);
     bool maybeUndefined = returnTypes->hasType(types::Type::UndefinedType());
 
-    bool barrier = PropertyReadNeedsTypeBarrier(context(), constraints(),
+    bool barrier = PropertyReadNeedsTypeBarrier(analysisContext, constraints(),
                                                 callInfo.thisArg(), nullptr, returnTypes);
     if (barrier)
         returnType = MIRType_Value;
 
     MArrayPopShift *ins = MArrayPopShift::New(callInfo.thisArg(), mode,
                                               needsHoleCheck, maybeUndefined);
     current->add(ins);
     current->push(ins);
@@ -671,16 +673,42 @@ IonBuilder::inlineMathAtan2(CallInfo &ca
 
     MAtan2 *atan2 = MAtan2::New(callInfo.getArg(0), callInfo.getArg(1));
     current->add(atan2);
     current->push(atan2);
     return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningStatus
+IonBuilder::inlineMathHypot(CallInfo &callInfo)
+{
+    if (callInfo.constructing())
+        return InliningStatus_NotInlined;
+
+    if (callInfo.argc() != 2)
+        return InliningStatus_NotInlined;
+
+    if (getInlineReturnType() != MIRType_Double)
+        return InliningStatus_NotInlined;
+
+    MIRType argType0 = callInfo.getArg(0)->type();
+    MIRType argType1 = callInfo.getArg(1)->type();
+
+    if (!IsNumberType(argType0) || !IsNumberType(argType1))
+        return InliningStatus_NotInlined;
+
+    callInfo.unwrapArgs();
+
+    MHypot *hypot = MHypot::New(callInfo.getArg(0), callInfo.getArg(1));
+    current->add(hypot);
+    current->push(hypot);
+    return InliningStatus_Inlined;
+}
+
+IonBuilder::InliningStatus
 IonBuilder::inlineMathPow(CallInfo &callInfo)
 {
     if (callInfo.constructing())
         return InliningStatus_NotInlined;
 
     if (callInfo.argc() != 2)
         return InliningStatus_NotInlined;
 
@@ -850,42 +878,46 @@ IonBuilder::inlineMathFRound(CallInfo &c
     current->add(ins);
     current->push(ins);
     return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningStatus
 IonBuilder::inlineMathMinMax(CallInfo &callInfo, bool max)
 {
-    if (callInfo.argc() != 2 || callInfo.constructing())
+    if (callInfo.argc() < 2 || callInfo.constructing())
         return InliningStatus_NotInlined;
 
     MIRType returnType = getInlineReturnType();
     if (!IsNumberType(returnType))
         return InliningStatus_NotInlined;
 
-    MIRType arg0Type = callInfo.getArg(0)->type();
-    if (!IsNumberType(arg0Type))
-        return InliningStatus_NotInlined;
-    MIRType arg1Type = callInfo.getArg(1)->type();
-    if (!IsNumberType(arg1Type))
-        return InliningStatus_NotInlined;
+    for (unsigned i = 0; i < callInfo.argc(); i++) {
+        MIRType argType = callInfo.getArg(i)->type();
+        if (!IsNumberType(argType))
+            return InliningStatus_NotInlined;
 
-    if (returnType == MIRType_Int32 &&
-        (arg0Type == MIRType_Double || arg1Type == MIRType_Double))
-    {
-        // We would need to inform TI, if we happen to return a double.
-        return InliningStatus_NotInlined;
+        // We would need to inform TI if we happen to return a double.
+        if (returnType == MIRType_Int32 && IsFloatingPointType(argType))
+            return InliningStatus_NotInlined;
     }
 
     callInfo.unwrapArgs();
 
-    MMinMax *ins = MMinMax::New(callInfo.getArg(0), callInfo.getArg(1), returnType, max);
-    current->add(ins);
-    current->push(ins);
+    // Chain N-1 MMinMax instructions to compute the MinMax.
+    MMinMax *last = MMinMax::New(callInfo.getArg(0), callInfo.getArg(1), returnType, max);
+    current->add(last);
+
+    for (unsigned i = 2; i < callInfo.argc(); i++) {
+        MMinMax *ins = MMinMax::New(last, callInfo.getArg(i), returnType, max);
+        current->add(ins);
+        last = ins;
+    }
+
+    current->push(last);
     return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningStatus
 IonBuilder::inlineStringObject(CallInfo &callInfo)
 {
     if (callInfo.argc() != 1 || !callInfo.constructing())
         return InliningStatus_NotInlined;
@@ -1464,17 +1496,18 @@ IonBuilder::inlineUnsafeGetReservedSlot(
 
     callInfo.unwrapArgs();
 
     MLoadFixedSlot *load = MLoadFixedSlot::New(callInfo.getArg(0), slot);
     current->add(load);
     current->push(load);
 
     // We don't track reserved slot types, so always emit a barrier.
-    pushTypeBarrier(load, getInlineReturnTypeSet(), true);
+    if (!pushTypeBarrier(load, getInlineReturnTypeSet(), true))
+        return InliningStatus_Error;
 
     return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningStatus
 IonBuilder::inlineHaveSameClass(CallInfo &callInfo)
 {
     if (callInfo.argc() != 2 || callInfo.constructing())
--- a/js/src/jit/MIR.cpp
+++ b/js/src/jit/MIR.cpp
@@ -2923,18 +2923,21 @@ jit::PropertyReadNeedsTypeBarrier(JSCont
     if (updateObserved && observed->empty() && name) {
         JSObject *obj = object->singleton() ? object->singleton() : object->proto().toObjectOrNull();
 
         while (obj) {
             if (!obj->isNative())
                 break;
 
             types::TypeObjectKey *typeObj = types::TypeObjectKey::get(obj);
+            if (propertycx)
+                typeObj->ensureTrackedProperty(propertycx, NameToId(name));
+
             if (!typeObj->unknownProperties()) {
-                types::HeapTypeSetKey property = typeObj->property(NameToId(name), propertycx);
+                types::HeapTypeSetKey property = typeObj->property(NameToId(name));
                 if (property.maybeTypes()) {
                     types::TypeSet::TypeList types;
                     if (!property.maybeTypes()->enumerateTypes(&types))
                         return false;
                     if (types.length()) {
                         if (!observed->addType(types[0], GetIonContext()->temp->lifoAlloc()))
                             return false;
                         break;
--- a/js/src/jit/MIR.h
+++ b/js/src/jit/MIR.h
@@ -3581,16 +3581,59 @@ class MAtan2
         return AliasSet::None();
     }
 
     bool possiblyCalls() const {
         return true;
     }
 };
 
+// Inline implementation of Math.hypot().
+class MHypot
+  : public MBinaryInstruction,
+    public MixPolicy<DoublePolicy<0>, DoublePolicy<1> >
+{
+    MHypot(MDefinition *y, MDefinition *x)
+      : MBinaryInstruction(x, y)
+    {
+        setResultType(MIRType_Double);
+        setMovable();
+    }
+
+  public:
+    INSTRUCTION_HEADER(Hypot)
+    static MHypot *New(MDefinition *x, MDefinition *y) {
+        return new MHypot(y, x);
+    }
+
+    MDefinition *x() const {
+        return getOperand(0);
+    }
+
+    MDefinition *y() const {
+        return getOperand(1);
+    }
+
+    TypePolicy *typePolicy() {
+        return this;
+    }
+
+    bool congruentTo(MDefinition *ins) const {
+        return congruentIfOperandsEqual(ins);
+    }
+
+    AliasSet getAliasSet() const {
+        return AliasSet::None();
+    }
+
+    bool possiblyCalls() const {
+        return true;
+    }
+};
+
 // Inline implementation of Math.pow().
 class MPow
   : public MBinaryInstruction,
     public PowPolicy
 {
     MPow(MDefinition *input, MDefinition *power, MIRType powerType)
       : MBinaryInstruction(input, power),
         PowPolicy(powerType)
--- a/js/src/jit/MOpcodes.h
+++ b/js/src/jit/MOpcodes.h
@@ -54,16 +54,17 @@ namespace jit {
     _(BitXor)                                                               \
     _(Lsh)                                                                  \
     _(Rsh)                                                                  \
     _(Ursh)                                                                 \
     _(MinMax)                                                               \
     _(Abs)                                                                  \
     _(Sqrt)                                                                 \
     _(Atan2)                                                                \
+    _(Hypot)                                                                \
     _(Pow)                                                                  \
     _(PowHalf)                                                              \
     _(Random)                                                               \
     _(MathFunction)                                                         \
     _(Add)                                                                  \
     _(Sub)                                                                  \
     _(Mul)                                                                  \
     _(Div)                                                                  \
--- a/js/src/jit/ParallelSafetyAnalysis.cpp
+++ b/js/src/jit/ParallelSafetyAnalysis.cpp
@@ -148,16 +148,17 @@ class ParallelSafetyVisitor : public MIn
     SAFE_OP(BitXor)
     SAFE_OP(Lsh)
     SAFE_OP(Rsh)
     SAFE_OP(Ursh)
     SPECIALIZED_OP(MinMax, PERMIT_NUMERIC)
     SAFE_OP(Abs)
     SAFE_OP(Sqrt)
     UNSAFE_OP(Atan2)
+    UNSAFE_OP(Hypot)
     CUSTOM_OP(MathFunction)
     SPECIALIZED_OP(Add, PERMIT_NUMERIC)
     SPECIALIZED_OP(Sub, PERMIT_NUMERIC)
     SPECIALIZED_OP(Mul, PERMIT_NUMERIC)
     SPECIALIZED_OP(Div, PERMIT_NUMERIC)
     SPECIALIZED_OP(Mod, PERMIT_NUMERIC)
     CUSTOM_OP(Concat)
     SAFE_OP(ConcatPar)
--- a/js/src/jit/TypeRepresentationSet.cpp
+++ b/js/src/jit/TypeRepresentationSet.cpp
@@ -174,24 +174,49 @@ TypeRepresentationSet::length()
 TypeRepresentation *
 TypeRepresentationSet::get(size_t i)
 {
     JS_ASSERT(i < length());
     return entries_[i];
 }
 
 bool
+TypeRepresentationSet::allOfArrayKind()
+{
+    if (empty())
+        return false;
+
+    return kind() == TypeRepresentation::Array;
+}
+
+bool
 TypeRepresentationSet::allOfKind(TypeRepresentation::Kind aKind)
 {
     if (empty())
         return false;
 
     return kind() == aKind;
 }
 
+bool
+TypeRepresentationSet::allHaveSameSize(size_t *out)
+{
+    if (empty())
+        return false;
+
+    size_t size = get(0)->size();
+    for (size_t i = 1; i < length(); i++) {
+        if (get(i)->size() != size)
+            return false;
+    }
+
+    *out = size;
+    return true;
+}
+
 TypeRepresentation::Kind
 TypeRepresentationSet::kind()
 {
     JS_ASSERT(!empty());
     return get(0)->kind();
 }
 
 size_t
--- a/js/src/jit/TypeRepresentationSet.h
+++ b/js/src/jit/TypeRepresentationSet.h
@@ -75,16 +75,30 @@ class TypeRepresentationSet {
     //////////////////////////////////////////////////////////////////////
     // Query the set
 
     bool empty();
     size_t length();
     TypeRepresentation *get(size_t i);
     bool allOfKind(TypeRepresentation::Kind kind);
 
+    // Returns true only when non-empty and `kind()` is
+    // `TypeRepresentation::Array`
+    bool allOfArrayKind();
+
+    // Returns true only if (1) non-empty, (2) for all types t in this
+    // set, t is sized, and (3) there is some size S such that for all
+    // types t in this set, `t.size() == S`.  When the above holds,
+    // then also sets `*out` to S; otherwise leaves `*out` unchanged
+    // and returns false.
+    //
+    // At the moment condition (2) trivially holds.  When Bug 922115
+    // lands, some array types will be unsized.
+    bool allHaveSameSize(size_t *out);
+
     //////////////////////////////////////////////////////////////////////
     // The following operations are only valid on a non-empty set:
 
     TypeRepresentation::Kind kind();
 
     //////////////////////////////////////////////////////////////////////
     // Array operations
     //
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -1932,76 +1932,80 @@ TriggerOperationCallback(JSRuntime *rt, 
     if (rt->gcIsNeeded)
         return;
 
     rt->gcIsNeeded = true;
     rt->gcTriggerReason = reason;
     rt->triggerOperationCallback(JSRuntime::TriggerCallbackMainThread);
 }
 
-void
+bool
 js::TriggerGC(JSRuntime *rt, JS::gcreason::Reason reason)
 {
     /* Wait till end of parallel section to trigger GC. */
     if (InParallelSection()) {
         ForkJoinSlice::Current()->requestGC(reason);
-        return;
+        return true;
     }
 
     /* Don't trigger GCs when allocating under the operation callback lock. */
     if (rt->currentThreadOwnsOperationCallbackLock())
-        return;
+        return false;
 
     JS_ASSERT(CurrentThreadCanAccessRuntime(rt));
 
-    if (rt->isHeapBusy())
-        return;
+    /* GC is already running. */
+    if (rt->isHeapCollecting())
+        return false;
 
     JS::PrepareForFullGC(rt);
     TriggerOperationCallback(rt, reason);
-}
-
-void
+    return true;
+}
+
+bool
 js::TriggerZoneGC(Zone *zone, JS::gcreason::Reason reason)
 {
     /*
      * If parallel threads are running, wait till they
      * are stopped to trigger GC.
      */
     if (InParallelSection()) {
         ForkJoinSlice::Current()->requestZoneGC(zone, reason);
-        return;
+        return true;
     }
 
     /* Zones in use by a thread with an exclusive context can't be collected. */
     if (zone->usedByExclusiveThread)
-        return;
+        return false;
 
     JSRuntime *rt = zone->runtimeFromMainThread();
 
     /* Don't trigger GCs when allocating under the operation callback lock. */
     if (rt->currentThreadOwnsOperationCallbackLock())
-        return;
-
-    if (rt->isHeapBusy())
-        return;
+        return false;
+
+    /* GC is already running. */
+    if (rt->isHeapCollecting())
+        return false;
 
     if (rt->gcZeal() == ZealAllocValue) {
         TriggerGC(rt, reason);
-        return;
+        return true;
     }
 
     if (rt->isAtomsZone(zone)) {
         /* We can't do a zone GC of the atoms compartment. */
         TriggerGC(rt, reason);
-        return;
+        return true;
     }
 
     PrepareZoneForGC(zone);
     TriggerOperationCallback(rt, reason);
+    return true;
 }
 
 void
 js::MaybeGC(JSContext *cx)
 {
     JSRuntime *rt = cx->runtime();
     JS_ASSERT(CurrentThreadCanAccessRuntime(rt));
 
@@ -2907,16 +2911,19 @@ BeginMarkPhase(JSRuntime *rt)
         zone->allocator.arenas.unmarkAll();
     }
 
     for (GCCompartmentsIter c(rt); !c.done(); c.next()) {
         /* Reset weak map list for the compartments being collected. */
         WeakMapBase::resetCompartmentWeakMapList(c);
     }
 
+    if (rt->gcIsFull)
+        UnmarkScriptData(rt);
+
     MarkRuntime(gcmarker);
     BufferGrayRoots(gcmarker);
 
     /*
      * This code ensures that if a zone is "dead", then it will be
      * collected in this GC. A zone is considered dead if its maybeAlive
      * flag is false. The maybeAlive flag is set if:
      *   (1) the zone has incoming cross-compartment edges, or
--- a/js/src/jsgc.h
+++ b/js/src/jsgc.h
@@ -685,21 +685,21 @@ class StackFrame;
 
 extern void
 MarkCompartmentActive(js::StackFrame *fp);
 
 extern void
 TraceRuntime(JSTracer *trc);
 
 /* Must be called with GC lock taken. */
-extern void
+extern bool
 TriggerGC(JSRuntime *rt, JS::gcreason::Reason reason);
 
 /* Must be called with GC lock taken. */
-extern void
+extern bool
 TriggerZoneGC(Zone *zone, JS::gcreason::Reason reason);
 
 extern void
 MaybeGC(JSContext *cx);
 
 extern void
 ReleaseAllJITCode(FreeOp *op);
 
--- a/js/src/jsinfer.cpp
+++ b/js/src/jsinfer.cpp
@@ -822,42 +822,44 @@ bool
 TypeObjectKey::unknownProperties()
 {
     if (TypeObject *type = maybeType())
         return type->unknownProperties();
     return false;
 }
 
 HeapTypeSetKey
-TypeObjectKey::property(jsid id, JSContext *maybecx /* = nullptr */)
+TypeObjectKey::property(jsid id)
 {
     JS_ASSERT(!unknownProperties());
 
     HeapTypeSetKey property;
     property.object_ = this;
     property.id_ = id;
     if (TypeObject *type = maybeType())
         property.maybeTypes_ = type->maybeGetProperty(id);
 
+    return property;
+}
+
+void
+TypeObjectKey::ensureTrackedProperty(JSContext *cx, jsid id)
+{
 #ifdef JS_ION
     // If we are accessing a lazily defined property which actually exists in
     // the VM and has not been instantiated yet, instantiate it now if we are
     // on the main thread and able to do so.
-    if (maybecx && !property.maybeTypes() && !JSID_IS_VOID(id) && !JSID_IS_EMPTY(id)) {
-        JS_ASSERT(CurrentThreadCanAccessRuntime(maybecx->runtime()));
-        JSObject *singleton = isSingleObject() ? asSingleObject() : asTypeObject()->singleton;
-        if (singleton && singleton->isNative() && singleton->nativeLookupPure(id)) {
-            EnsureTrackPropertyTypes(maybecx, singleton, id);
-            if (TypeObject *type = maybeType())
-                property.maybeTypes_ = type->maybeGetProperty(id);
+    if (!JSID_IS_VOID(id) && !JSID_IS_EMPTY(id)) {
+        JS_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
+        if (JSObject *obj = singleton()) {
+            if (obj->isNative() && obj->nativeLookupPure(id))
+                EnsureTrackPropertyTypes(cx, obj, id);
         }
     }
 #endif // JS_ION
-
-    return property;
 }
 
 bool
 HeapTypeSetKey::instantiate(JSContext *cx)
 {
     if (maybeTypes())
         return true;
     if (object()->isSingleObject() && !object()->asSingleObject()->getType(cx))
--- a/js/src/jsinfer.h
+++ b/js/src/jsinfer.h
@@ -1252,17 +1252,18 @@ struct TypeObjectKey
     JSObject *singleton();
     TypeNewScript *newScript();
 
     bool unknownProperties();
     bool hasFlags(CompilerConstraintList *constraints, TypeObjectFlags flags);
     void watchStateChangeForInlinedCall(CompilerConstraintList *constraints);
     void watchStateChangeForNewScriptTemplate(CompilerConstraintList *constraints);
     void watchStateChangeForTypedArrayBuffer(CompilerConstraintList *constraints);
-    HeapTypeSetKey property(jsid id, JSContext *maybecx = nullptr);
+    HeapTypeSetKey property(jsid id);
+    void ensureTrackedProperty(JSContext *cx, jsid id);
 
     TypeObject *maybeType();
 };
 
 // Representation of a heap type property which may or may not be instantiated.
 // Heap properties for singleton types are instantiated lazily as they are used
 // by the compiler, but this is only done on the main thread. If we are
 // compiling off thread and use a property which has not yet been instantiated,
--- a/js/src/jsmath.cpp
+++ b/js/src/jsmath.cpp
@@ -1270,21 +1270,51 @@ js::math_atanh_uncached(double x)
 }
 
 bool
 js::math_atanh(JSContext *cx, unsigned argc, Value *vp)
 {
     return math_function<math_atanh_impl>(cx, argc, vp);
 }
 
+/* Consistency wrapper for platform deviations in hypot() */
+double
+js::ecmaHypot(double x, double y)
+{
+#ifdef XP_WIN
+    /*
+     * Workaround MS hypot bug, where hypot(Infinity, NaN or Math.MIN_VALUE)
+     * is NaN, not Infinity.
+     */
+    if (mozilla::IsInfinite(x) || mozilla::IsInfinite(y)) {
+        return mozilla::PositiveInfinity();
+    }
+#endif
+    return hypot(x, y);
+}
+
 bool
 js::math_hypot(JSContext *cx, unsigned argc, Value *vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 
+    // IonMonkey calls the system hypot function directly if two arguments are
+    // given. Do that here as well to get the same results.
+    if (args.length() == 2) {
+        double x, y;
+        if (!ToNumber(cx, args[0], &x))
+            return false;
+        if (!ToNumber(cx, args[1], &y))
+            return false;
+
+        double result = ecmaHypot(x, y);
+        args.rval().setNumber(result);
+        return true;
+    }
+
     bool isInfinite = false;
     bool isNaN = false;
 
     double scale = 0;
     double sumsq = 1;
 
     for (unsigned i = 0; i < args.length(); i++) {
         double x;
--- a/js/src/jsmath.h
+++ b/js/src/jsmath.h
@@ -157,16 +157,19 @@ extern bool
 math_acosh(JSContext *cx, unsigned argc, js::Value *vp);
 
 extern bool
 math_asinh(JSContext *cx, unsigned argc, js::Value *vp);
 
 extern bool
 math_atanh(JSContext *cx, unsigned argc, js::Value *vp);
 
+extern double
+ecmaHypot(double x, double y);
+
 extern bool
 math_hypot(JSContext *cx, unsigned argc, Value *vp);
 
 extern bool
 math_trunc(JSContext *cx, unsigned argc, Value *vp);
 
 extern bool
 math_sign(JSContext *cx, unsigned argc, Value *vp);
@@ -238,98 +241,89 @@ extern double
 powi(double x, int y);
 
 extern double
 ecmaPow(double x, double y);
 
 extern bool
 math_imul(JSContext *cx, unsigned argc, Value *vp);
 
-extern double 
+extern double
 math_log10_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_log10_uncached(double x);
 
-extern double 
+extern double
 math_log2_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_log2_uncached(double x);
 
-extern double 
+extern double
 math_log1p_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_log1p_uncached(double x);
 
-extern double 
+extern double
 math_expm1_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_expm1_uncached(double x);
 
-extern double 
+extern double
 math_cosh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_cosh_uncached(double x);
 
-extern double 
+extern double
 math_sinh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_sinh_uncached(double x);
 
-extern double 
+extern double
 math_tanh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_tanh_uncached(double x);
 
-extern double 
+extern double
 math_acosh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_acosh_uncached(double x);
 
-extern double 
+extern double
 math_asinh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_asinh_uncached(double x);
 
-extern double 
+extern double
 math_atanh_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_atanh_uncached(double x);
 
-// Math.hypot is disabled pending the resolution of spec issues (bug 896264).
-#if 0
-extern double 
-math_hypot_impl(double x, double y);
-
-extern double 
-math_hypot_uncached(double x, double y);
-#endif
-
-extern double 
+extern double
 math_trunc_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_trunc_uncached(double x);
 
-extern double 
+extern double
 math_sign_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_sign_uncached(double x);
 
-extern double 
+extern double
 math_cbrt_impl(MathCache *cache, double x);
 
-extern double 
+extern double
 math_cbrt_uncached(double x);
 
 } /* namespace js */
 
 #endif /* jsmath_h */
--- a/js/src/jsscript.cpp
+++ b/js/src/jsscript.cpp
@@ -1515,30 +1515,40 @@ MarkScriptData(JSRuntime *rt, const jsby
      * a GC. Since SweepScriptBytecodes is only called during a full gc,
      * to preserve this invariant, only mark during a full gc.
      */
     if (rt->gcIsFull)
         SharedScriptData::fromBytecode(bytecode)->marked = true;
 }
 
 void
+js::UnmarkScriptData(JSRuntime *rt)
+{
+    JS_ASSERT(rt->gcIsFull);
+    ScriptDataTable &table = rt->scriptDataTable();
+    for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) {
+        SharedScriptData *entry = e.front();
+        entry->marked = false;
+    }
+}
+
+void
 js::SweepScriptData(JSRuntime *rt)
 {
     JS_ASSERT(rt->gcIsFull);
     ScriptDataTable &table = rt->scriptDataTable();
 
-    bool keepAtoms = false;
-    for (ThreadDataIter iter(rt); !iter.done(); iter.next())
-        keepAtoms |= iter->gcKeepAtoms;
+    for (ThreadDataIter iter(rt); !iter.done(); iter.next()) {
+        if (iter->gcKeepAtoms)
+            return;
+    }
 
     for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) {
         SharedScriptData *entry = e.front();
-        if (entry->marked) {
-            entry->marked = false;
-        } else if (!keepAtoms) {
+        if (!entry->marked) {
             js_free(entry);
             e.removeFront();
         }
     }
 }
 
 void
 js::FreeScriptData(JSRuntime *rt)
--- a/js/src/jsscript.h
+++ b/js/src/jsscript.h
@@ -1400,16 +1400,19 @@ struct ScriptBytecodeHasher
     }
 };
 
 typedef HashSet<SharedScriptData*,
                 ScriptBytecodeHasher,
                 SystemAllocPolicy> ScriptDataTable;
 
 extern void
+UnmarkScriptData(JSRuntime *rt);
+
+extern void
 SweepScriptData(JSRuntime *rt);
 
 extern void
 FreeScriptData(JSRuntime *rt);
 
 struct ScriptAndCounts
 {
     /* This structure is stored and marked from the JSRuntime. */
--- a/js/src/vm/Runtime.cpp
+++ b/js/src/vm/Runtime.cpp
@@ -230,16 +230,17 @@ JSRuntime::JSRuntime(JSUseHelperThreads 
     gcIncrementalLimit(0),
 #endif
     gcValidate(true),
     gcFullCompartmentChecks(false),
     gcCallback(nullptr),
     gcSliceCallback(nullptr),
     gcFinalizeCallback(nullptr),
     gcMallocBytes(0),
+    gcMallocGCTriggered(false),
     scriptAndCountsVector(nullptr),
     NaNValue(DoubleNaNValue()),
     negativeInfinityValue(DoubleValue(NegativeInfinity())),
     positiveInfinityValue(DoubleValue(PositiveInfinity())),
     emptyString(nullptr),
     debugMode(false),
     spsProfiler(thisFromCtor()),
     profilingScripts(false),
@@ -721,30 +722,31 @@ JSRuntime::updateMallocCounter(size_t nb
 {
     updateMallocCounter(nullptr, nbytes);
 }
 
 void
 JSRuntime::updateMallocCounter(JS::Zone *zone, size_t nbytes)
 {
     /* We tolerate any thread races when updating gcMallocBytes. */
-    ptrdiff_t oldCount = gcMallocBytes;
-    ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes);
-    gcMallocBytes = newCount;
-    if (JS_UNLIKELY(newCount <= 0 && oldCount > 0))
+    gcMallocBytes -= ptrdiff_t(nbytes);
+    if (JS_UNLIKELY(gcMallocBytes <= 0))
         onTooMuchMalloc();
     else if (zone)
         zone->updateMallocCounter(nbytes);
 }
 
 JS_FRIEND_API(void)
 JSRuntime::onTooMuchMalloc()
 {
-    if (CurrentThreadCanAccessRuntime(this))
-        TriggerGC(this, JS::gcreason::TOO_MUCH_MALLOC);
+    if (!CurrentThreadCanAccessRuntime(this))
+        return;
+
+    if (!gcMallocGCTriggered)
+        gcMallocGCTriggered = TriggerGC(this, JS::gcreason::TOO_MUCH_MALLOC);
 }
 
 JS_FRIEND_API(void *)
 JSRuntime::onOutOfMemory(void *p, size_t nbytes)
 {
     return onOutOfMemory(p, nbytes, nullptr);
 }
 
--- a/js/src/vm/Runtime.h
+++ b/js/src/vm/Runtime.h
@@ -1228,17 +1228,26 @@ struct JSRuntime : public JS::shadow::Ru
 
     void                *gcCallbackData;
 
   private:
     /*
      * Malloc counter to measure memory pressure for GC scheduling. It runs
      * from gcMaxMallocBytes down to zero.
      */
-    volatile ptrdiff_t  gcMallocBytes;
+    mozilla::Atomic<ptrdiff_t, mozilla::ReleaseAcquire> gcMallocBytes;
+
+    /*
+     * Whether a GC has been triggered as a result of gcMallocBytes falling
+     * below zero.
+     *
+     * This should be a bool, but Atomic only supports 32-bit and pointer-sized
+     * types.
+     */
+    mozilla::Atomic<uint32_t, mozilla::ReleaseAcquire> gcMallocGCTriggered;
 
   public:
     void setNeedsBarrier(bool needs) {
         needsBarrier_ = needs;
     }
 
     struct ExtraTracer {
         JSTraceDataOp op;
@@ -1543,17 +1552,20 @@ struct JSRuntime : public JS::shadow::Ru
     ~JSRuntime();
 
     bool init(uint32_t maxbytes);
 
     JSRuntime *thisFromCtor() { return this; }
 
     void setGCMaxMallocBytes(size_t value);
 
-    void resetGCMallocBytes() { gcMallocBytes = ptrdiff_t(gcMaxMallocBytes); }
+    void resetGCMallocBytes() {
+        gcMallocBytes = ptrdiff_t(gcMaxMallocBytes);
+        gcMallocGCTriggered = false;
+    }
 
     /*
      * Call this after allocating memory held by GC things, to update memory
      * pressure counters or report the OOM error if necessary. If oomError and
      * cx is not null the function also reports OOM error.
      *
      * The function must be called outside the GC lock and in case of OOM error
      * the caller must ensure that no deadlock possible during OOM reporting.
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -315,16 +315,40 @@ static void DrawBorderImageComponent(nsR
                                      const nsSize& aUnitSize,
                                      const nsStyleBorder& aStyleBorder,
                                      uint8_t aIndex);
 
 static nscolor MakeBevelColor(mozilla::css::Side whichSide, uint8_t style,
                               nscolor aBackgroundColor,
                               nscolor aBorderColor);
 
+static gfxContext::GraphicsOperator GetGFXBlendMode(uint8_t mBlendMode)
+{
+  switch (mBlendMode) {
+     case NS_STYLE_BLEND_NORMAL:      return gfxContext::OPERATOR_OVER;
+     case NS_STYLE_BLEND_MULTIPLY:    return gfxContext::OPERATOR_MULTIPLY;
+     case NS_STYLE_BLEND_SCREEN:      return gfxContext::OPERATOR_SCREEN;
+     case NS_STYLE_BLEND_OVERLAY:     return gfxContext::OPERATOR_OVERLAY;
+     case NS_STYLE_BLEND_DARKEN:      return gfxContext::OPERATOR_DARKEN;
+     case NS_STYLE_BLEND_LIGHTEN:     return gfxContext::OPERATOR_LIGHTEN;
+     case NS_STYLE_BLEND_COLOR_DODGE: return gfxContext::OPERATOR_COLOR_DODGE;
+     case NS_STYLE_BLEND_COLOR_BURN:  return gfxContext::OPERATOR_COLOR_BURN;
+     case NS_STYLE_BLEND_HARD_LIGHT:  return gfxContext::OPERATOR_HARD_LIGHT;
+     case NS_STYLE_BLEND_SOFT_LIGHT:  return gfxContext::OPERATOR_SOFT_LIGHT;
+     case NS_STYLE_BLEND_DIFFERENCE:  return gfxContext::OPERATOR_DIFFERENCE;
+     case NS_STYLE_BLEND_EXCLUSION:   return gfxContext::OPERATOR_EXCLUSION;
+     case NS_STYLE_BLEND_HUE:         return gfxContext::OPERATOR_HUE;
+     case NS_STYLE_BLEND_SATURATION:  return gfxContext::OPERATOR_SATURATION;
+     case NS_STYLE_BLEND_COLOR:       return gfxContext::OPERATOR_COLOR;
+     case NS_STYLE_BLEND_LUMINOSITY:  return gfxContext::OPERATOR_LUMINOSITY;
+  }
+
+  return gfxContext::OPERATOR_OVER;
+}
+
 static InlineBackgroundData* gInlineBGData = nullptr;
 
 // Initialize any static variables used by nsCSSRendering.
 void nsCSSRendering::Init()
 {
   NS_ASSERTION(!gInlineBGData, "Init called twice");
   gInlineBGData = new InlineBackgroundData();
 }
@@ -2556,20 +2580,28 @@ nsCSSRendering::PaintBackgroundWithSC(ns
           clipSet = true;
         }
       }
       if ((aLayer < 0 || i == (uint32_t)startLayer) &&
           !clipState.mDirtyRectGfx.IsEmpty()) {
         nsBackgroundLayerState state = PrepareBackgroundLayer(aPresContext, aForFrame,
             aFlags, aBorderArea, clipState.mBGClipArea, *bg, layer);
         if (!state.mFillArea.IsEmpty()) {
+          if (state.mCompositingOp != gfxContext::OPERATOR_OVER) {
+            NS_ASSERTION(ctx->CurrentOperator() == gfxContext::OPERATOR_OVER,
+                         "It is assumed the initial operator is OPERATOR_OVER, when it is restored later");
+            ctx->SetOperator(state.mCompositingOp);
+          }
           state.mImageRenderer.DrawBackground(aPresContext, aRenderingContext,
                                               state.mDestArea, state.mFillArea,
                                               state.mAnchor + aBorderArea.TopLeft(),
                                               clipState.mDirtyRect);
+          if (state.mCompositingOp != gfxContext::OPERATOR_OVER) {
+            ctx->SetOperator(gfxContext::OPERATOR_OVER);
+          }
         }
       }
     }
   }
 }
 
 void
 nsCSSRendering::PaintBackgroundColorWithSC(nsPresContext* aPresContext,
@@ -2851,16 +2883,17 @@ nsCSSRendering::PrepareBackgroundLayer(n
    *   background-image
    *   background-repeat
    *   background-attachment
    *   background-position
    *   background-clip
    *   background-origin
    *   background-size
    *   background-break (-moz-background-inline-policy)
+   *   background-blend-mode
    *
    * (background-color applies to the entire element and not to individual
    * layers, so it is irrelevant to this method.)
    *
    * These properties have the following dependencies upon each other when
    * determining rendering:
    *
    *   background-image
@@ -2973,16 +3006,19 @@ nsCSSRendering::PrepareBackgroundLayer(n
     state.mFillArea.x = bgClipRect.x;
     state.mFillArea.width = bgClipRect.width;
   }
   if (repeatY == NS_STYLE_BG_REPEAT_REPEAT) {
     state.mFillArea.y = bgClipRect.y;
     state.mFillArea.height = bgClipRect.height;
   }
   state.mFillArea.IntersectRect(state.mFillArea, bgClipRect);
+
+  state.mCompositingOp = GetGFXBlendMode(aLayer.mBlendMode);
+
   return state;
 }
 
 nsRect
 nsCSSRendering::GetBackgroundLayerRect(nsPresContext* aPresContext,
                                        nsIFrame* aForFrame,
                                        const nsRect& aBorderArea,
                                        const nsRect& aClipRect,
--- a/layout/base/nsCSSRendering.h
+++ b/layout/base/nsCSSRendering.h
@@ -208,17 +208,17 @@ private:
  * image to some target, taking into account all CSS background-* properties.
  * See PrepareBackgroundLayer.
  */
 struct nsBackgroundLayerState {
   /**
    * @param aFlags some combination of nsCSSRendering::PAINTBG_* flags
    */
   nsBackgroundLayerState(nsIFrame* aForFrame, const nsStyleImage* aImage, uint32_t aFlags)
-    : mImageRenderer(aForFrame, aImage, aFlags) {}
+    : mImageRenderer(aForFrame, aImage, aFlags), mCompositingOp(gfxContext::OPERATOR_OVER) {}
 
   /**
    * The nsImageRenderer that will be used to draw the background.
    */
   nsImageRenderer mImageRenderer;
   /**
    * A rectangle that one copy of the image tile is mapped onto. Same
    * coordinate system as aBorderArea/aBGClipRect passed into
@@ -232,16 +232,20 @@ struct nsBackgroundLayerState {
    */
   nsRect mFillArea;
   /**
    * The anchor point that should be snapped to a pixel corner. Same
    * coordinate system as aBorderArea/aBGClipRect passed into
    * PrepareBackgroundLayer.
    */
   nsPoint mAnchor;
+  /**
+   * The compositing operation that the image should use
+   */
+  gfxContext::GraphicsOperator mCompositingOp;
 };
 
 struct nsCSSRendering {
   /**
    * Initialize any static variables used by nsCSSRendering.
    */
   static void Init();
   
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -1734,47 +1734,66 @@ nsDisplayBackgroundImage::AppendBackgrou
   nscolor color;
   if (!nsCSSRendering::IsCanvasFrame(aFrame) && bg) {
     bool drawBackgroundImage;
     color =
       nsCSSRendering::DetermineBackgroundColor(presContext, bgSC, aFrame,
                                                drawBackgroundImage, drawBackgroundColor);
   }
 
+  // An auxiliary list is necessary in case we have background blending; if that
+  // is the case, background items need to be wrapped by a blend container to
+  // isolate blending to the background
+  nsDisplayList bgItemList;
   // Even if we don't actually have a background color to paint, we may still need
   // to create an item for hit testing.
   if ((drawBackgroundColor && color != NS_RGBA(0,0,0,0)) ||
       aBuilder->IsForEventDelivery()) {
-    aList->AppendNewToTop(
+    bgItemList.AppendNewToTop(
         new (aBuilder) nsDisplayBackgroundColor(aBuilder, aFrame, bg,
                                                 drawBackgroundColor ? color : NS_RGBA(0, 0, 0, 0)));
   }
 
   if (isThemed) {
     nsDisplayThemedBackground* bgItem =
       new (aBuilder) nsDisplayThemedBackground(aBuilder, aFrame);
-    aList->AppendNewToTop(bgItem);
+    bgItemList.AppendNewToTop(bgItem);
+    aList->AppendToTop(&bgItemList);
     return true;
   }
 
   if (!bg) {
+    aList->AppendToTop(&bgItemList);
     return false;
   }
  
+  bool needBlendContainer = false;
+
   // Passing bg == nullptr in this macro will result in one iteration with
   // i = 0.
   NS_FOR_VISIBLE_BACKGROUND_LAYERS_BACK_TO_FRONT(i, bg) {
     if (bg->mLayers[i].mImage.IsEmpty()) {
       continue;
     }
+
+    if (bg->mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) {
+      needBlendContainer = true;
+    }
+
     nsDisplayBackgroundImage* bgItem =
       new (aBuilder) nsDisplayBackgroundImage(aBuilder, aFrame, i, bg);
-    aList->AppendNewToTop(bgItem);
-  }
-
+    bgItemList.AppendNewToTop(bgItem);
+  }
+
+  if (needBlendContainer) {
+    bgItemList.AppendNewToTop(
+      new (aBuilder) nsDisplayBlendContainer(aBuilder, aFrame, &bgItemList));
+  }
+
+  aList->AppendToTop(&bgItemList);
   return false;
 }
 
 // Check that the rounded border of aFrame, added to aToReferenceFrame,
 // intersects aRect.  Assumes that the unrounded border has already
 // been checked for intersection.
 static bool
 RoundedBorderIntersectsRect(nsIFrame* aFrame,
@@ -2086,17 +2105,17 @@ nsDisplayBackgroundImage::GetOpaqueRegio
   // For policies other than EACH_BOX, don't try to optimize here, since
   // this could easily lead to O(N^2) behavior inside InlineBackgroundData,
   // which expects frames to be sent to it in content order, not reverse
   // content order which we'll produce here.
   // Of course, if there's only one frame in the flow, it doesn't matter.
   if (mBackgroundStyle->mBackgroundInlinePolicy == NS_STYLE_BG_INLINE_POLICY_EACH_BOX ||
       (!mFrame->GetPrevContinuation() && !mFrame->GetNextContinuation())) {
     const nsStyleBackground::Layer& layer = mBackgroundStyle->mLayers[mLayer];
-    if (layer.mImage.IsOpaque()) {
+    if (layer.mImage.IsOpaque() && layer.mBlendMode == NS_STYLE_BLEND_NORMAL) {
       nsPresContext* presContext = mFrame->PresContext();
       result = GetInsideClipRegion(this, presContext, layer.mClip, mBounds, aSnap);
     }
   }
 
   return result;
 }
 
--- a/layout/reftests/bugs/reftest.list
+++ b/layout/reftests/bugs/reftest.list
@@ -1235,17 +1235,17 @@ skip-if(B2G) == 463952-1.html 463952-1-r
 == 467084-1.html 467084-1-ref.html
 == 467084-2.html 467084-2-ref.html
 == 467444-1.html 467444-1-ref.html
 == 467460-1.html 467460-1-ref.html
 == 468473-1.xul 468473-1-ref.xul
 == 468546-1.xhtml 468546-1-ref.xhtml
 == 471356-1.html 471356-1-ref.html
 == 471594-1.xhtml 471594-1-ref.html
-== 472020-1a.xul 472020-1-ref.xul
+fuzzy(255,15) == 472020-1a.xul 472020-1-ref.xul
 fails == 472020-1b.xul 472020-1-ref.xul
 fails == 472020-2.xul 472020-2-ref.xul
 == 472500-1.xul 472500-1-ref.xul
 == 472769-1a.html 472769-1-ref.html
 == 472769-1b.html 472769-1-ref.html
 == 472769-2.html 472769-2-ref.html
 == 472769-3.html 472769-3-ref.html
 == 473847-1.xul 473847-1-ref.xul
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..79f972cd5fa4aa8cbe252523afc47b98278bf0a0
GIT binary patch
literal 47176
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
Rt9j1x?_!LqsV^#x{sWF_jfemM
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f1a2d6d849f90f2330159d9d71a3948850c70a35
GIT binary patch
literal 47836
zc%1CJWl&`Av!IF7H16)*KsW9Vjk~+ML*s4@H15{8ySuv<?(SZ=LtzE`>;IkEnZ2>I
zu`_dT?3c}`llfL<o~+C~Rc}<q6DM3zUIO_u!Dk2v2xKWqQRRQE>EGiM+&|i3FIn{;
z1LG_#rTXa~@%dyL_Rn(!2T3hw2na-szX#;prr+B?FA}+kX}YM`o4dFhIhjESnc5qh
zk%?P5nYr6L**KGlsBj#2)<^vlhx0d1#L3La#mfFCnW~kY83Z#EBMUPlGiw}v!#@EK
zza5;^H9RseriHM7C}N4t%3xr#DfRVos!8BOCe8M0^ro7v0%2S2uYhi*qslgV%Sjkg
zf|YjJ9UWkJppM`Fyu33$f0asjUyNgRE_OND_7h`tfee#SaEErvMg6B9Njn>1@t3W!
z_rIfn_}`Rog{*lH5WHn}HmWNB^ys_pzAm01z<~+)L%*HC&5HV(@9gGpk+avA3_~iW
zoRp-95t?he$|&$fa&T=VCEoO_KFQlvPx<L^)hq;L7{v*5K0asoaM5eUX-#=WMPGrz
zI_F)A2+&91(EufO3Yfl4=w>{0odW<m&p*;Nv9p33`~Vph?>6e4Jm+4{a%$k90rXd<
z4d+fz6;SBZ33ukqR;ahfeU9KU$o}X8@@;;VSZ^|!-Yma$OvfyDA_?{SM7Ql4H8wW)
zh<w547lGU}zV&pn;BFM6{|bNF4!wKq$yCRTsfqdP#U(jMgD;F7C^t8|F^ivP^h7Dk
z`G;7C0{nW9@+|ie=gQeEXg5s$wCP00UUG<;_ZVpkSQWBOQa6U)@j7CJ%54lX8QNuN
zzQxlidfCLh@cAi{w{O=@4TsIoRVtF#(BIq7_<Lg8Y=nk)jDe^t<VtX$1d#?XhP@!G
z5uWBIGtt=5e~u2YHE4s;75H|Qd#RmvXl%k_YtFq=s%)#v84#Tw6m7$5i`2!&lRmnG
z&+0LZM3T{G!s=nWjo%qiBI^U#J=}p&Y#4U<<xc~*<BVb`@%(A*0o@R05vnLM2Ol2u
zr>y0vI!XFIl;!92KcU6BR{MuB@`1IpaX*fc)+&dM%!uaTiRL(>0nS5*zXT3{@jw*A
zx3?A`?ao_pap-Yb7in5&w{1Auv|<A;TF+Z2`z<p}Tp$39QkyS|ue;U5b_l$RP=pUZ
zYdzEZkN&(gn98*I{ccvFtgL?wGpUGruk^HqP1^eEvK9aH3p<Uv$O~K073Ww=O+r9p
zp<N@MEKZQsgdqWI>cO8H8rk^z!@fd$4p|x1;wrSFSf+()4a<HfVyNXxt|?Wx=&@WS
ze75gF;$}0Yuz8*d%u``4;}z3u^jg`snn>i4<fho7$7xu3=>N>2`(+4fcxyq(oX$6H
z)bTW7GsmZi>jc|z?TG6l@Q-ewtNlPv4mz&U6em>XJB;+p1QmT79=>v1DG%nCsv)B}
zYEMkT^gXq#7b(3jSwcmurLu6zqq!`r6AJS>qh+LS!AJBCxk#y~T&Y9nB;SRQhC{Sq
z06$i38(<>lb=uR!n0}Khe;S}B8bC305h73B?spi#?USd7x!S#xI5hG56+$RINpoIl
zQ?9k8to?l;{s|)f{?>e2N~df+xQ@+MAeN)i%If^qwU*m#W|cwYXY-f+vLk$ju6%DL
zr229QFlNXlcXl$wNF&~lHPM+WvX>H;sEtmc2<tk{7E2_6gS7)^RMIKRFX=ONF2xFz
z8S({r%U^yYYOGaFy8JqqE;m2#&*5WcX=_WCm0i*UBM{^zwrmL)<#q~ch)E-^l+c>8
zD8Lfr`d1?b?m{NRWv$Nmq@pqSu*wbG+l%8iYR3VZJOgs`oBfX}8Q9`6t1?fy-d}SO
z;fzDcL~PPX6VMC`x+Rn3daF+U045KNj+iw#O{{T3s(5mmf^u0~=7!=sbC7-~3&q>^
z^;<z1$<gGytD_AKM|l$!x_I+>^{8TnLSzeM^o6>u;bF~pLp~EMN8*ygUffMU#iU!P
z|DtCq(tWl>V>AFM9%dRs1vDp3ehEYkH<BX_!D!m}OfHUi8*FPer-DB#omugw52u@M
zK@ZiET0jB#!!#7YuhlM%(F#L!dNgPvO^`p~V4;F&;SrZVVJmtS>Nl?W>?`!8*W95Q
zFY};sXh+qa(1#U2-PVxOZgu0LAdO`&ydvmRX*P7}kch*MVO`jdNTIczR1U6E<e2Z2
z0Eopw0zHUg>ey%V3X8hcY8`!E+NWOuPQ|lyxmh6$^HXpV3D9Z5CS3QdNi2qQBws0Z
zgvUQYy9>W{DpVivmJ3o0!?LR}IB!a55Jb;9cLGMR)R>NCoJa}F*q>Ti#FvO}zS{hp
zmfrCc6v`s~(=nsL^rwh{y03u7$FX)WDcGlWug+by)pl`wXM`n4yTM#cSd(_C%MGn>
zEW6{t#Jv~(QjF`D*m<BSYI<;7pE@Q^$fTY!j(D;X1-F=3korFF5Ch60Dp5J6R75&-
zTrO;15vYPf8XM*=u(gyUdy|7<ET9f%K0_1^zFg$QclA$xUy8gH!lL2VKxh?P;ZW%y
zX(v6V3o|a!w&3QzK3U;D@sVq9ti8}kK9laBse*KXxf3aL72d2v*vgGM7i%JUd8dIq
z{1_P_m{DR`AQrO1Q!g<RWl|Tjh(_kbL77Fy(yRkUgJrO#?vgIdN`6kKBs;PYJ2W+K
zYHysD!t-zKfLv&jA~gyDC)W%}naeQ-Xylu(XsBUM2%>g%5dyJBVe=vr4O-#tdyP%M
z+E0m8HE{1;$0)gNDcXOS1mNOTasU?1d)xUkW)6GXn~y0H^5IAicqRm3=0#P_Z>g0s
zRtM{Hc|N|N7Tq+J8-L!aEZqt2Bp0~28Sa<<Ol{ztFk`P$ybbvr5m@VS6fmTMnk&n2
zRflj8H(SGc&_3N$FlCdi3M6&THHa6O_Q3m%!53VnSl3Br1ZHD<8~T&RjG{FMM8eK~
z0;|`_Se@G9eF`@hIgo`V4WVYnEM=(-Mw%JIOL08mzZCY6!tEzy3@^4n(;lr`G;>5d
zng^^>BKe1n2Ms+mYKls=n925bzJ0Z}VzS^2gy>Myl{yqCCx=c@j%`RtG((Ri2dN8w
zzk)SDy6X_6Az?V*F^9qrOE+UdBa~7jN|_l9!4gpmAxCsp)!IWvlQkbXBNG0O{C)M<
z?s}K@RG-6g7G}r5FlN{^?v@%teQ~HCLmGgjFfs5QT@#-2D{}kp4T<2E31GD8vob{^
z6>yM>RV3h<-2dU%YKd_wobFTl^#rj0fQ$jl8TFd3ULuI_KAbI7kqM~GFp(}}7R;1L
zD-cGwdt69$8M$lXnfg3tIg+HL2~M#o&?e${f}FdSn;1ghK@$+dpFLu=TX<IeEXWi(
zlI<A!Nf0T}=mMsk3u%HQ0}g9|P4n_HZ~B{vi!oIv_!rvvguL@ZJX4a`(&4;!Od0vW
zLen9Mc_h4`HXq)GwJ5X?-fzG4*<KXkK71?F5{MP}`o)}YY#3ZO{`-pEUqUyFCWdI&
zIznc@Zb&zZ$oxz#$>~x2hK$@Gww*8JZgOM0DEFOl_2yo8kq#Sfr#r4Mks$BO;-QVO
z&*j*C3UtmjN4S$oc6XM`z0Bt?Oh#}_!!h*=42z`Ck&eo1G=J7`$!h42kTs+U*JO+L
zw8?i|bug&741ZeUkC23BA4yQGx{s9@#&eOj9)8_9DyyWQloAQ$gv->Yx=(>6YEYJ6
zGx=WbLhbODF8-dc$33pdQ}MK+r`Wz^tU^jxi_m?Pp!$>derj8Z3Mu5wqHKW;y-|G8
zAzPgfhIDEmTKrjU)UdkM67fuksfb%r!3swR#K*RUn}n^!5lC$i*vY@HG^a@SoAXb_
zR;9<FKHG`%A)@R!Q`A5af1X&}R-~<XuxPV6{_*E)J(1Jw0nx(xVEv_1Ukp|(e`Q7E
zP$;}2IoLz^<drbAehY?deGR_?$f+DeB>jl1Ryipu$ST>nfE|$?0MgS0e8-6KU|m@p
z9xa13M4pZ(2qtcfKfx<qd|V#xhQEwzd|B-GJ&H#4C`*mL5BU$QZs1Q}KA(wJD4vx@
zycfLndvEaNWGC)+z*+n!qKMHf00*oW44Ao#X@?)-kgXvEF%Lj?T(`SzqIY!>Kl~V?
z$79B2>Iz@UHPC-G1aztt@)=+Z!T3!zWFyaNQ_e1BAs1*YXglj{8B5sx%Xo~McexJq
zO*i<mXgnoTQAF?1eJ5(i6}t<Z0`cY;y7`7CaD{qJOvnEift~z*XQHO9IJDgp=vq@J
z-v#z<jA;2(zQZd7q!tB*MOKRt#_Qru;9}e$bB9?)M=Yyi=JX9(EbLW~byMs5h(L@4
z%bU<0atehh2rG?Fann1<v-icM83LLNX+J$0aWOasKxCyo`AkL9lfbx^aJw$TSh7H-
zH$m7lv!sz#f4g_X@1=^8edaEKood5AwAQ9y{hScJQN!E?K{san_;jo4@W!_9!Cs~%
zYpqV-sPoD0$7M0$y5+^qiS)mD^4Qa6(wk;}k~fk-vLYKH{Kg~}oaEA%v*f@`*F&rd
zoFQ?}ySM>Y=7invy^otPP_5#ZAWoN3&Ea5LRp3~`#%}>B>{JqZ)mk4ff;-$82AF9`
zs;C%J!pEzI)P!_(b_>xYP`nFbxpHEy2cLaZRpeY$sM@XQ+jTTMHIm-AWwbhvpR9&&
ztc5d}^CqqHHjS$V!h|<=3wMl;C5F%BolnaVW=x>&F_70$nyiXtlNh89h{bk-T&I3`
z55CO9J}eTH-5fLj(W8g6t*M~y#t*kQ-&+quFw6<uQ)_gMw5bqbv}?<I7u8;iD-$2L
zEUWr$UCQXfTgvYGCbN{TuE<+QH7qK##1S|K2TrN94M~x=c%ojE)EVlz-+6jT@9AXr
zq`mx%PitH!wt<Z%<F}9FtWo!B`$>Kq4WQ9~LJs)$NQGFc)5~c4#SB@I=(`j+40T3a
zWFdP6VhAxqe+j}2bqb;p;e&RBk#O^k{cJ#`8Z|ZWIsP`RIvKOu|Dk2bM8dwzq#}7y
zqJ;^7)iE6sl|_ERW~1_XR`~bI{Nbc^*{LYwM8DW&1Nqt@+FA)cn#WH9+5%0|MO^g-
z(KmndGcz_{4OA`Gv4GGpb}oE*udw1urK;l9nc-1+LUM}4vJ34|Y2He^))(2t`IU(b
z`3)-q&;y&%q_QVQ;uwrbK$1?<l22K<vf2R7q^xPas+xUth8ERlIDg7{(NPAwBi-_F
z`tPPjobAsxOOY13jE^)bDNeIA7i^{gvG%-*5Lyg%m}(9y_9iKu*0qUySz73gVUMG7
zZJgE<LL1}A&nLs;oc<y%K@Bi188xG{7T%0FniIYEGSONw;}9QGUp@X-KNZ`bI!2u>
z^!uv8ugCIWR2P<CKP{be(8DHE#5z9_a+m>5`wu(@TggoA`bKk&7H&482?NI(&T|=K
zezPn@q2p3qs+VF`rER#zQB3DoLCbK*!!CW0dG~T8eaX}(kjPkz`0G-Lzx^?C8qyW1
z6b9GhR;W(l$}`sbK@Unjr^C;q%_)-iJKD)Fk65v8+549Ks?|?aea`RmaGO&yTxZ?_
z2^QU?9gj+TYm{DU<9Tz3%Wr~a)of+Wd6w5D-`j6lecX0G`SqKqym0dq#<1s!7YRmA
z+4lDkEbMR!-Yis=0>>nu17!zto=79ox$cb4Co~!nV3~G-exdZznP4tAw>UG`(R|Kb
zcDW&p>eZl*{<kdsUq1+E^9n12qB!`ANs->7DIoe3zWC;zRrk|I4Pvj~-!{@7f+p^U
zs70^d&TcsyqrQ25?LA@qf{b2qTwWVocZZw@)R{>~Ovjy6R-VDM5Qxt56m2V9euEdE
zvJ%JEEke+!v$IB!i`5J<a5Z>l?A_i^PduN+T#E+7=V0%zq!w3i2c9ji<m7ok{ej0?
zpXdp~eZ{=G4!d;dGa0LY1XSZxyI5|oCV7!}uq-)2cJRN`!smXKj@@fKv553lu=y?0
z{su2;od3p1c=)#FJ)?bJQ==R;Lsh0X|KuonSIr6l-WdXE1@Bl?OonJ%`e}z8>9d~&
ze+^#Eypu>7iKD;EFhpZ|48tBXcz4Wt&y2>h?J@3ZX0FQbzL_*b#|a)PMTNQ>%gPSw
z1va#BS@h)9f#9-lbS7umMYg#`2-!uJk@Q$y5JF-+7yqt(fk^aDc7MIgNc1Mhp;n{>
z=DF+=%S67*M0QI=dd@DBv#?w*0>EQ(yMhW6B6i+weqJ4R-sN-M2Ip`*0Gi?ea5uFA
zzuo+}!~9tM-xBHd`wuT$K`H+Y^8udIIf+e9vGe+mpVQ4A@Z2$&Y%FK$S!^w4>N!8^
zIk**Owd|hTGu~C3AIljY^Zd2xdE-p?Es35QtoKw*E?NIrm&qA1yceB`&I)cXOs@8+
ze{B2FF$EFW&TMP(yc6ME_n(A+Yf8fd{QDEl-hlR$|D*-V83O;N2c~CHx?T2bm3}aL
zhFtZTpA&%z`ql@vD$LH9uXSXYckMre8dCa~p0(*tcQi*Jyi;4fl(JplbRR>8!}MeW
z2={>IC%UX9)K)QU5Rf)s+i{QQ<%KoIPW5;29V%`oPqal+#po24&*$1hw!+@AZPqcX
z?HoHOz4B38yN&djSEBvB4HnSYsMc|@@AP~06;#h9F2a|xEj<-fF^AnQ!p-mQ+y+Z}
zXP6u9`({Ku`nkzpt|n*lYqb7$^Ur|m0uNd4_rnyDtr#Q(<s=<LUxxf3k0?0o*X7S&
zbPO7M_lVBXUnwLwcc*{fK{s>kV7~XGH#5!<W;|^cc#=9jUgX365k)++6j~FEvy#Ey
z^p<uz3>;S4`#FaACS$c@OrK6eA6JO@k$;gLKgk(h0!`n)0&yA#&x12UJl(v@d%A@+
z1=9F+klzi^xz3qc=HMGBz+oD{$H{h;T0*c}CA|jo*pkMKejw(!#J+R~eNbI`Dc~b|
z-4oyQmx-Y!S@nGy;4htQQ5d|%Zagp&1_rh-)+fqOm<0L#=m`&3G*ApGZ%{$6sUaUR
zsgs~O3dDIZtGB(`)RcCHrIfAaltSKsW5@~&y-9m%z!V8N*+RYXJ;Q#o{LEt<@TO#=
z&9?pHj03hU!WoU%l(Ny!5>$Nce~+j`yIWwYa24h&ZS=wEacaiJy5m*-CPGA;Y!?hk
zL)nf=P&P4b3HhjPENcSBy39}DS85|t3c(q*#jgJrD(ZAE|3#y_sKX!TK=8M2Vm5DE
z|7N6a6NBDrAh&7nPmN@DD6O^MUa|K9&$$F-mQvys-Al9I&+O*_ofJ}fb8lz#z}=Q>
zFsE6<x0?g@tJbYAH7|(F>6XdGg<8w7Irm&{em5nyLj1<pB=6W)HQ481I#!;9<=5l#
zy{>6LW%aAO9EwK)zYo)^9JBj(&aY30)0NzgI8b}Z^^g4VxwXgP3PqAwo@)g#1Sh~S
zbYgA_%wX_kcBd;vj1pqv^5_~!Gf@0}K3lR*^Q|xx;me?fC1KyxbTahI<beM#)NrM=
z=|QI_qDH3iy6yQHzcWIMp2&N_Z}aXhe&~^r1suN96dD2rs}`QqhJ@9vxy}RlIl0ug
zpEh57f>83DMSOK*nkR+rSUKd^O~G>3xU2I0?*&fs0$a&Ff)GDI@C6yqT0KEM^Uvwn
zelD^tbZ%IJPi5Z5d`@YgjTjH#GLSD;?Sb-DJHv$^%tOw%(=JR9g8c>9IuB&?GZU1t
z2wa1%=HL03n!Ni(DlU=xr*3yB!em9|R#-Mdu>-4(M5S6pCd{ZngH`@OWM+-UOnpkd
z|H`RxZ@Md`Et@{lXgjpoC%?(kb~QyYWv=a$PThmseNc&%o!rP9$p-ee9Z#fGo5U83
zPKwzoz8YPf1oyY^l2DEk6=$;qYK=JM317uME0;0Gy*ne&Q^Y^;V?*KW(>8ZW`WZH!
zF{@eC;(p7s%vc>nS(%>*Tg`np-k`3xEGp4Nncb8$cD&LcPre#xvZqQs_D)vH70Qxm
z1|WfF4KJId-Ypl#T@5?2eL@>zOD9icJL)aZ2&0-Sd(L{nY4xZVFS3q_&f18Z2s+J~
z*q_)lgYXHdgNM3eTXt&>3Wlap_?l#H4*^LQ*W9{*cXY4&Ksv)m0~2~>e_<!YJ=>O)
zR#=RNQFS(mc(_%s*c!A9HYonv1-3DpI+`BX2JPAPmXoNPh|c=A?Cp3ujD`kK9T4z9
zoduY~cx&%5*U!k>rg-tTlEZWA8nOhk3=6Q-3bpA*1-Q2N$ff@}o5Qh!igAc_F_PX2
zm$KcNJ$Bb9MDXPA@s@jHHbwIBQ^p)TesKS#sEq43*7;(f7?T`1NVm&-unL=ATh*y_
zomF|2k_$`U9g2*fi$0v>T0hX*V<+tMD{3~kZR2-qZ^3GoyffE5zeXPHYFD>6vIiWn
z)*>bO-T5S0?5lr{MWvpy{Bx+omC3E8XIY2oq+?8Inz`*T;PGprh0kQunr~fAMQxwc
zLQA5A{UO*o3H4OTCH&B;$r6i0#ZMz{yM^Jc!MjU9iZ9sBFBeQ*X-++%Tsamvx*FEj
z*AOq}+vCmf7LLbg-KP`rTYvWQ!^~sJ6O_VS{gvr*+o`%|YQ5vjpm&T_6^cf3&`pnw
zx;=GyS*1Pe98t29D>asdvs4LEeLF)=z-|xDh2-aY|JkLf5#s`d=JcDK#j`?RqIoU*
zUG6@up~8p6`?2XxEay&*t|fm1qgRwf{JlQ!{TKwXg=#gxl1A4uQ<`Ac8z*MCCs53d
z(7GQx(v2|RUyY%Izw0b_%Mq_KYmpbFXNWkoV&(3^cX$hd8yEg6fSYVWV2RI1h6JZ(
z6@~=oq1t>mJ@^Bxxxz5fU$HXzXQ*EgVhs0SQNhRu?s;j2+O0)qjv{GTeor<&rNy$-
zKmO^7281(d&xDw##&afGl8Sw67iq4J9HAwlMa?l;>7Z6nH0XY?_rcHO&VEKHrr7bi
z`bOztecfrR)kt$|k2Moax<ug`tIi}xLhI~#-i|%~)$FxaZ6@;Ja^QWJHsLBZ$?PuJ
z=Ic5=7*-&INN6Ht6A?HlvEYAO{<DtCEb%ZqURP6htvGqiL$_V%nGvo^e6Q!6_m2us
zb9&`37k>@(cpA#YRzRo?)r5An3`bQmvyFZar<}M#u-Ya11A0ztH?wKgc^1~QuR(C7
zUw%}Rb8wX%*UY%{I|A7K{$g*=3(bsptIj8#ESaimg3~IP<ijpb!zA8LC)j7MOD|ZI
z1pSe9EL#kfZv=qsc7i%$(NnAhmN&Y398B9pj&AXYoqLz4v;5I~)g#&5YRp!EA1%S^
zt-G8tiydGKI0$94DlB`WN8$l#Ybyp-Tvx2_8^8fPyt}D;7Nf<GJuV~s4}PJ6Iq$Cw
z-CbDi-Cuyt(<&!|J%DcZUDWO-_`JauOXLIk#xT!5U|!<~3On9rpAyTjeSatU?V{r$
zZX&Y+ciA&omA{;4Vt1<p0954yI{ypw>^|$>txHJEK+x=5uh{c?yClpP@Bn{BxaFWU
z`xoUqPuSNk7hDaXXD!$?7)!#(t_oQ=2-vf~J(kKzNSt3%hVmbTZN_4Uc3`&d{f}YK
zl~^i&?&4U>td1|2G00d#UPXdSfPZP2<V+2fuw;PqRKk9xNF_u>-Mu%0mF{g;>(!iu
z&oXEJ0UqtGhVxDXnhT%~hSrbC<a7{>yFW(L=I1%jp3c}>xR=xrx9B?D7}@3}+?eo|
zpgb2Y5gat0Dal51lR|$jM1-#F&p;A?dqo&Cbf2*Z4$9ivyqIa(WWYw*Fo&~ny9xB|
zEIa*Rc>+Ff^v@X?C}=YGo`JkWHQ)AjxJ_t4E6eCxm$)Tzy^rv}kC{1sZlCPebvs9h
zrC|GpewlHMxvuYu3CiO3yVz;z7THD-FO-C*6i?No&?DONSCo=keb<Ve;^)nOj16(&
zZN-ReU?|(sze4(%`vj0Unk0JX&f)a=&Zll!sTd43Mv{$sYVxcK5l+hcy(6XIMj2Qn
zbhzaRKTUWs_lXc$-^ek9c=k>HHEHUkQR<B6LXT%{v&eq4Aj7kV^Y-Wzahx;@X(e=*
zTyRccm-KB4U+A2aSmZ7yro%<Szt&$CvnGIr>Yv~LRKV*n7!I!U1}Fuvy|(2AB;-|~
zk<FcGD~jSSLyltk^|QrVt??}kKH@1Gmvtc0<4BZ_G+`kO{UhqDY-^3s9C&m2M`+LG
ze!x8WiEhqxhQ3fD)nJ#&Ej}aIFNciB>A151WwY2@^7G6ICG7bwJ#Ww6O_zYcILLrR
zILDwq(MRxsFIn))@16*X;+-y;UuN8Y$<PIjq*SZh{5iSS$D4~xnzU{yC#v>gz=UhG
z-nPREnm%*)=wx=(h7K-^#8}Ybc&FD09<<WJ|5yd+epqSY;B%RQQ*k<uL$>7g<q?3G
zW69%LNdPxYxtV_0)&p#+e?kno@>}vM&JwoDy&|LQd4rIVCyuq{*p+e5iWrwv={vP)
zy<BI`pN6d8ha5cNg@o)5a?uEIurS!*MBpzEdp1Ni^ex*D-4&$TC{pEPP8jOW_QU8p
z1G3$r&sX|+EfaVL<F!1X*@19}Ouu-MP$4(#BfQvnpy!LrpE4=c3Pj4~gNy5h3wWZ5
z7gmL`vdYdhfvCJQPe#jqCZ?KssHPf9%(Imgm8R<G*gJ`oEESux43__F(CnV>A7SpI
zO#JWfwcf1T7W<Al(E#7`oY`Nu?6lB{yM6u+Vz|XtuX-#(ubT!YYOkBnE{W}oN?#R-
zC>k+CH=z7yE_zKuMei6xC8Cyi>WrTh$lU%5Pd?DW(I-wgh5o304~%+*h%LTE%~Hv~
z0;4nsX*2&2(Hu$QPfDv-BcOZu11D2uSZht`FOkZ>m&!c<9Nt{EZ)`%sK{a6hCn);+
z(6B4!N-6hBE62d_j7&j68d5fMkj2DK9X=mN5a2Njk_-BB(49zsk4+}@Tk`%j>JWs_
z6lBz+dqayRU^*%Yfs=~Ol@@i<5t0p7Zd^oVrt!u}f?8<BQj*LC&Q5*5mIdVm8pSGO
zc)x8gWY-$bGOo0)0Le1~=(1ayY+UAf<OHbNRVQlMuixiDEU=52g@oNJ=Bs@CU*WKW
zd-?|5(r|ML&9lZ#T1dsre?e@5PIo?&*w`QV#O_rldZn~x;UocN`Q=kt&1#XIbZkJ{
ze}`a^2%5;)6j+AwZ`?c|v^u_ytB^#Jn==2d4E)5ONWqpr)TYpw`NWRGVsa8B8>5nP
z{(ev~BvlhO&jGN)ZTt;>yZmbB?nOQE>>vbE2=20UMW_Ey0kDUBweI(DyCIB$S+?^O
zlt+606R0x|B4zl&S*~*I<2uqZW?UGgWC{9P=iFAbt{qH&LMDN;AsqD4dfg}-B}hE$
zW+Rh-O!*f1_RBO}7$bz#v2*?VXUxh39Dm71LKe!wY<|x7|2{A>Nmy8l6X_Z`?0{4P
z=RP1=b_r41_%j%~=@f!k`8y`c3~HNoanqj)i}5Umt>|oUFLOUE$mSc5oX`+V38g(p
zbPCn=>~ak15QrvhO+Nm;0FAL(ZmY<YgZWZ-7(U)aJYd0g%KhP18{3QQ&y>TwOG_<y
z!8|zL<Pk&QSRdgyFkl5i#pzZA1Il&*H@qI9m3{NJHH~kA@95NAcCx=#4cOp@=5nOo
z&XoX445($HNubx{k|V1`5WAoHoWGLl7#o!IGgjg%C1MY)ciw{aX-1wf$asy@@RbLb
zQQ-3$Fb$T7eYz4t$56WMc9u-P`!a8gyAKA+?puZw3@OGyx&YEw>o#m*AE`2B(gECQ
zzE7Sv#6`XD{|WS!F7i8}Vr1w}Z=W%G08UV2AG4i<A|a8QcnoBDID0#UtOCj1r24dR
zgI-IgoBA~*^r38l)(>7}z2Yq7m@n`whyaIU3mUWDLVjt{)?zR<aEzMVkK_V>dzZJ{
zuY_ol4>X%BZgNj_#mpjxjr5YR0T8!F7O0MjXP599O<!-o@YqsN1cn|m++#<Xm5obX
z(|k4{qGL8AC$022C&p&bd0^qHpU7RR)QU%2ig2wV7OkxZGCZ#kUk4C^kCVdm;?9K{
z&{$Ti`}=F#WXAeSS){*|lv>VM`;@E<<-G)mxKc<dIX}G$3e3nKK>bg%S6Js9cE(0z
z6myKv9Ks>n1!z5np@!N`qA>rH=#}~vK|6DhPMe${g&h~N`IwqfSx!W8vUe1Pipg|I
zMIcX|?D&_2RdQIY?xuNfLP!1h4-p@PLFjy4C?%cB{Am+Bzru?!-U=m+%w`-#jjW*4
z)4*<d&o7~JqPUiH*HA%=N3Cl}nkg2T?L?Z(IC`SW3p+u&p{t>W>0x8C?_aE0Gq`Y6
zfjI|xY~AW=vV9rY*qw2lgC+c1nwnC(2R8B;FLq=1ykrJSXgJe+wH~LCNu!7S905cu
zFRmfFplA05&&kBoHxrb5+Q(aB61eaWh`FE{M4ANLFO@kVAw4TBti$9oFPVA$m_6Iy
z-M-0XAw!eT+J<G8?F?LhF^5tMX^Mkv$J=LN=mO|{VmuM{*#A0vZ>LAg-P}%x((m)a
z<^6jX)zP!IH5(_A=A=0aAvL8(lpgu$TpZ1?C4#nWLxSD(hw`bTx>G&f9`nK0sl;K|
zPGlWub=S|8%^t{t#y)OJ#*t9Y#gG?{{4Jy$Nd)Jpw0@A3EOjDonftdYfolEi`p$sH
zLYM7KJ_3X{GJn?+qsCQbd1Ua{q!|3{)KE2wS`=|<0+)e(e!osYOri~Tp{S+YRJfdZ
z2-Ka(`zd6D!VnX3>oxms+H~-!kS@&;$&Qw3EF9-CrWHz_;Z%`sDtpS<XCo>NA2iPX
zSt+><+yTHX(_Qjx+_!?-7sh4rCN8f7sKVWh)JV!+a-Tq!{7H+o(z`M&KSPvw{(Tg5
zKRlR$H3U^hyi_|5WSS7G+KtTu1C)3&9%jrfzaL>{<|S<}l6YejXSXN(fQ2}t(={j5
zhM^!*dJ?3c?D>!aNWwiAmWJ?oJ5g*bK27iNUtc`$j*D24q#x_?Qdn?no?<s)YfuPk
zCnphcz8B>gH6QD+9si`uu4<P${K}i1U6EeY53zyE;-O5LRM_q#7dEYz_U^QUxkaV)
zb7H<FF~(0S0ETJ;Vt55%TQ#i%kGd$@xXc&wcFlOpp{Ox$()4>ZHk5wLSEE4aqmVxV
z=Z?o#eqR!NB?Ohcnj8f4nmb`O_>!B7xUG(_hkwnF|9-FkWuiVN<t;0g9Mjbd%I~et
zG^5E<^SNZ8(X**5L&aHvF>sdp-a_mJyjtlfIR>j4Tc>~0F0kfOpd|@J1@4L$yp@|W
zY3McvKai!)5fzrOMdo^w5L_XSMbHuUB{B+aWna)((cttGj;q<L^BFUyyOiC+7MtM>
z@6Kh<P)J^haTEws=rka?z&=%zyG|QXD6a}L+AIi!<3|X7qp1^tjG8MBybY4J75%i!
zimOmV+cOIRoQ8#C9CF_%{*w4ho$BPrHTks(oX=5^o+<O*imGH3HtyG7GgY15P?Cov
zQv7lSX4FAX*{X?$XB5I-p|s1UX&Q{(Xk?$aom&J*1k80IiEXu!e534My8J-q`a6fx
zIu5#To;mXq>FeFLWw<%xb#OPxJ$TY+=~y+~la*ylU$WQ{BEYp`(|P<qpP(YX<(%sR
zwn`kZ+fx_}oP?2GleYs{1DDnA9}S?cpI$gSpUHi;0Pd}QK>70_qq^_(rF&NfeeKJd
zC0p+T+Cw@pYS&r0cbNI!gJR2h(UJ_{PommBbvew~gSa(iR02Wa)1^ZiLOu$uPa$v7
zCFi()iNZb@5z=l`RsqiC2yPQFyw$KeLba#^j^T(f#}k7<XMNinvQpm3vI?pni3l^5
zupW`|_;1Fu61Rz5w*4bXInLTUnL0|<#fu45WUC`!f_cQ=d^+=3Mg>@a0&9#$V){^_
z`J!+~@C@9+&-S|LC6b(Kn16XNwG$Dlv=A?FgwN2KX6+wf`om*#%!z8K*fJ0%tAo{r
zEMwbd9-sV{6hyroKMt936VIdOgDq4sts=u4)gl`MC9j<0o4-lzeAj(_?APN>*~P<(
zRmV&jA3R*zD<`Y2a!?MV4DFhg$efm7-}4bDFQaPzhPl~@vq?|4MH>vp3$(n+-!H)j
zR3O+5|K_L&c8hF#A^YqYniv?GM~YwbZ#~B%%*e3W@-9%l6@~l{N$UGLq8|Uvq@)ik
z=C-&j#48q7O@5V*t`4!672@k?yrc{v%c3PdeN(a`@<Z@X_@?3*|55Gv&(_pSgQ=FI
zYvPKlxgQD1lh<=6NFRj+RuxYvBt!-VcPX4y_CtE)CSr8WVI5G$qxKudm*3rTko!&u
z_nxG=_z$>-woD;i5ubvi3o9WbM81}h-axKdhOJ=|=6V>-j}zpc_u>EI*!72fHY>>J
zG57Ttdw^775>zIcZF1@d)x0-*oFCJ>+BVg{9OE3N8iQ8j>R1c2%<ZJfwZqW7+dH-B
z)v}I*wOU7fIYcw?gkKwBp{C_b%&^WV-`_M>{vAqP$umfK`{MEcv(*2NrINg=Jp<UX
zx4wra*+)NCRZY-X<I|PAOD6Qzfdn=vhNenZs6Jfdtb1ra_(@02{1v*Tnvh>EJl?XN
za&{XKCGM|52kbBS#<)|qGc_X>_Z@dUJ{oyb#rA%CWjadJ$?><aX(56)g4gaFCKduw
zS<ew1c@R{i2EMUb|2KGaFP3E=5zUg42aLn-L4t4RB`b*cL?{Lkm?Qb}V_7d)123Gm
z`Q*?_W9%vo7^x7p^}Kv&Z;7vREB$NUK$3t$eOAo~(F8~+Jl&GZj?2cFUR0P%J>^5d
zdl%*;Rr8D*l{p{vy;T~s+IW2dBb}rUspqu&*5FqUfSr1^fVz?J6;*(CxQ<y)uLpLy
zqE1lc28Irmra8?Yp7D`-YZrZUHxQ6yb`h&buX{4n-SF)}*v+i+5X#N_O#|hJOcKeE
z)%-NhYxdHoP?u-axIxip1CFuhCQxqEv4KGmUY?wCNAb;m+>xF|%rvlXO2hBStavy=
z<7co&#J)D)oj*kQb{?2Np+Ab^Ek&1r`Z@}6M(@$B0F;|ZYBgxkU&qyu)&C5zg(veL
zE5Jj&8ca<M>wvMacbxJQF}XtK+iywFvkB>T4&ks4ss0NyF_4Jw%5DBxzf9q4AFTcL
zR^w|A&!El=uuc51iK*s(spej*{0kw|3lJUdeWzwc*2FacT-I*g-fqp-Zq=)8=0FVQ
z81meZ=>g_{aY*;cndpB@)c*S;s%9Rh@Nd}j)T-7&M0%Eu+xwqYt^85fBfa6)8t#t2
zh_mD9ykqBFlGlD<bzA>PZ*nH1cgFRvWfw^?I<}|&zcSNEru&vuPYvgLDu=)5^Dnv;
z<9b;i>#SJy#9V3nC*j|kSeRq}{fXmG)7#?zq@Bv>o%)-8ik(;Dd?UC)@x$a6X*+0g
zh5Lm)uqC`feSFDer{#}v|2Ed81!Hj4U6bZQUtJvJBa`DpKHu3>+c|PHdPgc0=iv0@
zT${PP!W@wm1k{qW3*$^l*6-@1#jak~9reSE`KA!2NX_i()go8qE_5*MQZu#g`ktG_
zy(p=J??9(<E#b#wcPY80Y%}Bcqb|R$?9!FkHOwmh+1u<=s;G-K%*i9*MVLZBo{8ml
zU|#6;Z)f5A?TkDzgNDD|{4-z^*m1LC0D8{%dEFSl^te5ghe$BggqZDCbJog3OSfgf
z5cdk@qgc$({u~4#yscd?^;<BdtwAm)$4!UCoxs8Qx)>r|IL^{+V52|T{GadbprrFL
z*yw`6%_Q8Xl)2s^Z8jxsGAZ15v2}jR40{X(c<tYHkPGCfE_89c*>(f&3titbuWBGh
z#e8F1b_DZk>^wpw=nemz(DR)oRAR2x3+}wSt_Tn%e&7n6kUaRpf5>e-WV7JhAM+l2
zD@T&h%m<=}cq?Yu=Y$>7T8<9<o`Q9)Fr&^&1;BxS`C($_b?3sVS(H%d8;HaKjALad
zVChfCO;`6i>XME=i>K<^ClItE>+-;&?z28vP=_GRcaiSBF411kVz~@LJr^uBT6PC4
z*?o4x29mjrh+BeZF6DMVj&YmS`z1!Rx6ogc`rqxZ7segTdmnV4L%GzyuYZPC6nCL!
zQ%=j7g*tB<OdWptwjuV_JKu>rABjF;^}DGGO8CKXmSnY$jQhu@5&utZRQ&Ev!5z45
z)_U#ru+AgDHmkqez|=P)Jdm6~-wCn*m`R9I_pK^WTiPy+^%P5JFMM9snHsR)eYGF^
zqOvz?v*p+&rT>6y%r^U7PO70AQQ*Y!{B2KRHPCBthyRUs%Yb&}Rm<GvOATmNZOA(Z
zTv)jU6cju6eS06>5*$AU+e=@M=V&?a(ZLMTnq7EP2pP>{=19lW+%`%eu+2@QQ}Q^8
zQhk2i<o7%iB`Uz7s!43Rs)LDsE8&kfu6vR~#gq)2p5X}0%Atk7&j|g1AjK$P$q7Ha
z=C(BYW71QS2VUZw^20sxS1!Ifexty_m9Trs7OVCVZ<xN#?&HvP6at2@3J572ptnCf
z!x0MuLta{m>@tGa%xyE9M_)1)80xcrgC!0#eL89V{ULr`qKb3gHTc2%m)x<_z8$Cj
z)H<i}yH)`WdK|D^wGrREC||wO7>*Wgx$3QfKb;DyEO=92Vs5RyE(%{QZ*X04R!ld+
z>w5S8OJx8d1*2kq(3=cIVgqVR4uVs$^4z{T@fYic{y`fMuQAUY3C(RX8>`H$`n`Q<
zIh5ng=*+K!GtiA{_bh5NyHd}X$57;q-fVn!aSX4JxRxIG%->4ez3zgO=oH(D(9AGi
z&swf&9P6a48V9o%qrP0gUT#UR`c)?CR<q{oACLz&B}4Q(D+wy{7E8wf|8Kq4J8E5v
zax#Q0)7<$H{P~Hw;JHGz!Bz#+S!snjqWq5d!M&{-;qTj_HrujPv!L$<KZ1B-ZDa9Y
z3i>u|65nP^Q_gxlXrE9lNR=|?)7;EvmpJk4wEUL?URljZ*B;XLsDO<)?U>EB+_Y%c
zT=1+M@}DEUN$m#=MkOM1h&`-R4#s1@P476j#(*jBk72cX&wGZo3*Ubq;0&(*WOPLQ
zVxCxK2|<Be|3G3u&S3@Pbx>xNv}~;8hiKlE-(o+HzmM%{_RQZysrAL&;>u(?_Dq2%
zw&?4VtN&yt2XBwqJ!meS>A)*;cFHWu*VHh`sSOYM%*8*04RX1Neh!9cm*k{BsS`7C
zrMF=As#+5B*2@o+er+;>_w-gs6*hZz1(8?C@RsEH(349<iyN-h?>^Fi$Y!MDS+K*a
zwaqAmsO^JF$nt|S>f4!VsH6Y-?<WZS0wL!%1jhi02HvbAhhy(*VZ?fGUl74H(v;CO
z11%UhM;j^qE-<axQJ8s)y1NB9n7vhYA5GsULS>y?iHg0Dk(_=?w`qDcHqbB%IxMxP
zj@=r2U8EshC^*I#pSPZ+u`Pb9ChM`+d$Is|`6hULzIglbs-QV3pIW4u44c@1?i^%6
z8TsM|(tW~Y)?Wy0!9wWD-~1TAuDrWsG|`nY+~_&f_0MW?mkI+B&1(}^e}~`qPpRCJ
zS5?v4HZSD<et0TRGj)_8k8kR#CjdR*PrnwAW%`j{l@&iEo@2|tFIcfG^~zP;u+{Gz
z*bpIgMtzc;<N58#qsFW1qr3l+n2L2U2sBKL8BwZN5mQy;Rb#~B@AYg?g>g3(dCsx$
zn-=GSL-eCu*Uj5&S*UBDNt3t2oyaee7e%8Ec=j6Ah3UkAvIXt@Bh|Ok^XU&CoqhuX
zAKj_mWIsFN$7@}!UTUyLT?Tz*us=i+<48qL{}a+}Rh`25&y+$jn&_;-Gzv!hS&t8j
zn;WG|`t)r>9N`L=rEqy>+JkkR$w~sOhM0PJ+jOnna&ejPtC67(Z<kB!CC-RkH&DZ~
z#P!0C=W4yB(!n-OE}~$i*eOYsVLG4s(d~*W?H`%3N27{d+_TM4@PNjbZPIV!M~KVP
z%{niLJ{;VEsmL9;Q{l0t9|vli#&Tm+<NTCuwXKbEw8=NEE<v{jNZQeZ{;TeEB`&t?
zT97C2)f5y;;#7{YsLQgcO}Z(z+O#H1oqqP|QQ4m>HYiUi1sr`%MzmLXzumref7Swv
z;@bc}>#RHErU2hCU#^bVhl(D^#&|kSp4o)H%W0?C&wb{9Uni>>rdV(O{9NeW@j0B2
z;@l#MKa#{FE|&0ojx=uCPp;r4tAFbvoVA0H!2X7$2pnrX`^$FQKi<}H$Wok@AlCe`
zwVJbl7HTzS6xC`@Qsr3(&*ieIF&9o_SEB*YgA{Y~=%e6QK^RGJy@Bmt%iEsT!VA7@
z1D4(AY@2MSU&C*&1u2f{G+y4|X!r4L-zoO{hY~~`?~LH}-UxEXUMUam5yjM_^A@uQ
zmI<C`%N{vgZSFgN&%A46ZUDQ1u6?SXFA69vA+Q`g&RhN;?}F1}E(`*k=dyC;v=I1t
zFBBJ0x`E;cNSp>Q0TBb62)d3@Rm$MYa5sULyqO!0P0XMO5~78?87(8jT@b|t$;{`&
z^<y~!qB`$7%91ilq8t(%lh}vy(CGPH!iNIR^SN&W<Q2SzL-;uF$CbXUs3eWk-(G_J
z58k|3{n>vx+b#<39FBNGgP^5iQSufG1}>jFPvqoc?@e5mbf%);x*GZ>JKfp(8C+gO
z=-_-$M-6f1LmB_SL8A$J6xu{{{)$rJEB`BK)bT$DjV4wFuuwraLz^G{cW9Js6Gf5s
zy+eiy_hcx9l8#(C*#4<ZPUTCcyjyOwTu7Tlj{B}NA<^${X!^(38lge(=5lXP&*i>}
ze5mXipXO%hqmR-GZQzf3-~Piet3jpE`+9Fl<*R$gjjP=Yo*v@|eNqx8JmTN**6md%
zZeLy2Nl?OcBq|@MDQ&^mc=Gjh>p$0+1g0H;x5o$UI6?BLb);M_4m-6$-skHiuS+J|
zUgtW5Bs`YTC8Ru}!*(SK0Qg=KDpmN`JpZLtx8oeSM~}%x<el_tcsqD`59k)F9`a$U
ztL}i=V?gzyDy3_k{)@5PVt++bz6Shcj6vm*0aA)P8rFh1%I7>IA#x!TCYK%k_i_Hg
zi{N4%KTuK<ZQ#j4>Lo^pK+H%#;jt%YZw!5B5LKH9QCcvkqVrEh6zJB0YqS~qic*OJ
z)>`KBh-q$RcAmmhRm<<RY~}MSLRrKMt7+{quJ5(b(WGv~eBwALFF)W=urV(P`=uX|
zl^_MUDPEU|F9OZavlJ8EL9reZZz-Wn69z09yRYBo3moSgU>id46~XeRffz>;CPxyJ
zoPuS*=U2T{qYHP`nYxqiK~{Mp<8I7Qq_&R_NIe}80cWe-2?PX0x1Ei!ibtlN{5VP=
z6WaOY_BAF%P_NQhg;52ZHH^KbZNFL~m3hO*&+&mE=d{s@DRa{-0y+YLd<9~MXp#q3
zJ+WfuPasu<qS;s|>s$4L{YRFypvFe}u3x$EK@P{r#jc($H${*V4oUW=gmAWoq>rYI
z&1M3lZlAeVFsAhqm#0RA2(aqk@Hfj+IVSI0t~XX!vn7%-2ZB_+37H=y5nh$TZ3iW(
zc_OT4gJQBPwuWLI7LD+zMbmij3SkY}Neqfb>Ndn6AYeTI=|uHqYU~}tpKIuU_m<|r
z;*oig9&UHWga)f8Ngzf3?MrlF99Dw3a+n~;lL?=#<Z7MiQ#w47OWa=FxClklHf>Ro
zvh=sV3cL&gf!@!~Y@~y?gX&3AWM45(3{=!|Hh*#+-rYHWyu7?P`;EJnkf<%ut9AQ(
zdUCIroZZ({-G98kzA{R?R(c5*d|16s?|h^Q2nhJCK{!L&6;#tkx%IgQFUCJ%PjzXf
zyH0R5G`=*r%Hz)o7HTL8j4?|)7e;7Useb_9;=u;4GS_0HAK}xjVT?|h6VC<xVFr8Y
z7Ba~iddqd$X_I1FB)2BEV|R2q#W|{(T7;4vs@?y*9ZGY?^T)--#dS=WuSYQmAWP{h
zltI=xx0m@S@s_PlJkHsf60Z;P6-cz2%Wkiy2NFFUzvoyTeVp_9X3I)H)t+l!PytlO
z6hW+D)h)`J`|VO<i;wDSX;RXqXIm6960-v^^%Z}_(vx8DWUBoM@cHMji#nsnv-6Dm
zE+0<3XzXW!bg&>G?q2QB*Kyv8D~#Cus<&9i8@tD*Y<Yji<9(@^rd5#nozha!o0s><
z4d1-!#0kfVY1+?c-s76Jv5%s9rEcgycCX&vAohzd;NDjltJz|YBdiY#zTq#o6qEYh
zU-?hpYW{VlvQ<*nfRip)W{l5ENoQm!wMM>#lifBipap}bN6#j~O74a9QQJwc=(!JH
zJIbCriS0KT8}iDG`#T$&aqd%zw|(Z0o}{f~uRqIlRZ2Znm$s8u>PI~h;QEbMN`oc7
z+swy)*0!l^yDuPpZVTiTZ*Hnu_XeuYb)NCGvvAkg2lJ)$mv-e~5YJMVEUlde;2u9t
zL%)EeWYFs?NGhf4vWO+8;4;P5zTkaYo3Pnju-k_1QKNGMKz~eGc~^xXsLptvVxs@i
zLJlHF^Tv0bXc}u&D_*@LSZ(>h6v~_h$A3te2}t<93l4qY`#-+Nx$R|k;m16&evE2j
z`dN3qWTtpSJ$b2?+zYiR=uh8{)y@iFf*J&!vpi$Re5#wT{kJ8)<tP^OF)}YP`?36)
z&0Y@4QD*GN<9v#RAe`?;bG8HdlR7)a-ll#$`%~P}JiKmxG_d4Un7mK75%b>rCAiW*
z+<fy5>Ioa?YgT(=?y$gXJ^=FojfNfejDd~p-dRtqAez|ZAb*=1ayx3fvFz26kAMCt
z-Z6~$=`4NomDrwYH;$dv6x)!k0WO1AU;EM>`v06J8!ZI26~1x;Z)Z92ra?e)&j+Tp
zAKQ_#gqVVN*~x97CK*est{?o}_dWmR3;8dlC&!EaA1?8{2c)4XG1i>LdQ=b)kShOe
z6H*KR588y5cCCU8u|kyK9ns+((QqBn{x0e|0}xw^$v+|xfB_;I3a@8!wo@tzU!?xs
zgLKxB2-tn40OTHTatHOaD}e0vmYs<J&gsQ~>2o|V9cZD;6=%GjPanX9<li0Ya#e4V
z?Au`ERyFy`-{il@+4CNKY0!M;t<HUxbLf@j`#QYZ)2=@c9(V4(GWb{qdit#iE}wt+
znyq_XE?=!TgI^{<z#ec<%?rsgr~>q(deQwgQ*1GZc-iLvEb0XW_y4;8ryqi!pDSDW
zRm;L4AW)Y7+jw(4{)5Jw6&+9X4Jnv74AYSeWiXrz4Sr9QXhi?yRA9NoLh8r#^t)z_
zwY5cu6&l8;nV{^Hls-cyJS4cF|7vyw-(DWh4uR7-{yuv=pmN}zb5SLP*%PSmL+Ru>
z;+@s!;~jiBU!w3YH;d2n?cw$`L$~kiBkxr$ry0!stAzN%Yh!kDw!%XX6vym)^`pUq
z(u-SiapLmD_H&k=>TTr#j2=Oke$jZf#YLyLfP*!#!t3mu^w4J8wXM<Kn<O386Sn-l
z#?$N}<~2vq{~hFgOg{&Hy4eSHd4#l=G9rrdbdj8}ioR!4-G+6x;hI(GOX4m+c%J53
zQ8Fq>5Z`;fMNgN10JdukdfxpmKl8jg%bCsIQpzPwvufo~@`G4jJCKyJ*FR+dwrA3c
z!>^)rbe;Ld2(s?D8hynC3MFty%1%@-pK=k`>c@zeRY}V&=yPs-m)~C|uq)sE)y<ba
zPW-bv118>2?MqeE-Oq`<)O}|e_JSB^1WNq^_|%=;+J6X)kqd&b)w00Pans}5_#aoy
zxUEC)$9yl850?i;@5x|a;=SJH75;Z|9kPE~^b4uHS6Yh{zRQzOW4LZ%puLE1(>L=s
zT>y5y$=cKE=nm08mJr)?Tpb{rK5F=fUQNEx_-=w@PdP3fH^E=JDH{a6W;p(w2+x;I
zTH%gdJpu%8W#10*CpoLh_gT*s43vClav)tFu1@Xow~5k8(oS?<__K>pU2KX*B43~6
zdOzZaugIx=8KEDBLrvRfoLHVm4FDo9p&wWErEfebW%noT#Q*hU!ovkh+4P^h{XdxX
z?r1unu5B$!bfP3`NP_6SJ6e$FM0BF}-s{mz^d1BeghVHLuSbi6;OL#BcMeYb@_XOs
zdA{%c|NY~eHS3<4duClTd(Z6I`?}Zd)+gN>#VN*pB@{BWT-a~5J6L7_w)O}QveZKz
zE>acEdwfpm|1nv!-@4^;_Plbqxzg_S<j+ecJ(Iu|gz^0^Wx3sXX-czlPEVf;L{QU_
z+K1ga1d0HvR|eofe~_u3$+(J{<al6w1ocmi4*r5|cu+MHK1|hN$LIjO-u_}T6yUI8
zX0@mH@aNKP^UrH(@)E+{#{R44S7WHbllRnFjeiWwu$us$wwHD&^cZ6vC0zeYj@SHH
z*9ZDV*ZbL<*F_%|nNAJvS$CgEqbHO`R*=A-*x<@^U=F8o@w3VerR&h4fJZ8oCTcmM
z|Fz&r&6(JeM0?U};lkCXp5&*6x9{=FZ+oZ?-8P<O`qc*O+S1g(SNi@GWdb>i<_|a;
zTP7u+()>D}P{Q1$Zu})F;ZF=dS{Mbvwm5j>G<7El0~(I>9y0z}y};U}4fYtv2OB{)
zznV;Fnw_#;ZnE^*J5-I?e{A#dV0Ya8mk1wbr_Xv^KUFEcmKjh`#)UNDFjq#yy&5hU
zF4WS%FNg^EXp5<;$8Y}C>cdSg{Hb7#HY79rPNV8v+r}5dM37>NS5Z6M(tcZOXQfj6
zFkT3Kdg{<s0Q(elnsYrN_g%2?;QB4_N-PFs-+1YFIc7aE;{)*<AGvOg)T4h3+tG)5
zWJaEgRiDm5pl?fL@CrEpQZ?D#<4jWb+-rL6p`y*J5oIfsQO-|9!KKOY&xyl_<jz4l
zy<y6#<Mo0T9Mg%Jd)_;V6ZHNVSkM|OIa(=UCoevtQ;;-reHN^&ADWeO3h{edDNuPN
zd1)IcB?n4LTmNKtd~ALIggTSoKa`Kt1WX~5!854Bp{>SC>Dq$ED81ad8-@Tu=|W~Y
zbe8e8i1`V;Z3!)Cs)sZmKRrI9zy67KS~Er0?g35FkcR)pUUNi;C3DNfY!-P3AKY=~
zI0&OES6tCyg`1U=MRx5*zYT+>Zum6<hN^<!h@zYx{#z1Q9pI*B9v#T*l)nOz*^$Zv
zqotE3(?T?ge(!eBhEGP{7h*m|$n5&;>IYO?SB+KG)XrE3(*N6dUhl7%0QALrl}pmc
zAxun|;4Lh}4mjh)oJ0h22CPVBS9xpIZ6}pLIB_e$+0Ytxx;TeKvmNO-QPqod6?(WX
z6a^LHdG7l_S^Qe1X5KqpPx9n4UYmUNEY0e6-KEpqfS=9D=pCngrVO=;Wql7Qx!|lh
zDh#+i3+mLq@8?S4GAr;<V&F9xg8PcK^UVLSquhiDhMbJFZeeL^-2;zPh(cXoZrkhO
zttktUltb^>&Ee5ruEF{t@9kdsoBa*!Gq{vakkQScd#bvD>FQRJ%gXB}&h1ZxQhj4+
zR?ZOKZ9P9R`AHpnbMV;N&UA2xpx|>-muycHQ9bcQm&0}TprPpk_k!GRUz?R(EWfD(
zV|dkrf9(;8a>ZHG#6wT=x+!|S9$+VV!v%F+pXtJ0a`O{wH?3)$fn=d-!RwYl7<%M%
z8}I<q{BY1Iecx)dXnr+0jAnqBu=e=cAOM^DzHO5l=K90vg2rU3pEo_8YldoJM@w#!
z$z=C+MU(uEb`9e0AI!3pn?hxBjm`g#Z`IIj(S<QQEus?qw=e7j_CoiU&a_+8Te^+6
z8PB>Q3%vxsHb702Cr)N!81tDa71+K~m`6sIf$g;o%XlW3$(v7}X&$?mCD%T(r0#Zo
z5lVd?Qq@fYa@!Bg5~RJD{!Hwmx=pxWx$UbrJc%+j>u~s`(N4Oy+p5nXciX}G3+A7E
zlv#OzmA2=&KIT1mb4*X@L73DifmhN4ej`0a9QblRdfnrmL&54|&JeTd&Cv8osYmXw
zny~;KWh8eorw<W3sj3Mn+`dZd4>?=e%4@TQ;)Wix+T+>_k0ogr3h97g)vL=p-=Rty
zMEtS|^0Vj2rvf3&rXmoNbaMVhkp5xo!z%v_9F9{UDZSdVd+ATVbVTV6mvobrdC1Qk
z`Fw!;-efiz$;qftpMfj=`Yd;}GWc_k^7%Uk%~pl6U2J{R`)n%zWPYB;+_R>yq~hjp
zil*v+Y!P=MKOj9oD9jt+*fxjn3_G-9`|DU*2>7_iSa}!c;-0~;;!Dvfs2z)8`FcBu
zdn?lIx{H2Am%$p6Wj<bbHVKIwL){7N&N4_kynj{X_j-NO?;*A&H$wt<7Pq||1hRuv
zH)rUgG>f<Kye5v<98*>g+s|GaB^igBkJnls%-6J(UNmqPe3`$vZkzBkT||riYm@If
zz8=w<f>)dv7f;?M`lNPq+LWuAR#Kcz&PSYKy2+WPK<iE=rImGx8v$Q14t$Sm>#64@
zrC`+80TC_CZqz9+G*0>HpuggzCDzNdPCsl@VHWxnl}P;pF-yIwMD!dAs#XS2D*R}r
z<)yh7$}XYz1aUY>H=$nh22UoNrJ9aww`oij@OvaHx8Wz1`N<5l1?^^S5=trkyt%qc
zn(X_4D)MX)=yF|Lb9O^7BrTMKg6mzH-SV5U*tR?@kE>6<{Ye-<^(^>k13W&ov8_i_
zrR<A5=EJLS4ooldl3O!x=&YozJ0+d*7p<Q^ZYg<vsuz-UTCG#_^6DvPS8I<#4P_Og
zXW1M|(6Uq%`ql)geG3V#cLE}C1Ac&6&0ElpZg`=J0eZWny)|Y(9|}JTqe}|i6Wj52
zso_p-r?GBL0Etrix$zq0r~-(jsqNHnaTE_&gD4t5k^%ft^#$)r$Tg#`Lf%NUj7*wW
zy3%t7O{09!1JcK}S3QR-o?jdDVIIFTx+fY<Wn|Ff*3%)hoLzSa@b0r<wa)09t&JPL
zTXY9M0`<?mc^d7EZ24pp)^c5QpKK=)T?1*qX#P}C_)#AM;}RU#+y+#3rD2-pbU!i?
zhiir3K~6(|8`qUMX`=Dr`u7gU%2rgN!yMcA41?TKg(QC8J9&^Pf*ungS)|*AKsMi>
zKIeWfKGdgIxjxI7_T9W>Z}4nr??<=R2q&Kj{OF3)mDF!d7(+WHnuArR!I@XpV)DFr
zt9=Fb_xo?ab6=Tq*b>AK{Qy8!$r*o%OMkla_D53L$HB7Aq{~)~gW#?js@U@T4-Xpw
zTf<a%9aeuYG1=wpWL-wT-(vE3^jVi4H3O$;Q+NrDbjpDM-nDaz{2v>U4<R<Uu(r6u
z>dH$UBzw!k!NB<D8o>wDy3N?F(R=#hqbQ+OIMbO0(E3}ojR4+SI+D}%!tfTn2fUNN
z$!Sl)Dthk`RildlLeSV9D3bNe1F8IhvpZn5@hh-20%(g)HV%$K!$@ynUUh+|T2PLs
z%KN+fi+w*sf{Y;1lY*6vxvru^jwl*;xc*hoq@V4s_w8Bhn;t*#{kk!z3nCc_i>^n1
zbO!vt4C3F#Ic$?WXnGNToz@phiLScsY6Q)!JCJ{LQ@ag_lJRl-F|h7n;t_wWdKDak
z#y`WDA%%+;j_UgQi2qiGom~7luI;hv?`FMSJdkPO0z0~$S6})C-OR;2Fp|a2)2%kd
zs=;yYr7K<Z_YW^e1boa(Z<DIfVhgp|y9Y&%ZiRr3CAtPD;M%z2!`=FNeeo^Or85SJ
z^uwE#xgH=nX07=e@?&|N8gkR}MxyFibGcYkQVLy#_9{RG<m8_g&xYh<F6DPS#fOAG
zB%apK1vjau$DFZ=Jym#5gQ_X6a^tKp)-QaBn7B>sx{J}v-T85Lrk#6(^kln*b)A|(
zfz@o#bnh?k4O_u}*PkW=c@(e8q$^hRga3?%dPtiWcVh(n>{jnsxqvP%V*UofvTJuh
zDNZO%@A5NCU1@<mcyQTFJviW(#*%r6X6>mB<UVsRt!p{ub_03tt+w$+SER_}qXPP5
z!jaw<`AaaHb^KtZ?k@?L<0nKPoT!}CqD*0V8PIs-jS0(%{`kb2>F!n47z&{&*)6~(
z+kLz(8|tl0H;IsFuSEQW2JNo;gpZ*PMKN9Y6R7rcwN2Nx^b43iK<NbFx;4qWfu`WH
zz@iy1rUGQz=rTlbYRJ?VN}YE4b7j@vZ>I2iRbnYeW+~v)-(4@hAdP$B_zmE#caMSb
zxat2=+}hCpJ&L<5Mx><sKR#osxTfa&U7ZrDj2hN5Ec*)<&K<^<;!}LXNPW2XqK&cm
zPxgP?4Md}s&p;_mXoe0pz2u;r&Bgok%>lQbfB520*iyG0QeXTh(EvQW6TEeMo{ehj
zXilDUV*}PG>k|jbgd!H^=iZ@C(ayk!>jTKT+j=(=ak)DVeE4=t(^PxO@tSvXmlm3)
zfi$UE0@p9O-Dmg~7&{o5&(&Li-%S>vcqQ(ED8xNP<VF+C-Ihs|DlT9NfWAkKJjsQi
zoN2C|CSL+tD3`Ey>28mA%mps*YWH`*{5$f%CZaU2CMuZW4oG-IrduLL24l=hn*Vrl
z6kUbVy!SgJ+7H+<16Fb~LzbGkkP`-@>wy^i@T@|gfhjNbdsaxgp6QW{iaG3aZ@`^l
zI>@*E`EvYC;;y;NpaT(F$7c)W^^3{$x4{<|rgC#TIESI(8VBiv%bqDDfGek=%4LZ;
zFou8hFz?@rd_xOb&rq&|l%ucQc+U(kS05Nn4xQRXZfg9a#`jMg@xXg_Dh21+x7{7t
zu&V+Dc;O-?I3}PF=F>gM)0Krl$DppLO;Fd37T|&J$?C6=eh13~G&@cQtOelIhZlfJ
z(|c@ns9R~GNeXhLn`@c(WPPbD=dy)qOM6*%Y&}$j$qT>{5<kh+#!TnjeGL6_O}JoZ
zz|4B=`v|HH{Y9E_YuCcCL<EyB%%#3OJzmT;8(a6euGkK*L1X*acWrdL0Fpz3OcSSg
zLPtWTe9d9#calf`P`3%Yceh8^hNkIjjYmM)<^yb=<4TU)O*apqLN=l&0}!$<BMX8X
z6!lK7f4*enMqupx8AY>q>8Am}w-5OZ^_>aVL(4SKhqVLT>-c4Y_MvuKU(|4B5BO+D
z^UGN7wGQeF<bD9<du*%<FqR7`18^h#ZclcbW?iP|(vTri$|F|0s!>@z{2_6j<vzO?
z{(EYHYu_0e^-u$RME_(hE92vQgp^E=or&~q*i)+>rsj}~M)mFl!Y(S{0Aj$-&hF14
zVq>0Qp9B;IUFp5%mNz@Pax%9AOk94gRRVk|X{=;MXRShf`GSKNlBehvfYP9Hl^(6(
z(`7rT*Kx}>FUX#0A?@NVF~}Ra5=sLJO1p$UxSExRgg2iV?cI^K2PhUE<y?V}Tdsun
z;||bJgHd1^THp8lx~yE2fsW&Z1zvB(H%UM4Yq*iIFhod%h8kU-1&405nZM)(KjNCa
z2D+PsjgPhkOxFGF;hh>ikmU7`p_$*D^twTqAK<o#1JDeWS`#a^!mAx7C&pdd0l{mF
zShNGso53Wpf?4qDU6CEe4!mc4tX?f>2SD`Ss)5p)Z#W5d_d;W2ex+~UVHMFWuME@N
z1@1hn9KFLbk1RldXzmaux~Of!V5u4ov}JI3%Fq~8w7d7;huW2=Da-pPhTZ~50dO9K
znJH{%t&{sYRaY%^vDR$-RfY{b^^^nsOHfMC41%{z*WA|cbY5lcd~XHpd)4Bo%9;OV
z*A2*GbNL{}vprV$F~9H7j9oBr;u3tj@AJ5*@4NFdr%1=cy6>;ke5u?R2-!ewEOED!
zs41G)`HvNy@kgZQ((V0}Ye*LadYKnhc}AF~Jhpz6T#uUv84UDJC2uwJUEdMl00JcS
zU4}hxgbNT1ZaY@DOpQgTw}HoihwjfQX_}|7Kz~?bP}{2o&~tdSO<N!j>Ib3&S%COM
zGdsjGUHg|h0I!MLR{0T6=C5}8E|l#c=#wDMnH21nbRdM$8SW>AiIfgeUhO(wQW~yE
zHGAM-x+w^6J`Q}#;J%~WlZ7Cx-BvxusG9#W8T317adh2g<ctuWr<?^$;}<vpEmzlq
zJ!;Ey9eiADX>u}TdU$%~P^%$THNTH8ztn^lS{(m-$LjKoeSY=ibDoRd>H2z94V)eC
z%~#(BOh!W=GjsvgBGP~<A+*iKyI-Ce+(Z3NhMLosd?x_wyLIb7&S8q@=<t+#qvecq
zZV%pUz<T3_bkCs_`S?U=b7FohD{_5tuNu9$*CEsVXHm%sow&^6fw~K<!}P4~(cX6>
z5FZ}&{LXb3cUoQU`rFW0lK!OJZBGJ|11L+{%KZ^i&b=U-fM5@rq^n=A&DWhdDPMi)
zkge@++FidXQr$TdXWBnS%zy0}ZOs76kV+J}_6Z(PK_8nNqs?Cfk6gU#tXz%<6l8Wh
zO3}KgUrA~icVr-ZsRjU)Ldx}9%5<&kb9BFqGz_{bb=fHb0!rR*gDS7R5U_pJ%75Hd
z(1!nbVy?*$aP8A7{Lr1jAKDDygCum)u%d+v*EjA0_dwGrxsg^qrr#SIiv3B<9uA#j
zFFU_xkxqfwDIvD^^=OGurlRlTe-=y3FrB|TkPf**g`bJnHvXU~)CYk>TTCRMECYN|
zuE{wk9k<YQ5t|9mvh`_X&y}8~Zm92lIjY304W>t=DXPhS5G=`guM0j<zD5WI0~Tyg
zn0}$BV9l=qAkX9+n0_c&0PHrTfy!Pi8vA=2=%U2YkWlMni%RHc=;i5r?8@l6%M+CZ
zk=tXJUIVl-di5PD8krh8>BX~6v4kD)Wg4C85-GIUthsV>Ming2h_1Fq6kfvac%gTT
zc%M;ymcppz(Vme2)au=t-hWK~f96h}K`rW>P*NNw)a&_4epzLct)iZt71goxHL`V2
zRRi?rCNBZtRz3TA*(J0+`Q6cR3w66#W^y8%%vQRA>{fOs$)t7_TpRh!vSee)<2t$E
z($7Dh@YoW@k<oK>+G;+g8l07q<~vElytcv*O`cQl6d`lMw<)sW769d+JqX_yiRWA~
z094JA-?W#8#*1Hq>$T77YYb~3N^N4<M?i8?4Zv=wq=fW4shqRrbyP9;u{Xv=`(S#2
zhTIw*=)kT6rGQE%FxiA_Ah!(0R1b5!IM@!%RMB=Op<7UakbIGoklDtbmd!JcHpUfK
zQ_T*z=Nf|<-2|-BF*Y=YrR6k;$$hVF>s~<IFH9tpevWsFhrTF~+xJ8Q&WQw}ORgH!
zgVywO7?COPcZO}XMzHF!!=`T^U$!I?pUjjxi>E|)Qb4m#3Y&B3=W4;Mnqa*^&iy_;
zG(hqcNqO&;3|+C#3uW}Z*wARnk5w#yioWJCgjUjV`bzu>u#vpJ6B`ft9(sUY4UTSU
z;2cO>i`GDi14}kmdqc8<<cAAcy>V*~K12LZQ@7`;y;2NDdz@+$b*q>@oa7^T=b#-v
z@1)%hiIkB&=TZrC9cpaol7=g_s!Ivd9Yxaykrl@(+k)InJGIY8IDrMcwVVrG#zD!s
z>kRFl=c@|W>NSQCkME(I`^FvgK`8+Voh3DwzXP5TSUnmEl<O&9yY9G7Ta)~A>US1Z
zSsw-x&#9se9Q6v+@5zL#)O@)*zWNYr;V+2B_!{xRTn#Dd$G~_^^M3=_+4H~gC+7b`
z02{*Dddxn5o36q|5kJV1rt*UN>EDty&EN&a)A*#s#Ka`7T%b1m%V}ZZ!Tl_HHqOZF
zKt?YJLQuzZ*1_|B4;ms;h_Td|#yt#C`WRa>faPvF^vDTgJvwyY%93Ft{4p73^JBWH
z!WVshs~L;+QGFM`gS`+J3T_x#`KxlAa~^`t-Oid+Pd5AuWH;Fl_|7fbYB>Qg0*bFI
z@3~6Nldx+=!&|*f3YOQvpUvc*`8f~@<X2fUq@<j)PRs14N&y-yVmH~=S_%{9;?yHE
zGMc!2ubeA|T2tP-aH39+TvPo{mz8N!JcsJ;l5#gNrL=!WdJvFKKOx|(&1r~M$p|5O
zD6Z+VDQ;l^dZe_~goZ{KbMTZ1TSdl;aLqro4)yj$xR4Yw;P_~My*sNAcQ?8FgOuW>
zBjp8jB3fEC1|=v8Gt~R@AGvchQ!!KB4u0XLpJNno?`0#6^-=Zsh}He;w|UFP(q1pq
z9B*qbTm&J+AQg%cP56sZR8;qnE*!L}u{tNO4cVMOxjHJZ$n;U)fCZ%_!-Yp)^2mSJ
z82v;@>m)%-;FPb?+vyT6zCenAV!bZ+3D+A67O03>d?`77MjoDD$<S)5v}plJ=KvG_
z)Oqt#Mc;}~-41(LrsIx-*W1B9!}jyd9Km#}L5$4U7<~oB_?z*e%WV#->{%&Nt^<)<
zFQK8$Uf{fNe&B}XIiU30JErrETN65|r<(NYFEv@&MR!CtB+99!2?~B5BL5`d8OoKw
z`Xg0{n=A2C)xLU(<WFL&M;aWC+{;@T6ubg`e%D3mjbqcnGj>aXr~nfP^3XckuxEk+
zvr>QpZvKN8?gg5d(iljf|C47FiG=7SBmtAD)I0C~;+79~`FS6M-*QRqv}T2DC|!|g
zJDN_py)@Rcm_}m8i6ChWC=7dkOKsBp1dvr2y4hodDHYNn_(ViE!>gG@-YH$=C>x(g
zKl1bC$ODT4xafCe{gNLi;kv4CfWEI%x=cJ8bCLnv?2oD~Ii8U=Qb~uck}kdUi!_RJ
z2vmCSj~h;Q9rc1dyw*wURxJNbORCG|9f6~qX70r-<Y6tWvXEXT6qO#cyRxwmlh%%V
zATR#Vv_%j@IA4k-rdM65N>8FN;QPzb@`zN8aDNx7(1~>x7Et@Bm=MaCBw6Z0<4CB*
zGy8}+=WhE<(dmM!|IiOrtcQNn-ybG;y;9ManU<9<=6|Hu8~tt!(dI>wQbG}5XcE<k
zPqIH+l*}oK8-j=9RZXizw#}f;&Zzpf`V{uvU^PE#xZ-geKjHWTic>Y^p<>_KAd$&b
z^4(xb@|hKWod1i0a>Z##%Ni+J;WtWyj}8z<=HrT^X);;oi4?e}Yn{uB@QPtGi1=jG
zS)jZ!xbUmCG}W-HE!mD!l;YuSm5t<MsS4yBwZ$KV3|G_Ex59kK;WMXLKKUYJclMjD
z7d;FZ?XjS*Y0I}0?nogb*YT(09v?FehBNL79(=(~xBIk<JpMN-u8Hs@H_xJX-C<zi
zs*Ao2w8{p(&yV<v!=u=o6hhmLa%!Rz2*l!;HY+CH*ofw-gp3qOUG`mx_!Slst7_}T
z9}iP1%wmiXX_aVdA}5?Fl;H3fZToiZ{Xs*!caL_4G%x~_i$HW3gxj><fjmBhdJzxG
zq;7u`ylXyNTM;q-K5ds(kwc`Tmb8%cv*Mn-8bH&+PL%Y@Z<R+>fi+Y<2tUHK_RnL;
zR*v4RK2`&fXzmO@(9tP0!Y0#7xueIEdK`4mG_|d`z(YqNeLb%FYvuF^e@J#!e-%`(
zPJs>Q+YL*_-iDv-?{xA_n&2*7`U6w1YJ9;S>l#Mi2xVAthKVDi5;x@E<PhYRab!ib
zzY1883-R6s$ioi_4Ub*e`}N<tZ-$T7Uxr-}wgz_z<Z$jIH%tUtZkbQkI8vQg#9HRP
zooOG@_sJUZ$ajU6oYCTB*<3^?Bt`1zu3v`_N4m&Ze|{T&fO1A%U$SWsTf|roep41~
zdzlo|$y&()*zW|tc!cT2M88geZ7wWL*>GY=50ckm<#uB6P}bs}vY|k+Ky9o0@cTDk
z&i~*BX9zNi9!~8{jEK#ui|0NK2Y-6{iHojkf5-f_tE5Uq-^1`5YWd;%7>0Q(=bq5J
z$<ul$@pyr8WHPUpMUh?WTPm72_yW6Jf!H(rOEli$bQ0-KYQuk^lYO|wzfb5#a`8!b
zOA?eh_ULDWC`8BH&c}ybtt;+I_gl_4vw~zjZ?rzkkPSQa`z1O-y1I)ASzAe+3}|cv
z(kSNNfM9teazB2{_lx)YsFT$#uL)^Mx0&PoaZXPiw$o3kS%_WL$a*rznr-fy8>@U)
z>W=MB$Ym7GNP*V#$rl;PfDL^3p8uz=b(imrYMSWl;1(pUX>CveLR47E<Y2bB;~`Lc
zf$D4E^UVkl9)S;)N|?+k`s%xndtSrR?alkek`6aPEsnUmU&b3|b0XXGOIO<;nYr_<
zUr}tnmTrDI*gIxxm@d_0mL9p#^3hzRpkjR_*q)(v;^>j!La|I(lmPQnt#+~p4>Uv+
zj|!aJNQj&xL2zk!bvt$_<x0ypeL{RBtT+j8%u*=7yv1=y)=THW)Hz5^kyRU7$DOH(
zN<hamV6}kCT`Z*pD3w$)bUf-B=m*-Ax)^u2?_dV>?G8yh$qhG}E>+5M$W^kI>zNRV
z=GV`<$0>b?25lcLNHEBbRqCkZ@?c*so_(ql>A&c#9}r1)Ox?vSx7t(Ibl2o2CVQwB
zVNju&K|ZXE0aXh|-|a2y^-dmBOSHcOMRpf_LXP@M*##zVC+_21FkhhY`ITOKxa4w6
zW)Q!<OnQPLN({hWW8Bg_W;gUCUbMCWJqC{|;f~P|@8%NBJWQ9Nvpt6vRI<sK#``Re
zL7?U0{W2NaVKNM^;;hzML39G0;;|8aLfe~*vEdrb84r*1;{{Q7x^O^i<VfP0Y87rO
zZ0IG)NcoF!Nz$!O03%Yn%9A!pq|sdqTl8b6MQ%*%fthp^UKDav2ij~-6LXW>$l+2F
z1(NAi6l7)WFCpqQXCsEbMfEd`R{N0tPEhC@<JL)XC9~PCjcRNFUom-kW%Zt_fhVL!
zs(C4!Ht2LXg4Mju`8y6S`=oqsLf$-990_#pzj*OP<qtUt=a~jRgE^JJagP_C73Oj+
z_ob&w+6SJmPaDhPuAiYNXXjJc!qUzXbEDZq2shja8crlk_p8d6Maq@zo&D-#I%N}Q
z0*8Y{+O^Dc0YsS1#BYx1W>#sZ>>Iz`uD6v$4)}iCQ>`T8h07nXsL!Ap>?M047Z(pS
zP@JjyVz-_n4m%wz7v_N%Rl+@7%$aW@{SoYdpAwYKcD;H>P0=(;okE4VhrP@M`y15w
zS550}18;;9!*QQyH+lfboOeFsrQXQZ+>pc-Q5*XHI`xup(P8|_u8fDSGg=Q=Quc`A
z^y4Gv&<KRzLN|Tl46nI|US*Z1?Dw*KGbAIBW_ufhoMea;J8#*i4eH2siKA2F4UK9`
zc^cXO9F+osqj|RF&uTUnrYGd2D+=$Ro%M#f<3z!MIM?SAw()eV{Z&9W`!)ds$M8E)
z=i6ZZ`2`0-N;&r6`*L40TmB(z%CdQ44b`x?Jhk56mCu%VijMvq0cJcGO$R*Wb-$Xi
zx=~-Ec$~vt;sj!CZG|Tg*ABuAXSPEf;&w74wQ4ZpJjfW2d|rvNM?Ipy*OQdTDo%H1
z4pchwha}@RhJQ;?&xeg)5^@D=*%E!Yng4q06p_Z3uhD*OIg!a*{Njy9R@=|VD%f%m
zhc&o1p>%`~HxuvsJ#9Hf@r;s+8N0b-{gd;Jmxe}XH6~$2OBS<brQ5=(n$?b;6{O?S
z7eDTNSj4yI<rf0oBPXineVxmyouvsQ$x;}pMq3S!_dx+gR4d)W-q^_K?=$3t5SKTR
z;emymh@T8+>U8zp2{ILGJx(C$1W!*Qp(O14<HK^q6J9$cY2KS&PYP6Ts8$T^cUSp!
z<F7R)cE(ge#g(z?cF#(-4VSTfb&B-a=wf0Y2PxUqx$vK@VI~F<Vy*gh<6*0z=Oj}Z
zL@QpsNQ0vMAFP({2B!Fm2*Z;LT~}}8uTEZ(KP>qS$qIWZ>_1VMt9SWw!6c?a8@X*`
zdvVq_>`jzDDW&z!2z{MgCmWe^mU=(3g5GB+?w}SbPz|n0Vf{!#6GCHA<V3Ecv4#H1
zmJ|9`?|Hw|r9Ng@xLRVq5#&bkGmeI8R$tj8*hI13HZD=g7w{kqxhnZ9&u)U^OfA%c
z-E_Bh?YX?8?>_sq?Iq}jsiddv+N9-5e)myGx}1*+OsBZ?D>?2Y7RH?25$yBnGj*m@
z!U`$TSR&1Y7KxFQF=LpEh|h`dZSpEeQZRY1NqPiv>c?<U?w9DwxDT&I-#w({;FOjM
zx~rll)xVWCmqk`o23_%BcoWvJ6k}hxdgna@P;MM0Svy?RSxzX3G+s&9jlCggeEOBK
znsJUKnk%e~Zn{Qu<Z;878@@JslyB_#Uxtw`$tc}^cBB5`Wf|oyEPw20oF}3jqj#rY
zs6d65m_f{QXK@x+^*AYP)W7{ij{aI=On`Wa+@_c3M-?VywTMqc%C6vOC-N?rE$;i+
z>2HyegV>jS1IiQp^Ybk(A*aP=jy0|)GhKglk$gl7ftU%P6E%YvLFAVay~x`rbxE^F
zTPQQCPy?&FuH-OG3(RNxzSzntk9=4*p~U>3uADR=s>t^d0Is-2sAr_~=}K~pL5PTg
zJej`8atB7L(mG9r$*EwrOOViWQ*rcWM>S;SosjFnlLboQcYnO1{32G&h<+*-!R#wY
zBa*HY18*ZbnoHJ^V(6?5daa{O)11Hpn)9o6{$@J=vaL`W3`EmAF;=VYm*L=U%9<7{
zr6B989J<wYY=-tOHwIXotltn{ytbEC?RFbQo;lS-_#`s`Uob#kU@$c(xEuXQxUsx7
zHe_7JKgfgKqNibbI>MqD@F*;K3Z<R#^0Iuwxv%P0=sKbl9O3Vx{}vJxrhHQSU19&(
z%=Ixp#UVvH{xXFVM0*~YDCqFco^FK;gbsVyeu#gj+McHq2OAnZ|3)>~KXN;wiTUwi
z1R6co&=Hd&_53Qyn5?i>!*B7r*<x_zuKAl$SaPp_yorvtZyx51nbEtGRSOe#%rV9h
zqg<^w*(pcpQ)d28d21z)itUp(U<JnkxO^~Oj8wJfBLO78wXwBGCkn|<SaoFo)V~s{
zwI~uN!(tN{#Vj05*l2!BRrLlWW-xm9)^l#~u}}qN_UnK`q$Lv=m@wY?=NT_+Jh6Y>
z>hy}_uz=2Aef~_qyxDp>zo{t-KKW*UmNEBPFZs$0zuXDunz$pcY`dI&r~4~cSzM6-
zZ7c%90an0+Nw6=bO6JgO3(9n%gf=-IUdG+eT8f;~$ctejO};*1YQ%7Fy2%?ouC$Rl
zY(LRGXd_FFSU6td{Nw0#KIonp)r!CVQtH)H?;t@yVhMg#um&!NyC}J3?kpDYbo&4>
zYf<X3qe$7L?~D&jr^YPqI*&8RDZ=VCT9T3Uxhvo(b#lYzVAbCo`K_DhT4SZt<$s+S
zWZdgz;LBfHB`zFKZeI1Qicj@`_NI^a6M6GouIQ3XA;x?6V&T|?*2Q0?&d&tPbP+5I
z1&3;<U2z7fhtbf2O5;som)qhy5~B7VZ47A^pOD+MVR!K7*ZxVCw{!9Br`tK(tPbj&
zjrX!0M$c0TP%Yq^P{)lK!_3txD%!N-Uo$Tl0m7fMzPjLgANs_ZGRMA5mQ9AOMoW+g
z*^4blwtg<|@b)>T5$u(Gcs!Y=S;{ZR>zUAl)1CY1G2JjZSm(8H?_ZZTe(bRF%8?bv
zkWoOQ{e=-eyG6D2p6t2|Tj1luC%91%HL|MO#;Rp3nxoj}A6+6wsnfk;!5`^{MOIm`
zb`uRS`Pa?ENCO|SkrAINasPmIOsBvBbq@w+SeJxy5&(YuZ+Mam6ZX8Sw1pq!*>3QN
z5WbqO6iiRSI7+&g5uKw%H@L&4hjnKYYuZ85PWGa?y)^2(wY`1@+V}1V6W_Dn8Izj4
z=w_aw+og-P$Ja?3f-S#QRCUfroj<8&v*dd)kX~jo#+&J{;56EYck=sr-!pE1CA62t
z!z!<u7Cg71U=l%T1ZStyH23{Tcq<ujnsNnT!WQ#3#*H*Sc%DZ1P}cN<i)pe(t-8e~
zn<eE@;P>5^Z`Wev4xLseXvlSToSzH&Jcw;9g$Gcs9|0)M3-yN%x;P@`EEQ&M4sJB>
zpL+)OL|J?*71pi)?K+=R(ilh1+W$lfDI^$>vLeFrlj`e?4)SpNdOcDhJVG01x962i
zt8q#v>tlHgmEWMQ^&sD3n~g^hC(QxK`%z~P_7pu8?DOAE_9>)99jlpQWbItC-gQm4
zBLj00YRf_H_`jZJA(-NM7haF6u_QgQHV+_TIs+CtaS5FgDo<o1r!5s_xcb06ZcY>|
zNJYt*V9{)29xD1K#d(Dj8o4h;<U6eK4xqgQXEdTV9$ZxXcD`zg`VxQZYK=*;$D_-X
zbB)&K4MEmrws|Et_t)IW?}STrRzK+T8~34MW_LYhYS$E>J?i;G$&bhsQr8tS(3y9I
z3K`<X$@q2}N#r|MNHqLe#*NAdj+i{Pll>vI@?Bptt5GTU$A=H$Zsob^;}*=~p0wmN
zFEA)i=h~lO8*z8qUpd)dGCgJjC}g~7A%L4@Uw99uz<R{3+0(?RwN|4|mzwiRAb!Ra
z-!T20X%E1XO^Mc7v#vRim}|F5)yn-O>w6-VXW!SN*cBgYqig@l<cfGZ!K{9^jWB1&
zxDW3nd3yfrOFHf8xiE(ag$nQO&4l4^{@7OLdTpJ(L?<RL*YSC{fl603?pXXeNm}IC
zIN*s4nl{hcHUkF}`bwk`h(L6iy#Z3a%XUeic=GeWdu=4BOd+Q!ziUFF3d`za*XbhP
zShO#rFvCE<ztm3Tm5I0^R?8~dY7-8b+6m!b;uB$k{CYm0a#eIBerWA1!In(~=T~9r
zlTy)W#(HH+I4BIhO%Z7p2R)~Ld%`ctk~+$GcWUS_2ZpF}=LFmUU4rd_OnF4s^u*s-
zOwYj(^zu;~zFr%Tg;S-SrKO*MP*u`*<mbp<NA5OeZIYi8{TQ0o+1&Fu^L-K;pPmp{
zE0^btm#HtJ$}V>AV8w3<KHMowH|pO3pJRH89OU~=s|a4z({@n9XWUsX7$D0DG(?zf
z#StZ}b|SC+%fy+^YogAaf>cs#r1VoOZt+i6<f*mSlQf|{r0O4V$nT?rRPAqy%%moi
zfK>7N#0*k9O=`U{Af$xfi{Lsp!>}*h+NM&JW0k*`o^L+iEo_6ID}fn3WXVDVZHsm8
zUNUriPI99f{0o*`GKK3|t9WyHfg<G`*9bl~{B4NHO%_2q(&cz!^H1|rISJi8IItOv
zK1J9@nn<kJ)U0*Fm{&sEw8ZmvXZTOnlTsQV-!jF#5=|D<F1B#DxdC0A#q8h42{Vhk
zd3{%33dkY2QN`h&UiSG^>O(EQw}K~c?Juel`ysb`e&N-3bJB|1g69gCCC-?%c4{Qd
zXg;C%dSFX{E)1(IBpBtf*tq62b$*Pw_%LBv<0XM<+s?*2g^1`SVc70$lzomeec2Yd
z637aX9(-5o1^OtM1Jq}>36x6GdaHa%s*n*;1Lv!d-4{9m!Fvd?=hhhE!mU`sc1>CS
zXshIt_dUwjD{#H1*Q~WVvvdjy!vJq<e-Qn3%$?fD#NlwU@|&XrYdf#^TL4mZkq|B-
zEc1fA3}&WmlL)89Dx9^uLTB&EDCb(QuL%+^ECP^i;TB6w8xvD}lS`uU{FR*`e~WcB
zx3&cBKR{<KKULAB<Ac9Ir)BXNW)@s?Oy($OOZM4b{#d|8&ru}q$rTA$FoPj#HPKA;
z+w!f%Ia&1hTI9fhS-X!{6*$jBzD?|PU(&vPn6iH&Q=K8|uXHZLSdr?XCqcSQcD>@R
z`)N7`*$fIH#`l#8G)4A!nv>oN`8oWo`hxp-uk+v%l3lONX=9b2EH6j=di6ymIDU0%
zqi<h0LM<&GEhRJ>d3I@H`RF_Rucl(ia})ulw(3D2L|#Ye?nuSvFD~2UCh>87eO|dh
zEca`Cp}P}$8@*F}o2c4~U*uBy#igKccs*&rGoheM6XvFnQC*sc=oE;5jL!rE&Tq0t
z4!E<u_@$IO-Xr^bCWx<)=0g<ucSHRj3;k|3)m%S5vHeU?VQcS!eS~@<`6suQ_NgLS
z^M3z5pE|nP&sNDO4ck-Jf$2u_3{&=l!P))|Eh<;C#3IXvfe!ji&QX5alzl|x^qV0O
z0Uo3@UK`cNjn6+;HZp|<uzus#q+KPPOZ$1-QvCLtK^834WqzFe39u7|cTq7B0KN#H
zz9|YmL%im5ll>M>XS$pbZ^r&ni<ErK<D{}b(zm(V#<m6X0PK6pmZvEvEguGFOpIKO
zaNjvo$au&4xU+(cXuhy8r5x>%wI^IptTR1uO4A;86z=!o)k!o5(d>`NMORsOx3eT@
zgX!u-kYJT>vjpJ-2`%WMDQ0cJFm3<0?Q0ADvl;W)S8R{pIq|uc#eb_+Z1vwyfddIM
zO?Xu@RwhOji8g((Cp}1wvQ3r}l{t5_nhXem$3|uEWdhmAMens^!#&9JquP?Y+eQ;l
zuvk^Mba*a#6*4;TKFqJ!fwUnbRTaAj+gD5`gj;0CA6r`h)+@_2`~i)byFTj6BEwB$
zMh2#019xWb(LepPkEq{tLy2GEpC!gt^HbY;QtISk_o+I-FQ8K|$dpT|Cn^7&&#rzc
zNLdD9PG!+DCf1(Y3$lgx*7V<Hwq)Rff;#D+VAkg`GD=F$hbn!&RXr6HopQ>1l0D%g
zh3|gbWIdL=yC27?Pyu|JSBjrYl%%ssng&x3Y#UC2_K4DPxMIwN;s4mfxt(QpeuGV-
z%s?0L+qo-Nf?^^K{WfXsB;AdvUjA50&LlZ8&qO4}`g|X$^nJsFX#-q58m%2~yw$`n
z<y3LHsxct5hR)G_8GIBmIhA$hh56oR*x9D<CfzbmE<~>NXzzr&@b@ni|2C42uU9UJ
zX;k$-W9&2ClRxd9-j36Fm!K(YYPGl0o`nSDq~El3?5^OTD|0o=R-ML@1LC2=BQj?|
z<yLBDA;<H&dE?4>rT#s9w|OX`pTjFGC$mh25A5Eu?g)K>Kd=Upt04Os|8SKYWgXWB
zoZs<@Hsm-8mJj}qX5;I^e;$Y^_ci{2F{D)`X-Cgn3y7LbEL2*5(M_Wpl{V>6!Ya3Y
z-N|>5#(=$Cg0VuPsfC^T01{^Rj51o!rS#WMBQv6w!7mF{{wim~sKI@+eUElDyj~H_
zndx?wd~gN)X=Bl9sr8=;p^k0IdPYsgz`LQbb4!b{rZ2Jj>D8|sNO#Plgg*<>VRhMb
zB$;H)pbqrONpfZz4N-WF)lPo&bnZ?4#R?S?fuwok?4sOXZXumQNMnzGN!?!|uWY{O
z6Ws_gbTvAztX4AgV!qZpXkwuXRHu72E-}8U?AnS6_Br9XQ8b8u7C9<x;QE9<udnzP
zD_?Rgq<OaTrGX}(D^%ds{pte!X)B(Rr=#OHa@ubU(PDA=gaLA6!#gyu>-EV9$cq~(
z<HLT;kiAWvA^!}+$q?slEBA@8<hThpYILTRI3n`e>?CPp7Hhy4?(KbdlP433cK8+k
zB|LTN>hoKvRHuRylKy7mxW&?Kvv0Z(|2*S_eY}QwFOsloWks6SP3qol_81J#_#Bou
zC2fr=uJbW+=J}f@N_B)r_g#xmU(QU>C8Q6|0M^h#ADeKhs{9HdjOIa$qQ&&|6m4WI
z*Q<P$h9|feHL@ADA)m{dN72wBtv8OfE+b365@*^Yj0|x-IA=3!o*Lb?#(opm1%Vr{
zZ|gq^)8i*t0lqmh6`^-&GpjOf3q+fmasaC4)6cXDrrEfdy^Pr1-V+C>9S&reaKAj<
z&rFBgN2MPJME2bcU5%L#SgG>T5R8`_D$jN-rJ`bzD5e8nS+Nkk2C;LkPXkxbEdeKQ
ziagl!0`NW?-*h(6dwkrr_$q2J*txn9N`~%3m3HgYluhyOjRx7L+ecqauza_>8+b-8
z?T7#QFQfSipUa8+6a{$rbAX;`PV=GAV6YEbv7;fqdH{HP{49)fIpNy<=JU-MX4rqV
z<mQdWE#|xqd-A-}-gXJfBVc;G+6IVymG#9>Zc``jSGUr@VE0jTH@TiobwnlJOJspH
zc-$F_uF>HxJYfmtfyz<$dIc59HOTj)=6*HFNNsr19WBUSR-LOXo>moP1qq*+uLAw`
z2YaiMCEuzK=zZ7DAHrP2S#l=vF;6U;7}_{+x}+i@-M?2ZVr|UN`J1U25MSK)_hHZw
zSS3II^{NtU+Pa}ZWVkz3smGINra3EK$$#TJF5~`}uV2v@<JQYYGAMT1UJcB&$;B?_
z+InRYb&YdXM6Sv7pac!U^s`ws_>xcwR{J+<RgeN>OdU<@gfVh6<%2xAr12lN>!F6v
zk>gW4Z*~u9FYsMyT1c)De6^uN8@!crB&(O<kF!;GU0@NI^<*+;=v95gZyqr$O_&sv
zWm{6T_|q{;pBg5QUR&X{bxAz)U-pX%F8y8TSDo_`X=ATrSGT+HfVsD_XWb(X{e_sw
z`Z+$}TPWD;ORQ*@n`94_kpZAD1rOrwiwqT=QtcGB*|Epk$oeCH&SoWDLv%+mTVkqa
zzXb0SlM86~A;g7#uwQfmG?kxZX$uNP6WbnHSv59mxw&J%4>Pog%+_ZwkzoR%Wvjin
z4TR!8o~tQ;Uo3Rb!cQ2D+O{~`&Ks(8W;7`^7LTxk3y558>5%}5)J1H$+CN=(j$^Rp
z)0C1&;}$AR&0h%JIY=qOTyYxCidpac5jj(h#43Tp&~8%WpN|{Ne}Ma1_UV3Udw=P3
ziTBkQS1_Nr`1m!}e}5XW6-umbiBIf>K@EAL^~S#=2DA_>xz!7^((j{5eC=w2^?4qU
zi%x;`_(n=-;@{K@%G!1_MfT6=fL{&UEMMMSF;Ja>Tpnc`yDWZDz>A7K6t<;dM-Zvc
z@60c1IAHfA8yZacPgPKs?afJ-3q1}PRH4;OliDfd3(iY{0_iCQugfOL@F$GXxAFuM
zKx_Uq7NbSY7o4j8Fo%hB=`*j-yYE_2VY7DM<3@-cg|0go>jbjJ(01nG4J%U>vex>h
z<%BHBlmYZZ-I;2=z+VA{Xs5<CIT%EBz;mc+aA?v=Hv8>)u#B1ixmPOyX)<^IkxP+o
zf9GZ*9rH(GT{2v_7Vn@yADbp+88K>BLb-nj^&<>Z{PVO)9WQQ^`p&@CTuka^Fe3(~
znE7#TygP-~6@N_h_Gy$ps@K_NJ@RwLCtH9}A+obWqU&-ZoHWC{WH!^68J@xbSKp9y
zDwJ^lJr8VPBH5x(GM~TS^m1HC_V6=(p%hyZLXZAN)e%rh41vJ8ENR*1_UklaCsER~
zZf&>o*Ry<Fk8dhK==P4S(ClIL1jfig_+!H?onP@~LR%u7&r>o(WJ7&o9qX*T3lwG_
zHg2?dh78$}{%A;Y%GWMPU=u);f^S&gKxw6<+l>x8k*=$yHbF3uBq97$7#}{cj=F}d
z&q}O9r{qw%{+k_BKHtVIB@x#5_c?k;&+aaxx;k(Y3jC^Bc!e6*=2QMs)$UV;Ztai8
zkAgHCGjQ6iMqF!6v#^^vvx1g`s-c~0bCZM`<j=zev%;ln)<7RlB8~(654fHyJl@N-
zY~cBNi0^DW583UzV<U;0=`&%56itFpwvX(5xX30uTUzt{xOu6s*9Di$?%OX;H0n;a
z4A}Fnh$EB#Y`NX2lPjL5d5t~&X3@fmVC4(4BJLaMJ%8Ecqo}VSk4af(6ef4@+eoB?
zYas;+_eT=48@-IJZ(4x*g-!Qvep0c-wSR9ZaF3FD0ULg8)!Vs;@9G3=%ru8VQnSu0
zr(iv-L5iI6WKy}$w?GJ8-cCC-_CU(VJMqkF9y2`CqLhK6++l^22~L^ZW5KgX&a6jB
z;o&3GQe2OM*r-AG?~ZJbJ!{3AI+YYhsyIR=h_?4B+lz9<m0ebjGyDb8%kH@WUbxww
z7RoFEzIu(}?iP|dq@-At(Cs_eVB{AX<_WnXlUFnkZ5fZzfF#yIykl2_<rBUo8=IuA
zUm4b+Zs{Jo&DFKfF`k1Ow9HgEWV+p&jz-dWY6d&;(`K8cRRTJmivH65#jTFj^?38I
z%e)o~D6wjuB+p$h_n?dlUSY*w6K1&=m`Wpzb#8KD%|YtLPmhsw93yQIlckd%VkSo{
zY1C7nM3(;k{0QbKH(@1;+ik@3c*j(RP^in!^7io{74qW7i$FkM$BRnU4*Nu84Sx?x
z%;qKL!9*8$@&3JWrcS=G-yp_sj<*Rp;&;OSWyvf0j>siq*39Rw8k~Vz>4Qs|lv@OS
zs$_Os4Sj3x-z0M3^<(zkgN^`=WkCmKI=~9W)iUW{I67rMW`P4WR<-HnjT3lfuM|l-
zapKt=M1}5jsm9-R(XVHwoV-#g+td3&r@YZYZ%hu4*tGJ*ANc(}{FBr}dO|THq$iXS
z6)zOB6ir)rV*jmfQnD6t>Fh3NbpGpQy1}dwwWN2AHXw?!9tL9|DZC2EJ#*sc9B%Xx
z>1Qym{4p`VA49aMc#~@-)HD2L>1t~AwRKdMJnQq2HMETk$jidTzPJs2s4Qq@24&pK
z5%Uqh>TJrQ+iHzlj{xf(1jNS5OWG2$7^XT%&nuP_N{?;PNAwA$oqT##oSeP}3GP-v
zX3Pk748rp4Ocz2CsC<1pM_hZ|w+4D78EGv1a>7cCKu;lD2t^QLbLB{GC+EP~vB<CW
z{rTi(_Nupt6vG*>M&DQFBolb)%~hpNnKuYd^4TJoXxO1*;<rrvd!9UfHyIhUe_|H6
zw$re4ZzKrX(t_c_h4-!@$j&Zg)Hjsl(3F&Bde7@Q!0&D!W{@8rzPJCGQ8`DcuFUzl
zXmX6+m-%1?*G+2Mv&Lu%9$6QUmo<I+v6=OMqnkfExHLWhJf7?niQ0V&`J>MH_K6A7
zH>}F^k#=kW29=7tXrEYJ{q~()&?iNX#Loi!km;tU@gJJvEbR2FHnfr(8$6P_pq1c}
zbTA?IZ)&ehCIGO%IZJlej)mjr$xrAHFO&KAms{6CYnX?Xwt{xBcsHzR6qvz`%umAX
zsFMXFYc;5i_NO&#BNgp)aE$jx$PX^p;Q)OlRbTv+{wRY?3Zd-CU@3T#JSWcA{hEHU
zI0xwzZpmNxjRpk5^v=?}{?3P2$$nYcyD$dVM$=>F$4@snb(jBias|y5V$||ZWo~`I
zD28`%N=XqfOyHN+^tv%K7HzFT_h(~mG~DmaG|?#P&c*v=O<zI}oo40|N<S4$B|-RV
z_`0+kGDQ;cG1Mtt2aN5funs<H$n@#|zWvmx*zwJ0%3yfB2lz+w>=T>_)el@?!VU22
zzlMtPciLPD(N6X6(`!4R#QnmnzKmGI9_-%?mo6YIovU+4c8~2zLqDbBGftZMKgd&$
zr@&~|mQ?*K%m2up8>e1QzRm5PHIz4{e*g3PR$(e$ZVD9rFs<tGXp{$Qvnxz%e%X%>
z-8t|_PTAx-Pro0W5WcV_e!oou7SLsE%-NMQ+0QUE`LZ4$4XQX-c7%0L9Dr`-zV)l0
z%0Aml^q!4qj`GD;1a>1LNdhN18x|+zNe0_ZT8gR=oda`K(XhoMk@01xToE-?>)7`t
zopp0hq-%k5u$~;amQ0HL@wc||;O`C3BU&ZfDf+~6&G}dC4!qWq?uQkMV$nT2%!D$B
zALQdh_qdwdYMy=_|7?zaWt+P*=jeXHtG_s#H0Ec4aj(hTnOCPmL?Jl33`ccizWw-l
z<kDy1o~q-fmH+T}=_tGfe*_Fe19v&i@5l7JFSBZc|NpO2g`x3Q^PcAVaeRkiU<f>O
zcyHispspri<>ta;VeMvV!{hJb{$D?PN&)=cEv%euyqPU+>>OOBS<X6oSePBGrCIca
z)%n!j6>RJsR02J1bOSZsTLn5<iCeP(WFAZTOZ)|JvGKNG_IGi1^^)+HX8A8%iNE!K
zUh}dr|JM+2CutVBe>#{A)U}uu+&pcVg?R+It@!x)nMFi+_=SW;MEJRw1^D;{c=`Tj
z5pI4V31JZl0a50EB^H^-f1gsG*0vHlic0^Q?r%$)#opW7U4oa_&(Dv?PmssW(~g&4
zTwMGg7y$w9zazN40$jZ<{JCAdSpOU3-#CgkURItC?%ob=uFU_mEiB!9yro%K9y9+x
z>0ffWxc_G&SFeBR?ynYk{Vm*i`FZ$w|AYJw`2T6=?pYcJ!Z?6eK?GkW7bgkDL4}fB
zf>Ez+L{keztAm+38Ix-bwz+bRR2K&~x4Jp_83Y&SF1qU%5I=z6=BTOBz99~xi~IwD
zaNLvM-9OKI31?GNFgxJF;=F7`JI{K8)w$TON#?dL&E##z^8;Snn@!361z)|3Wy0GC
z6VehyNvOmkI@MG<uN1oKqe*?`dG30}quz4WQkJNyQElO)ylc{DMsi<BKMl`y+SyeP
zMEU&_xsJ@rtit@D7UoBK^K%_q<f38+hF7smOs@K+l-wEoc74%k*dk$f%I)?vdY1K9
z7Z4yofB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z^2^9b=fDT^-E_PjUpB5EHj=IXhUYRX*5Sp|9T|^Fv8K{oynoCNBnw09`pZ<QadkZW
ltWMuHCe7WkQ}X{F&PTWA25(ZY6KAb+F}bzP%;oCN$s6pH=D`2}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5b920f7c0678cf3f159ff509b63c09606c677f21
GIT binary patch
literal 3595
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
index 8cdba4ce099a9fc9c01eb59ba87790f10024fd4c..0eea75c96a76ed107369990ae47ddc8e2e4470f9
GIT binary patch
literal 47813
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1402d81f45630d958b521869480bf14b272d2807
GIT binary patch
literal 47847
zc$~z$1#BHpv*>BZ6f-l$%*@Po%xuTZ%*@Qpbj&eB%*+@wvlC;?%*S}n{_}lr_i69$
zKHb&5(ksnW^-Nb+SM_LGBmFcnDoQfQ2m}Za5D>_+UnSN4vF3lz&#?b!=lu+ge+;yn
zxU9zKf5iW@dGtTm@XlX#+#nzjG5(&Ai(7&3|J)>Um-^<e?quoiW#Vc9A!hDmYVk$d
z#?`{h$<@y7i-bD&Nl#P!KYloW{Uls1Ox$gp9KUGTI9Nciv9hqUv9NI@<2V1~0FmVE
zs-^9nce%iZ9xjR`y5KC=5RA#F?=oLUJpBcNgSSIvUTv7wN2J-~&axfcB@>sKBhRd^
zL{??Eb==pv8T98hvGCv0-x4Hfq!aWAKK{>2P?=FGWtEnhzgeQu1Djw#EXfIkp^O@K
zLU69|KdF6nuoIVl-JS&fT@{G`qR^Fc6hlA=R65vcsQ*)Lz%Q>~(y7ASm}8ktJE?pe
zsBhohJcFzX_XjheNk?-_!&7;oEv5o*$;8N4rTgM38E(&ZgTR`aJdO#lpGC1`lhEfX
zWjUF*j5LEZ4GfS;K%0GiK76jTj?|#3g}sf0BcM$FH@4T~g^dIozsyZQF6gxA&sHVK
zPOFFi#Fqz9{rU!H_GGf`){|R)m6Vsp!CTx52fR5E3F5`m-)V`usc07H>rrh>uiB?~
z$|z>n79ObJIQ%Wb%O4JiQn`n;<vg^i6jBF;bIg9I0=;9~e+zvVxE4=K=)7$2hFhP0
zB5T<S3-w*}^mR{Ns^GUOjC~45X$va*?l$5yf4&4<$W}UQKh+D897Pv6L7H>aMeY}}
z%rNr=HV%`xj$e(%h8fr&qPNLCc8_gtBp^p5wx5y^YCP-}p+w9gKq2;{u?J<5m0Zwv
zJ3k=wfsqPli}Pr+R5<jgEH|0hmaY(*Wr&)E4nH}+l=g&mF<2DDB}_Er92=L&HM(p;
zbK9bD*UdDrJuIGBQ-@g%?dGt0+ruW!>^25iJ;N5TKN3e}4V#J100tmI#dyJUe8I$r
z6trtH!RQ)@>CAzaL<${j#Z`Jf)=CIPbk@2gfY5TqOaXrQA!&(E#T@p{1W_3-UrC+6
z{^BH=!^(nsO@}&z$R;`2Ph<~OF5FwU->b|pt@1f?9s9ATMbw_w^oJX<#36A(n5h4Y
z2chU?R5w98)rBa${c`u<kqttw-q~C#)8Q-nrcy$~<R(Sp5BAsQqeg5M->i8bnXZ)O
zqHoBjOGJG}3`Tu&u#2f}3#P0(NagThHbcg#dVSwnr6x1s()u=7nN)My#M6a`RJwJG
z;io)4>o@Q7s^fFghe=z^S0WK)h?U@kAIbjYrPyY!7q)9R_n9<f3ulZ>)<i3|QVahX
zJcs{$c8rMUrw*6X_#j3-RweHl^t!TNsy$+p`=<p_*A;TL7dc3Tf_W&<35oXuKK&s_
zQP-7?z4VK!2lZFoxZzUed+I>W(Hj28w63rGVRBX~IY{(rVirv~h2`z3>LM2iGkUwC
z_^hPPtZ^Gc8liac$jzS<Lz*@$;jygR-8tfnKTDLNMJn?~5)Yi@iL>@c>_xJK=1UUo
z3?C;=j=e)5^P~e**LBu3ntRGxG$JW(A<0h<XA08V)Y=ivY}Wlr9ITrc*ALH)-F_A|
z8$|y0m;I?e!%^TX1^kX@t_k@{gS5pV$N-sa!xr39Rir2OplpHH=@W*vV%q4qfS0(p
zyz7WZw?Yh&vHHWgNQ=0LqB4IG;v>1nQrE82x9#`o{?^F`Dp85Hv2uOs2`3CTW?o{?
z2B#rlK*mTw7;C5Gi>-jvYm#`+c8bh(=uZVTmt%I}Xd(`TQcJhKnyj_zd8kJB$lUVo
zh|3CYmUyD(tQ#?)oG32R2#Q$bD!T|J*?@FF3T<w%-V#$%?!@pkW}V~DX+|VH4`Dkv
zF)PQiI0_#T{Lc(w<Qt(8OVC3A70K(`FR=-HK;EyXzJk8}8dx$A1;T~HQJ$N4SWA6m
zF9h0gxTG+b_tT#e0ajYUOsr-4FV<)*MnILrJmXIxZRs<Vp{Ow?ilovQt-le-q!I5T
z>}?j+@t5TCYTgZD^#N8)pW3ra$j35SM?-`Ry5ulApoz|omd)e{zE3+_sUupo6n>w!
zm%NS&oRWMA5ThKhbZ*1TJE$Gq)o>#8=fDTp8&f!J{Jt#7Vc(Cb3Hw}G0983E;k;|y
z7%dtnwz-?l&0C3_NKY{au`)tn08vhp^kP|K)wofoXDGn%930|WzQ9<NAIZEl3oDZf
zl@npc`@oUTZoDW=MZPOOg$Ly&{_ZbYcOXzLLirPhOOx4kOGcX@VZp6uY#d9I^+ev4
zl(35Hxr1GLmFSkr&T&qD*GEJwpER?3UYj+ujG1Pzgx24sVI)1mzhS@8OQXYnWombv
zJxsUxNJ{)0!)mW5+TdhC_kmga9Nd);Z?M!ws5vSiB6&~?6DM-UKn+JaLzSFQN-9h%
zO<<H6Wd)U}+DtYU0F_(>Ggt<kBA3I4z7OrF<j&dQW}XabgkH*(goUe?I1Sjy{63ha
zWCOoqOce^HZZ94s7bfRwz<O!HDc%{;HaMstJ}5nY<A=2$6(@+<=a?<RNV9k<i>@w^
zdkj<iJI39XNJ+_cxEMcCUJQDISm78eA@OB^IFUTP7hXa;Z~CChDtC3k8Kc=c!dh)r
zAA0?JVb51CWHBx%8iDMAWF6&~aNUq1D3UTwa$#4GTuAw=NoFYITPieQj4QmPLu0IP
zl1cQE#B{SxOxJ!(YjD>Yk%l(zgU3$_K6~;mQL_+Syjt$D70ZDx!QA=7fv&a_^3?CJ
zqzC-d!q7{S8kTo7s<|5@jYa%mO4PF3)@oCP?b^!Sh#oTG%UkLpIRqLbH^97;dif6I
zOKfO^_fg2GI%<&u^K~QqLG(gB$9~sbf61&}fyObZTai(U@SG1`IEG+El}cmJ7n2W8
z&iB#G95xi4#bYGwg69vdMtPevd%VvvmJ$aFFr?CBY?zhowGl}3qj*^^r$Sfa-m<tu
zxr{O8PUpH4jVl%|Xh%z98x%-E(Nkfgk1gLMW!o(j272D9Y;9PrctRn%HT7i=g{#S+
zQq_{0Q`0QalhA=$BJ|fVMo9PFBD5sT7rU09@S_11>}Z6tntAE-Bav7VnvrCPZW=oK
zsAvk7<L5-;^vLuZCk{7z3}=Si)(g<PM#hQM=E-+75LzpvLl|;nNXpa0^yuH<D5#LT
z_HKnmwynk{S`pO9Td0pms5vA;UdVzx3O6cDvtjk00XNgfLkC}&vD{E^7@K6m2p_6A
zqf}Ur)tILN@)i-SX$->AgnK8Y)K_tPW<J?3lh)(us^31c>`HWrgj^vPZxm-n(Ra~=
z#qbx7I2@K=G!R5sqs9x|qCSftg_&GJSMwrFbLYZh4Re0Gx+<BYlW@1C?)eBto0?W~
zdrV<Xms&ks@=L5D8(wZbB(aQx6VVmK`)w-;<&PB}_-kPRMSKw7#+(LX9j<Amkd70B
z_crK{N*`s^R@wBZ{APFL0@ZK1772OB?25vE6*^?(W~rU;VqRvq_A83?EE~5E`YVjs
zu)BT9gJ}fClq-jJ;{I2Y4_Q!!H{3C<W(9ru?ho<^l&mJOtUnW*WSCb-U*cTUHfb|A
zalh0v9U*JW5pL?2@9UE7dgx(LuUk1<<ByX>6&%TsZ+J~s7^m=(b{tae9#z#c&B#hb
z@xbO8Qa@zD5H+hQZJN<nyN@})$4Y~~8}Lo3@Yg*5Hc;tWHB~2NY=G}OO4V=_c$nQ$
zrACT8KdxHlL~oH^aW2pjgeILGPLO`loG`BIutq!&WG&lJR<^+r0}66(AE#sMaEH<u
zh4u*jQe9MG4ChIy+3xWkG2}c|J495NqKzLe6DpQU-j1`Ej*x7##6Ll}F_1Vb7?vz;
ziZEQQ48Y*P3Q|)sjrxRFrU-Kgm$4p=He|(IV5l8f0y$fVh-4Uh-JvK;4f#W1F=SU_
zcMR!e8m@cXbfmE=8IOTk4x(7k2MC=!DU|99ke*V4y%nmWo?4R%e?ZZ$n_#au^d}R=
z>N|D}5cHq!_{6{7g7=E|>)|cz>QPao4{D79ofj)jAkG2d;qxnnugQQP#-ywzGOl=`
z*u2$n|6JGhb;{2t83TR`PE(J!THev2>#<|kS~34&mPm|n>QOr-cDrgWSu4d*Qx^LL
zH|r$AzF^azGy>X<Ksx=%tFo!AJQWFpL$BTVT@UP!-YkfB)u^p^2;pnwTVlq5r&#O^
z(7l<auFB|6f2c=&qf+ljKuc`<=jvSnv11xZV02ua1YwFk-t;lXZ31t!O+xIN24>;l
zh}H6b&6hqJeSZpw@dza|#zP*lXk~HLiCI26XC<ydrEFuGR%3?GPbR#~E+G*4InVyH
zaZDu89yEL&E6~>LkbqVQCpPw+FLksJp6CPA@d__|G%&NB*oU^dOdANP3BT*%dm$Jn
zO`o3cG@Rcl|9Ep%=_uH0F}3J@cKCW#PWa3E^7d5j-#x`#IrD(lc}KDqVMq={6ZmjU
zVvz}6Lq%(DOn?F6kI;D%x8ld=z*S{QUl;Hp8*bV~d|HH+2BuA1Op9h*OX$~Yx0E(I
z*<E)1x2GWk0o*-2tRyYWtf`U1)&1%(bw8ZdqA8+!7i9A0WVrVIg{!NmyYMl$YH_xh
z7`GYZKzS96hVK7PWF}|+=$}N`v`MAOuAJ3wSRW|<{JZ26Hb~!?NQbCRPVI8JEXun?
z@|!_^t0E!OkBQJ%+k|EB2fV2|9H_RP70jLZ5gv|PhiT{r8L?aX&92ebmEx>6ef1!6
zCWmp25{s5)Epe`8+%Do}06$266`-Xe&|3aeLw=PzbQ1O>tJXd;Yxd|_xjLmS7Q7ht
z=iCl-_w(RK2ZMQS^eB#twkYFEg5I>j=v6ZrZ-4}m5qw1yQN?;LW050de?v+-m#9l6
z<s*f#C?T?{pD7d;i@mQ7RJsr^)I9Zj{g-}w_xrV4ROL=#V}v7_Ns2DD#23)Y4o(tr
zZ<$i9mKN#O5Rv+YFd@6Abjwn$BAp~6x~Xy&Pfc01dM_&?Zs%O2HKv4hQk&>*r%i3V
zX@G{&H&x7AaL$jcg$Dy6^BGz=67tnubKX-jK$CPUz)~WYQotcRTEVK#j*8*3p>6NX
zO;O3r&57H?%I5dlQaG3Vp{xSEIueYUqpI$G8MT}yvK}W#N{pIjFPDvF4lUk$f&wO0
zcT0|26?I!>a>UljQN0dJflKd+YB}@achyas@x(ZH32kI;%G%HR4x6^NON`E~ou@fk
zupJ2#zcpJKotJo4M{uwg6A~OjkteWL@Qyr2Y1*?-hKvo_A*Wdc%|uy{pftIgI+7;K
zJkkiZ3}wNv&pTEhfeYhlod~`?>|9RKx2u#<%aSxu@dijOjHr~>O2sDaoeoCL%!0T-
z_3c}j?$nJW9dbT>O{*niyD#F`*}$luCiamJoX7Yx*&7IaEniDws+ffbLQS?yzpY00
zuRTO6L;{m2;fegNhndta{9_&NjNnd@^Ure~E24q|%W@=@Z>^8{5?7%PQ=Kpb|A;uu
zU-pDI_Z?ICT)j2gky6zOm1?&V(HaEKfYlw-saLqMkU>?kb?-=p2E3t#H|z0%N^_BB
zij}ITg;G}Bd-bqf&ojz`9t>xl>{@+amTqW3QQxU&{qY3uu^q%A6`nhHOyV%CL=y9f
z&2<bKP87Wr)f>a@e4Vwk`<D>WtSR`@(>;<G%EunULi$yqzdXm3qPlNcct@mknC2Q5
zcvig^`1C!8pX3J_fFd*Dsp_G5KO#!WOtB5H+gLsO$R7L=b={Qizx&7``0h_vG;*NQ
zWj(}#2gdPdDnn~H_vqUcnTk)*r*3Ml7{D;ke)?{yLcZeNjo{s8QzF9V<wrf|UV=9(
z+JfLi;Zg4U>)laMjF-2h7w<8fh0dFqHlj9v%eB39Z?XZtU1zXC5_l5QI%ctg*Wq=;
zbZ3cRFPRw(nVL-xo|5M4e<EqY`8c1#qG*w|)#eN&TI{KrzI_o~f0>-?8DIW(JNe^A
z&P6}Y3WWOQR-mO{SuI;V92_eD2d}^drE6;2@qxtsjw0b1kr&6R4U-ofeF<@(?1S}Z
zFCPyR(<N*7f@yZc$@-!<#Ohs(!+mDnYj$3GW}Zu84ap$1*v!!5Z+nMNB2HiLZ!ed`
z6yB@JW>h4;^~?g7%np}KE|<(2k%5~#WMbbOpReSvlQTS-nOU#7S*@8_E`hZRee$1d
zpO$ZYc#mu&>+oOe@Viw19VqLj@YVwmtnt@vhfg3*U$xn7W_E{NK%TR6wr2_t$Yr&b
z<Mofq3&71IwmEj-efu@lQ-kk|iPtszkL|KNVMqG7G~Zr9>V-!#u=>XuaJZvKf^ayl
zZ4<Yl6YKukI=-&YGC_L(1QKxiB=9%j-<+s_-u}md_~4gc<2^MSKA7wOOkcCnX?Yx-
z-|dWZ7Nk(H=huKQAk!~>!|k$ayW#ukeN|22nJ4URL*C@vp9#mqncO^BNI}1sc8))g
z*-yf3gt>eG`PQx3y)I`djZ=moIJgyK3-Q5*rkKIPgXIRPL-Xax{Ri1Jd1i&3r;UMx
zlO#B{^%8!qtz!#aXaP=thqWH>;%9#^i|uEEw9B|ypL(Nu8v3V_CrLZymL8gFc(d*&
z$>tXyfqix36THoK;}dkjy?C?_pr!S~TJ7JJ0TiEq8+65gbs4FcWXvilq%Q4{_%Q8<
za3jfWccAh7_`#xU?1J(X9gtFzdove)57oxKiwPP+Z)2G!%zfS}@ga46y8I54DT#P)
zEw(9=Y$K1o<tOKPnD<k4-*FQ0J!^4bRF_jz_lqnp==)_s+6+%j1r*cJI>cEr96!!D
z@m$-Uz}Ys^EKoc6;CtVg-c8~B8n@tZ2@dPj15Sa5*eblk2I<WQy*+8-1Q@Z<J?XVC
zEC|!9w?YA0=oRI)VEH@TWUX=d9?A02FB;Pq1l>E<VmGlZ+YMQoqed~2qMZ@RN|s8o
zm5r+CwKcSZ#&rrzH?g=^cAd6oN5-<wP;~0G+)`LasI1w6;b(=9jTo|F_v@(VzDERq
zPAK9=QBWlp6Tqp+BR52UlrNgN30+sD#gF4z<Tc_)#*J!Ih1ZC1Sp%3*@R2+Z-&sf-
zM3$H_*){}`j=n{gpmAi?0^!HRR^Av0>!mtTP^q6tD-mbjhOm(?LC)t}k;<^MxFz!G
zj#Ru(b}nCk?@FppH>=Kmkci#5eQJ^*gwa8~SLSuVUj-Shg|bA`=-fKvk>}LRFtwD~
z8uXZXf1~#d%4MHP_r3#o={u!re?;IZw#acT*4Bh7`w|KCKdZMDk+6BA293Vi!T5>H
z#U~y-3U^g|UpE(~ue`liME54`h-|!B;rD_S;R9bd?3D5%g1yUX1C%Lg8GZNF=`f@U
zo@hg)U-?WWWfI3VO!~WNobsd1mWK{Jnx2F*i&DTXG-`}EBBv&w;BWCar5o<uED8hf
zZ%B6~Of`-;8i|DAn5JDXfQ&6WuRk}g$v>1QABgjfM)vnB6?dA)Gv=(HbhbIxBN=8-
ze>?xAIf)SzZx`Mvk~q;<C(SBxxL5fVpRmNO6O^_o)t1%(uFOkG@;bdnhMe!+dwxA~
zpC8;g^`Aiy;V;+25r`#yUlw8`>74d+l<DbPeiKIc=33=tkmV^7`Z|a8xE=Er-u@KW
zI{(JSGy67k=5`6WM&kTe-5mK0pq5amOs(JekFs6h`;bvfRT{+VE7PtOQ;jq%)Z|d!
zky$(BurnMp?0NC&-X3pH>Ca`3He5^S2`}h!wq3|q%Ae|o|5*1GcpYpmZKF01M7@f=
z=FT50{Y~Q(`eUl;BAz~Ty(A9{n=+)MWaZI1fnFC;a{{A8aMdp6P{?pJTD}AvKPC~@
zK7HkkYJz+94!@Q||5cm@|Af<(nzPxxn9~NE?Fv(;Wl^0m>co+<u>)9>JPF*}<Vll#
z=$)jUFPf$JWflptW(96i263Jp^0RIu^bK!BEg!j;8|bt=B1`M7?s)8i6gI*<1Ijxl
z@P9;Hg)`~RB7_sn4#p>>4ef7_{kqY<TiCaPE7*j2xx<{~cqXbd1Ai9s6~keDGcsdR
z3leul+_!Jf>VUy$p3vfiNP*q(O{z!B<@_Xcx6C<d*GStB)2zGjtNk>7BDSaLy<jJW
z5u>>o*myklNRvOdi1FUlZ)upDzeE1&XQPPc(mQH>%>GlDy+N!~KR(2xt6vcie7=Zd
z^C{6e$=yVHJ4V)icj3fKyA<9>sNYZVnav!@KTr*G<mAySSVavtaI)vsNJT0AeuQyP
z;9vs=(D0*2^(MdeI;#kVsV@o{zX<(jx<}J+N56xde{lRlQRnaUj)9Vmd?h#D2O;fZ
zn2p{(KV)y%;|8m&43OJth7?s$p;fJciqcDz^R?NXwNF*I`HV|qRF0+n&#@<}QY-(N
z*3E#%`kID8*X8y!8K=V!+jP`3Rri=fn^tQqZuLOz<ehfr_h!FdVOhZl&%mM&np#Vm
zX|>wP(20%c&cWsssepbz=Jyyp7TZC+*l@$eE3k$4st+)Wt&WQIYR9#%fAUv1<%nOR
z^$!&7jIi5&c`YZJ>Z)2Nw?(21SC0xTD>vB+q^2(B!jL_qI8RELjecvpWAnxZ8oin4
zxigPNVWpGW_M5!jTGPc>S>Hn|!&tuU8pHGc`i6k038dTIUKg2ga@)0Pv-6s5yX@&g
zLr`waNY6caH!{~=tW-DhLO*@hR>8K1$~7<2>g*YD)Xsk5u;#_ftFYO1cwSr>aNq*d
zlGKi*j|w$z&HfW=oUeAX^UM%9kkKC3a!>QZa>{g%6ynhB?#zl+ILzPf0<-%Uj19V+
z8I4Q%_>>;!cK=s@|8&2&BcAMtdHQ^h@9NVCFKtpBHL#<#CAFBjmRcRv3u^lUuD4*4
z{BFQw0(s@uhdl^gkjvY!jZqitg$Lne2-Pm7ONJqvIw_-5&~q#HFtsUQo&IFh7ia>$
z!JYuhOg6m?wWeNXf<6^0CVsITej4JtC3`IFsn)BN-7xPwro_d`YO^V0C&_YD0mX^c
zq&#N@jJZmWX{BK&UtQCaV_2AD0H2*_!gZ!RCdymcEoaVw<r61W4U<CU!uyzOJdw2-
zy=mnA*EPv2%IS@s<qfUKaK1i2MT)_ReFplvsNZXc1u~T}OBYKsUZ{V}|Ji}{;lkNy
z(;TPS`lb2x0Nq5S;zH+PAk6=_aTX}q|A~QM<r?eBQ8{nJV97fUNP8KC6$fkn28uI}
zV~}<OEO>J^k9qX+8K94QiU)p8lLk!g3>CT6m%(s#AoK%-Ko-vN?Z<w1dRyO?gOBT;
zqfkCC1W5!%b^kff^|W&K{NqFaaSXiG!|dBb?-xR%>XWkj;#4d(jVO#*_Tg1Ic!H9c
zN=5`ub9-f$Vwv5gCG5r2WyyXixw?ITz3TOImyU4rG@Ewl-xA{OUU+}nBjbca;1#_6
zrIe)P`l@k!p}s&eKloIy;hy-6>>KbZOt2*T!ObA;eiKdX9%;q%BXWnN{q!VzE8wCb
zim2(Wao^YrL7T{=Mx)=aHh*hf<-|Mps!>de6y;3iq?Wbe<_+Bv)w=c0;X#WualLmv
zC2bi!QMs_San5&T?C0rC!s`O5$7%XP^vY%PJ{Dq-|7KqwJW0#g=_}M{(As&fwgm5(
z)<=M0Vm^<vNb<uogszbA$@d$pa+xl6;Y*fd>A-7u?|>x{A~Rh6Fm#+@$Vc-I`B>gB
z26(2}+vdDSJ4vdr-NTR!L>CWNj!}J=o>k7f+-|(hakv+Iikjf8J&`#_Mn>YN$82ng
zp1}H`;87No0*;WTvA)Dx&wgHqPoAull1U9NezOos$a$EIUA1_;lp%?3(OHlDD4s_r
ztzkQ`C;`7n)5tHA@J&2p++DoEVpLQXZxsRjz=z~b5t4<=T{%Xj?$Xd+5Z!Ol+a#2k
zbHZmg&!wBHn{UO9;@AkZZ{EU{Nr&o?lz|787lw&H<@2*(GkQx<3V625(78$ahW4=p
zzQ5!@!RIg8q^){vcDuK9%kOkWt?`6`*1J`WzJZ>-$A#ljo>QLKz`I^b@TTCK&j2s)
z<ubq5;a&=WH*y9%elsyEA6yh=!`@&pw)a`klDHk|XK!32y<D0hk6;9^mvFU+IgzDE
z>@=G3Zz>gos+i{U6daCp4#^lT>mqopdwsC7sGdep#GtMyI3?*)Hz;8zUl>II22g3-
zs^<m{D)eN&_#Q>TJ@*QdPSh$GYkpYIGjQ}zFQo7k(1=8|(5NZRU*u6RL*zQ}f#?%C
zh%rM*eky3yxrdabQm4=IC8NRLkCRf4w0V^@sqwLdf_I|HzS{<hDR2Mi^!C<{F*0A+
zRK)#ccisff??Nvr;Jn!>;OPf4DskIjIuWlq)aGn(B5FvBLM2L@Ik>i&cta%j;`Yhi
z6k^mv$XY;Ufv`jI4H@0Q4~UFBeWI(#rG|T6#<Hrx)T7Jb>oI@vJZcLXb@qW16LUBy
zLL<Pz!r+XgfV(>EzaVpD;oQ3GrYY4&R~VCV&su+Uk;K^+o$H45wBIA<oFLvGXY2_9
zxP`gm4G>Gi1v~0U2@w^B+CX_qO%>U?e_g4X*U+-osAvr17pQFJ@E|^aSA`=GIpg<^
zM`CygxuB<~255$7Ow)h=<nQ{`vQ=OkX6A%gJ<SV<;v)mS^yfOEYmLXxUht~%wj=6;
zgFvOv(!!Ws@ENu4WQfzDUY^>z{>`q|w!S;bQ4L5{eb6Wo?s<`{w~N|M?0pe!4LUqY
zUeKk{iU+}uIBph{wH=ig`cDnjK&b`nlCByhtD@dmpMl2t$X>V4jRh*PB{;()6gDJs
z==914)tqb^mJwiUxbM8eHz*SEIr0mwbNQLMk4((i?T`4@E7k1vc|sBZVF`8|_DH>)
z{D6tSIF=fTBzMq^!`prbKa^uvDPU}mN~zgBTa6C|tb#OfOf+B}#N!v|@jlI)?QABl
z-hMZqhb5{$-y+BfqnOL+<&F`a5D6`AwQk9U!tf_qcsIGtMzDa+5wFfN7&eALU^2SG
zdln~Amo5`v#q9N)z;V<?fKI@%nRW9B?^6AX<IiDR(kt8FnGH}>4XW3$xfOKwj#VP^
zZRzJS)&g8Z^ma+SZIdT+fH5u6Qv>m1;!|n0FjKBlWyY(=!y5B1Og4l}uxX>l0M=}3
zB<jvX1_bp|dmq-*T;wH;3>yZ?Q;I|PAG6_y{LpneE_qe|Vz2Dh8n6kIMXHG6_mpON
z=uTPMg{^u`f`^TG;y4oH^wIMibmC^Zd2f<aF-CvBaAXRPAMkoiTq*bK<~_vnI=JO|
zipj6fT^r7OR(K8Nq2juOHP+*_a2Ha^U}CB{#1?glr~?2zw<UCjD^-QdQj7Q+{9%*k
z|01w6@0`6Ed9Nng*4v-pCWBvs!*r&viZMov?X#tvk<w?l<%@W`%W`#~CGf~2SpA3C
zE>vcr{A8Ta9G}V8C%Bo|O}8KaTj;An<{2j3cnhBBrpEk_FRvBs@xOb-Vr?70wOb>N
zIomq(#HXL31k0Uk@v79I%%hjF@BKgND}}yuf9m%oEDZ%`{yWPhZ<|k~0hiAz{z;*g
zmsqDF2)Cxc4h-ZhG5^e3_@nVzVtt)C^4Dgm*DQuJJw@VC^g{fl>|lt;XUVb`c9jv#
zj2E5HN=5VEk6wSRb$Z{b&I`{m?pFF(!mNK%pUg;ty}k25)trT=MzfaRP#}L!##?<b
zp;Vpvfwqq*m+^|%=Y1qL9(PR(^8{qyT@<uK?-(V*=4%V5L%BFz)Jz?q+EwAHAW>gL
zvxpSP)#WYuz_PHU@D+K`qn^A*B!}b<YaZRDv|@s-@cp%$J27t#MQAg1<VZS`j;^dv
zY_6lR5v(f+4Tpjg_qheH6gkl*ENpYPlHC<aMX`1P#@P2R+o{bLC-<`Ju(df96_3`6
zVCK`N%?bOZy)z|WvJP*ggop$k6!oP#`4IM{2%owz{O!H<+%w9~?W4e<^-*V19VbD_
zv3F7mUA6Ii)`2j$n%#|yMSLyazWnO%f~<l2z)*e>Mz7*}V@7!crBE5w=Y8WCI>Z;_
zQM2nx=Z)&D!4wPFR?C^V@CL0~zsoP78A4tYV~&NWzfWW;B>!{hb$ADS8{$cht5W?X
z8+Syib>h9vMHMBUDtnufomYie?s}>X3%So-PQDVB0i7t@6q8?rKqK`$)P^Pdt=6a5
z!I?Epr2(D&oh0HJMgV%Lnu?q^MM*g}dvimO#rROERQ->$YbqhijI%xh`PVCB{t9dN
zX}BwAtl|qrysmw7YGt7f<@tR|%LRmm(%R0?4N@XLDYgWmwy;W`tRZC01$XeRpTyt<
z<!U7T56-xuGJj_nz!L1sf4Rau#E9NB#SS1DzM*iC`K^=izaP9dW?kQ~etm~aCJ8qb
zP5Ix8UgLY`P=GZhJ_2bWl{(Z=jVT(Vvha%bU)eM)@S0d<GN?chgXWPvvt*@<MX3qf
zu%vz8uPnlF6d~5_PEK0`JAJJ*4Hy}V-KTFx1Zy!uJXqBhiwH@s@BajN=IPgbp%S-q
zRkCO2z{)1Q(+1`Q&_~(~MAXC2`7<k^?2EGjA?C>aI6K4&<=j5QxG^6N)plxVedg%g
z59>frRI=Ug!xPSo%Bhc!RKSl|3F_po9$lco{erx+tWN}qvWJ<D?jXD*ov&PW1LYQd
z!RHlyGt7#&s#FwPGGO0qBg&=_c6cTH;TjFSP?dA@1SQVMAuzKdGo*r}lcjvkS00I^
zzLx2i%|!BUeQWGogN}ToiuURt110bo#;P=BujWyNc4018h9%!br73H)BfZmmBIttI
z+hac2!O^hczlL0up35hHkMhzvV98%1Ca>Y#M>3QlJ20!e{6M?uVuHuK;NWRNGEb6F
zzNbjJ5O|GQoQimZZ~b2p*NfKPV;IjvMv2qfeK#+$Q{6blfQA9;XMns~=jFUW(Ac(+
z)O9_E`jX^4f#$G}?k$=>FDehgp*B@m=l*x5+PA@UOA(<m9q6t5dGA7XE%S}f1^)1N
zPxdmh5{+ovl6AiK`{;fPrScgptV|`WC|OV8IAXpmP59Ut8vu(Uh5;|+DnAs=lt~<4
zosuWnX_a?bu^3_m<8*H9bW#md3h~c{o!-6%FA1=`LCmb)bbWugsdAuO*k$2DQA0>M
z4me0J$m7t*%Ee7<J7^)p9S^rKMd^WG&uj>o1n@_Ir2s}FT=Yc&{Z8ts9^cyt2-W9;
z?#J63wm%3b#!IFrX7)?hsQ-Mf!5G%Hz>JL+0{JFtJ1?g)UvE2!?9g^@;)<b*Wp4p#
z(*Rq=MV+*wbws@fqRl^%EJfM36SJBZ0SH;eey4X-G|MX5FT}hQ-Ud=Z*HjQm^+ChA
zqyxu7{!xVfS0jc*I5mr*^dJy+tzUx2+2wVKW{;E#%nm%i2w9hmzB}<|^uc11Xz3{K
z8@{@j|1H3FpCkJ@Ue_Oc1Q;IYG_vD88MwzoH$qcfX?~oC#ajU|rcr1}(`~?peq$xd
z>JSZ{Rqz)+9>qZo?Mln*vi-!F12Ll;+>Vzs$bu6<DH1dM-^WogKeUv;<efar{=Bsn
zZ_b&&(6z=6f67MuF$Qc7BwvhsV@c}FHn+-S6f6OJ)l(?_p<9YA>021rqA2?*Yj3k1
z_iD5A^H`C03!p=vnz<cE8^*;UB2Ao#?;=6?FGEE?zE@S`TA0Z`v1~nYG`TgTyBI^0
zjKlpO<kpS4#pj<Kr&pp>qXqJ?1d%?*y|-kQ47ebD6@m@FoBS%~-eci%mnFZZ{X|;p
z2D?eITF6*gzxp*nCaLkl_IAhc<SfQXdOtVkncMQydP$Ktw!_x`=GnZw-nw$4r0!;N
zmGqQ#)sJx7N)~s4N-mH0tXi%gMV_{b300Z34$v9MuPiznNG$m?w}l!M4%px_xUsdh
z_rrt<Js0iqZ|HGM`*p$J?g-nnyJNSkB%EI(dHXPwQ2CS^d2~d#J_VXk(Afp=tH_?o
z_y=<ne195&r8QiCXo98nbA~Nad^Qpb-1ti(Nef&92C$}+(q-Jsi0(gX`k6=seC6}M
z{iqf0ir_0>58yVxh_|lL$yJNSAs;DVcG8m9tnf9#VRkJ<UZ9SgCvgZFa9jF@Kl&Oi
zB7(!668J)2^T-b9tBI<`KOB&_n6H-)#1NEJU#-+yvbRn%uSh^kIi2?WVO~bO%B>$z
zH(_IcHB)}YnDFKcXt1mjjFGj7Ef$?*lC$eumaM8aiL<0;SFNsYr=DTNgbC|UvH5PE
z#qGwtGJ=EM)IhlP&UHS@QHLuuxm>2tDJOuu;gaHbQoR=&jvZ2?sHf-vfT`o=5n7sr
zXlKjmuFiyUeEkVn|1RFuxG=MWwzbPRczI-ZH@UGL2ZO`G`k`i)`G<WVNDY2_MPfDn
zzJ#^>F2)LN@2z%+g}{ehTP#Vt{0NzC8*q>eI57`yj0?#;41u1Z<GkQ*zqDJ8I3CK5
zOK6h{Jd3MjQirff<)XAC(V$__+t28vaGF5XHP!E2yEfbz3Dg9!B~-LeLLTas1lTdS
z#p=RNRf(ihI$!jnwtsEBr)!%CA}-xznGBkfaoyNSb5e5%3lty;q5)YwUksrOy$ksy
z1V*k$a1cH)+|hqr^`Pu%RyLpJ7J8p)ExTFN`iqtCDZit>69d<CP|d9RzAMrO%id}4
znEk)u(RWo#f5=Y`k`+7O;pQkx6q8Qjpn^(1i{4<$lAd%;-5^l7jB@u1UaGwa-TU9d
zF9?9U-jSIw<qYASUlC;`M(Dff?M*KHB~D&&T8{FLr0&zP9!7GM&8$e&m`}06At@XH
zRTyoXAx-;SUGXJ~%suTbZ4lxOu;Yl*?;+gN3_NHx%FAt8b>6<~%k?y;A_zGZ5bJQX
zGZ^=Qd3_Uo<veRP+4MA4hg0Wny|WSTOV-W4>I&IS0?vS%$0$>F*?edo?W^D#A~OI%
zQL<@*vJzYaFNLg`Ue~hdq^;AI>#W~-OMSF+{@nXC+-DT}q*OKTXXx!^?04YIy_1UW
zdszn+ma<lS2E%0iWE1>D<et^Lbs}_fAVYAA>&!T7PvZ<i{{=Z-ct`tlSb&Y1dY^f4
zLocs+XMWueYVP^RU$AzaSDXMSwu`L8?}C;X>pA<|?sJR8>1_MkYZsZx_AuOnip((&
zD6vcIvrFW*`wJnDPCgL@6uLb`w=Jx&B?9uV3-W&e^6fn9HaaEa&7dpy?wzOqa>xe*
z4)>CO2V&k6`E$+*S@qYg&&?C3^Sk9SAiv+jGt=5N-zSUh%5L^A;+(DHdt>GmSe*Uk
z{M4T1qs{R^&FY^2k9D7!x4?V-HSvFErsPN;OqSa#M7{7tf6?b(bc>z{YGc2)_1uQ`
z{2TCZP73jV{^LM)(0zM~k9PAtb%WbK;s3%~bOEnD#$|A};4sjb!!t23Vb@{5cBSbN
z`uRs$_Kg!PusLgJ^+lKQY*%s|!Y{kSSGB<7UH>WaXS9Jr2;u&*<*7bL1&vK2Cj_J&
zRTu8bl9IUg<eA|vzH`mp%&D$KwiKiC+Qnj5<aRU&+wK=;or6m^h3|LNjy@AZw)KP{
zKci(dPU>H{*!PD0hRPZjGM6!{1=c>w8kj#lFJmn4?>$E<2IkpXoCfD9yod0~Uax27
zzt`*hn?J8Lh90s%{E1f1&|#JlQT*x>^*R~|c_hf~^h@dDRnMqpV4vs${f%6PXRi?c
z7|z~dfaX1d!rrKehx@i$=3e;V;+GU6V+_vfLTF3Sm!(YlE@1k_Bws?w$W}V;GfP=W
zT&s0;i)bqIyVNfsnp`IgWjNjNM#yC{RCmT?fdYqNujO9+yz6?138{dj_Fa+UdI#@F
z87AY*QzpUl&|1vRCXwAY&2?d-G%&94Dam619GLpbS2^di?*s9JP?Z#Fy3XL|VWG;I
zcIA;f?3M!)@#E00m8LYMX|u3E(f*hi6(g0f>SlHH`g*c)vql-}qfnejizfTqt#5K}
zFcb=PJhI5YVVUzoqHc3un=vIKPq$HT1J1FZtzr31L*7;GbUAlK&$*#GW8KgM%qdy|
zt$~&|K@W&}40|Q!%Gc2WawcFN?=vZ0j$PlncL^ef42K9vT8b`pf~x5`Yse>EQw6gR
zq^s|#LaLoas*yMo_Sj8yQIf6?N>ti?W!*v02O{D6X$1nELtAnBt;_}+p?u~8j#(L8
zpL90EeUlzSUWy35Sj$S+^sO$?pF1s%^-#(h%)g&A9q+Z@eDGKR=xz_Vt~<6V>t7Ms
z0M;3nr8?R$g%7-*fwvX*VnU`jB%oN}8p2ax0Y34>d4Rj-?Y5N&T@CO>8QqVxKd1>f
z$L<Tx#dyE7TFv7{guIp0c`Nv;^6g=yLX9$3@KW_t!h_pLbRtno)li_9@-{#ESY^b-
zx%s6ZqZkF)M!EDGW8mU2G{!zhOM>z7@ucv_(Voaa)JWyDl_{S;if;Dd`n8UA|6@Y)
zj?`;m`l$eafAr|6YHpuZ3Pa(-MRSi;1G0ABQs-X0@;s(bxMM({Sk!!HxiGWLucP8N
ze8LKcCJ=RNoIQ;RSe1{0^m=iJ@KcfB@a^NwX;E1J(hC4P&|RUO(GyGLxysK}&@~76
zJJCC!3K)RZaG-YG#e5kE{a8qM){6;*ce?zrEe6^-<^gk8jyIv|gm(X>X6}PYrDcjT
z8~0vf&DJ^Y#1&#yy0JP7RO%$;qfJV*Ib;tc<~P|bv}U!3u3cO9=X$d`3z*_ecB0z+
zzqeZ3Z)B-tEp~p^Ykc&42(yxPP#k|J`Hj8fz@H@Bsk{xXmu0bmugTab!$(K|^^=QC
z&G`a>W(!VrDwVWP?Hb0EUr#K0mNXbYDGJspXKRmSi23&mW*vuSa<~%vyv>1vwdJX}
z%_6<&Z<;3SvWjmg3tL}JU9PpsGOmYPov71J{4!LF#PVg@#*jW1jIUZ{LDtJt9>zV`
z{!z`SRWqjw-A&f#gz;^){pSN8IZbevuL>?{9J+{G@Oo`|*q^!b!te=cB1U_Y+V|=Y
zN=D~U1X~gB4r$V@Zus=aK<K^?p^U~){Xca}LE#5DBO8t^E{K$tX+NwX$dQ{KNsP$2
zZJ>P*s%+BNOjQFBEnC00J1ya-Vf$FT2=!CwP+D4Do6RMiEAuCnQ9XME&Gc{!^h-Se
z7XhsMzHtk)7V!b*#$m3Vcu?o=LAjieYh_G}&_sJAr$g~Qm}%<+B@5SeUor1|1A%}W
zvvIuV_fqQUh4X8O;!@`Kbf3rmqCDE;7@Z-n@n%F$6Fr}jT>+gP7BNI!e^f$tQHprF
zbMq*dpkL|F5cnlxZk=>4Au`PZ`A5ztes$uAO@0ADf*Yh+lR0LFkK;v#I608;+_&zc
zygSsr?XiP}J2kHfz#k%1j+yoNq)Yj)bI$;~);CilZIiIWN++76?a8+lTGHi`6O5@P
z+XY(t^7pzg{Z0nYRzTl?RBwdKchNWHZ!=2SW#2Mj(wfoT!mKFbUIT&p&zNk6%c1R9
z@V%v5;HjJ1`zsbReR<>G{fGKN8SP%O(LkaFUE(@=xIaNzwcAP>>N-0|rF`^<XG(Ol
zN2yBq<{k#ZP{aK=mtPT@f)-Y1CrnF}+W@zPE9a#FdGk6>dwhdBqot2&50i5}SZ+Pq
zy{kb+CT}Qd`1^x?e-b}SE!Sy|t!nqKvF3>MzVl$l_#8`l650-7$9WQd57K1r7V14O
z+IGRK&0i5f=^rJIs#(8(4EVVX&xZ?l9kM|)Exan|FHeF~zX45x^H^uO2Z#WFd|PLp
z9;#WN$s8RLftWl#SeY~ShkaRHr}1n@TqIBbskE<<lGSeA6O{7&Obf)BabiU**5p5z
ztjNZ`bBMFlLXOpu(V^j<sdd&YDI4)R*ar*odvTo;N~v_eZM;)>+urop>$K3`IbqF5
zkgk$@Bx$iKk}$aWTy$YiQCYk-XwJtyUJZlx7*em3(k<>I?5KV*eZUCk5{XSmUPid>
zOPq=LXtsY#YnpJKlVxUPc36_L5M<seddCgZqPS&wOFWEE{6Wp|Wot)Ml5%pK^6GXE
z0N<Q>o~mePF%4L|R!mz^H_7l*2pFNMb3)Q#@S~9m+|eehDWo;KR4}n4M0vQ24-y9x
z2XuF|kVxu8c`+7Je=U<`xL4FI9_vTGvt?{@s7Y4tYOhHirx*%U+GsurfqUr~Wd0y~
zxzOgU-l4nLD&TGIF2BXOR^0^C;vkPdec(>uXvZIMmfTufCY}4bb&)4uhQB9MCvax;
zM~EF8$|Kr3V+V5iy-)4pIn4nN+PfMnA?FNk|G&s+S&!5?iBmE5^t})w)w@^aU^Gf%
z{9iJ9|I94K_?L_}V(L=-?<S)WcMcEK|G&s6-D_CT$-8gBz3u1Y_3Hk)sm6QQE4Wk=
zQqh_*I0G!u^ut$?pA{d6zsIlhQR<yuqs%VEtyqUld5a2=y!PCm#k*KX=zAudr~64u
zkUXQHw0PG~x3*9MeqE~V4LBS*TjH{;59d~cScZcNw!VGizc^=Oi1hw21Vh9b5eZs-
zvPcRb{&N}VvI%`*{56`y<j+$cBncre%{O-)Hs`OOh>y`&&OL}OrWfqs`jLrV+eE0P
zHc2^BFEAGNlR;r}awAX5Z|+y8WUWDh-+v8ee9QBch4K4P?+Do^B?heV+#Fw&@2T%K
zikn5yW2rpd`m2ymReXwm8&}=vB}&NRXF;a-lOYy#>XE0g7xa%9rSp`$7r4aauUMk~
zao*x}YVDQP=Yd-91pCqGRnph+etVl7fJb~oacKq`yw1ZI0qvo4Uf)#810SONWH>hn
z=rP%i1&l3GP-KmV!yp-Mmcg)#mk_P{I|l5XUs<?`OyE=K{fCtu0OWh_O;D{4?9&0S
zJ&1+BcE2DISvQJ!Ba@R{^udz6d!UlKv70U)4W2=^9LEhAqC=+=qcKM*P@o8uW^F;G
z`dS75>5FPVe~(@1g%mXA-9|-ScGp|Flsjn?BEV=*)HzQYTYp_Z&okF)+iEfKFW8?w
z{9kj=kR?<i@;_}HMSmoWQ8BB-KITQv?FAm@sQr3`^6>_^3{W>w@@`-qmjWf?m$n0-
zN*0m~YO18qOnV<j0o4)Oc2e~y0OI~{GyQnX*I#HW6Ns?HheO3fe>xuw^uA{aja){Q
z>jeVC(-}ffpQEoZx`h+RhX_x6cm@)gdcvqXC5Un&cvRdRRZyThhEE{onQAJd{-`&w
z4b(ZW6jv{hX;z4<>lCZz|3o>vD4LyJ_Ncv=A+~<6Jl|z&a-N4{cdpE~-a*r9a*9T{
znIPL}zw*ZAEb&rM+};v6Aigys8DI^Xu#dd1P)PczIEOP$a3uODkOD84O`4EH%C+-e
zT5x>rVG`N8wk0!G{)REf>lyu$NX&i!0>f3SyzF**S4=`cK=e7-iK~0(87NJmgtDSt
z%<SA?LWB*dPS%*zz}iAPS=$e3rcqlqgB_=a!`yNvre`h9^9dLUgug2jJ13Alau`UJ
zvwa3?z?Ur~eX_mND*5xoz8Tii!qgjF1Q+Iff?V$5(|%h9DdU{(WKIZcZ%q1R&eCQf
zJmHDJw~jGqkhV5EE=GXW^p3w(mCZf#(0=oKW1~PO19Lb`!;g^d=_~x3YK;BJR~r6U
zn}x8%f|~8oB<B?qJQ~Rye!Nl`qb?Goa*4*@QV<Z(KL1pr@j5#Rf(YUr{jdJf{8zm5
zE&(wP=d5Tj244we$>=B(N|UitrPZQExS!1g?Z0j`nm+^Jkld5^8>b}5TXz`B($(bX
z{;H2PAP@*TKev;M*a>SQ$x?X3I5kq&EZlPBIlRAj1HZn$x&=;oRFG({GHLb&`S|dy
zo1H(@|9Akuy}hx>dDQxflz?sC=61n3!otFVn-Ff04kdLA@t%Vo5i2Rr*t5Ml0FP<j
z=9brH4<-CXky33H;Yl_*x6)W`8!hnhd&-BAhy0BcDL7`XBbvoEZ~CQVDB5TrU?rcS
zZLro@kTWBtLvm+kKY7onS6--*r$hL)Tchuv=}_8oU%;1_mp6&g0p8`nF$IbMvD_~`
zi~D&`GVcXi#8W&ySt*9V0O2&7#e%LTremV#6HuYe5%@wNpg=+Hx#8m5CH0ubqzaJZ
zLt~qw{$Zz**a}>CBS%WQ`eKjrg~a0EgXUT&cJ)~#VkX<^^!UXw__ERD>HH%1q1T@W
zF9G{S81Nx7mi(ZZNi`)<bB&So{l|L}%dNvxYk^V_%gG<v#MTX<<-O`^*t@Ua_^sfQ
z`SdCGsd<j$i@-_!<|MeRNwp6u)8Wm}56E>%`7!VYZL?7BeS`(J68uSdM?PcNM<sOj
zUjMHrRiK`=c|7BOZNc)gntuKztHC6IaHh}h6}W8F`sC9pQp>jtn6RJmO;`j6I8gN8
z%j~?%+mY4gKHS^UPVt?|y#HbA?oZ!7@y%Rg{Gr-UePusmqjl6D`_c6KjlyVE@GkFZ
zh@*41z=0BI$Y+I|<;O?e;MGjs^NW8f=RC$E>Cti(@Y<yo0pwrpRbX(?9(%w~);265
zsTlF40?KCfUX`&ImRx1oJC%UubP3xmMf&VGpR{{^k1?H4)ZYJq7tvz5$TBkox03<M
z(ERW{rdualG|M;c2{zinm|}SgA1PoN3t^c6kjN+)Kj;aR?75%Ui=X(+0iO7V8ED)4
znwRDG>DgDK;z6uk*>LV|vSC3O6WA=`mhY1^>0j4&6SN~kSEy1h$ilYD7Ra8tP_PzR
zsKzpc$Mc*7LAcb1=H>tlB6V|3y2}Q?1d-p<KE7>%o7oF%%s_LU!~ze2sUA#^w{!tv
z{n1l`ZJN()-Bx&Q2Os>$CO@6`O^;i+{PLeUfV4>&VL^7cWDYbAlLZ^&;1c%2d*<;#
zy;ZsZnVs1#)1-xOQoj}IkJmmn-Ub2ALz!n8Cd*-+rEfgPcMCjtbHHP1pGVeB(VaL2
zLQIkSf{adJtGu;Muc%PpL;wGHA^)We6a~=#+a*QdfHW#A(Uzy&fEoe<QvH8!LYguE
zO`Fi_o=uoBR-`JN3p$(&8m<f4-$r9k2x5CV88{aHI7A{>`R!cMepWq|QuaR_qzf)Y
z$9>nz$9z+*Ucmk?WuTM6nj6uW8=!n_?gH<F5xCszfiu-4XgJ1-6x0{xe%)l25zuVn
z`D5lys5NMXryrDXWz=@=r^R<(c<7rS@b+_~zsqpxW6G`X+6cUM>=U>tvUULuu=wSB
zwRZih?c;SCc-;TdU;j$72CM;!)~$HG<w>m+60h0)UrD_JVgJ+hKZ}YWywr9GX;ei+
zK%lJs&*d%j{%=~|{Dc%DI;05VXiS$cC?hevXmI<IMB|31XTodUR<fdVbD(eawzgK?
zHfR{1=feuJvIdP=@sMD{{!g<j^8WgGet0}r805dt53D}kcPp!fuy_Uzf>lpnVnH1K
zV9>|mQibxry4n3-?hbe6nEL|Wo&>HNcr2hF-ejbg-&zVX3X~uFKXEUB>Yj`qRbM?b
z%G1^^cV6-hH128-pbZFm4a=tLtS)=}gq>}VYkbcyNDu9HJUUyP{73+(J}}jwdLN6&
z#J56`AP~^+glX~P`SuU6*E_PSk_AzcznA2cLlRU#eHY!+iEB|~_!W2U(dVqlhJr;|
zhWNqvJz=gIJhoGB)DH^0Lg0UMQ?yvPqfktr<IpLj5CXElbt9=3{Q8_bwlkko9&;V9
zr|%{tMUa2b+Y%rpTq=V*UUjN*^<0Fw*)&PKra@Y5#Z-73um*aa#;$!2(z09yp9bak
zgiM3ZoGR6|ye^1*wE`BH_rqA`g)0L?1hrf}yF`U2$wYwIn)x3u$#YXX_~2_c+>TMu
ziQp^6<JCbKDB~l5cz>X6T?izt_vN1w10!o6R5#<q?~9dkm~Yyd87@;g4K0Gqmydhj
z6`UCK^hcSVDv0g6uMd#TpR|Lbu4i6p1GYYr&bY5!wmvBPD4Iq74`$sv8qVl#7uKRg
zCrYA*B#0Kh8!bq5B03Sh_g+RX(R&a?5E7l}y^cNzM(>P1`e53Z_dVb5J>U8N{PC@I
zueJAj_FnheciZ=M?ezpsi)J4x{QWiQKsN%r1pzMAk$X=k#cH1K2%TtI=!8rcVf);`
zj@+JZFy=Am9-2JJ6qb>DJC%(jAnr7JF=@lF=NuvYxHrSG*6q`tg7>2qAjOAR46LC7
zDVg)@`mmkpKWQQ<4$oNwPF}k8$+Sjsi}PLyhYYP0_FL@@mKlPrJ;H-N>!XjBXo?m*
zzNYm5nyNWy-FAUJuN-c!w0k}E`;tZ9G_VC}a{os~es4jB+Ps|G)8_&i)O4)=ac>@p
zCW7jh0k|+9Wvgd1u41OR9+)3N{ZpfZzu_7kR?UVF({$J|I{>eDzL^dMIINmm?dw1M
zy>#39`&x#wgt)h{|LXbG7<%yZ18r90U!yYICV;2yr5zeG#+*luF!+|^wJ_H8k#WiO
ze(vUV(Z?m0GsAoKy(co53FVPh6!14LxH27>!);Rhta4NNI&>)Dk!q!>dQRwnA9zY@
zHnt?up8Q&*aIL8)`Dx+p2ZHk39-1S!&1ac@wZVF}bTx?8zQ0A8K<=W2L$1b_DXFJ)
ze@-TpvG-^j|42#tlOm26M?vsyF8(+zy(!{=hGYGQjQ={l;QEve?iklc8zBzAnoMY#
zor+y<vJC7!y2ku}YV+}6cijEA2p?9bulhW{)u_Ezn9xw>#WayHS7xLA8Xh=4^s}K~
z5DD<nHcM5H-@>c4hnrl)Q=u9iNM`t*X4ScljW2|SD8-DRqIS5Y{kGQ5O11W3yb${I
z%%Q6Q{w3%v=Xyf^r%>VH^*i8|cnrwC@zU>d%z9$h2jVwAa@`uK&-f0$YXJ4gj64^w
zKAVR?-<8M`6maL1T*&R6WRkn*UNh<p6>VLOs92$mbABTWE=`AjPaHiYcMdY>4^vm2
zY!tNMnN7^z^WRCHVh+Z@Le@~J(Mm}>1&I;ef~1jaSg?vgXjaY{#P4aPVCAvYrEQ?J
zJSZh?<BQ$NiNzrh>P&h6P(Dr<FpWwE&!P*5wi_>HY6}{p^mFHLm;!`k3RxL2Sti$_
z7N>}|WsH!SKFVVJ>;%Sm{Tt)7ZicDd2by6Z4gX8`x+5kmnO8PutH?X}@QypjK?Gg7
z>WT>~+^U=^vTHY<Gzyl!5zq`6stSH9hIV@RUzWh@05>%Ym_UA~{8fnTu5=z4Ba<|h
z7NS`+xz|A-J{5gmi2W2PyXUiK5KwJhHC9zqJ8K=t_@Cl=eXwc@Fc9xmDM=rPu&`i*
zw{eU*5X=+vk`bs`uo8`3<*ik>opb{6#H}EALu=UC(mV>oacs~;Q!m<8=;69p6jVsy
zdEf(O^J|r!{or&x#h1%`ZTj7_G^^Wnk3nk_0h^cAKS}vY9cmTJ{sB;O!CiA)7;p;<
z>eRXK=Skr)FYr)i;x`;Z_=>mlE&Q^h-hv2)oQ||^<7jE$15Z*&LS0|(*y|Ils|b^o
zL+>~(5Yb+)!3H58>|Xhs{{!|JJj$o2=w{G8P2Ipubt~Cr<#iMH&KF|ozA+3tcL@KE
zzMr_ll&-x6cnr2X6Wk#r^qkx!+tXA`Un0@vXoE9oXr{ouAh+AsW_1t8Z~D*#QT5<o
zdrYQM0c)Cg=t<r%!)(+8?4)jZpspLUUAW6`e&X$BHI1{7EOae+<1-MB89CblJb<)5
z9(Kyyw;C^5TulvQm=GoGJ-#+bz}A6p+mxn-!7!$vF`4G~O^@fgk$TwivYS*g#eH4T
zlt80hgM|A>^DLF7P}y7)i+}rDHMLsw;7m`8XoUXL3p;_m(1T@|PHTEgx5*AOtQ)e}
zOXO<<)G~eIWG;@ikeO0}>nn|YZ2UQ}y|!V6z!W=q>&Y{%6Zf*@+DD&hyIo&|(w>J@
zb(4YI4g#};=r3lzlDeqv5Fb?T`05W&q0P)Y9R6swldtc!8ZgP<cCi0}`zIe~RvzM{
z?K^Iac@N&4FcNzZCpAhEl=Oh#%1o06zFdgj@VMtvw7Qr#!ftvyG;><&k^84+EI?NU
z#aqnnL&8a}W=f8*uhRZY$x*iY+I+FNp~t-Tr1rvNS;mD*CLmbt>hjKasL}=*zha8|
z>N)bIKp4BJ2*e_joPQByaMb#+CNPUY;1x*8thMZ2`ZF#cQ@bOi+~i~*@-s)i9^!v6
zol8b>Gb`3-;LE&*<&IVcf9+8@f6t`VsyMcXYhZStP2-;|z}J`yYx+(uVez(Ty8hQT
zX&34v$^(SPz5$NyaQV)1LMwK@kEMlxPkKyL_V6z5nfxlg6`g_FahO)FcY=7gBi*jM
z7+3X}tRYzz<Aty(NaPs$PH=CINy_2Ft0KSG8&iG{u`Rh7lK6A@?d2el9i+NBLl3Q0
zyhGqMakB21vUb!Cdug0x5^6DCYkjy-(^7iTz+Lcd;o`b&!q038BliCW`L5&pF})dh
z)rooO^j)G)YB#q{xw=^;6>MrD0*37-Z=M3JJCl-8(JgKSe8W2QJ*lmyU67K7(_RNe
zw6MC-ro7NR6JUV;iIb7sDAPXsxI=?o=u=c8{RhM<{i+h#b0nlz89=T0tCgOg?p`>%
zgwYek<sj39e$5{|m294BHm=jAIb9&&k*v~2m{jH`JJ1%im$gMKt^E7u>MCif?<2a%
zvq7-Sb!pw%4YQcESPlxVcWHLZZ^q%+_V|2Kefr~X!uXkI!6zHw$&rn1J%%RbK=kn&
zf(qxr^dc|$b&H11O8UAp@>zee`h}C0lGkVYAxUS|x-~Dao^p4!_9)g+S0Q^=ETBX!
z%SEB@Oi?<wkkEQ3AQC^|7nt3m1>@*O5ULcQzenC%WB&W0@RJCpq|iOFonVg^;na2(
z>(&I2EM=S@uR)C}g2<ZM&is}}34k@oqVZ!{z+W|A@Sdc6Gx{pztz^r{ltra0BX`gY
z+6OZrb5eWNbF}LDy)hr|F`3al(P$<siy60`38Clix<i8Zo&~FSM&E32-n_ZRbO<2P
z|8;MkMLVNfzSxAdT-V$u+et>(K-w>wzZ4XHGJwE&gvPaY0F_;7*k(E1k4z;H+TnMQ
zv(QPCx)LWX3?ahc-r+>WiY9cJYlo0&kXO2p%<pF>A1X!2V<IGre5Vk|;rrX?-0#K5
z`t&N-XBjiTTbG;-o(=8&nARGRWSHQut~fm@gVuyGj8mcoSZxNJc~vd0z)!H&S73jC
z@D@D(oh64OLE^{{092Ej^_RT#XE<+vB%OT{EZ0oFV%0bZ?y8}QEx-Txuo<vDOheFN
z_3sjsTggt=WA>XAS0G@_y7Z_SIK!ABO6X)#4h0FWol_M4+K7G(vAKn}#T8apUh1Ma
zTNV!o#<$jqKB6~l#%_&2Fcu$239lhoV3t7ZAJsO31ncQ2Zr2N=Tkt;cPT?k}Jq4%e
zgGW@29uf$_;C7(NHZl*T^9Nvez-p6MU>PLP7L#le9D{+A-@v`<0?)LeTu)UF_70Z%
zeuo4ZL!zgIDjRcM#fBWwbnXa)tDY%8+dc1FSnJy!Kk)sA38)Jq6$y{7$9!@I{C^q5
ze};4T7G==P65=|oFO(Wnb=%bln%!`q{N$#78xSSy<MwM{!@<-e{zUC6I0Qoo!<r>W
zh!u|N`T9sqs=!Y#ex20zSoL?a-!2`>w(x)*-Oj5o{eo`hV;-0(Viy?J8e-KEc=s}u
zE(Qljmm`8c7NxgIRT%Nb+U&i<B1gAEK*usegA;IlT<PI%W23(K7U<F$gF^Wc%*kF4
zke#sCd=L4xGENJ*X?ZJIb)vOWtR*Flsls>_AOmvp&x+?l^0AlmyPe`gLLU;(>gR)-
zG}2>W9O6$EKhU9TimTkXD@+UuA0j4h6T9wW^mBKA!C*SMHz-ezTX@%*DHK@E0ZsS*
z_Q9wX?05ZTB9Kq%s!XP0)gbuqXsCybMR7M)!0&F2j@1k3(h~M02%cTL3rcZ9V|$mw
zKI_Q{?jwTBX6wNLe>9gZLbPhnY#{fU`)OS(DYu)bb8q#{Z+fCd9-kC3rxT8hwx~Zs
z+3e$ot9AcKz`Ou4=I~VYv=(g!&&z<uqi#&uP7TH<*3I^=s>aYrEvarn4!Q1=9l20%
z6^1FKWP2s@H#BH(%_n>eeI$nMB9K6HkgH?1p>0sW@)61)h|sG^-U~DXmjxEhda)Fs
z(nePxLeoQLzEIk<v)`+0{(iHC*K3l?IkL+EU;ahC_<}s{h2sx^xBfjA*5juCO>t{O
z|L;-U6>$<}z5nAGQ`I#!-|y;-SasB>mTARbsBr!$wv>?S2UhCCy%&9q<^PEPyKW!`
zy#fQJuwa-vIP{Z)a<-Q4&$kBLdj5+q{)R7i+o233ev=F!!aKp+x98dDwvOiHc{dJV
zjfw$jkZdS&abf;F`V8X?e7HV@Y`AT7qmY+-<G_a>w{%Ulmt3#;r}pTfX__e0nq_eP
zvfF)zZ-I$}vBiA7CHVbR0h(X(9*9QXLqu=1FuZM<B&iaDp8?Ph=#eM65VSMhwbRr~
zKnwLU&K|?<$*zUq<z4N;E?8h!0oX*6=G8<4H`)b>Y|3^^#>irgS;+{TERABS&|3F?
zFp`6SU2|Y1FDqoZnFlptIJyytb%4k!^ck4;(zs`br0bg<%c@$yzxD>)8Kr}K+n=w*
z-z4r?xC}awV03-9(O!R8%q9)Lxv-R5*de%#jMllxA6)j$AOSo%4OK47tbs8CqeprF
zapYTi&_;$z9i$v{<;D*)x?Fo;Ha&7`7rm+Rj~YKXbtC}q+o=|uXWw>rWW%otkl@9O
zl;D_vLby-&AYWG&5)*^IqBTWdH(G)RekN<YLiru84AAX59kLgIQy*Rcrp)efHK1;#
ziKZ#2k#3$9{?m=+vYg8nmTjFCxv`B<Q5G)%S4jL6Pa7+PbN31K+coi`ogpjxiSHw*
z4)hOs#;sio(=rKMp)i;B^6X?O*L-Zl=elAiyat2oW8bye?E**+2{KEZ<_jGOnfA4S
zW8O<0`$OF(?B3rVUmKaFuQwh8<(dz1`A#aia<|+(fQs43o(w?9hO8V2VOZ2Vwej_m
zgBOXl`*#$>*=3Lh0N+03H`I3~To0|#K_Au+@vq}oh}wtR>3z||nLXg+U9E3px!1br
zZ;<-|wC{<D8o)$8qzu4|^1D6VYnpSJnNLH7NUMxk?Wsj&^$3K-b(Z_=UHI>-2d@8Q
zX4Xd!ydn87(Y7)<$wx}d_Sl)q+=e~1>S1XPxoFhrP9W~00S+Js?Ck9R9w9duhz`g=
zQP9=iYhDHO<0~f%JHW){_gZDZx01$6R!r6!#P>~b@M7{b!y-@yRIb{iJ$$xe2lYB>
z+2IG-vn-}vydwp9qgF%dAVF!D&<9uZ@{sUmnDPD{d3%6T;c?Ct_@w1Z<RI=412r54
zmSGHh&#%kMwU`*VPT3IkR&S;l$9;`9GZu%4Nib03OIUE|W}C%Je()onscWFSY1sH^
zTfkJ^zZL%J(L*VI{}{T3ttqb?q{ShAiv$3}RH;3&S}U^FVR~xPwG$A$zJx<R0KFMZ
z5-*qouiX{dVeKM%#>eW_gLVNV|I0N{dW%gbq3&L2jO?HEojaT&hLzP}y1T&LXO*LO
zI2MrwND$o}(o_$<LmVt!!-e@A9G)^X1{Le>{ZCT6@-=07AIC6S0;vGbgK%@jovaN?
zU#IG-#V+=m&413YL8P8>Vg3k73z<U*Rv4Pw`kl_Jtex+zfPJr89M!n<zwNmJ*=#N!
zr1^Hn3P0ud9hq|q1x{RoZx4JP7xn#gUf~w)c-Zj$bCxfi8v~&jsEsA<b`mqg@H_vt
zVlerH(ptW~pLPxDf<Q0xqAFp;X)0qI$I12hd62<C?^McGbKi|!K`tOb%D`pV^G2iq
z$>g?cb<5INgnk!z0(j{Dnv$k<1`qUyCkC~>S_C~uMBB6l@}YkrJ5UA4zjSj$Y%{h0
zr~~ktv~5iQ`DEd0x9>v54uUxi;+{>xZAk}0n4J-R(%2}O5S6vAlV#=Mid6FlE|!~u
z@aB`icTDcPDm__9;@Tax6RfI*Z&N{&K}(|>HX|@%M4n0(Fik-45VTTV3-+ij&vo!|
zv8Bt&knQ2?nMbdMRMku#Uw*3zEwnuOPsHl-Onm<I<a3{k-Rb#yR1LsR_7|#e1E!*(
zkD0mv>k(<dlo0yn;=OOr4DX?Sr$fzY%f1tUjlH^!U*~Y8b4+;3z41!MIj;wQHejRi
zLZ;_PnsR(1v^g<9mL0XRv|o)`+V7BU{=1~?gh^as^FZGP)?s^A_vjqB5lIXWdj90O
zi#w|>cbzmckzzb8ciWf5<^sx*xAK01l=Ci%B_KJ2rWoosYV-AGPs`UHI^=5moAx$t
ziqv*t5-bO2$c67cqpcZ0S#rrD*FK>`8t7vS6O6@c;IWH$ot4YUfTHZKM=3@R{U=F1
z<BkGEDBS>nQc1i1NSUd1eU9mum4QRoq%S)~K|rbd9Z==97ZQGeUj3hT6}0I;o|tPo
z1YG~JhB$I(@`pA9-aryM>DVzMg&Ui9f%~ADl-x+G9<!f~4aNRs<_|~Cv6r3Sv&g4G
zoYWB8`+AIIC`-}L@xMzY=Ge~P9mt1Vp(4*DY8!vi6&irRp)ICTPgVfFXxHSN(~etc
zx~R>BXW7OKs^?1ovtFq0eL1?sybZ2Tq9vxqc^E9keXj>TRJle92Ll#uPg(w8rs2)6
z0U*!h9JoO!SP<+sq>0X6DjNHD8|a}WFpyB|WXnqESLo&0LhS13hRYMx1ku|QmtI4R
z31;m*IvSN4I_1T;L$!<>@NEW@>Jllu)U3673Zn^DV8&EiBMUF#cl^-1C4#T$zRx1)
zmC>G&0QA}&O#gpM{{NItzCmr;oKSK+7WC_dDFHbZ)9s?3-Bq=*^L2_1Pc=i#*CsDP
z;C4OdM%g8_J^B6dNegYecxG}UhwOH`q1<+MC)t!v6+#E~>~qQHvd49D!KI&nJn_kA
zI9Eo`@mZ_Im|AdFN}BH!9qan405o}Cqf?Z^iO{CVhF1`j4|@=~FOtZ)Vgjg{C%<hk
z4ULz$1lQ}p>T8T@Aj)mx*~dUia!tTqsFbA4d+8k5$_Bca_rx3PqJ1zuKvRC50d#2B
zfmTE(6Pa!yG*R1zV`@h^UR)f9=4u!_)6i|GU`W2`X~<k-Ps<jJtBrZp)l91c;knLa
z&M*OQbc_v+VQV=HVsYPZ+rAf+@Cy^oWSr-p=3^`h<n=w3L~x@(n3Agoji7ad9A;Ds
z;=NH@tuefM?5OF-r<W~>q^Gl`&Jronom9}Q)57Ll#`#(>yB1hKko%xd9|Mp&Ls8#*
zB|}%O^Fo<@FE%w>@?(_>pklB2jG&ba+`f{318k(O@5IMLeuf@m)`Fv38n_42)}uAi
z62Owpwce1dAcf&Vc5nRJ!><tkv(%mWYOfT-(H^JTM7=7OkEi)a{&{GJ&wClSBN7!<
z&$)EMe1|#*rljFYz3Nhud{@b=L3Guz%C;c)(oX&BF<xK+e=YZ7mq}1^?gmr4=lPoA
zwMLB*#N%h^)`3X}V^B&!LT5?M<z&D!BCAIuf$}}&>(?FEY3ovd&-`FfmGxmDiJU6x
zz)`P2gPu%;YR$K+ldF%hmi|H*tnU#ItksZ`ek`olbpIQ`&Yl0mpV<Ew0Bi_%>j~$=
zZMrHCRs0}Zn(7PMr~gLwG{YBEPvesk6BCnoa)COCZ)b&thxc=sxj195Ls|VG2vHp$
ztb^~vJ~TwM5No+HjdvKL{3*6%0LR^I=#dlFMs(=F)n}&7@W&L`&5s$T3t#m4tz|6L
zNA+Dy274hd6y310^4H|K=RJg)yPdUYo^1LT$Zc^RzB#vStK|m3iKxD>e&8v!NW!fZ
z3vcx@Em&Cxe>GQd7T`iEQeI`vl9O}KIjwM>DF<k>iQi;fYb#DzNYIYV%4*@idF5Ow
z+?w*vg&Tc#?3(I#wxU9p;yF}zmz2ASEv@rA(u0V6<_QsZZB9e9YDNgjLvc-?O>qko
z&?BX-CNwm{gp034#40jglxN|gb*Q&5!iB7m3C~CC`yH%8!rk=lFG`x9ft(-EiEL@r
z9F(Lg%+To1f8@^9Ov6fZJNS*4ah_Swy_bVL)<@0b6HfP^NsE@v<^5ikdH&X1geX#&
zNjelOn)na1n3&!XLpW$lb8TKh2eP$rdUaf0k?Etc2@gt1Mu?2O<Wu;mIr@c|-bs?4
z$SGg5x6>tDVv!sP#d%%s6RtlLELah<^ipaDMj4)8$<%75yk!YV=K>S|)_wa@)xheF
zh8^y(Y{wlJzqf;ZhV9pzd7_zC!x-7IF~$n2@wekcmpfcE*>lq5JcpvUUcy6Ly}$*L
z{J_o6=YY~5?^(__Z%rAbpK38`ywqan6x$Wulq{!}Au9NNg!-F6U?g7x?~ha^ZLTCt
zRsZfKnm>iB5ovfda<5=zSnvw;^?et$H=a!g-`Fh`vI0yb#7FOF!<h*N%t-?Zcm)n$
zxEE+)%V42^{!gA!B@$znQA8|e((k?di(5Y0<>!40e#axd+nN=!seDDI<7hVR_R>V#
zat4JRCyJssq%!K6l-{EI4WOtna<j(@Q!b=Kz7ZAM3a@4neXo3xqhfL%{m9RkD-SFN
z;9=aA^Gkl5gzu`c3HrH4?K1Ib%t;n-b1<sD><A-oq>%|*BVT^$7ik>l5UBjYA3vPp
zI_d>wc&(H6t$6<1mQ<I^J0eGUt=x+_$isSAWg(+%C^|i6Z*_AqCaoR+P(k9MX`3j9
zc%c+WT)(<fjgd@o!1s^i=VNkp;)6Y?VkZtPETHyLF)@@mNvhO^&XHJ~Z|)Im&fN}7
z$?1Zo|HuzrtdDuy-ybG)y;{+inU<9<?tiS`8~uI^+2%!+QbHA9Xd2Z>NOmw<l*}!K
zA3}iVRZXu<vBRXp$*lIS`V9Wla4kP-xZ-h}0P*+(np-X9q2j>WFp<Sf>iu9zGR%rF
z&i_S0xzY@zWu2U&@CUWwCkF^K>q*7&427KYL<+*wwa(>5c*U?eL}Drm7O0>CF8r<|
zLo@7ZOR?(|rF3*#Wh3=ix&n1aYxx%`%hR;|qcGob80HlFMxn^Wo%3e<MGq5Jdo1XC
z+RE*OJ4%?ub^PhL$EQrg;f#Bt2VZd0?E(D~pZ|@jYa$}a&9mrzcNkct>Y{HGqq@oH
z^DF-1=r}efh1hnpoR;Ji0<k=y&x(mRF{XPeDJu=qkb7SuafO4zsoH+=*TakkyBI4(
zMm3t2#0hU2Ei^nv-@a3Of7sCO-J_Es1B}4tArcz~;Wuq`piYjUUZjJvsXIS}?wVoi
ztD+`9XY8^na!7R5lNOVHSKL!p1L#^fNs?aqt?`K|vWF@J5k{ER{(TJD&e5MUz-b^6
z%bgVfIy!|$*koF%bo6-Aj)U%5rgxMU`535VuE*8>tezbc4#}+<tbyt^sBjT)_QFze
zcMzusyPa>QO!1d5{eh`hHNIev4Nc=8#Io#o!=#Z>iJJ;<bBJ=wxUwSJUj;16hj{M+
z6c9(mMkg+u{RZ#cx57v3FT*Z~TZ6j<bGQ#so2G&-x2&h@T&d2h;w=l_&h(EM`{a!I
z6uQDnVDxxdHW$$eNs+pG8`t5(kuI{<U*ClvqMgy#mmHd;mNC|YKU9R;UM9tKvR85e
z4m!av9$|a2Fm4dxT8PL{H=G(Vf)sSwd7aoiRJ3`gZK%*}P}}N0!v3w73%_{58A8lr
zN7K6#BjR%!61h*q!C#(!;bEvc*tK}=Dy16H_b~jHR$;h4hH1gdxhM2)>Z~40I$mHB
znauBHS!CDxj)v|nq2L}*AnvTdGM#rggJims`tV=qR3Cov<SFAwE+P3|NrDR3KI2>v
zmDrfu`S_5lb;VujLCg78R*;<MjrLbrieaaIzeFcUS9dWndn>t<A)ReN8r8yE5Ik>0
z{@0{JzeK-}21VV<y0ErPn+4uq=k(NJJA;&(#n?5?tS9sA*%q$3u_~}qcU*U39^+_c
zDvZ8QzUW8>eBk5H{J(XrdvD&VrHQ=`Zb8wT)dm$H#YB`%59gXY9s+e1X}$+O---Yc
z5c$xkhRL2`u73Ks=QS+f-h5ap>2MR$=8C)fW3p*JFS@g^e6{n5l{e4&71h>jndX;+
zy<@gU>C!#s>5+>qpDaWRDmF%f?U`C9jvomv7R!c339>%bZl`$gz(B+ZXu!#h#He{P
zB#)+7w_}HLu8cy{7vv}6iqr7MEXDH6TRewk{d6vD-NV!rIrX6p{MnkQ1WY^=P7A2q
z<+HRPwX$l4u18%1<3O8o7xUiE9o&$y-63f=x#333rAkE}wMNl$JsTp~{Q6n<IJFPS
zpzWhYNhZ0mN?p}lKHSSC*q1ud{)^7~0nuc~)IIESt9=zMcP(C0iic`ZCRMsw)Whl+
zP_1C}{r-x6@6-vcWczziWOu<A)TpntU10J~;sM?T>jj2TK>4+YOD?Ze2I;%Yq$gNn
zqyXG?=54JLP9sm!C2JedWALal{umwUUM|t>!%P__+jD49HJgHEywCCk1X?LRD3hfh
zroiGU&T6d{!Xz*#ofs1)w7tC;8?M2g_3$`9Srl_;2nV!AjwG(DRpF<?hhCD6l)ng<
zBH!)=Fr##;Jn54}8{M^W#Xfaf=Ek%hn#)8HM4?7?q0JU_F*mu5TrMS1AlY6eA$I2e
z5|T~}4pQhlbU)K*wGa7Zf@0qouWphnh0RWFRAU49ip9$-tM^PDJRv<&%}?F5$)L*>
ztnO_g&~bR#C+%|+^7gUPNT757#fvAZe<{hhVVZ<Y7Bqq<JzfM>*ekWXm!7I=ANjsN
zZ7hqseukNvTS(yuOM@lmMstP`Z@LjRoJyJ<RF$uYmMhyk`_;#E$|cSQ4hM<0Yg^<3
zNU)np-ySo}uF+51H~zTYXe)^v@cpr`R!PE-P&j1Mm_;|(OZ7r7E*|Khc+>U8Zav3b
zcDgt&tOGBqM0$8wGv7w~BRK)TC8?Y3di9T+qUn@7g$r|!dRd7MHfag3nl{=7-U=s%
z<3G=C^Z-ye?|vmny^*iEA&V=bHS+y)<|XN(%lw;Dg#c4$yb-Xh;t|E|_lA;7GZ1kL
z-SUYuy5=2vl~tZ{(98D2h=NFl<6R7DiYZe3yybvCs3X@UjzOJ2G^#D-X=ML%bP5Q8
z;oDJw)od=#OvuYr6y8BQ>y2{9NrD6MuFoZH;~CidtAK9yZGwi5;dh|UcfkS+iw;86
z@|?l<<-QcQ0z<geWecR5YGHAC>b;Yd&zAX$j{hD5W<8h820Rq>zMHeV(O#nYoWow?
z1>$UPhbNHM4#JIQcS0TFb~7WjYp~)xD436ZUWsu=Jz~7qmr}qfPIqPvR6h2HB;z-R
z|47ithmT(p^8{<#l6<^b_<rjYk;aj)*?#?bB9p)P#aqp+w%?CcapfTn>j)iUnFt?V
z7XA<WI`T>q86_37cJn6&r{|k5jf`P6reQ_PmUCsLJ0huC)sCJO<l{3JzwUh4Bz6`Q
z76aWQC#n{Foy)47Wr!mwQkZE*Ta8W*KmkQGtKA~rxTxr#vy{XTm$#AOfrZ@2-%KzK
zhWhRV*$VX@Cy-2nrzeSU67K!UQ91Gnza5G^?`^Lq6}mT6JBI$JtHOrK_Zm|>6Plpn
z%Gh+fXC*sEE4aS8MFt!UF|m(>lx^x<1Yqmfi9y6TYku7XxaydBsZ=JhidQevplJUG
ztL3|a={H5h;mL)rYq#-Nr>`g<mVJigM7$Iao+!@OyL`J~5m%*;+_AB}fVB;KlcY~c
zYri+fTqoDbMW(<~??+ZK2Ta8sw88~y!8IxDpUCJ!=q!tzD0MZrG2c0ILf`2>?{~U1
zzzz#nPs}%l+$ep;(^SjqD|-Z=DAwP>Cn@;`9)zRTr2gdDO;EwqLoGSY_G;IkD>(Wd
zaL(9Xf^Jw!dfKi{TdoxL9)+aK`>4Woi%Y*#;!ojV&D$Nrzn(qQU^yeMkQR$2(Mo8M
z9622`fxC$Moci7-uYsh5lJ}crMv!NIOo!!uiLT5Ch+53uLrM-_X{nIA8hT3OM`?3e
zWJP7r6(5#2aSdBB?v<-|-ZKF8=5dm>!$sZa2}RMyE19~nw?vIkzcW`e&yz*-gq1PO
z)M$-7ZuoZdrp+Gh8$14wVWdkj%e2F8G(Ns8qrQdbkNuAGM3!Uq?)D28sM3=%iF@uY
z&Ecz^B!!Lox1Y*0UQ3P%k}gx)^z!|x!iKCBz0s7mD>&YbyvyZ?`#E+tDOz$E`?7C9
zWkO(Kp~WTStk~SK#`Scz>#rW_4T)kPb^_>B-7rQ7^=(8y@-|9C%KXtb+MFiT(5kL0
zISktp``Ljnu8Qg-AGR$hslb;jCryYN>O%y8CvFMq87XtNnjB*oBC4oBVIaEFft9Mf
zL04gVCY0?GB>db=0<+ao4Ox9J?0WcQky_;aU#}>?h*fiv-%3Sr`wH@ir0c}M+lY?l
zk`0tNCTo*X`#94qC$NC-{Hk4`nZdtoJCqI!+4NqV-KzU#IJld-ro~D*$oeXWVQmAK
zslCgM2_7fsH}oc6$4k3*r;RGlf@UIoiWNX86rdnDm>Lw^jd>)}Sl${NGA`>M<iTm#
z)37oVVOb1#6qY=V*2#EzSw7+1S9L3V9Z?F7@OLqI2Z;$&Ij#Mvc<^lY`b2>0h$@|M
zg~|z{vw%tza(Hjgu*w6%ggxv$#6MGO&(n>A4-KCGpc(8RxgF8M{`4>cjUH?0h)I!t
zewAcGQP`^Kw{+cXIk<Y){KGgbxz|75RM*=#4|~?!`2Fdcr70)&81sm6uJ+sPlw-^p
ztH77M^^!-$_Q{*@f|CIJH*h_yRQ2a00c4XpxZ30sg%qdkx^jQ(UkTS*7D-Uxa0rfK
z7Y-(DHov2(dJ7Ua9KCzzIY0PVxPm(SbwDBNGYc4)Fy8t189#eGsej$t%&OF|pzc3^
z{!YNY*?zjPr6mSF{b3KwnE$Gud}U5p?u2(u+L2ebQ_i{D{hg;Qu1JtR775`3D-ysZ
zIhRtUau{`lWV_J9TU-w><L>7^i=NRbh-0HnzdvDV#By)C$s0YXw2?k)Kh-;IqezWd
zJXz-c>*#ep=$;tWO1SY-`qfkKAR$0v31L;RCO((D80F{OIUL~G&LLpVveaQ$iMq+a
znGl#xi(TAx9%q<Sgwt!hEGy-6SHM;3<c7<|Zm=~nsh8(kW2M{Wf1Md*((7gDD^OY`
zAren%QT43qjoKmoO&|Ri%I5i8v1QpptPk$RBC!drOMgn8p9z)eA=wrSj?~Y(;tW%d
zqM-$qCR-vdx5am4B<(#qSTbxrA-8G6?%=Pl{gXc5&d0Z(?d0sRJ7{n>-ph3uKTjn>
zw}5Lx9XDr<GS{kT=+lb-%)Vd-h<wTV?t<@q<P&Gc8v8O?E*ZWSElDP9FTN7l`n9;j
z+vkK%s8{OY@l={tsenAcXF?BNckZLd48xRQ-Pa<$|61DkiNoqEM|M0TW<kmJ7siB~
zmetn#avQQ7fsYHH;738!DXMB4t5$I6j$@mDb%`3M&h&~0e_|LGU1P)9OEkn5*susA
z4}8QyL3*al`wQMNlY#)$Js6tfToTJm0t5(u5J)Xf*z>E=7k*UWxFH}x`f9mSu{;Ii
zDeGNEbdHkT;18D`)xjp#b%JD^?8S0>=`{9gd;JV`?%k25zOc!RDJ_0XGvCnd@<rR@
z>m*H~mPu7L-SbiBFKXFr`5sK<mzm7*<_4>HjrQT40)F22%sbzS?d1q?%ByCC&TXhz
zMA4eT+39r6eZLakNd=sxTme{c#l21NBTWvUrx8DtHND_rnW|B*Zn4Q`OL-LdbMNK5
z^%(ghr_~8MO5I)O=R!UY;+xCi0n{7E0BVaugQ3GNu1NXMinBL|H(K}4Jp+59EPs@W
z=+#fUF65Ln#!<5OKaoZW3k9UCin9Ht`97<QI-0rOh*S)Z(81g5c_rIwlG4fkSOH6Q
z64bR3<XddB`3T~qH30cA>g>UpqOXd3KG|fSLQc}LmMKor&Liht*K|8FFdw15668+!
z=V=y_C7yrr^|(4)(i3Zo01_4$u*iu=_>5R(A{#aHSxJ_s56tK0M8$?ul8Oly%QoSo
zVQf-bP&}oR|5ik~%O39l+COy0AZz2nMaAzHs-|f#3AeA-S(JJ_y3DxO>22N;WnE@l
zRPyqE&yD;^yj*AXi!s0P02*d~*Hfl`P4(5IULch6m_jjiLooxBc~_{IAyJ%6Xs4M(
zxqF4eAf9F1sE*)?E6_UGA3-bM_a(C%m-2pk_!#b1o~to#$tvMVPf7Ozi~4N7{Ryry
zZ>Rm0ll>*jV-|p7#)}prgn9Ob_h1UVN5YyjO`KMHE!u3kIj;obXF~M@+s~Q)5G>V{
zXq`3ZngfZscAHYGJV>&>CsBR&b3KYv>7h2d_Mc6z$afR08n7Lt1t->hcqiG@^Jm}E
z>CetZxJ0Q``EPF~j3xzQTUqOMboUdTSa@8=7Z8T3UDfzw@#kb|kz?b4C$bp&JZsww
zJZ$JI(MBK=*=7C~Nb^41C4uV6??dnPk)SfgoTmJ)3B@WLt502LOK--aeVIj=2KxP_
zcO$P%C5&)d)-YCE2*~tqh`{n2Q8vh*=L;!UMaL3H*3Oa~*(3-7Rkl89Rn2CcS7yY6
zBH-H;(PjzIbJ};O0#a<Lqs(__M*i|(h#GHBzzxtP*dEA|M`F!L`h(5v91Ov%9Jdkb
zxA9pzRoZ?2>?bH(mGl$!HL}-{w~bYY?Ds@JmX>uk?*iUJpQPrOCq&jN<vHVJ8cXQ1
zi@iH|@jIfAcPcWC26w>c*q)+?`F=C1LRa<l9khs9ceV>A$Vvho33gj?L<zf{=xhHn
z36}GkD40`_YHE$NL2AV<;pwUZt<FZ07PN<4<0BsBeRPnT{Y{a%^n@~yCf<OQNqV<Q
zy*CDglJt8KT<2yK_KjD^OqzPEa&r0k*7Lo>HpICynAt;)B1FixSoiKFQ^(gNH=4nJ
z%92Z_@jYvmZZ0p-<lN($!6!zOM#$V`QIsP?jwi0bi~x<3@ZEz0hvDc`q-~_B<f={0
zdMBK9HMC7zB5!Y2;B+G?rSb7COUx^=WO1EhOLv<a&;=~!;5JT#Rl?2dr^a$X4$+Mo
z9`DSG&zDjkT8aHt0tIV-G1b_Qx!ntkuYOvPSJW0fSG+87#-_JZCu7CD5st41wgl+G
zamqr1(H={U>rT_>C)i656Q66mB(ZJVIryiM5xrzgJDrVk&(UTt+agy3*&#B6?@PTv
zpM-LN2CO!L(n;FyR4&OCGa_mbZz|*tgik?;9%9`2b!LP}D~^a=Q<gu*D*5z7kIMBb
zLjUPCd#&yqgQDUvz}wm%#CRQZr~WB%I9$B^=J?Rs&g;WAfLuc~gogyjq98AWl_lFW
z!fB}rZ~d;&*?TI=xz_7@f}{(ZAY@0R<ukU8sTrZ^CCPaH>TZy~<%YUjTY}DCptH80
znpo1w;Xg%ZW${?%mOS$;7HH?soO8Vbv4D%7<4F9|D>AT922<2pqPf_Qm0QVkis<q6
z$bkX#b|0@QaGr-koA~R#qyzgf75_w*IwSNy>s&-|A~ix!gY;PJdL>*B(sT{8nG{1z
z?kf}MitGurro0vNa|GB8gboN^=OHAex?Wk($ErM8S&8`b>YHkC{Mz(p-+@SkdRjb2
zT6i=Pc4_+g(NDxbPsLE?C;`lDHG)2hzK+n_m5$9{TCvGZdc*VmdF3Lh{Gai~?oQ}!
z^ltHOqFO6qkxS_}mx8|Gjidq3gn}+DxSL`|b!i^5Q!xH9AqyP1u*DuZ;Lh>lk8<jG
zkKFUwpf`ndAEPLL8X5dr?02)N=K1x7<9C88M|%(a6VwwWFtxpWKoiNHH~B9=b@j5J
ztx-@LwWn+V(~T9FrtJrVv;7-dRIlVnMOTah9Sm5Uqx^KJ`$#Amw?ZNUJjm(1Hmgq>
zpMR=sWC;ym|G}$8zeYTt_WQP__}ve~EO@HR!Z_s<U?-a3qGBQdd=Wl#QxptCzJB8-
z_amIaY$YS!ob!`5IpvtgX=Q(;Z*#ScZ434x*!PShPfK1#Aq>Hs7`YbVz6(>#c+dX0
zvx0(Tp|CKe9OIF-FH%pcJ2P-b*B*8p?)UN4X*3tf+^@(bS2=e#SQ50sY;7V)sLHol
zlK6p)9`w)@vp!&yb}(uC+R^|vYZ3d3<MDf^H?C#zKWdd){SQ(QK;leOe$|ZCiBTnz
zEg#$|4|3yd)8#}J?!BxgLt@~GaoGpiKn_Z=d!5*D56b+gw&d=%(Zo|6cC~F?zDs_^
zj1Gd23#)b@9mq&k#opo06^kkHHpR)O))s*E>I$7eKx5{fkH(7VaFe*Pp_%x=ow<AT
zZ$F)5+PB?M(pQAA#Mo*9T3b(Q-8|erH3!56bovE_N-6CW_22WkwQmI}D<JIYEPCd|
z+H-p$j_}@^{=3YU417>fC*u?B`aEW4DXE1}<?pv@XF_7rPI*tVCw!y{-EW($$CCFB
z;<yznfKT&E33Ex3bhpUU;2ME#!zs`nF$OMItl2QaU;B8sbF9v9amiGe7y>4pyJ97&
zCekqPlGabt-B{`sPNd~clN0kyMN_QL4^YZKH$7N3!NsG|I`JmkO#;$R6=!Rj1G4Lw
z9KDyp#}QN0Suii`4?e@rHhnkgpY!BH<XeyTPiYG$|DXkSPz-N+<%3v8)$TLKzA`-d
z+urHzI74s=nzp7@e<$NvNJL5gLtEGG3IV#ZQ2*Sj+gNf)I#hT};S8wUPR%UjdS16+
zQW>w@zfb74044Twc!lF+o~ihe(_79RX(0F)-avL0WIyX4u9~Bw>)L=f8J}oFiKqDa
z!T-@*d|mkOLs6B!#$Rxzw5lYX=ml#*G1G~~O6zZWX$+$>rX9*S<+iUo-yEhf;jWZm
zt&(YJ<EB1<L^wU8j5l(r{dLkPjA>;F%R*JY%iAz(^4{#+V;qgHSH*H>yIrLoTmgUE
z*tA<}{bxgHV_UMG(NZw+Z))z|(qpX~NUnW(^(P0?9kV3q&qi`oT{aU*Ar&*I3w?5$
zoY_W45?*7qn;$)sdsBb0N`pe8=-xWJsPvax%A^p}*%MyU_E#vVSnT^mH$seDjZZ48
zm5sbuuk{a`*k}SZ7+#G_j<2b>wqk>QPWf(>4C9|gj*1w%K4Hx3E560ams$^Lo~wLm
zs0HW>6?}ESw#azaN}%lN==g(@{s&XEcw9blfc)6-F5T;T0}3L_;zsKDuwSzj?^0(e
zzryh{B>3CPeIh<{-Gm!AI@3!YlXz`)lC`mlHxP>S_P)Q#lMTf<{0aXSo;rQ?^__I8
zQ^6@&e=}*^Qt6KQ4?T!~o=L(1LBoO<Sy;7-5?$*SZSM|e3>J5M4%^$3wnkOgg&28@
z{4G=EI%4DduBE3hXD1jE(g$Y&>loorO?XvRegzO_i=ZX3Vn#-)HVU@uwKtVUr}!5&
zav8QEU(1?DG0-9Hw~n<gBg?*$Fr5)*rnnwF*zCHeW_PWL-^6u6;O6Vw`Y$4kgb7xF
zAC4?Vm_7Q;s!ZDgv8JXRfSSe3Gwp&I4jxu7V@|gZq`_%N0~w~gFOLo~(-HPj=_dh^
zeRo4wW2Qt_YW#FW<K;#wa~;d6=$Is`nZQ?8Y$UHioID#dz*S63!0Fo}56-**g0Chw
zoehj0pY|-jiy01fu5E@=VEWLd-MTep)BO9RLH6nP(H9eJKke=Yo>9v95q|y0Xuc!n
zbK<^40UrJyVkVl?e5f>;?1NVA=*X`g0Nx(I3*%f)dG>zz{4jwV^<OQ!d1LU4xv#^X
zJg>C3U54@rnw_k*0b*Zeee;vw(vADmtvoQ;ecaqlsc%yqQAzL;RbUMscgA68bhryo
zSVnuGb2PkOK}B;7^ZjUfUrjO78l84W3vrfJ=c-7gRRvi=!Y3B0K>zx|{+d+DkLp84
z-}Uo{FxPOloGC)=)6Y#zZCrR=(vgtv$<>Qk8;f&+W*R2sH}``BI5Y%aDIjpYrp%tU
zVPqH??oLzc@#L9V&Z<}PKYYhy(*N@HE5>5{dbvm@rB2(cf!Q|s*ri-suS}Azah{6E
zb=e-YkP(=1E{l#(3M$EN|5m*UQec9ut7V-qMrp2cm?xh!{>yeF)aW^Ce0ulo-Vyx;
zp(|Yr*){S_ZRpS@f2BOx+GY6TY_&ZXcm#Gmg{(Pd&A{k~M+{pNHWhW*wlqEAOpNlE
zhN<J%Rs?NblF$5C{Gx(OCky?mb6%os>~-zx_7)$o_gD9=dnBNLkP}(I#|L~1g?fES
zmF#kp?4h!<0L-P(VZ42jk&;uYo#GBB?pPZ|f8_7EtfXs*-Y9lUOx4`C-~&=hL7hIN
zgzzuUi!Okc%9AV|A>n9J+hZ%M#%66dciazQMwXG;2An0bEFg?rwfBypaNMVJb(Nn>
zh3;8|38PUvmav_?p*m+~(^3<O2rGo3=+(A98IVLn)Rw3H%Vp;{7Dql^DP=T%q2lzy
zh47t&v=ZDEuK`xfe&>(OnQkOi4HSWPlbig0++gtw+}Coz@JGk{Tc1n3ujaU-#l*#@
z@3H;|Gsx{wQjO1qq+VFGkSE%2{X1eni?LGMy>KgoKDxx$uBJF&7XZ1K6iAP6q@)(%
zO}&tuZ8u9~|Ew<f)v(RV<;@in4GiS+DBHwk>6;=!RP2$6EgdJ4L}OuhVM)^gw<p=i
zaN2*mg1T&fUZ!05aloJ|y;hp^ZsD8Yyc8&qky_}wY=VMt!US`xKqLvY7D!_=UebEO
zt>zDRm`Im_d41h`---^Kv-=r0Lh>kd!@)#1kRyh^Gml_cg{F|b);BFDWLdThU=Zrg
zQtJi&4k*MpHLlCUA!-AjLrsH2Q%-W(@6Ll|&Hc~4S^+52`SVXaN(=|PHxudDzY^<`
z5hAq&hXn?>bSW#yQS%b&gFC1nahTHIr%f6Jaa*)^hPD>s(l3LVv8cr@PIBYjskE;I
zVxo7>q72Zz&Mq5~Uo*bg0)z`uogI>0mlNUS85SjTnZB%u6efhmrj%2mr2FIouz`ha
zn=#2^;eN}@aWUD$&+LVAY)J?s<_AqjKqV;zg5dc~&oO^crx`nimYH*FyIr`Rd&Bei
zrUHa%@7NB_9@a=;jvPchHp<fd6JI90Ez12oB{M`W)F;-l&dR$$aqeOBMw@TQh!f?H
zfh4DV?}7w20mP`@3>z3Kua<PXG2kXLbhXqb2nCWQgntQpLkO&+t)b|%60guLIZ~<r
zVaJmHX7iSs1n1|69R1^Gcb8FJ9e4=^e${OJ!j0<-DgUTy_nBh1&L@*cL0XL&c<ojr
zuC-=axXs*IK`TMk(9ZSwDPm2^=ix$G;nFqhppT~!CjtJ4JkJ#$@8^DQ;QM|==xn<H
z+3UOGAd8yqGi8MoO@U8$j_rJSD5g4FTJ!vP`Dw2=gjUM#+b>Qv>rS@~IrFVZBa{Db
zyWMC|DxIf!jXnKg*}{%we-mUy+BedB{<6tO$v{y7o4U+6O#X1vShRy@F$Ie7M-g)x
zzl^PKT7>$A&Gc@4QT>c>|KYRXJzDw&eE79hZ|6Rts}sC2(*h1j%{s4~hWD@sDRC=M
zNasG^1|jwMJMA#I11X>GBr>b{%n8hjQU;20hZRpJxMg!sgkX`}S&vX6!^dW&_#OqZ
zQG@P39XTF*)=D&WDl3gtafM2f>>N<H7v)H(xU8OJ_zR|&-SYyx@UuNFRoDW2^&7+8
zEv0nH$#E*7J9qHG$ZvG46Y@o-ujn4yG9F_9N$i6JC$2;*r*D>RY?8YEWLSr~rF-l(
zSJytrdJbyPHdp16?RINA9!cY?8SErXn`@R)4d{3(_DAmzuLe%n<E?)!^IANh#Hx9U
zGIyiggE}gBm7Q>1gza8%I*mBixygk+2c;iBGe*{Ng0ewQl}>$(nHu>_r;++3vUKw6
zBe<jdgq0Y6w=v7(T{Br?;V!$+w~q&DP!~5|M1lsoUNmZUxTm7)g!@oZ4li*J7KXr!
z4<Af2b@NU92C*i&-X-Kn+==*?C9fJdqLxY7GoQO^atCUs4=!g?Zxi*YQP^!a^sRq*
zo5(}ZkKK0<ItDbB1s$5}0xOi(%4GiF>6ZDJ2M*L&)uxv>P7sv6QX=cbi|23<6TZ`<
z8Gql!xRIH1`bxEIU;h__%4P?n2_+(8%gU2*VDe}97wL!egkok$Pbf1wUN~eqn!fPV
z{zu)ER4ww-*<IfF{LjmD!#QJGDeoE`KooU79L_{mcomQfa}wYlZuAlDXELe$HL-9I
zL$alGlWQg1GyHA&YI^OpbySuD`}2@>jEyYF%hJWZxD9ipB4lL_W!}#b_mQ~jY|3KT
zZjIZB0P7zH#KtN}*%GrEr8>wgD3ue-jBPVU^a-b(etA`#oW2eT?p8!)%nEf3!t?CR
z7DJKfd;>d2e0#ljhWca~X>0=WBFfA_PhorrRS<G(^;mv4=g`@)$glOo`P5eSnzyJl
z6O3Q8?>lRfDWde|s#3Si8-yVHY8gy2>`*Z=DI5QRFVDbDRu<!*m<6uwH0s<R34*q?
zV7c%Ryl)7yvkMvZ4dpsABd43$_j(TSyE}jz=EsNcAADt2$x*H=bAB$C9HakjAz0CM
zi`Ev_7%j;s=i>3Qrtcs&v;H5t`Kyah=K~<%%TAH3J+M?b?p$b}m>_@4uEH2;#}Qyy
zskDdjiPbY`-^~SmQQ}JcDkuP%X?hy}u_?~d&Y)^jJGrsJBdH5o2_8uY6XQ<OdS$Wz
zfc?!`a(i}cT)$6$Lw|XhE_}G$z7AT)KB}}8vV+IF;mn}HOy(4RlIF*qY*<-qL2dNE
zt=SuC=%0gQyf;IB@wg5L7$~dx5~lP=8D>%mXGaE0Ba#%j@xC9_^oz$i$fWQ}{UK~L
zBobkCmf`nzKDtWw%gWw^Gr2aJov=QBy2-7#^0$*GXuc4umVY{P`y*B{qJvvnnsjl3
zu(YPvjg`4*dmVZ(7i**Ges8XYLDP0F-6w1L5_{-2vzAc%sbVV&A=bh-WZY0GQpiuC
zPU*T}TtCGP@M%M)Pyf%Ir%uI=Z@*FpBjP>4zmn&k;6<o?<N*_Jf?xkDRJ6a-)@q1O
zs(+t;+aWdnH-3#3<T~zP|5mt60deVkoja;~Y+nZYC6$nQ%H01!fp$CvPPe|S=3iO<
zSMJ;-^>XT6Zugv#f*I|H-#@ntQwefYpqPglHIGN5d^lTOVcH8Tehiq-fxq%9rq_7}
z{osV~#chfE9Wt<>9&=;Pp1kQnhLP#FjQ|-?#kq<jynEshbTj{>U*k;f*><A$Ttst}
zFRl`>8yQI!IK|ztG@(E?*lyZVRE6vun6HY4FCB}HuQ=t3s-s)SelF{7Sa_mb3!H=X
z<-xTS(v**Xw2cS<Y<M2gD%DQaC!T8|uxfYcwVrf8tXLF_>Dgr^mOc8Y5FfhF)7)0`
z^!xZ%3(PCq+}(Lc_X~c5rMaXrKTE88E!NJwI#m)Xq0totx*Pl5r>`TIK8yD>9XG84
zN0X(ah!(;TFdPHi<F>dTGw8m|stx}C|CA;SL$H?jG}n*oCmah)@R`F0LvKS3bxA8X
z7d}gCx6d|w{x0tS{j;Yuz~9}{%E`u?^|OtggR2Z1tfPmG)xlbZ%|JxsjfT6TjlF|v
zpr?&qpymgwKqo5+Yc_!FV`+cMe+pb|ye(P%U7TILB>iRB{#&o)zxjWC=4WI5?=9X=
zGHmkywZLkqq0Or3=4rz!!Y9OQ^+rH|RaBHuKv+anRDg$7@Qr{V|C@gz%KQJcZ^yh%
z17R3|6BeXMl@JWj&A1B;&gE<xnrmW2>PGEQ2FS#KF!m*}n)s~qMNY)VzydP^Vq>qW
zt}qnDfY@N-ParWea%tQ&jj9d^7WAHE%eL<O9{csJM{lv!Dzk4J`7qs*KG$W~VfVdO
z&gr{`*;6WEgk)J(&YZH4T|#TM+N6zbTY83-j$`GItT<hnHaYI&@idT8q9PF+lY9S(
z7^;S8mW;WPf7c+HL2;UAr&A;&KOwYSA+yet=6W{Ukla^7wuR`s(=TsDl4nBhrpCsD
zs&Qk-529F!w0E;k77Nbm#XWtvIw8lR70ae=T4j#SRx1zZ>Zg+y%6CK<b;f6vJItYZ
z`P`)AjL1Sre;QsG%(6>{vVZi8!hrBTAMjYEIzM_kzc64OAqT#4qk-S$B#FCqa`N!p
z_nSV|OGK|uGFzVRsn_~f0|*cxK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs`O8S@WWxuK!-koecU=1MTeDCo7Pq~-?a`YbUq37z8kY|D
z-@b6z`}N}Z`xWoYYv<|bUym;S>~6ihPM?3eb~*SDFRs3NccHbme6Tgy7_+^3&)aK0
Ge)b!#0Mjl2
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/as-image/green_square.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 100 100">
+  <svg><rect width="100%" height="100%" fill="#00FF00"/></svg>
+</svg>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..adb1bed7f0ea5ae6f48228ff191024be64eda6de
GIT binary patch
literal 47519
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
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-alpha-ref.html
@@ -0,0 +1,62 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<style>
+.reftest {
+  background-color: rgba(0, 255, 0, 0.5);
+}
+
+.child {
+  width: 100px;
+  height: 100px;
+  opacity: 0.5;
+  background-color: rgb(0, 127, 0);
+}
+
+.topleft {
+  float:left;
+
+  width: 100px;
+  height: 100px;
+
+  /*First blend black rect with green in place*/
+  /* Cs = (1 - αb) x Cs + αb x B(Cb, Cs)*/
+  /* B(Cb, Cs) = | Cb - Cs | = (0, 0, 0) */
+  /* 0.5 * (0, 255, 0) + 0.5 * (0, 0, 0) = (0, 127.5, 0)*/
+
+  /* Now, composite the resulting color with src-over; the alpha is the original alpha for the top layer
+    while the color is the blending result*/
+  /* co = αs x Fa x Cs + αb x Fb x Cb  - this is premultiplied */
+  /* αo = αs + αb x (1 – αs) */
+  /* Source over:     Fa = 1; Fb = 1 – αs */
+  /*co = 0.5 * 1 * (0, 127.5, 0) + 0.5 * 0.5 * (0, 255, 0) = (0, 63.5, 0) + 0.25 * (0, 255, 0) = (0, 127.5, 0)*/
+  /*ao = 0.5 + 0.5 * 0.5 = 0.75*/
+  /* Co = co/ao = (0, 127.5, 0) / 0.75*/
+
+  /* Now alpha composite on white background */
+  /*co = 0.75 * 1 * (0, 127.5, 0) / 0.75 + 1 * 0.25 * (255, 255, 255) = (0, 127.5, 0) + (63.75, 63.75, 63.75) = (63.75, 159, 63.75) = (64, 191, 64) */
+
+  background-color: rgb(64, 191, 64);
+}
+
+.topright {
+  float:left;
+  width: 100px;
+  height: 100px;
+}
+
+.bottom {
+  width:200px;
+  height: 100px;
+  clear:both;
+}
+
+</style>
+
+<div class="topleft"></div>
+<div class="reftest topright"></div>
+<div class="reftest bottom"></div>
+
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-alpha.html
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<style>
+.reftest {
+  width: 200px;
+  height: 200px;
+  background-size: 100px 100px, 200px 200px;
+  background-repeat: no-repeat;
+}
+
+.blend {
+  background-image: url(as-image/green100x100_alpha.png);
+  background-color: rgba(0, 255, 0, 0.5);
+  background-blend-mode: difference;
+}
+
+</style>
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color-burn-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(127,0,0,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="40" width="40" height="40" fill="rgba(0,127,0,1)"></rect>
+<rect x="0" y="80" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="80" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="80" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="80" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="0" y="120" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="120" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="120" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="120" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color-burn.html
@@ -0,0 +1,16 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+
+<link rel="stylesheet" href="blend-modes.css" type="text/css" />
+
+<style>
+.blend {
+  background-blend-mode: color-burn;
+}
+</style>
+
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color-dodge-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(255,127,0,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="40" width="40" height="40" fill="rgba(127,255,0,1)"></rect>
+<rect x="0" y="80" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="80" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="80" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="80" width="40" height="40" fill="rgba(127,127,0,1)"></rect>
+<rect x="0" y="120" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="120" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="120" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="120" width="40" height="40" fill="rgba(253,253,0,1)"></rect>
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color-dodge.html
@@ -0,0 +1,14 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<link rel="stylesheet" href="blend-modes.css" type="text/css" />
+
+<style>
+.blend {
+  background-blend-mode: color-dodge;
+}
+</style>
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(255,105,105,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(93,0,0,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(255,52,52,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(0,131,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,48,0,1)"></rect>
+<rect x="120" y="40" width="40" height="40" fill="rgba(0,192,0,1)"></rect>
+<rect x="0" y="80" width="40" height="40" fill="rgba(55,55,255,1)"></rect>
+<rect x="40" y="80" width="40" height="40" fill="rgba(137,137,255,1)"></rect>
+<rect x="80" y="80" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="80" width="40" height="40" fill="rgba(95,95,255,1)"></rect>
+<rect x="0" y="120" width="40" height="40" fill="rgba(86,86,0,1)"></rect>
+<rect x="40" y="120" width="40" height="40" fill="rgba(164,164,37,1)"></rect>
+<rect x="80" y="120" width="40" height="40" fill="rgba(31,31,0,1)"></rect>
+<rect x="120" y="120" width="40" height="40" fill="rgba(127,127,0,1)"></rect>
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-color.html
@@ -0,0 +1,14 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<link rel="stylesheet" href="blend-modes.css" type="text/css" />
+
+<style>
+.blend {
+  background-blend-mode: color;
+}
+</style>
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-darken-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(255,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(127,0,0,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,255,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="120" y="40" width="40" height="40" fill="rgba(0,127,0,1)"></rect>
+<rect x="0" y="80" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="40" y="80" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="80" y="80" width="40" height="40" fill="rgba(0,0,255,1)"></rect>
+<rect x="120" y="80" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="0" y="120" width="40" height="40" fill="rgba(127,0,0,1)"></rect>
+<rect x="40" y="120" width="40" height="40" fill="rgba(0,127,0,1)"></rect>
+<rect x="80" y="120" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="120" y="120" width="40" height="40" fill="rgba(127,127,0,1)"></rect>
+</svg> 
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-darken.html
@@ -0,0 +1,14 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<link rel="stylesheet" href="blend-modes.css" type="text/css" />
+
+<style>
+.blend {
+  background-blend-mode: darken;
+}
+</style>
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-difference-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(255,255,0,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(255,0,255,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(128,127,0,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(255,255,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,255,255,1)"></rect>
+<rect x="120" y="40" width="40" height="40" fill="rgba(127,128,0,1)"></rect>
+<rect x="0" y="80" width="40" height="40" fill="rgba(255,0,255,1)"></rect>
+<rect x="40" y="80" width="40" height="40" fill="rgba(0,255,255,1)"></rect>
+<rect x="80" y="80" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="120" y="80" width="40" height="40" fill="rgba(127,127,255,1)"></rect>
+<rect x="0" y="120" width="40" height="40" fill="rgba(128,127,0,1)"></rect>
+<rect x="40" y="120" width="40" height="40" fill="rgba(127,128,0,1)"></rect>
+<rect x="80" y="120" width="40" height="40" fill="rgba(127,127,255,1)"></rect>
+<rect x="120" y="120" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-difference.html
@@ -0,0 +1,14 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<link rel="stylesheet" href="blend-modes.css" type="text/css" />
+
+<style>
+.blend {
+  background-blend-mode: difference;
+}
+</style>
+<div class="reftest blend"></div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-blending/background-blending-exclusion-ref.svg
@@ -0,0 +1,22 @@
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+<rect x="0" y="0" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="40" y="0" width="40" height="40" fill="rgba(255,255,0,1)"></rect>
+<rect x="80" y="0" width="40" height="40" fill="rgba(255,0,255,1)"></rect>
+<rect x="120" y="0" width="40" height="40" fill="rgba(128,127,0,1)"></rect>
+<rect x="0" y="40" width="40" height="40" fill="rgba(255,255,0,1)"></rect>
+<rect x="40" y="40" width="40" height="40" fill="rgba(0,0,0,1)"></rect>
+<rect x="80" y="40" width="40" height="40" fill="rgba(0,255,255,1)"></rect>