merge of add-jquery gloda-facet
authorAndrew Sutherland <asutherland@asutherland.org>
Tue, 08 Sep 2009 20:54:00 -0700
branchgloda-facet
changeset 3712 d9ad1f4f89510a5bc894cdffbe3d6fac711f316c
parent 3709 d2c5de1e686be51ea98b5b14992e3ca9998e4bb3 (current diff)
parent 3711 97610babc9e74367f2b1da7fe939ba0bff905009 (diff)
child 3713 c2693c7d8fb534befee5de9cad366eb78d1b1816
child 3717 03a6d5fd16f10d1c184355bbe2c61f70356b2cfd
push idunknown
push userunknown
push dateunknown
merge of add-jquery
.hgpatchinfo/gloda-facet.dep
mail/base/content/folderDisplay.js
mail/locales/en-US/chrome/messenger/messenger.dtd
--- a/.hgpatchinfo/add-jquery.dep
+++ b/.hgpatchinfo/add-jquery.dep
@@ -1,1 +1,1 @@
-3786d789303cc727aabf6728454556705232a33e
\ No newline at end of file
+668c342deb663372479da9e47656295941ae6815
\ No newline at end of file
--- a/.hgpatchinfo/add-protovis.dep
+++ b/.hgpatchinfo/add-protovis.dep
@@ -1,1 +1,1 @@
-23f393649289dd4774ddd1d231b01e1de8a75cfe
\ No newline at end of file
+9b7f6edb75fa33f6ebdb8bbddca9251126fc6a26
\ No newline at end of file
--- a/.hgpatchinfo/gloda-facet.dep
+++ b/.hgpatchinfo/gloda-facet.dep
@@ -1,1 +1,1 @@
-45fbab07d8b3e6cf7fb227e5783b1a5dcdc141d5
\ No newline at end of file
+97610babc9e74367f2b1da7fe939ba0bff905009
\ No newline at end of file
--- a/calendar/base/content/agenda-listbox.js
+++ b/calendar/base/content/agenda-listbox.js
@@ -163,63 +163,41 @@ function onCheckboxChange(event) {
 
 /**
  * Handler function called when an agenda listbox item is selected
  *
  * @param aListItem     The agenda-base-richlist-item that was selected.
  */
 agendaListbox.onSelect =
 function onSelect(aListItem) {
-    var listbox = document.getElementById("agenda-listbox");
-    listbox.focus();
-    listbox.removeAttribute("disabled");
-    var item = aListItem || listbox.selectedItem;
+    let listbox = document.getElementById("agenda-listbox");
+    let item = aListItem || listbox.selectedItem;
     if (aListItem) {
         listbox.selectedItem = item;
     }
-    if (item) {
-        item.removeAttribute("disabled");
-    }
     calendarController.onSelectionChanged({detail: agendaListbox.getSelectedItems()});
 }
 
 /**
  * Handler function called when the agenda listbox becomes focused
  */
 agendaListbox.onFocus =
 function onFocus() {
-    var listbox = document.getElementById("agenda-listbox");
-    listbox.removeAttribute("disabled");
-    this.enableListItems();
+    let listbox = document.getElementById("agenda-listbox");
     calendarController.onSelectionChanged({detail: agendaListbox.getSelectedItems()});
 }
 
 /**
  * Handler function called when the agenda listbox loses focus.
  */
 agendaListbox.onBlur =
 function onBlur() {
-    var item  = document.getElementById("agenda-listbox").selectedItem;
-    if (item) {
-        item.setAttribute("disabled","true");
-    }
     calendarController.onSelectionChanged({detail: []});
 }
 
-/**
- * Enables all child nodes of the agenda listbox
- */
-agendaListbox.enableListItems =
-function enableListItems() {
-    var childNodes = document.getElementById("agenda-listbox").childNodes;
-    for (var i = 0;i < childNodes.length; i++) {
-        var listItem = childNodes[i];
-        listItem.removeAttribute("disabled");
-    }
-}
 
 /**
  * Handler function called when a key was pressed on the agenda listbox
  */
 agendaListbox.onKeyPress =
 function onKeyPress(aEvent) {
     var listItem = aEvent.target;
     if (listItem.localName == "richlistbox") {
--- a/calendar/base/content/calendar-task-tree.xml
+++ b/calendar/base/content/calendar-task-tree.xml
@@ -879,19 +879,17 @@
            */
           onCalendarAdded: function tTO_onCalendarAdded(aCalendar) {
               if (!aCalendar.getProperty("disabled")) {
                   this.binding.onCalendarAdded(aCalendar);
               }
           },
 
           onCalendarRemoved: function tTO_onCalendarRemoved(aCalendar) {
-              if (!aCalendar.getProperty("disabled")) {
-                  this.binding.onCalendarRemoved(aCalendar);
-              }
+              this.binding.onCalendarRemoved(aCalendar);
           },
 
           onDefaultCalendarChanged: function tTO_onDefaultCalendarChanged(aNewDefaultCalendar) {}
       })
       ]]></field>
 
       <method name="observe">
         <parameter name="aSubject"/>
@@ -977,26 +975,24 @@
                 this.refreshFromCalendar(aCalendar, aFilter, false);
             }
         ]]></body>
       </method>
 
       <method name="onCalendarRemoved">
         <parameter name="aCalendar"/>
         <body><![CDATA[
-            if (!aCalendar.getProperty("disabled")) {
-                this.mTreeView.treebox.beginUpdateBatch();
-                let tasks = this.mTaskArray.concat([]);
-                for each (let task in tasks) {
-                    if (task.calendar.id == aCalendar.id) {
-                        this.mTreeView.removeItem(task);
-                    }
+            this.mTreeView.treebox.beginUpdateBatch();
+            let tasks = this.mTaskArray.concat([]);
+            for each (let task in tasks) {
+                if (task.calendar.id == aCalendar.id) {
+                    this.mTreeView.removeItem(task);
                 }
-                this.mTreeView.treebox.endUpdateBatch();
             }
+            this.mTreeView.treebox.endUpdateBatch();
         ]]></body>
       </method>
 
       <method name="popRefreshQueue">
         <body><![CDATA[
           var pendingRefresh = this.mPendingRefresh;
           if (pendingRefresh) {
               if (calInstanceOf(pendingRefresh, Components.interfaces.calIOperation)) {
--- a/calendar/base/modules/calProviderUtils.jsm
+++ b/calendar/base/modules/calProviderUtils.jsm
@@ -415,20 +415,20 @@ cal.toRFC3339 = function toRFC3339(aDate
         }
     }
     return str;
 };
 
 /**
  * Observer bag implementation taking care to replay open batch notifications.
  */
-cal.observerBag = function calObserverBag(iid) {
+cal.ObserverBag = function calObserverBag(iid) {
     this.init(iid);
 };
-cal.observerBag.prototype = {
+cal.ObserverBag.prototype = {
     __proto__: cal.calListenerBag.prototype,
 
     mBatchCount: 0,
     notify: function calObserverBag_notify(func, args) {
         switch (func) {
             case "onStartBatch":
                  ++this.mBatchCount;
                  break;
@@ -478,17 +478,17 @@ cal.ProviderBase.prototype = {
 
     mID: null,
     mUri: null,
     mObservers: null,
     mProperties: null,
 
     initProviderBase: function cPB_initProviderBase() {
         this.wrappedJSObject = this;
-        this.mObservers = new cal.observerBag(Components.interfaces.calIObserver);
+        this.mObservers = new cal.ObserverBag(Components.interfaces.calIObserver);
         this.mProperties = {};
         this.mProperties.currentStatus = Components.results.NS_OK;
     },
 
     get observers cPB_observers_get() {
         return this.mObservers;
     },
 
--- a/calendar/base/src/calCachedCalendar.js
+++ b/calendar/base/src/calCachedCalendar.js
@@ -101,17 +101,17 @@ calCachedCalendarObserverHelper.prototyp
             this.home.mObservers.notify("onPropertyDeleting", [this.home, aName]);
         }
     }
 };
 
 function calCachedCalendar(uncachedCalendar) {
     this.wrappedJSObject = this;
     this.mSyncQueue = [];
-    this.mObservers = new cal.observerBag(Components.interfaces.calIObserver);
+    this.mObservers = new cal.ObserverBag(Components.interfaces.calIObserver);
     uncachedCalendar.superCalendar = this;
     uncachedCalendar.addObserver(new calCachedCalendarObserverHelper(this, false));
     this.mUncachedCalendar = uncachedCalendar;
     this.setupCachedCalendar();
 
     if (this.supportsChangeLog) {
         var updateTimer = this.getProperty("cache.updateTimer");
         if (updateTimer === null) {
--- a/calendar/lightning/content/messenger-overlay-sidebar.js
+++ b/calendar/lightning/content/messenger-overlay-sidebar.js
@@ -107,20 +107,20 @@ var calendarTabType = {
       },
 
       onTitleChanged: function(aTab) {
         // Make sure the title is updated.
         // TODO We should move this to a dedicated string some time.
         aTab.title = document.getElementById("calendar-tab-button").getAttribute("tooltiptext");
       },
 
-      supportsCommand: function (aTab, aCommand) calendarController.supportsCommand(aCommand),
-      isCommandEnabled: function (aTab, aCommand) calendarController.isCommandEnabled(aCommand),
-      doCommand: function(aTab, aCommand) calendarController.doCommand(aCommand),
-      onEvent: function(aTab, aEvent) calendarController.onEvent(aEvent)
+      supportsCommand: function (aCommand, aTab) calendarController.supportsCommand(aCommand),
+      isCommandEnabled: function (aCommand, aTab) calendarController.isCommandEnabled(aCommand),
+      doCommand: function(aCommand, aTab) calendarController.doCommand(aCommand),
+      onEvent: function(aEvent, aTab) calendarController.onEvent(aEvent)
     },
 
     tasks: {
       type: "tasks",
       maxTabs: 1,
       openTab: function(aTab, aArgs) {
         aTab.title = aArgs["title"];
         if (!("background" in aArgs) || !aArgs["background"]) {
@@ -148,20 +148,20 @@ var calendarTabType = {
         };
       },
 
       restoreTab: function(aTabmail, aState) {
         aState.title = document.getElementById('task-tab-button').getAttribute('tooltiptext');
         aTabmail.openTab('tasks', aState);
       },
 
-      supportsCommand: function (aTab, aCommand) calendarController.supportsCommand(aCommand),
-      isCommandEnabled: function (aTab, aCommand) calendarController.isCommandEnabled(aCommand),
-      doCommand: function(aTab, aCommand) calendarController.doCommand(aCommand),
-      onEvent: function(aTab, aEvent) calendarController.onEvent(aEvent)
+      supportsCommand: function (aCommand, aTab) calendarController.supportsCommand(aCommand),
+      isCommandEnabled: function (aCommand, aTab) calendarController.isCommandEnabled(aCommand),
+      doCommand: function(aCommand, aTab) calendarController.doCommand(aCommand),
+      onEvent: function(aEvent, aTab) calendarController.onEvent(aEvent)
     },
   },
 
   /* because calendar does some direct menu manipulation, we need to change
    *  to the mail mode to clean up after those hacks.
    */
   saveTabState: function(aTab) {
     ltnSwitch2Mail();
--- a/calendar/lightning/install.rdf
+++ b/calendar/lightning/install.rdf
@@ -6,17 +6,17 @@
 
   <Description about="urn:mozilla:install-manifest">
     <!-- Target Application this extension can install into, 
         with minimum and maximum supported versions. --> 
     <em:targetApplication>
       <Description>
         <!-- thunderbird -->
         <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
-        <em:minVersion>3.0b3</em:minVersion>
+        <em:minVersion>3.0b4pre</em:minVersion>
         <em:maxVersion>@THUNDERBIRD_VERSION@</em:maxVersion>
       </Description>
     </em:targetApplication>
 
 #if LIGHTNING_FIREFOX
     <!-- We only allow installation of Lightning into Firefox for ease of
        - development. You can edit the JS and then click reload in Firefox as
        - opposed to having to restart Thunderbird after each edit. -->
--- a/calendar/providers/composite/calCompositeCalendar.js
+++ b/calendar/providers/composite/calCompositeCalendar.js
@@ -99,18 +99,18 @@ calCompositeCalendarObserverHelper.proto
     }
 };
 
 function calCompositeCalendar () {
     this.mObserverHelper = new calCompositeCalendarObserverHelper(this);
     this.wrappedJSObject = this;
 
     this.mCalendars = new Array();
-    this.mCompositeObservers = new cal.observerBag(Components.interfaces.calICompositeObserver);
-    this.mObservers = new cal.observerBag(Components.interfaces.calIObserver);
+    this.mCompositeObservers = new cal.ObserverBag(Components.interfaces.calICompositeObserver);
+    this.mObservers = new cal.ObserverBag(Components.interfaces.calIObserver);
     this.mDefaultCalendar = null;
     this.mStatusObserver = null;
 }
 
 calCompositeCalendar.prototype = {
     //
     // private members
     //
--- a/calendar/providers/memory/calMemoryCalendar.js
+++ b/calendar/providers/memory/calMemoryCalendar.js
@@ -59,17 +59,17 @@ calMemoryCalendar.prototype = {
     // 
     QueryInterface: function (aIID) {
         return doQueryInterface(this, calMemoryCalendar.prototype, aIID,
                                 [Components.interfaces.calISyncWriteCalendar,
                                  Components.interfaces.calICalendarProvider]);
     },
 
     initMemoryCalendar: function() {
-        this.mObservers = new cal.observerBag(Components.interfaces.calIObserver);
+        this.mObservers = new cal.ObserverBag(Components.interfaces.calIObserver);
         this.mItems = {};
         this.mMetaData = new calPropertyBag();
     },
 
     //
     // calICalendarProvider interface
     //
     get prefChromeOverlay() {
--- a/editor/ui/dialogs/content/EdImageOverlay.xul
+++ b/editor/ui/dialogs/content/EdImageOverlay.xul
@@ -254,22 +254,32 @@
       </grid>
     </groupbox>
 
     <vbox>
       <groupbox align="start">
         <caption id="alignLabel" label="&alignment.label;"/>
         <menulist id="alignTypeSelect" class="align-menu">
           <menupopup>
-            <menuitem class="align-menu" value="top"    label="&topPopup.value;"/>
-            <menuitem class="align-menu" value="middle" label="&centerPopup.value;"/>
-            <menuitem class="align-menu" value="bottom" label="&bottomPopup.value;"/>
+            <menuitem class="align-menu menuitem-iconic"
+                      value="top"
+                      label="&topPopup.value;"/>
+            <menuitem class="align-menu menuitem-iconic"
+                      value="middle"
+                      label="&centerPopup.value;"/>
+            <menuitem class="align-menu menuitem-iconic"
+                      value="bottom"
+                      label="&bottomPopup.value;"/>
             <!-- HTML attribute value is opposite of the button label on purpose -->
-            <menuitem class="align-menu" value="right"  label="&wrapLeftPopup.value;"/>
-            <menuitem class="align-menu" value="left"   label="&wrapRightPopup.value;"/>
+            <menuitem class="align-menu menuitem-iconic"
+                      value="right"
+                      label="&wrapLeftPopup.value;"/>
+            <menuitem class="align-menu menuitem-iconic"
+                      value="left"
+                      label="&wrapRightPopup.value;"/>
           </menupopup>
         </menulist>
       </groupbox>
 
       <groupbox>
         <caption id="imagemapLabel" label="&imagemapBox.label;"/>
         <hbox equalsize="always">
 
--- a/mail/app/profile/all-thunderbird.js
+++ b/mail/app/profile/all-thunderbird.js
@@ -462,8 +462,12 @@ pref("mail.compose.attachment_reminder",
 // Words that should trigger a missing attachments warning.
 pref("mail.compose.attachment_reminder_keywords", "chrome://messenger/locale/messengercompose/composeMsgs.properties");
 
 pref("browser.formfill.enable", true);
 // Override the all.js values so that unit tests pass and we get sane values.
 pref("browser.history_expire_days", 180);
 pref("browser.history_expire_days_min", 90);
 pref("browser.history_expire_sites", 40000);
+
+// Disable autoplay as we don't handle audio elements in emails very well.
+// See bug 515082.
+pref("media.autoplay.enabled", false);
--- a/mail/base/content/SearchDialog.js
+++ b/mail/base/content/SearchDialog.js
@@ -639,22 +639,16 @@ function MoveMessageInSearch(destFolder)
   }
 }
 
 function GoToFolder()
 {
   MsgOpenNewWindowForFolder(gFolderDisplay.selectedMessage);
 }
 
-function BeginDragThreadPane(event)
-{
-    // no search pane dnd yet
-    return false;
-}
-
 function saveAsVirtualFolder()
 {
   var searchFolderURIs = window.arguments[0].folder.URI;
 
   var searchSubfolders = document.getElementById("checkSearchSubFolders").checked;
   if (gCurrentFolder && (searchSubfolders || gCurrentFolder.isServer || gCurrentFolder.noSelect))
   {
     var subFolderURIs = AddSubFoldersToURI(gCurrentFolder);
--- a/mail/base/content/SearchDialog.xul
+++ b/mail/base/content/SearchDialog.xul
@@ -62,17 +62,16 @@
   <script type="application/x-javascript" src="chrome://messenger/content/messageDisplay.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/threadPane.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/msgMail3PaneWindow.js"/>
   <script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/mailCommands.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/mailWindowOverlay.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/commandglue.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/SearchDialog.js"/>
-  <script type="application/x-javascript" src="chrome://messenger/content/messengerdnd.js"/>
 
   <!-- We need this for a SetFolderPicker call, until we de-rdfify this file -->
   <script type="application/x-javascript" src="chrome://messenger/content/msgFolderPickerOverlay.js"/>
   <script type="application/x-javascript" src="chrome://messenger/content/widgetglue.js"/>
 
   <commands id="commands">
     <commandset id="mailSearchItems"
                 commandupdater="true"
@@ -120,18 +119,18 @@
 
          <hbox align="center">
            <checkbox id="checkSearchSubFolders" label="&searchSubfolders.label;" checked="true" accesskey="&searchSubfolders.accesskey;"/>
            <spacer flex="10"/>
            <button label="&resetButton.label;" oncommand="onResetSearch(event);" accesskey="&resetButton.accesskey;"/>
          </hbox>
          <hbox align="center">
            <checkbox id="checkSearchOnline"
-                     label="&searchOnline.label;"
-                     accesskey="&searchOnline.accesskey;"
+                     label="&searchOnServer.label;"
+                     accesskey="&searchOnServer.accesskey;"
                      oncommand="updateSearchLocalSystem();"/>
          </hbox>
       </vbox>
 
       <hbox flex="1">
         <vbox id="searchTermListBox" flex="1"/>
       </hbox>
     </vbox>
@@ -196,17 +195,17 @@
                      label="&totalColumn.label;" tooltiptext="&totalColumn.tooltip;"/>
             <splitter class="tree-splitter"/>
             <treecol id="locationCol" persist="width" flex="1" hidden="true" ignoreincolumnpicker="true"
                      label="&locationColumn.label;" tooltiptext="&locationColumn.tooltip;"/>
             <splitter class="tree-splitter"/>
             <treecol id="idCol" persist="hidden ordinal width" flex="1" hidden="true"
                      label="&idColumn.label;" tooltiptext="&idColumn.tooltip;"/>
           </treecols>
-          <treechildren ondraggesture="BeginDragThreadPane(event);"/>
+          <treechildren ondraggesture="ThreadPaneOnDragStart(event);"/>
         </tree>
       </vbox>
       <hbox align="start"> 
         <button label="&openButton.label;" id="openButton" command="cmd_open" accesskey="&openButton.accesskey;"/>
         <button id="fileMessageButton" type="menu" label="&fileButton.label;"
                 accesskey="&fileButton.accesskey;"
                 observes="file_message_button"
                 oncommand="MoveMessageInSearch(event.target)">
--- a/mail/base/content/aboutDialog.js
+++ b/mail/base/content/aboutDialog.js
@@ -82,13 +82,28 @@ function switchPage(aEvent) {
                         document.documentElement.getAttribute("creditsaccesskey"));
     gSelectedPage = 0;
   }
   document.getElementById("modes").setAttribute("selectedIndex", gSelectedPage);
 }
 
 function loadAbout(type)
 {
-  window.openDialog("chrome://messenger/content/", "_blank",
-                    "chrome,dialog=no,all", null,
-                    { tabType: "contentTab",
-                      tabParams: { contentPage: "about:" + type } });
+  let tabmail = document.getElementById("tabmail");
+  if (!tabmail) {
+    // Try opening new tabs in an existing 3pane window
+    let mail3PaneWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+                                    .getService(Components.interfaces.nsIWindowMediator)
+                                    .getMostRecentWindow("mail:3pane");
+    if (mail3PaneWindow) {
+      tabmail = mail3PaneWindow.document.getElementById("tabmail");
+      mail3PaneWindow.focus();
+    }
+  }
+
+  if (tabmail)
+    tabmail.openTab("contentTab", {contentPage: "about:" + type});
+  else
+    window.openDialog("chrome://messenger/content/", "_blank",
+                      "chrome,dialog=no,all", null,
+                      { tabType: "contentTab",
+                        tabParams: {contentPage: "about:" + type} });
 }
--- a/mail/base/content/folderDisplay.js
+++ b/mail/base/content/folderDisplay.js
@@ -958,16 +958,39 @@ FolderDisplayWidget.prototype = {
     }
 
     // - new messages
     // if configured to scroll to new messages, try that
     if (gPrefBranch.getBoolPref("mailnews.scroll_to_new_message") &&
         this.navigate(nsMsgNavigationType.firstNew, /* select */ false))
       return;
 
+    // - last selected message
+    // if configured to load the last selected message (this is currently more
+    //  persistent than our saveSelection/restoreSelection stuff), and the view
+    //  is backed by a single underlying folder (the only way having just a
+    //  message key works out), try that
+    if (gPrefBranch.getBoolPref("mailnews.remember_selected_message") &&
+        this.view.isSingleFolder) {
+      // use the displayed folder; nsMsgDBView goes to the effort to save the
+      //  state to the viewFolder, so this is the correct course of action.
+      let lastLoadedMessageKey = this.view.displayedFolder.lastMessageLoaded;
+      if (lastLoadedMessageKey != nsMsgKey_None) {
+        this.view.dbView.selectMsgByKey(lastLoadedMessageKey);
+        // The message key may not be present in the view for a variety of
+        //  reasons.  Beyond message deletion, it simply may not match the
+        //  active mail view or quick search, for example.
+        if (this.view.dbView.numSelected > 0) {
+          this.ensureRowIsVisible(
+            this.view.dbView.viewIndexForFirstSelectedMsg);
+          return;
+        }
+      }
+    }
+
     // - towards the newest messages, but don't select
     if (this.view.isSortedAscending && this.view.sortImpliesTemporalOrdering &&
       this.navigate(nsMsgNavigationType.lastMessage, /* select */ false))
       return;
 
     // - to the top, the coliseum
     this.ensureRowIsVisible(0);
   },
--- a/mail/base/content/folderPane.js
+++ b/mail/base/content/folderPane.js
@@ -32,16 +32,18 @@
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 Components.utils.import("resource://gre/modules/iteratorUtils.jsm");
 Components.utils.import("resource://gre/modules/folderUtils.jsm");
 
+const kDefaultMode = "smart";
+
 /**
  * This file contains the controls and functions for the folder pane.
  * The following definitions will be useful to know:
  *
  * gFolderTreeView - the controller for the folder tree.
  * ftvItem  - folder tree view item, representing a row in the tree
  * mode - folder view type, e.g., all folders, favorite folders, MRU...
  */
@@ -71,17 +73,18 @@ let gFolderTreeView = {
 
     try {
       // Normally our tree takes care of keeping the last selected by itself.
       // However older versions of TB stored this in a preference, which we need
       // to migrate
       let prefB = Cc["@mozilla.org/preferences-service;1"]
                      .getService(Ci.nsIPrefBranch);
       let modeIndex = prefB.getIntPref("mail.ui.folderpane.view");
-      this._mode = this._modeNames[modeIndex];
+      // upgrade default All to Smart
+      this._mode = (modeIndex == 0) ? kDefaultMode : this._modeNames[modeIndex];
       prefB.deleteBranch("mail.ui.folderpane");
     } catch(ex) {
       // This is ok.  If we've already migrated we'll end up here
     }
 
     if (document.getElementById('folderpane-title')) {
       let string;
         if (this._mode in this._modeDisplayNames)
@@ -180,17 +183,17 @@ let gFolderTreeView = {
    * @param aCommonName  the common-name with which the mode was previously
    *                     registered
    */
   unregisterMode: function ftv_unregisterMode(aCommonName) {
     this._modeNames.splice(this._modeNames.indexOf(aCommonName), 1);
     delete this._mapGenerators[aCommonName];
     delete this._modeDisplayNames[aCommonName];
     if (this._mode == aCommonName)
-      this.mode = "all";
+      this.mode = kDefaultMode;
   },
 
   /**
    * Called to move to the next/prev folder-mode in the list
    *
    * @param aForward  whether or not we should move forward in the list
    */
   cycleMode: function ftv_cycleMode(aForward) {
@@ -234,17 +237,17 @@ let gFolderTreeView = {
    * correspond to an entry in _mapGenerators
    */
   _mode: null,
   get mode() {
     if (!this._mode) {
       this._mode = this._treeElement.getAttribute("mode");
       // this can happen when an extension is removed
       if (!(this._mode in this._mapGenerators))
-        this._mode = "all";
+        this._mode = kDefaultMode;
     }
     return this._mode;
   },
   set mode(aMode) {
     this._mode = aMode;
 
     let string;
     if (this._mode in this._modeDisplayNames)
@@ -767,33 +770,43 @@ let gFolderTreeView = {
     return folders;
   },
 
   _smartFoldersGenerator: function ftv_smartFoldersGenerator(ftv)
   {
     let map = [];
     let acctMgr = Components.classes["@mozilla.org/messenger/account-manager;1"]
                     .getService(Components.interfaces.nsIMsgAccountManager);
+    // Smart mode only makes sense if there's more than 1 incoming mail account,
+    // so check for that and fall back to "all folders" if we don't find a 2nd.
+    let accounts = gFolderTreeView._sortedAccounts();
+    let numMailAccounts = 0;
+    for each (let account in accounts) {
+      if (GetInboxFolder(account.incomingServer) != null)
+        numMailAccounts++;
+      if (numMailAccounts > 1)
+        break;
+    }
+    if (numMailAccounts <= 1)
+      return ftv._mapGenerators["all"](ftv);
     let smartServer;
     try {
       smartServer = acctMgr.FindServer("nobody", "smart mailboxes", "none");
     } catch (ex) {
       smartServer = acctMgr.createIncomingServer("nobody", "smart mailboxes", "none");
       // We don't want the "smart" server/account leaking out into the ui in
       // other places, so set it as hidden.
       smartServer.hidden = true;
       let account = acctMgr.createAccount();
       account.incomingServer = smartServer;
     }
     smartServer.prettyName = document.getElementById("bundle_messenger")
                              .getString("smartAccountName");
     smartServer.canHaveFilters = false;
 
-    let accounts = gFolderTreeView._sortedAccounts();
-
     let smartRoot = smartServer.rootFolder;
     let nsMsgFolderFlags = Components.interfaces.nsMsgFolderFlags;
     let smartChildren = new Array;
     gFolderTreeView._addSmartFoldersForFlag(smartChildren, accounts, smartRoot,
                                             nsMsgFolderFlags.Inbox, "Inbox");
     gFolderTreeView._addSmartFoldersForFlag(smartChildren, accounts, smartRoot,
                                             nsMsgFolderFlags.Drafts, "Drafts");
     gFolderTreeView._addSmartFoldersForFlag(smartChildren, accounts, smartRoot,
--- a/mail/base/content/mailContextMenus.js
+++ b/mail/base/content/mailContextMenus.js
@@ -123,38 +123,40 @@ function fillMailContextMenu(event)
   var selectedMessage = gFolderDisplay.selectedMessage;
   var isNewsgroup = gFolderDisplay.selectedMessageIsNews;
 
   // Don't show mail items for links/images, just show related items.
   var hideMailItems = !inThreadPane &&
                       (gContextMenu.onImage || gContextMenu.onLink);
   var single = (numSelected == 1);
 
+  let onPlayableMedia = gContextMenu.onVideo || gContextMenu.onAudio;
+
   // Select-all and copy are only available in the message-pane
-  if (inThreadPane) {
-    document.getElementById("mailContext-selectall").hidden = true;
-    document.getElementById("mailContext-copy").hidden = true;
-  }
+  ShowMenuItem("mailContext-selectall", !inThreadPane && !onPlayableMedia);
+  ShowMenuItem("mailContext-copy", !inThreadPane && !onPlayableMedia);
 
   // Show the Open in New Window  and New Tab options if there is exactly one
   // message selected.
   ShowMenuItem("mailContext-openNewWindow", single && inThreadPane);
   ShowMenuItem("threadPaneContext-openNewTab", single && inThreadPane);
 
   /**
    * Most menu items are visible if there's 1 or 0 messages selected, and
    * enabled if there's exactly one selected. Handle those here.
+   * Exception: playable media is selected, in which case, don't show them.
+   *
    * @param aID   the id of the element to display/enable
    * @param aHide (optional)  an additional criteria to evaluate when we
    *              decide whether to display the element. If false, we'll hide
    *              the item no matter what messages are selected
    */
  function setSingleSelection(aID, aHide) {
     var hide = aHide != undefined ? aHide : true;
-    ShowMenuItem(aID, single && !hideMailItems && hide);
+    ShowMenuItem(aID, single && !hideMailItems && hide && !onPlayableMedia);
     EnableMenuItem(aID, single);
   }
 
   setSingleSelection("mailContext-replySender");
   setSingleSelection("mailContext-editAsNew");
   setSingleSelection("mailContext-replyNewsgroup", isNewsgroup);
   setSingleSelection("mailContext-replyAll");
   setSingleSelection("mailContext-replyList");
@@ -167,46 +169,49 @@ function fillMailContextMenu(event)
   ShowMenuItem("mailContext-sep-open", single);
 
   ShowMenuItem("mailContext-sep-reply", true);
 
   let msgFolder = gFolderDisplay.displayedFolder;
 
   // Set up the move menu. We can't move from newsgroups.
   ShowMenuItem("mailContext-moveMenu",
-               !isNewsgroup && !hideMailItems && msgFolder);
+               !isNewsgroup && !hideMailItems && msgFolder && !onPlayableMedia);
 
   // disable move if we can't delete message(s) from this folder
   var canMove = msgFolder && msgFolder.canDeleteMessages;
-  EnableMenuItem("mailContext-moveMenu", canMove);
+  EnableMenuItem("mailContext-moveMenu", canMove && !onPlayableMedia);
 
   // Copy is available as long as something is selected.
-  ShowMenuItem("mailContext-copyMenu", !hideMailItems && msgFolder);
+  ShowMenuItem("mailContext-copyMenu",
+               !hideMailItems && msgFolder && !onPlayableMedia);
 
-  ShowMenuItem("mailContext-moveToFolderAgain", !hideMailItems && msgFolder);
-  if (!hideMailItems) {
+  let hideMoveToFolderAgain = !hideMailItems && msgFolder && !onPlayableMedia;
+  ShowMenuItem("mailContext-moveToFolderAgain", hideMoveToFolderAgain);
+  if (hideMoveToFolderAgain) {
     initMoveToFolderAgainMenu(document.getElementById("mailContext-moveToFolderAgain"));
     goUpdateCommand("cmd_moveToFolderAgain");
   }
 
   ShowMenuItem("paneContext-afterMove", !inThreadPane);
 
-  ShowMenuItem("mailContext-tags", !hideMailItems && msgFolder);
+  ShowMenuItem("mailContext-tags", !hideMailItems && msgFolder && !onPlayableMedia);
 
-  ShowMenuItem("mailContext-mark", !hideMailItems && msgFolder);
+  ShowMenuItem("mailContext-mark", !hideMailItems && msgFolder && !onPlayableMedia);
 
   setSingleSelection("mailContext-saveAs");
   if (Application.platformIsMac)
     ShowMenuItem("mailContext-printpreview", false);
   else
     setSingleSelection("mailContext-printpreview");
 
-  ShowMenuItem("mailContext-print", !hideMailItems);
+  ShowMenuItem("mailContext-print", !hideMailItems && !onPlayableMedia);
 
-  ShowMenuItem("mailContext-delete", !hideMailItems && (isNewsgroup || canMove));
+  ShowMenuItem("mailContext-delete",
+               !hideMailItems && (isNewsgroup || canMove) && !onPlayableMedia);
   // This function is needed for the case where a folder is just loaded (while
   // there isn't a message loaded in the message pane), a right-click is done
   // in the thread pane.  This function will disable enable the 'Delete
   // Message' menu item.
   goUpdateCommand('cmd_delete');
 
   setSingleSelection("mailContext-composeemailto",
                      gContextMenu.onMailtoLink && !inThreadPane);
--- a/mail/base/content/mailWindowOverlay.xul
+++ b/mail/base/content/mailWindowOverlay.xul
@@ -527,16 +527,32 @@
               label="&selectAllCmd.label;"
               accesskey="&selectAllCmd.accesskey;"
               command="cmd_selectAll"/>
     <menuitem id="mailContext-copy"
               label="&copyCmd.label;"
               accesskey="&copyCmd.accesskey;"
               command="cmd_copy"/>
     <menuseparator id="mailContext-sep-open"/>
+    <menuitem id="mailContext-media-play"
+              label="&contextPlay.label;"
+              accesskey="&contextPlay.accesskey;"
+              oncommand="gContextMenu.mediaCommand('play');"/>
+    <menuitem id="mailContext-media-pause"
+              label="&contextPause.label;"
+              accesskey="&contextPause.accesskey;"
+              oncommand="gContextMenu.mediaCommand('pause');"/>
+    <menuitem id="mailContext-media-mute"
+              label="&contextMute.label;"
+              accesskey="&contextMute.accesskey;"
+              oncommand="gContextMenu.mediaCommand('mute');"/>
+    <menuitem id="mailContext-media-unmute"
+              label="&contextUnmute.label;"
+              accesskey="&contextUnmute.accesskey;"
+              oncommand="gContextMenu.mediaCommand('unmute');"/>
     <menuitem id="mailContext-openNewWindow"
               label="&contextOpenNewWindow.label;"
               accesskey="&contextOpenNewWindow.accesskey;"
               oncommand="MsgOpenNewWindowForMessage();"/>
     <menuitem id="threadPaneContext-openNewTab"
               label="&contextOpenNewTab.label;"
               accesskey="&contextOpenNewTab.accesskey;"
               oncommand="OpenMessageInNewTab(event);"/>
@@ -1028,16 +1044,21 @@
             <menuseparator id="viewMenuAfterPaneVerticalSeparator"/>
             <menuitem id="menu_showMessage" type="checkbox" label="&showMessageCmd.label;" key="key_toggleMessagePane"
                       accesskey="&showMessageCmd.accesskey;" oncommand="MsgToggleMessagePane();"/>
           </menupopup>
         </menu>
         <menu id="menu_FolderViews" label="&folderView.label;" accesskey="&folderView.accesskey;">
           <menupopup id="menu_FolderViewsPopup"
                      onpopupshowing="InitViewFolderViewsMenu(event)">
+            <menuitem id="menu_allFolders" value="smart"
+                      label="&smartFolders.label;"
+                      accesskey="&smartFolders.accesskey;"
+                      type="radio" name="viewmessages"
+                      oncommand="gFolderTreeView.mode = this.value;"/>
             <menuitem id="menu_allFolders" value="all"
                       label="&allFolders.label;"
                       accesskey="&allFolders.accesskey;"
                       type="radio" name="viewmessages"
                       oncommand="gFolderTreeView.mode = this.value;"/>
             <menuitem id="menu_unreadFolders"
                       label="&unreadFolders.label;" value="unread"
                       accesskey="&unreadFolders.accesskey;"
--- a/mail/base/content/multimessageview.css
+++ b/mail/base/content/multimessageview.css
@@ -52,17 +52,16 @@
   background-repeat: no-repeat;
 }
 
 #content {
   position: absolute;
   top: 4em;
   right: 0;
   left: 0;
-  padding: 1em;
   z-index: -1;
   padding: 1ex 1em;
   margin: 0px;
   font-size: small;
 }
 
 .row {
   position: relative;
--- a/mail/base/content/multimessageview.xhtml
+++ b/mail/base/content/multimessageview.xhtml
@@ -54,18 +54,31 @@
     <head>
         <link rel="stylesheet" media="screen" type="text/css"
               href="chrome://messenger/skin/messageHeader.css"/>
         <link rel="stylesheet" media="screen" type="text/css"
               href="chrome://messenger/skin/multimessageview.css"/>
         <link rel="stylesheet" media="screen" type="text/css"
               href="chrome://messenger/skin/tagColors.css"/>
         <title>&window.title;</title>
+        <script type="application/x-javascript;version=1.8"><![CDATA[
+            function hookResize() {
+              // we need to hook into the resize event on the header to make the #content
+              // node shift down as it reflows.
+              let content = document.getElementById('content');
+              let heading = document.getElementById('heading');
+              window.addEventListener('resize',
+                function(e) {
+                  content.style.top = heading.getBoundingClientRect().height + 'px';
+              }, false);
+            }
+        ]]>
+        </script>
     </head>
-<body>
+<body onload="hookResize()">
     <div id="headingwrappertable">
         <div id="headingwrapper">
             <div id="buttonbox"
                  xmlns:html="http://www.w3.org/1999/xhtml"
                  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
                 <hbox id="buttonhbox" align="start">
                     <button id="archive"
                             class="button msgHeaderView-button hdrArchiveButton"
--- a/mail/base/content/nsContextMenu.js
+++ b/mail/base/content/nsContextMenu.js
@@ -41,25 +41,28 @@
 # ***** END LICENSE BLOCK *****
 
 function nsContextMenu(aXulMenu) {
   this.target         = null;
   this.menu           = null;
   this.onTextInput    = false;
   this.onImage        = false;
   this.onLoadedImage  = false;
+  this.onVideo        = false;
+  this.onAudio        = false;
   this.onLink         = false;
   this.onMailtoLink   = false;
   this.onSaveableLink = false;
   this.onMetaDataItem = false;
   this.onMathML       = false;
   this.link           = false;
   this.linkURL        = "";
   this.linkURI        = null;
   this.linkProtocol   = null;
+  this.mediaURL       = "";
   this.inFrame        = false;
   this.hasBGImage     = false;
   this.isContentSelected = false;
   this.inDirList      = false;
   this.shouldDisplay  = true;
 
   this.initMenu(aXulMenu);
 }
@@ -77,16 +80,17 @@ nsContextMenu.prototype = {
     this.setTarget(document.popupNode);
     this.isContentSelected = this.isContentSelection();
 
     this.initItems();
   },
   initItems : function CM_initItems() {
     this.initSaveItems();
     this.initClipboardItems();
+    this.initMediaPlayerItems();
   },
   initSaveItems : function CM_initSaveItems() {
     this.showItem("mailContext-savelink", this.onSaveableLink);
     this.showItem("mailContext-saveimage", this.onLoadedImage);
   },
   initClipboardItems : function CM_initClipboardItems() {
     // Copy depends on whether there is selected text.
     // Enabling this context menu item is now done through the global
@@ -95,16 +99,31 @@ nsContextMenu.prototype = {
     goUpdateGlobalEditMenuItems();
 
     this.showItem("mailContext-copy", this.isContentSelected || this.onTextInput);
     this.showItem("mailContext-selectall", true);
     this.showItem("mailContext-copyemail", this.onMailtoLink);
     this.showItem("mailContext-copylink", this.onLink);
     this.showItem("mailContext-copyimage", this.onImage);
   },
+  initMediaPlayerItems: function CM_initMediaPlayerItems() {
+    let onMedia = this.onVideo || this.onAudio;
+    // Several mutually exclusive items.... play/pause, mute/unmute, show/hide
+    this.showItem("mailContext-media-play", onMedia && this.target.paused);
+    this.showItem("mailContext-media-pause", onMedia && !this.target.paused);
+    this.showItem("mailContext-media-mute", onMedia && !this.target.muted);
+    this.showItem("mailContext-media-unmute", onMedia && this.target.muted);
+    if (onMedia) {
+      let hasError = this.target.error != null;
+      this.setItemAttr("mailContext-media-play", "disabled", hasError);
+      this.setItemAttr("mailContext-media-pause", "disabled", hasError);
+      this.setItemAttr("mailContext-media-mute", "disabled", hasError);
+      this.setItemAttr("mailContext-media-unmute", "disabled", hasError);
+    }
+  },
 
   /**
    * Set the nsContextMenu properties based on the selected node and
    * its ancestors.
    */
   setTarget : function CM_setTarget(aNode) {
     const xulNS =
       "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@@ -113,16 +132,19 @@ nsContextMenu.prototype = {
       return;
     }
     this.onImage        = false;
     this.onLoadedImage  = false;
     this.onMetaDataItem = false;
     this.onTextInput    = false;
     this.imageURL       = "";
     this.onLink         = false;
+    this.onVideo        = false;
+    this.onAudio        = false;
+    this.mediaURL       = "";
     this.linkURL        = "";
     this.linkURI        = null;
     this.linkProtocol   = null;
     this.onMathML       = false;
     this.inFrame        = false;
     this.hasBGImage     = false;
     this.bgImageURL     = "";
 
@@ -139,16 +161,22 @@ nsContextMenu.prototype = {
         if (request && (request.imageStatus & request.STATUS_SIZE_AVAILABLE))
           this.onLoadedImage = true;
 
         this.imageURL = this.target.currentURI.spec;
       } else if (this.target instanceof HTMLInputElement) {
         this.onTextInput = this.isTargetATextBox(this.target);
       } else if (this.target instanceof HTMLTextAreaElement) {
         this.onTextInput = true;
+      } else if (this.target instanceof HTMLVideoElement) {
+        this.onVideo = true;
+        this.mediaURL = this.target.currentSrc || this.target.src;
+      } else if (this.target instanceof HTMLAudioElement) {
+        this.onAudio = true;
+        this.mediaURL = this.target.currentSrc || this.target.src;
       } else if (this.target instanceof HTMLHtmlElement) {
         var bodyElt = this.target.ownerDocument.body;
         if (bodyElt) {
           var computedURL = this.getComputedURL(bodyElt, "background-image");
           if (computedURL) {
             this.hasBGImage = true;
             this.bgImageURL = this.makeURLAbsolute(bodyElt.baseURI,
                                                    computedURL);
@@ -524,10 +552,31 @@ nsContextMenu.prototype = {
       var sibling = separator.previousSibling;
       while (sibling && sibling.localName != "menuseparator") {
         if (sibling.getAttribute("hidden") != "true")
           return true;
         sibling = sibling.previousSibling;
       }
     }
     return false;
+  },
+
+  mediaCommand : function CM_mediaCommand(command) {
+    var media = this.target;
+
+    switch (command) {
+      case "play":
+        media.play();
+        break;
+      case "pause":
+        media.pause();
+        break;
+      case "mute":
+        media.muted = true;
+        break;
+      case "unmute":
+        media.muted = false;
+        break;
+      // XXX hide controls & show controls don't work in emails as Javascript is
+      // disabled. May want to consider later for RSS feeds.
+    }
   }
 };
--- a/mail/components/addrbook/content/abCommon.js
+++ b/mail/components/addrbook/content/abCommon.js
@@ -467,17 +467,17 @@ function DirPaneDoubleClick(event)
 
   if (dirTree && dirTree.view.selection && dirTree.view.selection.count == 1)
     AbEditSelectedDirectory();
 }
 
 function DirPaneSelectionChange()
 {
   // clear out the search box when changing folders...
-  onClearSearch();
+  onAbClearSearch();
   if (dirTree && dirTree.view.selection && dirTree.view.selection.count == 1) {
     gPreviousDirTreeIndex = dirTree.currentIndex;
     ChangeDirectoryByURI(GetSelectedDirectory());
   }
   goUpdateCommand('cmd_newlist');
 }
 
 function ChangeDirectoryByURI(uri)
@@ -622,64 +622,24 @@ function GetSelectedDirectory()
 }
 
 function onAbClearSearch()
 {
   gSearchInput.value = "";
   onEnterInSearchBar();
 }
 
-function onSearchInputFocus(event)
-{
-  // search bar has focus, ...clear the showing search criteria flag
-  if (gSearchInput.showingSearchCriteria)
-  {
-    gSearchInput.value = "";
-    gSearchInput.showingSearchCriteria = false;
-  }
-}
-
 // sets focus into the quick search box
 function QuickSearchFocus()
 {
   gSearchInput.focus();
   gSearchInput.select();
 }
 
-function onSearchInputBlur(event)
-{
-//  if (gQuickSearchFocusEl && gQuickSearchFocusEl.id == 'searchInput') // ignore the blur if we are in the middle of processing the clear button
-//    return;
-
-  if (!gSearchInput.value)
-    gSearchInput.showingSearchCriteria = true;
-
-  if (gSearchInput.showingSearchCriteria)
-    gSearchInput.setSearchCriteriaText();
-}
-
 var gQuickSearchFocusEl = null;
-
-function onClearSearch()
-{
-  if (gSearchInput && !gSearchInput.showingSearchCriteria) // ignore the text box value if it's just showing the search criteria string
-  {
-     onAbClearSearch();
-     // this needs to be on a timer otherwise we end up messing up the focus while the Search("") is still happening
-     setTimeout(restoreSearchFocusAfterClear, 0);
-  }
-}
-
-function restoreSearchFocusAfterClear()
-{
-//  gQuickSearchFocusEl.focus();
-  gSearchInput.clearButtonHidden = 'true';
-  gQuickSearchFocusEl = null;
-}
-
 var gIsOffline;
 var gSessionAdded;
 var gCurrentAutocompleteDirectory;
 var gAutocompleteSession;
 var gSetupLdapAutocomplete;
 var gLDAPSession;
 
 function setupLdapAutocompleteSession()
--- a/mail/components/addrbook/content/abContactsPanel.js
+++ b/mail/components/addrbook/content/abContactsPanel.js
@@ -86,17 +86,17 @@ function AddressBookMenuListChange()
     onEnterInSearchBar();
   else 
     ChangeDirectoryByURI(document.getElementById('addressbookList').value);
 }
 
 function AbPanelOnComposerClose()
 {
   CloseAbView();
-  onClearSearch();
+  onAbClearSearch();
 }
 
 function AbPanelOnComposerReOpen()
 {
   SetAbView(GetSelectedDirectory());
 }
 
 function AbPanelLoad() 
@@ -114,17 +114,17 @@ function AbPanelLoad()
   abPopup.value = temp;
   if (!abPopup.selectedItem)
     abPopup.selectedIndex = 0;
 
   ChangeDirectoryByURI(abPopup.value);
 
   parent.addEventListener("compose-window-close", AbPanelOnComposerClose, true);
   parent.addEventListener("compose-window-reopen", AbPanelOnComposerReOpen, true);
-  gSearchInput = document.getElementById("searchInput");
+  gSearchInput = document.getElementById("peopleSearchInput");
 }
 
 function AbPanelUnload()
 {
   parent.removeEventListener("compose-window-close", AbPanelOnComposerClose, true);
   parent.removeEventListener("compose-window-reopen", AbPanelOnComposerReOpen, true);
 
   CloseAbView();
--- a/mail/components/addrbook/content/abContactsPanel.xul
+++ b/mail/components/addrbook/content/abContactsPanel.xul
@@ -88,27 +88,21 @@
                 persist="value">
         <menupopup id="addressbookList-menupopup" class="addrbooksPopup"/>
       </menulist>
     </hbox>
 
     <separator class="thin"/>
 
     <vbox>
-      <label value="&searchInput.label;" accesskey="&searchInput.accesskey;" control="searchInput"/>
-      <textbox id="searchInput" flex="1" type="timed" timeout="800"
-               onfocus="onSearchInputFocus(event);"
-               onblur="onSearchInputBlur(event);" clickSelectsAll="true"
-               oncommand="onEnterInSearchBar();" chromedir="&locale.dir;">
-        <button id="quick-search-button" type="menu" chromedir="&locale.dir;">
-          <menupopup id="quick-search-menupopup" value="0" persist="value" popupalign="topleft" popupanchor="bottomleft">
-            <menuitem value="0" label="&SearchNameOrEmail.label;" type="radio"/>
-          </menupopup>
-        </button>
-      </textbox>
+      <label value="&searchInput.label;" accesskey="&searchInput.accesskey;"
+             control="peopleSearchInput"/>
+      <textbox id="peopleSearchInput" flex="1" type="search" timeout="800"
+               emptytext="&SearchNameOrEmail.label;" clickSelectsAll="true"
+               oncommand="onEnterInSearchBar();" chromedir="&locale.dir;"/>
     </vbox>
 
     <separator class="thin"/>
 
     <tree id="abResultsTree" flex="1" context="cardProperties" class="plain" sortCol="GeneratedName" persist="sortCol"
           onclick="contactsListOnClick(event);">
       <treecols>
         <!-- these column ids must match up to the mork column names, see nsIAddrDatabase.idl -->
--- a/mail/components/addrbook/content/addressbook.js
+++ b/mail/components/addrbook/content/addressbook.js
@@ -165,17 +165,17 @@ function OnLoadAddressBook()
     document.documentElement.setAttribute("screenX", screen.availLeft);
     document.documentElement.setAttribute("screenY", screen.availTop);
   }
   setTimeout(delayedOnLoadAddressBook, 0); // when debugging, set this to 5000, so you can see what happens after the window comes up.
 }
 
 function delayedOnLoadAddressBook()
 {
-  gSearchInput = document.getElementById("searchInput");
+  gSearchInput = document.getElementById("peopleSearchInput");
 
   verifyAccounts(null, false);   // this will do migration, if we need to.
 
   InitCommonJS();
 
   GetCurrentPrefs();
 
   // FIX ME - later we will be able to use onload from the overlay
--- a/mail/components/addrbook/content/addressbook.xul
+++ b/mail/components/addrbook/content/addressbook.xul
@@ -559,27 +559,21 @@
       <toolbarbutton class="toolbarbutton-1" id="button-newmessage" label="&newmsgButton.label;" tooltiptext="&newmsgButton.tooltip;" oncommand="AbNewMessage();"/>
       <toolbarbutton class="toolbarbutton-1" id="button-newim" label="&newIM.label;" tooltiptext="&newIM.tooltip;" oncommand="AbIMSelected();"/>
       <toolbarbutton class="toolbarbutton-1" id="button-abdelete"
                      observes="button_delete" label="&deleteButton2.label;"
                      tooltiptext="&deleteButton2.tooltip;"
                      oncommand="goDoCommand('button_delete');"/>
 
       <toolbaritem id="search-container" title="&searchItem.title;" align="center" class="chromeclass-toolbar-additional">
-        <textbox id="searchInput" flex="1" timeout="800"
-                 onfocus="onSearchInputFocus(event);"
-                 onblur="onSearchInputBlur(event);"
-                 clickSelectsAll="true" oncommand="onEnterInSearchBar();"
-                 chromedir="&locale.dir;">
-          <button id="quick-search-button" type="menu" chromedir="&locale.dir;">
-            <menupopup id="quick-search-menupopup" value="0" persist="value" popupalign="topleft" popupanchor="bottomleft">
-              <menuitem value="0" label="&SearchNameOrEmail.label;" type="radio"/>
-            </menupopup>
-          </button>
-        </textbox>
+        <textbox id="peopleSearchInput" flex="1" timeout="800"
+                 type="search"
+                 emptytext="&SearchNameOrEmail.label;"
+                 oncommand="onEnterInSearchBar();"
+                 chromedir="&locale.dir;"/>
       </toolbaritem>     
   </toolbarpalette>
   <!-- toolbar -->
   <toolbar id="ab-bar2" class="toolbar-primary chromeclass-toolbar"
            toolbarname="&showAbToolbarCmd.label;"
            accesskey="&showAbToolbarCmd.accesskey;"
            fullscreentoolbar="true" mode="full"
            customizable="true"
--- a/mail/locales/en-US/chrome/messenger/SearchDialog.dtd
+++ b/mail/locales/en-US/chrome/messenger/SearchDialog.dtd
@@ -1,15 +1,15 @@
 <!-- for SearchDialog.xul -->
 <!ENTITY searchHeading.label         "Search for messages in:">
 <!ENTITY searchHeading.accesskey     "h">
 <!ENTITY searchSubfolders.label      "Search subfolders">
 <!ENTITY searchSubfolders.accesskey  "e">
-<!ENTITY searchOnline.label          "Search online">
-<!ENTITY searchOnline.accesskey      "l">
+<!ENTITY searchOnServer.label        "Run search on server">
+<!ENTITY searchOnServer.accesskey    "u">
 <!ENTITY resetButton.label           "Clear">
 <!ENTITY resetButton.accesskey       "C">
 <!ENTITY openButton.label            "Open">
 <!ENTITY openButton.accesskey        "n">
 <!ENTITY deleteButton.label          "Delete">
 <!ENTITY deleteButton.accesskey      "D">
 <!ENTITY searchDialogTitle.label     "Search Messages">
 <!ENTITY results.label               "Results">
--- a/mail/locales/en-US/chrome/messenger/am-offline.dtd
+++ b/mail/locales/en-US/chrome/messenger/am-offline.dtd
@@ -27,8 +27,23 @@
 <!ENTITY nntpRemoveMsgBody.label "Remove bodies from messages more than">
 <!ENTITY nntpRemoveMsgBody.accesskey "o">
 <!ENTITY offlineSelectNntp.label "Select newsgroups for offline use…">
 <!ENTITY offlineSelectNntp.accesskey "S">
 <!ENTITY offlineImapAdvancedOffline.label "Advanced…">
 <!ENTITY offlineImapAdvancedOffline.accesskey "v">
 <!ENTITY syncGroupTitle.label "Message Synchronizing">
 <!ENTITY diskspaceGroupTitle.label "Disk Space">
+
+<!-- LOCALIZATION NOTE: (useAutosyncBefore.label, useAutosyncMiddle.label, useAutosyncAfter.label):
+  The entities useAutosyncBefore.label, useAutosyncMiddle.label, and
+  useAutosyncAfter.label appear on a single line in preferences as follows:
+
+  &useAutosyncBefore.label [textbox for autosync value] &useAutosyncMiddle.label; [dropdown for autosync interval] &useAutosyncAfter.label;
+-->
+<!ENTITY useAutosyncBefore.label         "">
+<!ENTITY useAutosyncMiddle.label         "">
+<!ENTITY allInterval.label               "All">
+<!ENTITY dayInterval.label               "Days of">
+<!ENTITY weekInterval.label              "Weeks of">
+<!ENTITY monthInterval.label             "Months of">
+<!ENTITY yearInterval.label              "Years of">
+<!ENTITY useAutosyncAfter.label          "email will be stored on disk">
--- a/mail/locales/en-US/chrome/messenger/messenger.dtd
+++ b/mail/locales/en-US/chrome/messenger/messenger.dtd
@@ -125,16 +125,18 @@
 <!ENTITY messagePaneWide.accesskey "W">
 <!ENTITY messagePaneVertical.label "Vertical View">
 <!ENTITY messagePaneVertical.accesskey "V">
 <!ENTITY showMessageCmd.label "Message Pane">
 <!ENTITY showMessageCmd.accesskey "M">
 
 <!ENTITY folderView.label "Folders">
 <!ENTITY folderView.accesskey "F">
+<!ENTITY smartFolders.label "Smart">
+<!ENTITY smartFolders.accesskey "S">
 <!ENTITY allFolders.label "All">
 <!ENTITY allFolders.accesskey "A">
 <!ENTITY unreadFolders.label "Unread">
 <!ENTITY unreadFolders.accesskey "U">
 <!ENTITY favoriteFolders.label "Favorite">
 <!ENTITY favoriteFolders.accesskey "F">
 <!ENTITY recentFolders.label "Recent">
 <!ENTITY recentFolders.accesskey "R">
@@ -646,16 +648,26 @@ you can use these alternative items. Oth
 <!ENTITY contextCopyMsgMenu.accesskey "C">
 <!ENTITY contextSaveAs.label "Save As…">
 <!ENTITY contextSaveAs.accesskey "S">
 <!ENTITY contextPrint.label "Print…">
 <!ENTITY contextPrint.accesskey "P">
 <!ENTITY contextPrintPreview.label "Print Preview">
 <!ENTITY contextPrintPreview.accesskey "v">
 
+<!-- Media (video/audio) controls -->
+<!ENTITY contextPlay.label "Play">
+<!ENTITY contextPlay.accesskey "P">
+<!ENTITY contextPause.label "Pause">
+<!ENTITY contextPause.accesskey "P">
+<!ENTITY contextMute.label "Mute">
+<!ENTITY contextMute.accesskey "M">
+<!ENTITY contextUnmute.label "Unmute">
+<!ENTITY contextUnmute.accesskey "m">
+
 <!-- Junk Bar -->
 <!ENTITY junkBarMessage1.label "Junk Mail">
 <!ENTITY junkBarButton1.label "Not Junk">
 <!ENTITY junkInfoButton.label "?">
 
 <!-- Remote Content Bar -->
 <!ENTITY remoteContentMessage2.label "To protect your privacy, &brandShortName; has blocked remote content in this message.">
 <!ENTITY loadRemoteContentButton3.label "Show Remote Content">
--- a/mail/test/mozmill/folder-display/test-selection.js
+++ b/mail/test/mozmill/folder-display/test-selection.js
@@ -150,8 +150,23 @@ function test_enter_scroll_to_new() {
   enter_folder(folder.rootFolder);
   // add a new message, and make sure it is new
   let newSet = make_new_sets_in_folder(folder, [{count: 1}]);
   // enter the folder
   enter_folder(folder);
   // make sure it (which must be the last row) is visible
   assert_visible(-1);
 }
+
+/**
+ * Test that the last selected message persists through folder changes.
+ */
+function test_selection_persists_through_folder_changes() {
+  // be in the folder
+  be_in_folder(folder);
+  // select a message
+  select_click_row(3);
+  // leave and re-enter the folder
+  enter_folder(folder.rootFolder);
+  enter_folder(folder);
+  // make sure it is selected and displayed
+  assert_selected_and_displayed(3);
+}
--- a/mail/themes/gnomestripe/mail/accountCentral.css
+++ b/mail/themes/gnomestripe/mail/accountCentral.css
@@ -65,17 +65,17 @@ separator.thin {
   font-size: 180%;
   font-weight: bold;
   color: #000000;
 }
 
 .acctCentralRow {
   -moz-margin-start: 10px;
   font-size: 125%;
-  color: #000000;
+  color: Highlight;
 }
 
 .row-iconic-icon {
   list-style-image: inherit;
   -moz-margin-end: 10px;
 }
 
 .acctCentralRowTitleBox {
index aa1f1f87de01c70755dfa72ed9566ae646efdf14..655177b23edefb92fe3508bb18437a91c7c561db
GIT binary patch
literal 1677
zc$@)^26Fj{P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11`0_;K~zYIja6-IQ`Z@O&bc4<y@`Vp=fk0xuxU0~2yKuer2Qxz
z-J}G9D#1j$t!cFnX+O3hCJ`s>Pr+#lBeu0ps`jTUL)!{kR;iWRHCnf_(ln(CBw*Me
zklJzL6vtUcVmto0=iYnHevG27B%<%Xqw~Jc^FHUiA4CX&FKgk*sf~)FTp)x9#@M%l
zz5S_&#mMVjM5057ola-e;c$Goyu94i7d%>!W%;GOd%M26p~_AEG<@zbfZm4@ko6S2
z^qXHNe)xkQePtoDV88wLTT`ZKo^iXYUwF2s$H`0+r%%6n$283*08i?=ewr~>ZCO^w
z(f(h4_@xwZZgXZD*zEI3-3Pn3B@*$$wjDbhrpcfxDt5HBc`i>}UiNrA(!Q>Jn$0=R
zo_(zwz}f^ao)~N)gnUN`@lOD8RaHF>)rrjF0@CRPl*(ntJMa7jLI}9s)u{E<I-c!$
z&f%)60wn~oSj;dC7W-nN_X#K^<4<=#t<TQRmhYs~yt%nqO(qk#Jv|M#+YMcJqC)oq
z0E8e|E#xuw(HORDX@cJ$KstTL5`rhz{ey61DAV&yPkmLD3zlso7K?!~23=EOb1pvp
zG+j!k7bE~^Z1mcXY;4pdiIPImfWzT{+wHbSMn*~i79~lN48!=nZQG&y1fhXrPkFuG
zbKm>!_x0J?B<?ORL)R4Co{pF2=2D+9#s&dgx|dkHs;WVs?~&H60l%|UwoqSJj|Q(7
zrBV@!tm1cPUPY-?s<{6|oQt;>7Z<J7)jXD0R^Y1CapUGxIgyxo*|zQe(D4EOIpv9C
z$DjXmJf1u$1U<a1rP;ao?+jFj3{Ooh;)#T%DC+gT;L)PQg;jUqgZB@~vh<4IAE>FR
z@hFlk!7xf<a`NhR(=-nbgkE@{mUn-1H_o5``}ur6w|`61X0N7K62XDhLIH2S`9`W(
zEPP}4?kCGslH~XH?&%slc(A*9*W-_Cj4{YmLUJZmDwmB@1EIlnTYVrj$PI%XOD0n#
zRaHSLMLZriP1AaPAT+oF05a#c&P+yiO+z-9gCtQXD#iSKN)m!!UJv{;6M|oxpHE5c
z?QJkkU|UOza^uFoes(<c{MSv>JVY5Y_q_Y=U;lCT+}RQ(1WrwZBCFs6;QZlpigN)j
z09jU{sw#5%91iS1;M}$AiB3Z3`}E|AUri5$2EU!n=1z@Y8aGr$1tAnZ-zHlK(f)7+
z;?e*40+bRcih}&=DilQl0Eq%XUw=>q&{bdGpq9&J5JC~~2Q*4)e_wx)tOwrLAEcDh
zkl!EB91bUBS;6@DC1ZGacyVN8<YmU#E(!p;t`E08_SmBh4Gm;=E(y208k;uxNWkxJ
zA%qMC`+DgY!GnFh1i%Tu|7$J2O+HfTav__`;^vK;vSnFKCtf^xc<59(E&~8#Y+qyJ
zMrmnj2^G4IrKKg**43e-qr=Gs|M{(3w>x`-NB*zTBuNSe{QlO?j!vhdD43p}hG7_R
zRk@6nm6iPf&H?vEMPGj~L@E8L5S$Z2E4OdouI%aDs|X0#mWjE!S#j&u?b7VroCE+(
zn|*d*>sGC4a}#kmHQ1JotFcL_sss644j+t;-Zf3LF%pil2lhd4@W>92$8%xl&Yi9e
zRU6RS+KPNW57T5&6cqqqSr!1m?XE^@K84AN%T{WBzUXpQ%H9UA{?WyYHs{<C2}kX<
z_CaGsMFk{@BA3tNYAgnCLjyETLq%mJD4{463b=dsKbV-DfUaw}8jG2hWgW<5G8+?#
znRd?k8<B9-2G(9Ut+lnadM=yCwd>c4xm-^1dc9U_>o%=WC_>kD#6O9fp4u9vuC5-1
z!YYIi`A9hW-o5xgd>-t9>HzS!D_5@I;>Q<r*=+U@=UmTZG7GEuRaEFY#>U2qGs&6X
zPE1Tr#p7{CsRTmES~zPHM8eT4LI~9~&HC_A<a8t)wS*9_WOF&TkXhh{VZ_2ikza7m
z+mp%U$D^a8;GF+)J%TlNawHt(0F2MhobxkNQ&T?{Lby2RKe^{q0PsX_@Q4P0tw-=*
XXQu0=@CuHL00000NkvXXu0mjf7g#6~
index 95a7609f98c37973bff8213ddbaf8b85e6b1f7f0..034b11c4e2593e5347254a7a29cdf5b7f03898b3
GIT binary patch
literal 876
zc$@)j1C#uTP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXJ|
z4-p0^F8}WU00QhuL_t(Y$L&>1YZFlv{!Z@9<k7}d9gH=tR_a29K&|ikiXaH?1jTB1
zf>OaJYAv|6l2&x>LPWuZh*meH#)!=yuuE-GF|i7gR+?taoy4T~y2xv$T8y}p9yoCC
znc@5HJ?A^;0t>ca|7!HR;EkK%D?*5CQc9&poLR=$t;-jCd;Ule9_U-{a=AVp>+EtV
zN^ST;2t0cHFqcjn!QP&$@2uZ`K_H@&TeoagIL~1G!#Dsy3IS1Z2_XcetnPPp>_*4-
zo$8Bd<TQYDRy@a?(>sXhOl#{J<?YxQa@j0Q&cV4^ans~5O>2xp)0_yb2sjvH$HN1C
z&Upy{99X+{T^)h&{=<7@vn5c@i*A}W;9}f_5CQ<u*0w<faCqJnF~%;nx3#<Di8y?|
zMcB4^M@==zW;p=D`gQA_qoc1c19(uuw4`U1uIv39+czo0kzuS_*#apgIOl)#LZJY|
zFre!?lF4Ml<}Dkay^Ov}+HT-*I8N=}xks7$Hi_?sfp|QQL?QtKq25~$pU-DIwP6@Y
zrwvFc&>wY|qHhqn-l0u=o;U~KgpGiRPWt_RrfE)`J#zt65^z4B$KcZ^7#SI{5wxss
z!O_lR&{Pfm(LwmUgc(DkVQ~XVDZ9c0ecio1S7#NAmc99W9@D95iwq?+O~v6uN6>kM
z0gy%6%A!<1fBA&8k%lbf0JtCvIiyn4AR<jlsRF1F5CEvE2Di&y0T)t03W3R~uMk4o
zw7>u2^Est<LF6;ocYX+fhXF7FkOBZrO--(1mI#b7YwatYS|%$Ki#&%OXtw>gWZBZn
zdg{wWRi=%NjXolpHM1tG^VHQm$jTr9pa+_5ds`o5oz7e;mA-TD{@oKo2(=dQ?of4o
zJ67%2Q+s70li`nthawl^mSLv^gF!D5H8|XEMM_D3Gm>ZYgX85Jcqa#2-9$4Uk7p(p
zixsRu6bgk{N#lP-@XdedM@7CoqQ+t|0YLm8FWOH{Q<daIkf>|`0000<MNUMnLSTZm
C7l#u7
index 3aeee0ebeb057497e09cc652a33e51602fc8e32d..27a802afd722f1401f93889ce7e171bbb917a296
GIT binary patch
literal 1167
zc$@)`1aSL_P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11Pn<;K~zYItyWu1TtyiEX3p8OtXnBijY_w4p)FV}t=%*wtr9LG
zNP<mmqlrG4Dj*jv7h{Z%USbmyT`rr#u0Uy0(+4-<$x0;3rNJN-C_xIgwp_|(xw%_#
zFK74cneo9^H$o}K{gQe3XTJHq%s=zb4B?z(v#?sL4-=8LF$G6UODnE#W)9t~xTVGN
zs79;3l$ri~v=||@TP&8yuo>9xc0tF<H+i|oViNZxldSZdSe+iN07zI2R@{r`g!sgi
zsHkXq=Z*`HKNc$*48|kYrrI<A+o0jg+Lr}EDBSyGvd-u8fH4MH_9Eq}0}n|WvBKI|
z{nAGB$wr&p&`_I1MBWSFVE`b6iYJf13VZ8UAcO?((pDMesbvLKH`f*6oUhyJ8*BE5
z#w{%$Mpzqb`O?xNueX`yfAcLibIN);>!!%sTw6>y?|D%ALLm~;VQZ`_S<@dHoIn3j
zM3Bdv+i5VKn4Xyu{)>SmX}1{T5^5XISu))#!BbULRX!kOlN%ap5)>9QY<fEN<O?~+
zw1jNBL;wJU5R#RdD?M{0{e(VJ7^!cr-u?Fqtc~V;K@u-Mdo*K<VS60$c-#P(&|s@M
zLpZ%yQc^y0Pe>5{S+w157nbkLW`gtABq>7jc-)BF5ie$E>Eb)Pz8kVN)x0ijGi)=6
zgmmoQm8g%~VWhI`gQ6&ijEo|JD5iO3Pg&oUo>U4=7lTl_Kjk2P8M&%n8SMSq>-(ck
zuhV~EG$tHO+OwAkf(TjmLMv%WKnZG`&gB>B>B7@9Dq*IHiCdHXgMB{6R47USlT+h}
zj*3P`S~hkiB;_e8=?4HxDF6r(6$ecR4joEQ%YsIu#jiK6LH5gFOvS*}K6!ln#xxHS
z69s^>f~uP=D5W?Yv+b9AIy^qvi^ZjRb!d2?^~ayOxp8L#GBa`>A%uWZ3Y|_T=H(vO
zZ`~S=&hGC6W23|MPN&l^`@Fc^)9G<IX1YWw?<*~>xW1;)Y|VA=5kfv@s;Vg|s??md
znV%B{;X-b9{u6U^voM(sW9s%T06<4q`){0(SIUYihipxCK1vDUjDPZ0Vfm-`^wu1e
z;)3$eRW+E$IbQ&Pw~OEXfpfeuG~AEm<b9x&!mvFKKM(YR6Mm|!sB#DZIOp?0Rm~3-
z$K8Q-o2B`)*wFZ_?ThY(g?X+h3co!)!Ru}2Z#Uv^SjhnJ&YSPgg~kFQmsVC>E=sA(
z<#f6Lv~9${Z;I{*!quMT<;76|qjQd#QNqZkt`hOVl)u2aGU-}zj&aWMyK@;qF*qGo
z1D!5n)$f<DF~*=M0T92=9aaNDSd{~Tm@&o}0!jcHO@u$J29gx1u6o>~e!mZlsaSA0
hHuW9Z@I?y;{seGfCpI!ys@VVl002ovPDHLkV1k|U7|s9y
index b249f6cd8180143e1f66fd9276ba830aaef4990b..9052a4a48e5137c2626b6be17f4d256634d68563
GIT binary patch
literal 858
zc$@)R1Eu_lP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXW1
z5H2)ot&JZ500P=cL_t(Y$L*E7Z&XJVhrcuT&a$>;5m5jMK`0F!N{Wb7RB7laco{_g
zg(yu@Z-YpYf59C>77}SJs1hZSjOapmtt>3Syb9P2f!Mq2`#LAZo!xuaUPJ;(myt%h
zznwGZJ9EyQ9r%B|VMtw^Jbi4=lzB6oo?vUSkFKo08k|^MT<rf{KwKA*L}!m2Jv_a8
z*X}KbswzuM*FJBzSLT6JZv`-P`^@wVcURivc{XO)Xl&!)!B3l=&Wj_*Pad_+j$9;t
zA^vjV!ovLP0minxC`gioqA123q-n;(NB22&=(8yoIm`?*EkD&*`*Usjho7&W1Lh~y
zK+b$IcRkCCk3|GC3&1K+kx>w1YZ4Y}I*(&__QLs#tr4KrYPsdR?Tv4~{>pprapDjW
z#5tS@h#=w+K*UvH85joPBx=TB(C6H@-{lt<F8NW4TCJAOoj##6Gqc>g*AAPk+*Bw=
zl@3+K0MjC*$xzc^4|_h?H+DJQ=mxoHfPr%kRjsC#bLeb1C*FAxR2AnW-wKGNpJpk}
z#c$tKA{44X1&C{lz4hKY&Iy8GVhB<e(ZGaI11ZxX5)xsE2`1oNIDtsE1z^zY_j<%}
zjBof*I6}^AHQA)i6tz-EQB(#n34rPPpx@)Y9kZDE2?eZcsvf{FEx$)m45o;XZUH1&
z@vPS$uyfar(Y32@9@hat_&wOf-jgONBGTIoa7A7`?R2~B-~Z8s&0thrTf$0BEp6U6
z=yp07wh}Io4go&P^IK1zJSELOVIxVZ8d&9Mn4-F_*T57y&%3%YNNxijNQQu^8^7LI
znrb$(2lrQfv)L>G7#boj|0Bw7Ep=$P0Kp*7U-H|{JL!u*US0>L>HxpGy4v_~@B7P_
zzQ26nT^^X<yWPh>{rJmrIKil=w+G^0V0QCE^bdvsYrtb*0K6JHY5-BKv)=^(pg;kn
kQgbN(@^fr8;D0y%0$BALiINi4H~;_u07*qoM6N<$f>3UOk^lez
index 2f37d6b45fed95e3907748546096c86d086bfe80..620843ef0252908937ceb8af1509a3efd6fdace5
GIT binary patch
literal 990
zc$@*=10np0P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H116xT%K~zYIwN>3~TtyWBote2Gd-oQb{vXoUKq+ZrD<XoywjhWv
zLP}6#)2<P;NQfjYrkk#b#I$`8E2)t}npy~`FZ-a92Nge1RESbr3+Y~T*KIcUV?KP?
zY_gk8c7wJDe$1UY!#Oj*bM9}*7=wpt?4d>nAOK+Q+H5E1JR_y-)mjT<40Zwl$r)dW
zlX#-<h5n_s8D>9xzw?vN7T3z<f6Q*JR4SVJg==fm7pFQ~9mW^~214fGfiBnc(vVWN
zK(Ybf--9EEpKuvbrY%KL6!)f59*i;IoY%Pw8tcC~H%7xx`v}9Rw{3zXNdy2SNxb8x
zLQudjzy6FrZr_5|8bkylLdU)iab@;BQ=1bJ7-Lchv7nTic=q^nOF~MCYJz0P;NN}!
zExNmU&~xZ;y8{D&xPQNV?8~LkpSn7CrJJes1oa%(<Hw(Vz+>G<;QM=!BwPL4*UR(L
zIC!AT1tG(vQ~&_2^|n}EUWV`c&{~5r0ucid17nTgoPl!=&N+w(sg#E(ihG69N&$uo
zVb%J)&J3bB0str_0T76G!xCWI4w57hf)TqJ1i{lC9s8(Ok6Q35b+TdHt=YB%DJ9ry
zrINjVV?HdEif|kUj^n_#ZCF+nH42;gZw&xYQi8ql`tTQb?%aNI=F;@yo1?=rH<{H$
zv`$HN6Hx8_o$9n5s<&2EEgBgf%>&54cIH*9QmMoMK*VtI(z~Hj$~ML@&IODyEo!jo
zAR+(;N-Nc%rsu}S6DcL)IKqY8`S7>jm(MW9KfYJEXFM;xPM-tYcHuZ%;cR?+UK&9V
z7)I=7lUz%sFm`q{{PXVJ6WQ_Hh1JSxcJ8CAVX^o(TsO6j&7hWLLkJ7D?QGPrR4U^7
zjrnl3QpwWR)*KjosiL($Ha#`7SX(>w%E?2iRBA|T{W!1w3?L%xe{_Fx^qJ$XQWBPB
zBR84V<#Jhb&OeRg`25K5XkIkkAW3>=rY|?>d@ehg2aq2;Jzx<Luj$U$-+VPvC=^~k
z(bw++z{<)BBO>?Q*!ZUIwA1r;$P5jherx>fS`>vQGc;(n`kN^FFLv_O!1H?_*?YNE
zF1c?{Of~e`19_7tbMJf*{1qHkO06|H|1U-L=zp=V=?Q%x6t%K{0q-sB@}IlGjsO4v
M07*qoM6N<$g6Lt({Qv*}
old mode 100644
new mode 100755
index 1d58fc4712118a7b4c49f2cba3967ed601b76840..94cb9619a1d5b3643ade69012fa66a8d857a9057
GIT binary patch
literal 1014
zc$@+D0}1?zP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXW1
z5HA!+*qoLC00VYOL_t(Y$JLf^Xq8nQ$3N$}yLZlYx4FCR&R9f~W!f}dxtxC>2nt6a
z;tN@<Hw6izr1fI;atR`01QA8OD5xoxNJWqdndXud#fVL#z^&Z8cXR)_cbn}#=lptc
zp51$&d+#O)z39Aoe&>14@B90GzvujZ=YjwGQ1iyMcEZY0`;_CnW?Wr!KVVM484@G!
zipcv-UCaO!r6W1co8gD+-*|A#bH&A#(L84n0b?NjG++e8AjW_(+#MgT9lCO%GZ`NQ
z<Vc#qwRQqdz!_cHzNaE6V=x^9Bm-^?7!6umTWc^HF&eb@%@}x~j=5khH^2Mhj?q%v
z)P*=6Mi?jwRaEDLYYU9lp6y!j`S+eJ+C?V%DK3j3Mj}A5PogX_(vrBFKS13bgNZ*-
zlYgQ{dm$OiVdQ1+1;ZF0T2Z0R5)mX=j)d!xa6MFSn5To&^AW1|lMJ}FpxO4K0Yn6}
zMx{n5I<pfAHy{-auxu4(c?)Lk9#pg$b>S^Y-1a2OFhcag0W7#{GtwHShf#?*YTz7V
zG=XR{y5(&o`V?$G1>e2|qt|^bB!_|Hn|WG_r>B1QQ}mX1(2cvHBnpE+<9xjXb-No0
zl_6U@?NRk@`aJ?zEnOs7fs{8OwJpfwFQZ$(L>_qoW=2tG_F8#r)*-9fyoB7$F}@cA
zw1(+B1ispab8bKC){hV>#cVx<Jl2NHB~jg-)@M@(EQ$C}loSdeSrW}}STYW`&Z2(U
zi@N9mZa4s;WpMK}{QVPz!my$>t40=MASSJ)RISBq`y6RK4mInbw+s5dM?zs_{i}9e
z-&yMyX~;0oPCqw*uYjI>9jRJ_RIkA_cYtwGJ)hZyHBVTuvEQv<<x1-(lHUL`3W;B$
z+{IcW!#AwGw91=b&&&&e=NFnWh^M3a<uJ0b!*<&4gXy~9!$u?#w;4|kB1a#B+3^Ki
zcut|2ba#~4Wz@;-Uf0a(pozG@?_`53wV*^vV9uQyL6z0zb;?3^?rA|OROJd%iE%`c
zc>a{dE&^!k!acu>W3j6jUs=BX>0t2DMi8-?dl!p{y;Ll4VZBp{afWXEn(CY6#K<h=
zz)V`AkAIW*UQ7)vor(?YR1jJSWU(Q_KmAjDbMO+!^X_Dz1Snq}!F{HV()+oSPya=-
ke~MDT1tx&m|NO7wUx7AKAIFhHN&o-=07*qoM6N<$f{9zxvj6}9
index 7a8d02126e88c7bb5fe7d6a0cf3d0795a17cb696..4e18a907867e6ee1d7e9fe71a5667ea6b4975d59
GIT binary patch
literal 717
zc$@*v0y6!HP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iXW1
z5HBcax8M-~002I8MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3JNG=DIhX1
zFf$-ZVQY0_ASY^RZEay=Cm>UFWod3@awjwISO5S514%?dR7l6Ql}~8XP#C~}Fa5J3
zI_UJ)la>y_<4%f45e08My8Bufh@jwMw5;20Cx^NrdegD#@G5#3yX`Or9vpZn5{qrA
zOGi81A2EGi(vapQX;Rp`BzbvXe&74PUlKUuAqFidFO)Wb$q3I}DbCIndKd8!0h70H
z-65A7AGpvk_E~$kng=2Q$mPbldw+4@y3cD*l(|rVWHJfBjqBGyf&_%Hjz}be?d?6!
z*iZn|Gy%}G7zk;#PTDQ}{-fy|8w$|vb^(aRW7dqM@vFnp@hOLYPHd2rayUS5XfchZ
z(V?;50VynK!rDy$V33N>UOeUA%@O$fmCG04oJgS`oVPuf0k+47RFR!8ZRK8IiK43b
z@$F;fUcFxT2Sioz`SOxq4n<EuR22);GXPX76+1SY&GPcqav7Lc08v$JwORnA(`g&p
zZrgp)fUc*eVO9K8m}YEqOR3Kl;0>5SX$r~;V6W0p9_ppy*ya{j17!FHb2tHsL;`@O
z{xi@bw~7<i^{x<o=SmN%)vBj@VN`U2{4`zJ_^_Uj@YN^+Wq0Q8?45x8!v~KrO%q+$
z$z(EprSMVFGxG^4y-QT9)c{DPQW%EO7v!U2-*E3l0j$4Y9qOm<%+_5V=THBV19%Y_
z1$uAXKj0K-1HUbIwbw8+0<!_^(v;PwGadf{ew6PFdknU>00000NkvXXu0mjfYy~xU
index 8f1668f27db47b085f29442c82959d0431bf8f16..4056347bc32a0276ce056767f1a3ed00207af6f0
GIT binary patch
literal 977
zc$@*z11|iDP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXW1
z5HC1-0PuAH00U7;L_t(Y$L*ERZ`))X#y^hZBu(0;>Z)pKHf>9$hJ~clGKw^D3W5RR
z0^3yWJc%PhDhJTem;|acjj4!THVys)4!~sv#zusoV}kTorfLEr)E*e3OS7bQ>Ui<{
zngcjEOScPL5IoW=e`P;<p7;Iw`P%SrhvF8OE}oyNZs;ffuHfp=D{o)8`2L$+56+yO
za{dXNIXmTeb^UJ9YPFc3pJ!}r3`J28Lf|-maUI7&QIvM=y|1bo&E_WMa+y}E)v<A(
z*C3b6Q7V-HkW%6}4nhc|lx;C@ErdW(6jT+iT=|S#F84448-R2=O|e)+)3mmUloBCC
zd)c;)5CXs7kEW^2%v|R1;b%K^x(saF{_`ryWHOXWrMAgdOHmX80Y9bXGKUU5(Qcco
z(`Dd7h!#Q!5{U$hi;F}e5l=fDG*v}PNjMy0c6OG;t`Rg%dtj>C29{-Y^cEnQOmgGf
z>-6^a5{>o|i9`s6Lqwx}6s}!k=Z<)npsUlBB3IP=axKeZIKG|h-+bLp5I`^#V((~*
z;o%`H%f7DzVrv6$>>S78_S&!P-m#1A;bFE#2fKDU&>v)B=?9X@<U<FqV-DOCG|UG3
zMpIa3la<v~?yUcY*)-`1_0Zqfk6{?p^*V~8u(4EQWF$_lR;6i~jE^7W^Q)Kh&ph>f
zp~Jw<w{6?RV{s~XDi{qN!!$Usf1F@2K-0R%k3Zca8jX@jB*B68YK5lNWPkP`!C-*L
zAG260Eqw9OCm%k2<b{cX?|y?=EQY3O#9}dYV}o=mgHQESYuuySut_BLqN*zMi*w8^
zd=Dt>OFio02u4$nsJdZHcAVfqHv87Z@nanysfmeWWYSrFshSAs&}iE9_yo(hmYJFP
z6xFAae=^UW-3e~jtTt!ofWXl8Y=^<iue^F1IPHnAcI4=bAK$IlpIfUz-IRp<l3u0B
zdZn^*>B0wl0J3A5@_OxVa;@fTbHZ$*8^+Bo2hHsmV43FTJH_G+F&Nk&HDt0)t1(yn
zPUwbl!X@gu{!*cERSfv+q=rle{Z+myd?^gwnC|!=JP7ZeKbMz6PD&}WLW-MG%ITA@
zoho=aZ=8BPFQuFmQf8(2gEM{Zy#oK^zk%NY(vTaIfYX6K00000NkvXXu0mjfe80|Z
index e9c92f470748e1f8430f391fb3d7cd5017e6eef4..f4a709c32f32e14ffaf5d239a8f59401c03aebbb
GIT binary patch
literal 1284
zc$@(Q1^fDmP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXW1
z5HJpS;A?UK00e|dL_t(Y$K8})Y*S?vz|Z;ay>0I;?b^|<EgQiJ>X^tJ9S}$q34()=
zI3x1`6Qh|RGC^LbQ;0+aTtJlY;DgG9EE*?>iw{01l(87X+@K^lh9E2(>;81@UDyA&
z_ulXGrHumtt53$0oP1xtoO6EP`I7_iUy$0`TKu=Z_jL3%ZEsUD>9vR`QbrLGDWx=R
zu~=L8?P-3!Pym1D!&^<;pG>9GKi03SHxv~WV^-Cf&VULW5(F^EV-v5%V)2))R?CWg
zdz#PvqYQSvw{u}M8trP_{3f2dIGpX1`HV@DM4bXpfN6<DBJG_4rWMs?hC_!B(h_G$
z&CVUW0tIIfiO3yW-`Ixj-63^Uu?p*#mnBN4OOuo_Ev4w%)nH8hxo><{{FjmJmd0&{
zLx(@=1OUtZ09^jE^WArR-UT%)Z_2!WGbstLu9!XMv5ROj5P?#ll!0au1udm$SNdgI
zZlo#IWjEpcs>c#%J371W1t5R^KD^z#z$=^|P_@MmId1SAs#%R@Gg&=B8A}4NBmzsy
zadik0&-8`>7cE?D3Wdg+3MvuL^ESc>V3N$n(qfaUsFVSK&T~X#z*I^hGa_e#k(d$$
zgk(4c%S2HEj^iB#0T7YXbR9UJ=b|YsX%q+n<Q1K<EJ4gnB(q~@E{854foY5aa6Hce
z01$#)K>$jrW)yfqAdFoP#zzTSh<zI9N>(3<rL}?1-p~~tK;jruAk3txs;(#sM=4bc
z0=QhR3&CKprpRExYq!G1x5BA&j6evHjByM?ltGLGZ~`*3JRW+YVpcKAazt^vJ?HNS
zAX9qqnZM)o$Xc(96V2jMoly%gB)}NY7&S7aR*GQAWHKdor}L@Rk2^`r(Ic^Fbi!ZI
zn4Ui656rEs@R^OgGVkGX>1H@vGd?op6h-j{a0qH9>j(u0x7r<!7uQzVfL9{aG2I!v
zdbMwP`RoUdUg_;i+!p`<@cg>xe)_fd@@AHr7+t?+sZ|Buoy@YQb%xK127XP|oRS%J
zUI!fe<O8~D)iY#ZV8CLv7O9i5Xv2fE%fGxE<S)yvdH>$|gM+tza5|hBo2}U3UEsCN
zoH^6d-`_vk-P1jK{rBHQC9UqZ*{z>9Zr%cZzaKb`Q!ZZWNy)PO=<&91M+(}e&HMMh
z0s!?xLqp3DQDlsz%gV~m0>JSm-;OUD8yoi_VQ+8TunD@lx`0xuU%b?libNt6C%!p3
z{I`H9LqKwNIK_tn05mi-yd+A-Pd9GZgn>W+j7B5t==5hoq4A27C%zlJ8-V0Sm&<E)
zb+zHZfdg}0E|&)Y_;5HJX>D!2*3!}v2LM`ESGT0J%=7)m4Vy3?kAvNAhxhmH9{&2P
zw$j_iG#A(a07C9GN|Ge{e7<=ek7tp`<9Wg1aI7|)%~h3^m2+}ibXt3Rd*DJ(VClh+
zKLoei4Hk<9Y&Kgu9~<xJhmZs1v$!prDdl1SKmkC{>*6JgW>h><aZHjVw;Y*R+1A!}
u`CdK9*Za=E+!XsfAg@{uMDzXm|HvOl;{VVUx7+mq0000<MNUMnLSTY?QB@NF
index 2dd3f99d31a11146921f8b5b036199b83d34f8fd..e57541ce32443553da538caf6adbd6ede24481c9
GIT binary patch
literal 1139
zc$@)q1dRKMP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXW1
z5HKGSP)mRS00Z+$L_t(Y$JLf!XdG1(#(#HacPHuYCf(LH$tJs|HCTK|3Z+ODD^WBB
z=|d4Kf*^wUpy`96P!S)3zKRc3`cx57RE&tE{)=t;V$@nGfyAV(Nh2oNHEI5Bvb)Ld
z%-nl@m`So*H?h754%|EEUYPGY=X~ehGw^?ZMCsyO-`6iAcwOuA{aXSOXsvj=<Do}R
zZc5O5{ww`pdk3ar-Xg3<`<9fFYoBzg*wlsL!eXXpWg+`U+ZnqUxcQTS8NhL!Qj9V%
zt+i)se@A<EC_B#XmFq_B;ip<>&cAzynx3x)UJ6w5OG?T3_&9|^0f0y(Od^ro@K|e>
zm$SI8gBb`AjfBbezDn(ZV+7qP!ZmW+q7WURDI@T_1EnO%+mk4z05F6=DY*`=fpBCS
z_))l{-=KpLf)=RhVbVkC6(#j^KskZqIO`EiOiYr?=Ku(Yw~<UHeZY;pX|2I6Q2gO7
zcC<ea^B1{s`FmGu`VM?Ze+2^9BT$mYrnv91H%TeWrS-K@181mez6Z0I!kHdo_V=u#
zr0!hTw3NUtiC}Val6*eDq47<k2SWk&?5;+Qd`ax#6Ois>;?e-FVVyqseqpjA!Fr06
zq#@pblB%Q-*Xmk;03ifiI7zhaC}R04`SG7w$_PE$_~@JP5nB>ytw~L#$mjAKU~9+5
zH^a+Usn7gLb?af6I!9_S#c0zpcV_#+!sY~i{R<&TBohdP2QJn;7aqP=6h3~9*xirA
z;s^_a{TQ(pQnjrr&r<ohswA>u7^Kr_3M&PlKoAK>h&MI>0(baxg0Tdlpp8sjA^ls1
zy|47(eD*D@vK4{j*S$faDS;4TWB3tZXDR-8nq5a;fVqCAf4PX-+m5Ka3)ejh7-a-T
zMFPV>2!Ynx8_E;fGz{#Y-XXm20nF7uD5eIPOBY$({|vTmW7{qnGXETb5Q6FH8FINC
zhVOk<brp$SQD#T`Xu0<&WUerAX^6!;AEP=JClm^KDPGwkMXs-b5Q2C-?tu$|5MD%b
zb&;%-!)Wbf_KRo96{>LCo*>>3$FeMB=_R>U1b)qU?-Cts$L70h0j%y56jLKCA9|7c
z#ssk)F-+6MaU2A>O$o#XLHWTI{=AxBrRP_RoqM9}J9LWrx(4F$Myf0eAq0-&l3B1t
zMS|w$X3KFLq?FV|YAUvu+MV@$`oVjMP!!9usHv&JvMdb4Kq-Y?w2h^urO@9xT31(>
z(cRs<{l5G6pRz3TN#$3LS49e~HL7GSrNqD4*Y}jtfN^%<^7W^WA3u`m>grNuEwiPi
z#R^8Fb(XHaO_|F0w>{ZZrp$)i8_dtojg5^J|Fge}zW}V{_l^Sf4SWCq002ovPDHLk
FV1g)29ccgn
index aa1f1f87de01c70755dfa72ed9566ae646efdf14..27c1f52d180661e06d7b22ad748f460d6aca7205
GIT binary patch
literal 1656
zc$@)v28a2HP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11@%cpK~zYIjZ{l)8`l**Z$6x%NDjr1CF*0<mT1Yf<SIa6G(ozk
zvoO$XTC_kmvP~d1P#}s*FS;m=tkT*<f<P^cBtYFSTfk@w7%<Ro+5|OF8%~tiMiQs~
zO0q;!vM7lo^D`pnedcvhNii&?^<6zYym!vM_uO-dloC%9nOuHU)3kE{EYA5W*>vjC
z)BMxE1k4ZM7yw^3oqBuY`o(B8ddTn@WNGQ)2>_Qi-i`qX1Gtb)r^-)aDLWA;iaHq#
z27hLnX7=<i{%{-s2q6K}G)W-P1`uLxfInv##=BjK#H6lkf6nCc+wgX*fDpt&A<GC^
zA$4YYdNPyChgDTQ>NoxHn<k``&u4P^Q<|o|Iy^LFX_|^kr4j|Ot>0uP4KlfWQq#0+
z2M!E}*BuA-M!nS@4jUb@I8jsuj^kjdTy93%!~VYBUR?g*!)mQwe<_<z{bNUhOfK(N
z6m^mi#Doy10hCl#T^Jr7iK>c%g~f+xwwiD$g-`P#(rzIVw$PL4gs$uO`#&$$TuMg(
zP+iwwBS0Tz?B#4aRoQIOv9>n<@lePzR#ujeNGU}m67@L^2eWhY=;=<NCy_uf*al5i
z!8k*+*~0w7BKo=$7)mCM+xPF^Bmf2n`u#1}CG*A7>j1_#34EM$FBl4`@%XMV0pP4V
zC=`nr9XS9YIA-T&ZO3s800;$x?qG5tx_5UE>J10`_I||}8t6A9JV;OC%E#9n0Q%Mx
zWz(s*UDq9-otdtzuRBmQ74wA>4(uO-y=FIW-@Q9mt<}c35ItOop0#Rq?8c{`&CSfs
zt#`(vfD|wd9j;69*Z1D9uU70V<9vLZ$eCPzqNAhpO<nhy01%Hw@b6o<N}TiIY&unY
zVh}7{*KfY?&2RK2;!!B74>#}J!zZ8L`pr+q$4+jE{NtbheiXoqgph!uC`SkS`}^!i
zRnpttg<`Q-tJwArvgy>Hb{gkQF8{rKdwPHOt!EEeP3mD`c@<ZtKB@>I&Ph)?67s61
zs@l0|G;+u^P2x9A#A7k6tl9_#0%$ZE0Pyin;2ZH#t=>?D@W41jAP~Ul$Vkk7RLxLI
z<-?_iWet#)&u0+7>4)hzp(qLr!v|GWK?som)c--C7`hH2I2ae8jDsjDG+hH19+470
zO$hNyxx93O5MoIwpFcP}91U9*JRuOaETy%w@+^RRJE8At4;|_0jKk#~nv|njZ{U;9
zKCMbAFH4{<rT4cdMLyNt)pfSFtJ|;Z8VDhnx_*6$F?KMUPOUx;e&&}KyLvi<pC8<x
zj54C5>QKxT3n&x{zdbW??8KJHn*^C${y9z4{y3OS4(#skM#FIsYY*c=vEbghKfT5n
zKLy~buBjx}9yk&X2HzOy+a2-;E!}Roa4AP+&BpZf{fZFcWHz0;xJ8i3<;M)4@7?`_
zgI1!m6RJW00J=(G8V0J>I%eh{)EbStV)%5@y(@;U&W?aoe5kH7G${q83@yq~t<|u!
zSgLWs-#I&R?DVFS!;whD&@>fSr>3fuQnGKL-}vgjq@k%QI^$9FCZd)?BsllrGLA-z
zq0yvhQI4hZvM81c4JjpQkHkY}TQKC*AH{($*7b!-rSg((+fmBcj{w}hJ3VuAuz#-s
zO@#!3@PHQQa5+b_CD3#kT*g5eL#b3~FiO7-fZD6eZvnEy^Snvmi&ar(oWDRB8{JsB
zlmL)YqFSrt-s}S`ELY&T0#1v=uGR3MP(a0AgG(8tlmr0Hrc>9?OdLJzdEVEu>C~Oa
zD?m1#@;1-9uD_PtyT=az@BQma-SfP^fROKg{h4QCilX4!jT=?rc^3eDr+4?BSbKC=
zsIpRi3&7zGEU{&jFELP`ODUPUe!~$$yz%<@*hwM8IeTpl)mj}Axct*skDd@hoLpQi
z)mm-~fb7WR^4m<gBLQRV<-)?^uU71}^IV8G@!xhilrq_JT}UbG8<}1doW0}J9{t+$
zyzf7r`8FT?zsThBhgDTQ55VVn-o)7-9zXvy|NaAp@bj))b@Au`0000<MNUMnLSTXd
CH56q4
index 95a7609f98c37973bff8213ddbaf8b85e6b1f7f0..8aa8a28c404de5cb855330c76c3febb7eba1c086
GIT binary patch
literal 917
zc$@*118V$<P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10}@F@K~zYI?Uhex99100Kfkv#`%kjjB&*%fHYBkGHK9GM+Cq&z
zC<L#81oWnY6hTBt>cvBXSB2owix@lwJcx%7A(BIswh4$BV$l3Cy4EdAOv}#h?9S}I
z=V7yxY`V1(?5$t;&HR3E9>4GVe&3rJF~;yPp&n}YM+A=u{ufxS2A7wYzXV2=IvKw)
z2Cen?!^6Xuk3W;+FWTbbVpk{>$_@@a9Sy0L{H-Wh|9PWSbcz>7Mn*RORe|SuZ=N}O
zCghe}e){z{RLI6?jn*}^)=hc6uJPifXX#F#imt7#zXQB`wBK<Lq*N-smrg%nZ~U@>
z>$<ol2e(u>xF65!5wdKO$#&)Y{u}f2^O5@!%+Aif)S2pR7Zh9D+jwpnx9CuAM9IN*
zi<E<KD7!^O1Y-<+eZ6)rmm9mUMb)Z5IdJY=?ABkmh(FdwyyNVNcHpj4CfOFHr>7^f
zva&h}d~pxK%*;%8D%EwRy*<gz)f*(cP7{sTCnCt@3taxX2LzPGdFLZ%Xkubwt;r(a
z_pd(p{6*_-p@3ya=;%5{JQgMv4HJ#nEh84SiO0fd0D)HrUq>wPJTKVjKtZKac{`PQ
zJhZ*FNp?3&b~g)vZQBf9$Y4bhO{=bYMb>{@!Sg%-8Yfy=P^na28y_FPIyX003kaNI
zG3j`QNXKa|z1$5(V~n9vEU^B=ji6Bjwr%r4`K^X6$U!Hu;PYobjLUhdPkyE93PeOE
zuU$KsAqWaYAwVqAN#@Ec&88cJ!N50lTaIERJ<4tWcXIw8{H<=+33_{bBXt++S9#E1
zR0Kg#7R+sZ7AWXX_On~w4r*nAH9bA85{X0tpr$pQZSe<mKg7+^{UCqg+YYk+7RnOF
zufMOqTU{M0?eA||Q&UqWlgU(!*5=bsKK2iEG#S!b#Nk9ikPKm{ue@5Vs+dx4y1!pr
z#uy_a&cMJxU;fUWq^hZ~WrYMl>%-nh#^h+-7*iLyj#am9XJ_ZBy}i9Z7Zw(3!Pito
rWNd6q<@5P_HT*{`EiGwdj0X4zE7w`a!Wsr-00000NkvXXu0mjfM{%S7
index 3aeee0ebeb057497e09cc652a33e51602fc8e32d..8595b5d456ed69fb5d83433d7a3c77442a9189b5
GIT binary patch
literal 1230
zc$@*w1Tp)GP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11WQRoK~zYItyWu1lt&c)W`<q%f?O@Scuxuj47NZ`YwE3PTN)da
zCJjcD`d}6lZSBPv(>KzGKJ>v`ji~FTO>HcpA=aiPp}_#60zp6!7E8BL%Vn?ZuCn{@
zf1T+QW>JWn=$A}p&YW|;FK1>>G7v%_mEm^Z-Qf>-wXUvPAElZjga8pj;CXPn-Ak=D
z^RUfkx5i>IB@hjjt}S2dd2S*Ano5kO%guIsM*4z$2g%OPG22b%me$r*%S#cs+0lBD
zF}BQZ%V5!H1XhcMrlpzkEmr#b3kx(hUEL*w*qNJ~YnEjRoO2`+3FPI@H>;Yyq4oM-
zHO~{6^A76jeq5fFlifoI%>p5S0DGhSE!^(y1RxB600b(bbo={Twl&YGFx$=d^>uA)
zY-~(V-fOsWSq%mQqT$LfqN(X8d$MnEcyQ-jujrX0>gw+JCe4)oTV|$aPTrR!NdSP9
zkf5rG8D(pVeEN28R~-P;(|l>ui;j*CYdjIH%goHG42Ap*LYYAlmtq0{5(x>qGRc#D
zfuN5%3Ko6b($-X%nPK~|qGG*w+D8H4(k0i@hod7sIaxWCYbw^7C&M8gi$!LTaL#AU
z$p{8~dTGh)Y{jxyUmNlK+xNrIuJR`WwXUP@$g0v`QoOpTsHnsokH_$M>M<Q1k9~W}
zb-X;8h%p92$h1jnT}RfPIeYAsl#nvx@hRlxy~5VLy(ypTdi&Y)Cw2n>Iqf<YT(Wq1
zPDR-oW*7!2We5a(@cAb&?j3`o$ZZU4w*g~h*N#2u^$nMx$yy;{xM;On*B3Yz!{I2v
z{JeZ{&cPVNKc2sZ``&=23sFur!pbImWA|=#woAIM!7y}q?vEfNV;(lH+k%ya#TyM6
z{QxMX6aWD;)9%%!W$QO>co#Oi9UjjJ;_)~*=jb2kRfb1~{D#1rpH_c0L=QL*jL9)k
z5eWwyTCO)svDg%XK|dcD?ESUv#x-N%!UAmF{6RKjX(mc3OePa5-`k$OAm4$u8`q4x
zLw7EOCPR;8If0v<ZSjYr_q&<USM9I<@(%D+qq)w1zZaAo=Z0aim>$_AZC*JM^zzot
zmCGX0FiKaI;lV=>EEX%8n*SIT;8pva2RmICPKF4<Ji&3oJ0AYJrl#h}OPJ9Id!3)V
zxT<dg;01vF)dz18E~@(ayT!`FVlYOrbjb>I_jCe+@89P<*a-mK(EX~WSM7BkIGjul
zVD?TvckcLt`uch{ZP%VXa%F7%KcQ)w@cAZ0?U|!p$?+#Id{;16C#PW+IGtbklWhWA
zjYPs59SavB`X~ZH@Mp6Bvpt6=X5)G0h~@$jxZ(4A-2mMFfY(hx+f&H{Fna}0W6H)y
zqtVG>AvnU}Nib*+QWZ$4f<vDiQe;IL;#>@=sxrj6`Z!gAlqvuKRh5T1=TKDz)RHd0
sd;v{!D@p>gq5xVfk!oH_zls;Z|71X|M9Q^L{r~^~07*qoM6N<$g75%7BLDyZ
index b249f6cd8180143e1f66fd9276ba830aaef4990b..b258d6bb0b882a4219e086326576a998c60437b9
GIT binary patch
literal 919
zc$@*318Dq-P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10~AR_K~zYIwUte88&wpB-*aciV>@m_lu!eT*dS$xkSMr|Rw_tH
zAl57(i>}!rA^t#r084~eAfY0`2KWtx9drQ#(qJi#Mcq*Pk<g?#zH{&SU||QvnQ>wk
z9O+%m+^h54_niAdW`_SW(&Hby-4AZW;Gg5j8xY+z(oHCO4%W*fwwEt``uM*B=(vO3
z?)#QC+TdajFb5SaBo<yckZ5cW5QyB48Eygks{&hqZWE=w`@roB7e0xnIskxHy8{Ua
z82)t=5)Sf4tDPrV69AyXnMhbw4y(f94US<bTm+SnwpBfVC(i;HV3cGzTJ4LF;t>w_
zHW0%-WcdP;v<{b~K&=S?1fV$<9`t`{Rh7t1WLF*6ivc@CQfuPe)0fa#dI6yrzz^<E
zFZPtpG6CSoz{I=}C~G`{g_T#}2al%a7v{485~H0Uj8_){5G0m*cqSk{Imt8tR#Yq{
z8zq@i3Y`VO9L=Nv%$FvT)xa@Ar2-B>L}qYslt71NKvILm2$4_?n8ks{XvWnJfcj_w
zTmhhD#uCK{6<_TD_3?NaK$Jnax<r$^h}nz_82btZ2s4C>vV<Wj{QWntuAB~t(M&x|
zJWPfYg8FffLZ!|vE=v;V+Nl7J5z4+o0m{XAJd`ByZ_F>9&(-wmNx<Y?WM(D-5Rc;r
z&SlGZxU+?<mR0ru0Fv4qU{<<3OFxW@@nJi*D_q2b{x+7LS%Pr&IiPfgCKF-fkKWc0
zXaeT`Z7`$&3~*TkW(1XTFHH4pfT~>{?C*Wm+x+b?atfEuV^k`I!Em@g6p=cT+Ib||
zA}DD9a4;2^RXd=nH~EJzu3RPOK7Q)imHPbRf+I@N{qd&=*hfV4nt@icyy@$$)?D6f
zCRr^9Il@l&COT{DG}XaTbk^3do9fH=Zuk3lf8X&svae>i_R`zmKJN}5FBX3A*1^NO
zAMW;h8-L#FhTS`N_Gfl*%*mW{^jVVSZ*uUt8J0V1>!nBG=g(iC^U3hC5n31D`R?nP
t0Y`D;%Pa2^(R-@)VrOl=e2<(G{{WORJC=`~$*%wa002ovPDHLkV1kI|n+pH{
index 2f37d6b45fed95e3907748546096c86d086bfe80..5f5b22a6f44fb6766c65297f751fe054aceb6c64
GIT binary patch
literal 764
zc$@+J0t5YtP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10(nV9K~zYIwN=kc8$lR-nc117Es97^78(z|#r^^9p(v!(V~^(2
zf-SvQO6{eH^rYB>5&wc7yaigk)zq9<Aug2S#gIc01i`ZA$NXBShnh5r>$+NfFtEeS
z_r3RK=ldpMt;J1(+-P<H4gi$P<uqgLV<M5rpPZZ|;{*~yq_uWUYyDw-eEcwyz;T>U
zLqkLP(a}-H7>lJ$Yn`gqYA=tDj&1{Zajp;m@O^(OlgTj77!p9N!5Kp)lVQH^PeloF
z0H9v4bB9s{K@dxQCzw*y>veu1L8H-txn%M-8jVJ@i1wzym@|t?DeP6NI5;>s*WKXY
zAd1DJ?hYe_thHLL_xXJOutN}554*d&Ae3TaVgkuz<mGbOA5u!k^StN#`}+X!ibUDm
zt5)$~Yz#@x0c&H8B<C2*W?8e@%=a8o7@Ex{D5WqV#}@@kDTENbL!guj-6({(baDU)
zf&fAYbO;C`MhM}gQmLMeQp(VOa}lhykWvCTEi}g1`ewOo`<=8^{0~9<h~8Ezl>u*O
z=h4i}%&qU6o6>b%aL!}(r7-k3C=?2Ni;IgnrL}gqwyf*Azl|~Xuj&B!=l)E)E|p4J
zN;z356n<T{b#$X0+e1JI`Kh&jy}G)(b2>LyaUp~NAw&aR6$k)JOG^*C=Zvwh-!?X$
zJ;~)r{|$>uUMiIWN@?*7K|hQ!Z#>WA+uPfd_}isJad%`yOixeWSzcal`Nzi&=X_mC
z`3?XQaqjv2{Jc}E)y@?&JUsj*o6SD1R4S=-I?d+h<~r3Gi{K*6&dv@PV}2;5?yan>
u^f<kiM}J{q;aDm4lri?Xf9+ZvMBxuwVM*!{E}Sj^0000<MNUMnLSTYGV_RPU
index 1d58fc4712118a7b4c49f2cba3967ed601b76840..a6c243bd14760b8bb783b01cdd7859fa394efad7
GIT binary patch
literal 1237
zc$@*%1S<Q9P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11X4*vK~zYIrIlNVRaF?rf8V$EIWyy#<7FH)N28=E6wL=UQ3F8>
zit3>YWMB{VP=R5HFHwRC7F3YbOK(DikU~n7Jp^6mK}_jp*hL%@9c6U#IL=ISX3jom
zul4n?&Ya_TsiXyqy;+z4|NDMx?QhF(Ptt+#3h+F}RQ^vB{u0<_#v2RwS_vRQ*xEYp
z_DzKai*l|w0}%z$#tzH?0}Gf12tK}t49tViF!SJRWFv#cu~VmCym<a{n}}>OvswZ?
z*S>gJ&J{Zlbs!E@5d;9kAcQCuJcO*?9fS-MMSO-KB-1)6bW1KRU49za4qQkOExKX{
z(mEAg{VMnhR7YbU?n4HTW1|C@MN?xUBLgu+43mI}VxnkaIsyft7!4p|@foOs7La@a
zxCJ`8Vg6beE5Yd=Y~UxvqL7GSB6X4yJ0KHdL<EXO5QJL9KplHMQZt}!CbIAeSh^9L
zdMlV=W)lnJ^UC)tS^|azj{u=(8(v$Xbvja*g?27LX5Ix!TMVf<2bR8oKeh+yKioWc
zETXeeM|h=y0ihNbTEK-2M$1s{#|DmKE)U(0AYIGri96hq4P-4v<m7?+!TZMT!oqbj
z$f}?Y2^zUJt|^d>!>_vu=YK#JJ%#0qgy0GDA0$25gPhpgyjhx{E$vqufcYvC6z+cq
z(qU}44;eXwUHl!!ON4ZUtnUN-x9?*2?L==|1Atqzjcni;$)%&<1n^ioJjp--EK6f|
zd91w)=B~sRt|zQ|nM&JS(%vr!mwVClBFWdAv9VIz?ee&FuVc>P5=EWj61~=dtb%2g
z##bAHCrv9<J+NXkJiZT|HV@|%&4$Pw+S(A1S$D%74<o7#lN)B>KYfPs-u09}--17P
zq$x6I8GhY+pb0J!+}W>ie|*xMU;Yw^qR9<1u#jO{h3c6@=-F?`_kM&supSO>2cOnW
zmXj@dwh?Lm`yEg#N0k|O;%9WDs;HA|4Zz4sCm<`MDu@bBAb0#j+;?v`SFhMYR+xu6
zB?)Dc3kREXw?BY6#a$1PA3RN{3?Z|Zz@vMx$M$1gD^aK9PV7ei{IPzhtytH+h>JM#
z=X;u%y6!<m(CZ=cqXV&qtlo-st-@w6#jkn|9|RR6*LR??!8#XXfOAT&e5$E5Wi}>)
z>SRPow6E8yq@_9I@^~{u6gT)wbG&nL<3J@VHI3V5A)<(zq#rX#3Lq-T;kV$@act-m
z9C;HFK?HQHzbRChiy5d2E{rwDbM5i}lw?<BAe6O*Lh!(aBk2Bz2qvg1xx9dYrbD!U
zwwA0`#f21cf{372Va}H;86OXLZ&+efsbWIIIWgE(DY3E89g;}T*DHBs7vmWRMj(NS
zQZ@pyqSxx6llYxh&S|)m%D#!Zortlczn8Y@XW5{RDU%6KF1`QOLSVc!7Czqjv%L?D
z0*IL*B6*+_X#Yor|JJN7UNW<qnB82IH{1ROo0R#Tm~UwI00000NkvXXu0mjf8$=`!
index 7a8d02126e88c7bb5fe7d6a0cf3d0795a17cb696..37914ab698288943fa2212e5d9776078d97b7e0a
GIT binary patch
literal 1005
zc$@+40}}j+P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H118PY`K~zYIm6c6zTSXLxpZU1gj^m_>n}`IEsGzBv4@wgXYd}Jv
zNGzzRgpi<1FS4L3egQwAsIpj-ZcqbK5mGkYP*fq*2%0)=l2(8ef(l9N#Kd+JY~L9c
z*S@~~irZHj&D=9H=RN10nRA7;mTT7*2M9qR5K<y*P56DIO(CV=pRKH!oqczY4$$-S
zUqxr8Cw8s1oz?`j!KgYk#*)o$H%>Ma)CRYf*VsQ$D5cTbZ&IpiU$-gcptZ(v6n$~k
zC8!X=RyM+CU%t_GLjYUm)<XWU;2Q~~)Gd=UlMc~H)t_zbmojCPYTeTeDXM}hC0iyR
zY<oCb;AnyC_$}i4O#oUuT?uq83auTK@)NFj{^a7NKX9DRI(rqEK7EoqD@!dm<aXvB
zLqj9SwAMaBPgLNPHy9u5;r40~V*mszckWXzSE>Po54$$5+ru^hDJ8o0(bp>=zf8Y;
zhKXknxVyFkOapNK^LM&R5ys-B?J9w&OQcj?ild1r$+5wzz4aicPH5sW|LmF%KXb2w
z)(Q{^Aqga^IWopyIXn~v1hx4v{@ylBooIi9q@-a_K;Sqoo@e-ZX)AcCFp5$dA;8gs
zQrRcZ<_!6w^<`}XA?j)b67~1FT>t*HhQqSvUzAd)(x03<-plgpV=5J&WaD?uRI;bl
z`+gBA2g4aSc%JngDOE3KQsEh2I#v9YUPhRDu0-Z;)~`W(P#7F09&dUJd)sLBR-IsH
z=b_r%%zN!pJ@s-@h4nmg#AQ4=$m;qI*22bSp2_h<TbTlavuEEg5-J&2u6#QyguQBv
z5g=M_(a_N-V=oPG|F;~EvIi6j<<>011mTZ#I{ktWe0}<rNvFR*jxh$MG{#u2-+0j0
z!7s}X56wW-{sXC0%8A8#ezMlSs<kQseDd*!k$k~J%6ge@F6W(a^X89?jy``Z$Y6JO
z*TiD6w}lXRUQk-HN@*$O(>ZUOK|5T&Jil+PjXsg5Hb^9fM-C+jV`1T&86m_EfU~~7
z8qMW$7{4NN=FIE=xvp!hwI7{3_rcXC&Y*^LIz6D2T05D1aU_u#!1D~@eOfCDg~w!8
z*7BZbCg$em{(35c3l~294tURXorA;HmCKa~aKl>r=EaL&7-+ht9h^%b1*A%)a@Sz0
b2#VDI&e|s##(V=m00000NkvXXu0mjfiB!w!
index 8f1668f27db47b085f29442c82959d0431bf8f16..15ab1d373528d7391a57b7abd5ee7ecd00984e52
GIT binary patch
literal 1039
zc$@(b1n~QbP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11B^*TK~zYI?UdhZn^hRcKc`8WrAX4Ors)rKX}gYe7fCjyosDdf
zwNAaP*@lWBWef#Tl!<?XDEI@t_Rbp%Mq#v23u9pI+Cm{|X_IPg-h|Dzv)kVE$J-?D
zIbN8=h73A&yYqpE_wb%`zMtou^W_mrDIR6iJyP}m0S^*ZfYH%WyTjpdJS0sc5{Vd9
z0H@RW3(&$tu#|#rz+DB9Qa1bjeyhjh`PafyN|qKE*}QY-vHkz8<@wti8z`k{Y;64J
zRV&59!UC-=EohmHr~%}1IePql(&;qCViBj)d7!8ef9u5KaoSp2vD@wBa=EH?Rsdbs
zQA*L()y3T097lXU+-^4qg;I({B0-DSi_7IgN?8M_E1#hJx}i`AEuAJFk5ecV$mjF-
z&7GYc#>dBbyr~JV*IN<PbzRf|bX|v%frJo*LLppECleDB6bgl!+}zw`Y;25EeSNgI
zw^voH>w4`KZEbDUIMnC!VYAtY#bQ`27NnGwHBw5>oIZ`q<*M2vgt$K-m&?@vGTAJe
zrg1(R1;8*248y=QO{_K>sZ<KnH0kW@tn4Wi3heFe)w-xyELMpplSv#72jTvH0J7N(
zzpnnq+V8jUdRy^5d4y-fVKUh)%gf6kU}a^6+kb3u^jMep_>+%b{ou-n-&6qmE68TE
z_<TO>b~^xCMq_$rnouZ6|EXt4Ypcx6PP4eQ$kz52ha278)$elh<WmejF^Hz6nVFsa
z`tvV7z4z`r?_I4lyRtJnIyx%i0IB5^!9ai>|8W``8tCyKClCyR5S$x4$M)_vfk2S%
zquto;cDlQd5eNjVha8S8`%fU|=jXB6Y*kmKlw#_}6urHDD5bDi>M%`7TU#67{}7|e
zeV9ZdLF7yXP*^M$Ow**<<EcxfQcnX|g%I__!^59_7mJ<v%Lqd5hZN1d6Z7*4&x<d-
zB!mzsrMPze8n<q)t$#Z*GM6vz1(V67cVOUoQ7&p`_G)o`eQl&tB_M!9Kz(Uk$)Srw
z;Y*i?cQq|7^ZC3=r&rbRr8kUdG};e{=!K!)H{ZIvt7SB47=}tFm*i`&zp{J&;>!W0
z6yl%`Erf7HB9U-Qo9FF1VHuFf2`!WTYV!Kz&q}GB5W@c4*+|&yZGIm(E2a7|o5_4R
z`P0-5;NF7(MCq;SOWz_;018SeRcd<Wc^hDs=JQG^bs*rs#-AD0z0wgepbG#1002ov
JPDHLkV1k3B^eg}X
index e9c92f470748e1f8430f391fb3d7cd5017e6eef4..75cc80e06427f95c368b3add6a916f66ba00596d
GIT binary patch
literal 1064
zc$@(!1lRkCP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11EonsK~zYIwUqB`8+9DV-`~6M-F=hGC21CuY-(U`)GgU2v#>1`
z5g(~TRQ8JrK63<-r6<T9^ns)Y_7AYoCq<v=6B$)OgdrBKSi0J7>l#}ex;@aMX||+o
ze)e*?-1*>=nF%&6#5WvweD1!V*XRBD93NuaHvUi1e+M*8BLLo@g7hi~5|(N1<EZev
zZCNvBqdqw@GV=9q0Ho7_rfE?sh@U+ce*9SMctZ9Ef^fNIY*owHTrXg0ep=7x@Bd)v
zTW^kzj^=j-&@^p76~x;opFb@hJba8Nga7~<O~7aZrUe)c6DvP`Yy5HNW_fKb8yg=V
zzuyf&+ijtOc=gl^uXqj~I?4fnZ39&U(9Mo&IEo{Qmqp8JDu!u(N(gz$?lMHqIZ56M
z?S1m_fv1mffK%<p)}zTg6+ii+D9g%osnoj{x;fwgKoF&K@qs~^5CY2vN;+U|Qx{JK
z?2n&dE;l<v2;sT{EXx}3`-1?0N`3p}ZTa@>C9+339*@V}+kHnhO_Klw-LeOD(;4VP
zI{D|>hBKG8+};2P?0v-JkpWcx(?L3&uJcqZR4Qc{O@QYBkq2A?zy#;+5&#zk7<Jz9
z98fE*!v^`QX`0<z#Btn>jlu%}fJB|dj5<l%0M@!B3P?OqS<l+lO8GXYE9I_$hM`X`
z%}>{OVngJeDj$M6oG|Ld2^zS!Jg+~<=Vw+{rfXdR06yL<<bJ#R^IVg1fWQM{D_Prt
zM4h<61B)}?7?nzCVe#hjSGH|iT><HI+BWL?nWee!YMF%}O#&Mn0cdL;LaXnvOw3MS
zGwx&-Y!{QF7caiv^?!S07Yz>&M_q3Db6;N|{>-zdT;WIreSLmx6bi`Y)^KBPW~*4-
zoXcjjzeK{JcN9hWlQDK$Rn^Rn002M;A@5zea>?y-pOqx(sMTx+IiAnfYPIFuT5jsr
zt(7kq7iU*fsnmx)pYO8Y?=MkG&#J0AwIe_$=!ryvg$+Y)G$anFR5O`Ot-X7a$t1@Z
z`yv<&z7_}s8kS{U8X6k<WXFJ=D49&U8Drmv!{HO5PzbuNzn@B_KIj>s1qm_6u16w~
zr=rm)ipAnbrfI&ds%o<*fEJ{mF*X~CME3Oe_amRrU#r*a=T%j$_5{#^3^K;1LZJ|g
z#bQ`pUA+!quxEf4<Q!w{s@Ll!ilTrqHn8oY+N~xgCMI=VPnAj~qg*cE({=sVo;qkN
inM`^aWBS<GnDIBzG=>P=ugL)b0000<MNUMnLSTX%#^2Ha
index 2dd3f99d31a11146921f8b5b036199b83d34f8fd..35dae759a0ba66a2aeccba15d01610ca02ffb4d3
GIT binary patch
literal 954
zc$@*c14aCaP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H112;)TK~zYIwU$jx6G0e;-<@3xNY`!sDKr{l@Lx<YK)}QVj0(}C
zKL<USC`S^b#<NBfPe!7NM-AbEcMr;i1VbPy2dT6x#v%w(C@O8Y+ZJcro$*lHuyzZL
z=zH3k@0<6TZ@!)E3Y>HNPf3G=gDwEke_=)lnP_WkJ7@v?4$#)t*0S}OClU$xe7=hG
z)vI#4yezal6P$6R%rj&?rZy6yNW2jwNv_ykcgWblpGzyFx~{|T_ghvdih{bjx{}<J
zu|>zbO|F`j>1hztL<HK91>kf#(cIi@-I5@bwsk?kWME`lO7RN8Mg{vO-Y#!lO5U&l
z;_*0CRsE|9VxeI))^q9o)H33!jqtn6?%aGj_R|88Wf@IPO@CDZ=zF*;bnKB{nt^$@
zdhOBM`@rwFC?`S)91cfmhAZ^d-wOg04l#s@H`A0GpU>rDc>rS!nx+*rc{M4Df&+VM
zP+lH~w(tS!h|0n7<oYvnvH-w2hb+rzX=y1LAP55H1CPPdKVYQ3V16pjGii2fWsa1|
zWIzZ3V+^ra4CCYDMGakwg8KUU{5Y}n5wfcsdUy)HSCjBGbjHtjJ=84#!!SSy0cQ-(
z%1SggG!zAhq6o%VejHzT0jkd-GB*K}yCK(hr2bqZQA)EFaE@p!hSAZ{Z24;(k4p?<
z|6T_e4IwZxhohJK5Dcda@+8ABAc`V5V{j=7PM$cihBW}rpocy~3#*v*2T--E6<c;T
zL7g2c*jF9^WSf?IUQJ=O2a=S8h*?aIf5*Ao_W{n4PN!D~gclbvFfd?i>hXBc(cTWz
zh=M=^)qL;|f5M^TU2tyR0bSQ&7)HT5iBg&eRCzqOc;SLAAa|paOJk_2J&c851X^Sa
zCr{tZo*L(%l-gGyt*D^Czu%JJ^?Gso)T#VfgpNd%A{tKO*rjer8!Ga#qDRD}?0xfA
zSEKXF7267Odi^elow9~4wP)ek-Ikx{fb9_x!!T?EcB0D~?%wNx;67$C&k}g?9+;+C
z5+M3*27SFfsM&X<AXc;oj4?3AkjZ4$1Z>@&{hr(9nx+ZHSRnuaXN+YYba$`&|3wgl
c$e(k+0ORU<%-A`W^#A|>07*qoM6N<$f|vBGQvd(}
--- a/mail/themes/qute/mail/messageQuotes.css
+++ b/mail/themes/qute/mail/messageQuotes.css
@@ -7,46 +7,48 @@
   == between the message body during
   == message display and the mail editor instance for mail compose.
   ======================================================================= */
 
 /* ::::: signature ::::: */
 
 .moz-txt-sig,
 .moz-signature {
-  color: gray;
+  color: rgb(136,138,133); /* Aluminum 4 */
 }
 
 .moz-txt-sig > a,
 .moz-signature > a {
-  color: #7777FF; /* light blue */
+  color: rgb(114,159,207); /* Sky Blue 1 */
 }
 
 /* ::::: Turn on borders and padding for quotes. ::::: */
 
 blockquote[type=cite] {
-  padding: 0em 1em .5em;
-  border-right: 2px solid;
-  border-left: 2px solid;
+  padding: 0.4ex 1ex;
+  margin: 1ex;
+  border-width: 0 2px;
+  border-style: none solid none solid;
+  -moz-border-radius: 2px;
 }
 
 /* ::::: Colorize block quote borders. We only go 5 levels deep. ::::: */
 
 blockquote[type=cite] {
-  border-color: blue;
+  border-color: rgb(114,159,207); /* Sky Blue 1 */
 }
 
 blockquote[type=cite] blockquote[type=cite] {
-  border-color: maroon;
+  border-color: rgb(173,127,168); /* Plum 1 */
 }
 
 blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] {
-  border-color: teal;
+  border-color: rgb(138,226,52); /* Chameleon 1 */
 }
 
 blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] {
-  border-color: purple;
+  border-color: rgb(252,175,62); /* Orange 1 */
 }
 
 blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] blockquote[type=cite] {
-  border-color: green;
+  border-color: rgb(233,185,110); /* Chocolate 1 */
 }
 
--- a/mailnews/base/prefs/content/am-offline.js
+++ b/mailnews/base/prefs/content/am-offline.js
@@ -90,70 +90,133 @@ function initRetentionSettings()
         document.getElementById("nntp.removeBodyMin").setAttribute("value", retentionSettings.daysToKeepBodies);
     else
         document.getElementById("nntp.removeBodyMin").setAttribute("value", "30");
 }
 
 
 function initDownloadSettings()
 {
-
     var downloadSettings =  gIncomingServer.downloadSettings;
     document.getElementById("nntp.downloadMsg").checked = downloadSettings.downloadByDate;
     document.getElementById("nntp.notDownloadRead").checked = downloadSettings.downloadUnreadOnly;
     if(downloadSettings.ageLimitOfMsgsToDownload > 0)
         document.getElementById("nntp.downloadMsgMin").setAttribute("value", downloadSettings.ageLimitOfMsgsToDownload);
     else
         document.getElementById("nntp.downloadMsgMin").setAttribute("value", "30");
  
+  // Figure out what the most natural division of the autosync pref into
+  // a value and an interval is.
+  let autosyncInterval = document.getElementById("autosyncInterval");
+  let autosyncValue = document.getElementById("autosyncValue");
+  let autosyncPref = document.getElementById("imap.autoSyncMaxAgeDays");
+  let autosyncPrefValue = (autosyncPref.value == "") ? -1 :
+                                               parseInt(autosyncPref.value, 10);
+
+  // Clear the preference until we're done initializing.
+  autosyncPref.value = "";
+
+  if (autosyncPrefValue <= 0) {
+    // Special-case values <= 0 to have an interval of "All" and a disabled
+    // value of the positive version of the preference, so we don't lose
+    // the last value the user typed.
+    autosyncInterval.value = 0;
+    autosyncValue.value = 31;
+    autosyncValue.disabled = true;
+  }
+  else {
+    // Otherwise, get the list of possible intervals, in order from
+    // largest to smallest.
+    let valuesToTest = [];
+    for (let i = autosyncInterval.itemCount - 1; i >= 0; i--)
+      valuesToTest.push(autosyncInterval.getItemAtIndex(i).value);
+
+    // and find the first one that divides the preference evenly.
+    for (let i in valuesToTest) {
+      if (!(autosyncPrefValue % valuesToTest[i])) {
+        autosyncInterval.value = valuesToTest[i];
+        autosyncValue.value = autosyncPrefValue / autosyncInterval.value;
+        break;
+      }
+    }
+  }
+  autosyncPref.value = autosyncPrefValue;
 }
 
 
 function onPreInit(account, accountValues)
 {
+  gServerType = getAccountValue(account, accountValues, "server", "type", null, false);
+  hideShowControls(gServerType);
+  gIncomingServer = account.incomingServer;
+  gIncomingServer.type = gServerType;
 
-    gServerType = getAccountValue(account, accountValues, "server", "type", null, false);
-    hideShowControls(gServerType);
-    gIncomingServer= account.incomingServer;
-    gIncomingServer.type = gServerType;
-
-    // 10 is OFFLINE_SUPPORT_LEVEL_REGULAR, see nsIMsgIncomingServer.idl
-    // currently, there is no offline without diskspace
-    var titleStringID = (gIncomingServer.offlineSupportLevel >= 10) ?
-     "prefPanel-synchronization" : "prefPanel-diskspace";
+  // 10 is OFFLINE_SUPPORT_LEVEL_REGULAR, see nsIMsgIncomingServer.idl
+  // currently, there is no offline without diskspace
+  var titleStringID = (gIncomingServer.offlineSupportLevel >= 10) ?
+   "prefPanel-synchronization" : "prefPanel-diskspace";
 
-    var prefBundle = document.getElementById("bundle_prefs");
-    var headertitle = document.getElementById("headertitle");
-    headertitle.setAttribute('title',prefBundle.getString(titleStringID));
-    document.title = prefBundle.getString(titleStringID);
+  var prefBundle = document.getElementById("bundle_prefs");
+  var headertitle = document.getElementById("headertitle");
+  headertitle.setAttribute('title',prefBundle.getString(titleStringID));
+  document.title = prefBundle.getString(titleStringID);
 
-    if (gServerType == "pop3")
-    {
-      var pop3Server = gIncomingServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
-      // hide retention settings for deferred accounts
-      if (pop3Server.deferredToAccount.length)
-      {
-        var retentionRadio = document.getElementById("retention.keepMsg");
-        retentionRadio.setAttribute("hidden", "true");
-        var retentionLabel = document.getElementById("retentionDescriptionPop");
-        retentionLabel.setAttribute("hidden", "true");
-        var applyToFlaggedCheckbox = document.getElementById("retention.applyToFlagged");
-        applyToFlaggedCheckbox.setAttribute("hidden", "true");
-      }
+  if (gServerType == "pop3") {
+    var pop3Server = gIncomingServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
+    // hide retention settings for deferred accounts
+    if (pop3Server.deferredToAccount.length) {
+      var retentionRadio = document.getElementById("retention.keepMsg");
+      retentionRadio.setAttribute("hidden", "true");
+      var retentionLabel = document.getElementById("retentionDescriptionPop");
+      retentionLabel.setAttribute("hidden", "true");
+      var applyToFlaggedCheckbox = document.getElementById("retention.applyToFlagged");
+      applyToFlaggedCheckbox.setAttribute("hidden", "true");
     }
+  }
 }
 
 function onClickSelect()
 {
    
     top.window.openDialog("chrome://messenger/content/msgSelectOffline.xul", "", "centerscreen,chrome,modal,titlebar,resizable=yes");
     return true;
 
 }
 
+/**
+ * Handle updates to the Autosync
+ */
+function onAutosyncChange()
+{
+  let autosyncInterval = document.getElementById("autosyncInterval");
+  let autosyncValue = document.getElementById("autosyncValue");
+  let autosyncPref = document.getElementById("imap.autoSyncMaxAgeDays");
+
+  // If we're not done initializing, don't do anything.
+  // (See initDownloadSettings() for more details.)
+  if (autosyncPref.value == "")
+    return;
+
+  // If the user selected the All option, disable the autosync and the
+  // textbox.
+  if (autosyncInterval.value == 0) {
+    autosyncPref.value = 0;
+    autosyncValue.disabled = true;
+    return;
+  }
+
+  let max = 0x7FFFFFFF / (60 * 60 * 24 * autosyncInterval.value);
+  autosyncValue.setAttribute("max", max);
+  if (autosyncValue.value > max)
+    autosyncValue.value = Math.floor(max);
+
+  autosyncValue.disabled = false;
+  autosyncPref.value = autosyncValue.value * autosyncInterval.value;
+}
+
 function onCancel()
 {
     // restore the offline flags for all folders
     restoreOfflineFolders(gOfflineMap);
     return true;
 }
 
 function onSave()
--- a/mailnews/base/prefs/content/am-offline.xul
+++ b/mailnews/base/prefs/content/am-offline.xul
@@ -49,16 +49,19 @@
 
     <stringbundle id="bundle_prefs" src="chrome://messenger/locale/prefs.properties"/> 
 
     <script type="application/x-javascript" src="chrome://messenger/content/AccountManager.js"/>
     <script type="application/x-javascript" src="chrome://messenger/content/retention.js"/>
     <script type="application/x-javascript" src="chrome://messenger/content/am-offline.js"/>
 
     <label hidden="true" wsm_persist="true" id="server.type"/>  
+    <label id="imap.autoSyncMaxAgeDays" hidden="true"
+           wsm_persist="true" preftype="int"
+           prefstring="mail.server.%serverkey%.autosync_max_age_days"/>
 
     <dialogheader id="headertitle"/>
 
     <groupbox id="offline.titlebox" hidefor="movemail,pop3,none,rss">
       <caption label="&syncGroupTitle.label;"/>
 
     <checkbox hidefor="movemail,pop3,nntp,none" 
               id="offline.folders" label="&allFoldersOffline.label;"
@@ -77,43 +80,67 @@
                 oncommand="onClickSelect()" id="selectNewsgroupsButton" class="selectForOfflineUseButton"/>
     </hbox>
 
     </groupbox>
 
     <groupbox id="diskspace.titlebox">
       <caption label="&diskspaceGroupTitle.label;" hidefor="movemail,pop3,none,rss"/>
 
+    <!-- IMAP Autosync Preference -->
+    <hbox align="center" hidefor="movemail,pop3,nntp,none,rss">
+      <label id="useAutosyncBefore">&useAutosyncBefore.label;</label>
+      <textbox id="autosyncValue" type="number" size="5" min="1"
+               class="autosync" onchange="onAutosyncChange();"
+               aria-labelledby="useAutosyncBefore autosyncValue useAutosyncMiddle autosyncInterval useAutosyncAfter"/>
+      <label id="useAutosyncMiddle">&useAutosyncMiddle.label;</label>
+      <menulist id="autosyncInterval" onselect="onAutosyncChange();">
+        <menupopup>
+          <menuitem label="&allInterval.label;" value="0"/>
+          <menuitem label="&dayInterval.label;" value="1"/>
+          <menuitem label="&weekInterval.label;" value="7"/>
+          <menuitem label="&monthInterval.label;" value="31"/>
+          <menuitem label="&yearInterval.label;" value="365"/>
+        </menupopup>
+      </menulist>
+      <label id="useAutosyncAfter" control="autosyncValue"
+             flex="1">&useAutosyncAfter.label;</label>
+    </hbox>
+
     <description hidefor="pop3,movemail,none,rss">&doNotDownload.label;</description>
     <description hidefor="imap,nntp,none,rss">&doNotDownloadPop3Movemail.label;</description>
 
     <hbox align="center" class="indent" hidefor="rss">
         <checkbox hidefor="movemail,pop3,imap,none"
                   id="nntp.notDownloadRead" wsm_persist="true"
-                  label="&nntpNotDownloadRead.label;" accesskey="&nntpNotDownloadRead.accesskey;"/>
+                  label="&nntpNotDownloadRead.label;"
+                  accesskey="&nntpNotDownloadRead.accesskey;"/>
     </hbox>
 
     <hbox align="center" class="indent" hidefor="none,rss">
         <checkbox wsm_persist="true" id="offline.notDownload"
-                  label="&offlineNotDownload.label;" accesskey="&offlineNotDownload.accesskey;"
+                  label="&offlineNotDownload.label;"
+                  accesskey="&offlineNotDownload.accesskey;"
                   oncommand="onCheckItem('offline.notDownloadMin', 'offline.notDownload');"/>
         <textbox wsm_persist="true" id="offline.notDownloadMin"
                  type="number" min="1" increment="10" size="4" value="50"
                  aria-labelledby="offline.notDownload offline.notDownloadMin kbLabel"/>
         <label value="&kb.label;" control="offline.notDownloadMin" id="kbLabel"/>
     </hbox>
 
     <hbox align="center" class="indent" hidefor="movemail,pop3,imap,none,rss">
         <checkbox wsm_persist="true" id="nntp.downloadMsg"
-                  label="&nntpDownloadMsg.label;" accesskey="&nntpDownloadMsg.accesskey;"
+                  label="&nntpDownloadMsg.label;"
+                  accesskey="&nntpDownloadMsg.accesskey;"
                   oncommand="onCheckItem('nntp.downloadMsgMin', 'nntp.downloadMsg');"/>
         <textbox wsm_persist="true" id="nntp.downloadMsgMin"
                  type="number" min="1" size="2" value="30"
                  aria-labelledby="nntp.downloadMsg nntp.downloadMsgMin daysOldLabel"/>
-        <label value="&daysOld.label;" control="nntp.downloadMsgMin" id="daysOldLabel"/>
+        <label value="&daysOld.label;" control="nntp.downloadMsgMin"
+               id="daysOldLabel"/>
     </hbox>
 
     <vbox align="start">
     <separator hidefor="none,rss"/>
     <label id="retentionDescription" hidefor="imap,pop3" class="desc" control="retention.keepMsg">&retentionCleanup.label;</label>
     <label id="retentionDescriptionImap" hidefor="movemail,pop3,nntp,none,rss" class="desc" control="retention.keepMsg">&retentionCleanupImap.label;</label>
     <label id="retentionDescriptionPop" hidefor="movemail,imap,nntp,none,rss" class="desc" control="retention.keepMsg">&retentionCleanupPop.label;</label>
 
--- a/mailnews/base/search/src/nsMsgSearchSession.cpp
+++ b/mailnews/base/search/src/nsMsgSearchSession.cpp
@@ -488,16 +488,17 @@ nsresult nsMsgSearchSession::GetNextUrl(
   nsCOMPtr<nsIMsgWindow> msgWindow(do_QueryReferent(m_msgWindowWeak));
   if (msgWindow)
     msgWindow->GetStopped(&stopped);
   if (stopped)
     return NS_OK;
 
   m_urlQueue.CStringAt(m_urlQueueIndex, nextUrl);
   nsMsgSearchScopeTerm *currentTerm = GetRunningScope();
+  NS_ENSURE_TRUE(currentTerm, NS_ERROR_NULL_POINTER);
   EnableFolderNotifications(PR_FALSE);
   nsCOMPtr <nsIMsgFolder> folder = currentTerm->m_folder;
   if (folder)
   {
     nsCString folderUri;
     folder->GetURI(folderUri);
     nsresult rv = GetMessageServiceFromURI(folderUri, getter_AddRefs(msgService));
 
--- a/mailnews/imap/test/unit/test_imapFilterActions.js
+++ b/mailnews/imap/test/unit/test_imapFilterActions.js
@@ -419,20 +419,18 @@ function testContinue(source)
     if (gContinueListener == kDeleteOrMoveMsgCompleted &&
         gAction.type == Ci.nsMsgFilterAction.MoveToFolder)
     {
       // Moves give 2 events, just use the second.
       gMoveCallbackCount++;
       if (gMoveCallbackCount != 2)
         return;
     }
-    if (gChecks)
-      gChecks();
     gCurTestNum++;
-    do_timeout(100, "doTest();");
+    do_timeout(200, "doTest();");
   }
 }
 
 // basic preparation done for each test
 function setupTest(aFilter, aAction)
 {
   if (aAction &&
       ((aAction.type == Ci.nsMsgFilterAction.CopyToFolder) ||
@@ -471,16 +469,20 @@ function setupTest(aFilter, aAction)
   gIMAPMailbox.addMessage(new imapMessage(specForFileName(gMessage),
                           gIMAPMailbox.uidnext++, []));
   gIMAPInbox.updateFolderWithListener(null, URLListener);
 }
 
 // run the next test
 function doTest()
 {
+  // Run the checks, if any, from the previous test.
+  if (gChecks)
+    gChecks();
+
   test = gCurTestNum;
   if (test <= gTestArray.length)
   {
 
     var testFn = gTestArray[test-1];
     dump("Doing test " + test + " " + testFn.name + "\n");
     // Set a limit of ten seconds; if the notifications haven't arrived by then there's a problem.
     do_timeout(10000, "if (gCurTestNum == "+test+") \
@@ -751,18 +753,24 @@ function testCounts(aHasNew, aUnreadDelt
        " unread: " + unread +
        " folderNew: " + folderNew +
        " folderNewFlag: " + folderNewFlag +
        " dbNew: " + dbNew +
        "\n");
   do_check_eq(aHasNew, hasNew);
   do_check_eq(aUnreadDelta, unread - gPreviousUnread);
   gPreviousUnread = unread;
-  // this seems to be rest for each folder update
-  do_check_eq(aFolderNewDelta, folderNew);
+  // This seems to be reset for each folder update.
+  //
+  // This check seems to be failing in SeaMonkey builds, yet I can see no ill
+  // effects of this in the actual program. Fixing this is complex because of
+  // the messiness of new count management (see bug 507638 for a
+  // refactoring proposal, and attachment 398899 on bug 514801 for one possible
+  // fix to this particular test). So I am disabling this.
+  //do_check_eq(aFolderNewDelta, folderNew);
   do_check_eq(aDbNewDelta, dbNew - gPreviousDbNew);
   gPreviousDbNew = dbNew;
   } catch (e) {dump(e);}
 }
 
 // print the counts for debugging purposes in this test
 function printListener(listener)
 {
--- a/suite/common/pref/pref-search.xul
+++ b/suite/common/pref/pref-search.xul
@@ -72,17 +72,18 @@
         <menulist id="engineList"
                   ref=""
                   datasources="rdf:internetsearch"
                   sortResource="http://home.netscape.com/NC-rdf#Name"
                   sortDirection="ascending"
                   preference="browser.search.defaultengine">
           <template>
             <menupopup>
-              <menuitem value="..."
+              <menuitem class="menuitem-iconic"
+                        value="..."
                         uri="..."
                         image="rdf:http://home.netscape.com/NC-rdf#Icon"
                         label="rdf:http://home.netscape.com/NC-rdf#Name"/>
             </menupopup>
           </template>
         </menulist>
       </hbox>
     </groupbox>
--- a/suite/locales/en-US/chrome/common/help/shortcuts-mailnews.xhtml
+++ b/suite/locales/en-US/chrome/common/help/shortcuts-mailnews.xhtml
@@ -66,25 +66,25 @@
   <tr>
     <td>New Message</td>
     <td>Ctrl+M</td>
     <td>Cmd+Shift+M</td>
     <td>Ctrl+M</td>
   </tr>
   <tr>
     <td>Get New Messages</td>
-    <td>Ctrl+T</td>
-    <td>Cmd+T</td>
-    <td>Ctrl+T</td>
+    <td>Ctrl+D</td>
+    <td>Cmd+D</td>
+    <td>Ctrl+D</td>
   </tr>
   <tr>
     <td>Get All New Messages</td>
-    <td>Ctrl+Shift+T</td>
-    <td>Cmd+Shift+T</td>
-    <td>Ctrl+Shift+T</td>
+    <td>Ctrl+Shift+D</td>
+    <td>Cmd+Shift+D</td>
+    <td>Ctrl+Shift+D</td>
   </tr>
   <tr>
     <td>Search Messages</td>
     <td>Ctrl+Shift+S</td>
     <td>Cmd+Shift+S</td>
     <td>Ctrl+Shift+S</td>
   </tr>
 </tbody>
--- a/suite/locales/en-US/chrome/common/help/shortcuts.xhtml
+++ b/suite/locales/en-US/chrome/common/help/shortcuts.xhtml
@@ -167,16 +167,22 @@
   </tr>
   <tr>
     <td>Redo</td>
     <td>Ctrl+Y or Ctrl+Shift+Z</td>
     <td>Cmd+Shift+Z</td>
     <td>Ctrl+Y or Ctrl+Shift+Z</td>
   </tr>
   <tr>
+    <td>Focus Search Field</td>
+    <td>Ctrl+F or Ctrl+K</td>
+    <td>Cmd+F or Cmd+K</td>
+    <td>Ctrl+F or Ctrl+K</td>
+  </tr>
+  <tr>
     <td>Find</td>
     <td>Ctrl+F</td>
     <td>Cmd+F</td>
     <td>Ctrl+F</td>
   </tr>
   <tr>
     <td>Find Again</td>
     <td>Ctrl+G or F3</td>
--- a/suite/locales/en-US/chrome/mailnews/pref/am-offline.dtd
+++ b/suite/locales/en-US/chrome/mailnews/pref/am-offline.dtd
@@ -27,8 +27,23 @@
 <!ENTITY nntpRemoveMsgBody.label "Remove bodies from messages more than">
 <!ENTITY nntpRemoveMsgBody.accesskey "o">
 <!ENTITY offlineSelectNntp.label "Select newsgroups for offline use…">
 <!ENTITY offlineSelectNntp.accesskey "S">
 <!ENTITY offlineImapAdvancedOffline.label "Advanced…">
 <!ENTITY offlineImapAdvancedOffline.accesskey "v">
 <!ENTITY syncGroupTitle.label "Message Synchronizing">
 <!ENTITY diskspaceGroupTitle.label "Disk Space">
+
+<!-- LOCALIZATION NOTE: (useAutosyncBefore.label, useAutosyncMiddle.label, useAutosyncAfter.label):
+  The entities useAutosyncBefore.label, useAutosyncMiddle.label, and
+  useAutosyncAfter.label appear on a single line in preferences as follows:
+
+  &useAutosyncBefore.label [textbox for autosync value] &useAutosyncMiddle.label; [dropdown for autosync interval] &useAutosyncAfter.label;
+-->
+<!ENTITY useAutosyncBefore.label         "">
+<!ENTITY useAutosyncMiddle.label         "">
+<!ENTITY allInterval.label               "All">
+<!ENTITY dayInterval.label               "Days of">
+<!ENTITY weekInterval.label              "Weeks of">
+<!ENTITY monthInterval.label             "Months of">
+<!ENTITY yearInterval.label              "Years of">
+<!ENTITY useAutosyncAfter.label          "email will be stored on disk">
--- a/suite/themes/classic/communicator/communicator.css
+++ b/suite/themes/classic/communicator/communicator.css
@@ -96,13 +96,19 @@
   list-style-image: url("chrome://global/skin/arrow/arrow-dn-dis.gif");
 }
 
 .sidebarTree {
   border: none;
   margin: 0px !important;
 }
 
+/* ::::: iconic menuitems ::::: */
+
+menuitem.menuitem-iconic > .menu-iconic-left {
+  display: -moz-box;
+}
+
 /* ::::: download manager ::::: */
 
 #downloadView > treechildren::-moz-tree-image(Name) {
   -moz-margin-end: 2px;
 }
--- a/suite/themes/classic/editor/EditorDialog.css
+++ b/suite/themes/classic/editor/EditorDialog.css
@@ -33,23 +33,16 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 
-/* The defaults are WAY to big! */
-groupbox {
-  margin:         2px 5px /* 4px 5px */;
-  padding-top:    2px;
-  padding-bottom: 4px;
-}
-
 .MinWidth5em {
   min-width: 5em;
 }
 
 .MinWidth10em {
   min-width: 10em;
 }
 
@@ -80,24 +73,16 @@ groupbox {
 .wrap {
  width: 1em;
 }
 
 .menuitem-highlight-1 {
   font-weight : bold;
 }
 
-/* Use this with groove-thin in dialogs 
-   to add margins to top and bottom
-*/
-.tb-margin {
-  margin-top    : 6px;
-  margin-bottom : 6px;
-}
-
 .color-well {
   width: 20px;
   height: 12px; 
   border: 1px inset #CCCCCC;
 }
 
 .color-well[default="true"] {
   border: 1px solid transparent !important;
@@ -105,20 +90,16 @@ groupbox {
 }
 
 .color-button {
   /* override large default min-width */
   min-width : 0px;
   margin: 2px;
 }
 
-.menu-list[focused="true"] {
-  color: white;
-}
-
 #ColorPicker {
   -moz-user-focus: normal;
 }
 
 #ColorPickerSwatch {
   border : 2px outset #CCCCCC;
   width: 25px;
   height: 20px;
@@ -138,36 +119,24 @@ groupbox {
   height: 13px; 
   border: 1px inset #CCCCCC;
   margin-top: 1px;
   margin-bottom: 2px;
   -moz-margin-start: 4px;
   -moz-margin-end: 2px;
 }
 
-/* temporary -- we need a simple box-based list defined in XBL */
-tree.list {
-  border: 1px inset #CCCCCC;
-  /* same as in menulist.css */
-  margin: 1px 5px 2px;
-  /* use rows="#" in XUL to define height */
-}
-
 #ColorPreview {
   border: 1px inset #CCCCCC;
   -moz-margin-start:    10px;
   padding: 0 5px;
   min-width:     100px;
   min-height:     50px;
 }
 
-#alignTypeSelect,label#alignLabel {
-  -moz-margin-start: 5px;
-}
-
 /* ::::: table properties dialog ::::: */
 
 #MoreFewerButton[more="0"] {
   list-style-image: url("chrome://global/skin/arrow/arrow-dn.gif");
   min-width: 12em;
 }
 
 #MoreFewerButton[more="1"] {
@@ -188,20 +157,16 @@ tree.list {
 }
 
 #NextButton[type="row"] {
   list-style-image: url("chrome://global/skin/arrow/arrow-dn.gif");
 }
 
 /* ::::: spelling dialog ::::: */
 
-#MisspelledWord {
-  font-weight: bold;
-}
-
 #ReplaceWordInput {
   min-width: 16em;
   width: 16em;
 }
 
 .spell-check {
   min-width: 8em;
 }
@@ -251,38 +216,39 @@ tree.list {
   min-width: 2em;
 }
 
 .radio-spacer {
   width: 2em;
   min-width: 2em;
 }
 
-#alignTypeSelect {
-  height: 34px;
+.align-menu > .menu-iconic-left > .menu-iconic-icon {
+  height: auto;
+  width: auto;
 }
 
 .align-menu[value="top"] {
-  list-style-image:url("chrome://editor/skin/icons/img-align-top.gif");
+  list-style-image:url("chrome://editor/skin/icons/img-align-top.gif") !important;
 }
 
 .align-menu[value="middle"] {
-  list-style-image:url("chrome://editor/skin/icons/img-align-middle.gif");
+  list-style-image:url("chrome://editor/skin/icons/img-align-middle.gif") !important;
 }
 
 .align-menu[value="bottom"] {
-  list-style-image:url("chrome://editor/skin/icons/img-align-bottom.gif");
+  list-style-image:url("chrome://editor/skin/icons/img-align-bottom.gif") !important;
 }
 
 .align-menu[value="right"] {
-  list-style-image:url("chrome://editor/skin/icons/img-align-right.gif");
+  list-style-image:url("chrome://editor/skin/icons/img-align-right.gif") !important;
 }
 
 .align-menu[value="left"] {
-  list-style-image:url("chrome://editor/skin/icons/img-align-left.gif");
+  list-style-image:url("chrome://editor/skin/icons/img-align-left.gif") !important;
 }
 
 /* Don't change width/height of these without changing values in 
   GetOriginalWidth(), EdImageProps.js
 */    
 #preview-image-box {
   border: 1px inset #CCCCCC;
   width      : 82px;
@@ -315,20 +281,16 @@ tree.list {
 /* styles for an attribute tree-table */
 tree.AttributesTree {
   min-width : 200px;
   min-height: 200px;
 }
 
 /* ::::: select edit dialog ::::: */
 
-#SelectTreeChildren::-moz-tree-cell(SelectSelCol, checked-false) {
-  background: url("chrome://global/skin/checkbox/cbox.gif") 50% 50% no-repeat;
-}
-
 #SelectTreeChildren::-moz-tree-cell(SelectSelCol, checked-true) {
   background: url("chrome://global/skin/checkbox/cbox-check.gif") 50% 50% no-repeat;
 }
 
 /* ::::: Publishing Progress ::::: */
 
 .progressitem[progress="busy"] {
 	list-style-image: url("chrome://editor/skin/icons/progress-busy.gif");
--- a/suite/themes/classic/jar.mn
+++ b/suite/themes/classic/jar.mn
@@ -1,12 +1,11 @@
 classic.jar:
 % skin communicator classic/1.0 %skin/classic/communicator/
 % skin editor classic/1.0 %skin/classic/editor/
-% skin global classic/1.0 %skin/classic/global/
 % skin messenger classic/1.0 %skin/classic/messenger/
 % skin navigator classic/1.0 %skin/classic/navigator/
 % skin messenger-newsblog classic/1.0 %skin/classic/messenger-newsblog/
 % style chrome://global/content/customizeToolbar.xul chrome://navigator/skin/navigator.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/primaryToolbar.css
 #ifdef XP_MACOSX
   skin/classic/communicator/aboutSessionRestore.css                     (mac/communicator/aboutSessionRestore.css)
   skin/classic/communicator/button.css                                  (mac/communicator/button.css)
--- a/suite/themes/modern/communicator/aboutSessionRestore.css
+++ b/suite/themes/modern/communicator/aboutSessionRestore.css
@@ -64,15 +64,15 @@ treechildren::-moz-tree-checkbox {
   list-style-image: url("chrome://global/skin/checkbox/cbox.gif");
 }
 
 treechildren::-moz-tree-checkbox(checked) {
   list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
 }
 
 treechildren::-moz-tree-checkbox(partial) {
-  list-style-image: url("chrome://global/skin/checkbox/cbox-check-dis.gif");
+  list-style-image: url("chrome://global/skin/checkbox/cbox-dis-check.gif");
 }
 
 #buttons {
   margin-top: 2em;
   -moz-margin-start: 80px;
 }