Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 08 Sep 2017 13:41:21 -0700
changeset 429361 e78342f09ee6e90b78dc098742f3b0bae3b9bc84
parent 429360 b6ba84c8ef63bafcba2852bc8238af3d1b492b28 (current diff)
parent 429279 ea7b55d65d76214f97aaae502d65cb26fc6f5659 (diff)
child 429362 3fd3709c370c8c0866d59c2e7295f4f3301a73c8
push id7761
push userjlund@mozilla.com
push dateFri, 15 Sep 2017 00:19:52 +0000
treeherdermozilla-beta@c38455951db4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone57.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to inbound, a=merge MozReview-Commit-ID: 4CJDJBAcVPL
devtools/client/webide/test/addons/fxdt-adapters-linux32.xpi
devtools/client/webide/test/addons/fxdt-adapters-linux64.xpi
devtools/client/webide/test/addons/fxdt-adapters-mac64.xpi
devtools/client/webide/test/addons/fxdt-adapters-win32.xpi
devtools/server/actors/styleeditor.js
devtools/shared/fronts/styleeditor.js
devtools/shared/specs/styleeditor.js
modules/libpref/init/all.js
toolkit/components/gfx/SanityTest.js
--- a/browser/app/permissions
+++ b/browser/app/permissions
@@ -3,16 +3,17 @@
 # * matchtype \t type \t permission \t host
 # * "origin" should be used for matchtype, "host" is supported for legacy reasons
 # * type is a string that identifies the type of permission (e.g. "cookie")
 # * permission is an integer between 1 and 15
 # See nsPermissionManager.cpp for more...
 
 # UITour
 origin	uitour	1	https://www.mozilla.org
+origin	uitour	1	https://screenshots.firefox.com
 origin	uitour	1	https://support.mozilla.org
 origin	uitour	1	https://addons.mozilla.org
 origin	uitour	1	https://discovery.addons.mozilla.org
 origin	uitour	1	about:home
 origin	uitour	1	about:newtab
 
 # XPInstall
 origin	install	1	https://addons.mozilla.org
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -1148,17 +1148,17 @@ var PlacesMenuDNDHandler = {
  */
 var PlacesToolbarHelper = {
   _place: "place:folder=TOOLBAR",
 
   get _viewElt() {
     return document.getElementById("PlacesToolbar");
   },
 
-  init: function PTH_init(forceToolbarOverflowCheck) {
+  init: function PTH_init() {
     let viewElt = this._viewElt;
     if (!viewElt || viewElt._placesView)
       return;
 
     // CustomizableUI.addListener is idempotent, so we can safely
     // call this multiple times.
     CustomizableUI.addListener(this);
 
@@ -1175,25 +1175,22 @@ var PlacesToolbarHelper = {
     // customizing, because that will happen when the customization is done.
     let toolbar = this._getParentToolbar(viewElt);
     if (!toolbar || toolbar.collapsed || this._isCustomizing ||
         getComputedStyle(toolbar, "").display == "none") {
       return;
     }
 
     new PlacesToolbar(this._place);
-    if (forceToolbarOverflowCheck) {
-      viewElt._placesView.updateOverflowStatus();
-    }
   },
 
   handleEvent(event) {
     switch (event.type) {
       case "toolbarvisibilitychange":
-        if (event.target == this._viewElt.parentNode.parentNode)
+        if (event.target == this._getParentToolbar(this._viewElt))
           this._resetView();
         break;
     }
   },
 
   uninit: function PTH_uninit() {
     if (this._isObservingToolbars) {
       delete this._isObservingToolbars;
@@ -1209,17 +1206,17 @@ var PlacesToolbarHelper = {
         viewElt._placesView.uninit();
     } finally {
       this._isCustomizing = true;
     }
   },
 
   customizeDone: function PTH_customizeDone() {
     this._isCustomizing = false;
-    this.init(true);
+    this.init();
   },
 
   onPlaceholderCommand() {
     let widgetGroup = CustomizableUI.getWidget("personal-bookmarks");
     let widget = widgetGroup.forWindow(window);
     if (widget.overflowed ||
         widgetGroup.areaType == CustomizableUI.TYPE_MENU_PANEL) {
       PlacesCommandHook.showPlacesOrganizer("BookmarksToolbar");
@@ -1260,17 +1257,17 @@ var PlacesToolbarHelper = {
     if (this._viewElt) {
       // It's possible that the placesView might not exist, and we need to
       // do a full init. This could happen if the Bookmarks Toolbar Items are
       // moved to the Menu Panel, and then to the toolbar with the "Add to Toolbar"
       // context menu option, outside of customize mode.
       if (this._viewElt._placesView) {
         this._viewElt._placesView.uninit();
       }
-      this.init(true);
+      this.init();
     }
   },
 };
 
 var RecentBookmarksMenuUI = {
   RECENTLY_BOOKMARKED_PREF: "browser.bookmarks.showRecentlyBookmarked",
   MAX_RESULTS: 5,
   // This timeout affects how soon the recent menu items are updated when
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -7489,30 +7489,30 @@ var gIdentityHandler = {
       }
     }
 
     if (hasGrantedPermissions) {
       this._identityBox.classList.add("grantedPermissions");
     }
 
     // Push the appropriate strings out to the UI
-    this._connectionIcon.tooltipText = tooltip;
+    this._connectionIcon.setAttribute("tooltiptext", tooltip);
 
     if (this._isExtensionPage) {
       let extensionName = extensionNameFromURI(this._uri);
-      this._extensionIcon.tooltipText = gNavigatorBundle.getFormattedString(
-        "identity.extension.tooltip", [extensionName]);
-    }
-
-    this._identityIconLabels.tooltipText = tooltip;
-    this._identityIcon.tooltipText = gNavigatorBundle.getString("identity.icon.tooltip");
-    this._identityIconLabel.value = icon_label;
-    this._identityIconCountryLabel.value = icon_country_label;
+      this._extensionIcon.setAttribute("tooltiptext",
+        gNavigatorBundle.getFormattedString("identity.extension.tooltip", [extensionName]));
+    }
+
+    this._identityIconLabels.setAttribute("tooltiptext", tooltip);
+    this._identityIcon.setAttribute("tooltiptext", gNavigatorBundle.getString("identity.icon.tooltip"));
+    this._identityIconLabel.setAttribute("value", icon_label);
+    this._identityIconCountryLabel.setAttribute("value", icon_country_label);
     // Set cropping and direction
-    this._identityIconLabel.crop = icon_country_label ? "end" : "center";
+    this._identityIconLabel.setAttribute("crop", icon_country_label ? "end" : "center");
     this._identityIconLabel.parentNode.style.direction = icon_labels_dir;
     // Hide completely if the organization label is empty
     this._identityIconLabel.parentNode.collapsed = !icon_label;
   },
 
   /**
    * Set up the title and content messages for the identity message popup,
    * based on the specified mode, and the details of the SSL cert, where
--- a/browser/base/content/newtab/newTab.css
+++ b/browser/base/content/newtab/newTab.css
@@ -30,16 +30,18 @@ input[type=button] {
   cursor: pointer;
 }
 
 /* UNDO */
 #newtab-undo-container {
   transition: opacity 100ms ease-out;
   -moz-box-align: center;
   -moz-box-pack: center;
+  position: relative;
+  left: -50%;
 }
 
 #newtab-undo-container[undo-disabled] {
   opacity: 0;
   pointer-events: none;
 }
 
 /* CUSTOMIZE */
@@ -60,17 +62,17 @@ input[type=button] {
   display: -moz-box;
   position: relative;
   -moz-box-flex: 1;
   -moz-box-orient: vertical;
 }
 
 #newtab-margin-undo-container {
   display: -moz-box;
-  left: 6px;
+  left: 50%;
   position: absolute;
   top: 6px;
   z-index: 1;
 }
 
 #newtab-margin-undo-container:dir(rtl) {
   left: auto;
   right: 6px;
--- a/browser/base/content/test/performance/browser.ini
+++ b/browser/base/content/test/performance/browser.ini
@@ -1,18 +1,16 @@
 [DEFAULT]
 support-files =
   head.js
 [browser_appmenu_reflows.js]
 skip-if = asan || debug # Bug 1382809, bug 1369959
 [browser_startup.js]
 [browser_startup_content.js]
 skip-if = !e10s
-[browser_startup_images.js]
-skip-if = !debug
 [browser_tabclose_grow_reflows.js]
 [browser_tabclose_reflows.js]
 [browser_tabopen_reflows.js]
 [browser_tabopen_squeeze_reflows.js]
 [browser_tabstrip_overflow_underflow_reflows.js]
 [browser_tabswitch_reflows.js]
 [browser_toolbariconcolor_restyles.js]
 [browser_urlbar_keyed_search_reflows.js]
--- a/browser/base/content/test/performance/browser_startup_images.js
+++ b/browser/base/content/test/performance/browser_startup_images.js
@@ -37,17 +37,23 @@ const whitelist = [
   {
     file: "chrome://browser/skin/tracking-protection-16.svg#enabled",
     platforms: ["linux", "win", "macosx"],
   },
 
   {
     file: "chrome://browser/skin/tabbrowser/tabDragIndicator.png",
     hidpi: "chrome://browser/skin/tabbrowser/tabDragIndicator@2x.png",
-    platforms: ["linux", "win", "macosx"],
+    platforms: ["macosx"],
+  },
+
+  {
+    file: "chrome://browser/skin/tabbrowser/tabDragIndicator.png",
+    hidpi: "<not loaded>",
+    platforms: ["linux", "win"],
   },
 
   {
     file: "resource://gre-resources/loading-image.png",
     platforms: ["win", "macosx"],
     intermittentNotLoaded: ["win", "macosx"],
   },
   {
@@ -63,16 +69,20 @@ const whitelist = [
 
   {
     file: "chrome://global/skin/icons/resizer.png",
     platforms: ["win"],
   },
 ];
 
 add_task(async function() {
+  if (!AppConstants.DEBUG) {
+    ok(false, "You need to run this test on a debug build.");
+  }
+
   let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService().wrappedJSObject;
   await startupRecorder.done;
 
   let data = startupRecorder.data.images;
   let filteredWhitelist = whitelist.filter(el => {
     return el.platforms.includes(AppConstants.platform);
   });
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/performance/hidpi/browser.ini
@@ -0,0 +1,6 @@
+[DEFAULT]
+prefs =
+  layout.css.devPixelsPerPx='2'
+
+[../browser_startup_images.js]
+skip-if = !debug || (os == 'win' && os_version == '6.1') # hidpi results in the toolbar overflowing on Win 7
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/performance/lowdpi/browser.ini
@@ -0,0 +1,6 @@
+[DEFAULT]
+prefs =
+  layout.css.devPixelsPerPx='1'
+
+[../browser_startup_images.js]
+skip-if = !debug
--- a/browser/base/content/test/popupNotifications/browser_popupNotification_4.js
+++ b/browser/base/content/test/popupNotifications/browser_popupNotification_4.js
@@ -208,10 +208,24 @@ var tests = [
       };
 
       let notification = showNotification(notifyObj);
       ok(notifyObj.showingCallbackTriggered, "the showing callback was triggered");
       ok(!notifyObj.shownCallbackTriggered, "the shown callback wasn't triggered");
       notification.remove();
       goNext();
     }
-  }
+  },
+  // the main action button should apply non-default(no highlight) style.
+  { id: "Test#11",
+    run() {
+      this.notifyObj = new BasicNotification(this.id);
+      this.notifyObj.mainAction.disableHighlight = true;
+      this.notifyObj.secondaryActions = undefined;
+      this.notification = showNotification(this.notifyObj);
+    },
+    onShown(popup) {
+      checkPopup(popup, this.notifyObj);
+      dismissNotification(popup);
+    },
+    onHidden() { }
+  },
 ];
--- a/browser/base/content/test/popupNotifications/head.js
+++ b/browser/base/content/test/popupNotifications/head.js
@@ -205,16 +205,19 @@ function checkPopup(popup, notifyObj) {
   }
   is(notification.getAttribute("label"), notifyObj.message, "message matches");
   is(notification.id, notifyObj.id + "-notification", "id matches");
   if (notifyObj.mainAction) {
     is(notification.getAttribute("buttonlabel"), notifyObj.mainAction.label,
        "main action label matches");
     is(notification.getAttribute("buttonaccesskey"),
        notifyObj.mainAction.accessKey, "main action accesskey matches");
+    is(notification.getAttribute("buttonhighlight"),
+       (!notifyObj.mainAction.disableHighlight).toString(),
+       "main action highlight matches");
   }
   if (notifyObj.secondaryActions && notifyObj.secondaryActions.length > 0) {
     let secondaryAction = notifyObj.secondaryActions[0];
     is(notification.getAttribute("secondarybuttonlabel"), secondaryAction.label,
        "secondary action label matches");
     is(notification.getAttribute("secondarybuttonaccesskey"),
        secondaryAction.accessKey, "secondary action accesskey matches");
   }
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
@@ -23,16 +23,18 @@ BROWSER_CHROME_MANIFESTS += [
     'content/test/captivePortal/browser.ini',
     'content/test/contextMenu/browser.ini',
     'content/test/forms/browser.ini',
     'content/test/general/browser.ini',
     'content/test/metaTags/browser.ini',
     'content/test/newtab/browser.ini',
     'content/test/pageinfo/browser.ini',
     'content/test/performance/browser.ini',
+    'content/test/performance/hidpi/browser.ini',
+    'content/test/performance/lowdpi/browser.ini',
     'content/test/permissions/browser.ini',
     'content/test/plugins/browser.ini',
     'content/test/popupNotifications/browser.ini',
     'content/test/popups/browser.ini',
     'content/test/referrer/browser.ini',
     'content/test/sidebar/browser.ini',
     'content/test/siteIdentity/browser.ini',
     'content/test/static/browser.ini',
--- a/browser/components/customizableui/PanelMultiView.jsm
+++ b/browser/components/customizableui/PanelMultiView.jsm
@@ -874,17 +874,17 @@ this.PanelMultiView = class {
       case "popupshowing":
         this.node.setAttribute("panelopen", "true");
         // Bug 941196 - The panel can get taller when opening a subview. Disabling
         // autoPositioning means that the panel won't jump around if an opened
         // subview causes the panel to exceed the dimensions of the screen in the
         // direction that the panel originally opened in. This property resets
         // every time the popup closes, which is why we have to set it each time.
         this._panel.autoPosition = false;
-        if (this.panelViews) {
+        if (this.panelViews && !this.node.hasAttribute("disablekeynav")) {
           this.window.addEventListener("keydown", this);
           this._panel.addEventListener("mousemove", this);
         }
 
         // Before opening the panel, we have to limit the maximum height of any
         // view based on the space that will be available. We cannot just use
         // window.screen.availTop and availHeight because these may return an
         // incorrect value when the window spans multiple screens.
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -327,17 +327,17 @@
 
 <panel id="widget-overflow"
        role="group"
        type="arrow"
        noautofocus="true"
        position="bottomcenter topright"
        photon="true"
        hidden="true">
-  <photonpanelmultiview mainViewId="widget-overflow-mainView">
+  <photonpanelmultiview mainViewId="widget-overflow-mainView" disablekeynav="true">
     <panelview id="widget-overflow-mainView"
                context="toolbar-context-menu">
       <vbox class="panel-subview-body">
         <vbox id="widget-overflow-list" class="widget-overflow-list"
               overflowfortoolbar="nav-bar"/>
         <toolbarseparator id="widget-overflow-fixed-separator" hidden="true"/>
         <vbox id="widget-overflow-fixed-list" class="widget-overflow-list" hidden="true"
               emptylabel="&customizeMode.emptyOverflowList.description;"/>
--- a/browser/components/extensions/test/browser/browser_ext_tabs_lazy.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_lazy.js
@@ -6,16 +6,17 @@ const SESSION = {
       {entries: [{url: "about:blank"}]},
       {entries: [{url: "https://example.com/"}]},
     ],
   }],
 };
 
 add_task(async function() {
   SessionStore.setBrowserState(JSON.stringify(SESSION));
+  await promiseWindowRestored(window);
   const tab = gBrowser.tabs[1];
 
   is(tab.getAttribute("pending"), "true", "The tab is pending restore");
   is(tab.linkedBrowser.isConnected, false, "The tab is lazy");
 
   async function background() {
     const [tab] = await browser.tabs.query({url: "https://example.com/"});
     browser.test.assertRejects(
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -15,16 +15,17 @@
  *          openTabContextMenu closeTabContextMenu
  *          openToolsMenu closeToolsMenu
  *          imageBuffer imageBufferFromDataURI
  *          getListStyleImage getPanelForNode
  *          awaitExtensionPanel awaitPopupResize
  *          promiseContentDimensions alterContent
  *          promisePrefChangeObserved openContextMenuInFrame
  *          promiseAnimationFrame getCustomizableUIPanelID
+ *          promiseWindowRestored
  */
 
 // There are shutdown issues for which multiple rejections are left uncaught.
 // This bug should be fixed, but for the moment this directory is whitelisted.
 //
 // NOTE: Entire directory whitelisting should be kept to a minimum. Normally you
 //       should use "expectUncaughtRejection" to flag individual failures.
 const {PromiseTestUtils} = Cu.import("resource://testing-common/PromiseTestUtils.jsm", {});
@@ -443,8 +444,12 @@ function closePageAction(extension, win 
 
 function promisePrefChangeObserved(pref) {
   return new Promise((resolve, reject) =>
     Preferences.observe(pref, function prefObserver() {
       Preferences.ignore(pref, prefObserver);
       resolve();
     }));
 }
+
+function promiseWindowRestored(window) {
+  return new Promise(resolve => window.addEventListener("SSWindowRestored", resolve, {once: true}));
+}
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1673,17 +1673,17 @@ BrowserGlue.prototype = {
         return;
       this._openPreferences("sync", { origin: "doorhanger" });
     }
     this.AlertsService.showAlertNotification(null, title, body, true, null, clickCallback);
   },
 
   // eslint-disable-next-line complexity
   _migrateUI: function BG__migrateUI() {
-    const UI_VERSION = 52;
+    const UI_VERSION = 53;
     const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
 
     let currentUIVersion;
     if (Services.prefs.prefHasUserValue("browser.migration.version")) {
       currentUIVersion = Services.prefs.getIntPref("browser.migration.version");
     } else {
       // This is a new profile, nothing to migrate.
       Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
@@ -2051,16 +2051,29 @@ BrowserGlue.prototype = {
     if (currentUIVersion < 52) {
       // Keep old devtools log persistence behavior after splitting netmonitor and
       // webconsole prefs (bug 1307881).
       if (Services.prefs.getBoolPref("devtools.webconsole.persistlog", false)) {
         Services.prefs.setBoolPref("devtools.netmonitor.persistlog", true);
       }
     }
 
+    // Update user customizations that will interfere with the Safe Browsing V2
+    // to V4 migration (bug 1395419).
+    if (currentUIVersion < 53) {
+      const MALWARE_PREF = "urlclassifier.malwareTable";
+      if (Services.prefs.prefHasUserValue(MALWARE_PREF)) {
+        let malwareList = Services.prefs.getCharPref(MALWARE_PREF);
+        if (malwareList.indexOf("goog-malware-shavar") != -1) {
+          malwareList.replace("goog-malware-shavar", "goog-malware-proto");
+          Services.prefs.setCharPref(MALWARE_PREF, malwareList);
+        }
+      }
+    }
+
     // Update the migration version.
     Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
   },
 
   _checkForDefaultBrowser() {
     // Perform default browser checking.
     if (!ShellService) {
       return;
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -1056,16 +1056,18 @@ PlacesToolbar.prototype = {
         // then compensate the measurement error by considering a larger screen
         // width. Moreover the window could be bigger than the screen.
         let size = button.clientHeight;
         let limit = Math.min(cc, parseInt((window.screen.width * 1.5) / size));
         for (let i = 1; i < limit; ++i) {
           this._insertNewItem(this._resultNode.getChild(i), fragment);
         }
         this._rootElt.appendChild(fragment);
+
+        this.updateNodesVisibility();
       });
     }
 
     if (this._chevronPopup.hasAttribute("type")) {
       // Chevron has already been initialized, but since we are forcing
       // a rebuild of the toolbar, it has to be rebuilt.
       // Otherwise, it will be initialized when the toolbar overflows.
       this._chevronPopup.place = this.place;
@@ -1153,32 +1155,32 @@ PlacesToolbar.prototype = {
       case "unload":
         this.uninit();
         break;
       case "resize":
         // This handler updates nodes visibility in both the toolbar
         // and the chevron popup when a window resize does not change
         // the overflow status of the toolbar.
         if (aEvent.target == aEvent.currentTarget) {
-          this.updateChevron();
+          this.updateNodesVisibility();
         }
         break;
       case "overflow":
         if (!this._isOverflowStateEventRelevant(aEvent))
           return;
         this._onOverflow();
         break;
       case "underflow":
         if (!this._isOverflowStateEventRelevant(aEvent))
           return;
         this._onUnderflow();
         break;
       case "TabOpen":
       case "TabClose":
-        this.updateChevron();
+        this.updateNodesVisibility();
         break;
       case "dragstart":
         this._onDragStart(aEvent);
         break;
       case "dragover":
         this._onDragOver(aEvent);
         break;
       case "dragexit":
@@ -1205,59 +1207,47 @@ PlacesToolbar.prototype = {
       case "popuphidden":
         this._onPopupHidden(aEvent);
         break;
       default:
         throw "Trying to handle unexpected event.";
     }
   },
 
-  updateOverflowStatus() {
-    if (this._rootElt.scrollLeftMin != this._rootElt.scrollLeftMax) {
-      this._onOverflow();
-    } else {
-      this._onUnderflow();
-    }
-  },
-
   _isOverflowStateEventRelevant: function PT_isOverflowStateEventRelevant(aEvent) {
     // Ignore events not aimed at ourselves, as well as purely vertical ones:
     return aEvent.target == aEvent.currentTarget && aEvent.detail > 0;
   },
 
   _onOverflow: function PT_onOverflow() {
     // Attach the popup binding to the chevron popup if it has not yet
     // been initialized.
     if (!this._chevronPopup.hasAttribute("type")) {
       this._chevronPopup.setAttribute("place", this.place);
       this._chevronPopup.setAttribute("type", "places");
     }
     this._chevron.collapsed = false;
-    this.updateChevron();
+    this.updateNodesVisibility();
   },
 
   _onUnderflow: function PT_onUnderflow() {
-    this.updateChevron();
+    this.updateNodesVisibility();
     this._chevron.collapsed = true;
   },
 
-  updateChevron: function PT_updateChevron() {
-    // If the chevron is collapsed there's nothing to update.
-    if (this._chevron.collapsed)
-      return;
-
+  updateNodesVisibility: function PT_updateNodesVisibility() {
     // Update the chevron on a timer.  This will avoid repeated work when
     // lot of changes happen in a small timeframe.
-    if (this._updateChevronTimer)
-      this._updateChevronTimer.cancel();
+    if (this._updateNodesVisibilityTimer)
+      this._updateNodesVisibilityTimer.cancel();
 
-    this._updateChevronTimer = this._setTimer(100);
+    this._updateNodesVisibilityTimer = this._setTimer(100);
   },
 
-  _updateChevronTimerCallback: function PT__updateChevronTimerCallback() {
+  _updateNodesVisibilityTimerCallback: function PT__updateNodesVisibilityTimerCallback() {
     let scrollRect = this._rootElt.getBoundingClientRect();
     let childOverflowed = false;
     for (let child of this._rootElt.childNodes) {
       // Once a child overflows, all the next ones will.
       if (!childOverflowed) {
         let childRect = child.getBoundingClientRect();
         childOverflowed = this.isRTL ? (childRect.left < scrollRect.left)
                                      : (childRect.right > scrollRect.right);
@@ -1271,17 +1261,17 @@ PlacesToolbar.prototype = {
         if (icon)
           child.setAttribute("image", icon);
         child.style.visibility = "visible";
       }
     }
 
     // We rebuild the chevron on popupShowing, so if it is open
     // we must update it.
-    if (this._chevron.open)
+    if (!this._chevron.collapsed && this._chevron.open)
       this._updateChevronPopupNodesVisibility();
     let event = new CustomEvent("BookmarksToolbarVisibilityUpdated", {bubbles: true});
     this._viewElt.dispatchEvent(event);
   },
 
   nodeInserted:
   function PT_nodeInserted(aParentPlacesNode, aPlacesNode, aIndex) {
     let parentElt = this._getDOMNodeForPlacesNode(aParentPlacesNode);
@@ -1309,17 +1299,17 @@ PlacesToolbar.prototype = {
       let prevSiblingOverflowed = aIndex > 0 && aIndex <= children.length &&
                                   children[aIndex - 1].style.visibility == "hidden";
       if (prevSiblingOverflowed) {
         button.style.visibility = "hidden";
       } else {
         let icon = aPlacesNode.icon;
         if (icon)
           button.setAttribute("image", icon);
-        this.updateChevron();
+        this.updateNodesVisibility();
       }
       return;
     }
 
     PlacesViewBase.prototype.nodeInserted.apply(this, arguments);
   },
 
   nodeRemoved:
@@ -1338,17 +1328,17 @@ PlacesToolbar.prototype = {
       let overflowed = elt.style.visibility == "hidden";
       this._removeChild(elt);
       if (this._resultNode.childCount > this._rootElt.childNodes.length) {
         // A new node should be built to keep a coherent number of children.
         this._insertNewItem(this._resultNode.getChild(this._rootElt.childNodes.length),
                             this._rootElt);
       }
       if (!overflowed)
-        this.updateChevron();
+        this.updateNodesVisibility();
       return;
     }
 
     PlacesViewBase.prototype.nodeRemoved.apply(this, arguments);
   },
 
   nodeMoved:
   function PT_nodeMoved(aPlacesNode,
@@ -1386,22 +1376,22 @@ PlacesToolbar.prototype = {
         if (icon)
           elt.setAttribute("image", icon);
       } else {
         this._rootElt.insertBefore(elt, this._rootElt.childNodes[aNewIndex]);
       }
 
       // The chevron view may get nodeMoved after the toolbar.  In such a case,
       // we should ensure (by manually swapping menuitems) that the actual nodes
-      // are in the final position before updateChevron tries to updates their
-      // visibility, or the chevron may go out of sync.
-      // Luckily updateChevron runs on a timer, so, by the time it updates
+      // are in the final position before updateNodesVisibility tries to update
+      // their visibility, or the chevron may go out of sync.
+      // Luckily updateNodesVisibility runs on a timer, so, by the time it updates
       // nodes, the menu has already handled the notification.
 
-      this.updateChevron();
+      this.updateNodesVisibility();
       return;
     }
 
     PlacesViewBase.prototype.nodeMoved.apply(this, arguments);
   },
 
   nodeAnnotationChanged:
   function PT_nodeAnnotationChanged(aPlacesNode, aAnno) {
@@ -1441,17 +1431,17 @@ PlacesToolbar.prototype = {
     PlacesViewBase.prototype.nodeTitleChanged.apply(this, arguments);
 
     // Here we need the <menu>.
     if (elt.localName == "menupopup")
       elt = elt.parentNode;
 
     if (elt.parentNode == this._rootElt) { // Node is on the toolbar.
       if (elt.style.visibility != "hidden")
-        this.updateChevron();
+        this.updateNodesVisibility();
     }
   },
 
   invalidateContainer: function PT_invalidateContainer(aPlacesNode) {
     let elt = this._getDOMNodeForPlacesNode(aPlacesNode, true);
     // Nothing to do if it's a never-visible node.
     if (!elt)
       return;
@@ -1600,23 +1590,23 @@ PlacesToolbar.prototype = {
 
   _setTimer: function PT_setTimer(aTime) {
     let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
     timer.initWithCallback(this, aTime, timer.TYPE_ONE_SHOT);
     return timer;
   },
 
   notify: function PT_notify(aTimer) {
-    if (aTimer == this._updateChevronTimer) {
-      this._updateChevronTimer = null;
+    if (aTimer == this._updateNodesVisibilityTimer) {
+      this._updateNodesVisibilityTimer = null;
       // TODO: This should use promiseLayoutFlushed("layout"), so that
-      // _updateChevronTimerCallback can use getBoundsWithoutFlush. But for
-      // yet unknown reasons doing that causes intermittent failures, apparently
-      // due the flush not happening in a meaningful time.
-      window.requestAnimationFrame(this._updateChevronTimerCallback.bind(this));
+      // _updateNodesVisibilityTimerCallback can use getBoundsWithoutFlush. But
+      // for yet unknown reasons doing that causes intermittent failures,
+      // apparently due the flush not happening in a meaningful time.
+      window.requestAnimationFrame(this._updateNodesVisibilityTimerCallback.bind(this));
     } else if (aTimer == this._ibTimer) {
       // * Timer to turn off indicator bar.
       this._dropIndicator.collapsed = true;
       this._ibTimer = null;
     } else if (aTimer == this._overFolder.openTimer) {
       // * Timer to open a menubutton that's being dragged over.
       // Set the autoopen attribute on the folder's menupopup so that
       // the menu will automatically close when the mouse drags off of it.
--- a/browser/components/places/tests/browser/browser_toolbar_overflow.js
+++ b/browser/components/places/tests/browser/browser_toolbar_overflow.js
@@ -30,16 +30,17 @@ add_task(async function setup() {
     await promiseSetToolbarVisibility(gToolbar, true);
     await promiseReady;
   }
   registerCleanupFunction(async () => {
     if (wasCollapsed) {
       await promiseSetToolbarVisibility(gToolbar, false);
     }
     await PlacesUtils.bookmarks.eraseEverything();
+    await PlacesUtils.history.clear();
   });
 });
 
 add_task(async function() {
   // Check that the overflow chevron is visible.
   Assert.ok(!gChevron.collapsed, "The overflow chevron should be visible");
   Assert.ok(gToolbarContent.childNodes.length < BOOKMARKS_COUNT,
             "Not all the nodes should be built by default");
@@ -62,16 +63,46 @@ add_task(async function() {
   await test_move_index("Move node from fist visible to last built",
                         0, gToolbarContent.childNodes.length - 1,
                         "visible", "hidden");
   await test_move_index("Move node from fist visible to first non built",
                         0, gToolbarContent.childNodes.length,
                         "visible", undefined);
 });
 
+add_task(async function test_newWindow_noOverflow() {
+  info("Check toolbar in a new widow when it was already visible and not overflowed");
+  await PlacesUtils.bookmarks.eraseEverything();
+  // Add a single bookmark.
+  await PlacesUtils.bookmarks.insert({
+    parentGuid: PlacesUtils.bookmarks.toolbarGuid,
+    url: "http://toolbar.overflow/",
+    title: "Example"
+  });
+  // Add a favicon for the bookmark.
+  let favicon =  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAA" +
+                 "AAAA6fptVAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==";
+  await PlacesTestUtils.addFavicons(new Map([["http://toolbar.overflow/", favicon]]));
+
+  let win = await BrowserTestUtils.openNewBrowserWindow();
+  try {
+    let toolbar = win.document.getElementById("PersonalToolbar");
+    Assert.ok(!toolbar.collapsed, "The toolbar is not collapsed");
+    let content = win.document.getElementById("PlacesToolbarItems");
+    await BrowserTestUtils.waitForCondition(() => {
+      return content.childNodes.length == 1 &&
+             content.childNodes[0].hasAttribute("image");
+    });
+    let chevron = win.document.getElementById("PlacesChevron");
+    Assert.ok(chevron.collapsed, "The chevron should be collapsed");
+  } finally {
+    await BrowserTestUtils.closeWindow(win);
+  }
+});
+
 async function test_index(desc, index, expected) {
   info(desc);
   let children = gToolbarContent.childNodes;
   let originalLen = children.length;
   let nodeExisted = children.length > index;
   let previousNodeIsVisible = nodeExisted &&
                               children[index - 1].style.visibility == "visible";
   let promiseUpdateVisibility = expected == "visible" || previousNodeIsVisible
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -203,16 +203,25 @@ function debug(aMsg) {
 /**
  * A global value to tell that fingerprinting resistance is enabled or not.
  * If it's enabled, the session restore won't restore the window's size and
  * size mode.
  * This value is controlled by preference privacy.resistFingerprinting.
  */
 var gResistFingerprintingEnabled = false;
 
+/**
+ * Return a promise that will be resolved once it receives event
+ * |SSBrowserWindowShowing| which is dispatched in onBrowserWindowShown.
+ */
+function promiseWindowShowing(window) {
+  return new Promise(resolve => window.addEventListener("SSBrowserWindowShowing",
+    () => resolve(window), {once: true}));
+}
+
 this.SessionStore = {
   get promiseInitialized() {
     return SessionStoreInternal.promiseInitialized;
   },
 
   get promiseAllWindowsRestored() {
     return SessionStoreInternal.promiseAllWindowsRestored;
   },
@@ -687,18 +696,19 @@ var SessionStoreInternal = {
 
           // Update the session start time using the restored session state.
           this._updateSessionStartTime(state);
 
           // make sure that at least the first window doesn't have anything hidden
           delete state.windows[0].hidden;
           // Since nothing is hidden in the first window, it cannot be a popup
           delete state.windows[0].isPopup;
-          // We don't want to minimize and then open a window at startup.
-          if (state.windows[0].sizemode == "minimized")
+          // We don't want to minimize and then open a window at startup. However,
+          // when we're restoring, we should preserve previous windows sizemode.
+          if (state.windows[0].sizemode == "minimized" && !ss.doRestore())
             state.windows[0].sizemode = "normal";
           // clear any lastSessionWindowID attributes since those don't matter
           // during normal restore
           state.windows.forEach(function(aWindow) {
             delete aWindow.__lastSessionWindowID;
           });
         }
       } catch (ex) { debug("The session file is invalid: " + ex); }
@@ -1174,19 +1184,21 @@ var SessionStoreInternal = {
       } else {
         // Nothing to restore, notify observers things are complete.
         Services.obs.notifyObservers(null, NOTIFY_WINDOWS_RESTORED);
         Services.obs.notifyObservers(null, "sessionstore-one-or-no-tab-restored");
         this._deferredAllWindowsRestored.resolve();
       }
     // this window was opened by _openWindowWithState
     } else if (!this._isWindowLoaded(aWindow)) {
-      let state = this._statesToRestore[aWindow.__SS_restoreID];
-      let options = {overwriteTabs: true, isFollowUp: state.windows.length == 1};
-      this.restoreWindow(aWindow, state.windows[0], options);
+      // We used to restore window when it is opened. However, we
+      // want to restore windows after all windows are opened
+      // (bug 1034036). So the restoration process has been moved to
+      // function restoreWindowsFeaturesAndTabs.
+
     // The user opened another, non-private window after starting up with
     // a single private one. Let's restore the session we actually wanted to
     // restore at startup.
     } else if (this._deferredInitialState && !isPrivateWindow &&
              aWindow.toolbar.visible) {
 
       // global data must be restored before restoreWindow is called so that
       // it happens before observers are notified
@@ -1268,16 +1280,20 @@ var SessionStoreInternal = {
    * Called right before a new browser window is shown.
    * @param aWindow
    *        Window reference
    */
   onBeforeBrowserWindowShown(aWindow) {
     // Register the window.
     this.onLoad(aWindow);
 
+    // Dispatch a custom event to tell that a new window is about to be shown.
+    let evt = new aWindow.CustomEvent("SSBrowserWindowShowing");
+    aWindow.dispatchEvent(evt);
+
     // Just call initializeWindow() directly if we're initialized already.
     if (this._sessionInitialized) {
       this.initializeWindow(aWindow);
       return;
     }
 
     // The very first window that is opened creates a promise that is then
     // re-used by all subsequent windows. The promise will be used to tell
@@ -1342,17 +1358,17 @@ var SessionStoreInternal = {
     let completionPromise = Promise.resolve();
     // this window was about to be restored - conserve its original data, if any
     let isFullyLoaded = this._isWindowLoaded(aWindow);
     if (!isFullyLoaded) {
       if (!aWindow.__SSi) {
         aWindow.__SSi = this._generateWindowID();
       }
 
-      this._windows[aWindow.__SSi] = this._statesToRestore[aWindow.__SS_restoreID];
+      this._windows[aWindow.__SSi] = this._statesToRestore[aWindow.__SS_restoreID].windows[0];
       delete this._statesToRestore[aWindow.__SS_restoreID];
       delete aWindow.__SS_restoreID;
     }
 
     // ignore windows not tracked by SessionStore
     if (!aWindow.__SSi || !this._windows[aWindow.__SSi]) {
       return completionPromise;
     }
@@ -2508,16 +2524,17 @@ var SessionStoreInternal = {
     }
 
     // reopen the window
     let state = { windows: this._removeClosedWindow(aIndex) };
     delete state.windows[0].closedAt; // Window is now open.
 
     let window = this._openWindowWithState(state);
     this.windowToFocus = window;
+    promiseWindowShowing(window).then(win => this.restoreWindows(win, state, {overwriteTabs: true}));
 
     // Notify of changes to closed objects.
     this._notifyOfClosedObjectsChange();
 
     return window;
   },
 
   forgetClosedWindow: function ssi_forgetClosedWindow(aIndex) {
@@ -2761,16 +2778,19 @@ var SessionStoreInternal = {
 
     // global data must be restored before restoreWindow is called so that
     // it happens before observers are notified
     this._globalState.setFromState(lastSessionState);
 
     // Restore session cookies.
     SessionCookies.restore(lastSessionState.cookies || []);
 
+    let openedWindows = [];
+    let remainingWindows = [];
+
     // Restore into windows or open new ones as needed.
     for (let i = 0; i < lastSessionState.windows.length; i++) {
       let winState = lastSessionState.windows[i];
       let lastSessionWindowID = winState.__lastSessionWindowID;
       // delete lastSessionWindowID so we don't add that to the window again
       delete winState.__lastSessionWindowID;
 
       // See if we can use an open window. First try one that is associated with
@@ -2789,27 +2809,38 @@ var SessionStoreInternal = {
         // Since we're not overwriting existing tabs, we want to merge _closedTabs,
         // putting existing ones first. Then make sure we're respecting the max pref.
         if (winState._closedTabs && winState._closedTabs.length) {
           let curWinState = this._windows[windowToUse.__SSi];
           curWinState._closedTabs = curWinState._closedTabs.concat(winState._closedTabs);
           curWinState._closedTabs.splice(this._max_tabs_undo, curWinState._closedTabs.length);
         }
 
-        // Restore into that window - pretend it's a followup since we'll already
-        // have a focused window.
         // XXXzpao This is going to merge extData together (taking what was in
         //        winState over what is in the window already.
-        let options = {overwriteTabs: canOverwriteTabs, isFollowUp: true};
-        this.restoreWindow(windowToUse, winState, options);
+        // We don't restore window right away, just store its data.
+        // Later, these windows will be restored with newly opened windows.
+        if ("zIndex" in winState) {
+          windowToUse.__SS_zIndex = winState.zIndex;
+        }
+
+        this._updateWindowRestoreState(windowToUse, {windows: [winState]});
+        windowToUse.__SS_restoreOptions = {overwriteTabs: canOverwriteTabs};
+        openedWindows.push(windowToUse);
       } else {
-        this._openWindowWithState({ windows: [winState] });
+        remainingWindows.push(winState);
       }
     }
 
+    // Actually restore windows in reversed z-order.
+    this.openWindows({windows: remainingWindows}).then(wins => {
+      wins = openedWindows.concat(wins);
+      this.restoreWindowsInReversedZOrder(wins, this._statesToRestore, false);
+    });
+
     // Merge closed windows from this session with ones from last session
     if (lastSessionState._closedWindows) {
       this._closedWindows = this._closedWindows.concat(lastSessionState._closedWindows);
       this._capClosedWindows();
       this._closedObjectsChanged = true;
     }
 
     DevToolsShim.restoreDevToolsSession(lastSessionState);
@@ -3051,27 +3082,49 @@ var SessionStoreInternal = {
     }
 
     return [true, canOverwriteTabs];
   },
 
   /* ........ Saving Functionality .............. */
 
   /**
+   * Return z-index of a window.
+   * If a window is minimized, its z-index is -1.
+   *
+   * @param aWindow
+   *        Window reference
+   * @return z-index of that window
+   */
+  _getZIndex(window) {
+    let isMinimized = this._getWindowDimension(window, "sizemode") == "minimized";
+    return isMinimized ? -1 : window.__SS_zIndex;
+  },
+
+  /**
    * Store window dimensions, visibility, sidebar
    * @param aWindow
    *        Window reference
    */
   _updateWindowFeatures: function ssi_updateWindowFeatures(aWindow) {
     var winData = this._windows[aWindow.__SSi];
 
     WINDOW_ATTRIBUTES.forEach(function(aAttr) {
       winData[aAttr] = this._getWindowDimension(aWindow, aAttr);
     }, this);
 
+    // We only update zIndex when a valid zIndex is found in a window.
+    // There will be a case (flushAllWindowsAsync) where this function
+    // is called outside |forEachBrowserWindow|, therefore, no zIndex
+    // is found.
+    let zIndex = this._getZIndex(aWindow);
+    if (zIndex) {
+      winData.zIndex = this._getZIndex(aWindow);
+    }
+
     var hidden = WINDOW_HIDEABLE_FEATURES.filter(function(aItem) {
       return aWindow[aItem] && !aWindow[aItem].visible;
     });
     if (hidden.length != 0)
       winData.hidden = hidden.join(",");
     else if (winData.hidden)
       delete winData.hidden;
 
@@ -3256,37 +3309,49 @@ var SessionStoreInternal = {
 
     DirtyWindows.remove(aWindow);
     return tabMap;
   },
 
   /* ........ Restoring Functionality .............. */
 
   /**
+   * Open windows with data
+   *
+   * @param root
+   *        Windows data
+   * @returns a promise resolved when all windows have been opened
+   */
+  openWindows(root) {
+    let openedWindowPromises = [];
+    for (let winData of root.windows) {
+      if (winData && winData.tabs && winData.tabs[0]) {
+        let window = this._openWindowWithState({ windows: [winData] });
+        openedWindowPromises.push(promiseWindowShowing(window));
+      }
+    }
+    return Promise.all(openedWindowPromises);
+  },
+
+  /**
    * restore features to a single window
    * @param aWindow
    *        Window reference to the window to use for restoration
    * @param winData
    *        JS object
    * @param aOptions
    *        {overwriteTabs: true} to overwrite existing tabs w/ new ones
-   *        {isFollowUp: true} if this is not the restoration of the 1st window
    *        {firstWindow: true} if this is the first non-private window we're
    *                            restoring in this session, that might open an
    *                            external link as well
    */
   restoreWindow: function ssi_restoreWindow(aWindow, winData, aOptions = {}) {
     let overwriteTabs = aOptions && aOptions.overwriteTabs;
-    let isFollowUp = aOptions && aOptions.isFollowUp;
     let firstWindow = aOptions && aOptions.firstWindow;
 
-    if (isFollowUp) {
-      this.windowToFocus = aWindow;
-    }
-
     // initialize window if necessary
     if (aWindow && (!aWindow.__SSi || !this._windows[aWindow.__SSi]))
       this.onLoad(aWindow);
 
     TelemetryStopwatch.start("FX_SESSION_RESTORE_RESTORE_WINDOW_MS");
 
     // We're not returning from this before we end up calling restoreTabs
     // for this window, so make sure we send the SSWindowStateBusy event.
@@ -3413,17 +3478,16 @@ var SessionStoreInternal = {
     // We want to correlate the window with data from the last session, so
     // assign another id if we have one. Otherwise clear so we don't do
     // anything with it.
     delete aWindow.__SS_lastSessionWindowID;
     if (winData.__lastSessionWindowID)
       aWindow.__SS_lastSessionWindowID = winData.__lastSessionWindowID;
 
     if (overwriteTabs) {
-      this.restoreWindowFeatures(aWindow, winData);
       delete this._windows[aWindow.__SSi].extData;
     }
 
     // Restore cookies from legacy sessions, i.e. before bug 912717.
     SessionCookies.restore(winData.cookies || []);
 
     if (winData.extData) {
       if (!this._windows[aWindow.__SSi].extData) {
@@ -3512,36 +3576,78 @@ var SessionStoreInternal = {
       }
       // A flag indicate that we've prepared a connection for this tab and
       // if is called again, we shouldn't prepare another connection.
       tab.__SS_connectionPrepared = true;
     }
   },
 
   /**
+   * This function will restore window features and then retore window data.
+   *
+   * @param windows
+   *        array of windows to be restored into
+   * @param statesToRestore
+   *        states of windows to be restored
+   */
+  restoreWindowsFeaturesAndTabs(windows, statesToRestore) {
+    // First, we restore window features, so that when users
+    // interacting with a window, we don't steal the window focus.
+    windows.forEach((window) => {
+      let state = statesToRestore[window.__SS_restoreID];
+      this.restoreWindowFeatures(window, state.windows[0]);
+    });
+
+    // Then we restore data into windows.
+    for (let i = 0; i < windows.length; ++i) {
+      let state = statesToRestore[windows[i].__SS_restoreID];
+      let option = windows[i].__SS_restoreOptions || {overwriteTabs: true};
+      this.restoreWindow(windows[i], state.windows[0], option);
+      delete windows[i].__SS_restoreOptions;
+      delete windows[i].__SS_zIndex;
+    }
+  },
+
+  /**
+   * This function will restore window in reversed z-index, so that users
+   * will be presented with most recently used window first.
+   *
+   * @param windows
+   *        array of windows to be restored into
+   * @param statesToRestore
+   *        states of windows to be restored
+   * @param areFollowUps
+   *        a flag indicate these windows are follow-up windows
+   */
+  restoreWindowsInReversedZOrder(windows, statesToRestore, areFollowUps) {
+    if (windows.some(window => !!window.__SS_zIndex)) {
+      windows.sort((a, b) => b.__SS_zIndex - a.__SS_zIndex);
+    }
+
+    if (!areFollowUps) {
+      this.windowToFocus = windows[0];
+    }
+
+    this.restoreWindowsFeaturesAndTabs(windows, statesToRestore);
+  },
+
+  /**
    * Restore multiple windows using the provided state.
    * @param aWindow
    *        Window reference to the first window to use for restoration.
    *        Additionally required windows will be opened.
    * @param aState
    *        JS object or JSON string
    * @param aOptions
    *        {overwriteTabs: true} to overwrite existing tabs w/ new ones
-   *        {isFollowUp: true} if this is not the restoration of the 1st window
    *        {firstWindow: true} if this is the first non-private window we're
    *                            restoring in this session, that might open an
    *                            external link as well
    */
   restoreWindows: function ssi_restoreWindows(aWindow, aState, aOptions = {}) {
-    let isFollowUp = aOptions && aOptions.isFollowUp;
-
-    if (isFollowUp) {
-      this.windowToFocus = aWindow;
-    }
-
     // initialize window if necessary
     if (aWindow && (!aWindow.__SSi || !this._windows[aWindow.__SSi]))
       this.onLoad(aWindow);
 
     let root;
     try {
       root = (typeof aState == "string") ? JSON.parse(aState) : aState;
     } catch (ex) { // invalid state object - don't restore anything
@@ -3557,34 +3663,38 @@ var SessionStoreInternal = {
     }
 
     // We're done here if there are no windows.
     if (!root.windows || !root.windows.length) {
       this._sendRestoreCompletedNotifications();
       return;
     }
 
-    if (!root.selectedWindow || root.selectedWindow > root.windows.length) {
-      root.selectedWindow = 0;
-    }
-
-    // open new windows for all further window entries of a multi-window session
-    // (unless they don't contain any tab data)
-    let winData;
-    for (var w = 1; w < root.windows.length; w++) {
-      winData = root.windows[w];
-      if (winData && winData.tabs && winData.tabs[0]) {
-        var window = this._openWindowWithState({ windows: [winData] });
-        if (w == root.selectedWindow - 1) {
-          this.windowToFocus = window;
-        }
-      }
-    }
-
-    this.restoreWindow(aWindow, root.windows[0], aOptions);
+    // Store z-index to current window so that it can be restored in reversed z-order.
+    let firstWindowData = root.windows.splice(0, 1);
+    if ("zIndex" in firstWindowData[0]) {
+      aWindow.__SS_zIndex = firstWindowData[0].zIndex;
+    }
+
+    // Store the restore state and restore option of the current window,
+    // so that the window can be restored in reversed z-order.
+    this._updateWindowRestoreState(aWindow, {windows: firstWindowData});
+    aWindow.__SS_restoreOptions = aOptions;
+
+    // Begin the restoration: First open all windows in creation order.
+    // After all windows are opened, we restore states to windows in
+    // reversed z-order.
+    this.openWindows(root).then(windows => {
+      // We want to add current window to opened window, so that this window will be
+      // restored in reversed z-order. (We add the window to first position, in case
+      // no z-indices are found, that window will be restored first.)
+      windows.unshift(aWindow);
+
+      this.restoreWindowsInReversedZOrder(windows, this._statesToRestore, false);
+    });
 
     DevToolsShim.restoreDevToolsSession(aState);
   },
 
   /**
    * Manage history restoration for a window
    * @param aWindow
    *        Window to restore the tabs into
@@ -4162,28 +4272,52 @@ var SessionStoreInternal = {
   _updateSessionStartTime: function ssi_updateSessionStartTime(state) {
     // Attempt to load the session start time from the session state
     if (state.session && state.session.startTime) {
       this._sessionStartTime = state.session.startTime;
     }
   },
 
   /**
-   * call a callback for all currently opened browser windows
+   * A boolean flag indicates whether we can iterate over all windows
+   * in their z order.
+   */
+  get isWMZOrderBroken() {
+    let broken_wm_z_order = AppConstants.platform != "macosx" && AppConstants.platform != "win";
+    delete this.isWMZOrderBroken;
+    return this.isWMZOrderBroken = broken_wm_z_order;
+  },
+
+  /**
+   * Call a callback for all currently opened browser windows.
+   * This will iterate the windows in z-index from front to back,
+   * and assign z-index to the window.
    * (might miss the most recent one)
    * @param aFunc
    *        Callback each window is passed to
    */
   _forEachBrowserWindow: function ssi_forEachBrowserWindow(aFunc) {
-    var windowsEnum = Services.wm.getEnumerator("navigator:browser");
-
+    let windowsEnum = this.isWMZOrderBroken ?
+                      Services.wm.getEnumerator("navigator:browser") :
+                      Services.wm.getZOrderDOMWindowEnumerator("navigator:browser", false);
+    let mostRecentWindow = this.isWMZOrderBroken ? this._getMostRecentBrowserWindow() : null;
+
+    // We want to start zIndex at 1, so that, in _updateWindowFeatures, if no z-index is found
+    // in a window, we can just check with a simple condition if: `if (zIndex)`.
+    let zIndex = 1;
     while (windowsEnum.hasMoreElements()) {
-      var window = windowsEnum.getNext();
+      let window = windowsEnum.getNext();
       if (window.__SSi && !window.closed) {
+        if (this.isWMZOrderBroken) {
+          window.__SS_zIndex = mostRecentWindow.__SSi === window.__SSi ? 2 : 1;
+        } else {
+          window.__SS_zIndex = zIndex++;
+        }
         aFunc.call(this, window);
+        delete window.__SS_zIndex;
       }
     }
   },
 
   /**
    * Returns most recent window
    * @returns Window reference
    */
@@ -4205,16 +4339,33 @@ var SessionStoreInternal = {
       if (window.closed) {
         promises.push(this.onClose(window));
       }
     }
     return Promise.all(promises);
   },
 
   /**
+   * Store a restore state of a window to this._statesToRestore. The window
+   * will be given an id that can be used to get the restore state from
+   * this._statesToRestore.
+   *
+   * @param window
+   *        a reference to a window that has a state to restore
+   * @param state
+   *        an object containing session data
+   */
+  _updateWindowRestoreState(window, state) {
+    do {
+      var ID = "window" + Math.random();
+    } while (ID in this._statesToRestore);
+    this._statesToRestore[(window.__SS_restoreID = ID)] = state;
+  },
+
+  /**
    * open a new browser window for a given session state
    * called when restoring a multi-window session
    * @param aState
    *        Object containing session data
    */
   _openWindowWithState: function ssi_openWindowWithState(aState) {
     var argString = Cc["@mozilla.org/supports-string;1"].
                     createInstance(Ci.nsISupportsString);
@@ -4232,20 +4383,22 @@ var SessionStoreInternal = {
     if (winState.isPrivate) {
       features += ",private";
     }
 
     var window =
       Services.ww.openWindow(null, this._prefBranch.getCharPref("chromeURL"),
                              "_blank", features, argString);
 
-    do {
-      var ID = "window" + Math.random();
-    } while (ID in this._statesToRestore);
-    this._statesToRestore[(window.__SS_restoreID = ID)] = aState;
+    // Store z-index, so that windows can be restored in reversed z-order.
+    if ("zIndex" in aState.windows[0]) {
+      window.__SS_zIndex = aState.windows[0].zIndex;
+    }
+
+    this._updateWindowRestoreState(window, aState);
 
     return window;
   },
 
   /**
    * Whether or not to resume session, if not recovering from a crash.
    * @returns bool
    */
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -260,9 +260,9 @@ skip-if = !e10s # GroupedSHistory is e10
 [browser_duplicate_history.js]
 [browser_tabicon_after_bg_tab_crash.js]
 skip-if = !crashreporter || !e10s # Tabs can't crash without e10s
 
 [browser_cookies.js]
 [browser_cookies_legacy.js]
 [browser_cookies_privacy.js]
 [browser_speculative_connect.js]
-
+[browser_restore_reversed_z_order.js]
--- a/browser/components/sessionstore/test/browser_423132.js
+++ b/browser/components/sessionstore/test/browser_423132.js
@@ -32,16 +32,17 @@ add_task(async function() {
   }
   Assert.equal(i, 1, "expected one cookie");
 
   // remove the cookie
   Services.cookies.removeAll();
 
   // restore the window state
   ss.setBrowserState(state);
+  await promiseWindowRestored(window);
 
   // at this point, the cookie should be restored...
   enumerator = Services.cookies.enumerator;
   let cookie2;
   while (enumerator.hasMoreElements()) {
     cookie2 = enumerator.getNext().QueryInterface(Ci.nsICookie);
     if (cookie.name == cookie2.name)
       break;
--- a/browser/components/sessionstore/test/browser_461634.js
+++ b/browser/components/sessionstore/test/browser_461634.js
@@ -33,52 +33,54 @@ function test() {
 
   // Open a window and add the above closed tab list.
   let newWin = openDialog(location, "", "chrome,all,dialog=no");
   promiseWindowLoaded(newWin).then(() => {
     gPrefService.setIntPref("browser.sessionstore.max_tabs_undo",
                             test_state.windows[0]._closedTabs.length);
     ss.setWindowState(newWin, JSON.stringify(test_state), true);
 
-    let closedTabs = SessionStore.getClosedTabData(newWin, false);
+    promiseWindowRestored(newWin).then(() => {
+      let closedTabs = SessionStore.getClosedTabData(newWin, false);
 
-    // Verify that non JSON serialized data is the same as JSON serialized data.
-    is(JSON.stringify(closedTabs), SessionStore.getClosedTabData(newWin),
-       "Non-serialized data is the same as serialized data")
+      // Verify that non JSON serialized data is the same as JSON serialized data.
+      is(JSON.stringify(closedTabs), SessionStore.getClosedTabData(newWin),
+        "Non-serialized data is the same as serialized data")
 
-    is(closedTabs.length, test_state.windows[0]._closedTabs.length,
-       "Closed tab list has the expected length");
-    is(countByTitle(closedTabs, FORGET),
-       test_state.windows[0]._closedTabs.length - remember_count,
-       "The correct amout of tabs are to be forgotten");
-    is(countByTitle(closedTabs, REMEMBER), remember_count,
-       "Everything is set up");
+      is(closedTabs.length, test_state.windows[0]._closedTabs.length,
+        "Closed tab list has the expected length");
+      is(countByTitle(closedTabs, FORGET),
+        test_state.windows[0]._closedTabs.length - remember_count,
+        "The correct amout of tabs are to be forgotten");
+      is(countByTitle(closedTabs, REMEMBER), remember_count,
+        "Everything is set up");
 
-    // All of the following calls with illegal arguments should throw NS_ERROR_ILLEGAL_VALUE.
-    ok(testForError(() => ss.forgetClosedTab({}, 0)),
-       "Invalid window for forgetClosedTab throws");
-    ok(testForError(() => ss.forgetClosedTab(newWin, -1)),
-       "Invalid tab for forgetClosedTab throws");
-    ok(testForError(() => ss.forgetClosedTab(newWin, test_state.windows[0]._closedTabs.length + 1)),
-       "Invalid tab for forgetClosedTab throws");
+      // All of the following calls with illegal arguments should throw NS_ERROR_ILLEGAL_VALUE.
+      ok(testForError(() => ss.forgetClosedTab({}, 0)),
+        "Invalid window for forgetClosedTab throws");
+      ok(testForError(() => ss.forgetClosedTab(newWin, -1)),
+        "Invalid tab for forgetClosedTab throws");
+      ok(testForError(() => ss.forgetClosedTab(newWin, test_state.windows[0]._closedTabs.length + 1)),
+        "Invalid tab for forgetClosedTab throws");
 
-    // Remove third tab, then first tab.
-    ss.forgetClosedTab(newWin, 2);
-    ss.forgetClosedTab(newWin, null);
+      // Remove third tab, then first tab.
+      ss.forgetClosedTab(newWin, 2);
+      ss.forgetClosedTab(newWin, null);
 
-    closedTabs = SessionStore.getClosedTabData(newWin, false);
+      closedTabs = SessionStore.getClosedTabData(newWin, false);
 
-    // Verify that non JSON serialized data is the same as JSON serialized data.
-    is(JSON.stringify(closedTabs), SessionStore.getClosedTabData(newWin),
-       "Non-serialized data is the same as serialized data")
+      // Verify that non JSON serialized data is the same as JSON serialized data.
+      is(JSON.stringify(closedTabs), SessionStore.getClosedTabData(newWin),
+        "Non-serialized data is the same as serialized data")
 
-    is(closedTabs.length, remember_count,
-       "The correct amout of tabs was removed");
-    is(countByTitle(closedTabs, FORGET), 0,
-       "All tabs specifically forgotten were indeed removed");
-    is(countByTitle(closedTabs, REMEMBER), remember_count,
-       "... and tabs not specifically forgetten weren't");
+      is(closedTabs.length, remember_count,
+        "The correct amout of tabs was removed");
+      is(countByTitle(closedTabs, FORGET), 0,
+        "All tabs specifically forgotten were indeed removed");
+      is(countByTitle(closedTabs, REMEMBER), remember_count,
+        "... and tabs not specifically forgetten weren't");
 
-    // Clean up.
-    gPrefService.clearUserPref("browser.sessionstore.max_tabs_undo");
-    BrowserTestUtils.closeWindow(newWin).then(finish);
+      // Clean up.
+      gPrefService.clearUserPref("browser.sessionstore.max_tabs_undo");
+      BrowserTestUtils.closeWindow(newWin).then(finish);
+    });
   });
 }
--- a/browser/components/sessionstore/test/browser_464199.js
+++ b/browser/components/sessionstore/test/browser_464199.js
@@ -52,16 +52,17 @@ add_task(async function() {
   }
 
   // open a window and add the above closed tab list
   let newWin = openDialog(location, "", "chrome,all,dialog=no");
   await promiseWindowLoaded(newWin);
   gPrefService.setIntPref("browser.sessionstore.max_tabs_undo",
                           test_state.windows[0]._closedTabs.length);
   ss.setWindowState(newWin, JSON.stringify(test_state), true);
+  await promiseWindowRestored(newWin);
 
   let closedTabs = JSON.parse(ss.getClosedTabData(newWin));
   is(closedTabs.length, test_state.windows[0]._closedTabs.length,
      "Closed tab list has the expected length");
   is(countByTitle(closedTabs, FORGET),
      test_state.windows[0]._closedTabs.length - remember_count,
      "The correct amout of tabs are to be forgotten");
   is(countByTitle(closedTabs, REMEMBER), remember_count,
--- a/browser/components/sessionstore/test/browser_465223.js
+++ b/browser/components/sessionstore/test/browser_465223.js
@@ -17,29 +17,35 @@ function test() {
   let newWin = openDialog(location, "_blank", "chrome,all,dialog=no");
   promiseWindowLoaded(newWin).then(() => {
     ss.setWindowValue(newWin, uniqueKey1, uniqueValue1);
 
     let newState = { windows: [{ tabs: [{ entries: [] }], extData: {} }] };
     newState.windows[0].extData[uniqueKey2] = uniqueValue2;
     ss.setWindowState(newWin, JSON.stringify(newState), false);
 
-    is(newWin.gBrowser.tabs.length, 2,
-       "original tab wasn't overwritten");
-    is(ss.getWindowValue(newWin, uniqueKey1), uniqueValue1,
-       "window value wasn't overwritten when the tabs weren't");
-    is(ss.getWindowValue(newWin, uniqueKey2), uniqueValue2,
-       "new window value was correctly added");
+    promiseWindowRestored(newWin).then(() => {
+      is(newWin.gBrowser.tabs.length, 2,
+        "original tab wasn't overwritten");
+      is(ss.getWindowValue(newWin, uniqueKey1), uniqueValue1,
+        "window value wasn't overwritten when the tabs weren't");
+      is(ss.getWindowValue(newWin, uniqueKey2), uniqueValue2,
+        "new window value was correctly added");
 
-    newState.windows[0].extData[uniqueKey2] = uniqueValue1;
-    ss.setWindowState(newWin, JSON.stringify(newState), true);
+      newState.windows[0].extData[uniqueKey2] = uniqueValue1;
+      ss.setWindowState(newWin, JSON.stringify(newState), true);
 
-    is(newWin.gBrowser.tabs.length, 1,
-       "original tabs were overwritten");
-    is(ss.getWindowValue(newWin, uniqueKey1), "",
-       "window value was cleared");
-    is(ss.getWindowValue(newWin, uniqueKey2), uniqueValue1,
-       "window value was correctly overwritten");
+      promiseWindowRestored(newWin).then(() => {
+        is(newWin.gBrowser.tabs.length, 1,
+          "original tabs were overwritten");
+        is(ss.getWindowValue(newWin, uniqueKey1), "",
+          "window value was cleared");
+        is(ss.getWindowValue(newWin, uniqueKey2), uniqueValue1,
+          "window value was correctly overwritten");
 
-    // clean up
-    BrowserTestUtils.closeWindow(newWin).then(finish);
+        // clean up
+        BrowserTestUtils.closeWindow(newWin).then(finish);
+
+      });
+    });
   });
 }
+
--- a/browser/components/sessionstore/test/browser_477657.js
+++ b/browser/components/sessionstore/test/browser_477657.js
@@ -20,41 +20,48 @@ function test() {
     let uniqueKey = "bug 477657";
     let uniqueValue = "unik" + Date.now();
 
     ss.setWindowValue(newWin, uniqueKey, uniqueValue);
     is(ss.getWindowValue(newWin, uniqueKey), uniqueValue,
        "window value was set before the window was overwritten");
     ss.setWindowState(newWin, JSON.stringify(newState), true);
 
-    // use newWin.setTimeout(..., 0) to mirror sss_restoreWindowFeatures
-    newWin.setTimeout(function() {
-      is(ss.getWindowValue(newWin, uniqueKey), "",
-         "window value was implicitly cleared");
-
-      is(newWin.windowState, newWin.STATE_MAXIMIZED,
-         "the window was maximized");
-
-      is(JSON.parse(ss.getClosedTabData(newWin)).length, 1,
-         "the closed tab was added before the window was overwritten");
-      delete newState.windows[0]._closedTabs;
-      delete newState.windows[0].sizemode;
-      ss.setWindowState(newWin, JSON.stringify(newState), true);
-
+    promiseWindowRestored(newWin).then(() => {
+      // use newWin.setTimeout(..., 0) to mirror sss_restoreWindowFeatures
       newWin.setTimeout(function() {
-        is(JSON.parse(ss.getClosedTabData(newWin)).length, 0,
-           "closed tabs were implicitly cleared");
+        is(ss.getWindowValue(newWin, uniqueKey), "",
+          "window value was implicitly cleared");
 
         is(newWin.windowState, newWin.STATE_MAXIMIZED,
-           "the window remains maximized");
-        newState.windows[0].sizemode = "normal";
+          "the window was maximized");
+
+        is(JSON.parse(ss.getClosedTabData(newWin)).length, 1,
+          "the closed tab was added before the window was overwritten");
+        delete newState.windows[0]._closedTabs;
+        delete newState.windows[0].sizemode;
         ss.setWindowState(newWin, JSON.stringify(newState), true);
 
-        newWin.setTimeout(function() {
-          isnot(newWin.windowState, newWin.STATE_MAXIMIZED,
-                "the window was explicitly unmaximized");
+        promiseWindowRestored(newWin).then(() => {
+          newWin.setTimeout(function() {
+            is(JSON.parse(ss.getClosedTabData(newWin)).length, 0,
+              "closed tabs were implicitly cleared");
+
+            is(newWin.windowState, newWin.STATE_MAXIMIZED,
+              "the window remains maximized");
+            newState.windows[0].sizemode = "normal";
+            ss.setWindowState(newWin, JSON.stringify(newState), true);
 
-          BrowserTestUtils.closeWindow(newWin).then(finish);
-        }, 0);
+            promiseWindowRestored(newWin).then(() => {
+              newWin.setTimeout(function() {
+                isnot(newWin.windowState, newWin.STATE_MAXIMIZED,
+                  "the window was explicitly unmaximized");
+
+                BrowserTestUtils.closeWindow(newWin).then(finish);
+              }, 0);
+            });
+          }, 0);
+        });
       }, 0);
-    }, 0);
+    });
   });
 }
+
--- a/browser/components/sessionstore/test/browser_490040.js
+++ b/browser/components/sessionstore/test/browser_490040.js
@@ -46,16 +46,17 @@ add_task(async function test_bug_490040(
     let startingClosedWindowCount = ss.getClosedWindowCount();
     await pushPrefs(["browser.sessionstore.max_windows_undo",
                      startingClosedWindowCount + 1]);
 
     let curClosedWindowCount = ss.getClosedWindowCount();
     let win = await BrowserTestUtils.openNewBrowserWindow();
 
     ss.setWindowState(win, JSON.stringify(state.windowState), true);
+    await promiseWindowRestored(win);
     if (state.windowState.windows[0].tabs.length) {
       await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser);
     }
 
     await BrowserTestUtils.closeWindow(win);
 
     is(ss.getClosedWindowCount(),
        curClosedWindowCount + (state.shouldBeAdded ? 1 : 0),
--- a/browser/components/sessionstore/test/browser_491577.js
+++ b/browser/components/sessionstore/test/browser_491577.js
@@ -80,40 +80,43 @@ function test() {
 
   // open a window and add the above closed window list
   let newWin = openDialog(location, "_blank", "chrome,all,dialog=no");
   promiseWindowLoaded(newWin).then(() => {
     gPrefService.setIntPref("browser.sessionstore.max_windows_undo",
                             test_state._closedWindows.length);
     ss.setWindowState(newWin, JSON.stringify(test_state), true);
 
-    let closedWindows = JSON.parse(ss.getClosedWindowData());
-    is(closedWindows.length, test_state._closedWindows.length,
-       "Closed window list has the expected length");
-    is(countByTitle(closedWindows, FORGET),
-       test_state._closedWindows.length - remember_count,
-       "The correct amount of windows are to be forgotten");
-    is(countByTitle(closedWindows, REMEMBER), remember_count,
-       "Everything is set up.");
+    promiseWindowRestored(newWin).then(() => {
+      let closedWindows = JSON.parse(ss.getClosedWindowData());
+      is(closedWindows.length, test_state._closedWindows.length,
+        "Closed window list has the expected length");
+      is(countByTitle(closedWindows, FORGET),
+        test_state._closedWindows.length - remember_count,
+        "The correct amount of windows are to be forgotten");
+      is(countByTitle(closedWindows, REMEMBER), remember_count,
+        "Everything is set up.");
 
-    // all of the following calls with illegal arguments should throw NS_ERROR_ILLEGAL_VALUE
-    ok(testForError(() => ss.forgetClosedWindow(-1)),
-       "Invalid window for forgetClosedWindow throws");
-    ok(testForError(() => ss.forgetClosedWindow(test_state._closedWindows.length + 1)),
-       "Invalid window for forgetClosedWindow throws");
+      // all of the following calls with illegal arguments should throw NS_ERROR_ILLEGAL_VALUE
+      ok(testForError(() => ss.forgetClosedWindow(-1)),
+        "Invalid window for forgetClosedWindow throws");
+      ok(testForError(() => ss.forgetClosedWindow(test_state._closedWindows.length + 1)),
+        "Invalid window for forgetClosedWindow throws");
 
-    // Remove third window, then first window
-    ss.forgetClosedWindow(2);
-    ss.forgetClosedWindow(null);
+      // Remove third window, then first window
+      ss.forgetClosedWindow(2);
+      ss.forgetClosedWindow(null);
 
-    closedWindows = JSON.parse(ss.getClosedWindowData());
-    is(closedWindows.length, remember_count,
-       "The correct amount of windows were removed");
-    is(countByTitle(closedWindows, FORGET), 0,
-       "All windows specifically forgotten were indeed removed");
-    is(countByTitle(closedWindows, REMEMBER), remember_count,
-       "... and windows not specifically forgetten weren't.");
+      closedWindows = JSON.parse(ss.getClosedWindowData());
+      is(closedWindows.length, remember_count,
+        "The correct amount of windows were removed");
+      is(countByTitle(closedWindows, FORGET), 0,
+        "All windows specifically forgotten were indeed removed");
+      is(countByTitle(closedWindows, REMEMBER), remember_count,
+        "... and windows not specifically forgetten weren't.");
 
-    // clean up
-    gPrefService.clearUserPref("browser.sessionstore.max_windows_undo");
-    BrowserTestUtils.closeWindow(newWin).then(finish);
+      // clean up
+      gPrefService.clearUserPref("browser.sessionstore.max_windows_undo");
+      BrowserTestUtils.closeWindow(newWin).then(finish);
+    });
   });
 }
+
--- a/browser/components/sessionstore/test/browser_495495.js
+++ b/browser/components/sessionstore/test/browser_495495.js
@@ -17,26 +17,28 @@ function test() {
       promiseWindowLoaded(newWin).then(() => {
         let state2 = ss.getWindowState(newWin);
 
         function testState(state, expected, callback) {
           let win = openDialog(location, "_blank", "chrome,all,dialog=no");
           promiseWindowLoaded(win).then(() => {
 
             is(win.gURLBar.readOnly, false,
-               "URL bar should not be read-only before setting the state");
+              "URL bar should not be read-only before setting the state");
             is(win.gURLBar.getAttribute("enablehistory"), "true",
-               "URL bar autocomplete should be enabled before setting the state");
+              "URL bar autocomplete should be enabled before setting the state");
             ss.setWindowState(win, state, true);
-            is(win.gURLBar.readOnly, expected.readOnly,
-               "URL bar read-only state should be restored correctly");
-            is(win.gURLBar.getAttribute("enablehistory"), expected.enablehistory,
-               "URL bar autocomplete state should be restored correctly");
+            promiseWindowRestored(win).then(() => {
+              is(win.gURLBar.readOnly, expected.readOnly,
+                "URL bar read-only state should be restored correctly");
+              is(win.gURLBar.getAttribute("enablehistory"), expected.enablehistory,
+                "URL bar autocomplete state should be restored correctly");
 
-            BrowserTestUtils.closeWindow(win).then(callback);
+              BrowserTestUtils.closeWindow(win).then(callback);
+            });
           });
         }
 
         BrowserTestUtils.closeWindow(newWin).then(() => {
           testState(state1, {readOnly: false, enablehistory: "true"}, function() {
             testState(state2, {readOnly: true, enablehistory: "false"}, finish);
           });
         });
--- a/browser/components/sessionstore/test/browser_514751.js
+++ b/browser/components/sessionstore/test/browser_514751.js
@@ -23,14 +23,16 @@ function test() {
     executeSoon(function() {
       var gotError = false;
       try {
         ss.setWindowState(theWin, JSON.stringify(state), true);
       } catch (e) {
         if (/NS_ERROR_MALFORMED_URI/.test(e))
           gotError = true;
       }
-      ok(!gotError, "Didn't get a malformed URI error.");
-      BrowserTestUtils.closeWindow(theWin).then(finish);
+      promiseWindowRestored(theWin).then(() => {
+        ok(!gotError, "Didn't get a malformed URI error.");
+        BrowserTestUtils.closeWindow(theWin).then(finish);
+      });
     });
   }, {once: true});
 }
 
--- a/browser/components/sessionstore/test/browser_607016.js
+++ b/browser/components/sessionstore/test/browser_607016.js
@@ -78,16 +78,17 @@ add_task(async function() {
 
     while (gBrowser.tabs.length > 1) {
       await promiseRemoveTab(gBrowser.tabs[1]);
     }
   }
 
   // Set the test state.
   ss.setBrowserState(JSON.stringify(state));
+  await promiseWindowRestored(window);
 
   // Wait until the selected tab is restored and all others are pending.
   await Promise.all(Array.map(gBrowser.tabs, tab => {
     return (tab == gBrowser.selectedTab) ?
       promiseTabRestored(tab) : promiseTabRestoring(tab)
   }));
 
   // Kick off the actual tests.
--- a/browser/components/sessionstore/test/browser_637020.js
+++ b/browser/components/sessionstore/test/browser_637020.js
@@ -37,16 +37,17 @@ add_task(async function test() {
     }, "domwindowopened");
   });
 
   // Set the new browser state that will
   // restore a window with two slowly loading tabs.
   let backupState = SessionStore.getBrowserState();
   SessionStore.setBrowserState(JSON.stringify(TEST_STATE));
   let win = await promiseWindow;
+  await promiseWindowRestored(win);
 
   // The window has now been opened. Check the state that is returned,
   // this should come from the cache while the window isn't restored, yet.
   info("the window has been opened");
   checkWindows();
 
   // The history has now been restored and the tabs are loading. The data must
   // now come from the window, if it's correctly been marked as dirty before.
--- a/browser/components/sessionstore/test/browser_687710.js
+++ b/browser/components/sessionstore/test/browser_687710.js
@@ -32,17 +32,18 @@ var state = {windows: [{tabs: [{entries:
         docIdentifier: 1,
         url: "http://example.com",
         triggeringPrincipal_base64,
       }
     ]
   }
 ]}]}]}
 
-function test() {
+add_task(async function test() {
   registerCleanupFunction(function() {
     ss.setBrowserState(stateBackup);
   });
 
   /* This test fails by hanging. */
   ss.setBrowserState(JSON.stringify(state));
+  await promiseWindowRestored(window);
   ok(true, "Didn't hang!");
-}
+});
--- a/browser/components/sessionstore/test/browser_694378.js
+++ b/browser/components/sessionstore/test/browser_694378.js
@@ -19,14 +19,17 @@ function test() {
   let gotError = false;
   try {
     ss.setWindowState(window, brokenStateString, true);
   } catch (ex) {
     gotError = true;
     info(ex);
   }
 
-  ok(!gotError, "ss.setWindowState did not throw an error");
+  promiseWindowRestored(window).then(() => {
+    ok(!gotError, "ss.setWindowState did not throw an error");
 
-  // Make sure that we reset the state. Use a full state just in case things get crazy.
-  let blankState = { windows: [{ tabs: [{ entries: [{ url: "about:blank", triggeringPrincipal_base64 }] }]}]};
-  waitForBrowserState(blankState, finish);
+    // Make sure that we reset the state. Use a full state just in case things get crazy.
+    let blankState = { windows: [{ tabs: [{ entries: [{ url: "about:blank", triggeringPrincipal_base64 }] }]}]};
+    waitForBrowserState(blankState, finish);
+  });
 }
+
--- a/browser/components/sessionstore/test/browser_frame_history.js
+++ b/browser/components/sessionstore/test/browser_frame_history.js
@@ -96,29 +96,32 @@ add_task(async function() {
        "frame " + i + " has the right url");
   }
   gBrowser.removeTab(newTab);
 });
 
 // Now, test that we don't record history if the iframe is added dynamically
 add_task(async function() {
   // Start with an empty history
-    let blankState = JSON.stringify({
-      windows: [{
-        tabs: [{ entries: [{ url: "about:blank", triggeringPrincipal_base64 }] }],
-        _closedTabs: []
-      }],
-      _closedWindows: []
-    });
-    ss.setBrowserState(blankState);
+  let blankState = JSON.stringify({
+    windows: [{
+      tabs: [{ entries: [{ url: "about:blank", triggeringPrincipal_base64 }] }],
+      _closedTabs: []
+    }],
+    _closedWindows: []
+  });
+  ss.setBrowserState(blankState);
+  await promiseWindowRestored(window);
 
   let testURL = getRootDirectory(gTestPath) + "browser_frame_history_index_blank.html";
   let tab = BrowserTestUtils.addTab(gBrowser, testURL);
   gBrowser.selectedTab = tab;
+  dump("Wait here\n");
   await waitForLoadsInBrowser(tab.linkedBrowser, 1);
+  dump("Finished Wait here\n");
 
   info("dynamic: Opening a page with an iframe containing three frames, 4 dynamic loads should take place");
   let doc = tab.linkedBrowser.contentDocument;
   let iframe = doc.createElement("iframe");
   iframe.id = "iframe";
   iframe.src = "browser_frame_history_index.html";
   doc.body.appendChild(iframe);
   await waitForLoadsInBrowser(tab.linkedBrowser, 4);
--- a/browser/components/sessionstore/test/browser_merge_closed_tabs.js
+++ b/browser/components/sessionstore/test/browser_merge_closed_tabs.js
@@ -32,21 +32,23 @@ add_task(async function() {
   }
 
   const maxTabsUndo = 4;
   gPrefService.setIntPref("browser.sessionstore.max_tabs_undo", maxTabsUndo);
 
   // Open a new window and restore it to an initial state.
   let win = await promiseNewWindowLoaded({private: false});
   SessionStore.setWindowState(win, JSON.stringify(initialState), true);
+  await promiseWindowRestored(win);
   is(SessionStore.getClosedTabCount(win), 2, "2 closed tabs after restoring initial state");
 
   // Restore the new state but do not overwrite existing tabs (this should
   // cause the closed tabs to be merged).
   SessionStore.setWindowState(win, JSON.stringify(restoreState), false);
+  await promiseWindowRestored(win);
 
   // Verify the windows closed tab data is correct.
   let iClosed = initialState.windows[0]._closedTabs;
   let rClosed = restoreState.windows[0]._closedTabs;
   let cData = JSON.parse(SessionStore.getClosedTabData(win));
 
   is(cData.length, Math.min(iClosed.length + rClosed.length, maxTabsUndo),
      "Number of closed tabs is correct");
--- a/browser/components/sessionstore/test/browser_remoteness_flip_on_restore.js
+++ b/browser/components/sessionstore/test/browser_remoteness_flip_on_restore.js
@@ -130,16 +130,17 @@ async function runScenarios(scenarios) {
       await BrowserTestUtils.switchTab(tabbrowser, tabToSelect);
     }
 
     // Okay, time to test!
     let state = prepareState(scenario.stateToRestore,
                              scenario.selectedTab);
 
     SessionStore.setWindowState(win, state, true);
+    await promiseWindowRestored(win);
 
     for (let i = 0; i < scenario.expectedRemoteness.length; ++i) {
       let expectedRemoteness = scenario.expectedRemoteness[i];
       let tab = tabbrowser.tabs[i];
 
       Assert.equal(tab.linkedBrowser.isRemoteBrowser, expectedRemoteness,
                    "Should have gotten the expected remoteness " +
                    `for the tab at index ${i}`);
--- a/browser/components/sessionstore/test/browser_restore_cookies_noOriginAttributes.js
+++ b/browser/components/sessionstore/test/browser_restore_cookies_noOriginAttributes.js
@@ -130,16 +130,17 @@ add_task(async function run_test() {
   // Clear cookies.
   Services.cookies.removeAll();
 
   // Open a new window.
   let win = await promiseNewWindowLoaded();
 
   // Restore window with session cookies that have no originAttributes.
   ss.setWindowState(win, SESSION_DATA, true);
+  await promiseWindowRestored(win);
 
   let enumerator = Services.cookies.getCookiesFromHost(TEST_HOST, {});
   let cookie;
   let cookieCount = 0;
   while (enumerator.hasMoreElements()) {
     cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
     cookieCount++;
   }
@@ -150,16 +151,17 @@ add_task(async function run_test() {
   is(cookie.value, COOKIE.value, "cookie value successfully restored");
   is(cookie.path, COOKIE.path, "cookie path successfully restored");
 
   // Clear cookies.
   Services.cookies.removeAll();
 
   // Restore window with session cookies that have originAttributes within.
   ss.setWindowState(win, SESSION_DATA_OA, true);
+  await promiseWindowRestored(win);
 
   enumerator = Services.cookies.getCookiesFromHost(TEST_HOST, {});
   cookieCount = 0;
   while (enumerator.hasMoreElements()) {
     cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
     cookieCount++;
   }
 
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_restore_reversed_z_order.js
@@ -0,0 +1,155 @@
+const TEST_URLS_MAP = {
+  "about:about": "About About",
+  "about:license": "Licenses",
+  "about:profiles": "About Profiles",
+  "about:mozilla": "The Book of Mozilla, 15:1"
+};
+const TEST_URLS = Object.keys(TEST_URLS_MAP);
+const TEST_LABELS = Object.values(TEST_URLS_MAP);
+
+const Paths = SessionFile.Paths;
+const BROKEN_WM_Z_ORDER = AppConstants.platform != "macosx" && AppConstants.platform != "win";
+
+let source;
+let state;
+
+function promiseProvideWindow(url, features) {
+  return new Promise(resolve => provideWindow(resolve, url, features));
+}
+
+add_task(async function init() {
+  // Make sure that we start with only primary window.
+  await promiseAllButPrimaryWindowClosed();
+
+  let promises = [];
+  for (let i = 0; i < 4; ++i) {
+    let url = Object.keys(TEST_URLS_MAP)[i];
+    let window = await promiseProvideWindow();
+    BrowserTestUtils.loadURI(window.gBrowser, url);
+    if (i == 2) {
+      window.minimize();
+    }
+    // We want to get the lastest state from each window.
+    await BrowserTestUtils.waitForLocationChange(window.gBrowser, url);
+    await BrowserTestUtils.browserStopped(window.gBrowser.selectedBrowser, url);
+    promises.push(TabStateFlusher.flushWindow(window));
+  }
+
+  // Wait until we get the lastest history from all windows.
+  await Promise.all(promises);
+
+  // Force save state and read the written state.
+  source = await promiseRecoveryFileContents();
+  state = JSON.parse(source);
+
+  // Close all windows as we don't need them.
+  await promiseAllButPrimaryWindowClosed();
+});
+
+add_task(async function test_z_indices_are_saved_correctly() {
+  is(state.windows.length, 4, "Correct number of windows saved");
+
+  // Check if we saved state in correct order of creation.
+  for (let i = 0; i < TEST_URLS.length; ++i) {
+    is(state.windows[i].tabs[0].entries[0].url, TEST_URLS[i],
+       `Window #${i} is stored in correct creation order`);
+  }
+
+  // Check if we saved a valid zIndex (no null, no undefined or no 0).
+  for (let win of state.windows) {
+    ok(win.zIndex, "A valid zIndex is stored");
+  }
+
+  if (BROKEN_WM_Z_ORDER) {
+    // Last window should have zIndex of 2.
+    is(state.windows[3].zIndex, 2, "Currently using window has correct z-index");
+
+    // Other windows should have zIndex of 1.
+    is(state.windows[0].zIndex, 1, "Window #1 has correct z-index");
+    is(state.windows[1].zIndex, 1, "Window #2 has correct z-index");
+
+    // Minimized window should have zIndex of -1.
+    is(state.windows[2].zIndex, -1, "Minimized window has correct z-index");
+  } else {
+    is(state.windows[2].zIndex, -1, "Minimzed window has correct z-index");
+    ok(state.windows[0].zIndex != -1, "Window #1 shouldn't has z-index -1");
+    ok(state.windows[1].zIndex > state.windows[0].zIndex, "Window #2 has correct z-index");
+    ok(state.windows[3].zIndex > state.windows[1].zIndex, "Currently using window has correct z-index");
+  }
+});
+
+add_task(async function test_windows_are_restored_in_reversed_z_index() {
+  let windowsOpened = 1;
+  let windows = [window];
+  let windowsRestored = 0;
+  let tabsRestoredLabels = [];
+
+  // A defer promise that will be resolved once
+  // we restored all tabs.
+  let defer = {};
+  defer.promise = new Promise((resolve, reject) => {
+    defer.resolve = resolve;
+    defer.reject = reject;
+  });
+
+  function allTabsRestored() {
+    is(tabsRestoredLabels[0], TEST_LABELS[3], "First restored tab should be previous used tab");
+    // We don't care about restoration order of windows in between the first and last window
+    // when the OS has broken vm z-order.
+    if (!BROKEN_WM_Z_ORDER) {
+      is(tabsRestoredLabels[1], TEST_LABELS[1], "Second restored tab is correct");
+      is(tabsRestoredLabels[2], TEST_LABELS[0], "Third restored tab is correct");
+    }
+    is(tabsRestoredLabels[3], TEST_LABELS[2], "Last restored tab should be in minimized window");
+
+    // Finish the test.
+    defer.resolve();
+  }
+
+  function onSSWindowRestored(aEvent) {
+    if (++windowsRestored == 4) {
+      // Remove the event listener from each window
+      windows.forEach(function(win) {
+        win.removeEventListener("SSWindowRestored", onSSWindowRestored, true);
+      });
+      executeSoon(allTabsRestored);
+    }
+    tabsRestoredLabels.push(aEvent.target.gBrowser.tabs[0].label);
+  }
+
+  // Used to add our listener to further windows so we can catch SSWindowRestored
+  // coming from them when creating a multi-window state.
+  function windowObserver(aSubject, aTopic, aData) {
+    if (aTopic == "domwindowopened") {
+      let newWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+      newWindow.addEventListener("load", function() {
+        if (++windowsOpened == 3) {
+          Services.ww.unregisterNotification(windowObserver);
+        }
+
+        // Track this window so we can remove the progress listener later.
+        windows.push(newWindow);
+        // Add the progress listener.
+        newWindow.addEventListener("SSWindowRestored", onSSWindowRestored, true);
+      }, { once: true });
+    }
+  }
+
+  Services.ww.registerNotification(windowObserver);
+  registerCleanupFunction(function() {
+    windows.forEach(function(win) {
+      win.removeEventListener("SSWindowRestored", onSSWindowRestored, true);
+      if (win !== window) {
+        BrowserTestUtils.closeWindow(win);
+      }
+    });
+  });
+
+  window.addEventListener("SSWindowRestored", onSSWindowRestored, true);
+
+  // Restore states.
+  ss.setBrowserState(source);
+
+  await defer.promise;
+});
+
--- a/browser/components/sessionstore/test/browser_windowStateContainer.js
+++ b/browser/components/sessionstore/test/browser_windowStateContainer.js
@@ -37,16 +37,17 @@ add_task(async function() {
   // fewer tabs and with different order with win.
   for (let userContextId = 3; userContextId > 0; userContextId--) {
     let tab = win2.gBrowser.addTab("http://example.com/", {userContextId});
     await promiseBrowserLoaded(tab.linkedBrowser);
     await TabStateFlusher.flush(tab.linkedBrowser);
   }
 
   ss.setWindowState(win2, JSON.stringify(winState), true);
+  await promiseWindowRestored(win2);
 
   for (let i = 0; i < 4; i++) {
     let browser = win2.gBrowser.tabs[i].linkedBrowser;
     await ContentTask.spawn(browser, { expectedId: i + 1 }, async function(args) {
       Assert.equal(docShell.getOriginAttributes().userContextId,
                    args.expectedId,
                    "The docShell has the correct userContextId");
 
@@ -97,16 +98,17 @@ add_task(async function() {
   await TabStateFlusher.flush(tab2.linkedBrowser);
 
   // Move the first normal tab to end, so the first tab of win2 will be a
   // container tab.
   win2.gBrowser.moveTabTo(win2.gBrowser.tabs[0], win2.gBrowser.tabs.length - 1);
   await TabStateFlusher.flush(win2.gBrowser.tabs[0].linkedBrowser);
 
   ss.setWindowState(win2, JSON.stringify(winState), true);
+  await promiseWindowRestored(win2);
 
   for (let i = 0; i < 2; i++) {
     let browser = win2.gBrowser.tabs[i].linkedBrowser;
     await ContentTask.spawn(browser, { expectedId: i }, async function(args) {
       Assert.equal(docShell.getOriginAttributes().userContextId,
                    args.expectedId,
                    "The docShell has the correct userContextId");
 
--- a/browser/components/sessionstore/test/head.js
+++ b/browser/components/sessionstore/test/head.js
@@ -181,16 +181,20 @@ function promiseTabState(tab, state) {
     state = JSON.stringify(state);
   }
 
   let promise = promiseTabRestored(tab);
   ss.setTabState(tab, state);
   return promise;
 }
 
+function promiseWindowRestored(win) {
+  return new Promise(resolve => win.addEventListener("SSWindowRestored", resolve, {once: true}));
+}
+
 /**
  * Wait for a content -> chrome message.
  */
 function promiseContentMessage(browser, name) {
   let mm = browser.messageManager;
 
   return new Promise(resolve => {
     function removeListener() {
--- a/browser/components/uitour/UITour-lib.js
+++ b/browser/components/uitour/UITour-lib.js
@@ -115,16 +115,17 @@ if (typeof Mozilla == "undefined") {
    * <li>pageAction-bookmark
    * <li>pageAction-copyURL
    * <li>pageAction-emailLink
    * <li>pageAction-sendToDevice
    * <li>pocket
    * <li>privateWindow
    * <li>quit
    * <li>readerMode-urlBar
+   * <li>screenshots
    * <li>search
    * <li>searchIcon
    * <li>searchPrefsLink
    * <li>selectedTabIcon
    * <li>trackingProtection
    * <li>urlbar
    * <li>webide
    * </ul>
--- a/browser/components/uitour/UITour.jsm
+++ b/browser/components/uitour/UITour.jsm
@@ -252,16 +252,22 @@ this.UITour = {
                aDocument.getElementById("pageAction-panel-emailLink");
       },
     }],
     ["pageAction-sendToDevice", {
       query: (aDocument) => {
         return aDocument.getElementById("pageAction-urlbar-sendToDevice") ||
                aDocument.getElementById("pageAction-panel-sendToDevice");
       },
+    }],
+    ["screenshots", {
+      query: (aDocument) => {
+        return aDocument.getElementById("pageAction-urlbar-screenshots") ||
+               aDocument.getElementById("pageAction-panel-screenshots");
+      },
     }]
   ]),
 
   init() {
     log.debug("Initializing UITour");
     // Lazy getter is initialized here so it can be replicated any time
     // in a test.
     delete this.seenPageIDs;
--- a/browser/components/uitour/test/browser_UITour_availableTargets.js
+++ b/browser/components/uitour/test/browser_UITour_availableTargets.js
@@ -24,24 +24,26 @@ function getExpectedTargets() {
     "pageAction-bookmark",
     "pageAction-copyURL",
     "pageAction-emailLink",
     "pageAction-sendToDevice",
       ...(hasPocket ? ["pocket"] : []),
     "privateWindow",
       ...(hasQuit ? ["quit"] : []),
     "readerMode-urlBar",
+    "screenshots",
     "trackingProtection",
     "urlbar",
   ];
 }
 
 add_task(setup_UITourTest);
 
 add_UITour_task(async function test_availableTargets() {
+  await ensureScreenshotsEnabled();
   let data = await getConfigurationPromise("availableTargets");
   let expecteds = getExpectedTargets();
   ok_targets(data, expecteds);
   ok(UITour.availableTargetsCache.has(window),
      "Targets should now be cached");
 });
 
 add_UITour_task(async function test_availableTargets_changeWidgets() {
@@ -75,16 +77,17 @@ add_UITour_task(async function test_avai
 add_UITour_task(async function test_availableTargets_removeUrlbarPageActionsAll() {
   pageActionsHelper.setActionsUrlbarState(false);
   UITour.clearAvailableTargetsCache();
   let data = await getConfigurationPromise("availableTargets");
   let expecteds = getExpectedTargets();
   ok_targets(data, expecteds);
   let expectedActions = [
     [ "pocket", "pageAction-panel-pocket" ],
+    [ "screenshots", "pageAction-panel-screenshots" ],
     [ "pageAction-bookmark", "pageAction-panel-bookmark" ],
     [ "pageAction-copyURL", "pageAction-panel-copyURL" ],
     [ "pageAction-emailLink", "pageAction-panel-emailLink" ],
     [ "pageAction-sendToDevice", "pageAction-panel-sendToDevice" ],
   ];
   for (let [ targetName, expectedNodeId ] of expectedActions) {
     await assertTargetNode(targetName, expectedNodeId);
   }
@@ -94,16 +97,17 @@ add_UITour_task(async function test_avai
 add_UITour_task(async function test_availableTargets_addUrlbarPageActionsAll() {
   pageActionsHelper.setActionsUrlbarState(true);
   UITour.clearAvailableTargetsCache();
   let data = await getConfigurationPromise("availableTargets");
   let expecteds = getExpectedTargets();
   ok_targets(data, expecteds);
   let expectedActions = [
     [ "pocket", "pocket-button-box" ],
+    [ "screenshots", "pageAction-urlbar-screenshots" ],
     [ "pageAction-bookmark", "star-button-box" ],
     [ "pageAction-copyURL", "pageAction-urlbar-copyURL" ],
     [ "pageAction-emailLink", "pageAction-urlbar-emailLink" ],
     [ "pageAction-sendToDevice", "pageAction-urlbar-sendToDevice" ],
   ];
   for (let [ targetName, expectedNodeId ] of expectedActions) {
     await assertTargetNode(targetName, expectedNodeId);
   }
@@ -145,8 +149,19 @@ var pageActionsHelper = {
       return;
     }
     for (let [ action, originalState] of this._originalStates) {
       action.shownInUrlbar = originalState;
     }
     this._originalStates = null;
   }
 };
+
+function ensureScreenshotsEnabled() {
+  SpecialPowers.pushPrefEnv({ set: [
+    [ "extensions.screenshots.system", false ],
+    [ "extensions.screenshots.system-disabled", false ]
+  ]});
+  return BrowserTestUtils.waitForCondition(() => {
+    return PageActions.actionForID("screenshots") &&
+           !CustomizableUI.getWidget("screenshots_mozilla_org-browser-action");
+  }, "Should enable Screenshots");
+}
--- a/browser/extensions/activity-stream/common/Reducers.jsm
+++ b/browser/extensions/activity-stream/common/Reducers.jsm
@@ -109,18 +109,18 @@ function TopSites(prevState = INITIAL_ST
       });
       return hasMatch ? Object.assign({}, prevState, {rows: newRows}) : prevState;
     case at.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       newRows = prevState.rows.map(site => {
         if (site && site.url === action.data.url) {
-          const {bookmarkGuid, bookmarkTitle, lastModified} = action.data;
-          return Object.assign({}, site, {bookmarkGuid, bookmarkTitle, bookmarkDateCreated: lastModified});
+          const {bookmarkGuid, bookmarkTitle, dateAdded} = action.data;
+          return Object.assign({}, site, {bookmarkGuid, bookmarkTitle, bookmarkDateCreated: dateAdded});
         }
         return site;
       });
       return Object.assign({}, prevState, {rows: newRows});
     case at.PLACES_BOOKMARK_REMOVED:
       if (!action.data) {
         return prevState;
       }
@@ -198,22 +198,26 @@ function Sections(prevState = INITIAL_ST
       // If section doesn't exist in prevState, create a new section object. If
       // the section has an order, insert it at the correct place in the array.
       // Otherwise, prepend it and set the order to be minimal.
       if (!hasMatch) {
         const initialized = !!(action.data.rows && action.data.rows.length > 0);
         let order;
         let index;
         if (prevState.length > 0) {
-          order = action.data.order || prevState[0].order - 1;
+          order = action.data.order !== undefined ? action.data.order : prevState[0].order - 1;
           index = newState.findIndex(section => section.order >= order);
+          if (index === -1) {
+            index = newState.length;
+          }
         } else {
-          order = action.data.order || 1;
+          order = action.data.order !== undefined ? action.data.order : 0;
           index = 0;
         }
+
         const section = Object.assign({title: "", rows: [], order, enabled: false}, action.data, {initialized});
         newState.splice(index, 0, section);
       }
       return newState;
     case at.SECTION_UPDATE:
       return prevState.map(section => {
         if (section && section.id === action.data.id) {
           // If the action is updating rows, we should consider initialized to be true.
@@ -226,34 +230,40 @@ function Sections(prevState = INITIAL_ST
     case at.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the item within the rows that is attempted to be bookmarked
           if (item.url === action.data.url) {
-            const {bookmarkGuid, bookmarkTitle, lastModified} = action.data;
-            Object.assign(item, {bookmarkGuid, bookmarkTitle, bookmarkDateCreated: lastModified});
+            const {bookmarkGuid, bookmarkTitle, dateAdded} = action.data;
+            Object.assign(item, {bookmarkGuid, bookmarkTitle, bookmarkDateCreated: dateAdded});
+            if (!item.type || item.type === "history") {
+              item.type = "bookmark";
+            }
           }
           return item;
         })
       }));
     case at.PLACES_BOOKMARK_REMOVED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the bookmark within the rows that is attempted to be removed
           if (item.url === action.data.url) {
             const newSite = Object.assign({}, item);
             delete newSite.bookmarkGuid;
             delete newSite.bookmarkTitle;
             delete newSite.bookmarkDateCreated;
+            if (!newSite.type || newSite.type === "bookmark") {
+              newSite.type = "history";
+            }
             return newSite;
           }
           return item;
         })
       }));
     case at.PLACES_LINK_DELETED:
     case at.PLACES_LINK_BLOCKED:
       return prevState.map(section =>
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
@@ -454,19 +454,19 @@ function TopSites() {
       if (!action.data) {
         return prevState;
       }
       newRows = prevState.rows.map(site => {
         if (site && site.url === action.data.url) {
           var _action$data2 = action.data;
           const bookmarkGuid = _action$data2.bookmarkGuid,
                 bookmarkTitle = _action$data2.bookmarkTitle,
-                lastModified = _action$data2.lastModified;
-
-          return Object.assign({}, site, { bookmarkGuid, bookmarkTitle, bookmarkDateCreated: lastModified });
+                dateAdded = _action$data2.dateAdded;
+
+          return Object.assign({}, site, { bookmarkGuid, bookmarkTitle, bookmarkDateCreated: dateAdded });
         }
         return site;
       });
       return Object.assign({}, prevState, { rows: newRows });
     case at.PLACES_BOOKMARK_REMOVED:
       if (!action.data) {
         return prevState;
       }
@@ -553,22 +553,26 @@ function Sections() {
       // If section doesn't exist in prevState, create a new section object. If
       // the section has an order, insert it at the correct place in the array.
       // Otherwise, prepend it and set the order to be minimal.
       if (!hasMatch) {
         const initialized = !!(action.data.rows && action.data.rows.length > 0);
         let order;
         let index;
         if (prevState.length > 0) {
-          order = action.data.order || prevState[0].order - 1;
+          order = action.data.order !== undefined ? action.data.order : prevState[0].order - 1;
           index = newState.findIndex(section => section.order >= order);
+          if (index === -1) {
+            index = newState.length;
+          }
         } else {
-          order = action.data.order || 1;
+          order = action.data.order !== undefined ? action.data.order : 0;
           index = 0;
         }
+
         const section = Object.assign({ title: "", rows: [], order, enabled: false }, action.data, { initialized });
         newState.splice(index, 0, section);
       }
       return newState;
     case at.SECTION_UPDATE:
       return prevState.map(section => {
         if (section && section.id === action.data.id) {
           // If the action is updating rows, we should consider initialized to be true.
@@ -584,35 +588,41 @@ function Sections() {
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the item within the rows that is attempted to be bookmarked
           if (item.url === action.data.url) {
             var _action$data3 = action.data;
             const bookmarkGuid = _action$data3.bookmarkGuid,
                   bookmarkTitle = _action$data3.bookmarkTitle,
-                  lastModified = _action$data3.lastModified;
-
-            Object.assign(item, { bookmarkGuid, bookmarkTitle, bookmarkDateCreated: lastModified });
+                  dateAdded = _action$data3.dateAdded;
+
+            Object.assign(item, { bookmarkGuid, bookmarkTitle, bookmarkDateCreated: dateAdded });
+            if (!item.type || item.type === "history") {
+              item.type = "bookmark";
+            }
           }
           return item;
         })
       }));
     case at.PLACES_BOOKMARK_REMOVED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the bookmark within the rows that is attempted to be removed
           if (item.url === action.data.url) {
             const newSite = Object.assign({}, item);
             delete newSite.bookmarkGuid;
             delete newSite.bookmarkTitle;
             delete newSite.bookmarkDateCreated;
+            if (!newSite.type || newSite.type === "bookmark") {
+              newSite.type = "history";
+            }
             return newSite;
           }
           return item;
         })
       }));
     case at.PLACES_LINK_DELETED:
     case at.PLACES_LINK_BLOCKED:
       return prevState.map(section => Object.assign({}, section, { rows: section.rows.filter(site => site.url !== action.data.url) }));
@@ -2980,17 +2990,17 @@ module.exports.PlaceholderCard = Placeho
 
 module.exports = {
   history: {
     intlID: "type_label_visited",
     icon: "historyItem"
   },
   bookmark: {
     intlID: "type_label_bookmarked",
-    icon: "bookmark"
+    icon: "bookmark-added"
   },
   trending: {
     intlID: "type_label_recommended",
     icon: "trending"
   },
   now: {
     intlID: "type_label_now",
     icon: "now"
--- a/browser/extensions/activity-stream/data/content/activity-stream.css
+++ b/browser/extensions/activity-stream/data/content/activity-stream.css
@@ -73,16 +73,18 @@ input {
     background-image: url("assets/glyph-pin-12.svg");
     background-size: 12px;
     height: 12px;
     width: 12px; }
   .icon.icon-check {
     background-image: url("chrome://browser/skin/check.svg"); }
   .icon.icon-webextension {
     background-image: url("assets/glyph-webextension-16.svg"); }
+  .icon.icon-highlights {
+    background-image: url("assets/glyph-highlights-16.svg"); }
 
 html,
 body,
 #root {
   height: 100%; }
 
 body {
   background: #F9F9FA;
@@ -651,18 +653,16 @@ main {
       box-shadow: 0 0 0 2px #0060DF;
       z-index: 1; }
     .search-wrapper input:focus + .search-button {
       z-index: 1;
       background-color: #0060DF;
       background-image: url("chrome://browser/skin/forward.svg");
       fill: #FFF;
       -moz-context-properties: fill; }
-    .search-wrapper input[aria-expanded="true"] {
-      border-radius: 4px 4px 0 0; }
   .search-wrapper .search-label {
     background: url("assets/glyph-search-16.svg") no-repeat center center/20px;
     fill: rgba(12, 12, 13, 0.6);
     -moz-context-properties: fill;
     position: absolute;
     offset-inline-start: 0;
     height: 100%;
     width: 35px;
@@ -682,17 +682,16 @@ main {
       z-index: 1;
       background-color: #0060DF;
       fill: #FFF;
       cursor: pointer; }
     .search-wrapper .search-button:dir(rtl) {
       transform: scaleX(-1); }
   .search-wrapper .contentSearchSuggestionTable {
     border: 0;
-    box-shadow: 0 0 0 2px #0060DF;
     transform: translateY(2px); }
 
 .context-menu {
   display: block;
   position: absolute;
   font-size: 14px;
   box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2);
   top: 6.75px;
@@ -797,18 +796,19 @@ main {
           background-position-x: 217px; }
       .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:not(:checked) + label,
       .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:checked + label {
         padding-inline-start: 63px; }
       .prefs-pane .prefs-modal-inner-wrapper .options section {
         margin: 0; }
   .prefs-pane .actions {
     background-color: #F9F9FA;
+    border-left: 1px solid #D7D7DB;
     bottom: 0;
-    offset-inline-end: -1px;
+    offset-inline-end: 0;
     padding: 20px;
     position: fixed;
     width: 400px; }
     .prefs-pane .actions button {
       margin-inline-end: 20px; }
   .prefs-pane [type='checkbox']:not(:checked),
   .prefs-pane [type='checkbox']:checked {
     offset-inline-start: -9999px;
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/data/content/assets/glyph-highlights-16.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M9.5 3s.428 2.43 1.249 3.251S14 7.5 14 7.5s-2.43.394-3.251 1.215S9.5 12 9.5 12s-.394-2.464-1.215-3.285S5 7.5 5 7.5s2.464-.428 3.285-1.249S9.5 3 9.5 3m0-2h-.014a2 2 0 0 0-1.96 1.68 7.536 7.536 0 0 1-.659 2.154 7.9 7.9 0 0 1-2.212.7 2 2 0 0 0 .029 3.945 7.733 7.733 0 0 1 2.183.658 7.74 7.74 0 0 1 .658 2.185A2 2 0 0 0 9.489 14H9.5a2 2 0 0 0 1.971-1.657 7.891 7.891 0 0 1 .7-2.209 7.566 7.566 0 0 1 2.154-.659 2 2 0 0 0 .027-3.944 7.694 7.694 0 0 1-2.181-.7 7.731 7.731 0 0 1-.7-2.181A2 2 0 0 0 9.5 1zM3 15.5a.5.5 0 0 1-.49-.421 3.047 3.047 0 0 0-.4-1.186 3.047 3.047 0 0 0-1.186-.4.5.5 0 0 1-.007-.986 3.147 3.147 0 0 0 1.192-.417 3.051 3.051 0 0 0 .4-1.171A.5.5 0 0 1 3 10.5a.5.5 0 0 1 .492.413 3.094 3.094 0 0 0 .417 1.179 3.142 3.142 0 0 0 1.178.416.5.5 0 0 1-.007.985 3.007 3.007 0 0 0-1.172.4 3.166 3.166 0 0 0-.416 1.192A.5.5 0 0 1 3 15.5zm-.5-11a.5.5 0 0 1-.49-.42 2.344 2.344 0 0 0-.265-.82 2.344 2.344 0 0 0-.82-.265.5.5 0 0 1-.007-.986 2.41 2.41 0 0 0 .827-.277A2.306 2.306 0 0 0 2.007.92.5.5 0 0 1 2.5.5a.5.5 0 0 1 .492.412 2.353 2.353 0 0 0 .278.818 2.372 2.372 0 0 0 .816.276.5.5 0 0 1-.007.985 2.306 2.306 0 0 0-.811.266 2.41 2.41 0 0 0-.277.827.5.5 0 0 1-.491.416z" fill="context-fill"/></svg>
\ No newline at end of file
--- a/browser/extensions/activity-stream/data/locales.json
+++ b/browser/extensions/activity-stream/data/locales.json
@@ -262,16 +262,17 @@
     "manual_migration_cancel_button": "Xeyr, Təşəkkürlər",
     "manual_migration_import_button": "İndi idxal et"
   },
   "be": {
     "newtab_page_title": "Новая картка",
     "default_label_loading": "Загрузка…",
     "header_top_sites": "Папулярныя сайты",
     "header_stories": "Галоўныя навіны",
+    "header_highlights": "Выбранае",
     "header_visit_again": "Наведаць зноў",
     "header_bookmarks": "Нядаўнія закладкі",
     "header_recommended_by": "Рэкамендавана {provider}",
     "header_bookmarks_placeholder": "У вас яшчэ няма закладак.",
     "header_stories_from": "ад",
     "type_label_visited": "Наведанае",
     "type_label_bookmarked": "У закладках",
     "type_label_synced": "Сінхранізаванае з іншай прылады",
@@ -293,37 +294,43 @@
     "confirm_history_delete_notice_p2": "Гэта дзеянне немагчыма адмяніць.",
     "menu_action_save_to_pocket": "Захаваць у Pocket",
     "search_for_something_with": "Шукаць {search_term} у:",
     "search_button": "Шукаць",
     "search_header": "Шукаць у {search_engine_name}",
     "search_web_placeholder": "Пошук у Інтэрнэце",
     "search_settings": "Змяніць налады пошуку",
     "section_info_option": "Звесткі",
+    "section_info_send_feedback": "Даслаць водгук",
+    "section_info_privacy_notice": "Паведамленне аб прыватнасці",
     "welcome_title": "Калі ласка ў новую картку",
     "welcome_body": "Firefox будзе выкарыстоўваць гэта месца, каб адлюстроўваць самыя актуальныя закладкі, артыкулы, відэа і старонкі, якія вы нядаўна наведалі, каб вы змаглі лёгка трапіць на іх зноў.",
     "welcome_label": "Вызначэнне вашага выбранага",
     "time_label_less_than_minute": "<1 хв",
     "time_label_minute": "{number} хв",
     "time_label_hour": "{number} г",
     "time_label_day": "{number} д",
     "settings_pane_button_label": "Наладзіць вашу старонку новай карткі",
     "settings_pane_header": "Налады новай карткі",
-    "settings_pane_body": "Выберыце, што паказваць пры адкрыцці новай карткі.",
+    "settings_pane_body2": "Выберыце тое, што вы бачыце на гэтай старонцы.",
     "settings_pane_search_header": "Пошук",
     "settings_pane_search_body": "Пошук у Сеціве з вашай новай карткі.",
     "settings_pane_topsites_header": "Папулярныя сайты",
     "settings_pane_topsites_body": "Доступ да сайтаў, якія вы часцей наведваеце.",
     "settings_pane_topsites_options_showmore": "Паказваць два шэрагі",
     "settings_pane_bookmarks_header": "Нядаўнія закладкі",
     "settings_pane_bookmarks_body": "Вашы новыя закладкі ў адным зручным месцы.",
     "settings_pane_visit_again_header": "Наведаць зноў",
     "settings_pane_visit_again_body": "Firefox пакажа вам элементы гісторыі прагляду, якія вы, магчыма, захочаце запомніць або наведаць зноў.",
-    "settings_pane_pocketstories_header": "Галоўныя навіны",
-    "settings_pane_pocketstories_body": "Pocket, частка сям'і Mozilla, дапаможа падключыць вас да якаснага зместу, які вы можаце не знайсці іншым чынам.",
+    "settings_pane_highlights_header": "Выбранае",
+    "settings_pane_highlights_body2": "Знайдзіце зваротны шлях да цікавых рэчаў, якія вы нядаўна наведалі або дадалі ў закладкі.",
+    "settings_pane_highlights_options_bookmarks": "Закладкі",
+    "settings_pane_highlights_options_visited": "Наведаныя сайты",
+    "settings_pane_snippets_header": "Урыўкі",
+    "settings_pane_snippets_body": "Чытайце кароткія і радасныя навіны ад Mozilla аб Firefox, інтэрнэт-культуру і выпадковыя мемы.",
     "settings_pane_done_button": "Гатова",
     "edit_topsites_button_text": "Правіць",
     "edit_topsites_button_label": "Наладзіць раздзел папулярных сайтаў",
     "edit_topsites_showmore_button": "Паказаць больш",
     "edit_topsites_showless_button": "Паказаць менш",
     "edit_topsites_done_button": "Гатова",
     "edit_topsites_pin_button": "Замацаваць гэты сайт",
     "edit_topsites_unpin_button": "Адшпіліць гэты сайт",
@@ -336,20 +343,20 @@
     "topsites_form_url_placeholder": "Увядзіце або ўстаўце URL",
     "topsites_form_add_button": "Дадаць",
     "topsites_form_save_button": "Захаваць",
     "topsites_form_cancel_button": "Скасаваць",
     "topsites_form_url_validation": "Патрабуецца сапраўдны URL",
     "pocket_read_more": "Папулярныя тэмы:",
     "pocket_read_even_more": "Іншыя навіны",
     "pocket_feedback_header": "Лепшае з Сеціва, што адабралі больш за 25 мільёнаў чалавек.",
-    "pocket_feedback_body": "Pocket, частка сям'і Mozilla, дапаможа падключыць вас да якаснага зместу, які вы можаце не знайсці іншым чынам.",
-    "pocket_send_feedback": "Даслаць водгук",
+    "pocket_description": "Адкрыйце для сябе высакаякасны кантэнт, які вы маглі б прапусціць, з дапамогай Pocket, які стаў часткай Mozilla.",
+    "highlights_empty_state": "Пачніце агляданне, і мы пакажам вам тут некаторыя з найлепшых артыкулаў, відэаролікаў і іншых старонак, якія вы нядаўна наведалі або дадалі ў закладкі.",
     "topstories_empty_state": "Гатова. Праверце пазней, каб убачыць больш матэрыялаў ад {provider}. Не жадаеце чакаць? Выберыце папулярную тэму, каб знайсці больш цікавых матэрыялаў з усяго Інтэрнэту.",
-    "manual_migration_explanation": "Паспрабуйце Firefox з вашымі любімымі сайтамі і закладкамі з іншага браўзера.",
+    "manual_migration_explanation2": "Паспрабуйце Firefox з закладкамі, гісторыяй і паролямі з іншага браўзера.",
     "manual_migration_cancel_button": "Не, дзякуй",
     "manual_migration_import_button": "Імпартаваць зараз"
   },
   "bg": {
     "newtab_page_title": "Нов раздел",
     "default_label_loading": "Зареждане…",
     "header_top_sites": "Най-посещавани",
     "header_stories": "Популярни",
@@ -383,24 +390,25 @@
     "search_button": "Търсене",
     "search_header": "Търсене с {search_engine_name}",
     "search_web_placeholder": "Търсене в интернет",
     "search_settings": "Настройки на търсене",
     "section_info_option": "Информация",
     "section_info_send_feedback": "Обратна връзка",
     "section_info_privacy_notice": "Политика на поверителност",
     "welcome_title": "Добре дошли в нов раздел",
-    "welcome_body": "Firefox ще използва това място, за да ви покаже най-подходящите отметки, статии, видео и страници, които сте посетили наскоро, така че да се върнете към тях лесно.",
+    "welcome_body": "Firefox ще използва това място, за да ви покаже най-подходящите отметки, статии, видео и страници, които сте посетили наскоро, така че да ги намерите пак лесно.",
     "welcome_label": "Търсене на акценти",
     "time_label_less_than_minute": "<1м",
     "time_label_minute": "{number} м",
     "time_label_hour": "{number} ч",
     "time_label_day": "{number} д",
     "settings_pane_button_label": "Настройки на новия раздел",
     "settings_pane_header": "Настройки на нов раздел",
+    "settings_pane_body2": "Изберете какво да виждате на тази страница.",
     "settings_pane_search_header": "Търсене",
     "settings_pane_search_body": "Търсете в мрежата от нов раздел.",
     "settings_pane_topsites_header": "Най-посещавани",
     "settings_pane_topsites_body": "Достъп до сайтовете, които посещавате най-често.",
     "settings_pane_topsites_options_showmore": "Показване на два реда",
     "settings_pane_bookmarks_header": "Последни отметки",
     "settings_pane_bookmarks_body": "Всички нови отметки на едно място.",
     "settings_pane_visit_again_header": "Посещаване",
@@ -426,17 +434,19 @@
     "topsites_form_url_placeholder": "Адрес",
     "topsites_form_add_button": "Добавяне",
     "topsites_form_save_button": "Запазване",
     "topsites_form_cancel_button": "Отказ",
     "topsites_form_url_validation": "Необходим е валиден URL",
     "pocket_read_more": "Популярни теми:",
     "pocket_read_even_more": "Повече статии",
     "pocket_feedback_header": "Най-доброто от интернет, подбрано от над 25 милиона души.",
+    "pocket_description": "Открийте висококачествено съдържание, което иначе може да пропуснете, с помощта на Pocket, вече част от Mozilla.",
     "topstories_empty_state": "Разгледахте всичко. Проверете по-късно за повече истории от {provider}. Нямате търпение? Изберете популярна тема, за да откриете повече истории из цялата Мрежа.",
+    "manual_migration_explanation2": "Опитайте Firefox с отметките, историята и паролите от друг четец.",
     "manual_migration_cancel_button": "Не, благодаря",
     "manual_migration_import_button": "Внасяне"
   },
   "bn-BD": {
     "newtab_page_title": "নতুন ট্যাব",
     "default_label_loading": "লোড হচ্ছে…",
     "header_top_sites": "শীর্ঘ সাইট",
     "header_stories": "শীর্ষ গল্প",
@@ -516,16 +526,65 @@
     "pocket_feedback_header": "ওয়েব জগতের সেরা, যা ২.৫ লক্ষ মানুষ রক্ষণাবেক্ষণ করে।",
     "pocket_feedback_body": "Pocket, হচ্ছে Mozilla পরিবারের একটি অংশ, যা আপনাকে ভালো-মানের কন্টেন্টের সাথে যুক্ত করবে যা আপনি অন্য কোথাও পাবেন না।",
     "pocket_send_feedback": "প্রতিক্রিয়া জানান",
     "topstories_empty_state": "কিছু একটা ঠিক নেই। {provider} এর শীর্ষ গল্পগুলো পেতে কিছুক্ষণ পর আবার দেখুন। অপেক্ষা করতে চান না? বিশ্বের সেরা গল্পগুলো পেতে কোন জনপ্রিয় বিষয় নির্বাচন করুন।",
     "manual_migration_explanation": "অন্য ব্রাউজার থেকে আপনার পছন্দের সাইট এবং বুকমার্কগুলো নিয়ে Firefox ব্যবহার করুন।",
     "manual_migration_cancel_button": "প্রয়োজন নেই",
     "manual_migration_import_button": "এখনই ইম্পোর্ট করুন"
   },
+  "br": {
+    "newtab_page_title": "Ivinell nevez",
+    "default_label_loading": "O kargañ…",
+    "header_top_sites": "Lec'hiennoù pennañ",
+    "header_stories": "Istorioù pennañ",
+    "header_highlights": "Mareoù pouezus",
+    "header_visit_again": "Gweladenniñ en-dro",
+    "header_bookmarks": "Sinedoù nevez",
+    "header_recommended_by": "Erbedet gant {provider}",
+    "header_bookmarks_placeholder": "N'ho peus sined ebet evit ar mare.",
+    "header_stories_from": "a-berzh",
+    "type_label_visited": "Gweladennet",
+    "type_label_bookmarked": "Lakaet er sinedoù",
+    "type_label_synced": "Goubredet eus un trevnad all",
+    "type_label_recommended": "Brudet",
+    "type_label_open": "Digeriñ",
+    "type_label_topic": "Danvez",
+    "type_label_now": "Bremañ",
+    "menu_action_bookmark": "Sined",
+    "menu_action_remove_bookmark": "Dilemel ar sined",
+    "menu_action_copy_address": "Eilañ ar chomlec'h",
+    "menu_action_email_link": "Kas an ere dre bostel…",
+    "menu_action_open_new_window": "Digeriñ e-barzh ur prenestr nevez",
+    "menu_action_open_private_window": "Digeriñ e-barzh ur prenestr merdeiñ prevez nevez",
+    "menu_action_dismiss": "Argas",
+    "menu_action_delete": "Dilemel eus ar roll istor",
+    "menu_action_pin": "Spilhennañ",
+    "menu_action_unpin": "Dispilhennañ",
+    "confirm_history_delete_p1": "Sur oc'h e fell deoc'h dilemel kement eriol eus ar bajenn-mañ diouzh ho roll istor?",
+    "confirm_history_delete_notice_p2": "Ne c'haller ket dizober ar gwezh-mañ.",
+    "menu_action_save_to_pocket": "Enrollañ etrezek Pocket",
+    "search_for_something_with": "Klask {search_term} gant:",
+    "search_button": "Klask",
+    "search_header": "Klask {search_engine_name}",
+    "search_web_placeholder": "Klask er web",
+    "search_settings": "Kemmañ an arventennoù klask",
+    "section_info_option": "Titouroù",
+    "section_info_send_feedback": "Kas ho meno",
+    "section_info_privacy_notice": "Evezhiadennoù a-fet buhez prevez",
+    "welcome_title": "Donemat war un ivinell nevez",
+    "welcome_body": "Firefox a implijo al lec'h-mañ evit diskouez deoc'h sinedoù, pennadoù, videoioù ha pajennoù bet gweladennet ganeoc'h, evit adkavout anezho en un doare aes.",
+    "welcome_label": "Naoudiañ ho mareoù pouezus",
+    "time_label_less_than_minute": "< 1 m",
+    "time_label_minute": "{number}m",
+    "time_label_hour": "{number}e",
+    "time_label_day": "{number}d",
+    "settings_pane_button_label": "Personelait ho pajenn Ivinell Nevez",
+    "settings_pane_header": "Gwellvezioù an ivinell nevez"
+  },
   "ca": {
     "newtab_page_title": "Pestanya nova",
     "default_label_loading": "S'està carregant…",
     "header_top_sites": "Llocs principals",
     "header_stories": "Articles populars",
     "header_visit_again": "Torneu a visitar",
     "header_bookmarks": "Adreces d'interès recents",
     "header_recommended_by": "Recomanat per {provider}",
@@ -611,17 +670,17 @@
     "newtab_page_title": "K'ak'a' ruwi'",
     "default_label_loading": "Tajin nusamajij…",
     "header_top_sites": "Utziläj taq Ruxaq K'amaya'l",
     "header_stories": "Utziläj taq B'anob'äl",
     "header_highlights": "Taq k'ewachinïk",
     "header_visit_again": "Titz'et chik",
     "header_bookmarks": "K'ak'a' taq Yaketal",
     "header_recommended_by": "Chilab'en ruma {provider}",
-    "header_bookmarks_placeholder": "K'a majani k'o jujun taq ayaketal.",
+    "header_bookmarks_placeholder": "K'a majun ayaketal k'o.",
     "header_stories_from": "richin",
     "type_label_visited": "Tz'eton",
     "type_label_bookmarked": "Yakon retal",
     "type_label_synced": "Ximon rik'in jun chik okisaxel",
     "type_label_recommended": "Rujawaxik",
     "type_label_open": "Tijaq",
     "type_label_topic": "Na'oj",
     "type_label_now": "Wakami",
@@ -700,16 +759,17 @@
     "manual_migration_cancel_button": "Mani matyox",
     "manual_migration_import_button": "Tijik' pe"
   },
   "cs": {
     "newtab_page_title": "Nový panel",
     "default_label_loading": "Načítání…",
     "header_top_sites": "Top stránky",
     "header_stories": "Nejlepší příběhy",
+    "header_highlights": "Vybrané",
     "header_visit_again": "Znovu navštívit",
     "header_bookmarks": "Nedávno přidané záložky",
     "header_recommended_by": "Doporučení ze služby {provider}",
     "header_bookmarks_placeholder": "Zatím nemáte uložené žádné záložky.",
     "header_stories_from": "ze šlužby",
     "type_label_visited": "Navštívené",
     "type_label_bookmarked": "V záložkách",
     "type_label_synced": "Synchronizované z jiného zařízení",
@@ -731,37 +791,43 @@
     "confirm_history_delete_notice_p2": "Tuto akci nelze vzít zpět.",
     "menu_action_save_to_pocket": "Uložit do služby Pocket",
     "search_for_something_with": "Vyhledat {search_term} s:",
     "search_button": "Hledat",
     "search_header": "Vyhledat pomocí {search_engine_name}",
     "search_web_placeholder": "Hledat na webu",
     "search_settings": "Změnit nastavení vyhledávání",
     "section_info_option": "Informace",
+    "section_info_send_feedback": "Zpětná vazba",
+    "section_info_privacy_notice": "Zásady ochrany soukromí",
     "welcome_title": "Vítejte na stránce nového panelu",
     "welcome_body": "Tady Firefox zobrazí nejrelevantnější záložky, články, videa a stránky, které jste nedávno navštívili. Návrat k nim je tak velmi jednoduchý.",
     "welcome_label": "Rozpoznávání Vybraných stránek",
     "time_label_less_than_minute": "< 1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Přizpůsobení stránky nového panelu",
     "settings_pane_header": "Předvolby nového panelu",
-    "settings_pane_body": "Vyberte si, co chcete vidět při otevření nového panelu.",
+    "settings_pane_body2": "Vyberte, co chcete na této stránce vidět.",
     "settings_pane_search_header": "Vyhledávání",
     "settings_pane_search_body": "Vyhledávání na webu rovnou ze stránky nového panelu.",
     "settings_pane_topsites_header": "Top stránky",
     "settings_pane_topsites_body": "Přístup ke stránkám, které nejčastěji navštěvujete.",
     "settings_pane_topsites_options_showmore": "Zobrazit dva řádky",
     "settings_pane_bookmarks_header": "Nedávno přidané záložky",
     "settings_pane_bookmarks_body": "Vaše nově přidané záložky na místě hned po ruce.",
     "settings_pane_visit_again_header": "Znovu navštívit",
     "settings_pane_visit_again_body": "Firefox vám ukáže některé položky z vaší historie prohlížení, které byste si mohli chtít připomenout nebo se k nim vrátit.",
-    "settings_pane_pocketstories_header": "Nejlepší příběhy",
-    "settings_pane_pocketstories_body": "Pocket, služba od Mozilly, vám pomůže najít vysoce kvalitní obsah, který byste jinak neobjevili.",
+    "settings_pane_highlights_header": "Vybrané",
+    "settings_pane_highlights_body2": "Najděte cestu zpět k zajímavým věcem, které jste nedávno viděli nebo uložili do záložek.",
+    "settings_pane_highlights_options_bookmarks": "Záložky",
+    "settings_pane_highlights_options_visited": "Navštívené stránky",
+    "settings_pane_snippets_header": "Útržky",
+    "settings_pane_snippets_body": "Přečtěte si krátké zprávy od Mozilly o Firefoxu, internetu a občas i náhodné memy a hlášky.",
     "settings_pane_done_button": "Hotovo",
     "edit_topsites_button_text": "Upravit",
     "edit_topsites_button_label": "Upravit oddíl Top stránek",
     "edit_topsites_showmore_button": "Zobrazit více",
     "edit_topsites_showless_button": "Zobrazit méně",
     "edit_topsites_done_button": "Hotovo",
     "edit_topsites_pin_button": "Připnout tuto stránku",
     "edit_topsites_unpin_button": "Odepnout tuto stránku",
@@ -774,28 +840,29 @@
     "topsites_form_url_placeholder": "Zadejte nebo vložte URL adresu",
     "topsites_form_add_button": "Přidat",
     "topsites_form_save_button": "Uložit",
     "topsites_form_cancel_button": "Zrušit",
     "topsites_form_url_validation": "Je vyžadována platná URL",
     "pocket_read_more": "Populární témata:",
     "pocket_read_even_more": "Zobrazit více příběhů",
     "pocket_feedback_header": "To nejlepší na webu podle hodnocení více než 25 milionů lidí.",
-    "pocket_feedback_body": "Pocket, služba od Mozilly, vám pomůže najít vysoce kvalitní obsah, který byste jinak neobjevili.",
-    "pocket_send_feedback": "Odeslat zpětnou vazbu",
+    "pocket_description": "Objevte obsah s vysokou kvalitou, který byste mohli jinak propásnout. Pomůže vám služby Pocket od Mozilly.",
+    "highlights_empty_state": "Začněte prohlížet a my vám zde ukážeme některé skvělé články, videa a další stránky, které jste nedávno viděli nebo uložili do záložek.",
     "topstories_empty_state": "Už jste všechno přečetli. Další příběhy ze služby {provider} tu najdete zase později. Ale pokud se nemůžete dočkat, vyberte své oblíbené téma a podívejte se na další velké příběhy z celého webu.",
-    "manual_migration_explanation": "Vyzkoušejte Firefox se svými oblíbenými stránkami a záložkami z jiného prohlížeče.",
+    "manual_migration_explanation2": "Vyzkoušejte Firefox se záložkami, historií a hesly z jiného vašeho prohlížeče.",
     "manual_migration_cancel_button": "Ne, děkuji",
     "manual_migration_import_button": "Importovat nyní"
   },
   "cy": {
     "newtab_page_title": "Tab Newydd",
     "default_label_loading": "Llwytho…",
     "header_top_sites": "Hoff Wefannau",
     "header_stories": "Hoff Straeon",
+    "header_highlights": "Goreuon",
     "header_visit_again": "Ymweld Eto",
     "header_bookmarks": "Nodau Tudalen Diweddar",
     "header_recommended_by": "Argymhellwyd gan {provider}",
     "header_bookmarks_placeholder": "Nid oes gennych unrhyw nodau tudalen eto.",
     "header_stories_from": "oddi wrth",
     "type_label_visited": "Ymwelwyd",
     "type_label_bookmarked": "Nod Tudalen",
     "type_label_synced": "Cydweddwyd o ddyfais arall",
@@ -817,37 +884,43 @@
     "confirm_history_delete_notice_p2": "Nid oes modd dadwneud hyn.",
     "menu_action_save_to_pocket": "Cadw i Pocket",
     "search_for_something_with": "Chwilio am {search_term} gyda:",
     "search_button": "Chwilio",
     "search_header": "{search_engine_name} Chwilio",
     "search_web_placeholder": "Chwilio'r We",
     "search_settings": "Newid y Gosodiadau Chwilio",
     "section_info_option": "Gwybodaeth",
+    "section_info_send_feedback": "Anfon Adborth",
+    "section_info_privacy_notice": "Hysbysiad Preifatrwydd",
     "welcome_title": "Croeso i dab newydd",
     "welcome_body": "Bydd Firefox yn defnyddio'r gofod hwn i ddangos y nodau tudalen, erthyglau, fideos a thudalennau mwyaf perthnasol i chi, a thudalennau fuoch yn ymweld â nhw'n ddiweddar, fel bod modd i chi ddychwelydd atyn nhw'n hawdd.",
     "welcome_label": "Adnabod eich Goreuon",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}a",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Cyfaddasu eich tudalen Tab Newydd",
     "settings_pane_header": "Dewisiadau Tab Newydd",
-    "settings_pane_body": "Dewis beth rydych yn ei weld pan fyddwch yn agor tab newydd.",
+    "settings_pane_body2": "Dewis beth fyddwch yn ei weld ar y dudalen hon.",
     "settings_pane_search_header": "Chwilio",
     "settings_pane_search_body": "Chwilio'r We o'ch tab newydd.",
     "settings_pane_topsites_header": "Hoff Wefannau",
     "settings_pane_topsites_body": "Cael mynediad at y gwefannau rydych yn ymweld â nhw amlaf.",
     "settings_pane_topsites_options_showmore": "Dangos dwy res",
     "settings_pane_bookmarks_header": "Nodau Tudalen Diweddar",
     "settings_pane_bookmarks_body": "Eich nodau tudalen diweddaraf mewn un lleoliad hwylus.",
     "settings_pane_visit_again_header": "Ymweld Eto",
     "settings_pane_visit_again_body": "Gall Firefox ddangos i chi rannau o'ch hanes pori yr hoffech eu cofio neu fynd nôl atyn nhw.",
-    "settings_pane_pocketstories_header": "Hoff Straeon",
-    "settings_pane_pocketstories_body": "Gall Pocket, sy'n rhan o deulu Mozilla, eich helpu i ganfod cynnwys o ansawdd uchel na fyddech wedi eu canfod fel arall.",
+    "settings_pane_highlights_header": "Goreuon",
+    "settings_pane_highlights_body2": "Mynd yn ôl at bethau diddorol rydych wedi ymweld â nhw neu osod nod tudalen iddyn nhw.",
+    "settings_pane_highlights_options_bookmarks": "Nodau Tudalen",
+    "settings_pane_highlights_options_visited": "Gwefannau Ymwelwyd â Nhw",
+    "settings_pane_snippets_header": "Tameidiau",
+    "settings_pane_snippets_body": "Darllenwch ddiweddariadau cryno gan Mozilla am Firefox, diwylliant y Rhyngrwyd ac weithiau meme ar hap.",
     "settings_pane_done_button": "Gorffen",
     "edit_topsites_button_text": "Golygu",
     "edit_topsites_button_label": "Cyfaddasu eich adran Hoff Wefannau",
     "edit_topsites_showmore_button": "Dangos rhagor",
     "edit_topsites_showless_button": "Dangos llai",
     "edit_topsites_done_button": "Gorffen",
     "edit_topsites_pin_button": "Pinio'r wefan",
     "edit_topsites_unpin_button": "Dad-binio'r wefan",
@@ -860,20 +933,20 @@
     "topsites_form_url_placeholder": "Teipio neu ludo URL",
     "topsites_form_add_button": "Ychwanegu",
     "topsites_form_save_button": "Cadw",
     "topsites_form_cancel_button": "Diddymu",
     "topsites_form_url_validation": "Mae angen URL Ddilys",
     "pocket_read_more": "Pynciau Poblogaidd:",
     "pocket_read_even_more": "Gweld Rhagor o Straeon",
     "pocket_feedback_header": "Y gorau o'r we, wedi ei gasglu gan dros 25 miliwn o bobl.",
-    "pocket_feedback_body": "Gall Pocket, sy'n rhan o deulu Mozilla, eich helpu i ganfod cynnwys o ansawdd uchel na fyddech wedi eu canfod fel arall.",
-    "pocket_send_feedback": "Anfon Adborth",
+    "pocket_description": "Darganfyddwch gynnwys o ansawdd uchel y byddech o bosib yn eu colli, gyda chymorth gan Pocket, sy nawr yn rhan o Mozilla.",
+    "highlights_empty_state": "Cychwynnwch bori ac fe ddangoswn rhai erthyglau, fideos a thudalennau eraill difyr rydych wedi ymweld â nhw'n ddiweddar neu wedi gosod nod tudalen arnyn nhw yma.",
     "topstories_empty_state": "Rydych wedi dal i fynDewch nôl rhywbryd eto am fwy o'r straeon pwysicaf gan {provider}. Methu aros? Dewiswch bwnc poblogaidd i ganfod straeon da o ar draws y we. ",
-    "manual_migration_explanation": "Profwch Firefox gyda'ch hoff wefannau a nodau tudalen o borwr arall.",
+    "manual_migration_explanation2": "Profwch Firefox gyda nodau tudalen, hanes a chyfrineiriau o borwr arall.",
     "manual_migration_cancel_button": "Dim Diolch",
     "manual_migration_import_button": "Mewnforio Nawr"
   },
   "da": {
     "newtab_page_title": "Nyt faneblad",
     "default_label_loading": "Indlæser…",
     "header_top_sites": "Mest besøgte websider",
     "header_stories": "Tophistorier",
@@ -1051,16 +1124,17 @@
     "manual_migration_cancel_button": "Nein, danke",
     "manual_migration_import_button": "Jetzt importieren"
   },
   "dsb": {
     "newtab_page_title": "Nowy rejtark",
     "default_label_loading": "Zacytujo se…",
     "header_top_sites": "Nejcesćej woglědane sedła",
     "header_stories": "Nejcesćej pśecytane powěźenki",
+    "header_highlights": "Wjerški",
     "header_visit_again": "Hyšći raz se woglědaś",
     "header_bookmarks": "Nejnowše cytańske znamjenja",
     "header_recommended_by": "Wót {provider} dopórucony",
     "header_bookmarks_placeholder": "Hyšći cytańske znamjenja njamaśo.",
     "header_stories_from": "wót",
     "type_label_visited": "Woglědany",
     "type_label_bookmarked": "Ako cytańske znamje skłaźony",
     "type_label_synced": "Z drugego rěda synchronizěrowany",
@@ -1082,37 +1156,43 @@
     "confirm_history_delete_notice_p2": "Toś ta akcija njedajo se anulěrowaś.",
     "menu_action_save_to_pocket": "Pla Pocket składowaś",
     "search_for_something_with": "Za {search_term} pytaś z:",
     "search_button": "Pytaś",
     "search_header": "Z {search_engine_name} pytaś",
     "search_web_placeholder": "Web pśepytaś",
     "search_settings": "Pytańske nastajenja změniś",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Komentar pósłaś",
+    "section_info_privacy_notice": "Powěźeńka priwatnosći",
     "welcome_title": "Witajśo k nowemu rejtarkoju",
     "welcome_body": "Firefox buźo toś ten rum wužywaś, aby waše nejwažnjejše cytańske znamjenja, nastawki, wideo a rowno woglědane boki pokazał, aby mógł se lažko k nim wrośiś.",
     "welcome_label": "Wuběranje wašych nejwažnjejšych bokow",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} h",
     "time_label_day": "",
     "settings_pane_button_label": "Bok wašogo nowego rejtarka pśiměriś",
     "settings_pane_header": "Nastajenja nowego rejtarka składowaś",
-    "settings_pane_body": "Wubjeŕśo, což cośo wiźeś, gaž nowy rejtark wócynjaśo.",
+    "settings_pane_body2": "Wubjeŕśo, což se na toś tom boku pokazujo.",
     "settings_pane_search_header": "Pytaś",
     "settings_pane_search_body": "Pśepytajśo web ze swójogo nowego rejtarka.",
     "settings_pane_topsites_header": "Nejcesćej woglědane sedła",
     "settings_pane_topsites_body": "Wócyńśo websedła, kótarež sćo se nejcesćej woglědał.",
     "settings_pane_topsites_options_showmore": "Dwě smužki pokazaś",
     "settings_pane_bookmarks_header": "Nejnowše cytańske znamjenja",
     "settings_pane_bookmarks_body": "Waše nowo załožone cytańske znamjenja ned k ruce.",
     "settings_pane_visit_again_header": "Hyšći raz se woglědaś",
     "settings_pane_visit_again_body": "Firefox wam źěle wašeje pśeglědowańskeje historije pokazaś, kótarež cośo se snaź spomnjeś abo na kótarež cośo slědk pśiś.",
-    "settings_pane_pocketstories_header": "Nejcesćej pśecytane powěźenki",
-    "settings_pane_pocketstories_body": "Pocket, źěl familije Mozilla, buźo pomagaś, was z wopśimjeśim wusokeje kwality zwězowaś, kótaryž njeby wy snaź howac namakał.",
+    "settings_pane_highlights_header": "Wjerški",
+    "settings_pane_highlights_body2": "Namakajśo swóju drogu slědk k zajmnym bokam, kótarež sćo se njedawno woglědał abo ako cytańske znamjenja składł.",
+    "settings_pane_highlights_options_bookmarks": "Cytańske znamjenja",
+    "settings_pane_highlights_options_visited": "Woglědane sedła",
+    "settings_pane_snippets_header": "Kuski",
+    "settings_pane_snippets_body": "Cytajśo krotke aktualizacije wót Mozilla wó Firefox, internetnej kulturje a casy meme.",
     "settings_pane_done_button": "Gótowo",
     "edit_topsites_button_text": "Wobźěłaś",
     "edit_topsites_button_label": "Pśiměrśo wótrězk swójich nejcesćej woglědanych sedłow",
     "edit_topsites_showmore_button": "Wěcej pokazaś",
     "edit_topsites_showless_button": "Mjenjej pokazaś",
     "edit_topsites_done_button": "Gótowo",
     "edit_topsites_pin_button": "Sedło pśipěś",
     "edit_topsites_unpin_button": "Toś to sedło wótpěś",
@@ -1125,28 +1205,29 @@
     "topsites_form_url_placeholder": "URL zapódaś abo zasajźiś",
     "topsites_form_add_button": "Pśidaś",
     "topsites_form_save_button": "Składowaś",
     "topsites_form_cancel_button": "Pśetergnuś",
     "topsites_form_url_validation": "Płaśiwy URL trěbny",
     "pocket_read_more": "Woblubowane temy:",
     "pocket_read_even_more": "Dalšne powěźeńki se woglědaś",
     "pocket_feedback_header": "Nejlěpše z weba, zezběrane wót wěcej ako 25 milionow luźi.",
-    "pocket_feedback_body": "Pocket, źěl familije Mozilla, buźo pomagaś, was z wopśimjeśim wusokeje kwality zwězowaś, kótaryž njeby wy snaź howac namakał.",
-    "pocket_send_feedback": "Komentar pósłaś",
+    "pocket_description": "Namakajśo wopśimjeśe wusokeje kwality, kótarež by hować wjelgin felowało, z pomocu Pocket, kótaryž jo něnto źěl Mozilla.",
+    "highlights_empty_state": "Zachopśo pśeglědowaś, a pokažomy někotare wjelicne nastawki, wideo a druge boki, kótarež sćo se njedawno woglědał abo how ako cytańske znamjenja składował.",
     "topstories_empty_state": "To jo nachylu wšykno. Wrośćo se pózdźej wjelicnych tšojeńkow dla wót {provider}. Njamóžośo cakaś? Wubjeŕśo woblubowanu temu, aby dalšne wjelicne tšojeńka we webje namakał.",
-    "manual_migration_explanation": "Wopytajśo Firefox ze swójimi nejlubšymi websedłami a cytańskimi znamjenjami z drugego wobglědowaka.",
+    "manual_migration_explanation2": "Wopytajśo Firefox z cytanskimi znamjenjami, historiju a gronidłami z drugego wobglědowaka.",
     "manual_migration_cancel_button": "Ně, źěkujom se",
     "manual_migration_import_button": "Něnto importěrowaś"
   },
   "el": {
     "newtab_page_title": "Νέα καρτέλα",
     "default_label_loading": "Φόρτωση…",
     "header_top_sites": "Κορυφαίες ιστοσελίδες",
     "header_stories": "Κορυφαίες ιστορίες",
+    "header_highlights": "Κορυφαίες στιγμές",
     "header_visit_again": "Επίσκεψη ξανά",
     "header_bookmarks": "Πρόσφατοι σελιδοδείκτες",
     "header_recommended_by": "Προτεινόμενο από τον πάροχο {provider}",
     "header_bookmarks_placeholder": "Δεν έχετε κανένα σελιδοδείκτη ακόμα.",
     "header_stories_from": "από",
     "type_label_visited": "Από ιστορικό",
     "type_label_bookmarked": "Από σελιδοδείκτες",
     "type_label_synced": "Συγχρονισμένα από άλλη συσκευή",
@@ -1168,37 +1249,43 @@
     "confirm_history_delete_notice_p2": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
     "menu_action_save_to_pocket": "Αποθήκευση στο Pocket",
     "search_for_something_with": "Αναζήτηση για {search_term} με:",
     "search_button": "Αναζήτηση",
     "search_header": "Αναζήτηση {search_engine_name}",
     "search_web_placeholder": "Αναζήτηση στον ιστό",
     "search_settings": "Αλλαγή ρυθμίσεων αναζήτησης",
     "section_info_option": "Πληροφορίες",
+    "section_info_send_feedback": "Αποστολή σχολίων",
+    "section_info_privacy_notice": "Σημείωση απορρήτου",
     "welcome_title": "Καλώς ορίσατε στη νέα καρτέλα",
     "welcome_body": "Το Firefox θα χρησιμοποιήσει αυτό το χώρο για να εμφανίσει τους πιο σχετικούς σελιδοδείκτες, άρθρα, βίντεο και σελίδες που επισκεφθήκατε πρόσφατα, ώστε να έχετε εύκολη πρόσβαση.",
     "welcome_label": "Αναγνώριση κορυφαίων στιγμών",
     "time_label_less_than_minute": "<1λ",
     "time_label_minute": "{number}λ",
     "time_label_hour": "{number}ώ",
     "time_label_day": "{number}η",
     "settings_pane_button_label": "Προσαρμογή της σελίδας Νέας Καρτέλας",
     "settings_pane_header": "Προτιμήσεις νέας καρτέλας",
-    "settings_pane_body": "Επιλέξτε τι θα βλέπετε όταν ανοίγετε μια νέα καρτέλα.",
+    "settings_pane_body2": "Επιλέξτε τι θα βλέπετε σε αυτή τη σελίδα.",
     "settings_pane_search_header": "Αναζήτηση",
     "settings_pane_search_body": "Αναζήτηση στο διαδίκτυο από τη νέα σας καρτέλα.",
     "settings_pane_topsites_header": "Κορυφαίες ιστοσελίδες",
     "settings_pane_topsites_body": "Πρόσβαση στις ιστοσελίδες που επισκέπτεστε περισσότερο.",
     "settings_pane_topsites_options_showmore": "Εμφάνιση δύο σειρών",
     "settings_pane_bookmarks_header": "Πρόσφατοι σελιδοδείκτες",
     "settings_pane_bookmarks_body": "Οι νέοι σας σελιδοδείκτες σε μια βολική τοποθεσία.",
     "settings_pane_visit_again_header": "Επίσκεψη ξανά",
     "settings_pane_visit_again_body": "Το Firefox θα σάς δείξει μέρη του ιστορικού περιήγησής σας που ίσως θέλετε να θυμηθείτε ή να επισκεφθείτε ξανά.",
-    "settings_pane_pocketstories_header": "Κορυφαίες ιστορίες",
-    "settings_pane_pocketstories_body": "Το Pocket, ένα μέλος της οικογένειας Mozilla, θα σάς βοηθήσει να ανακαλύψετε περιεχόμενο υψηλής ποιότητας που ίσως να μην βρίσκατε διαφορετικά.",
+    "settings_pane_highlights_header": "Κορυφαίες στιγμές",
+    "settings_pane_highlights_body2": "Βρείτε ξανά κάτι ενδιαφέρον που έχετε επισκεφθεί πρόσφατα ή έχετε αποθηκεύσει στους σελιδοδείκτες σας.",
+    "settings_pane_highlights_options_bookmarks": "Σελιδοδείκτες",
+    "settings_pane_highlights_options_visited": "Πρόσφατες ιστοσελίδες",
+    "settings_pane_snippets_header": "Αποσπάσματα",
+    "settings_pane_snippets_body": "Διαβάστε σύντομες και όμορφες ενημερώσεις από τη Mozilla σχετικά με το Firefox, το διαδικτυακό πολιτισμό και τα περιστασιακά, τυχαία memes.",
     "settings_pane_done_button": "Τέλος",
     "edit_topsites_button_text": "Επεξεργασία",
     "edit_topsites_button_label": "Προσαρμογή της ενότητας Κορυφαίες Ιστοσελίδες",
     "edit_topsites_showmore_button": "Εμφάνιση περισσότερων",
     "edit_topsites_showless_button": "Εμφάνιση λιγότερων",
     "edit_topsites_done_button": "Τέλος",
     "edit_topsites_pin_button": "Καρφίτσωμα ιστοσελίδας",
     "edit_topsites_unpin_button": "Ξεκαρφίτσωμα ιστοσελίδας",
@@ -1211,20 +1298,20 @@
     "topsites_form_url_placeholder": "Πληκτρολόγηση ή επικόλληση ενός URL",
     "topsites_form_add_button": "Προσθήκη",
     "topsites_form_save_button": "Αποθήκευση",
     "topsites_form_cancel_button": "Ακύρωση",
     "topsites_form_url_validation": "Απαιτείται έγκυρο URL",
     "pocket_read_more": "Δημοφιλή θέματα:",
     "pocket_read_even_more": "Προβολή περισσότερων ιστοριών",
     "pocket_feedback_header": "Τα καλύτερα του διαδικτύου, παρέχονται από πάνω από 25 εκατομμύρια άτομα.",
-    "pocket_feedback_body": "Το Pocket, ένα μέλος της οικογένειας Mozilla, θα σάς βοηθήσει να ανακαλύψετε περιεχόμενο υψηλής ποιότητας που ίσως να μην βρίσκατε διαφορετικά.",
-    "pocket_send_feedback": "Αποστολή σχολίων",
+    "pocket_description": "Ανακαλύψτε περιεχόμενο υψηλής ακρίβειας που ίσως να χάνατε διαφορετικά, με τη βοήθεια του Pocket, μέλους της Mozilla.",
+    "highlights_empty_state": "Ξεκινήστε την περιήγηση και θα σάς δείξουμε μερικά υπέροχα άρθρα, βίντεο και άλλες σελίδες που έχετε επισκεφθεί πρόσφατα ή έχετε προσθέσει στους σελιδοδείκτες σας.",
     "topstories_empty_state": "Δεν υπάρχει κάτι νεότερο. Ελέγξτε αργότερα για περισσότερες ιστορίες από τον πάροχο {provider}. Δεν μπορείτε να περιμένετε; Διαλέξτε κάποιο από τα δημοφιλή θέματα και ανακαλύψτε ενδιαφέρουσες ιστορίες από όλο τον Ιστό.",
-    "manual_migration_explanation": "Δοκιμάστε τον Firefox για τις αγαπημένες σας σελίδες και σελιδοδείκτες από άλλους περιηγητές.",
+    "manual_migration_explanation2": "Δοκιμάστε το Firefox με τους σελιδοδείκτες, το ιστορικό και τους κωδικούς πρόσβασης από ένα άλλο πρόγραμμα περιήγησης.",
     "manual_migration_cancel_button": "Όχι ευχαριστώ",
     "manual_migration_import_button": "Εισαγωγή τώρα"
   },
   "en-GB": {
     "newtab_page_title": "New Tab",
     "default_label_loading": "Loading…",
     "header_top_sites": "Top Sites",
     "header_stories": "Top Stories",
@@ -1395,16 +1482,17 @@
     "manual_migration_cancel_button": "No Thanks",
     "manual_migration_import_button": "Import Now"
   },
   "eo": {
     "newtab_page_title": "Nova langeto",
     "default_label_loading": "Ŝargado…",
     "header_top_sites": "Plej vizititaj",
     "header_stories": "Ĉefaj artikoloj",
+    "header_highlights": "Elstaraĵoj",
     "header_visit_again": "Viziti denove",
     "header_bookmarks": "Ĵusaj legosignoj",
     "header_recommended_by": "Rekomendita de {provider}",
     "header_bookmarks_placeholder": "Vi ankoraŭ ne havas legosignojn.",
     "header_stories_from": "el",
     "type_label_visited": "Vizititaj",
     "type_label_bookmarked": "Kun legosigno",
     "type_label_synced": "Spegulitaj el alia aparato",
@@ -1426,37 +1514,43 @@
     "confirm_history_delete_notice_p2": "Tiu ĉi ago ne estas malfarebla.",
     "menu_action_save_to_pocket": "Konservi en Pocket",
     "search_for_something_with": "Serĉi {search_term} per:",
     "search_button": "Serĉi",
     "search_header": "Serĉo de {search_engine_name}",
     "search_web_placeholder": "Serĉi la Teksaĵon",
     "search_settings": "Modifi serĉajn agordojn",
     "section_info_option": "Informo",
+    "section_info_send_feedback": "Sendi komentojn",
+    "section_info_privacy_notice": "Rimarko pri privateco",
     "welcome_title": "Bonvenon al nova langeto",
     "welcome_body": "Firefox uzos tiun ĉi spacon por montri al vi viaj plej gravajn legosignojn, artikolojn, filmetojn kaj paĝojn, kiujn vi vizitis antaŭ nelonge, tiel ke vi povos reiri al ili facile.",
     "welcome_label": "Elstaraĵoj identigataj",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}t",
     "settings_pane_button_label": "Personecigi la paĝon por novaj langetoj",
     "settings_pane_header": "Preferoj pri nova langeto",
-    "settings_pane_body": "Elekti tion, kio estos videbla je malfermo de nova langeto.",
+    "settings_pane_body2": "Elektu tion, kion vi vidas en tiu ĉi paĝo.",
     "settings_pane_search_header": "Serĉi",
     "settings_pane_search_body": "Serĉi la Teksaĵon el via nova langeto.",
     "settings_pane_topsites_header": "Plej vizitaj",
     "settings_pane_topsites_body": "Aliri la plej ofte vizitajn retejojn.",
     "settings_pane_topsites_options_showmore": "Montri en du vicoj",
     "settings_pane_bookmarks_header": "Ĵusaj legosignoj",
     "settings_pane_bookmarks_body": "Viaj ĵus kreitaj legosignoj, ĉemane.",
     "settings_pane_visit_again_header": "Viziti denove",
-    "settings_pane_visit_again_body": "Firefoĉ montros al vi partojn de via retuma historio, kiujn vi eble volas memori aŭ viziti denove.",
-    "settings_pane_pocketstories_header": "Ĉefaj artikoloj",
-    "settings_pane_pocketstories_body": "Pocket, parto de la familio de Mozilla, helpos vin trovi altkvalitan enhavon, kiun vi eble ne trovos aliloke.",
+    "settings_pane_visit_again_body": "Firefox montros al vi partojn de via retuma historio, kiujn vi eble volas memori aŭ viziti denove.",
+    "settings_pane_highlights_header": "Elstaraĵoj",
+    "settings_pane_highlights_body2": "Retrovu la vojon reen al interesaj aferoj, kiujn vi antaŭ nelonge vizitis aŭ por kiuj vi aldonis legosignon.",
+    "settings_pane_highlights_options_bookmarks": "Legosignoj",
+    "settings_pane_highlights_options_visited": "Vizititaj retejoj",
+    "settings_pane_snippets_header": "Fragmentoj",
+    "settings_pane_snippets_body": "Legu mallongaj novaĵojn de Mozila pri Firefox, interreta kulturo kaj, de tempo al tempo, hazarda «meme».",
     "settings_pane_done_button": "Farita",
     "edit_topsites_button_text": "Redakti",
     "edit_topsites_button_label": "Personecigi la sekcion 'plej vizititaj'",
     "edit_topsites_showmore_button": "Montri pli",
     "edit_topsites_showless_button": "Montri malpli",
     "edit_topsites_done_button": "Farita",
     "edit_topsites_pin_button": "Alpingli ĉi tiun retejon",
     "edit_topsites_unpin_button": "Depingli tiun ĉi retejon",
@@ -1469,28 +1563,29 @@
     "topsites_form_url_placeholder": "Tajpu aŭ alguu retadreson",
     "topsites_form_add_button": "Aldoni",
     "topsites_form_save_button": "Konservi",
     "topsites_form_cancel_button": "Nuligi",
     "topsites_form_url_validation": "Valida retadreso estas postulata",
     "pocket_read_more": "Ĉefaj temoj:",
     "pocket_read_even_more": "Montri pli da artikoloj",
     "pocket_feedback_header": "La plejbono el la Teksaĵo, reviziita de pli ol 25 milionoj da personoj.",
-    "pocket_feedback_body": "Pocket, parto de la familio de Mozilla, helpos vin trovi altkvalitan enhavon, kiun vi eble ne trovos aliloke.",
-    "pocket_send_feedback": "Sendi komentojn",
+    "pocket_description": "Malkovru altkvalitan enhavon, kiun vi povus aliokaze neniam trovi, per helpo de Pocket, kiu nun estas parto de Mozilla.",
+    "highlights_empty_state": "Komencu retumi kaj ĉi tie ni montros al vi kelkajn el la plej bonaj artikoloj, filmetoj kaj aliaj paĝoj, kiujn vi antaŭ nelonge vizits aŭ por kiuj vi aldonis legosignon.",
     "topstories_empty_state": "Vi legis ĉion. Kontrolu denove poste ĉu estas pli da novaĵon de {provider}. Ĉu vi ne povas atendi? Elektu popularan temon por trovi pli da interesaj artikoloj en la tuta teksaĵo.",
-    "manual_migration_explanation": "Provu Firefox kun viaj plej vizitataj retejoj kaj legosignoj el alia retumilo.",
+    "manual_migration_explanation2": "Provu Firefox kun la legosignoj, historio kaj pasvortoj de alia retumilo.",
     "manual_migration_cancel_button": "Ne, dankon",
     "manual_migration_import_button": "Importi nun"
   },
   "es-AR": {
     "newtab_page_title": "Nueva pestaña",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Más visitados",
     "header_stories": "Historias principales",
+    "header_highlights": "Destacados",
     "header_visit_again": "Visitar de nuevo",
     "header_bookmarks": "Marcadores recientes",
     "header_recommended_by": "Recomendado por {provider}",
     "header_bookmarks_placeholder": "Todavía no hay ningún marcador.",
     "header_stories_from": "de",
     "type_label_visited": "Visitados",
     "type_label_bookmarked": "Marcados",
     "type_label_synced": "Sincronizados de otro dispositivo",
@@ -1512,37 +1607,42 @@
     "confirm_history_delete_notice_p2": "Esta acción no puede deshacerse.",
     "menu_action_save_to_pocket": "Guardar en Pocket",
     "search_for_something_with": "Buscar {search_term} con:",
     "search_button": "Buscar",
     "search_header": "Buscar con {search_engine_name}",
     "search_web_placeholder": "Buscar en la web",
     "search_settings": "Cambiar opciones de búsqueda",
     "section_info_option": "Información",
+    "section_info_send_feedback": "Enviar opinión",
+    "section_info_privacy_notice": "Nota de privacidad",
     "welcome_title": "Bienvenido a una nueva pestaña",
     "welcome_body": "Firefox usará este espacio para mostrar sus marcadores, artículos, videos y páginas más relevantes que se hayan visitado para poder volver más fácilmente.",
     "welcome_label": "Identificar los destacados",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Personalizar la página nueva pestaña",
     "settings_pane_header": "Preferencia de nueva pestaña",
-    "settings_pane_body": "Elegir que se verá al abrir una nueva pestaña.",
+    "settings_pane_body2": "Seleccionar lo que se ve en esta página.",
     "settings_pane_search_header": "Buscar",
     "settings_pane_search_body": "Buscar en la Web desde nueva pestaña.",
     "settings_pane_topsites_header": "Más visitados",
     "settings_pane_topsites_body": "Acceder a los sitios web más visitados.",
     "settings_pane_topsites_options_showmore": "Mostrar dos filas",
     "settings_pane_bookmarks_header": "Marcadores recientes",
     "settings_pane_bookmarks_body": "Los marcadores recién creados en una ubicación cómoda.",
     "settings_pane_visit_again_header": "Visitar de nuevo",
     "settings_pane_visit_again_body": "Firefox mostrará partes del historial de navegación que podría querer recordar o volver a visitar.",
-    "settings_pane_pocketstories_header": "Historias principales",
-    "settings_pane_pocketstories_body": "Pocket, parte de la familia Mozilla, ayudará a conectarte con contenido de alta calidad que no podrías haber encontrado de otra forma.",
+    "settings_pane_highlights_header": "Destacados",
+    "settings_pane_highlights_options_bookmarks": "Marcadores",
+    "settings_pane_highlights_options_visited": "Sitios visitados",
+    "settings_pane_snippets_header": "Recortes",
+    "settings_pane_snippets_body": "Leer dulces actualizaciones cortas de Mozilla sobre Firefox, cultura de Internet y algún meme ocasional al azar.",
     "settings_pane_done_button": "Listo",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personalizar la sección de sitios más visitados",
     "edit_topsites_showmore_button": "Mostrar más",
     "edit_topsites_showless_button": "Mostrar menos",
     "edit_topsites_done_button": "Listo",
     "edit_topsites_pin_button": "Pegar este sitio",
     "edit_topsites_unpin_button": "Despegar este sitio",
@@ -1555,20 +1655,18 @@
     "topsites_form_url_placeholder": "Escribir o pegar URL",
     "topsites_form_add_button": "Agregar",
     "topsites_form_save_button": "Guardar",
     "topsites_form_cancel_button": "Cancelar",
     "topsites_form_url_validation": "Se requiere URL válida",
     "pocket_read_more": "Tópicos populares:",
     "pocket_read_even_more": "Ver más historias",
     "pocket_feedback_header": "Lo mejor de la web, seleccionado por más de 25 millones de personas.",
-    "pocket_feedback_body": "Pocket, parte de la familia Mozilla, ayudará a conectarte con contenido de alta calidad que no podrías haber encontrado de otra forma.",
-    "pocket_send_feedback": "Enviar opinión",
+    "pocket_description": "Descubrir contenido de alta calidad que se podría perder de otra forma, con la ayuda de Pocket, ahora parte de Mozilla.",
     "topstories_empty_state": "Ya te pusiste al día. Volvé más tarde para más historias de {provider}. ¿No podés esperar? Seleccioná un tema popular para encontrar más historias de todo el mundo.",
-    "manual_migration_explanation": "Probá Firefox con tus sitios favoritos y marcadores de otro navegador.",
     "manual_migration_cancel_button": "No gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "es-CL": {
     "newtab_page_title": "Nueva pestaña",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios frecuentes",
     "header_stories": "Historias populares",
@@ -1746,16 +1844,17 @@
     "manual_migration_cancel_button": "No, gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "es-MX": {
     "newtab_page_title": "Nueva pestaña",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios favoritos",
     "header_stories": "Historias populares",
+    "header_highlights": "Destacados",
     "header_visit_again": "Visitar de nuevo",
     "header_bookmarks": "Marcadores recientes",
     "header_recommended_by": "Recomendado por {provider}",
     "header_bookmarks_placeholder": "Aún no tienes ningún marcador.",
     "header_stories_from": "de",
     "type_label_visited": "Visitados",
     "type_label_bookmarked": "Marcados",
     "type_label_synced": "Sincronizado desde otro dispositivo",
@@ -1777,37 +1876,43 @@
     "confirm_history_delete_notice_p2": "Esta acción no se puede deshacer.",
     "menu_action_save_to_pocket": "Guardar en Pocket",
     "search_for_something_with": "Buscar {search_term} con:",
     "search_button": "Buscar",
     "search_header": "Buscar {search_engine_name}",
     "search_web_placeholder": "Buscar en la Web",
     "search_settings": "Cambiar configuraciones de búsqueda",
     "section_info_option": "Información",
+    "section_info_send_feedback": "Enviar comentarios",
+    "section_info_privacy_notice": "Política de privacidad",
     "welcome_title": "Bienvenido a una nueva pestaña",
     "welcome_body": "Firefox usará este espacio para mostrar tus marcadores, artículos, videos y páginas más relevantes que se hayan visitado para poder volver más fácilmente.",
     "welcome_label": "Identificando tus destacados",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Personalizar tu página de nueva pestaña",
     "settings_pane_header": "Preferencias de nueva pestaña",
-    "settings_pane_body": "Elige lo que ves al abrir una nueva pestaña.",
+    "settings_pane_body2": "Elige lo que ves en esta página.",
     "settings_pane_search_header": "Buscar",
     "settings_pane_search_body": "Busca en la web de tu nueva pestaña.",
     "settings_pane_topsites_header": "Sitios populares",
     "settings_pane_topsites_body": "Accede a los sitios web que más visitas.",
     "settings_pane_topsites_options_showmore": "Mostrar dos filas",
     "settings_pane_bookmarks_header": "Marcadores recientes",
     "settings_pane_bookmarks_body": "Tus marcadores recién creados en un solo lugar.",
     "settings_pane_visit_again_header": "Visitar de nuevo",
     "settings_pane_visit_again_body": "Firefox te mostrará partes de tu historial de navegación que a lo mejor te gustaría recordar o volver a visitar.",
-    "settings_pane_pocketstories_header": "Historias populares",
-    "settings_pane_pocketstories_body": "Pocket, miembro de la familia Mozilla, te ayuda a conectarte con contenido de alta calidad que tal vez no hubieras encontrado de otra forma.",
+    "settings_pane_highlights_header": "Destacados",
+    "settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que has visitado o marcado recientemente.",
+    "settings_pane_highlights_options_bookmarks": "Marcadores",
+    "settings_pane_highlights_options_visited": "Sitios visitados",
+    "settings_pane_snippets_header": "Fragmentos",
+    "settings_pane_snippets_body": "Lee actualizaciones breves de Mozilla sobre Firefox, la cultura de internet y de repente un meme de vez en cuando.",
     "settings_pane_done_button": "Listo",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personalizar la sección de tus sitios preferidos",
     "edit_topsites_showmore_button": "Mostrar más",
     "edit_topsites_showless_button": "Mostrar menos",
     "edit_topsites_done_button": "Listo",
     "edit_topsites_pin_button": "Fijar este sitio",
     "edit_topsites_unpin_button": "Despegar este sitio",
@@ -1820,20 +1925,20 @@
     "topsites_form_url_placeholder": "Escribir o pegar una URL",
     "topsites_form_add_button": "Agregar",
     "topsites_form_save_button": "Guardar",
     "topsites_form_cancel_button": "Cancelar",
     "topsites_form_url_validation": "Se requiere una URL válida",
     "pocket_read_more": "Temas populares:",
     "pocket_read_even_more": "Ver más historias",
     "pocket_feedback_header": "Lo mejor de la web, seleccionado por más 25 millones de personas.",
-    "pocket_feedback_body": "Pocket, miembro de la familia Mozilla, te ayuda a conectarte con contenido de alta calidad que tal vez no hubieras encontrado de otra forma.",
-    "pocket_send_feedback": "Enviar opinión",
+    "pocket_description": "Descubre contenido de alta calidad que de otra forma te podrías perder, con la ayuda de Pocket, ahora parte de Mozilla.",
+    "highlights_empty_state": "Empieza a navegar, y nosotros te mostraremos aquí algunos de los mejores artículos, videos y otras páginas que hayas visitado recientemente o marcado.",
     "topstories_empty_state": "Ya estás al día. Vuelve luego y busca más historias de {provider}. ¿No puedes esperar? Selecciona un tema popular y encontrarás más historias interesantes por toda la web.",
-    "manual_migration_explanation": "Prueba Firefox con tus sitios favoritos y marcadores desde otro navegador.",
+    "manual_migration_explanation2": "Prueba Firefox con los marcadores, historial y contraseñas de otro navegador.",
     "manual_migration_cancel_button": "No, gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "et": {
     "newtab_page_title": "Uus kaart",
     "default_label_loading": "Laadimine…",
     "header_top_sites": "Top saidid",
     "header_stories": "Top lood",
@@ -1979,18 +2084,21 @@
     "settings_pane_topsites_header": "Gune erabilienak",
     "settings_pane_topsites_body": "Sartu gehien bisitatzen dituzun webguneetara.",
     "settings_pane_topsites_options_showmore": "Erakutsi bi errenkada",
     "settings_pane_bookmarks_header": "Azken laster-markak",
     "settings_pane_bookmarks_body": "Sortutako azken laster-markak toki bakarrean esku-eskura.",
     "settings_pane_visit_again_header": "Bisitatu berriro",
     "settings_pane_visit_again_body": "Gogoratu edo itzuli nahiko duzun historiaren zatia erakutsiko dizu Firefoxek.",
     "settings_pane_highlights_header": "Nabarmendutakoak",
+    "settings_pane_highlights_body2": "Aurkitu itzultzeko bidea azkenaldian bisitatutako edo laster-marka egindako gauza interesgarrietara.",
     "settings_pane_highlights_options_bookmarks": "Laster-markak",
     "settings_pane_highlights_options_visited": "Bisitatutako guneak",
+    "settings_pane_snippets_header": "Mezu-zatiak",
+    "settings_pane_snippets_body": "Irakurri Firefoxi eta interneteko kulturari buruzko Mozillaren eguneraketa laburrak, hala nola tartekako ausazko memeak.",
     "settings_pane_done_button": "Eginda",
     "edit_topsites_button_text": "Editatu",
     "edit_topsites_button_label": "Pertsonalizatu gune erabilienen atala",
     "edit_topsites_showmore_button": "Erakutsi gehiago",
     "edit_topsites_showless_button": "Erakutsi gutxiago",
     "edit_topsites_done_button": "Eginda",
     "edit_topsites_pin_button": "Ainguratu gune hau",
     "edit_topsites_unpin_button": "Desainguratu gune hau",
@@ -2003,25 +2111,29 @@
     "topsites_form_url_placeholder": "Idatzi edo itsatsi URLa",
     "topsites_form_add_button": "Gehitu",
     "topsites_form_save_button": "Gorde",
     "topsites_form_cancel_button": "Utzi",
     "topsites_form_url_validation": "Baliozko URLa behar da",
     "pocket_read_more": "Gai ezagunak:",
     "pocket_read_even_more": "Ikusi istorio gehiago",
     "pocket_feedback_header": "Webeko onena, 25 milioi pertsona baino gehiagok bilduta.",
+    "pocket_description": "Deskubritu orain Mozillaren zati den Pocket-en laguntzari esker bestela gal zenitzakeen kalitatezko edukiak.",
+    "highlights_empty_state": "Hasi nabigatzen eta azkenaldian bisitatutako edo laster-marka egindako aparteko artikulu, bideo eta orriak erakutsiko ditugu.",
     "topstories_empty_state": "Egunean zaude jada. Etorri berriro geroago {provider} hornitzailearen istorio ezagun gehiagorako. Ezin duzu itxaron? Hautatu gai ezagun bat webeko istorio gehiago aurkitzeko.",
+    "manual_migration_explanation2": "Probatu Firefox beste nabigatzaile batetik ekarritako laster-marka, historia eta pasahitzekin.",
     "manual_migration_cancel_button": "Ez, eskerrik asko",
     "manual_migration_import_button": "Inportatu orain"
   },
   "fa": {
     "newtab_page_title": "زبانه جدید",
     "default_label_loading": "در حال بارگیری…",
     "header_top_sites": "سایت‌های برتر",
     "header_stories": "برترین داستان‌ها",
+    "header_highlights": "برجسته‌ها",
     "header_visit_again": "مشاهده دوباره",
     "header_bookmarks": "نشانک‌های اخیر",
     "header_recommended_by": "پیشنهاد شده توسط {provider}",
     "header_bookmarks_placeholder": "هنوز هیچ نشانکی ندارید.",
     "header_stories_from": "از",
     "type_label_visited": "مشاهده شده",
     "type_label_bookmarked": "نشانک شده",
     "type_label_synced": "هم‌گام شده از دستگاهی دیگر",
@@ -2043,37 +2155,43 @@
     "confirm_history_delete_notice_p2": "این عمل قابل برگشت نیست.",
     "menu_action_save_to_pocket": "ذخیره‌سازی در Pocket",
     "search_for_something_with": "جست‌وجو برای {search_term} با:",
     "search_button": "جست‌وجو",
     "search_header": "جست‌وجو {search_engine_name}",
     "search_web_placeholder": "جست‌وجوی وب",
     "search_settings": "تغییر تنظیمات جست‌وجو",
     "section_info_option": "اطلاعات",
+    "section_info_send_feedback": "ارسال بازخورد",
+    "section_info_privacy_notice": "نکات حفظ حریم خصوصی",
     "welcome_title": "به زبانه جدید خوش‌آمدید",
     "welcome_body": "فایرفاکس از این فضا برای نمایش نشانک‌ها، مقالات، ویدئوها و صفحات مرتبطی که به‌تازگی مشاهده کرده‌اید استفاده می‌کند، تا شما به راحتی دوباره به آنها دسترسی داشته باشید.",
     "welcome_label": "شناسایی گزینه‌های برجسته شما",
     "time_label_less_than_minute": "> ۱ دقیقه",
     "time_label_minute": "{number} د",
     "time_label_hour": "{number} س",
     "time_label_day": "{number} ر",
     "settings_pane_button_label": "صفحهٔ زبانه جدید را سفارشی کنید",
     "settings_pane_header": "تنظیمات زبانه جدید",
-    "settings_pane_body": "انتخاب کنید که چه چیزی هنگام باز کردن زبانه جدید ببینید.",
+    "settings_pane_body2": "انتخاب کنید چیزی را که مایل هستید در این صفحه مشاهده کنید.",
     "settings_pane_search_header": "جست‌وجو",
     "settings_pane_search_body": "وب را از زبانه جدید خود جست‌وجو کنید.",
     "settings_pane_topsites_header": "سایت‌های برتر",
     "settings_pane_topsites_body": "به وب‌سایت‌هایی که بیشترین بازدید از آنها را داشتید دسترسی داشته باشید.",
     "settings_pane_topsites_options_showmore": "نمایش دو ردیفی",
     "settings_pane_bookmarks_header": "نشانک‌های اخیر",
     "settings_pane_bookmarks_body": "به‌تازگی شما نشانک‌هایی را در یک محل مناسب ساخته‌اید.",
     "settings_pane_visit_again_header": "مشاهده دوباره",
     "settings_pane_visit_again_body": "فایرفاکس بخش‌هایی از تاریخ‌چه مرورتان را که ممکن است بخواهید به یاد داشته باشید یا به آن‌ها بازگردید به شما نشان خواهد داد.",
-    "settings_pane_pocketstories_header": "برترین داستان‌ها",
-    "settings_pane_pocketstories_body": "Pocket، بخشی از خانواده موزیلا، کمک خواهد کرد تا به محتوایی با کیفیت بالا مرتبط شوید که در غیر این صورت ممکن بود پیدا نکنید.",
+    "settings_pane_highlights_header": "برجسته‌ها",
+    "settings_pane_highlights_body2": "راه خود را در میان چیزهایی که دوست دارید پیدا کنید.چیزهایی که اخیرا مشاهده کرده اید یا نشانک ها.",
+    "settings_pane_highlights_options_bookmarks": "نشانک‌ها",
+    "settings_pane_highlights_options_visited": "سایت‌های بازدید شده",
+    "settings_pane_snippets_header": "قطعه‌ها",
+    "settings_pane_snippets_body": "بروزرسانی های شیرین و کوتاه موزیلا در مورد فایرفاکس،‌ فرهنگ اینترنت، و تصاویر تصادفی مناسبتی مطالعه کنید.",
     "settings_pane_done_button": "انجام شد",
     "edit_topsites_button_text": "ويرايش",
     "edit_topsites_button_label": "قسمت سایت‌های برتر را سفارشی کنید",
     "edit_topsites_showmore_button": "نمایش بیشتر",
     "edit_topsites_showless_button": "نمایش کمتر",
     "edit_topsites_done_button": "انجام شد",
     "edit_topsites_pin_button": "چسباندن این سایت",
     "edit_topsites_unpin_button": "لغو سنجاق کردن این پایگاه اینترنتی",
@@ -2086,28 +2204,29 @@
     "topsites_form_url_placeholder": "یک URL تایپ کنید یا بچسبانید",
     "topsites_form_add_button": "افزودن",
     "topsites_form_save_button": "ذخیره",
     "topsites_form_cancel_button": "انصراف",
     "topsites_form_url_validation": "URL معتبر الزامی است",
     "pocket_read_more": "موضوع‌های محبوب:",
     "pocket_read_even_more": "مشاهده داستان‌های بیشتر",
     "pocket_feedback_header": "بهترین‌های وب، گزینش شده توسط بیش از ۲۵ میلیون نفر.",
-    "pocket_feedback_body": "Pocket، بخشی از خانواده موزیلا، کمک خواهد کرد تا به محتوایی با کیفیت بالا مرتبط شوید که در غیر این صورت ممکن بود پیدا نکنید.",
-    "pocket_send_feedback": "ارسال بازخورد",
+    "pocket_description": "محتواهای با کیفیتی را پیدا کنید که ممکن است از دست داده باشید، به کمک Pocket که اکنون بخشی از موزیلا است.",
+    "highlights_empty_state": "مرور کردن را شروع کنید و شاهد تعداد زیادی مقاله، فیلم و صفحات خوبی باشید که اخیر مشاهده کرده اید یا نشانگ گذاری کرده اید.",
     "topstories_empty_state": "فعلا تموم شد. بعدا دوباره سر بزن تا مطالب جدید از {provider} ببینی. نمی‌تونی صبر کنی؟ یک موضوع محبوب رو انتخاب کن تا مطالب جالب مرتبط از سراسر دنیا رو پیدا کنی.",
-    "manual_migration_explanation": "فایرفاکس را با سایت‌های مورد علاقه و نشانک‌های خود در سایر مرورگرها امتحان کنید.",
+    "manual_migration_explanation2": "فایرفاکس را با نشانک‌ها،‌ تاریخچه‌ها و کلمات عبور از سایر مرورگر ها تجربه کنید.",
     "manual_migration_cancel_button": "نه ممنون",
     "manual_migration_import_button": "هم‌اکنون وارد شوند"
   },
   "fi": {
     "newtab_page_title": "Uusi välilehti",
     "default_label_loading": "Ladataan…",
     "header_top_sites": "Ykkössivustot",
     "header_stories": "Ykkösjutut",
+    "header_highlights": "Nostot",
     "header_visit_again": "Käy toistekin",
     "header_bookmarks": "Uusimmat kirjanmerkit",
     "header_recommended_by": "Suositukset lähteestä {provider}",
     "header_bookmarks_placeholder": "Sinulla ei ole vielä kirjanmerkkejä.",
     "header_stories_from": "Lähde",
     "type_label_visited": "Vierailtu",
     "type_label_bookmarked": "Kirjanmerkki",
     "type_label_synced": "Synkronoitu toiselta laitteelta",
@@ -2129,37 +2248,41 @@
     "confirm_history_delete_notice_p2": "Tämä toiminto on peruuttamaton.",
     "menu_action_save_to_pocket": "Tallenna Pocket-palveluun",
     "search_for_something_with": "Hae {search_term} palvelusta:",
     "search_button": "Haku",
     "search_header": "{search_engine_name}-haku",
     "search_web_placeholder": "Verkkohaku",
     "search_settings": "Muuta hakuasetuksia",
     "section_info_option": "Tietoa",
+    "section_info_send_feedback": "Anna palautetta",
+    "section_info_privacy_notice": "Tietosuojakäytäntö",
     "welcome_title": "Tervetuloa uuteen välilehteen",
     "welcome_body": "Firefox käyttää tätä tilaa näyttämään olennaisimmat kirjanmerkit, artikkelit, videot ja sivut, joita olet katsellut, jotta pääset niihin takaisin nopeasti.",
     "welcome_label": "Tunnistetaan nostojasi",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} pv",
     "settings_pane_button_label": "Muokkaa Uusi välilehti -sivua",
     "settings_pane_header": "Uuden välilehden asetukset",
-    "settings_pane_body": "Valitse mitä näet, kun avaat uuden välilehden.",
+    "settings_pane_body2": "Valitse, mitä haluat nähdä tällä sivulla.",
     "settings_pane_search_header": "Haku",
     "settings_pane_search_body": "Tee verkkohakuja uudesta välilehdestä.",
     "settings_pane_topsites_header": "Ykkössivustot",
     "settings_pane_topsites_body": "Näe eniten vierailemasi sivustot.",
     "settings_pane_topsites_options_showmore": "Näytä kaksi riviä",
     "settings_pane_bookmarks_header": "Uusimmat kirjanmerkit",
     "settings_pane_bookmarks_body": "Uusimmat kirjanmerkkisi, yhdessä kätevässä paikassa.",
     "settings_pane_visit_again_header": "Käy toistekin",
     "settings_pane_visit_again_body": "Firefox näyttää selaushistoriastasi palasia, jotka saatat haluta muistaa tai joissa haluat ehkä käydä.",
-    "settings_pane_pocketstories_header": "Ykkösjutut",
-    "settings_pane_pocketstories_body": "Pocket, osa Mozilla-perhettä, auttaa löytämään laadukasta sisältöä, jota et ehkä olisi muuten löytänyt.",
+    "settings_pane_highlights_header": "Nostot",
+    "settings_pane_highlights_body2": "Löydä tiesi takaisin kiinnostaviin juttuihin, joissa olet käynyt tai jotka olet lisännyt kirjanmerkkeihin viime aikoina.",
+    "settings_pane_highlights_options_bookmarks": "Kirjanmerkit",
+    "settings_pane_highlights_options_visited": "Vieraillut sivustot",
     "settings_pane_done_button": "Valmis",
     "edit_topsites_button_text": "Muokkaa",
     "edit_topsites_button_label": "Muokkaa Ykkössivustot-osiota",
     "edit_topsites_showmore_button": "Näytä enemmän",
     "edit_topsites_showless_button": "Näytä vähemmän",
     "edit_topsites_done_button": "Valmis",
     "edit_topsites_pin_button": "Kiinnitä tämä sivusto",
     "edit_topsites_unpin_button": "Poista tämän sivuston kiinnitys",
@@ -2172,20 +2295,17 @@
     "topsites_form_url_placeholder": "Kirjoita tai liitä osoite",
     "topsites_form_add_button": "Lisää",
     "topsites_form_save_button": "Tallenna",
     "topsites_form_cancel_button": "Peruuta",
     "topsites_form_url_validation": "Kelvollinen osoite vaaditaan",
     "pocket_read_more": "Suositut aiheet:",
     "pocket_read_even_more": "Katso lisää juttuja",
     "pocket_feedback_header": "Netin parhaat palat, valikoitu yli 25 miljoonan ihmisen voimin.",
-    "pocket_feedback_body": "Pocket, osa Mozilla-perhettä, auttaa löytämään laadukasta sisältöä, jota et ehkä olisi muuten löytänyt.",
-    "pocket_send_feedback": "Lähetä palautetta",
     "topstories_empty_state": "Ei enempää suosituksia juuri nyt. Katso myöhemmin uudestaan lisää ykkösjuttuja lähteestä {provider}. Etkö malta odottaa? Valitse suosittu aihe ja löydä lisää hyviä juttuja ympäri verkkoa.",
-    "manual_migration_explanation": "Kokeile Firefoxia toisesta selaimesta tuotujen suosikkisivustojesi ja kirjanmerkkiesi kanssa.",
     "manual_migration_cancel_button": "Ei kiitos",
     "manual_migration_import_button": "Tuo nyt"
   },
   "fr": {
     "newtab_page_title": "Nouvel onglet",
     "default_label_loading": "Chargement…",
     "header_top_sites": "Sites les plus visités",
     "header_stories": "Articles populaires",
@@ -2238,18 +2358,21 @@
     "settings_pane_topsites_header": "Sites les plus visités",
     "settings_pane_topsites_body": "Accédez aux sites que vous consultez le plus.",
     "settings_pane_topsites_options_showmore": "Afficher deux lignes",
     "settings_pane_bookmarks_header": "Marque-pages récents",
     "settings_pane_bookmarks_body": "Vos nouveaux marque-pages, facilement accessibles.",
     "settings_pane_visit_again_header": "Visiter à nouveau",
     "settings_pane_visit_again_body": "Firefox affichera des extraits de votre historique de navigation dont vous pourriez vouloir vous souvenir ou que vous pourriez vouloir revisiter.",
     "settings_pane_highlights_header": "Éléments-clés",
+    "settings_pane_highlights_body2": "Retrouvez des pages inintéressantes que vous avez déjà visitées récemment ou ajoutées aux marque-pages.",
     "settings_pane_highlights_options_bookmarks": "Marque-pages",
     "settings_pane_highlights_options_visited": "Sites visités",
+    "settings_pane_snippets_header": "Brèves",
+    "settings_pane_snippets_body": "Consultez les brèves de Mozilla à propos de Firefox, la culture Internet, mais aussi quelques mèmes Internet de temps en temps.",
     "settings_pane_done_button": "Terminé",
     "edit_topsites_button_text": "Modifier",
     "edit_topsites_button_label": "Personnaliser la section Sites les plus visités",
     "edit_topsites_showmore_button": "Afficher plus",
     "edit_topsites_showless_button": "Afficher moins",
     "edit_topsites_done_button": "Terminé",
     "edit_topsites_pin_button": "Épingler ce site",
     "edit_topsites_unpin_button": "Relâcher ce site",
@@ -2262,26 +2385,29 @@
     "topsites_form_url_placeholder": "Saisir ou coller une adresse web",
     "topsites_form_add_button": "Ajouter",
     "topsites_form_save_button": "Enregistrer",
     "topsites_form_cancel_button": "Annuler",
     "topsites_form_url_validation": "Adresse web valide requise",
     "pocket_read_more": "Sujets populaires :",
     "pocket_read_even_more": "Afficher plus d’articles",
     "pocket_feedback_header": "Le meilleur du Web, sélectionné par plus de 25 millions de personnes.",
+    "pocket_description": "Grâce à Pocket, faisant désormais partie de Mozilla, découvrez du contenu de grande qualité que vous auriez pu manquer dans le cas contraire.",
+    "highlights_empty_state": "Commencez à naviguer puis nous afficherons des articles, des vidéos ou d’autres pages que vous avez récemment visités ou ajoutés aux marque-pages.",
     "topstories_empty_state": "Il n’y en a pas d’autres. Revenez plus tard pour plus d’articles de {provider}. Vous ne voulez pas attendre ? Choisissez un sujet parmi les plus populaires pour découvrir d’autres articles intéressants sur le Web.",
     "manual_migration_explanation2": "Essayez Firefox en important les marque-pages, l’historique et les mots de passe depuis un autre navigateur.",
     "manual_migration_cancel_button": "Non merci",
     "manual_migration_import_button": "Importer"
   },
   "fy-NL": {
     "newtab_page_title": "Nij ljepblêd",
     "default_label_loading": "Lade…",
     "header_top_sites": "Topwebsites",
     "header_stories": "Topferhalen",
+    "header_highlights": "Hichtepunten",
     "header_visit_again": "Nochris besykje",
     "header_bookmarks": "Resinte blêdwizers",
     "header_recommended_by": "Oanrekommandearre troch {provider}",
     "header_bookmarks_placeholder": "Jo hawwe noch gjin inkelde blêdwizer.",
     "header_stories_from": "fan",
     "type_label_visited": "Besocht",
     "type_label_bookmarked": "Blêdwizer makke",
     "type_label_synced": "Syngronisearre fan oar apparaat ôf",
@@ -2303,37 +2429,43 @@
     "confirm_history_delete_notice_p2": "Dizze aksje kin net ûngedien makke wurde.",
     "menu_action_save_to_pocket": "Bewarje nei Pocket",
     "search_for_something_with": "Sykje nei {search_term} mei:",
     "search_button": "Sykje",
     "search_header": "{search_engine_name} trochsykje",
     "search_web_placeholder": "Sykje op it web",
     "search_settings": "Sykynstellingen wizigje",
     "section_info_option": "Ynfo",
+    "section_info_send_feedback": "Kommentaar ferstjoere",
+    "section_info_privacy_notice": "Privacyferklearring",
     "welcome_title": "Wolkom by it nije ljepblêd",
     "welcome_body": "Firefox brûkt dizze romte om jo meast relevante blêdwizers, artikelen, fideo’s en siden dy't jo koartlyn besocht hawwe wer te jaan, sadat jo dizze ienfâldichwei weromfine kinne.",
     "welcome_label": "Jo hichtepunten oantsjutte",
     "time_label_less_than_minute": "< 1 m",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} o",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Jo side foar nije ljepblêden oanpasse",
     "settings_pane_header": "Nij ljepblêdfoarkarren",
-    "settings_pane_body": "Kies wat jo sjogge as jo in nij ljepblêd iepenje.",
+    "settings_pane_body2": "Kies wat jo op dizze side sjogge.",
     "settings_pane_search_header": "Sykje",
     "settings_pane_search_body": "Sykje op it web fan jo nije ljepblêd út.",
     "settings_pane_topsites_header": "Topwebsites",
     "settings_pane_topsites_body": "Benaderje de websites dy't jo it meast besykje.",
     "settings_pane_topsites_options_showmore": "Twa rigen toane",
     "settings_pane_bookmarks_header": "Resinte blêdwizers",
     "settings_pane_bookmarks_body": "Jo koartlyn oanmakke blêdwizers op ien handich plak.",
     "settings_pane_visit_again_header": "Nochris besykje",
     "settings_pane_visit_again_body": "Firefox sil jo ûnderdielen fan jo sneupskiednis toane dy't jo miskien ûnthâlde of nei werom gean wolle.",
-    "settings_pane_pocketstories_header": "Topferhalen",
-    "settings_pane_pocketstories_body": "Pocket, part fan de Mozilla-famylje, sil jo helpe te ferbinen mei hege kwaliteit ynhâld dy't jo oars miskien net fûn hienen.",
+    "settings_pane_highlights_header": "Hichtepunten",
+    "settings_pane_highlights_body2": "Fyn fluch ynteressante saken werom út jo blêdwizers en resint besocht siden.",
+    "settings_pane_highlights_options_bookmarks": "Blêdwizers",
+    "settings_pane_highlights_options_visited": "Besochte websites",
+    "settings_pane_snippets_header": "Koarte ynformaasje",
+    "settings_pane_snippets_body": "Lês koart nijs fan Mozilla oer Firefox, ynternetkultuer en somtiden in meme.",
     "settings_pane_done_button": "Dien",
     "edit_topsites_button_text": "Bewurkje",
     "edit_topsites_button_label": "Jo seksje Topwebsites oanpasse",
     "edit_topsites_showmore_button": "Mear toane",
     "edit_topsites_showless_button": "Minder toane",
     "edit_topsites_done_button": "Dien",
     "edit_topsites_pin_button": "Dizze side fêstsette",
     "edit_topsites_unpin_button": "Dizze webstee loskeppelje",
@@ -2346,20 +2478,20 @@
     "topsites_form_url_placeholder": "Typ of plak in URL",
     "topsites_form_add_button": "Tafoegje",
     "topsites_form_save_button": "Bewarje",
     "topsites_form_cancel_button": "Annulearje",
     "topsites_form_url_validation": "Jildige URL fereaske",
     "pocket_read_more": "Populêre ûnderwerpen:",
     "pocket_read_even_more": "Mear ferhalen besjen",
     "pocket_feedback_header": "It bêste fan it web, sammele troch mear as 25 miljoen minsken.",
-    "pocket_feedback_body": "Pocket, part fan de Mozilla-famylje, sil jo helpe te ferbinen mei hege kwaliteit ynhâld dy't jo oars miskien net fûn hienen.",
-    "pocket_send_feedback": "Kommentaar ferstjoere",
+    "pocket_description": "Untdek ynhâld fan hege kwaliteit mei help fan Pocket (no ûnderdiel fan Mozilla), dy't jo oars misten.",
+    "highlights_empty_state": "Start mei sneupen en wy toane jo guon moaie artikelen, fideo's en oare siden dy't jo resint besocht hawwe of in blêdwizer fan makke hawwe.",
     "topstories_empty_state": "Jo binne by. Kom letter werom foar mear ferhalen fan {provider}. Kin jo net wachtsje? Selektearje in populêr ûnderwerp om mear ferhalen fan it ynternet te finen.",
-    "manual_migration_explanation": "Probearje Firefox mei jo favorite websites en blêdwizers fan in oare browser.",
+    "manual_migration_explanation2": "Probearje Firefox en ymportearje de blêdwizers, skiednis en wachtwurden fan oare browsers.",
     "manual_migration_cancel_button": "Nee tankewol",
     "manual_migration_import_button": "No ymportearje"
   },
   "ga-IE": {
     "newtab_page_title": "Cluaisín Nua",
     "default_label_loading": "Á Lódáil…",
     "header_top_sites": "Barrshuímh",
     "header_stories": "Barrscéalta",
@@ -2518,17 +2650,16 @@
     "pocket_feedback_header": "Brod an eadar-lìn, air a dheasachadh le barrachd air 25 millean duine.",
     "pocket_feedback_body": "Pocket, ball de theaghlach Mozilla, a cheanglas tu ri susbaint fhìor-mhath nach biodh tu air fhaicinn air dòigh eile.",
     "pocket_send_feedback": "Dè do bheachd air?",
     "topstories_empty_state": "Sin na naidheachdan uile o {provider} an-dràsta ach bidh barrachd ann a dh’aithghearr. No thoir sùil air cuspair air a bheil fèill mhòr is leugh na tha a’ dol mun cuairt air an lìon an-dràsta.",
     "manual_migration_explanation": "Feuch Firefox leis na làraichean is comharran-lìn as fhearr leat o bhrabhsair eile.",
     "manual_migration_cancel_button": "Chan eil, tapadh leibh",
     "manual_migration_import_button": "Ion-phortaich an-dràsta"
   },
-  "gn": {},
   "gu-IN": {
     "newtab_page_title": "નવું ટૅબ",
     "default_label_loading": "લોડ કરી રહ્યું છે...",
     "header_top_sites": "ટોપ સાઇટ્સ",
     "header_highlights": "હાઇલાઇટ્સ",
     "type_label_visited": "જોવામા આવેલ:",
     "type_label_bookmarked": "બુકમાર્ક્સ",
     "type_label_synced": "બીજા ઉપકરણ થી સમન્વયિત કરેલ છે",
@@ -3438,16 +3569,17 @@
     "manual_migration_cancel_button": "Ala, tanemmirt",
     "manual_migration_import_button": "Kter tura"
   },
   "kk": {
     "newtab_page_title": "Жаңа бет",
     "default_label_loading": "Жүктелуде…",
     "header_top_sites": "Топ сайттар",
     "header_stories": "Топ хикаялар",
+    "header_highlights": "Ерекше жаңалықтар",
     "header_visit_again": "Қайтадан шолу",
     "header_bookmarks": "Соңғы бетбелгілер",
     "header_recommended_by": "Ұсынушы {provider}",
     "header_bookmarks_placeholder": "Сізде әлі бетбелгілер жоқ.",
     "header_stories_from": "ұсынған",
     "type_label_visited": "Қаралған",
     "type_label_bookmarked": "Бетбелгілерде",
     "type_label_synced": "Басқа құрылғыдан синхрондалған",
@@ -3469,37 +3601,41 @@
     "confirm_history_delete_notice_p2": "Бұл әрекетті болдырмау мүмкін болмайды.",
     "menu_action_save_to_pocket": "Pocket-ке сақтау",
     "search_for_something_with": "{search_term} ұғымын көмегімен іздеу:",
     "search_button": "Іздеу",
     "search_header": "{search_engine_name} іздеуі",
     "search_web_placeholder": "Интернетте іздеу",
     "search_settings": "Іздеу баптауларын өзгерту",
     "section_info_option": "Ақпарат",
+    "section_info_send_feedback": "Кері байланыс хабарламасын жіберу",
+    "section_info_privacy_notice": "Жекелік ескертуі",
     "welcome_title": "Жаңа бетке қош келдіңіз",
     "welcome_body": "Firefox бұл орында ең маңызды бетбелгілер, мақалалар, видеолар және жуырда қаралған беттерді көрсетеді, оның көмегімен сіз оларға оңай түрде орала аласыз.",
     "welcome_label": "Ең басты нәрселерді анықтау",
     "time_label_less_than_minute": "<1 минут",
     "time_label_minute": "{number} минут",
     "time_label_hour": "{number} сағат",
     "time_label_day": "{number} күн",
     "settings_pane_button_label": "Жаңа бетті баптаңыз",
     "settings_pane_header": "Жаңа бет баптаулары",
-    "settings_pane_body": "Жаңа бетті ашқан кезде нені көретініңізді таңдаңыз.",
+    "settings_pane_body2": "Бұл парақта не көргіңіз келетінді таңдаңыз.",
     "settings_pane_search_header": "Іздеу",
     "settings_pane_search_body": "Жаңа беттен интернеттен іздеңіз.",
     "settings_pane_topsites_header": "Топ сайттар",
     "settings_pane_topsites_body": "Көбірек қаралатын сайттарға қатынау.",
     "settings_pane_topsites_options_showmore": "Екі жолды көрсету",
     "settings_pane_bookmarks_header": "Соңғы бетбелгілер",
     "settings_pane_bookmarks_body": "Сіздің жаңадан жасалған бетбелгілер бір ыңғайлы жерде.",
     "settings_pane_visit_again_header": "Қайтадан шолу",
     "settings_pane_visit_again_body": "Firefox сізге есте сақтауды немесе қайта шолуды қалауыңыз мүмкін тарихыңыздың бөліктерін көрсетеді.",
-    "settings_pane_pocketstories_header": "Топ хикаялар",
-    "settings_pane_pocketstories_body": "Pocket, Mozilla құрамындағы өнім, сізге әдетте табылмауы мүмкін құрамаға байланысуға көмектеседі.",
+    "settings_pane_highlights_header": "Ерекше жаңалықтар",
+    "settings_pane_highlights_options_bookmarks": "Бетбелгілер",
+    "settings_pane_highlights_options_visited": "Ашылған сайттар",
+    "settings_pane_snippets_header": "Үзінділер",
     "settings_pane_done_button": "Дайын",
     "edit_topsites_button_text": "Түзету",
     "edit_topsites_button_label": "Топ сайттар санатын баптау",
     "edit_topsites_showmore_button": "Көбірек көрсету",
     "edit_topsites_showless_button": "Азырақ көрсету",
     "edit_topsites_done_button": "Дайын",
     "edit_topsites_pin_button": "Бұл сайтты жапсыру",
     "edit_topsites_unpin_button": "Бұл сайтты бекітуден алып тастау",
@@ -3512,20 +3648,17 @@
     "topsites_form_url_placeholder": "Сілтемені теріңіз немесе кірістіріңіз",
     "topsites_form_add_button": "Қосу",
     "topsites_form_save_button": "Сақтау",
     "topsites_form_cancel_button": "Бас тарту",
     "topsites_form_url_validation": "Жарамды сілтеме керек",
     "pocket_read_more": "Әйгілі тақырыптар:",
     "pocket_read_even_more": "Көбірек хикаяларды қарау",
     "pocket_feedback_header": "Интернеттің ең жақсысы, 25 миллион адаммен танылған.",
-    "pocket_feedback_body": "Pocket, Mozilla құрамындағы өнім, сізге әдетте табылмауы мүмкін құрамаға байланысуға көмектеседі.",
-    "pocket_send_feedback": "Кері байланыс хабарламасын жіберу",
     "topstories_empty_state": "Дайын. {provider} ұсынған көбірек мақалаларды алу үшін кейінірек тексеріңіз. Күте алмайсыз ба? Интернеттен көбірек тамаша мақалаларды алу үшін әйгілі теманы таңдаңыз.",
-    "manual_migration_explanation": "Firefox-ты басқа браузерден таңдамалы сайттар және бетбелгілеріңізбен қолданып көріңіз.",
     "manual_migration_cancel_button": "Жоқ, рахмет",
     "manual_migration_import_button": "Қазір импорттау"
   },
   "km": {
     "newtab_page_title": "ផ្ទាំង​ថ្មី",
     "default_label_loading": "កំពុង​ផ្ទុក...",
     "header_top_sites": "វិបសាយ​លើ​គេ",
     "header_highlights": "ការ​រំលេច",
@@ -3725,16 +3858,17 @@
     "edit_topsites_edit_button": "ແກ້ໄຂເວັບໄຊທ໌ນີ້",
     "edit_topsites_dismiss_button": "ຍົກເລີກເວັບໄຊທ໌ນີ້"
   },
   "lt": {
     "newtab_page_title": "Nauja kortelė",
     "default_label_loading": "Įkeliama…",
     "header_top_sites": "Lankomiausios svetainės",
     "header_stories": "Populiariausi straipsniai",
+    "header_highlights": "Akcentai",
     "header_visit_again": "Aplankykite vėl",
     "header_bookmarks": "Paskiausi adresyno įrašai",
     "header_recommended_by": "Rekomendavo „{provider}“",
     "header_bookmarks_placeholder": "Jūs dar neturite adresyno įrašų.",
     "header_stories_from": "iš",
     "type_label_visited": "Aplankyti",
     "type_label_bookmarked": "Adresyne",
     "type_label_synced": "Sinchronizuoti iš kito įrenginio",
@@ -3756,37 +3890,42 @@
     "confirm_history_delete_notice_p2": "Atlikus šį veiksmą, jo atšaukti neįmanoma.",
     "menu_action_save_to_pocket": "Įrašyti į „Pocket“",
     "search_for_something_with": "Ieškoti „{search_term}“ per:",
     "search_button": "Ieškoti",
     "search_header": "{search_engine_name} paieška",
     "search_web_placeholder": "Ieškokite saityne",
     "search_settings": "Keisti paieškos nuostatas",
     "section_info_option": "Informacija",
+    "section_info_send_feedback": "Siųsti atsiliepimą",
+    "section_info_privacy_notice": "Privatumo nuostatai",
     "welcome_title": "Sveiki, čia nauja kortelė",
     "welcome_body": "„Firefox“ naudos šią vietą jums aktualiausių adresyno įrašų, straipsnių, vaizdo įrašų bei neseniai lankytų tinklalapių rodymui, kad galėtumėte lengvai į juos sugrįžti.",
     "welcome_label": "Nustatomi jūsų akcentai",
     "time_label_less_than_minute": "<1 min.",
     "time_label_minute": "{number} min.",
     "time_label_hour": "{number} val.",
     "time_label_day": "{number} d.",
     "settings_pane_button_label": "Tinkinkite savo naujos kortelės puslapį",
     "settings_pane_header": "Naujos kortelės nuostatos",
-    "settings_pane_body": "Pasirinkite, ką matysite atvėrę naują kortelę.",
+    "settings_pane_body2": "Pasirinkite, ką matysite šiame tinklalapyje.",
     "settings_pane_search_header": "Paieška",
     "settings_pane_search_body": "Ieškokite saityne tiesiai iš naujos kortelės.",
     "settings_pane_topsites_header": "Lankomiausios svetainės",
     "settings_pane_topsites_body": "Pasiekite jūsų dažniausiai lankomas svetaines.",
     "settings_pane_topsites_options_showmore": "Rodyti dvi eilutes",
     "settings_pane_bookmarks_header": "Paskiausi adresyno įrašai",
     "settings_pane_bookmarks_body": "Jūsų naujai sukurti adresyno įrašai vienoje vietoje.",
     "settings_pane_visit_again_header": "Aplankykite vėl",
     "settings_pane_visit_again_body": "„Firefox“ pateiks ištraukas iš jūsų naršymo žurnalo, kurias galbūt norėtumėte prisiminti.",
-    "settings_pane_pocketstories_header": "Populiariausi straipsniai",
-    "settings_pane_pocketstories_body": "„Pocket“, „Mozillos“ šeimos dalis, padės jums atrasti kokybišką turinį, kurio kitaip gal nebūtumėte radę.",
+    "settings_pane_highlights_header": "Akcentai",
+    "settings_pane_highlights_body2": "Sugrįžkite prie įdomių dalykų, kuriuose neseniai lankėtės ar įtraukėte į adresyną.",
+    "settings_pane_highlights_options_bookmarks": "Adresynas",
+    "settings_pane_highlights_options_visited": "Aplankytos svetainės",
+    "settings_pane_snippets_header": "Iškarpos",
     "settings_pane_done_button": "Atlikta",
     "edit_topsites_button_text": "Keisti",
     "edit_topsites_button_label": "Tinkinkite savo lankomiausių svetainių skiltį",
     "edit_topsites_showmore_button": "Rodyti daugiau",
     "edit_topsites_showless_button": "Rodyti mažiau",
     "edit_topsites_done_button": "Atlikta",
     "edit_topsites_pin_button": "Įsegti šią svetainę",
     "edit_topsites_unpin_button": "Išsegti šią svetainę",
@@ -3799,20 +3938,20 @@
     "topsites_form_url_placeholder": "Įveskite arba įklijuokite URL",
     "topsites_form_add_button": "Pridėti",
     "topsites_form_save_button": "Įrašyti",
     "topsites_form_cancel_button": "Atsisakyti",
     "topsites_form_url_validation": "Reikalingas tinkamas URL",
     "pocket_read_more": "Populiarios temos:",
     "pocket_read_even_more": "Rodyti daugiau straipsnių",
     "pocket_feedback_header": "Geriausi dalykai internete, kuruojami daugiau nei 25 milijonų žmonių.",
-    "pocket_feedback_body": "„Pocket“, „Mozillos“ šeimos dalis, padės jums atrasti kokybišką turinį, kurio kitaip gal nebūtumėte radę.",
-    "pocket_send_feedback": "Siųsti atsiliepimą",
+    "pocket_description": "Atraskite kokybišką turinį, kurio kitaip galbūt nerastumėte, su „Pocket“, kuri yra tapusi „Mozillos“ dalimi, pagalba.",
+    "highlights_empty_state": "Pradėkite naršyti, o mes čia pateiksime puikių straipsnių, vaizdo įrašų bei kitų tinklalapių, kuriuose neseniai lankėtės ar įtraukėte į adresyną.",
     "topstories_empty_state": "Viską perskaitėte. Užsukite vėliau, norėdami rasti daugiau gerų straipsnių iš „{provider}“. Nekantraujate? Pasirinkite populiarią temą, norėdami rasti daugiau puikių straipsnių saityne.",
-    "manual_migration_explanation": "Išbandykite „Firefox“ su mėgstamiausiomis svetainėmis bei adresyno įrašais iš kitos naršyklės.",
+    "manual_migration_explanation2": "Išbandykite „Firefox“ su adresynu, žurnalu bei slaptažodžiais iš kitos naršyklės.",
     "manual_migration_cancel_button": "Ačiū, ne",
     "manual_migration_import_button": "Importuoti dabar"
   },
   "lv": {
     "newtab_page_title": "Jauna cilne"
   },
   "mk": {
     "newtab_page_title": "Ново јазиче",
@@ -4008,68 +4147,75 @@
     "settings_pane_search_header": "शोध",
     "settings_pane_search_body": "आपल्या नवीन टॅब वरून वेबवर शोधा."
   },
   "ms": {
     "newtab_page_title": "Tab Baru",
     "default_label_loading": "Memuatkan…",
     "header_top_sites": "Laman Teratas",
     "header_stories": "Berita Hangat",
+    "header_highlights": "Serlahan",
     "header_visit_again": "Lawat Semula",
     "header_bookmarks": "Tandabuku Terkini",
     "header_recommended_by": "Disyorkan oleh {provider}",
     "header_bookmarks_placeholder": "Anda masih belum ada tandabuku lagi.",
     "header_stories_from": "dari",
     "type_label_visited": "Dilawati",
     "type_label_bookmarked": "Ditandabuku",
     "type_label_synced": "Sync dari peranti lain",
     "type_label_recommended": "Trending",
     "type_label_open": "Buka",
     "type_label_topic": "Topik",
     "type_label_now": "Sekarang",
     "menu_action_bookmark": "Tandabuku",
-    "menu_action_remove_bookmark": "Alihkeluar Tandabuku",
+    "menu_action_remove_bookmark": "Buang Tandabuku",
     "menu_action_copy_address": "Salin Alamat",
     "menu_action_email_link": "Pautan E-mel…",
     "menu_action_open_new_window": "Buka dalam Tetingkap Baru",
     "menu_action_open_private_window": "Buka dalam Tetingkap Peribadi Baru",
     "menu_action_dismiss": "Abai",
-    "menu_action_delete": "Hapus daripada Sejarah",
+    "menu_action_delete": "Buang daripada Sejarah",
     "menu_action_pin": "Pin",
     "menu_action_unpin": "Nyahpin",
-    "confirm_history_delete_p1": "Anda pasti mahu menghapuskan setiap contoh halaman ini daripada sejarah anda?",
+    "confirm_history_delete_p1": "Adakah anda pasti mahu membuang setiap contoh halaman ini daripada sejarah anda?",
     "confirm_history_delete_notice_p2": "Tindakan ini tidak boleh dibatalkan.",
     "menu_action_save_to_pocket": "Simpan ke Pocket",
     "search_for_something_with": "Cari {search_term} dengan:",
     "search_button": "Cari",
     "search_header": "{search_engine_name} Cari",
     "search_web_placeholder": "Cari dalam Web",
     "search_settings": "Ubah Tetapan Carian",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Hantar Maklum balas",
+    "section_info_privacy_notice": "Notis Privasi",
     "welcome_title": "Selamat Datang ke tab baru",
     "welcome_body": "Firefox akan menggunakan ruang ini untuk mempamerkan tandabuku, artikel, video dan halaman yang paling berkaitan dan terkini anda lawati supaya anda boleh mendapatkannya semula dengan mudah.",
     "welcome_label": "Mengenalpasti Serlahan anda",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Sesuaikan halaman Tab Baru anda",
     "settings_pane_header": "Keutamaan Tab Baru",
-    "settings_pane_body": "Pilih paparan apabila anda buka tab baru.",
+    "settings_pane_body2": "Pilih apa yang mahu anda paparkan dalam halaman ini.",
     "settings_pane_search_header": "Cari",
     "settings_pane_search_body": "Carian Web dari tab baru anda.",
     "settings_pane_topsites_header": "Laman Teratas",
     "settings_pane_topsites_body": "Akses laman web yang paling banyak dilawati.",
     "settings_pane_topsites_options_showmore": "Papar dua baris",
     "settings_pane_bookmarks_header": "Tandabuku Terkini",
     "settings_pane_bookmarks_body": "Tandabuku baru yang anda cipta terletak di lokasi yang mudah dicapai.",
     "settings_pane_visit_again_header": "Lawat Semula",
     "settings_pane_visit_again_body": "Firefox akan mempamerkan kepada anda sebahagian sejarah pelayaran anda yang mungkin anda mahu mengingatinya atau kembali semula.",
-    "settings_pane_pocketstories_header": "Berita Hangat",
-    "settings_pane_pocketstories_body": "Pocket, sebahagian daripada ciri-ciri Mozilla, akan membantu anda sentiasa berhubung dengan kandungan berkualiti tinggi yang mungkin tidak akan anda jumpa sebaliknya.",
+    "settings_pane_highlights_header": "Serlahan",
+    "settings_pane_highlights_body2": "Dapatkan semula perkara menarik yang sudah dilayari atau ditandabuku.",
+    "settings_pane_highlights_options_bookmarks": "Tandabuku",
+    "settings_pane_highlights_options_visited": "Laman Dilawati",
+    "settings_pane_snippets_header": "Cebisan",
+    "settings_pane_snippets_body": "Baca ringkasan berita terbaru daripada Mozilla berkaitan Firefox, budaya internet dan ikutan rambang semasa.",
     "settings_pane_done_button": "Siap",
     "edit_topsites_button_text": "Edit",
     "edit_topsites_button_label": "Sesuaikan bahagian Laman Teratas anda",
     "edit_topsites_showmore_button": "Papar selanjutnya",
     "edit_topsites_showless_button": "Papar minima",
     "edit_topsites_done_button": "Siap",
     "edit_topsites_pin_button": "Pin laman ini",
     "edit_topsites_unpin_button": "Nyahpin laman ini",
@@ -4082,20 +4228,20 @@
     "topsites_form_url_placeholder": "Taip atau tampal URL",
     "topsites_form_add_button": "Tambah",
     "topsites_form_save_button": "Simpan",
     "topsites_form_cancel_button": "Batal",
     "topsites_form_url_validation": "Perlukan URL yang sah",
     "pocket_read_more": "Topik Popular:",
     "pocket_read_even_more": "Papar Kisah Selanjutnya",
     "pocket_feedback_header": "Terbaik daripada web, disokong oleh lebih 25 juta pengguna.",
-    "pocket_feedback_body": "Pocket, sebahagian daripada ciri Mozilla, akan membantu anda sentiasa berhubung dengan kandungan berkualiti tinggi yang mungkin tidak akan anda jumpa tanpanya.",
-    "pocket_send_feedback": "Hantar Maklum balas",
+    "pocket_description": "Teroka kandungan berkualiti tinggi yang mungkin ada tertinggal, menggunakan bantuan Pocket, yang menjadi sebahagian daripada Mozilla.",
+    "highlights_empty_state": "Mulakan melayar dan kami akan paparkan beberapa artikel, video dan halaman menarik lain yang sudah anda layari dan tandabuku di sini.",
     "topstories_empty_state": "Anda sudah di sini. Tapi sila datang lagi untuk mendapatkan lebih banyak berita hangat daripada {provider}. Tidak boleh tunggu? Pilih topik untuk mendapatkannya dari serata dunia.",
-    "manual_migration_explanation": "Cuba Firefox dengan laman kegemaran dan tandabuku anda daripada pelayar lain.",
+    "manual_migration_explanation2": "Cuba Firefox dengan tandabuku, sejarah dan kata laluan yang disimpan dalam pelayar lain.",
     "manual_migration_cancel_button": "Tidak, Terima kasih",
     "manual_migration_import_button": "Import Sekarang"
   },
   "my": {
     "newtab_page_title": "တပ်ဗ်အသစ်ဖွင့်",
     "default_label_loading": "ရယူနေသှ်…",
     "header_top_sites": "အများဆုံးသုံးဆိုက်များ",
     "header_highlights": "အသားပေးဖော်ပြချက်များ",
@@ -4144,16 +4290,17 @@
     "edit_topsites_edit_button": "ဆိုက်အားပြင်မည်",
     "edit_topsites_dismiss_button": "ဆိုက်အားဖျက်လိုက်မည်"
   },
   "nb-NO": {
     "newtab_page_title": "Ny fane",
     "default_label_loading": "Laster …",
     "header_top_sites": "Mest besøkte nettsider",
     "header_stories": "Hovedsakene",
+    "header_highlights": "Høydepunkter",
     "header_visit_again": "Besøk igjen",
     "header_bookmarks": "Nylige bokmerker",
     "header_recommended_by": "Anbefalt av {provider}",
     "header_bookmarks_placeholder": "Du har ingen bokmerker enda.",
     "header_stories_from": "fra",
     "type_label_visited": "Besøkt",
     "type_label_bookmarked": "Bokmerket",
     "type_label_synced": "Synkronisert fra annen enhet",
@@ -4175,37 +4322,43 @@
     "confirm_history_delete_notice_p2": "Denne handlingen kan ikke angres.",
     "menu_action_save_to_pocket": "Lagre til Pocket",
     "search_for_something_with": "Søk etter {search_term} med:",
     "search_button": "Søk",
     "search_header": "{search_engine_name}-søk",
     "search_web_placeholder": "Søk på nettet",
     "search_settings": "Endre søkeinnstillinger",
     "section_info_option": "Informasjon",
+    "section_info_send_feedback": "Send tilbakemelding",
+    "section_info_privacy_notice": "Personvernbestemmelser",
     "welcome_title": "Velkommen til ny fane",
     "welcome_body": "Firefox vil bruke denne plassen til å vise deg de mest relevante bokmerkene, artiklene, videoene og sidene du nettopp har besøkt, slik at du enkelt kan finne tilbake til de.",
     "welcome_label": "Identifiserer dine høydepunkter",
     "time_label_less_than_minute": "<1 m",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} t",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Tilpass siden for Ny fane",
     "settings_pane_header": "Innstillinger for Ny fane",
-    "settings_pane_body": "Velg hva som vises når du åpner en ny fane.",
+    "settings_pane_body2": "Velg hva du ser på denne siden.",
     "settings_pane_search_header": "Søk",
     "settings_pane_search_body": "Søk på nettet fra din nye fane.",
     "settings_pane_topsites_header": "Mest besøkte",
     "settings_pane_topsites_body": "Tilgang til nettsidene du besøker mest.",
     "settings_pane_topsites_options_showmore": "Vis to rader",
     "settings_pane_bookmarks_header": "Nylige bokmerker",
     "settings_pane_bookmarks_body": "De nyeste bokmerkene dine på en plass.",
     "settings_pane_visit_again_header": "Besøk igjen",
     "settings_pane_visit_again_body": "Firefox viser deg deler av din surfehistorikk som du kanskje ønsker å huske eller komme tilbake til.",
-    "settings_pane_pocketstories_header": "Hovedsakene",
-    "settings_pane_pocketstories_body": "Pocket, en del av Mozilla-familien, vil hjelpe deg med å finne innhold av høy kvalitet, som du kanskje ikke ville ha funnet ellers.",
+    "settings_pane_highlights_header": "Høydepunkter",
+    "settings_pane_highlights_body2": "Finn veien tilbake til interessante ting du nylig har besøkt eller bokmerket.",
+    "settings_pane_highlights_options_bookmarks": "Bokmerker",
+    "settings_pane_highlights_options_visited": "Besøkte nettsteder",
+    "settings_pane_snippets_header": "Snutter",
+    "settings_pane_snippets_body": "Les korte nyheter fra Mozilla om Firefox, internettkultur og fra tid til annen en tilfeldig meme.",
     "settings_pane_done_button": "Ferdig",
     "edit_topsites_button_text": "Rediger",
     "edit_topsites_button_label": "Tilpass seksjonen Mest besøkte",
     "edit_topsites_showmore_button": "Vis mer",
     "edit_topsites_showless_button": "Vis mindre",
     "edit_topsites_done_button": "Ferdig",
     "edit_topsites_pin_button": "Fest nettsiden",
     "edit_topsites_unpin_button": "Frigjør denne nettsiden",
@@ -4218,20 +4371,19 @@
     "topsites_form_url_placeholder": "Skriv eller lim inn en URL",
     "topsites_form_add_button": "Legg til",
     "topsites_form_save_button": "Lagre",
     "topsites_form_cancel_button": "Avbryt",
     "topsites_form_url_validation": "Gyldig URL er nødvendig",
     "pocket_read_more": "Populære emner:",
     "pocket_read_even_more": "Vis flere saker",
     "pocket_feedback_header": "Det beste av nettet, kurert av over 25 millioner mennesker.",
-    "pocket_feedback_body": "Pocket, en del av Mozilla-familien, vil hjelpe deg med å finne innhold av høy kvalitet, som du kanskje ikke ville ha funnet ellers.",
-    "pocket_send_feedback": "Send tilbakemelding",
+    "highlights_empty_state": "Begynn å surfe, og vi viser noen av de beste artiklene, videoer og andre sider du nylig har besøkt eller bokmerket her.",
     "topstories_empty_state": "Du har tatt igjen. Kom tilbake senere for flere topphistorier fra {provider}. Kan du ikke vente? Velg et populært emne for å finne flere gode artikler fra hele Internett.",
-    "manual_migration_explanation": "Prøv Firefox med dine favorittnettsteder og bokmerker fra en annen nettleser.",
+    "manual_migration_explanation2": "Prøv Firefox med bokmerkene, historikk og passord fra en annen nettleser.",
     "manual_migration_cancel_button": "Nei takk",
     "manual_migration_import_button": "Importer nå"
   },
   "ne-NP": {
     "newtab_page_title": "नयाँ ट्याब",
     "default_label_loading": "लोड हुदैँछ...",
     "header_top_sites": "शीर्ष साइटहरु",
     "header_stories": "शीर्ष साइटहरु",
@@ -4300,16 +4452,17 @@
     "manual_migration_cancel_button": "पर्दैन, धन्यबाद",
     "manual_migration_import_button": "अहिले आयात गर्नुहोस्"
   },
   "nl": {
     "newtab_page_title": "Nieuw tabblad",
     "default_label_loading": "Laden…",
     "header_top_sites": "Topwebsites",
     "header_stories": "Topverhalen",
+    "header_highlights": "Highlights",
     "header_visit_again": "Nogmaals bezoeken",
     "header_bookmarks": "Recente bladwijzers",
     "header_recommended_by": "Aanbevolen door {provider}",
     "header_bookmarks_placeholder": "U hebt nog geen bladwijzers.",
     "header_stories_from": "van",
     "type_label_visited": "Bezocht",
     "type_label_bookmarked": "Bladwijzer gemaakt",
     "type_label_synced": "Gesynchroniseerd vanaf ander apparaat",
@@ -4331,37 +4484,43 @@
     "confirm_history_delete_notice_p2": "Deze actie kan niet ongedaan worden gemaakt.",
     "menu_action_save_to_pocket": "Opslaan naar Pocket",
     "search_for_something_with": "Zoeken naar {search_term} met:",
     "search_button": "Zoeken",
     "search_header": "{search_engine_name} doorzoeken",
     "search_web_placeholder": "Zoeken op het web",
     "search_settings": "Zoekinstellingen wijzigen",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Feedback verzenden",
+    "section_info_privacy_notice": "Privacyverklaring",
     "welcome_title": "Welkom bij het nieuwe tabblad",
     "welcome_body": "Firefox gebruikt deze ruimte om uw meest relevante bladwijzers, artikelen, video’s en pagina’s die u onlangs hebt bezocht weer te geven, zodat u deze eenvoudig kunt terugvinden.",
     "welcome_label": "Uw highlights aanduiden",
     "time_label_less_than_minute": "< 1 m",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} u",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Uw Nieuw-tabbladpagina aanpassen",
     "settings_pane_header": "Nieuw-tabbladvoorkeuren",
-    "settings_pane_body": "Kies wat u ziet bij het openen van een nieuw tabblad.",
+    "settings_pane_body2": "Kies wat u op deze pagina ziet.",
     "settings_pane_search_header": "Zoeken",
     "settings_pane_search_body": "Het web doorzoeken vanaf uw nieuwe tabblad.",
     "settings_pane_topsites_header": "Topwebsites",
     "settings_pane_topsites_body": "De websites benaderen die u het vaakst bezoekt.",
     "settings_pane_topsites_options_showmore": "Twee rijen tonen",
     "settings_pane_bookmarks_header": "Recente bladwijzers",
     "settings_pane_bookmarks_body": "Uw nieuw aangemaakte bladwijzers op één handige plek.",
     "settings_pane_visit_again_header": "Nogmaals bezoeken",
     "settings_pane_visit_again_body": "Firefox toont delen van uw navigatiegeschiedenis die u wellicht wilt onthouden of opnieuw wilt bezoeken.",
-    "settings_pane_pocketstories_header": "Topverhalen",
-    "settings_pane_pocketstories_body": "Pocket, een onderdeel van de Mozilla-familie, helpt u bij het vinden van inhoud met hoge kwaliteit die u anders misschien niet had kunnen vinden.",
+    "settings_pane_highlights_header": "Highlights",
+    "settings_pane_highlights_body2": "Vind uw weg terug naar interessante dingen die u onlangs hebt bezocht of waarvoor u een bladwijzer hebt gemaakt.",
+    "settings_pane_highlights_options_bookmarks": "Bladwijzers",
+    "settings_pane_highlights_options_visited": "Bezochte websites",
+    "settings_pane_snippets_header": "Snippets",
+    "settings_pane_snippets_body": "Lees korte updates van Mozilla over Firefox, internetcultuur, en af en toe een willekeurige meme.",
     "settings_pane_done_button": "Gereed",
     "edit_topsites_button_text": "Bewerken",
     "edit_topsites_button_label": "Uw sectie Topwebsites aanpassen",
     "edit_topsites_showmore_button": "Meer tonen",
     "edit_topsites_showless_button": "Minder tonen",
     "edit_topsites_done_button": "Gereed",
     "edit_topsites_pin_button": "Deze website vastmaken",
     "edit_topsites_unpin_button": "Deze website losmaken",
@@ -4374,28 +4533,29 @@
     "topsites_form_url_placeholder": "Typ of plak een URL",
     "topsites_form_add_button": "Toevoegen",
     "topsites_form_save_button": "Opslaan",
     "topsites_form_cancel_button": "Annuleren",
     "topsites_form_url_validation": "Geldige URL vereist",
     "pocket_read_more": "Populaire onderwerpen:",
     "pocket_read_even_more": "Meer verhalen bekijken",
     "pocket_feedback_header": "Het beste van het web, geselecteerd door meer dan 25 miljoen mensen.",
-    "pocket_feedback_body": "Pocket, een onderdeel van de Mozilla-familie, helpt u bij het vinden van inhoud met hoge kwaliteit die u anders misschien niet had kunnen vinden.",
-    "pocket_send_feedback": "Feedback verzenden",
+    "pocket_description": "Ontdek inhoud van hoge kwaliteit die u anders zou missen met behulp van Pocket, nu onderdeel van Mozilla.",
+    "highlights_empty_state": "Begin met surfen, en we tonen hier een aantal geweldige artikelen, video’s en andere pagina’s die u onlangs hebt bezocht of waarvoor u een bladwijzer hebt gemaakt.",
     "topstories_empty_state": "U bent weer bij. Kijk later nog eens voor meer topverhalen van {provider}. Kunt u niet wachten? Selecteer een populair onderwerp voor meer geweldige verhalen van het hele web.",
-    "manual_migration_explanation": "Probeer Firefox met uw favoriete websites en bladwijzers uit een andere browser.",
+    "manual_migration_explanation2": "Probeer Firefox met de bladwijzers, geschiedenis en wachtwoorden van een andere browser.",
     "manual_migration_cancel_button": "Nee bedankt",
     "manual_migration_import_button": "Nu importeren"
   },
   "nn-NO": {
     "newtab_page_title": "Ny fane",
     "default_label_loading": "Lastar…",
     "header_top_sites": "Mest besøkte nettsider",
     "header_stories": "Hovudsakene",
+    "header_highlights": "Høgdepunkt",
     "header_visit_again": "Besøk igjen",
     "header_bookmarks": "Nylege bokmerke",
     "header_recommended_by": "Tilrådd av {provider}",
     "header_bookmarks_placeholder": "Du har ingen bokmerke enno.",
     "header_stories_from": "frå",
     "type_label_visited": "Besøkt",
     "type_label_bookmarked": "Bokmerkte",
     "type_label_synced": "Synkronisert frå ei anna eining",
@@ -4417,37 +4577,43 @@
     "confirm_history_delete_notice_p2": "Denne handlinga kan ikkje angrast.",
     "menu_action_save_to_pocket": "Lagre til Pocket",
     "search_for_something_with": "Søk etter {search_term} med:",
     "search_button": "Søk",
     "search_header": "{search_engine_name}",
     "search_web_placeholder": "Søk på nettet",
     "search_settings": "Endra søkjeinnstillingar",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Send tilbakemelding",
+    "section_info_privacy_notice": "Personvernerklæring",
     "welcome_title": "Velkomen til ny fane",
     "welcome_body": "Firefox vil bruke denne plassen til å vise deg dei mest relevante bokmerka, artiklane, videoane og sidene du nettopp har vitja, slik at du enkelt kan finne tilbake til dei.",
     "welcome_label": "Identifiserer høgdepunkta dine",
     "time_label_less_than_minute": "<1 min.",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} t",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Tilpass sida for Ny fane",
     "settings_pane_header": "Innstillingar for Ny fane",
-    "settings_pane_body": "Vel kva som skal visast når du opnar ei ny fane.",
+    "settings_pane_body2": "Vel kva du skal vise på denne sida.",
     "settings_pane_search_header": "Søk",
     "settings_pane_search_body": "Søk på nettet frå den nye fana di.",
     "settings_pane_topsites_header": "Mest besøkte",
     "settings_pane_topsites_body": "Tilgang til nettsidene du besøker mest.",
     "settings_pane_topsites_options_showmore": "Vis to rader",
     "settings_pane_bookmarks_header": "Nylege bokmerke",
     "settings_pane_bookmarks_body": "Dei nyaste bokmerka dine på ein plass.",
     "settings_pane_visit_again_header": "Besøk igjen",
     "settings_pane_visit_again_body": "Firefox viser deg delar av surfehistorikken din som du kanskje ønskjer å hugse eller kome tilbake til.",
-    "settings_pane_pocketstories_header": "Hovudsakene",
-    "settings_pane_pocketstories_body": "Pocket, ein del av Mozilla-familien, vil hjelpe deg med å finne innhald av høg kvalitet, som du kanskje ikkje ville ha funne elles.",
+    "settings_pane_highlights_header": "Høgdepunkt",
+    "settings_pane_highlights_body2": "Finn vegen tilbake til interessante ting du nyleg har besøkt eller bokmerka.",
+    "settings_pane_highlights_options_bookmarks": "Bokmerke",
+    "settings_pane_highlights_options_visited": "Besøkte nettsteder",
+    "settings_pane_snippets_header": "Snuttar",
+    "settings_pane_snippets_body": "Les korte nyheiter frå Mozilla om Firefox, internettkultur og frå tid til annan ein tilfeldig meme.",
     "settings_pane_done_button": "Ferdig",
     "edit_topsites_button_text": "Rediger",
     "edit_topsites_button_label": "Tilpass seksjonen Mest besøkte",
     "edit_topsites_showmore_button": "Vis meir",
     "edit_topsites_showless_button": "Vis mindre",
     "edit_topsites_done_button": "Ferdig",
     "edit_topsites_pin_button": "Fest sida",
     "edit_topsites_unpin_button": "Løys frå denne nettsida",
@@ -4460,20 +4626,20 @@
     "topsites_form_url_placeholder": "Skriv eller lim inn ein URL",
     "topsites_form_add_button": "Legg til",
     "topsites_form_save_button": "Lagre",
     "topsites_form_cancel_button": "Avbryt",
     "topsites_form_url_validation": "Gyldig URL er påkravd",
     "pocket_read_more": "Populære emne:",
     "pocket_read_even_more": "Vis fleire saker",
     "pocket_feedback_header": "Det beste av nettet, sett saman av over 25 millioner menneske.",
-    "pocket_feedback_body": "Pocket, ein del av Mozilla-familien, vil hjelpe deg med å finne innhald av høg kvalitet, som du kanskje ikkje ville ha funne elles.",
-    "pocket_send_feedback": "Send tilbakemelding",
+    "pocket_description": "Oppdag høgkvalitetsinnhald som du elles ville gå glipp av, ved hjelp av Pocket, som no er ein del av Mozilla.",
+    "highlights_empty_state": "Begynn å surfe, og vi viser nokre av dei beste artiklane, videoar og andre sider du nyleg har besøkt eller bokmerka her.",
     "topstories_empty_state": "Det finst ikkje fleire. Kom tilbake seinare for fleire topphistoriar frå {provider}. Kan du ikkje vente? Vel eit populært emne for å finne fleire gode artiklar frå heile nettet.",
-    "manual_migration_explanation": "Prøv Firefox med favorittnettstadane dine og bokmerke frå ein annan nettlesar.",
+    "manual_migration_explanation2": "Prøv Firefox med bokmerka, historikk og passord frå ein annan nettlesar.",
     "manual_migration_cancel_button": "Nei takk",
     "manual_migration_import_button": "Importer no"
   },
   "pa-IN": {
     "newtab_page_title": "ਨਵੀਂ ਟੈਬ",
     "default_label_loading": "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
     "header_top_sites": "ਸਿਖਰਲੀਆਂ ਸਾਈਟਾਂ",
     "header_highlights": "ਹਾਈਲਾਈਟ",
@@ -4604,17 +4770,17 @@
     "topsites_form_add_button": "Dodaj",
     "topsites_form_save_button": "Zapisz",
     "topsites_form_cancel_button": "Anuluj",
     "topsites_form_url_validation": "Wymagany jest prawidłowy adres",
     "pocket_read_more": "Popularne tematy:",
     "pocket_read_even_more": "Więcej artykułów",
     "pocket_feedback_header": "Najlepsze, co oferuje Internet, wybrane przez ponad 25 milionów osób.",
     "pocket_description": "Umożliwia odkrywanie wysokiej jakości treści dzięki serwisowi Pocket, będącego teraz częścią Mozilli.",
-    "highlights_empty_state": "Zacznij przeglądać Internet, a pojawią się tutaj niedawno odwiedzone lub dodane zakładki do artykułów, filmów i innych stron.",
+    "highlights_empty_state": "Zacznij przeglądać Internet, a pojawią się tutaj niedawno dodane zakładki i odwiedzone artykuły, filmy i inne strony.",
     "topstories_empty_state": "To na razie wszystko. {provider} później będzie mieć więcej popularnych artykułów. Nie możesz się doczekać? Wybierz popularny temat, aby znaleźć więcej artykułów z całego Internetu.",
     "manual_migration_explanation2": "Używaj Firefoksa z zakładkami, historią i hasłami z innej przeglądarki.",
     "manual_migration_cancel_button": "Nie, dziękuję",
     "manual_migration_import_button": "Importuj teraz"
   },
   "pt-BR": {
     "newtab_page_title": "Nova aba",
     "default_label_loading": "Carregando…",
@@ -4801,16 +4967,17 @@
     "manual_migration_cancel_button": "Não obrigado",
     "manual_migration_import_button": "Importar agora"
   },
   "rm": {
     "newtab_page_title": "Nov tab",
     "default_label_loading": "Chargiar…",
     "header_top_sites": "Paginas preferidas",
     "header_stories": "Artitgels populars",
+    "header_highlights": "Accents",
     "header_visit_again": "Turnar a visitar",
     "header_bookmarks": "Segnapaginas novs",
     "header_recommended_by": "Recumandà da {provider}",
     "header_bookmarks_placeholder": "Ti n'has anc nagins segnapaginas.",
     "header_stories_from": "da",
     "type_label_visited": "Visità",
     "type_label_bookmarked": "Cun segnapagina",
     "type_label_synced": "Sincronisà dad auters apparats",
@@ -4832,80 +4999,86 @@
     "confirm_history_delete_notice_p2": "Questa acziun na po betg vegnir revocada.",
     "menu_action_save_to_pocket": "Memorisar en Pocket",
     "search_for_something_with": "Tschertgar {search_term} cun:",
     "search_button": "Tschertgar",
     "search_header": "Tschertga da {search_engine_name}",
     "search_web_placeholder": "Tschertgar en il Web",
     "search_settings": "Midar las preferenzas per tschertgar",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Trametter in resun",
+    "section_info_privacy_notice": "Infurmaziuns davart la protecziun da datas",
     "welcome_title": "Bainvegni sin in nov tab",
     "welcome_body": "Firefox utilisescha quest plaz per ta mussar ils segnapaginas, ils artitgels, ils videos e las paginas las pli relevantas che ti has visità dacurt, uschè che ti pos turnar a moda simpla tar quellas.",
     "welcome_label": "Identifitgar tes accents",
     "time_label_less_than_minute": "< 1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} uras",
     "time_label_day": "{number} dis",
     "settings_pane_button_label": "Persunalisar tia pagina per novs tabs",
     "settings_pane_header": "Preferenzas per novs tabs",
-    "settings_pane_body": "Tscherna tge che ti vesas sche ti avras in nov tab.",
+    "settings_pane_body2": "Tscherna tge che vegn mussà sin questa pagina.",
     "settings_pane_search_header": "Tschertgar",
     "settings_pane_search_body": "Tschertgar en l'internet da tes nov tab.",
     "settings_pane_topsites_header": "Paginas preferidas",
     "settings_pane_topsites_body": "Acceder las websites che ti visitas il pli savens.",
     "settings_pane_topsites_options_showmore": "Mussar duas colonnas",
     "settings_pane_bookmarks_header": "Novs segnapaginas",
     "settings_pane_bookmarks_body": "Tes novs segnapaginas en in lieu pratic.",
     "settings_pane_visit_again_header": "Turnar a visitar",
     "settings_pane_visit_again_body": "Firefox ta mussa parts da tia cronologia da navigaziun che pudessan esser interessantas per turnar.",
-    "settings_pane_pocketstories_header": "Artitgels populars",
-    "settings_pane_pocketstories_body": "Pocket che fa part da Mozilla ta gida da scuvrir cuntegn dad auta qualitad che ti avessas uschiglio forsa manchentà.",
+    "settings_pane_highlights_header": "Accents",
+    "settings_pane_highlights_body2": "Chatta svelt puspè paginas interessantas che ti has visità u marcà sco segnapagina.",
+    "settings_pane_highlights_options_bookmarks": "Segnapaginas",
+    "settings_pane_highlights_options_visited": "Paginas visitadas",
+    "settings_pane_snippets_header": "Zinslas",
+    "settings_pane_snippets_body": "Legia infurmaziuns curtas da Mozilla davart Firefox, la cultura da l'internet e da temp en temp in meme.",
     "settings_pane_done_button": "Finì",
     "edit_topsites_button_text": "Modifitgar",
     "edit_topsites_button_label": "Persunalisar la secziun da paginas preferidas",
     "edit_topsites_showmore_button": "Mussar dapli",
     "edit_topsites_showless_button": "Mussar pli pauc",
     "edit_topsites_done_button": "Finì",
     "edit_topsites_pin_button": "Fixar questa pagina",
     "edit_topsites_unpin_button": "Betg pli fixar questa pagina",
     "edit_topsites_edit_button": "Modifitgar questa pagina",
     "edit_topsites_dismiss_button": "Allontanar questa pagina",
     "edit_topsites_add_button": "Agiuntar",
     "topsites_form_add_header": "Nova pagina populara",
     "topsites_form_edit_header": "Modifitgar la pagina populara",
     "topsites_form_title_placeholder": "Endatar in titel",
-    "topsites_form_url_placeholder": "Tippar u encollar in URL",
+    "topsites_form_url_placeholder": "Tippar u encollar ina URL",
     "topsites_form_add_button": "Agiuntar",
     "topsites_form_save_button": "Memorisar",
     "topsites_form_cancel_button": "Interrumper",
     "topsites_form_url_validation": "In URL valid è necessari",
     "pocket_read_more": "Temas populars:",
     "pocket_read_even_more": "Mussar dapli artitgels",
     "pocket_feedback_header": "Il meglier ord il web, selecziunà da dapli che 25 milliuns umans.",
-    "pocket_feedback_body": "Pocket che fa part da Mozilla ta gida da scuvrir cuntegn dad auta qualitad che ti avessas uschiglio forsa manchentà.",
-    "pocket_send_feedback": "Trametter in resun",
+    "pocket_description": "Scuvra cuntegn dad auta qualitad cun agid da Pocket che fa ussa part da Mozilla.",
+    "highlights_empty_state": "Cumenza a navigar e nus ta mussain qua artitgels, videos ed autras paginas che ti has visità dacurt u che ti has agiuntà dacurt sco segnapagina.",
     "topstories_empty_state": "Ussa has ti legì tut las novitads. Turna pli tard per ulteriuras novitads da {provider}. Na pos betg spetgar? Tscherna in tema popular per chattar ulteriuras istorgias ord il web.",
-    "manual_migration_explanation": "Utilisescha Firefox cun tias paginas preferidas e tes segnapaginas d'in auter navigatur.",
+    "manual_migration_explanation2": "Emprova Firefox cun ils segnapaginas, la cronologia ed ils pleds-clav importads d'in auter navigatur.",
     "manual_migration_cancel_button": "Na, grazia",
     "manual_migration_import_button": "Importar ussa"
   },
   "ro": {
     "newtab_page_title": "Filă nouă",
     "default_label_loading": "Se încarcă…",
     "header_top_sites": "Site-uri de top",
     "header_recommended_by": "Recomandat de {provider}",
     "header_stories_from": "de la",
     "type_label_visited": "Vizitate",
     "type_label_bookmarked": "Însemnat",
     "type_label_synced": "Sincronizat de pe alt dispozitiv",
     "type_label_open": "Deschise",
     "type_label_topic": "Subiect",
     "type_label_now": "Acum",
-    "menu_action_bookmark": "Însemnează",
-    "menu_action_remove_bookmark": "Elimină semnul de carte",
+    "menu_action_bookmark": "Marchează",
+    "menu_action_remove_bookmark": "Elimină marcajul",
     "menu_action_copy_address": "Copiază adresa",
     "menu_action_email_link": "Deschide linkul…",
     "menu_action_open_new_window": "Deschide într-o fereastră nouă",
     "menu_action_open_private_window": "Deschide într-o fereastră privată nouă",
     "menu_action_dismiss": "Înlătură",
     "menu_action_delete": "Șterge din istoric",
     "confirm_history_delete_notice_p2": "Această acțiune este ireversibilă.",
     "menu_action_save_to_pocket": "Salvează în Pocket",
@@ -4919,17 +5092,16 @@
     "welcome_body": "Firefox va folosi acest spațiu pentru a arăta cele mai relevante semne de carte, articole, videouri și pagini vizitate recent pentru a reveni la acestea ușor.",
     "welcome_label": "Se identifică evidențierile tale",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Particularizează pagina de filă nouă",
     "settings_pane_header": "Preferințe pentru filă nouă",
-    "settings_pane_body": "Alege ce să vezi la deschiderea unei noi file.",
     "settings_pane_search_header": "Caută",
     "settings_pane_search_body": "Caută pe web din noua filă.",
     "settings_pane_topsites_header": "Site-uri de top",
     "settings_pane_topsites_body": "Accesează site-urile pe care le vizitezi mai des.",
     "settings_pane_topsites_options_showmore": "Arată două rânduri",
     "settings_pane_done_button": "Gata",
     "edit_topsites_button_text": "Editează",
     "edit_topsites_button_label": "Particularizează secțiunea site-urilor de top",
@@ -4944,24 +5116,24 @@
     "topsites_form_edit_header": "Editează site-ul de top",
     "topsites_form_title_placeholder": "Introdu un titlu",
     "topsites_form_url_placeholder": "Tastează sau lipește un URL",
     "topsites_form_add_button": "Adaugă",
     "topsites_form_save_button": "Salvează",
     "topsites_form_cancel_button": "Renunță",
     "topsites_form_url_validation": "URL valid necesar",
     "pocket_read_more": "Subiecte populare:",
-    "pocket_send_feedback": "Trimite feedback",
     "manual_migration_cancel_button": "Nu, mulțumesc"
   },
   "ru": {
     "newtab_page_title": "Новая вкладка",
     "default_label_loading": "Загрузка…",
     "header_top_sites": "Топ сайтов",
     "header_stories": "Топ статей",
+    "header_highlights": "Избранное",
     "header_visit_again": "Посетить снова",
     "header_bookmarks": "Недавние закладки",
     "header_recommended_by": "Рекомендовано {provider}",
     "header_bookmarks_placeholder": "У вас ещё нет каких-либо закладок.",
     "header_stories_from": "от",
     "type_label_visited": "Посещено",
     "type_label_bookmarked": "В закладках",
     "type_label_synced": "Синхронизировано с другого устройства",
@@ -4983,37 +5155,43 @@
     "confirm_history_delete_notice_p2": "Это действие не может быть отменено.",
     "menu_action_save_to_pocket": "Сохранить в Pocket",
     "search_for_something_with": "Искать {search_term} в:",
     "search_button": "Искать",
     "search_header": "Искать в {search_engine_name}",
     "search_web_placeholder": "Искать в Интернете",
     "search_settings": "Изменить настройки поиска",
     "section_info_option": "Информация",
+    "section_info_send_feedback": "Отправить отзыв",
+    "section_info_privacy_notice": "Уведомление о приватности",
     "welcome_title": "Добро пожаловать на новую вкладку",
     "welcome_body": "Firefox будет использовать это место, чтобы отображать самые актуальные закладки, статьи, видео и страницы, которые вы недавно посетили, чтобы вы смогли легко попасть на них снова.",
     "welcome_label": "Определение вашего избранного",
     "time_label_less_than_minute": "<1 мин.",
     "time_label_minute": "{number} мин.",
     "time_label_hour": "{number} ч.",
     "time_label_day": "{number} д.",
     "settings_pane_button_label": "Настроить свою страницу новой вкладки",
     "settings_pane_header": "Настройки новой вкладки",
-    "settings_pane_body": "Выберите, что показывать при открытии новой вкладки.",
+    "settings_pane_body2": "Выберите, что вы увидите на этой странице.",
     "settings_pane_search_header": "Поиск",
     "settings_pane_search_body": "Поиск в Интернете с вашей новой вкладки.",
     "settings_pane_topsites_header": "Топ сайтов",
     "settings_pane_topsites_body": "Получите доступ к сайтам, которые вы посещаете чаще всего.",
     "settings_pane_topsites_options_showmore": "Показать в два ряда",
     "settings_pane_bookmarks_header": "Недавние закладки",
     "settings_pane_bookmarks_body": "Ваши новые закладки в одном удобном расположении.",
     "settings_pane_visit_again_header": "Посетить снова",
     "settings_pane_visit_again_body": "Firefox покажет вам элементы вашей истории просмотра, которые вы, возможно, захотите вспомнить или посетить снова.",
-    "settings_pane_pocketstories_header": "Топ статей",
-    "settings_pane_pocketstories_body": "Pocket, часть семьи Mozilla, поможет подключить вас к высококачественному контенту, который вы бы иначе не нашли.",
+    "settings_pane_highlights_header": "Избранное",
+    "settings_pane_highlights_body2": "Найдите способ вернуться к интересным страницам, которые вы недавно посетили или добавили в закладки.",
+    "settings_pane_highlights_options_bookmarks": "Закладки",
+    "settings_pane_highlights_options_visited": "Посещённые сайты",
+    "settings_pane_snippets_header": "Заметки",
+    "settings_pane_snippets_body": "Читайте короткие и радостные новости от Mozilla о Firefox, интернет-культуру и случайные мемы.",
     "settings_pane_done_button": "Готово",
     "edit_topsites_button_text": "Изменить",
     "edit_topsites_button_label": "Настроить свой топ сайтов",
     "edit_topsites_showmore_button": "Показать больше",
     "edit_topsites_showless_button": "Показать меньше",
     "edit_topsites_done_button": "Готово",
     "edit_topsites_pin_button": "Закрепить этот сайт",
     "edit_topsites_unpin_button": "Открепить этот сайт",
@@ -5026,20 +5204,20 @@
     "topsites_form_url_placeholder": "Введите или вставьте URL",
     "topsites_form_add_button": "Добавить",
     "topsites_form_save_button": "Сохранить",
     "topsites_form_cancel_button": "Отмена",
     "topsites_form_url_validation": "Введите корректный URL",
     "pocket_read_more": "Популярные темы:",
     "pocket_read_even_more": "Больше статей",
     "pocket_feedback_header": "Лучшее из Интернета, отобранное более чем 25 миллионами людей.",
-    "pocket_feedback_body": "Pocket, часть семьи Mozilla, поможет подключить вас к высококачественному контенту, который вы можете иначе и не найти.",
-    "pocket_send_feedback": "Отправить отзыв",
+    "pocket_description": "Откройте для себя высококачественный контент, который вы могли бы пропустить, с помощью Pocket, теперь ставшего частью Mozilla.",
+    "highlights_empty_state": "Начните веб-сёрфинг, и мы покажем вам здесь некоторые из замечательных статей, видеороликов и других страниц, которые вы недавно посетили или добавили в закладки.",
     "topstories_empty_state": "Вы всё прочитали. Зайдите попозже, чтобы увидеть больше лучших статей от {provider}. Не можете ждать? Выберите популярную тему, чтобы найти больше интересных статей со всего Интернета.",
-    "manual_migration_explanation": "Попробуйте Firefox со своими любимыми сайтами и закладками из другого браузера.",
+    "manual_migration_explanation2": "Попробуйте Firefox с закладками, историей и паролями из другого браузера.",
     "manual_migration_cancel_button": "Нет, спасибо",
     "manual_migration_import_button": "Импортировать сейчас"
   },
   "sk": {
     "newtab_page_title": "Nová karta",
     "default_label_loading": "Načítava sa…",
     "header_top_sites": "Top stránky",
     "header_stories": "Top príbehy",
@@ -5174,26 +5352,28 @@
     "welcome_body": "Na tem prostoru bo Firefox prikazoval najustreznejše zaznamke, članke, videoposnetke in nedavno obiskane strani, tako da jih lahko pozneje znova hitro najdete.",
     "welcome_label": "Zbiranje poudarkov",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} ur",
     "time_label_day": "{number} dni",
     "settings_pane_button_label": "Prilagodite stran novega zavihka",
     "settings_pane_header": "Nastavitve novega zavihka",
+    "settings_pane_body2": "Izberite, kaj želite videti na tej strani.",
     "settings_pane_search_header": "Iskanje",
     "settings_pane_search_body": "Iščite po spletu z novega zavihka.",
     "settings_pane_topsites_header": "Glavne strani",
     "settings_pane_topsites_body": "Priročen dostop do najbolj obiskanih strani.",
     "settings_pane_topsites_options_showmore": "Prikaži dve vrsti",
     "settings_pane_bookmarks_header": "Nedavni zaznamki",
     "settings_pane_bookmarks_body": "Vaši novo ustvarjeni zaznamki na enem mestu.",
     "settings_pane_visit_again_header": "Obiščite znova",
     "settings_pane_visit_again_body": "Firefox vam bo prikazoval dele zgodovine brskanja, ki bi se jih morda želeli spomniti ali se nanje vrniti.",
     "settings_pane_highlights_header": "Poudarki",
+    "settings_pane_highlights_body2": "Najdite pot nazaj do zanimivih strani, ki ste jih nedavno obiskali ali dodali med zaznamke.",
     "settings_pane_highlights_options_bookmarks": "Zaznamki",
     "settings_pane_highlights_options_visited": "Obiskane strani",
     "settings_pane_done_button": "Končano",
     "edit_topsites_button_text": "Uredi",
     "edit_topsites_button_label": "Prilagodite odsek Glavne strani",
     "edit_topsites_showmore_button": "Prikaži več",
     "edit_topsites_showless_button": "Prikaži manj",
     "edit_topsites_done_button": "Končano",
@@ -5208,17 +5388,20 @@
     "topsites_form_url_placeholder": "Vnesite ali prilepite URL",
     "topsites_form_add_button": "Dodaj",
     "topsites_form_save_button": "Shrani",
     "topsites_form_cancel_button": "Prekliči",
     "topsites_form_url_validation": "Vnesite veljaven URL",
     "pocket_read_more": "Priljubljene teme:",
     "pocket_read_even_more": "Prikaži več vesti",
     "pocket_feedback_header": "Najboljše s spleta, kar je izbralo več kot 25 milijonov ljudi.",
+    "pocket_description": "Odkrijte kakovostno vsebino, ki bi jo sicer spregledali, s pomočjo Pocketa (zdaj dela Mozille).",
+    "highlights_empty_state": "Začnite z brskanjem, mi pa vam bomo tu prikazovali odlične članke, videoposnetke ter druge strani, ki ste jih nedavno obiskali ali shranili med zaznamke.",
     "topstories_empty_state": "Zdaj ste seznanjeni z novicami. Vrnite se pozneje in si oglejte nove prispevke iz {provider}. Komaj čakate? Izberite priljubljeno temo in odkrijte več velikih zgodb na spletu.",
+    "manual_migration_explanation2": "Preskusite Firefox z zaznamki, zgodovino in gesli iz drugega brskalnika.",
     "manual_migration_cancel_button": "Ne, hvala",
     "manual_migration_import_button": "Uvozi zdaj"
   },
   "sq": {
     "newtab_page_title": "Skedë e Re",
     "default_label_loading": "Po ngarkohet…",
     "header_top_sites": "Sajte Kryesues",
     "header_highlights": "Highlights",
@@ -5267,16 +5450,17 @@
     "edit_topsites_edit_button": "Përpunoni këtë sajt",
     "edit_topsites_dismiss_button": "Hidhe tej këtë sajt"
   },
   "sr": {
     "newtab_page_title": "Нови језичак",
     "default_label_loading": "Учитавање…",
     "header_top_sites": "Популарни сајтови",
     "header_stories": "Популарне приче",
+    "header_highlights": "Истакнуто",
     "header_visit_again": "Посетите поново",
     "header_bookmarks": "Недавне забелешке",
     "header_recommended_by": "Предложио {provider}",
     "header_bookmarks_placeholder": "Још увек немате забелешке.",
     "header_stories_from": "од",
     "type_label_visited": "Посећене",
     "type_label_bookmarked": "Забележено",
     "type_label_synced": "Синхронизовано са другог уређаја",
@@ -5298,37 +5482,43 @@
     "confirm_history_delete_notice_p2": "Ова радња се не може опозвати.",
     "menu_action_save_to_pocket": "Сачувај на Pocket",
     "search_for_something_with": "Претражите {search_term} са:",
     "search_button": "Претражи",
     "search_header": "{search_engine_name} претрага",
     "search_web_placeholder": "Претражујте веб",
     "search_settings": "Измените подешавања претраге",
     "section_info_option": "Инфо",
+    "section_info_send_feedback": "Пошаљите повратне податке",
+    "section_info_privacy_notice": "Обавештење о приватности",
     "welcome_title": "Добродошли на нови језичак",
     "welcome_body": "Firefox ће користити овај простор да вам приказује најрелевантне језичке, чланке, видео клипове и странице које сте недавно посетили, како бисте им се лако могли вратити.",
     "welcome_label": "Учитавам ваше истакнуте ставке",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Прилагодите страницу новог језичка",
     "settings_pane_header": "Поставке новог језичка",
-    "settings_pane_body": "Изаберите шта желите да видите када отворите нови језичак.",
+    "settings_pane_body2": "Изаберите шта желите видети на овој страници.",
     "settings_pane_search_header": "Претрага",
     "settings_pane_search_body": "Претражујте веб из вашег новог језичка.",
     "settings_pane_topsites_header": "Популарни сајтови",
     "settings_pane_topsites_body": "Приступите најпосећенијим веб сајтовима.",
     "settings_pane_topsites_options_showmore": "Прикажи у два реда",
     "settings_pane_bookmarks_header": "Недавне забелешке",
     "settings_pane_bookmarks_body": "Ваша нова забелешка на јединственом месту.",
     "settings_pane_visit_again_header": "Посетите поново",
     "settings_pane_visit_again_body": "Firefox ће вам приказивати делове ваше историје прегледања коју можда желите да запамтите или да им се вратите.",
-    "settings_pane_pocketstories_header": "Популарне приче",
-    "settings_pane_pocketstories_body": "Pocket, део Mozilla-ине породице, ће вам помоћи да повежете ваш квалитетан садржај који можда не би пронашли другачије.",
+    "settings_pane_highlights_header": "Истакнуто",
+    "settings_pane_highlights_body2": "Поново погледајте занимљиве ствари које сте скоро посетили или забележили.",
+    "settings_pane_highlights_options_bookmarks": "Забелешке",
+    "settings_pane_highlights_options_visited": "Посећени сајтови",
+    "settings_pane_snippets_header": "Исечци",
+    "settings_pane_snippets_body": "Читајте кратке и слатке новости од Mozilla-е о Firefox-у, интернет култури и погледајте понеки насумични мем.",
     "settings_pane_done_button": "Готово",
     "edit_topsites_button_text": "Уреди",
     "edit_topsites_button_label": "Прилагодите секцију популарних сајтова",
     "edit_topsites_showmore_button": "Прикажи више",
     "edit_topsites_showless_button": "Прикажи мање",
     "edit_topsites_done_button": "Готово",
     "edit_topsites_pin_button": "Закачи овај сајт",
     "edit_topsites_unpin_button": "Откачи овај сајт",
@@ -5341,28 +5531,29 @@
     "topsites_form_url_placeholder": "Унесите или налепите URL",
     "topsites_form_add_button": "Додај",
     "topsites_form_save_button": "Сачувај",
     "topsites_form_cancel_button": "Откажи",
     "topsites_form_url_validation": "Исправан URL се захтева",
     "pocket_read_more": "Популарне теме:",
     "pocket_read_even_more": "Погледајте још прича",
     "pocket_feedback_header": "Најбоље од веба од преко 25 милиона кустоса.",
-    "pocket_feedback_body": "Pocket, део Mozilla-ине породице, ће вам помоћи да повежете ваш квалитетан садржај који можда не би пронашли другачије.",
-    "pocket_send_feedback": "Пошаљи повратну информацију",
+    "pocket_description": "Откријте високо квалитетан садржај који можда не бисте видели, уз помоћ Pocket-а који је сада део Mozilla-е.",
+    "highlights_empty_state": "Почните са коришћењем веба а ми ћемо вам овде приказивати неке од одличних чланака, видео записа и других страница које сте скоро посетили.",
     "topstories_empty_state": "Вратите се касније за нове вести {provider}. Не можете дочекати? Изаберите популарну тему да пронађете још занимљивих вести из света.",
-    "manual_migration_explanation": "Пробајте Firefox са вашим омиљеним сајтовима и забелешкама из другог прегледача.",
+    "manual_migration_explanation2": "Пробајте FIrefox са коришћењем забелешки, историјата и лозинки из другог прегледача.",
     "manual_migration_cancel_button": "Не, хвала",
     "manual_migration_import_button": "Увези сада"
   },
   "sv-SE": {
     "newtab_page_title": "Ny flik",
     "default_label_loading": "Laddar…",
     "header_top_sites": "Mest besökta",
     "header_stories": "Huvudnyheter",
+    "header_highlights": "Höjdpunkter",
     "header_visit_again": "Besökt igen",
     "header_bookmarks": "Senaste bokmärken",
     "header_recommended_by": "Rekommenderas av {provider}",
     "header_bookmarks_placeholder": "Du har inga bokmärken ännu.",
     "header_stories_from": "från",
     "type_label_visited": "Besökta",
     "type_label_bookmarked": "Bokmärkta",
     "type_label_synced": "Synkroniserade från en annan enhet",
@@ -5384,37 +5575,43 @@
     "confirm_history_delete_notice_p2": "Den här åtgärden kan inte ångras.",
     "menu_action_save_to_pocket": "Spara till Pocket",
     "search_for_something_with": "Sök efter {search_term} med:",
     "search_button": "Sök",
     "search_header": "{search_engine_name}",
     "search_web_placeholder": "Sök på webben",
     "search_settings": "Ändra sökinställningar",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Skicka återkoppling",
+    "section_info_privacy_notice": "Sekretesspolicy",
     "welcome_title": "Välkommen till ny flik",
     "welcome_body": "Firefox kommer att använda detta utrymme för att visa dina mest relevanta bokmärken, artiklar, videor och sidor du nyligen besökt, så du kan hitta dem lätt.",
     "welcome_label": "Identifierar dina höjdpunkter",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Anpassa sidan för Ny flik",
     "settings_pane_header": "Inställningar Ny flik",
-    "settings_pane_body": "Välj vad som ska visas när du öppnar en ny flik.",
+    "settings_pane_body2": "Välj vad du vill se på denna sida.",
     "settings_pane_search_header": "Sök",
     "settings_pane_search_body": "Sök på webben från din nya flik.",
     "settings_pane_topsites_header": "Mest besökta",
     "settings_pane_topsites_body": "Åtkomst till de webbplatser du besökt mest.",
     "settings_pane_topsites_options_showmore": "Visa två rader",
     "settings_pane_bookmarks_header": "Senaste bokmärken",
     "settings_pane_bookmarks_body": "Dina nyskapade bokmärken på ett bra ställe.",
     "settings_pane_visit_again_header": "Besökt igen",
     "settings_pane_visit_again_body": "Firefox visar dig delar av din surfhistorik som du kanske vill komma ihåg eller återkomma till.",
-    "settings_pane_pocketstories_header": "Huvudnyheter",
-    "settings_pane_pocketstories_body": "Pocket, en del av Mozilla-familjen, hjälper dig att hitta högkvalitativt innehåll som du kanske annars inte hade hittat.",
+    "settings_pane_highlights_header": "Höjdpunkter",
+    "settings_pane_highlights_body2": "Hitta tillbaka till intressanta saker som du nyligen har besökt eller bokmärkt.",
+    "settings_pane_highlights_options_bookmarks": "Bokmärken",
+    "settings_pane_highlights_options_visited": "Besökta sidor",
+    "settings_pane_snippets_header": "Kort information",
+    "settings_pane_snippets_body": "Läs korta nyheter från Mozilla om Firefox, internetkultur och från tid till annan en meme.",
     "settings_pane_done_button": "Klar",
     "edit_topsites_button_text": "Redigera",
     "edit_topsites_button_label": "Anpassa avsnittet Mest besökta",
     "edit_topsites_showmore_button": "Visa mer",
     "edit_topsites_showless_button": "Visa mindre",
     "edit_topsites_done_button": "Klar",
     "edit_topsites_pin_button": "Fäst denna webbplats",
     "edit_topsites_unpin_button": "Lösgör webbplatsen",
@@ -5427,20 +5624,20 @@
     "topsites_form_url_placeholder": "Skriv eller klistra in en URL",
     "topsites_form_add_button": "Lägg till",
     "topsites_form_save_button": "Spara",
     "topsites_form_cancel_button": "Avbryt",
     "topsites_form_url_validation": "Giltig URL krävs",
     "pocket_read_more": "Populära ämnen:",
     "pocket_read_even_more": "Visa fler nyheter",
     "pocket_feedback_header": "Det bästa av webben, sammanställt av över 25 miljoner människor.",
-    "pocket_feedback_body": "Pocket, en del av Mozilla-familjen, hjälper dig att hitta högkvalitativt innehåll som du kanske annars inte hade hittat.",
-    "pocket_send_feedback": "Skicka återkoppling",
+    "pocket_description": "Upptäck högkvalitativt innehåll som du annars skulle missa, med hjälp av Pocket, nu en del av Mozilla.",
+    "highlights_empty_state": "Börja surfa, och vi visar några av de bästa artiklarna, videoklippen och andra sidor du nyligen har besökt eller bokmärkt här.",
     "topstories_empty_state": "Det finns inte fler. Kom tillbaka senare för fler huvudnyheter från {provider}. Kan du inte vänta? Välj ett populärt ämne för att hitta fler bra nyheter från hela världen.",
-    "manual_migration_explanation": "Prova Firefox med dina favoritwebbplatser och bokmärken från en annan webbläsare.",
+    "manual_migration_explanation2": "Testa Firefox med bokmärken, historik och lösenord från en annan webbläsare.",
     "manual_migration_cancel_button": "Nej tack",
     "manual_migration_import_button": "Importera nu"
   },
   "ta": {
     "newtab_page_title": "புதிய கீற்று",
     "default_label_loading": "ஏற்றுகிறது…",
     "header_top_sites": "சிறந்த தளங்கள்",
     "header_stories": "முக்கிய கதைகள்",
@@ -5609,16 +5806,17 @@
     "manual_migration_cancel_button": "అడిగినందుకు ధన్యవాదాలు, వద్దు",
     "manual_migration_import_button": "ఇప్పుడే దిగుమతి చేయండి"
   },
   "th": {
     "newtab_page_title": "แท็บใหม่",
     "default_label_loading": "กำลังโหลด…",
     "header_top_sites": "ไซต์เด่น",
     "header_stories": "เรื่องราวเด่น",
+    "header_highlights": "รายการเด่น",
     "header_visit_again": "เยี่ยมชมอีกครั้ง",
     "header_bookmarks": "ที่คั่นหน้าเมื่อเร็ว ๆ นี้",
     "header_recommended_by": "แนะนำโดย {provider}",
     "header_bookmarks_placeholder": "คุณยังไม่มีที่คั่นหน้าใด ๆ",
     "header_stories_from": "จาก",
     "type_label_visited": "เยี่ยมชมแล้ว",
     "type_label_bookmarked": "มีที่คั่นหน้าแล้ว",
     "type_label_synced": "ซิงค์จากอุปกรณ์อื่น",
@@ -5640,36 +5838,38 @@
     "confirm_history_delete_notice_p2": "การกระทำนี้ไม่สามารถเลิกทำได้",
     "menu_action_save_to_pocket": "บันทึกไปยัง Pocket",
     "search_for_something_with": "ค้นหาสำหรับ {search_term} ด้วย:",
     "search_button": "ค้นหา",
     "search_header": "ค้นหา {search_engine_name}",
     "search_web_placeholder": "ค้นหาเว็บ",
     "search_settings": "เปลี่ยนการตั้งค่าการค้นหา",
     "section_info_option": "ข้อมูล",
+    "section_info_send_feedback": "ส่งข้อคิดเห็น",
+    "section_info_privacy_notice": "ประกาศความเป็นส่วนตัว",
     "welcome_title": "ยินดีต้อนรับสู่แท็บใหม่",
     "welcome_body": "Firefox จะใช้พื้นที่นี้เพื่อแสดงที่คั่นหน้า, บทความ, วิดีโอ และหน้าที่คุณเพิ่งเยี่ยมชมที่เกี่ยวข้องกับคุณมากที่สุด เพื่อให้คุณสามารถกลับมาชมได้อย่างง่ายดาย",
     "welcome_label": "กำลังระบุรายการเด่นของคุณ",
     "time_label_less_than_minute": "<1 นาที",
     "time_label_minute": "{number} นาที",
     "time_label_hour": "{number} ชั่วโมง",
     "time_label_day": "{number} วัน",
     "settings_pane_button_label": "ปรับแต่งหน้าแท็บใหม่ของคุณ",
     "settings_pane_header": "ค่ากำหนดแท็บใหม่",
-    "settings_pane_body": "เลือกสิ่งที่คุณเห็นเมื่อคุณเปิดแท็บใหม่",
+    "settings_pane_body2": "เลือกสิ่งที่คุณเห็นในหน้านี้",
     "settings_pane_search_header": "ค้นหา",
     "settings_pane_search_body": "ค้นหาเว็บจากแท็บใหม่ของคุณ",
     "settings_pane_topsites_header": "ไซต์เด่น",
     "settings_pane_topsites_body": "เข้าถึงเว็บไซต์ที่คุณเยี่ยมชมมากที่สุด",
     "settings_pane_topsites_options_showmore": "แสดงสองแถว",
     "settings_pane_bookmarks_header": "ที่คั่นหน้าเมื่อเร็ว ๆ นี้",
     "settings_pane_bookmarks_body": "ที่คั่นหน้าที่สร้างใหม่ของคุณในตำแหน่งที่ตั้งเดียวที่สะดวก",
     "settings_pane_visit_again_header": "เยี่ยมชมอีกครั้ง",
-    "settings_pane_pocketstories_header": "เรื่องราวเด่น",
-    "settings_pane_pocketstories_body": "Pocket ส่วนหนึ่งของครอบครัว Mozilla จะช่วยเชื่อมต่อคุณกับเนื้อหาคุณภาพสูงที่คุณอาจไม่พบที่อื่น",
+    "settings_pane_highlights_header": "รายการเด่น",
+    "settings_pane_highlights_options_bookmarks": "ที่คั่นหน้า",
     "settings_pane_done_button": "เสร็จสิ้น",
     "edit_topsites_button_text": "แก้ไข",
     "edit_topsites_button_label": "ปรับแต่งส่วนไซต์เด่นของคุณ",
     "edit_topsites_showmore_button": "แสดงเพิ่มเติม",
     "edit_topsites_showless_button": "แสดงน้อยลง",
     "edit_topsites_done_button": "เสร็จสิ้น",
     "edit_topsites_pin_button": "ปักหมุดไซต์นี้",
     "edit_topsites_unpin_button": "ถอนหมุดไซต์นี้",
@@ -5682,19 +5882,16 @@
     "topsites_form_url_placeholder": "พิมพ์หรือวาง URL",
     "topsites_form_add_button": "เพิ่ม",
     "topsites_form_save_button": "บันทึก",
     "topsites_form_cancel_button": "ยกเลิก",
     "topsites_form_url_validation": "ต้องการ URL ที่ถูกต้อง",
     "pocket_read_more": "หัวข้อยอดนิยม:",
     "pocket_read_even_more": "ดูเรื่องราวเพิ่มเติม",
     "pocket_feedback_header": "ที่สุดของเว็บ จัดรายการโดยผู้คนกว่า 25 ล้านคน",
-    "pocket_feedback_body": "Pocket ส่วนหนึ่งของครอบครัว Mozilla จะช่วยเชื่อมต่อคุณกับเนื้อหาคุณภาพสูงที่คุณอาจไม่พบที่อื่น",
-    "pocket_send_feedback": "ส่งข้อคิดเห็น",
-    "manual_migration_explanation": "ลอง Firefox ด้วยไซต์โปรดและที่คั่นหน้าของคุณจากเบราว์เซอร์อื่น",
     "manual_migration_cancel_button": "ไม่ ขอบคุณ",
     "manual_migration_import_button": "นำเข้าตอนนี้"
   },
   "tl": {
     "newtab_page_title": "Bagong Tab",
     "default_label_loading": "Pagkarga…",
     "header_top_sites": "Tuktok na mga Site",
     "header_highlights": "Highlights",
@@ -5743,16 +5940,17 @@
     "edit_topsites_edit_button": "I-edit ang site na ito",
     "edit_topsites_dismiss_button": "I-dismiss sa site na ito"
   },
   "tr": {
     "newtab_page_title": "Yeni Sekme",
     "default_label_loading": "Yükleniyor…",
     "header_top_sites": "En Sık Kullanılan Siteler",
     "header_stories": "İlginç Yazılar",
+    "header_highlights": "Öne Çıkanlar",
     "header_visit_again": "Yeniden Ziyaret Edin",
     "header_bookmarks": "Son Yer imleri",
     "header_recommended_by": "{provider} öneriyor",
     "header_bookmarks_placeholder": "Henüz hiç yer iminiz yok.",
     "header_stories_from": "kaynak:",
     "type_label_visited": "Ziyaret edildi",
     "type_label_bookmarked": "Yer imlerine eklendi",
     "type_label_synced": "Başka bir cihazdan eşitlendi",
@@ -5774,37 +5972,43 @@
     "confirm_history_delete_notice_p2": "Bu işlem geri alınamaz.",
     "menu_action_save_to_pocket": "Pocket’a kaydet",
     "search_for_something_with": "{search_term} terimini şununla ara:",
     "search_button": "Ara",
     "search_header": "{search_engine_name} Araması",
     "search_web_placeholder": "Web'de ara",
     "search_settings": "Arama ayarlarını değiştir",
     "section_info_option": "Bilgi",
+    "section_info_send_feedback": "Görüş gönder",
+    "section_info_privacy_notice": "Gizlilik bildirimi",
     "welcome_title": "Yeni sekmeye hoş geldiniz",
     "welcome_body": "Firefox son zamanlarda ziyaret ettiğiniz ve sık kullandığınız yer imlerini, makaleleri, videoları ve sayfaları onlara tekrar kolayca geri dönebilmeniz için bu alanda gösterecektir.",
     "welcome_label": "Öne Çıkanlar'ınızı tanıyın",
     "time_label_less_than_minute": "<1 dk",
     "time_label_minute": "{number} dk",
     "time_label_hour": "{number} sa",
     "time_label_day": "{number} g",
     "settings_pane_button_label": "Yeni Sekme sayfanızı özelleştirin",
     "settings_pane_header": "Yeni Sekme Tercihleri",
-    "settings_pane_body": "Yeni bir sekme açtığınızda neleri göreceğinizi seçin.",
+    "settings_pane_body2": "Bu sayfada görmek istediklerinizi seçin.",
     "settings_pane_search_header": "Arama",
     "settings_pane_search_body": "Yeni sekme üzerinden web'de arama yapın.",
     "settings_pane_topsites_header": "Sık Kullandıklarınız",
     "settings_pane_topsites_body": "En sık ziyaret ettiğiniz web sitelerine erişin.",
     "settings_pane_topsites_options_showmore": "İki satır göster",
     "settings_pane_bookmarks_header": "Son Yer İmleri",
     "settings_pane_bookmarks_body": "Yeni eklediğiniz yer imlerini bir araya topladık.",
     "settings_pane_visit_again_header": "Yeniden Ziyaret Edin",
     "settings_pane_visit_again_body": "Firefox, gezinti geçmişinizden hatırlamak veya yeniden ziyaret etmek isteyebileceğiniz sayfaları burada gösterecek.",
-    "settings_pane_pocketstories_header": "İlginç Yazılar",
-    "settings_pane_pocketstories_body": "Mozilla ailesinin yeni üyesi Pocket, kolayca bulamayacağınız, kaliteli içerikleri karşınıza getiriyor.",
+    "settings_pane_highlights_header": "Öne çıkanlar",
+    "settings_pane_highlights_body2": "Son zamanlarda baktığınız veya yer imlerinize eklediğiniz ilginç şeyleri yeniden keşfedin.",
+    "settings_pane_highlights_options_bookmarks": "Yer imleri",
+    "settings_pane_highlights_options_visited": "Ziyaret ettiğim siteler",
+    "settings_pane_snippets_header": "Mesajlar",
+    "settings_pane_snippets_body": "Firefox, internet kültürü ve önemli gelişmeler hakkında Mozilla’dan gelen kısa güncelleme notlarını okuyun.",
     "settings_pane_done_button": "Tamam",
     "edit_topsites_button_text": "Düzenle",
     "edit_topsites_button_label": "Sık Kullandıklarınız bölümünü özelleştirin",
     "edit_topsites_showmore_button": "Daha fazla göster",
     "edit_topsites_showless_button": "Daha az göster",
     "edit_topsites_done_button": "Tamam",
     "edit_topsites_pin_button": "Bu siteyi sabitle",
     "edit_topsites_unpin_button": "Siteyi sabitlikten çıkar",
@@ -5817,28 +6021,29 @@
     "topsites_form_url_placeholder": "Adres yazın ve yapıştırın",
     "topsites_form_add_button": "Ekle",
     "topsites_form_save_button": "Kaydet",
     "topsites_form_cancel_button": "İptal",
     "topsites_form_url_validation": "Geçerli bir adres gerekli",
     "pocket_read_more": "Popüler konular:",
     "pocket_read_even_more": "Daha fazla yazı göster",
     "pocket_feedback_header": "25 milyon kişinin katkılarıyla, web’in en iyileri.",
-    "pocket_feedback_body": "Mozilla ailesinin yeni üyesi Pocket, kolayca bulamayacağınız, kaliteli içerikleri karşınıza getiriyor.",
-    "pocket_send_feedback": "Görüş gönder",
+    "pocket_description": "Mozilla ailesinin yeni üyesi Pocket’ın yardımıyla, gözünüzden kaçabilecek kaliteli içerikleri keşfedin.",
+    "highlights_empty_state": "Gezinmeye başlayın. Son zamanlarda baktığınız veya yer imlerinize eklediğiniz bazı güzel makaleleri, videoları ve diğer sayfaları burada göstereceğiz.",
     "topstories_empty_state": "Hepsini bitirdiniz. Yeni {provider} haberleri için daha fazla yine gelin. Beklemek istemiyor musunuz? İlginç yazılara ulaşmak için popüler konulardan birini seçebilirsiniz.",
-    "manual_migration_explanation": "Başka tarayıcılardaki sevdiğiniz siteleri ve yer imlerinizi Firefox’a aktarabilirsiniz.",
+    "manual_migration_explanation2": "Öteki tarayıcılarınızdaki yer işaretlerinizi, geçmişinizi ve parolalarınızı Firefox’a taşıyabilirsiniz.",
     "manual_migration_cancel_button": "Gerek yok",
     "manual_migration_import_button": "Olur, aktaralım"
   },
   "uk": {
     "newtab_page_title": "Нова вкладка",
     "default_label_loading": "Завантаження…",
     "header_top_sites": "Популярні сайти",
     "header_stories": "Головні новини",
+    "header_highlights": "Обране",
     "header_visit_again": "Відвідати знову",
     "header_bookmarks": "Недавно закладені",
     "header_recommended_by": "Рекомендовано {provider}",
     "header_bookmarks_placeholder": "У вас ще немає закладок.",
     "header_stories_from": "від",
     "type_label_visited": "Відвідано",
     "type_label_bookmarked": "Закладено",
     "type_label_synced": "Синхронізовано з іншого пристрою",
@@ -5860,37 +6065,43 @@
     "confirm_history_delete_notice_p2": "Цю дію неможливо скасувати.",
     "menu_action_save_to_pocket": "Зберегти в Pocket",
     "search_for_something_with": "Шукати {search_term} з:",
     "search_button": "Пошук",
     "search_header": "Шукати з {search_engine_name}",
     "search_web_placeholder": "Пошук в Інтернеті",
     "search_settings": "Змінити налаштування пошуку",
     "section_info_option": "Інфо",
+    "section_info_send_feedback": "Надіслати відгук",
+    "section_info_privacy_notice": "Повідомлення про приватність",
     "welcome_title": "Вітаємо на новій вкладці",
     "welcome_body": "Firefox буде використовувати її для показу найважливіших закладок, статей, відео, а також нещодавно відвіданих сторінок, щоб ви могли з легкістю повернутися до них.",
     "welcome_label": "Визначення обраного",
     "time_label_less_than_minute": "<1 хв",
     "time_label_minute": "{number} хв",
     "time_label_hour": "{number} г",
     "time_label_day": "{number} д",
     "settings_pane_button_label": "Налаштуйте свою сторінку нової вкладки",
     "settings_pane_header": "Налаштування нової вкладки",
-    "settings_pane_body": "Оберіть, що показувати при відкритті нової вкладки.",
+    "settings_pane_body2": "Оберіть, що ви побачите на цій сторінці.",
     "settings_pane_search_header": "Пошук",
     "settings_pane_search_body": "Пошук в Інтернеті з нової вкладки.",
     "settings_pane_topsites_header": "Популярні сайти",
     "settings_pane_topsites_body": "Доступ до найчастіше відвідуваних веб-сайтів.",
     "settings_pane_topsites_options_showmore": "Показувати два рядки",
     "settings_pane_bookmarks_header": "Недавно закладені",
     "settings_pane_bookmarks_body": "Ваші нові закладки в одному зручному розташуванні.",
     "settings_pane_visit_again_header": "Відвідати знову",
     "settings_pane_visit_again_body": "Firefox покаже вам елементи історії перегляду, які ви, можливо, захочете запам'ятати чи відвідати знову.",
-    "settings_pane_pocketstories_header": "Головні новини",
-    "settings_pane_pocketstories_body": "Pocket, частина сім'ї Mozilla, допоможе підключити вас до якісного вмісту, що ви можете інакше й не знайти.",
+    "settings_pane_highlights_header": "Обране",
+    "settings_pane_highlights_body2": "Визначте свій спосіб, як повернутися до цікавих матеріалів, які ви нещодавно переглядали чи зберігали.",
+    "settings_pane_highlights_options_bookmarks": "Закладки",
+    "settings_pane_highlights_options_visited": "Відвідані сайти",
+    "settings_pane_snippets_header": "Фрагменти",
+    "settings_pane_snippets_body": "Читайте короткі й цікаві новини від Mozilla про Firefox, культуру інтернету, а також випадкові меми.",
     "settings_pane_done_button": "Готово",
     "edit_topsites_button_text": "Змінити",
     "edit_topsites_button_label": "Налаштувати розділ популярних сайтів",
     "edit_topsites_showmore_button": "Показати більше",
     "edit_topsites_showless_button": "Показати менше",
     "edit_topsites_done_button": "Готово",
     "edit_topsites_pin_button": "Закріпити цей сайт",
     "edit_topsites_unpin_button": "Відкріпити цей сайт",
@@ -5903,20 +6114,20 @@
     "topsites_form_url_placeholder": "Введіть або вставте URL-адресу",
     "topsites_form_add_button": "Додати",
     "topsites_form_save_button": "Зберегти",
     "topsites_form_cancel_button": "Скасувати",
     "topsites_form_url_validation": "Необхідна дійсна адреса URL",
     "pocket_read_more": "Популярні теми:",
     "pocket_read_even_more": "Переглянути більше історій",
     "pocket_feedback_header": "Найкраще з Інтернету, відібрано понад 25 мільйонами людей.",
-    "pocket_feedback_body": "Pocket, частина сім'ї Mozilla, допоможе підключити вас до якісного вмісту, що ви можете інакше й не знайти.",
-    "pocket_send_feedback": "Надіслати відгук",
+    "pocket_description": "Відкривайте високоякісні матеріали, які ви могли не побачити, завдяки Pocket, що тепер входить до складу Mozilla.",
+    "highlights_empty_state": "Почніть перегляд і ми покажемо вам деякі чудові статті, відео та інші сторінки, нещодавно відвідані чи збережені вами до закладок тут.",
     "topstories_empty_state": "Готово. Перевірте згодом, щоб побачити більше матеріалів від {provider}. Не хочете чекати? Оберіть популярну тему, щоб знайти більше цікавих матеріалів з усього Інтернету.",
-    "manual_migration_explanation": "Спробуйте Firefox з власними улюбленими сайтами і закладками з іншого браузера.",
+    "manual_migration_explanation2": "Спробуйте Firefox із закладками, історією та паролями з іншого браузера.",
     "manual_migration_cancel_button": "Ні, дякую",
     "manual_migration_import_button": "Імпортувати зараз"
   },
   "ur": {
     "newtab_page_title": "نیا ٹیب",
     "default_label_loading": "لوڈ کر رہا ہے…",
     "header_top_sites": "بہترین سائٹیں",
     "header_stories": "بہترین کہانیاں",
@@ -6104,21 +6315,21 @@
     "welcome_body": "Firefox 会在这里显示对您最有用的书签、文章、视频和访问过的页面,便于您回到这些网站。",
     "welcome_label": "正在为您准备集锦",
     "time_label_less_than_minute": "1 分钟内",
     "time_label_minute": "{number} 分钟前",
     "time_label_hour": "{number} 小时前",
     "time_label_day": "{number} 天前",
     "settings_pane_button_label": "定制您的新标签页",
     "settings_pane_header": "新标签页选项",
-    "settings_pane_body2": "选择您在此页面上看到什么。",
+    "settings_pane_body2": "选择您在此页面上想看到什么。",
     "settings_pane_search_header": "搜索",
-    "settings_pane_search_body": "从您的新标签页搜索网络。",
+    "settings_pane_search_body": "直接在您的新标签页搜遍网络。",
     "settings_pane_topsites_header": "常用网站",
-    "settings_pane_topsites_body": "访问您经常造访的网站。",
+    "settings_pane_topsites_body": "前往您经常造访的网站。",
     "settings_pane_topsites_options_showmore": "双行显示",
     "settings_pane_bookmarks_header": "最近的书签",
     "settings_pane_bookmarks_body": "您最近创建的书签将在此显示。",
     "settings_pane_visit_again_header": "再次造访",
     "settings_pane_visit_again_body": "Firefox 在此显示您可能想记住或将再次访问的浏览记录。",
     "settings_pane_highlights_header": "集锦",
     "settings_pane_highlights_body2": "根据您最近访问的页面和添加的书签推荐您感兴趣的东西。",
     "settings_pane_highlights_options_bookmarks": "书签",
@@ -6143,27 +6354,28 @@
     "topsites_form_add_button": "添加",
     "topsites_form_save_button": "保存",
     "topsites_form_cancel_button": "取消",
     "topsites_form_url_validation": "需要有效的网址",
     "pocket_read_more": "热门主题:",
     "pocket_read_even_more": "查看更多文章",
     "pocket_feedback_header": "由超过 2500 万人挑选出来的网上精华内容。",
     "pocket_description": "借助 Pocket(目前所属 Mozilla)发现有趣的高品质内容。",
-    "highlights_empty_state": "开始浏览吧,之后我们会根据您最近的访问记录推荐一些精美文章、视频或其他页面,或者您添加的书签。",
+    "highlights_empty_state": "开始浏览旅程吧,之后这里会显示您最近看过或加了书签的精彩文章、视频以及其他页面。",
     "topstories_empty_state": "所有文章都读完啦!晚点再来,{provider} 将推荐更多热门文章。等不及了?选择一个热门话题,找到更多网上的好文章。",
-    "manual_migration_explanation2": "携其他浏览器中保存的书签、历史记录和密码来尝试 Firefox。",
+    "manual_migration_explanation2": "把在其他浏览器中保存的书签、历史记录和密码带到 Firefox 吧。",
     "manual_migration_cancel_button": "不用了",
     "manual_migration_import_button": "立即导入"
   },
   "zh-TW": {
     "newtab_page_title": "新分頁",
     "default_label_loading": "載入中…",
     "header_top_sites": "熱門網站",
     "header_stories": "熱門文章",
+    "header_highlights": "精選網站",
     "header_visit_again": "再次造訪",
     "header_bookmarks": "近期新增的書籤",
     "header_recommended_by": "{provider} 推薦",
     "header_bookmarks_placeholder": "您還沒有任何書籤。",
     "header_stories_from": "來自",
     "type_label_visited": "造訪過的網站",
     "type_label_bookmarked": "已加入書籤",
     "type_label_synced": "從其他裝置同步過來",
@@ -6185,37 +6397,43 @@
     "confirm_history_delete_notice_p2": "無法還原此操作。",
     "menu_action_save_to_pocket": "儲存至 Pocket",
     "search_for_something_with": "搜尋 {search_term} 使用:",
     "search_button": "搜尋",
     "search_header": "{search_engine_name} 搜尋",
     "search_web_placeholder": "搜尋 Web",
     "search_settings": "變更搜尋選項",
     "section_info_option": "更多資訊",
+    "section_info_send_feedback": "傳送意見回饋",
+    "section_info_privacy_notice": "隱私權公告",
     "welcome_title": "歡迎來到新分頁",
     "welcome_body": "Firefox 會使用此空間來顯示與您最相關的書籤、文章、影片以及您最近造訪的頁面,這樣您就可以快速回到這些網站。",
     "welcome_label": "找出您的精選網站",
     "time_label_less_than_minute": "不到 1 分鐘內",
     "time_label_minute": "{number} 分鐘",
     "time_label_hour": "{number} 小時",
     "time_label_day": "{number} 天",
     "settings_pane_button_label": "自訂您的新分頁頁面",
     "settings_pane_header": "新分頁偏好設定",
-    "settings_pane_body": "選擇開啟新分頁時想看到什麼。",
+    "settings_pane_body2": "選擇要在此頁面看到哪些東西。",
     "settings_pane_search_header": "搜尋",
     "settings_pane_search_body": "直接在新分頁頁面搜尋網頁。",
     "settings_pane_topsites_header": "熱門網站",
     "settings_pane_topsites_body": "前往您最常造訪的網站。",
     "settings_pane_topsites_options_showmore": "顯示兩行",
     "settings_pane_bookmarks_header": "近期新增的書籤",
     "settings_pane_bookmarks_body": "將您新建立的書籤,放在隨手可得的地方。",
     "settings_pane_visit_again_header": "再次造訪",
     "settings_pane_visit_again_body": "Firefox 將顯示您一部份可能想要再次開啟的瀏覽紀錄。",
-    "settings_pane_pocketstories_header": "熱門文章",
-    "settings_pane_pocketstories_body": "Pocket 是 Mozilla 家族的一份子,將您可能沒發現的高品質內容帶到眼前。",
+    "settings_pane_highlights_header": "精選網站",
+    "settings_pane_highlights_body2": "快速回到您最近在網站發現的有趣事物,或是剛加入書籤的頁面。",
+    "settings_pane_highlights_options_bookmarks": "書籤",
+    "settings_pane_highlights_options_visited": "造訪過的網站",
+    "settings_pane_snippets_header": "隻字片語",
+    "settings_pane_snippets_body": "閱讀來自 Mozilla,關於 Firefox、網路文化、偶而還有一些不同 meme 的最新消息。",
     "settings_pane_done_button": "完成",
     "edit_topsites_button_text": "編輯",
     "edit_topsites_button_label": "自訂您的「熱門網站」區塊",
     "edit_topsites_showmore_button": "顯示更多",
     "edit_topsites_showless_button": "顯示更少",
     "edit_topsites_done_button": "完成",
     "edit_topsites_pin_button": "釘選此網站",
     "edit_topsites_unpin_button": "取消釘選此網站",
@@ -6228,17 +6446,16 @@
     "topsites_form_url_placeholder": "輸入或貼上網址",
     "topsites_form_add_button": "新增",
     "topsites_form_save_button": "儲存",
     "topsites_form_cancel_button": "取消",
     "topsites_form_url_validation": "請輸入有效的網址",
     "pocket_read_more": "熱門主題:",
     "pocket_read_even_more": "檢視更多文章",
     "pocket_feedback_header": "由超過兩千五百萬人找出來的 Web 最佳內容。",
-    "pocket_feedback_body": "Pocket 是 Mozilla 家族的一份子,將您可能沒發現的高品質內容帶到眼前。",
-    "pocket_send_feedback": "傳送意見回饋",
+    "pocket_description": "透過現在也是 Mozilla 旗下一員的 Pocket 的幫助,發現您先前可能錯過的高品質內容。",
+    "highlights_empty_state": "開始上網,我們就會把您在網路上發現的好文章、影片、剛加入書籤的頁面顯示於此處。",
     "topstories_empty_state": "所有文章都讀完啦!晚點再來,{provider} 將提供更多推薦故事。等不及了?選擇熱門主題,看看 Web 上各式精采資訊。",
-    "manual_migration_explanation": "匯入其他瀏覽器裡的書籤和網站,體驗 Firefox 的方便之處。",
+    "manual_migration_explanation2": "試試將其他瀏覽器的書籤、瀏覽記錄與密碼匯入到 Firefox。",
     "manual_migration_cancel_button": "不必了",
     "manual_migration_import_button": "立即匯入"
-  },
-  "zu": {}
+  }
 }
\ No newline at end of file
--- a/browser/extensions/activity-stream/install.rdf.in
+++ b/browser/extensions/activity-stream/install.rdf.in
@@ -3,17 +3,17 @@
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>activity-stream@mozilla.org</em:id>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
     <em:unpack>false</em:unpack>
-    <em:version>2017.09.01.1439-222d033f</em:version>
+    <em:version>2017.09.08.0882-3dbf720c</em:version>
     <em:name>Activity Stream</em:name>
     <em:description>A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox.</em:description>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
 
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>@MOZ_APP_VERSION@</em:minVersion>
--- a/browser/extensions/activity-stream/lib/ActivityStream.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStream.jsm
@@ -17,16 +17,17 @@ const {SectionsFeed} = Cu.import("resour
 const {PlacesFeed} = Cu.import("resource://activity-stream/lib/PlacesFeed.jsm", {});
 const {PrefsFeed} = Cu.import("resource://activity-stream/lib/PrefsFeed.jsm", {});
 const {Store} = Cu.import("resource://activity-stream/lib/Store.jsm", {});
 const {SnippetsFeed} = Cu.import("resource://activity-stream/lib/SnippetsFeed.jsm", {});
 const {SystemTickFeed} = Cu.import("resource://activity-stream/lib/SystemTickFeed.jsm", {});
 const {TelemetryFeed} = Cu.import("resource://activity-stream/lib/TelemetryFeed.jsm", {});
 const {TopSitesFeed} = Cu.import("resource://activity-stream/lib/TopSitesFeed.jsm", {});
 const {TopStoriesFeed} = Cu.import("resource://activity-stream/lib/TopStoriesFeed.jsm", {});
+const {HighlightsFeed} = Cu.import("resource://activity-stream/lib/HighlightsFeed.jsm", {});
 
 const DEFAULT_SITES = new Map([
   // This first item is the global list fallback for any unexpected geos
   ["", "https://www.youtube.com/,https://www.facebook.com/,https://www.wikipedia.org/,https://www.reddit.com/,https://www.amazon.com/,https://twitter.com/"],
   ["US", "https://www.youtube.com/,https://www.facebook.com/,https://www.amazon.com/,https://www.reddit.com/,https://www.wikipedia.org/,https://twitter.com/"],
   ["CA", "https://www.youtube.com/,https://www.facebook.com/,https://www.reddit.com/,https://www.wikipedia.org/,https://www.amazon.ca/,https://twitter.com/"],
   ["DE", "https://www.youtube.com/,https://www.facebook.com/,https://www.amazon.de/,https://www.ebay.de/,https://www.wikipedia.org/,https://www.reddit.com/"],
   ["PL", "https://www.youtube.com/,https://www.facebook.com/,https://allegro.pl/,https://www.wikipedia.org/,https://www.olx.pl/,https://www.wykop.pl/"],
@@ -145,16 +146,22 @@ const FEEDS_DATA = [
   },
   {
     name: "sections",
     factory: () => new SectionsFeed(),
     title: "Manages sections",
     value: true
   },
   {
+    name: "section.highlights",
+    factory: () => new HighlightsFeed(),
+    title: "Fetches content recommendations from places db",
+    value: true
+  },
+  {
     name: "section.topstories",
     factory: () => new TopStoriesFeed(),
     title: "Fetches content recommendations from a configurable content provider",
     // Dynamically determine if Pocket should be shown for a geo / locale
     getValue: ({geo, locale}) => {
       const locales = ({
         "US": ["en-US", "en-GB", "en-ZA"],
         "CA": ["en-US", "en-GB", "en-ZA"],
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/lib/HighlightsFeed.jsm
@@ -0,0 +1,96 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const {actionTypes: at} = Cu.import("resource://activity-stream/common/Actions.jsm", {});
+
+const {shortURL} = Cu.import("resource://activity-stream/lib/ShortURL.jsm", {});
+const {SectionsManager} = Cu.import("resource://activity-stream/lib/SectionsManager.jsm", {});
+const {Dedupe} = Cu.import("resource://activity-stream/common/Dedupe.jsm", {});
+
+XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
+  "resource://gre/modules/NewTabUtils.jsm");
+
+const HIGHLIGHTS_MAX_LENGTH = 9;
+const HIGHLIGHTS_UPDATE_TIME = 15 * 60 * 1000; // 15 minutes
+const SECTION_ID = "highlights";
+
+this.HighlightsFeed = class HighlightsFeed {
+  constructor() {
+    this.highlightsLastUpdated = 0;
+    this.highlights = [];
+    this.dedupe = new Dedupe(this._dedupeKey);
+  }
+
+  _dedupeKey(site) {
+    return site && site.url;
+  }
+
+  init() {
+    SectionsManager.onceInitialized(this.postInit.bind(this));
+  }
+
+  postInit() {
+    SectionsManager.enableSection(SECTION_ID);
+  }
+
+  uninit() {
+    SectionsManager.disableSection(SECTION_ID);
+  }
+
+  async fetchHighlights(broadcast = false) {
+    this.highlights = await NewTabUtils.activityStreamLinks.getHighlights();
+    for (let highlight of this.highlights) {
+      highlight.hostname = shortURL(Object.assign({}, highlight, {url: highlight.url}));
+      highlight.image = highlight.preview_image_url;
+      if (highlight.bookmarkGuid) {
+        highlight.type = "bookmark";
+      }
+    }
+
+    // Remove any Highlights that are in Top Sites already
+    const deduped = this.dedupe.group(this.store.getState().TopSites.rows, this.highlights);
+    this.highlights = deduped[1];
+
+    SectionsManager.updateSection(SECTION_ID, {rows: this.highlights}, this.highlightsLastUpdated === 0 || broadcast);
+    this.highlightsLastUpdated = Date.now();
+  }
+
+  onAction(action) {
+    switch (action.type) {
+      case at.INIT:
+        this.init();
+        break;
+      case at.NEW_TAB_LOAD:
+        if (this.highlights.length < HIGHLIGHTS_MAX_LENGTH) {
+          // If we haven't filled the highlights grid yet, fetch again.
+          this.fetchHighlights(true);
+        } else if (Date.now() - this.highlightsLastUpdated >= HIGHLIGHTS_UPDATE_TIME) {
+          // If the last time we refreshed the data is greater than 15 minutes, fetch again.
+          this.fetchHighlights(false);
+        }
+        break;
+      case at.MIGRATION_COMPLETED:
+      case at.PLACES_HISTORY_CLEARED:
+      case at.PLACES_LINK_DELETED:
+      case at.PLACES_LINK_BLOCKED:
+        this.fetchHighlights(true);
+        break;
+      case at.PLACES_BOOKMARK_ADDED:
+      case at.PLACES_BOOKMARK_REMOVED:
+      case at.TOP_SITES_UPDATED:
+        this.fetchHighlights(false);
+        break;
+      case at.UNINIT:
+        this.uninit();
+        break;
+    }
+  }
+};
+
+this.HIGHLIGHTS_UPDATE_TIME = HIGHLIGHTS_UPDATE_TIME;
+this.EXPORTED_SYMBOLS = ["HighlightsFeed", "HIGHLIGHTS_UPDATE_TIME", "SECTION_ID"];
--- a/browser/extensions/activity-stream/lib/PlacesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/PlacesFeed.jsm
@@ -83,29 +83,34 @@ class BookmarksObserver extends Observer
    * @param  {int} index
    * @param  {int} type       Indicates if the bookmark is an actual bookmark,
    *                          a folder, or a separator.
    * @param  {str} uri
    * @param  {str} title
    * @param  {int} dateAdded
    * @param  {str} guid      The unique id of the bookmark
    */
-  async onItemAdded(...args) {
+  onItemAdded(...args) {
     const type = args[3];
-    const guid = args[7];
     if (type !== PlacesUtils.bookmarks.TYPE_BOOKMARK) {
       return;
     }
-    try {
-      // bookmark: {bookmarkGuid, bookmarkTitle, lastModified, url}
-      const bookmark = await NewTabUtils.activityStreamProvider.getBookmark(guid);
-      this.dispatch({type: at.PLACES_BOOKMARK_ADDED, data: bookmark});
-    } catch (e) {
-      Cu.reportError(e);
-    }
+    const uri = args[4];
+    const bookmarkTitle = args[5];
+    const dateAdded = args[6];
+    const bookmarkGuid = args[7];
+    this.dispatch({
+      type: at.PLACES_BOOKMARK_ADDED,
+      data: {
+        bookmarkGuid,
+        bookmarkTitle,
+        dateAdded,
+        url: uri.spec
+      }
+    });
   }
 
   /**
    * onItemRemoved - Called when a bookmark is removed
    *
    * @param  {str} id
    * @param  {str} folderId
    * @param  {int} index
--- a/browser/extensions/activity-stream/lib/SectionsManager.jsm
+++ b/browser/extensions/activity-stream/lib/SectionsManager.jsm
@@ -29,17 +29,36 @@ const BUILT_IN_SECTIONS = {
     infoOption: {
       header: {id: options.provider_header || "pocket_feedback_header"},
       body: {id: options.provider_description || "pocket_feedback_body"},
       link: {href: options.info_link, id: "section_info_privacy_notice"}
     },
     emptyState: {
       message: {id: "topstories_empty_state", values: {provider: options.provider_name}},
       icon: "check"
-    }
+    },
+    order: 0
+  }),
+  "feeds.section.highlights": options => ({
+    id: "highlights",
+    pref: {
+      titleString: {id: "settings_pane_highlights_header"},
+      descString: {id: "settings_pane_highlights_body2"}
+    },
+    shouldHidePref:  false,
+    eventSource: "HIGHLIGHTS",
+    icon: "highlights",
+    title: {id: "header_highlights"},
+    maxRows: 3,
+    availableContextMenuOptions: ["CheckBookmark", "SaveToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"],
+    emptyState: {
+      message: {id: "highlights_empty_state"},
+      icon: "highlights"
+    },
+    order: 1
   })
 };
 
 const SectionsManager = {
   ACTIONS_TO_PROXY: ["SYSTEM_TICK", "NEW_TAB_LOAD"],
   CONTEXT_MENU_PREFS: {"SaveToPocket": "extensions.pocket.enabled"},
   initialized: false,
   sections: new Map(),
--- a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
@@ -154,20 +154,22 @@ this.TelemetryFeed = class TelemetryFeed
   _onTelemetryPrefChange(prefVal) {
     this.telemetryEnabled = prefVal;
   }
 
   /**
    * Lazily initialize PingCentre to send pings
    */
   get pingCentre() {
+    const ACTIVITY_STREAM_ID = "activity-stream";
     Object.defineProperty(this, "pingCentre",
       {
         value: new PingCentre({
-          topic: "activity-stream",
+          topic: ACTIVITY_STREAM_ID,
+          filter: ACTIVITY_STREAM_ID,
           overrideEndpointPref: ACTIVITY_STREAM_ENDPOINT_PREF
         })
       });
     return this.pingCentre;
   }
 
   /**
    * Get encoded user preferences, multiple prefs will be combined via bitwise OR operator
--- a/browser/extensions/activity-stream/lib/TippyTopProvider.jsm
+++ b/browser/extensions/activity-stream/lib/TippyTopProvider.jsm
@@ -19,27 +19,29 @@ function getDomain(url) {
 
 function getPath(url) {
   return new URL(url).pathname;
 }
 
 this.TippyTopProvider = class TippyTopProvider {
   constructor() {
     this._sitesByDomain = new Map();
+    this.initialized = false;
   }
   async init() {
     // Load the Tippy Top sites from the json manifest.
     try {
       for (const site of await (await fetch(TIPPYTOP_JSON_PATH)).json()) {
         // The tippy top manifest can have a url property (string) or a
         // urls property (array of strings)
         for (const url of site.url ? [site.url] : site.urls || []) {
           this._sitesByDomain.set(getDomain(url), site);
         }
       }
+      this.initialized = true;
     } catch (error) {
       Cu.reportError("Failed to load tippy top manifest.");
     }
   }
   processSite(site) {
     // Skip URLs with a path that isn't the root path /
     let path;
     try {
--- a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
@@ -76,16 +76,20 @@ this.TopSitesFeed = class TopSitesFeed {
     // Remove any duplicates from frecent and default sites then insert the
     // original pinned sites into the deduped frecent ([1]) and defaults ([2])
     const deduped = this.dedupe.group(pinned, frecent, notBlockedDefaultSites);
     pinned = insertPinned([...deduped[1], ...deduped[2]], pinned);
 
     return pinned.slice(0, TOP_SITES_SHOWMORE_LENGTH);
   }
   async refresh(target = null) {
+    if (!this._tippyTopProvider.initialized) {
+      await this._tippyTopProvider.init();
+    }
+
     const links = await this.getLinksWithDefaults();
 
     // First, cache existing screenshots in case we need to reuse them
     const currentScreenshots = {};
     for (const link of this.store.getState().TopSites.rows) {
       if (link && link.screenshot) {
         currentScreenshots[link.url] = link.screenshot;
       }
@@ -160,17 +164,16 @@ this.TopSitesFeed = class TopSitesFeed {
     // pinned in the slot.
     this._insertPin(action.data.site, 0);
 
     this._broadcastPinnedSitesUpdated();
   }
   async onAction(action) {
     switch (action.type) {
       case at.INIT:
-        await this._tippyTopProvider.init();
         this.refresh();
         break;
       case at.NEW_TAB_LOAD:
         if (
           // When a new tab is opened, if the last time we refreshed the data
           // is greater than 15 minutes, refresh the data.
           (Date.now() - this.lastUpdated >= UPDATE_TIME)
         ) {
--- a/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
+++ b/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
@@ -63,41 +63,41 @@ describe("Reducers", () => {
     it("should bookmark an item on PLACES_BOOKMARK_ADDED", () => {
       const oldState = {rows: [{url: "foo.com"}, {url: "bar.com"}]};
       const action = {
         type: at.PLACES_BOOKMARK_ADDED,
         data: {
           url: "bar.com",
           bookmarkGuid: "bookmark123",
           bookmarkTitle: "Title for bar.com",
-          lastModified: 1234567
+          dateAdded: 1234567
         }
       };
       const nextState = TopSites(oldState, action);
       const newRow = nextState.rows[1];
       // new row has bookmark data
       assert.equal(newRow.url, action.data.url);
       assert.equal(newRow.bookmarkGuid, action.data.bookmarkGuid);
       assert.equal(newRow.bookmarkTitle, action.data.bookmarkTitle);
-      assert.equal(newRow.bookmarkDateCreated, action.data.lastModified);
+      assert.equal(newRow.bookmarkDateCreated, action.data.dateAdded);
 
       // old row is unchanged
       assert.equal(nextState.rows[0], oldState.rows[0]);
     });
     it("should not update state for empty action.data on PLACES_BOOKMARK_ADDED", () => {
       const nextState = TopSites(undefined, {type: at.PLACES_BOOKMARK_ADDED});
       assert.equal(nextState, INITIAL_STATE.TopSites);
     });
     it("should remove a bookmark on PLACES_BOOKMARK_REMOVED", () => {
       const oldState = {
         rows: [{url: "foo.com"}, {
           url: "bar.com",
           bookmarkGuid: "bookmark123",
           bookmarkTitle: "Title for bar.com",
-          lastModified: 123456
+          dateAdded: 123456
         }]
       };
       const action = {type: at.PLACES_BOOKMARK_REMOVED, data: {url: "bar.com"}};
       const nextState = TopSites(oldState, action);
       const newRow = nextState.rows[1];
       // new row no longer has bookmark data
       assert.equal(newRow.url, oldState.rows[1].url);
       assert.isUndefined(newRow.bookmarkGuid);
@@ -206,17 +206,18 @@ describe("Reducers", () => {
     let oldState;
 
     beforeEach(() => {
       oldState = new Array(5).fill(null).map((v, i) => ({
         id: `foo_bar_${i}`,
         title: `Foo Bar ${i}`,
         initialized: false,
         rows: [{url: "www.foo.bar"}, {url: "www.other.url"}],
-        order: i
+        order: i,
+        type: "history"
       }));
     });
 
     it("should return INITIAL_STATE by default", () => {
       assert.equal(INITIAL_STATE.Sections, Sections(undefined, {type: "non_existent"}));
     });
     it("should remove the correct section on SECTION_DEREGISTER", () => {
       const newState = Sections(oldState, {type: at.SECTION_DEREGISTER, data: "foo_bar_2"});
@@ -249,16 +250,34 @@ describe("Reducers", () => {
     });
     it("should insert sections without an `order` at the top on SECTION_REGISTER", () => {
       const newSection = {id: "new_section"};
       const action = {type: at.SECTION_REGISTER, data: newSection};
       const newState = Sections(oldState, action);
       assert.equal(newState[0].id, newSection.id);
       assert.ok(newState[0].order < newState[1].order);
     });
+    it("should insert sections with a 0 `order` at the top on SECTION_REGISTER", () => {
+      const newSection = {id: "new_section", order: 0};
+      const action = {type: at.SECTION_REGISTER, data: newSection};
+      const newState = Sections(oldState, action);
+      assert.equal(newState[0].id, newSection.id);
+    });
+    it("should insert sections with a 1 `order` in the right spot on SECTION_REGISTER", () => {
+      const newSection = {id: "new_section", order: 1};
+      const action = {type: at.SECTION_REGISTER, data: newSection};
+      const newState = Sections(oldState, action);
+      assert.equal(newState[1].id, newSection.id);
+    });
+    it("should insert sections with higher `order` than any existing at the bottom on SECTION_REGISTER", () => {
+      const newSection = {id: "new_section", order: 10000};
+      const action = {type: at.SECTION_REGISTER, data: newSection};
+      const newState = Sections(oldState, action);
+      assert.equal(newState[newState.length - 1].id, newSection.id);
+    });
     it("should set newSection.rows === [] if no rows are provided on SECTION_REGISTER", () => {
       const action = {type: at.SECTION_REGISTER, data: {id: "foo_bar_5", title: "Foo Bar 5"}};
       const newState = Sections(oldState, action);
       const insertedSection = newState.find(section => section.id === "foo_bar_5");
       assert.deepEqual(insertedSection.rows, []);
     });
     it("should update a section on SECTION_REGISTER if it already exists", () => {
       const NEW_TITLE = "New Title";
@@ -323,29 +342,30 @@ describe("Reducers", () => {
     });
     it("should bookmark an item when PLACES_BOOKMARK_ADDED is received", () => {
       const action = {
         type: at.PLACES_BOOKMARK_ADDED,
         data: {
           url: "www.foo.bar",
           bookmarkGuid: "bookmark123",
           bookmarkTitle: "Title for bar.com",
-          lastModified: 1234567
+          dateAdded: 1234567
         }
       };
       const nextState = Sections(oldState, action);
       // check a section to ensure the correct url was bookmarked
       const newRow = nextState[0].rows[0];
       const oldRow = nextState[0].rows[1];
 
       // new row has bookmark data
       assert.equal(newRow.url, action.data.url);
+      assert.equal(newRow.type, "bookmark");
       assert.equal(newRow.bookmarkGuid, action.data.bookmarkGuid);
       assert.equal(newRow.bookmarkTitle, action.data.bookmarkTitle);
-      assert.equal(newRow.bookmarkDateCreated, action.data.lastModified);
+      assert.equal(newRow.bookmarkDateCreated, action.data.dateAdded);
 
       // old row is unchanged
       assert.equal(oldRow, oldState[0].rows[1]);
     });
     it("should not update state for empty action.data on PLACES_BOOKMARK_REMOVED", () => {
       const nextState = Sections(undefined, {type: at.PLACES_BOOKMARK_REMOVED});
       assert.equal(nextState, INITIAL_STATE.Sections);
     });
@@ -357,24 +377,26 @@ describe("Reducers", () => {
           bookmarkGuid: "bookmark123"
         }
       };
       // add some bookmark data for the first url in rows
       oldState.forEach(item => {
         item.rows[0].bookmarkGuid = "bookmark123";
         item.rows[0].bookmarkTitle = "Title for bar.com";
         item.rows[0].bookmarkDateCreated = 1234567;
+        item.rows[0].type = "bookmark";
       });
       const nextState = Sections(oldState, action);
       // check a section to ensure the correct bookmark was removed
       const newRow = nextState[0].rows[0];
       const oldRow = nextState[0].rows[1];
 
-      // new row has bookmark data
+      // new row isn't a bookmark
       assert.equal(newRow.url, action.data.url);
+      assert.equal(newRow.type, "history");
       assert.isUndefined(newRow.bookmarkGuid);
       assert.isUndefined(newRow.bookmarkTitle);
       assert.isUndefined(newRow.bookmarkDateCreated);
 
       // old row is unchanged
       assert.equal(oldRow, oldState[0].rows[1]);
     });
   });
--- a/browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
@@ -18,17 +18,18 @@ describe("ActivityStream", () => {
       "lib/NewTabInit.jsm": {NewTabInit: Fake},
       "lib/PlacesFeed.jsm": {PlacesFeed: Fake},
       "lib/PrefsFeed.jsm": {PrefsFeed: Fake},
       "lib/SectionsManager.jsm": {SectionsFeed: Fake},
       "lib/SnippetsFeed.jsm": {SnippetsFeed: Fake},
       "lib/SystemTickFeed.jsm": {SystemTickFeed: Fake},
       "lib/TelemetryFeed.jsm": {TelemetryFeed: Fake},
       "lib/TopSitesFeed.jsm": {TopSitesFeed: Fake},
-      "lib/TopStoriesFeed.jsm": {TopStoriesFeed: Fake}
+      "lib/TopStoriesFeed.jsm": {TopStoriesFeed: Fake},
+      "lib/HighlightsFeed.jsm": {HighlightsFeed: Fake}
     }));
     as = new ActivityStream();
     sandbox.stub(as.store, "init");
     sandbox.stub(as.store, "uninit");
     sandbox.stub(as._defaultPrefs, "init");
     sandbox.stub(as._defaultPrefs, "reset");
   });
 
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
@@ -0,0 +1,177 @@
+"use strict";
+const injector = require("inject!lib/HighlightsFeed.jsm");
+const {GlobalOverrider} = require("test/unit/utils");
+const {actionTypes: at} = require("common/Actions.jsm");
+const {Dedupe} = require("common/Dedupe.jsm");
+
+const FAKE_LINKS = new Array(9).fill(null).map((v, i) => ({url: `http://www.site${i}.com`}));
+
+describe("Top Sites Feed", () => {
+  let HighlightsFeed;
+  let HIGHLIGHTS_UPDATE_TIME;
+  let SECTION_ID;
+  let feed;
+  let globals;
+  let sandbox;
+  let links;
+  let clock;
+  let fakeNewTabUtils;
+  let sectionsManagerStub;
+  let shortURLStub;
+
+  beforeEach(() => {
+    globals = new GlobalOverrider();
+    sandbox = globals.sandbox;
+    fakeNewTabUtils = {activityStreamLinks: {getHighlights: sandbox.spy(() => Promise.resolve(links))}};
+    sectionsManagerStub = {
+      onceInitialized: sinon.stub().callsFake(callback => callback()),
+      enableSection: sinon.spy(),
+      disableSection: sinon.spy(),
+      updateSection: sinon.spy(),
+      sections: new Map([["highlights", {}]])
+    };
+    shortURLStub = sinon.stub().callsFake(site => site.url);
+    globals.set("NewTabUtils", fakeNewTabUtils);
+    ({HighlightsFeed, HIGHLIGHTS_UPDATE_TIME, SECTION_ID} = injector({
+      "lib/ShortURL.jsm": {shortURL: shortURLStub},
+      "lib/SectionsManager.jsm": {SectionsManager: sectionsManagerStub},
+      "common/Dedupe.jsm": {Dedupe}
+    }));
+    feed = new HighlightsFeed();
+    feed.store = {dispatch: sinon.spy(), getState() { return {TopSites: {rows: Array(12).fill(null).map((v, i) => ({url: `http://www.topsite${i}.com`}))}}; }};
+    links = FAKE_LINKS;
+    clock = sinon.useFakeTimers();
+  });
+  afterEach(() => {
+    globals.restore();
+    clock.restore();
+  });
+
+  describe("#init", () => {
+    it("should create a HighlightsFeed", () => {
+      assert.instanceOf(feed, HighlightsFeed);
+    });
+    it("should call SectionsManager.onceInitialized on INIT", () => {
+      feed.onAction({type: at.INIT});
+      assert.calledOnce(sectionsManagerStub.onceInitialized);
+    });
+    it("should enable its section", () => {
+      feed.onAction({type: at.INIT});
+      assert.calledOnce(sectionsManagerStub.enableSection);
+      assert.calledWith(sectionsManagerStub.enableSection, SECTION_ID);
+    });
+    it("should *not* fetch highlights on init to avoid loading Places too early", () => {
+      feed.fetchHighlights = sinon.spy();
+
+      feed.onAction({type: at.INIT});
+
+      assert.notCalled(feed.fetchHighlights);
+    });
+  });
+  describe("#fetchHighlights", () => {
+    it("should add hostname and image to each link", async () => {
+      links = [{url: "https://mozilla.org", preview_image_url: "https://mozilla.org/preview.jog"}];
+      await feed.fetchHighlights();
+      assert.equal(feed.highlights[0].hostname, links[0].url);
+      assert.equal(feed.highlights[0].image, links[0].preview_image_url);
+    });
+    it("should not include any links already in Top Sites", async () => {
+      links = [
+        {url: "https://mozilla.org"},
+        {url: "http://www.topsite0.com"},
+        {url: "http://www.topsite1.com"},
+        {url: "http://www.topsite2.com"}
+      ];
+      await feed.fetchHighlights();
+      assert.equal(feed.highlights.length, 1);
+      assert.deepEqual(feed.highlights[0], links[0]);
+    });
+    it("should set type to bookmark if there is a bookmarkGuid", async () => {
+      links = [{url: "https://mozilla.org", type: "history", bookmarkGuid: "1234567890"}];
+      await feed.fetchHighlights();
+      assert.equal(feed.highlights[0].type, "bookmark");
+    });
+  });
+  describe("#uninit", () => {
+    it("should disable its section", () => {
+      feed.onAction({type: at.UNINIT});
+      assert.calledOnce(sectionsManagerStub.disableSection);
+      assert.calledWith(sectionsManagerStub.disableSection, SECTION_ID);
+    });
+  });
+  describe("#onAction", () => {
+    it("should fetch highlights on NEW_TAB_LOAD after update interval", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.NEW_TAB_LOAD});
+      assert.notCalled(feed.fetchHighlights);
+
+      clock.tick(HIGHLIGHTS_UPDATE_TIME);
+      feed.onAction({type: at.NEW_TAB_LOAD});
+      assert.calledOnce(feed.fetchHighlights);
+    });
+    it("should fetch highlights on NEW_TAB_LOAD if grid is empty", async () => {
+      links = [];
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.NEW_TAB_LOAD});
+      assert.calledOnce(feed.fetchHighlights);
+    });
+    it("should fetch highlights on NEW_TAB_LOAD if grid isn't full", async () => {
+      links = new Array(8).fill(null).map((v, i) => ({url: `http://www.site${i}.com`}));
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.NEW_TAB_LOAD});
+      assert.calledOnce(feed.fetchHighlights);
+    });
+    it("should fetch highlights on MIGRATION_COMPLETED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.MIGRATION_COMPLETED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, true);
+    });
+    it("should fetch highlights on PLACES_HISTORY_CLEARED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.PLACES_HISTORY_CLEARED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, true);
+    });
+    it("should fetch highlights on PLACES_LINK_DELETED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.PLACES_LINK_DELETED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, true);
+    });
+    it("should fetch highlights on PLACES_LINK_BLOCKED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.PLACES_LINK_BLOCKED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, true);
+    });
+    it("should fetch highlights on PLACES_BOOKMARK_ADDED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.PLACES_BOOKMARK_ADDED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, false);
+    });
+    it("should fetch highlights on PLACES_BOOKMARK_REMOVED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.PLACES_BOOKMARK_REMOVED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, false);
+    });
+    it("should fetch highlights on TOP_SITES_UPDATED", async () => {
+      await feed.fetchHighlights();
+      feed.fetchHighlights = sinon.spy();
+      feed.onAction({type: at.TOP_SITES_UPDATED});
+      assert.calledOnce(feed.fetchHighlights);
+      assert.calledWith(feed.fetchHighlights, false);
+    });
+  });
+});
--- a/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
@@ -1,14 +1,14 @@
 const {PlacesFeed} = require("lib/PlacesFeed.jsm");
 const {HistoryObserver, BookmarksObserver} = PlacesFeed;
 const {GlobalOverrider} = require("test/unit/utils");
 const {actionTypes: at} = require("common/Actions.jsm");
 
-const FAKE_BOOKMARK = {bookmarkGuid: "xi31", bookmarkTitle: "Foo", lastModified: 123214232, url: "foo.com"};
+const FAKE_BOOKMARK = {bookmarkGuid: "xi31", bookmarkTitle: "Foo", dateAdded: 123214232, url: "foo.com"};
 const TYPE_BOOKMARK = 0; // This is fake, for testing
 
 const BLOCKED_EVENT = "newtab-linkBlocked"; // The event dispatched in NewTabUtils when a link is blocked;
 
 describe("PlacesFeed", () => {
   let globals;
   let sandbox;
   let feed;
@@ -205,38 +205,28 @@ describe("PlacesFeed", () => {
       dispatch = sandbox.spy();
       observer = new BookmarksObserver(dispatch);
     });
     it("should have a QueryInterface property", () => {
       assert.property(observer, "QueryInterface");
     });
     describe("#onItemAdded", () => {
       beforeEach(() => {
-        // Make sure getBookmark returns our fake bookmark if it is called with the expected guid
-        sandbox.stub(global.NewTabUtils.activityStreamProvider, "getBookmark")
-          .withArgs(FAKE_BOOKMARK.guid).returns(Promise.resolve(FAKE_BOOKMARK));
       });
       it("should dispatch a PLACES_BOOKMARK_ADDED action with the bookmark data", async () => {
         // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
-        const args = [null, null, null, TYPE_BOOKMARK, null, null, null, FAKE_BOOKMARK.guid];
+        const args = [null, null, null, TYPE_BOOKMARK,
+          {spec: FAKE_BOOKMARK.url}, FAKE_BOOKMARK.bookmarkTitle,
+          FAKE_BOOKMARK.dateAdded,
+          FAKE_BOOKMARK.bookmarkGuid
+        ];
         await observer.onItemAdded(...args);
 
         assert.calledWith(dispatch, {type: at.PLACES_BOOKMARK_ADDED, data: FAKE_BOOKMARK});
       });
-      it("should catch errors gracefully", async () => {
-        const e = new Error("test error");
-        global.NewTabUtils.activityStreamProvider.getBookmark.restore();
-        sandbox.stub(global.NewTabUtils.activityStreamProvider, "getBookmark")
-          .returns(Promise.reject(e));
-
-        const args = [null, null, null, TYPE_BOOKMARK, null, null, null, FAKE_BOOKMARK.guid];
-        await observer.onItemAdded(...args);
-
-        assert.calledWith(global.Components.utils.reportError, e);
-      });
       it("should ignore events that are not of TYPE_BOOKMARK", async () => {
         const args = [null, null, null, "nottypebookmark"];
         await observer.onItemAdded(...args);
         assert.notCalled(dispatch);
       });
     });
     describe("#onItemRemoved", () => {
       it("should ignore events that are not of TYPE_BOOKMARK", async () => {
--- a/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
@@ -24,18 +24,19 @@ describe("SectionsManager", () => {
     globals.restore();
   });
 
   describe("#init", () => {
     it("should initialise the sections map with the built in sections", () => {
       SectionsManager.sections.clear();
       SectionsManager.initialized = false;
       SectionsManager.init();
-      assert.equal(SectionsManager.sections.size, 1);
+      assert.equal(SectionsManager.sections.size, 2);
       assert.ok(SectionsManager.sections.has("topstories"));
+      assert.ok(SectionsManager.sections.has("highlights"));
     });
     it("should set .initialized to true", () => {
       SectionsManager.sections.clear();
       SectionsManager.initialized = false;
       SectionsManager.init();
       assert.ok(SectionsManager.initialized);
     });
     it("should add observer for context menu prefs", () => {
@@ -210,21 +211,24 @@ describe("SectionsFeed", () => {
         [SectionsManager.UPDATE_SECTION, feed.onUpdateSection]
       ]) {
         assert.calledWith(SectionsManager.on, event, listener);
       }
     });
     it("should call onAddSection for any already added sections in SectionsManager", () => {
       SectionsManager.init();
       assert.ok(SectionsManager.sections.has("topstories"));
+      assert.ok(SectionsManager.sections.has("highlights"));
       const topstories = SectionsManager.sections.get("topstories");
+      const highlights = SectionsManager.sections.get("highlights");
       sinon.spy(feed, "onAddSection");
       feed.init();
-      assert.calledOnce(feed.onAddSection);
+      assert.calledTwice(feed.onAddSection);
       assert.calledWith(feed.onAddSection, SectionsManager.ADD_SECTION, "topstories", topstories);
+      assert.calledWith(feed.onAddSection, SectionsManager.ADD_SECTION, "highlights", highlights);
     });
   });
   describe("#uninit", () => {
     it("should unbind all listeners", () => {
       sinon.spy(SectionsManager, "off");
       feed.init();
       feed.uninit();
       assert.calledThrice(SectionsManager.off);
--- a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
@@ -10,17 +10,17 @@ const FAKE_FRECENCY = 200;
 const FAKE_LINKS = new Array(TOP_SITES_SHOWMORE_LENGTH).fill(null).map((v, i) => ({
   frecency: FAKE_FRECENCY,
   url: `http://www.site${i}.com`
 }));
 const FAKE_SCREENSHOT = "data123";
 
 function FakeTippyTopProvider() {}
 FakeTippyTopProvider.prototype = {
-  async init() {},
+  async init() { this.initialized = true; },
   processSite(site) { return site; }
 };
 
 describe("Top Sites Feed", () => {
   let TopSitesFeed;
   let DEFAULT_TOP_SITES;
   let feed;
   let globals;
@@ -242,16 +242,21 @@ describe("Top Sites Feed", () => {
       it("should check against null entries", async () => {
         fakeNewTabUtils.pinnedLinks.links = [null];
 
         await feed.getLinksWithDefaults();
       });
     });
   });
   describe("#refresh", () => {
+    it("should initialise _tippyTopProvider if it's not already initialised", async () => {
+      feed._tippyTopProvider.initialized = false;
+      await feed.refresh(action);
+      assert.ok(feed._tippyTopProvider.initialized);
+    });
     it("should dispatch an action with the links returned", async () => {
       sandbox.stub(feed, "getScreenshot");
       await feed.refresh(action);
       const reference = links.map(site => Object.assign({}, site, {hostname: shortURLStub(site)}));
 
       assert.calledOnce(feed.store.dispatch);
       assert.propertyVal(feed.store.dispatch.firstCall.args[0], "type", at.TOP_SITES_UPDATED);
       assert.deepEqual(feed.store.dispatch.firstCall.args[0].data, reference);
--- a/browser/extensions/formautofill/FormAutofillDoorhanger.jsm
+++ b/browser/extensions/formautofill/FormAutofillDoorhanger.jsm
@@ -42,16 +42,17 @@ const CONTENT = {
       id: "autofill-address-notification-icon",
       URL: "chrome://formautofill/content/formfill-anchor.svg",
       tooltiptext: GetStringFromName("openAutofillMessagePanel"),
     },
     mainAction: {
       label: GetStringFromName(changeAutofillOptsKey),
       accessKey: "C",
       callbackState: "open-pref",
+      disableHighlight: true,
     },
     options: {
       persistWhileVisible: true,
       popupIconURL: "chrome://formautofill/content/icon-address-save.svg",
       checkbox: {
         get checked() {
           return Services.prefs.getBoolPref("services.sync.engine.addresses");
         },
@@ -136,19 +137,19 @@ let FormAutofillDoorhanger = {
    * @returns {Array<Object>}
               Return the mainAction and secondary actions in an array for showing doorhanger
    */
   _createActions(mainActionParams, secondaryActionParams, resolve) {
     if (!mainActionParams) {
       return [null, null];
     }
 
-    let {label, accessKey, callbackState} = mainActionParams;
+    let {label, accessKey, disableHighlight, callbackState} = mainActionParams;
     let callback = resolve.bind(null, callbackState);
-    let mainAction = {label, accessKey, callback};
+    let mainAction = {label, accessKey, callback, disableHighlight};
 
     if (!secondaryActionParams) {
       return [mainAction, null];
     }
 
     let secondaryActions = [];
     for (let params of secondaryActionParams) {
       let cb = resolve.bind(null, params.callbackState);
--- a/browser/extensions/onboarding/content/onboarding.css
+++ b/browser/extensions/onboarding/content/onboarding.css
@@ -19,21 +19,21 @@
   display: none;
 }
 
 #onboarding-overlay.onboarding-opened {
   display: block;
 }
 
 #onboarding-overlay-button {
-  padding: 0;
+  padding: 10px 0 0 0;
   position: absolute;
   cursor: pointer;
-  top: 34px;
-  offset-inline-start: 34px;
+  top: 4px;
+  offset-inline-start: 12px;
   border: none;
   /* Set to none so no grey contrast background in the high-contrast mode */
   background: none;
   /* make sure the icon stay above the activity-stream searchbar */
   /* We want this always under #onboarding-overlay */
   z-index: 10;
 }
 
--- a/browser/extensions/onboarding/content/onboarding.js
+++ b/browser/extensions/onboarding/content/onboarding.js
@@ -17,17 +17,17 @@ const BUNDLE_URI = "chrome://onboarding/
 const UITOUR_JS_URI = "resource://onboarding/lib/UITour-lib.js";
 const TOUR_AGENT_JS_URI = "resource://onboarding/onboarding-tour-agent.js";
 const BRAND_SHORT_NAME = Services.strings
                      .createBundle("chrome://branding/locale/brand.properties")
                      .GetStringFromName("brandShortName");
 const PROMPT_COUNT_PREF = "browser.onboarding.notification.prompt-count";
 const ONBOARDING_DIALOG_ID = "onboarding-overlay-dialog";
 const ONBOARDING_MIN_WIDTH_PX = 960;
-const SPEECH_BUBBLE_MIN_WIDTH_PX = 1150;
+const SPEECH_BUBBLE_MIN_WIDTH_PX = 1130;
 
 /**
  * Add any number of tours, key is the tourId, value should follow the format below
  * "tourId": { // The short tour id which could be saved in pref
  *   // The unique tour id
  *   id: "onboarding-tour-addons",
  *   // The string id of tour name which would be displayed on the navigation bar
  *   tourNameId: "onboarding.tour-addon",
--- a/browser/modules/PingCentre.jsm
+++ b/browser/modules/PingCentre.jsm
@@ -6,16 +6,18 @@ const {interfaces: Ci, utils: Cu} = Comp
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.importGlobalProperties(["fetch"]);
 
 XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
   "resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "ClientID",
   "resource://gre/modules/ClientID.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetryEnvironment",
+  "resource://gre/modules/TelemetryEnvironment.jsm");
 
 const PREF_BRANCH = "browser.ping-centre.";
 
 const TELEMETRY_PREF = `${PREF_BRANCH}telemetry`;
 const LOGGING_PREF = `${PREF_BRANCH}log`;
 const STAGING_ENDPOINT_PREF = `${PREF_BRANCH}staging.endpoint`;
 const PRODUCTION_ENDPOINT_PREF = `${PREF_BRANCH}production.endpoint`;
 
@@ -31,16 +33,17 @@ const FHR_UPLOAD_ENABLED_PREF = "datarep
  */
 class PingCentre {
   constructor(options) {
     if (!options.topic) {
       throw new Error("Must specify topic.");
     }
 
     this._topic = options.topic;
+    this._filter = options.filter;
     this._prefs = Services.prefs.getBranch("");
 
     this._setPingEndpoint(options.topic, options.overrideEndpointPref);
 
     this._enabled = this._prefs.getBoolPref(TELEMETRY_PREF);
     this._onTelemetryPrefChange = this._onTelemetryPrefChange.bind(this);
     this._prefs.addObserver(TELEMETRY_PREF, this._onTelemetryPrefChange);
 
@@ -84,25 +87,42 @@ class PingCentre {
   _onTelemetryPrefChange(aSubject, aTopic, prefKey) {
     this._enabled = this._prefs.getBoolPref(prefKey);
   }
 
   _onFhrPrefChange(aSubject, aTopic, prefKey) {
     this._fhrEnabled = this._prefs.getBoolPref(prefKey);
   }
 
+  _createExperimentsString(activeExperiments) {
+    let experimentsString = "";
+    for (let experimentID in activeExperiments) {
+      if (!activeExperiments[experimentID] ||
+          !activeExperiments[experimentID].branch ||
+          (this._filter && !experimentID.includes(this._filter))) {
+        continue;
+      }
+      let expString = `${experimentID}:${activeExperiments[experimentID].branch}`;
+      experimentsString = experimentsString.concat(`${expString};`);
+    }
+    return experimentsString;
+  }
+
   async sendPing(data) {
+    let experiments = TelemetryEnvironment.getActiveExperiments();
+    let experimentsString = this._createExperimentsString(experiments);
     if (!this.enabled) {
       return Promise.resolve();
     }
 
     let clientID = data.client_id || await this.telemetryClientId;
     const payload = Object.assign({
       topic: this._topic,
       client_id: clientID,
+      shield_id: experimentsString,
       release_channel: AppConstants.MOZ_UPDATE_CHANNEL
     }, data);
 
     if (this.logging) {
       // performance related pings cause a lot of logging, so we mute them
       if (data.action !== "activity_stream_performance") {
         Services.console.logStringMessage(`TELEMETRY PING: ${JSON.stringify(payload)}\n`);
       }
--- a/devtools/client/locales/en-US/webide.properties
+++ b/devtools/client/locales/en-US/webide.properties
@@ -56,17 +56,16 @@ addons_unstable=unstable
 # LOCALIZATION NOTE (addons_simulator_label): This label is shown as the name of
 # a given simulator version in the "Manage Simulators" pane.  %1$S: Firefox OS
 # version in the simulator, ex. 1.3.  %2$S: Simulator stability label, ex.
 # "stable" or "unstable".
 addons_simulator_label=Firefox OS %1$S Simulator (%2$S)
 addons_install_button=install
 addons_uninstall_button=uninstall
 addons_adb_label=ADB Helper Add-on
-addons_adapters_label=Tools Adapters Add-on
 addons_adb_warning=USB devices won’t be detected without this add-on
 addons_status_unknown=?
 addons_status_installed=Installed
 addons_status_uninstalled=Not Installed
 addons_status_preparing=preparing
 addons_status_downloading=downloading
 addons_status_installing=installing
 
--- a/devtools/client/styleeditor/styleeditor-panel.js
+++ b/devtools/client/styleeditor/styleeditor-panel.js
@@ -12,19 +12,16 @@ var EventEmitter = require("devtools/sha
 
 var {StyleEditorUI} = require("resource://devtools/client/styleeditor/StyleEditorUI.jsm");
 var {getString} = require("resource://devtools/client/styleeditor/StyleEditorUtil.jsm");
 var {initCssProperties} = require("devtools/shared/fronts/css-properties");
 
 loader.lazyGetter(this, "StyleSheetsFront",
   () => require("devtools/shared/fronts/stylesheets").StyleSheetsFront);
 
-loader.lazyGetter(this, "StyleEditorFront",
-  () => require("devtools/shared/fronts/styleeditor").StyleEditorFront);
-
 var StyleEditorPanel = function StyleEditorPanel(panelWin, toolbox) {
   EventEmitter.decorate(this);
 
   this._toolbox = toolbox;
   this._target = toolbox.target;
   this._panelWin = panelWin;
   this._panelDoc = panelWin.document;
 
@@ -49,22 +46,17 @@ StyleEditorPanel.prototype = {
   open: Task.async(function* () {
     // We always interact with the target as if it were remote
     if (!this.target.isRemote) {
       yield this.target.makeRemote();
     }
 
     this.target.on("close", this.destroy);
 
-    if (this.target.form.styleSheetsActor) {
-      this._debuggee = StyleSheetsFront(this.target.client, this.target.form);
-    } else {
-      /* We're talking to a pre-Firefox 29 server-side */
-      this._debuggee = StyleEditorFront(this.target.client, this.target.form);
-    }
+    this._debuggee = StyleSheetsFront(this.target.client, this.target.form);
 
     // Initialize the CSS properties database.
     const {cssProperties} = yield initCssProperties(this._toolbox);
 
     // Initialize the UI
     this.UI = new StyleEditorUI(this._debuggee, this.target, this._panelDoc,
                                 cssProperties);
     this.UI.on("error", this._showError);
--- a/devtools/client/webide/content/addons.js
+++ b/devtools/client/webide/content/addons.js
@@ -28,17 +28,16 @@ window.addEventListener("unload", functi
 }, {capture: true, once: true});
 
 function CloseUI() {
   window.parent.UI.openProject();
 }
 
 function BuildUI(addons) {
   BuildItem(addons.adb, "adb");
-  BuildItem(addons.adapters, "adapters");
   for (let addon of addons.simulators) {
     BuildItem(addon, "simulator");
   }
 }
 
 function BuildItem(addon, type) {
 
   function onAddonUpdate(event, arg) {
@@ -77,26 +76,16 @@ function BuildItem(addon, type) {
   let name = document.createElement("span");
   name.className = "name";
 
   switch (type) {
     case "adb":
       li.setAttribute("addon", type);
       name.textContent = Strings.GetStringFromName("addons_adb_label");
       break;
-    case "adapters":
-      li.setAttribute("addon", type);
-      try {
-        name.textContent = Strings.GetStringFromName("addons_adapters_label");
-      } catch (e) {
-        // This code (bug 1081093) will be backported to Aurora, which doesn't
-        // contain this string.
-        name.textContent = "Tools Adapters Add-on";
-      }
-      break;
     case "simulator":
       li.setAttribute("addon", "simulator-" + addon.version);
       let stability = Strings.GetStringFromName("addons_" + addon.stability);
       name.textContent = Strings.formatStringFromName("addons_simulator_label", [addon.version, stability], 2);
       break;
   }
 
   li.appendChild(name);
--- a/devtools/client/webide/content/webide.js
+++ b/devtools/client/webide/content/webide.js
@@ -82,32 +82,26 @@ var UI = {
 
     AppProjects.load().then(() => {
       this.autoSelectProject();
     }, e => {
       console.error(e);
       this.reportError("error_appProjectsLoadFailed");
     });
 
-    // Auto install the ADB Addon Helper and Tools Adapters. Only once.
+    // Auto install the ADB Addon Helper. Only once.
     // If the user decides to uninstall any of this addon, we won't install it again.
     let autoinstallADBHelper = Services.prefs.getBoolPref("devtools.webide.autoinstallADBHelper");
-    let autoinstallFxdtAdapters = Services.prefs.getBoolPref("devtools.webide.autoinstallFxdtAdapters");
     if (autoinstallADBHelper) {
       GetAvailableAddons().then(addons => {
         addons.adb.install();
       }, console.error);
     }
-    if (autoinstallFxdtAdapters) {
-      GetAvailableAddons().then(addons => {
-        addons.adapters.install();
-      }, console.error);
-    }
+
     Services.prefs.setBoolPref("devtools.webide.autoinstallADBHelper", false);
-    Services.prefs.setBoolPref("devtools.webide.autoinstallFxdtAdapters", false);
 
     this.setupDeck();
 
     this.contentViewer = window.QueryInterface(Ci.nsIInterfaceRequestor)
                                .getInterface(Ci.nsIWebNavigation)
                                .QueryInterface(Ci.nsIDocShell)
                                .contentViewer;
     this.contentViewer.fullZoom = Services.prefs.getCharPref("devtools.webide.zoom");
--- a/devtools/client/webide/modules/addons.js
+++ b/devtools/client/webide/modules/addons.js
@@ -8,20 +8,18 @@ const {AddonManager} = require("resource
 const Services = require("Services");
 const {getJSON} = require("devtools/client/shared/getjson");
 const EventEmitter = require("devtools/shared/old-event-emitter");
 
 const ADDONS_URL = "devtools.webide.addonsURL";
 
 var SIMULATOR_LINK = Services.prefs.getCharPref("devtools.webide.simulatorAddonsURL");
 var ADB_LINK = Services.prefs.getCharPref("devtools.webide.adbAddonURL");
-var ADAPTERS_LINK = Services.prefs.getCharPref("devtools.webide.adaptersAddonURL");
 var SIMULATOR_ADDON_ID = Services.prefs.getCharPref("devtools.webide.simulatorAddonID");
 var ADB_ADDON_ID = Services.prefs.getCharPref("devtools.webide.adbAddonID");
-var ADAPTERS_ADDON_ID = Services.prefs.getCharPref("devtools.webide.adaptersAddonID");
 
 var platform = Services.appShell.hiddenDOMWindow.navigator.platform;
 var OS = "";
 if (platform.indexOf("Win") != -1) {
   OS = "win32";
 } else if (platform.indexOf("Mac") != -1) {
   OS = "mac64";
 } else if (platform.indexOf("Linux") != -1) {
@@ -33,17 +31,17 @@ if (platform.indexOf("Win") != -1) {
 }
 
 var addonsListener = {};
 addonsListener.onEnabled =
 addonsListener.onDisabled =
 addonsListener.onInstalled =
 addonsListener.onUninstalled = (updatedAddon) => {
   GetAvailableAddons().then(addons => {
-    for (let a of [...addons.simulators, addons.adb, addons.adapters]) {
+    for (let a of [...addons.simulators, addons.adb]) {
       if (a.addonID == updatedAddon.id) {
         a.updateInstallStatus();
       }
     }
   });
 };
 AddonManager.addAddonListener(addonsListener);
 
@@ -57,17 +55,16 @@ var GetAvailableAddons = exports.GetAvai
       };
       getJSON(ADDONS_URL).then(json => {
         for (let stability in json) {
           for (let version of json[stability]) {
             addons.simulators.push(new SimulatorAddon(stability, version));
           }
         }
         addons.adb = new ADBAddon();
-        addons.adapters = new AdaptersAddon();
         resolve(addons);
       }, e => {
         GetAvailableAddons_promise = null;
         reject(e);
       });
     });
   }
   return GetAvailableAddons_promise;
@@ -181,16 +178,8 @@ function ADBAddon() {
   EventEmitter.decorate(this);
   // This addon uses the string "linux" for "linux32"
   let fixedOS = OS == "linux32" ? "linux" : OS;
   this.xpiLink = ADB_LINK.replace(/#OS#/g, fixedOS);
   this.addonID = ADB_ADDON_ID;
   this.updateInstallStatus();
 }
 ADBAddon.prototype = Object.create(Addon.prototype);
-
-function AdaptersAddon() {
-  EventEmitter.decorate(this);
-  this.xpiLink = ADAPTERS_LINK.replace(/#OS#/g, OS);
-  this.addonID = ADAPTERS_ADDON_ID;
-  this.updateInstallStatus();
-}
-AdaptersAddon.prototype = Object.create(Addon.prototype);
--- a/devtools/client/webide/modules/project-list.js
+++ b/devtools/client/webide/modules/project-list.js
@@ -161,17 +161,17 @@ ProjectList.prototype = {
 
     for (let i = 0; i < tabs.length; i++) {
       let tab = tabs[i];
       let URL = this._parentWindow.URL;
       let url;
       try {
         url = new URL(tab.url);
       } catch (e) {
-        // Don't try to handle invalid URLs, especially from Valence.
+        // Don't try to handle invalid URLs
         continue;
       }
       // Wanted to use nsIFaviconService here, but it only works for visited
       // tabs, so that's no help for any remote tabs.  Maybe some favicon wizard
       // knows how to get high-res favicons easily, or we could offer actor
       // support for this (bug 1061654).
       if (url.origin) {
         tab.favicon = url.origin + "/favicon.ico";
deleted file mode 100644
index 5a512ae3d199746350c650e527b0178411b0440e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 5a512ae3d199746350c650e527b0178411b0440e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 5a512ae3d199746350c650e527b0178411b0440e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 5a512ae3d199746350c650e527b0178411b0440e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/devtools/client/webide/test/chrome.ini
+++ b/devtools/client/webide/test/chrome.ini
@@ -21,20 +21,16 @@ support-files =
   addons/fxos_3_0_tv_simulator-linux.xpi
   addons/fxos_3_0_tv_simulator-linux64.xpi
   addons/fxos_3_0_tv_simulator-win32.xpi
   addons/fxos_3_0_tv_simulator-mac64.xpi
   addons/adbhelper-linux.xpi
   addons/adbhelper-linux64.xpi
   addons/adbhelper-win32.xpi
   addons/adbhelper-mac64.xpi
-  addons/fxdt-adapters-linux32.xpi
-  addons/fxdt-adapters-linux64.xpi
-  addons/fxdt-adapters-win32.xpi
-  addons/fxdt-adapters-mac64.xpi
   build_app1/package.json
   build_app2/manifest.webapp
   build_app2/package.json
   build_app2/stage/empty-directory
   build_app_windows1/package.json
   build_app_windows2/manifest.webapp
   build_app_windows2/package.json
   build_app_windows2/stage/empty-directory
@@ -44,17 +40,17 @@ support-files =
   templates.json
   ../../shared/test/browser_devices.json
   validator/*
 
 [test_basic.html]
 [test_newapp.html]
 skip-if = (os == "win" && os_version == "10.0") # Bug 1197053
 [test_import.html]
-skip-if = (os == "linux") # Bug 1024734 
+skip-if = (os == "linux") # Bug 1024734
 [test_duplicate_import.html]
 [test_runtime.html]
 [test_manifestUpdate.html]
 [test_addons.html]
 skip-if = true # Bug 1201392 - Update add-ons after migration
 [test_device_runtime.html]
 [test_autoconnect_runtime.html]
 [test_autoselect_project.html]
--- a/devtools/client/webide/test/head.js
+++ b/devtools/client/webide/test/head.js
@@ -24,38 +24,35 @@ if (window.location === "chrome://browse
 }
 
 Services.prefs.setBoolPref("devtools.webide.enabled", true);
 Services.prefs.setBoolPref("devtools.webide.enableLocalRuntime", true);
 
 Services.prefs.setCharPref("devtools.webide.addonsURL", TEST_BASE + "addons/simulators.json");
 Services.prefs.setCharPref("devtools.webide.simulatorAddonsURL", TEST_BASE + "addons/fxos_#SLASHED_VERSION#_simulator-#OS#.xpi");
 Services.prefs.setCharPref("devtools.webide.adbAddonURL", TEST_BASE + "addons/adbhelper-#OS#.xpi");
-Services.prefs.setCharPref("devtools.webide.adaptersAddonURL", TEST_BASE + "addons/fxdt-adapters-#OS#.xpi");
 Services.prefs.setCharPref("devtools.webide.templatesURL", TEST_BASE + "templates.json");
 Services.prefs.setCharPref("devtools.devices.url", TEST_BASE + "browser_devices.json");
 
 var registerCleanupFunction = registerCleanupFunction ||
                               SimpleTest.registerCleanupFunction;
 registerCleanupFunction(() => {
   flags.testing = false;
   Services.prefs.clearUserPref("devtools.webide.enabled");
   Services.prefs.clearUserPref("devtools.webide.enableLocalRuntime");
   Services.prefs.clearUserPref("devtools.webide.autoinstallADBHelper");
-  Services.prefs.clearUserPref("devtools.webide.autoinstallFxdtAdapters");
   Services.prefs.clearUserPref("devtools.webide.busyTimeout");
   Services.prefs.clearUserPref("devtools.webide.lastSelectedProject");
   Services.prefs.clearUserPref("devtools.webide.lastConnectedRuntime");
 });
 
 var openWebIDE = Task.async(function* (autoInstallAddons) {
   info("opening WebIDE");
 
   Services.prefs.setBoolPref("devtools.webide.autoinstallADBHelper", !!autoInstallAddons);
-  Services.prefs.setBoolPref("devtools.webide.autoinstallFxdtAdapters", !!autoInstallAddons);
 
   let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
   let win = ww.openWindow(null, "chrome://webide/content/", "webide", "chrome,centerscreen,resizable", null);
 
   yield new Promise(resolve => {
     win.addEventListener("load", function () {
       SimpleTest.requestCompleteLog();
       SimpleTest.executeSoon(resolve);
--- a/devtools/client/webide/webide-prefs.js
+++ b/devtools/client/webide/webide-prefs.js
@@ -1,24 +1,21 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
    file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 pref("devtools.webide.templatesURL", "https://code.cdn.mozilla.net/templates/list.json");
 pref("devtools.webide.autoinstallADBHelper", true);
-pref("devtools.webide.autoinstallFxdtAdapters", true);
 pref("devtools.webide.autoConnectRuntime", true);
 pref("devtools.webide.restoreLastProject", true);
 pref("devtools.webide.enableLocalRuntime", false);
 pref("devtools.webide.addonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/index.json");
 pref("devtools.webide.simulatorAddonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/#VERSION#/#OS#/fxos_#SLASHED_VERSION#_simulator-#OS#-latest.xpi");
 pref("devtools.webide.simulatorAddonID", "fxos_#SLASHED_VERSION#_simulator@mozilla.org");
 pref("devtools.webide.simulatorAddonRegExp", "fxos_(.*)_simulator@mozilla\\.org$");
 pref("devtools.webide.adbAddonURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/adb-helper/#OS#/adbhelper-#OS#-latest.xpi");
 pref("devtools.webide.adbAddonID", "adbhelper@mozilla.org");
-pref("devtools.webide.adaptersAddonURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/valence/#OS#/valence-#OS#-latest.xpi");
-pref("devtools.webide.adaptersAddonID", "fxdevtools-adapters@mozilla.org");
 pref("devtools.webide.monitorWebSocketURL", "ws://localhost:9000");
 pref("devtools.webide.lastConnectedRuntime", "");
 pref("devtools.webide.lastSelectedProject", "");
 pref("devtools.webide.logSimulatorOutput", false);
 pref("devtools.webide.zoom", "1");
 pref("devtools.webide.busyTimeout", 10000);
--- a/devtools/server/actors/moz.build
+++ b/devtools/server/actors/moz.build
@@ -49,17 +49,16 @@ DevToolsModules(
     'process.js',
     'promises.js',
     'reflow.js',
     'root.js',
     'script.js',
     'source.js',
     'storage.js',
     'string.js',
-    'styleeditor.js',
     'styles.js',
     'stylesheets.js',
     'tab.js',
     'timeline.js',
     'webaudio.js',
     'webbrowser.js',
     'webconsole.js',
     'webextension-inspected-window.js',
@@ -96,17 +95,17 @@ with Files('performance*'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Performance Tools (Profiler/Timeline)')
 
 with Files('source.js'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Debugger')
 
 with Files('storage.js'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Storage Inspector')
 
-with Files('styleeditor.js'):
+with Files('stylesheets.js'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Style Editor')
 
 with Files('webaudio.js'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Web Audio Editor')
 
 with Files('webconsole.js'):
     BUG_COMPONENT = ('Firefox', 'Developer Tools: Console')
 
deleted file mode 100644
--- a/devtools/server/actors/styleeditor.js
+++ /dev/null
@@ -1,497 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const {Cc, Ci} = require("chrome");
-const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
-const promise = require("promise");
-const protocol = require("devtools/shared/protocol");
-const {fetch} = require("devtools/shared/DevToolsUtils");
-const {oldStyleSheetSpec, styleEditorSpec} = require("devtools/shared/specs/styleeditor");
-
-loader.lazyGetter(this, "CssLogic", () => require("devtools/shared/inspector/css-logic"));
-
-var TRANSITION_CLASS = "moz-styleeditor-transitioning";
-var TRANSITION_DURATION_MS = 500;
-var TRANSITION_RULE = ":root.moz-styleeditor-transitioning, " +
-                      ":root.moz-styleeditor-transitioning * {\n" +
-                        "transition-duration: " + TRANSITION_DURATION_MS +
-                          "ms !important;\n" +
-                        "transition-delay: 0ms !important;\n" +
-                        "transition-timing-function: ease-out !important;\n" +
-                        "transition-property: all !important;\n" +
-                      "}";
-
-var OldStyleSheetActor = protocol.ActorClassWithSpec(oldStyleSheetSpec, {
-  toString: function () {
-    return "[OldStyleSheetActor " + this.actorID + "]";
-  },
-
-  /**
-   * Window of target
-   */
-  get window() {
-    return this._window || this.parentActor.window;
-  },
-
-  /**
-   * Document of target.
-   */
-  get document() {
-    return this.window.document;
-  },
-
-  /**
-   * URL of underlying stylesheet.
-   */
-  get href() {
-    return this.rawSheet.href;
-  },
-
-  /**
-   * Retrieve the index (order) of stylesheet in the document.
-   *
-   * @return number
-   */
-  get styleSheetIndex() {
-    if (this._styleSheetIndex == -1) {
-      for (let i = 0; i < this.document.styleSheets.length; i++) {
-        if (this.document.styleSheets[i] == this.rawSheet) {
-          this._styleSheetIndex = i;
-          break;
-        }
-      }
-    }
-    return this._styleSheetIndex;
-  },
-
-  initialize: function (styleSheet, parentActor, window) {
-    protocol.Actor.prototype.initialize.call(this, null);
-
-    this.rawSheet = styleSheet;
-    this.parentActor = parentActor;
-    this.conn = this.parentActor.conn;
-
-    this._window = window;
-
-    // text and index are unknown until source load
-    this.text = null;
-    this._styleSheetIndex = -1;
-
-    this._transitionRefCount = 0;
-
-    // if this sheet has an @import, then it's rules are loaded async
-    let ownerNode = this.rawSheet.ownerNode;
-    if (ownerNode) {
-      let onSheetLoaded = (event) => {
-        ownerNode.removeEventListener("load", onSheetLoaded);
-        this._notifyPropertyChanged("ruleCount");
-      };
-
-      ownerNode.addEventListener("load", onSheetLoaded);
-    }
-  },
-
-  /**
-   * Get the current state of the actor
-   *
-   * @return {object}
-   *         With properties of the underlying stylesheet, plus 'text',
-   *        'styleSheetIndex' and 'parentActor' if it's @imported
-   */
-  form: function (detail) {
-    if (detail === "actorid") {
-      return this.actorID;
-    }
-
-    let docHref;
-    if (this.rawSheet.ownerNode) {
-      if (this.rawSheet.ownerNode instanceof Ci.nsIDOMHTMLDocument) {
-        docHref = this.rawSheet.ownerNode.location.href;
-      }
-      if (this.rawSheet.ownerNode.ownerDocument) {
-        docHref = this.rawSheet.ownerNode.ownerDocument.location.href;
-      }
-    }
-
-    let form = {
-      actor: this.actorID,  // actorID is set when this actor is added to a pool
-      href: this.href,
-      nodeHref: docHref,
-      disabled: this.rawSheet.disabled,
-      title: this.rawSheet.title,
-      system: !CssLogic.isContentStylesheet(this.rawSheet),
-      styleSheetIndex: this.styleSheetIndex
-    };
-
-    try {
-      form.ruleCount = this.rawSheet.cssRules.length;
-    } catch (e) {
-      // stylesheet had an @import rule that wasn't loaded yet
-    }
-    return form;
-  },
-
-  /**
-   * Toggle the disabled property of the style sheet
-   *
-   * @return {object}
-   *         'disabled' - the disabled state after toggling.
-   */
-  toggleDisabled: function () {
-    this.rawSheet.disabled = !this.rawSheet.disabled;
-    this._notifyPropertyChanged("disabled");
-
-    return this.rawSheet.disabled;
-  },
-
-  /**
-   * Send an event notifying that a property of the stylesheet
-   * has changed.
-   *
-   * @param  {string} property
-   *         Name of the changed property
-   */
-  _notifyPropertyChanged: function (property) {
-    this.emit("property-change", property, this.form()[property]);
-  },
-
-   /**
-    * Fetch the source of the style sheet from its URL. Send a "sourceLoad"
-    * event when it's been fetched.
-    */
-  fetchSource: function () {
-    this._getText().then((content) => {
-      this.emit("source-load", this.text);
-    });
-  },
-
-  /**
-   * Fetch the text for this stylesheet from the cache or network. Return
-   * cached text if it's already been fetched.
-   *
-   * @return {Promise}
-   *         Promise that resolves with a string text of the stylesheet.
-   */
-  _getText: function () {
-    if (this.text) {
-      return promise.resolve(this.text);
-    }
-
-    if (!this.href) {
-      // this is an inline <style> sheet
-      let content = this.rawSheet.ownerNode.textContent;
-      this.text = content;
-      return promise.resolve(content);
-    }
-
-    let options = {
-      policy: Ci.nsIContentPolicy.TYPE_INTERNAL_STYLESHEET,
-      window: this.window,
-      charset: this._getCSSCharset()
-    };
-
-    return fetch(this.href, options).then(({ content }) => {
-      this.text = content;
-      return content;
-    });
-  },
-
-  /**
-   * Get the charset of the stylesheet according to the character set rules
-   * defined in <http://www.w3.org/TR/CSS2/syndata.html#charset>.
-   * Note that some of the algorithm is implemented in DevToolsUtils.fetch.
-   */
-  _getCSSCharset: function () {
-    let sheet = this.rawSheet;
-    if (sheet) {
-      // Do we have a @charset rule in the stylesheet?
-      // step 2 of syndata.html (without the BOM check).
-      if (sheet.cssRules) {
-        let rules = sheet.cssRules;
-        if (rules.length
-            && rules.item(0).type == Ci.nsIDOMCSSRule.CHARSET_RULE) {
-          return rules.item(0).encoding;
-        }
-      }
-
-      // step 3: charset attribute of <link> or <style> element, if it exists
-      if (sheet.ownerNode && sheet.ownerNode.getAttribute) {
-        let linkCharset = sheet.ownerNode.getAttribute("charset");
-        if (linkCharset != null) {
-          return linkCharset;
-        }
-      }
-
-      // step 4 (1 of 2): charset of referring stylesheet.
-      let parentSheet = sheet.parentStyleSheet;
-      if (parentSheet && parentSheet.cssRules &&
-          parentSheet.cssRules[0].type == Ci.nsIDOMCSSRule.CHARSET_RULE) {
-        return parentSheet.cssRules[0].encoding;
-      }
-
-      // step 4 (2 of 2): charset of referring document.
-      if (sheet.ownerNode && sheet.ownerNode.ownerDocument.characterSet) {
-        return sheet.ownerNode.ownerDocument.characterSet;
-      }
-    }
-
-    // step 5: default to utf-8.
-    return "UTF-8";
-  },
-
-  /**
-   * Update the style sheet in place with new text.
-   *
-   * @param  {object} request
-   *         'text' - new text
-   *         'transition' - whether to do CSS transition for change.
-   */
-  update: function (text, transition) {
-    DOMUtils.parseStyleSheet(this.rawSheet, text);
-
-    this.text = text;
-
-    this._notifyPropertyChanged("ruleCount");
-
-    if (transition) {
-      this._insertTransistionRule();
-    } else {
-      this._notifyStyleApplied();
-    }
-  },
-
-  /**
-   * Insert a catch-all transition rule into the document. Set a timeout
-   * to remove the rule after a certain time.
-   */
-  _insertTransistionRule: function () {
-    // Insert the global transition rule
-    // Use a ref count to make sure we do not add it multiple times.. and remove
-    // it only when all pending StyleEditor-generated transitions ended.
-    if (this._transitionRefCount == 0) {
-      this.rawSheet.insertRule(TRANSITION_RULE, this.rawSheet.cssRules.length);
-      this.document.documentElement.classList.add(TRANSITION_CLASS);
-    }
-
-    this._transitionRefCount++;
-
-    // Set up clean up and commit after transition duration (+10% buffer)
-    // @see _onTransitionEnd
-    this.window.setTimeout(this._onTransitionEnd.bind(this),
-                           Math.floor(TRANSITION_DURATION_MS * 1.1));
-  },
-
-  /**
-    * This cleans up class and rule added for transition effect and then
-    * notifies that the style has been applied.
-    */
-  _onTransitionEnd: function () {
-    if (--this._transitionRefCount == 0) {
-      this.document.documentElement.classList.remove(TRANSITION_CLASS);
-      this.rawSheet.deleteRule(this.rawSheet.cssRules.length - 1);
-    }
-
-    this.emit("style-applied");
-  }
-});
-
-exports.OldStyleSheetActor = OldStyleSheetActor;
-
-/**
- * Creates a StyleEditorActor. StyleEditorActor provides remote access to the
- * stylesheets of a document.
- */
-var StyleEditorActor = protocol.ActorClassWithSpec(styleEditorSpec, {
-  /**
-   * The window we work with, taken from the parent actor.
-   */
-  get window() {
-    return this.parentActor.window;
-  },
-
-  /**
-   * The current content document of the window we work with.
-   */
-  get document() {
-    return this.window.document;
-  },
-
-  form: function () {
-    return { actor: this.actorID };
-  },
-
-  initialize: function (conn, tabActor) {
-    protocol.Actor.prototype.initialize.call(this, null);
-
-    this.parentActor = tabActor;
-
-    // keep a map of sheets-to-actors so we don't create two actors for one sheet
-    this._sheets = new Map();
-  },
-
-  /**
-   * Destroy the current StyleEditorActor instance.
-   */
-  destroy: function () {
-    this._sheets.clear();
-  },
-
-  /**
-   * Called by client when target navigates to a new document.
-   * Adds load listeners to document.
-   */
-  newDocument: function () {
-    // delete previous document's actors
-    this._clearStyleSheetActors();
-
-    // Note: listening for load won't be necessary once
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=839103 is fixed
-    if (this.document.readyState == "complete") {
-      this._onDocumentLoaded();
-    } else {
-      this.window.addEventListener("load", this._onDocumentLoaded);
-    }
-    return {};
-  },
-
-  /**
-   * Event handler for document loaded event. Add actor for each stylesheet
-   * and send an event notifying of the load
-   */
-  _onDocumentLoaded: function (event) {
-    if (event) {
-      this.window.removeEventListener("load", this._onDocumentLoaded);
-    }
-
-    let documents = [this.document];
-    let forms = [];
-    for (let doc of documents) {
-      let sheetForms = this._addStyleSheets(doc.styleSheets);
-      forms = forms.concat(sheetForms);
-      // Recursively handle style sheets of the documents in iframes.
-      for (let iframe of doc.getElementsByTagName("iframe")) {
-        documents.push(iframe.contentDocument);
-      }
-    }
-
-    this.emit("document-load", forms);
-  },
-
-  /**
-   * Add all the stylesheets to the map and create an actor for each one
-   * if not already created. Send event that there are new stylesheets.
-   *
-   * @param {[DOMStyleSheet]} styleSheets
-   *        Stylesheets to add
-   * @return {[object]}
-   *         Array of actors for each StyleSheetActor created
-   */
-  _addStyleSheets: function (styleSheets) {
-    let sheets = [];
-    for (let i = 0; i < styleSheets.length; i++) {
-      let styleSheet = styleSheets[i];
-      sheets.push(styleSheet);
-
-      // Get all sheets, including imported ones
-      let imports = this._getImported(styleSheet);
-      sheets = sheets.concat(imports);
-    }
-    let actors = sheets.map(this._createStyleSheetActor.bind(this));
-
-    return actors;
-  },
-
-  /**
-   * Create a new actor for a style sheet, if it hasn't already been created.
-   *
-   * @param  {DOMStyleSheet} styleSheet
-   *         The style sheet to create an actor for.
-   * @return {StyleSheetActor}
-   *         The actor for this style sheet
-   */
-  _createStyleSheetActor: function (styleSheet) {
-    if (this._sheets.has(styleSheet)) {
-      return this._sheets.get(styleSheet);
-    }
-    let actor = new OldStyleSheetActor(styleSheet, this);
-
-    this.manage(actor);
-    this._sheets.set(styleSheet, actor);
-
-    return actor;
-  },
-
-  /**
-   * Get all the stylesheets @imported from a stylesheet.
-   *
-   * @param  {DOMStyleSheet} styleSheet
-   *         Style sheet to search
-   * @return {array}
-   *         All the imported stylesheets
-   */
-  _getImported: function (styleSheet) {
-    let imported = [];
-
-    for (let i = 0; i < styleSheet.cssRules.length; i++) {
-      let rule = styleSheet.cssRules[i];
-      if (rule.type == Ci.nsIDOMCSSRule.IMPORT_RULE) {
-        // Associated styleSheet may be null if it has already been seen due to
-        // duplicate @imports for the same URL.
-        if (!rule.styleSheet) {
-          continue;
-        }
-        imported.push(rule.styleSheet);
-
-        // recurse imports in this stylesheet as well
-        imported = imported.concat(this._getImported(rule.styleSheet));
-      } else if (rule.type != Ci.nsIDOMCSSRule.CHARSET_RULE) {
-        // @import rules must precede all others except @charset
-        break;
-      }
-    }
-    return imported;
-  },
-
-  /**
-   * Clear all the current stylesheet actors in map.
-   */
-  _clearStyleSheetActors: function () {
-    for (let actor in this._sheets) {
-      this.unmanage(this._sheets[actor]);
-    }
-    this._sheets.clear();
-  },
-
-  /**
-   * Create a new style sheet in the document with the given text.
-   * Return an actor for it.
-   *
-   * @param  {object} request
-   *         Debugging protocol request object, with 'text property'
-   * @return {object}
-   *         Object with 'styelSheet' property for form on new actor.
-   */
-  newStyleSheet: function (text) {
-    let parent = this.document.documentElement;
-    let style = this.document.createElementNS("http://www.w3.org/1999/xhtml", "style");
-    style.setAttribute("type", "text/css");
-
-    if (text) {
-      style.appendChild(this.document.createTextNode(text));
-    }
-    parent.appendChild(style);
-
-    let actor = this._createStyleSheetActor(style.sheet);
-    return actor;
-  }
-});
-
-XPCOMUtils.defineLazyGetter(this, "DOMUtils", function () {
-  return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
-});
-
-exports.StyleEditorActor = StyleEditorActor;
-
--- a/devtools/shared/css/generated/properties-db.js
+++ b/devtools/shared/css/generated/properties-db.js
@@ -3414,17 +3414,16 @@ exports.CSS_PROPERTIES = {
       "flip",
       "flow-root",
       "forwards",
       "from-image",
       "full-width",
       "geometricprecision",
       "grab",
       "grabbing",
-      "grayscale",
       "grid",
       "groove",
       "groupbox",
       "hanging",
       "hard-light",
       "help",
       "hidden",
       "hide",
@@ -6694,26 +6693,23 @@ exports.CSS_PROPERTIES = {
   "grid": {
     "isInherited": false,
     "subproperties": [
       "grid-template-areas",
       "grid-template-rows",
       "grid-template-columns",
       "grid-auto-flow",
       "grid-auto-rows",
-      "grid-auto-columns",
-      "grid-row-gap",
-      "grid-column-gap"
-    ],
-    "supports": [
-      6,
-      8
-    ],
-    "values": [
-      "calc",
+      "grid-auto-columns"
+    ],
+    "supports": [
+      6,
+      8
+    ],
+    "values": [
       "column",
       "dense",
       "inherit",
       "initial",
       "max-content",
       "min-content",
       "row",
       "unset"
deleted file mode 100644
--- a/devtools/shared/fronts/styleeditor.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-"use strict";
-
-const { SimpleStringFront } = require("devtools/shared/fronts/string");
-const { Front, FrontClassWithSpec } = require("devtools/shared/protocol");
-const {
-  oldStyleSheetSpec,
-  styleEditorSpec
-} = require("devtools/shared/specs/styleeditor");
-const promise = require("promise");
-const defer = require("devtools/shared/defer");
-
-/**
- * StyleSheetFront is the client-side counterpart to a StyleSheetActor.
- */
-const OldStyleSheetFront = FrontClassWithSpec(oldStyleSheetSpec, {
-  initialize: function (conn, form, ctx, detail) {
-    Front.prototype.initialize.call(this, conn, form, ctx, detail);
-
-    this._onPropertyChange = this._onPropertyChange.bind(this);
-    this.on("property-change", this._onPropertyChange);
-  },
-
-  destroy: function () {
-    this.off("property-change", this._onPropertyChange);
-
-    Front.prototype.destroy.call(this);
-  },
-
-  _onPropertyChange: function (property, value) {
-    this._form[property] = value;
-  },
-
-  form: function (form, detail) {
-    if (detail === "actorid") {
-      this.actorID = form;
-      return;
-    }
-    this.actorID = form.actor;
-    this._form = form;
-  },
-
-  getText: function () {
-    let deferred = defer();
-
-    this.once("source-load", (source) => {
-      let longStr = new SimpleStringFront(source);
-      deferred.resolve(longStr);
-    });
-    this.fetchSource();
-
-    return deferred.promise;
-  },
-
-  getOriginalSources: function () {
-    return promise.resolve([]);
-  },
-
-  get href() {
-    return this._form.href;
-  },
-  get nodeHref() {
-    return this._form.nodeHref;
-  },
-  get disabled() {
-    return !!this._form.disabled;
-  },
-  get title() {
-    return this._form.title;
-  },
-  get isSystem() {
-    return this._form.system;
-  },
-  get styleSheetIndex() {
-    return this._form.styleSheetIndex;
-  },
-  get ruleCount() {
-    return this._form.ruleCount;
-  }
-});
-
-exports.OldStyleSheetFront = OldStyleSheetFront;
-
-/**
- * The corresponding Front object for the StyleEditorActor.
- */
-const StyleEditorFront = FrontClassWithSpec(styleEditorSpec, {
-  initialize: function (client, tabForm) {
-    Front.prototype.initialize.call(this, client);
-    this.actorID = tabForm.styleEditorActor;
-    this.manage(this);
-  },
-
-  getStyleSheets: function () {
-    let deferred = defer();
-
-    this.once("document-load", (styleSheets) => {
-      deferred.resolve(styleSheets);
-    });
-    this.newDocument();
-
-    return deferred.promise;
-  },
-
-  addStyleSheet: function (text) {
-    return this.newStyleSheet(text);
-  }
-});
-
-exports.StyleEditorFront = StyleEditorFront;
--- a/devtools/shared/specs/moz.build
+++ b/devtools/shared/specs/moz.build
@@ -32,17 +32,16 @@ DevToolsModules(
     'performance.js',
     'preference.js',
     'promises.js',
     'reflow.js',
     'script.js',
     'source.js',
     'storage.js',
     'string.js',
-    'styleeditor.js',
     'styles.js',
     'stylesheets.js',
     'timeline.js',
     'webaudio.js',
     'webextension-inspected-window.js',
     'webextension-parent.js',
     'webgl.js',
     'worker.js'
deleted file mode 100644
--- a/devtools/shared/specs/styleeditor.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-"use strict";
-
-const { Arg, RetVal, generateActorSpec } = require("devtools/shared/protocol");
-
-const oldStyleSheetSpec = generateActorSpec({
-  typeName: "old-stylesheet",
-
-  events: {
-    "property-change": {
-      type: "propertyChange",
-      property: Arg(0, "string"),
-      value: Arg(1, "json")
-    },
-    "source-load": {
-      type: "sourceLoad",
-      source: Arg(0, "string")
-    },
-    "style-applied": {
-      type: "styleApplied"
-    }
-  },
-
-  methods: {
-    toggleDisabled: {
-      response: { disabled: RetVal("boolean")}
-    },
-    fetchSource: {},
-    update: {
-      request: {
-        text: Arg(0, "string"),
-        transition: Arg(1, "boolean")
-      }
-    }
-  }
-});
-
-exports.oldStyleSheetSpec = oldStyleSheetSpec;
-
-const styleEditorSpec = generateActorSpec({
-  typeName: "styleeditor",
-
-  events: {
-    "document-load": {
-      type: "documentLoad",
-      styleSheets: Arg(0, "array:old-stylesheet")
-    }
-  },
-
-  method: {
-    newDocument: {},
-    newStyleSheet: {
-      request: { text: Arg(0, "string") },
-      response: { styleSheet: RetVal("old-stylesheet") }
-    }
-  }
-});
-
-exports.styleEditorSpec = styleEditorSpec;
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -13673,17 +13673,18 @@ nsDocShell::EnsureFind()
   // set that up each time.
 
   nsIScriptGlobalObject* scriptGO = GetScriptGlobalObject();
   NS_ENSURE_TRUE(scriptGO, NS_ERROR_UNEXPECTED);
 
   // default to our window
   nsCOMPtr<nsPIDOMWindowOuter> ourWindow = do_QueryInterface(scriptGO);
   nsCOMPtr<nsPIDOMWindowOuter> windowToSearch;
-  nsFocusManager::GetFocusedDescendant(ourWindow, true,
+  nsFocusManager::GetFocusedDescendant(ourWindow,
+                                       nsFocusManager::eIncludeAllDescendants,
                                        getter_AddRefs(windowToSearch));
 
   nsCOMPtr<nsIWebBrowserFindInFrames> findInFrames = do_QueryInterface(mFind);
   if (!findInFrames) {
     return NS_ERROR_NO_INTERFACE;
   }
 
   rv = findInFrames->SetRootSearchFrame(ourWindow);
@@ -13988,17 +13989,18 @@ nsDocShell::GetControllerForCommand(cons
   NS_ENSURE_ARG_POINTER(aResult);
   *aResult = nullptr;
 
   NS_ENSURE_TRUE(mScriptGlobal, NS_ERROR_FAILURE);
 
   nsCOMPtr<nsPIWindowRoot> root = mScriptGlobal->GetTopWindowRoot();
   NS_ENSURE_TRUE(root, NS_ERROR_FAILURE);
 
-  return root->GetControllerForCommand(aCommand, aResult);
+  return root->GetControllerForCommand(aCommand, false /* for any window */,
+                                       aResult);
 }
 
 NS_IMETHODIMP
 nsDocShell::IsCommandEnabled(const char* aCommand, bool* aResult)
 {
   NS_ENSURE_ARG_POINTER(aResult);
   *aResult = false;
 
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -2153,17 +2153,19 @@ Element::ShouldBlur(nsIContent *aContent
     return false;
 
   nsCOMPtr<nsPIDOMWindowOuter> window = document->GetWindow();
   if (!window)
     return false;
 
   nsCOMPtr<nsPIDOMWindowOuter> focusedFrame;
   nsIContent* contentToBlur =
-    nsFocusManager::GetFocusedDescendant(window, false, getter_AddRefs(focusedFrame));
+    nsFocusManager::GetFocusedDescendant(window,
+                                         nsFocusManager::eOnlyCurrentWindow,
+                                         getter_AddRefs(focusedFrame));
   if (contentToBlur == aContent)
     return true;
 
   // if focus on this element would get redirected, then check the redirected
   // content as well when blurring.
   return (contentToBlur && nsFocusManager::GetRedirectedFocus(aContent) == contentToBlur);
 }
 
--- a/dom/base/Selection.cpp
+++ b/dom/base/Selection.cpp
@@ -3827,17 +3827,19 @@ Selection::NotifySelectionListeners()
     // If the document is in design mode or doesn't have contenteditable
     // element, we don't need to move focus.
     if (window && document && !document->HasFlag(NODE_IS_EDITABLE) &&
         GetHTMLEditor()) {
       RefPtr<Element> newEditingHost = GetCommonEditingHostForAllRanges();
       nsFocusManager* fm = nsFocusManager::GetFocusManager();
       nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
       nsIContent* focusedContent =
-        fm->GetFocusedDescendant(window, false, getter_AddRefs(focusedWindow));
+        nsFocusManager::GetFocusedDescendant(window,
+                                             nsFocusManager::eOnlyCurrentWindow,
+                                             getter_AddRefs(focusedWindow));
       nsCOMPtr<Element> focusedElement = do_QueryInterface(focusedContent);
       // When all selected ranges are in an editing host, it should take focus.
       // But otherwise, we shouldn't move focus since Chromium doesn't move
       // focus but only selection range is updated.
       if (newEditingHost && newEditingHost != focusedElement) {
         MOZ_ASSERT(!newEditingHost->IsInNativeAnonymousSubtree());
         nsCOMPtr<nsIDOMElement> domElementToFocus =
           do_QueryInterface(newEditingHost->AsDOMNode());
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -3599,17 +3599,18 @@ nsDocument::GetActiveElement(nsIDOMEleme
 
 Element*
 nsIDocument::GetActiveElement()
 {
   // Get the focused element.
   if (nsCOMPtr<nsPIDOMWindowOuter> window = GetWindow()) {
     nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
     nsIContent* focusedContent =
-      nsFocusManager::GetFocusedDescendant(window, false,
+      nsFocusManager::GetFocusedDescendant(window,
+                                           nsFocusManager::eOnlyCurrentWindow,
                                            getter_AddRefs(focusedWindow));
     // be safe and make sure the element is from this document
     if (focusedContent && focusedContent->OwnerDoc() == this) {
       if (focusedContent->ChromeOnlyAccess()) {
         focusedContent = focusedContent->FindFirstNonChromeOnlyAccessContent();
       }
       if (focusedContent) {
         return focusedContent->AsElement();
--- a/dom/base/nsFocusManager.cpp
+++ b/dom/base/nsFocusManager.cpp
@@ -294,32 +294,54 @@ static nsPIDOMWindowOuter*
 GetCurrentWindow(nsIContent* aContent)
 {
   nsIDocument* doc = aContent->GetComposedDoc();
   return doc ? doc->GetWindow() : nullptr;
 }
 
 // static
 nsIContent*
-nsFocusManager::GetFocusedDescendant(nsPIDOMWindowOuter* aWindow, bool aDeep,
+nsFocusManager::GetFocusedDescendant(nsPIDOMWindowOuter* aWindow,
+                                     SearchRange aSearchRange,
                                      nsPIDOMWindowOuter** aFocusedWindow)
 {
   NS_ENSURE_TRUE(aWindow, nullptr);
 
   *aFocusedWindow = nullptr;
 
   nsIContent* currentContent = nullptr;
   nsPIDOMWindowOuter* window = aWindow;
-  while (window) {
+  for (;;) {
     *aFocusedWindow = window;
     currentContent = window->GetFocusedNode();
-    if (!currentContent || !aDeep)
+    if (!currentContent || aSearchRange == eOnlyCurrentWindow) {
       break;
+    }
 
     window = GetContentWindow(currentContent);
+    if (!window) {
+      break;
+    }
+
+    if (aSearchRange == eIncludeAllDescendants) {
+      continue;
+    }
+
+    MOZ_ASSERT(aSearchRange == eIncludeVisibleDescendants);
+
+    // If the child window doesn't have PresShell, it means the window is
+    // invisible.
+    nsIDocShell* docShell = window->GetDocShell();
+    if (!docShell) {
+      break;
+    }
+    nsIPresShell* presShell = docShell->GetPresShell();
+    if (!presShell) {
+      break;
+    }
   }
 
   NS_IF_ADDREF(*aFocusedWindow);
 
   return currentContent;
 }
 
 // static
@@ -623,17 +645,20 @@ nsFocusManager::GetFocusedElementForWind
   if (aFocusedWindow)
     *aFocusedWindow = nullptr;
 
   NS_ENSURE_TRUE(aWindow, NS_ERROR_INVALID_ARG);
   nsCOMPtr<nsPIDOMWindowOuter> window = nsPIDOMWindowOuter::From(aWindow);
 
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
   nsCOMPtr<nsIContent> focusedContent =
-    GetFocusedDescendant(window, aDeep, getter_AddRefs(focusedWindow));
+    GetFocusedDescendant(window,
+                         aDeep ? nsFocusManager::eIncludeAllDescendants :
+                                 nsFocusManager::eOnlyCurrentWindow,
+                         getter_AddRefs(focusedWindow));
   if (focusedContent)
     CallQueryInterface(focusedContent, aElement);
 
   if (aFocusedWindow)
     NS_IF_ADDREF(*aFocusedWindow = focusedWindow);
 
   return NS_OK;
 }
@@ -733,17 +758,18 @@ nsFocusManager::WindowRaised(mozIDOMWind
   // is called.
   if (XRE_IsParentProcess()) {
     ActivateOrDeactivate(window, true);
   }
 
   // retrieve the last focused element within the window that was raised
   nsCOMPtr<nsPIDOMWindowOuter> currentWindow;
   nsCOMPtr<nsIContent> currentFocus =
-    GetFocusedDescendant(window, true, getter_AddRefs(currentWindow));
+    GetFocusedDescendant(window, eIncludeAllDescendants,
+                         getter_AddRefs(currentWindow));
 
   NS_ASSERTION(currentWindow, "window raised with no window current");
   if (!currentWindow)
     return NS_OK;
 
   // If there is no nsIXULWindow, then this is an embedded or child process window.
   // Pass false for aWindowRaised so that commands get updated.
   nsCOMPtr<nsIXULWindow> xulWin(do_GetInterface(baseWindow));
@@ -905,17 +931,18 @@ nsFocusManager::WindowShown(mozIDOMWindo
   }
 
   if (mFocusedWindow != window)
     return NS_OK;
 
   if (aNeedsFocus) {
     nsCOMPtr<nsPIDOMWindowOuter> currentWindow;
     nsCOMPtr<nsIContent> currentFocus =
-      GetFocusedDescendant(window, true, getter_AddRefs(currentWindow));
+      GetFocusedDescendant(window, eIncludeAllDescendants,
+                           getter_AddRefs(currentWindow));
     if (currentWindow)
       Focus(currentWindow, currentFocus, 0, true, false, false, true);
   }
   else {
     // Sometimes, an element in a window can be focused before the window is
     // visible, which would mean that the widget may not be properly focused.
     // When the window becomes visible, make sure the right widget is focused.
     EnsureCurrentWidgetFocused();
@@ -1208,17 +1235,18 @@ nsFocusManager::SetFocusInner(nsIContent
 
   // check if the element to focus is a frame (iframe) containing a child
   // document. Frames are never directly focused; instead focusing a frame
   // means focus what is inside the frame. To do this, the descendant content
   // within the frame is retrieved and that will be focused instead.
   nsCOMPtr<nsPIDOMWindowOuter> newWindow;
   nsCOMPtr<nsPIDOMWindowOuter> subWindow = GetContentWindow(contentToFocus);
   if (subWindow) {
-    contentToFocus = GetFocusedDescendant(subWindow, true, getter_AddRefs(newWindow));
+    contentToFocus = GetFocusedDescendant(subWindow, eIncludeAllDescendants,
+                                          getter_AddRefs(newWindow));
     // since a window is being refocused, clear aFocusChanged so that the
     // caret position isn't updated.
     aFocusChanged = false;
   }
 
   // unless it was set above, retrieve the window for the element to focus
   if (!newWindow)
     newWindow = GetCurrentWindow(contentToFocus);
@@ -2285,17 +2313,18 @@ nsFocusManager::RaiseWindow(nsPIDOMWindo
 
 #if defined(XP_WIN)
   // Windows would rather we focus the child widget, otherwise, the toplevel
   // widget will always end up being focused. Fortunately, focusing the child
   // widget will also have the effect of raising the window this widget is in.
   // But on other platforms, we can just focus the toplevel widget to raise
   // the window.
   nsCOMPtr<nsPIDOMWindowOuter> childWindow;
-  GetFocusedDescendant(aWindow, true, getter_AddRefs(childWindow));
+  GetFocusedDescendant(aWindow, eIncludeAllDescendants,
+                       getter_AddRefs(childWindow));
   if (!childWindow)
     childWindow = aWindow;
 
   nsCOMPtr<nsIDocShell> docShell = aWindow->GetDocShell();
   if (!docShell)
     return;
 
   nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
@@ -2649,17 +2678,18 @@ nsFocusManager::DetermineElementToMoveFo
   bool mayFocusRoot = (aStartContent != nullptr);
 
   nsCOMPtr<nsIContent> startContent = aStartContent;
   if (!startContent && aType != MOVEFOCUS_CARET) {
     if (aType == MOVEFOCUS_FORWARDDOC || aType == MOVEFOCUS_BACKWARDDOC) {
       // When moving between documents, make sure to get the right
       // starting content in a descendant.
       nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
-      startContent = GetFocusedDescendant(aWindow, true, getter_AddRefs(focusedWindow));
+      startContent = GetFocusedDescendant(aWindow, eIncludeAllDescendants,
+                                          getter_AddRefs(focusedWindow));
     }
     else if (aType != MOVEFOCUS_LASTDOC) {
       // Otherwise, start at the focused node. If MOVEFOCUS_LASTDOC is used,
       // then we are document-navigating backwards from chrome to the content
       // process, and we don't want to use this so that we start from the end
       // of the document.
       startContent = aWindow->GetFocusedNode();
     }
--- a/dom/base/nsFocusManager.h
+++ b/dom/base/nsFocusManager.h
@@ -129,17 +129,27 @@ public:
    * active window. This will traverse down the frame hierarchy, starting at
    * the given window aWindow. Sets aFocusedWindow to the window with the
    * document containing aFocusedContent. If no element is focused,
    * aFocusedWindow may be still be set -- this means that the document is
    * focused but no element within it is focused.
    *
    * aWindow and aFocusedWindow must both be non-null.
    */
-  static nsIContent* GetFocusedDescendant(nsPIDOMWindowOuter* aWindow, bool aDeep,
+  enum SearchRange
+  {
+    // Return focused content in aWindow.  So, aFocusedWindow is always aWindow.
+    eOnlyCurrentWindow,
+    // Return focused content in aWindow or one of all sub windows.
+    eIncludeAllDescendants,
+    // Return focused content in aWindow or one of visible sub windows.
+    eIncludeVisibleDescendants,
+  };
+  static nsIContent* GetFocusedDescendant(nsPIDOMWindowOuter* aWindow,
+                                          SearchRange aSearchRange,
                                           nsPIDOMWindowOuter** aFocusedWindow);
 
   /**
    * Returns the content node that focus will be redirected to if aContent was
    * focused. This is used for the special case of certain XUL elements such
    * as textboxes or input number which redirect focus to an anonymous child.
    *
    * aContent must be non-null.
--- a/dom/base/nsPIWindowRoot.h
+++ b/dom/base/nsPIWindowRoot.h
@@ -31,19 +31,30 @@ public:
   NS_DECLARE_STATIC_IID_ACCESSOR(NS_IWINDOWROOT_IID)
 
   virtual nsPIDOMWindowOuter* GetWindow()=0;
 
   // get and set the node that is the context of a popup menu
   virtual nsIDOMNode* GetPopupNode() = 0;
   virtual void SetPopupNode(nsIDOMNode* aNode) = 0;
 
+  /**
+   * @param aForVisibleWindow   true if caller needs controller which is
+   *                            associated with visible window.
+   */
   virtual nsresult GetControllerForCommand(const char *aCommand,
+                                           bool aForVisibleWindow,
                                            nsIController** aResult) = 0;
-  virtual nsresult GetControllers(nsIControllers** aResult) = 0;
+
+  /**
+   * @param aForVisibleWindow   true if caller needs controllers which are
+   *                            associated with visible window.
+   */
+  virtual nsresult GetControllers(bool aForVisibleWindow,
+                                  nsIControllers** aResult) = 0;
 
   virtual void GetEnabledDisabledCommands(nsTArray<nsCString>& aEnabledCommands,
                                           nsTArray<nsCString>& aDisabledCommands) = 0;
 
   virtual void SetParentTarget(mozilla::dom::EventTarget* aTarget) = 0;
   virtual mozilla::dom::EventTarget* GetParentTarget() = 0;
 
   // Stores a weak reference to the browser.
--- a/dom/base/nsWindowRoot.cpp
+++ b/dom/base/nsWindowRoot.cpp
@@ -202,27 +202,32 @@ nsWindowRoot::GetOwnerGlobal() const
 
 nsPIDOMWindowOuter*
 nsWindowRoot::GetWindow()
 {
   return mWindow;
 }
 
 nsresult
-nsWindowRoot::GetControllers(nsIControllers** aResult)
+nsWindowRoot::GetControllers(bool aForVisibleWindow,
+                             nsIControllers** aResult)
 {
   *aResult = nullptr;
 
   // XXX: we should fix this so there's a generic interface that
   // describes controllers, so this code would have no special
   // knowledge of what object might have controllers.
 
+  nsFocusManager::SearchRange searchRange =
+    aForVisibleWindow ? nsFocusManager::eIncludeVisibleDescendants :
+                        nsFocusManager::eIncludeAllDescendants;
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
   nsIContent* focusedContent =
-    nsFocusManager::GetFocusedDescendant(mWindow, true, getter_AddRefs(focusedWindow));
+    nsFocusManager::GetFocusedDescendant(mWindow, searchRange,
+                                         getter_AddRefs(focusedWindow));
   if (focusedContent) {
 #ifdef MOZ_XUL
     RefPtr<nsXULElement> xulElement = nsXULElement::FromContent(focusedContent);
     if (xulElement) {
       ErrorResult rv;
       *aResult = xulElement->GetControllers(rv);
       NS_IF_ADDREF(*aResult);
       return rv.StealNSResult();
@@ -245,37 +250,42 @@ nsWindowRoot::GetControllers(nsIControll
   else {
     return focusedWindow->GetControllers(aResult);
   }
 
   return NS_OK;
 }
 
 nsresult
-nsWindowRoot::GetControllerForCommand(const char * aCommand,
+nsWindowRoot::GetControllerForCommand(const char* aCommand,
+                                      bool aForVisibleWindow,
                                       nsIController** _retval)
 {
   NS_ENSURE_ARG_POINTER(_retval);
   *_retval = nullptr;
 
   {
     nsCOMPtr<nsIControllers> controllers;
-    GetControllers(getter_AddRefs(controllers));
+    GetControllers(aForVisibleWindow, getter_AddRefs(controllers));
     if (controllers) {
       nsCOMPtr<nsIController> controller;
       controllers->GetControllerForCommand(aCommand, getter_AddRefs(controller));
       if (controller) {
         controller.forget(_retval);
         return NS_OK;
       }
     }
   }
 
+  nsFocusManager::SearchRange searchRange =
+    aForVisibleWindow ? nsFocusManager::eIncludeVisibleDescendants :
+                        nsFocusManager::eIncludeAllDescendants;
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
-  nsFocusManager::GetFocusedDescendant(mWindow, true, getter_AddRefs(focusedWindow));
+  nsFocusManager::GetFocusedDescendant(mWindow, searchRange,
+                                       getter_AddRefs(focusedWindow));
   while (focusedWindow) {
     nsCOMPtr<nsIControllers> controllers;
     focusedWindow->GetControllers(getter_AddRefs(controllers));
     if (controllers) {
       nsCOMPtr<nsIController> controller;
       controllers->GetControllerForCommand(aCommand,
                                            getter_AddRefs(controller));
       if (controller) {
@@ -335,24 +345,26 @@ nsWindowRoot::GetEnabledDisabledCommands
 
 void
 nsWindowRoot::GetEnabledDisabledCommands(nsTArray<nsCString>& aEnabledCommands,
                                          nsTArray<nsCString>& aDisabledCommands)
 {
   nsTHashtable<nsCharPtrHashKey> commandsHandled;
 
   nsCOMPtr<nsIControllers> controllers;
-  GetControllers(getter_AddRefs(controllers));
+  GetControllers(false, getter_AddRefs(controllers));
   if (controllers) {
     GetEnabledDisabledCommandsForControllers(controllers, commandsHandled,
                                              aEnabledCommands, aDisabledCommands);
   }
 
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
-  nsFocusManager::GetFocusedDescendant(mWindow, true, getter_AddRefs(focusedWindow));
+  nsFocusManager::GetFocusedDescendant(mWindow,
+                                       nsFocusManager::eIncludeAllDescendants,
+                                       getter_AddRefs(focusedWindow));
   while (focusedWindow) {
     focusedWindow->GetControllers(getter_AddRefs(controllers));
     if (controllers) {
       GetEnabledDisabledCommandsForControllers(controllers, commandsHandled,
                                                aEnabledCommands, aDisabledCommands);
     }
 
     nsGlobalWindow* win = nsGlobalWindow::Cast(focusedWindow);
--- a/dom/base/nsWindowRoot.h
+++ b/dom/base/nsWindowRoot.h
@@ -38,18 +38,20 @@ public:
                                 const mozilla::dom::AddEventListenerOptionsOrBoolean& aOptions,
                                 const mozilla::dom::Nullable<bool>& aWantsUntrusted,
                                 mozilla::ErrorResult& aRv) override;
 
   // nsPIWindowRoot
 
   virtual nsPIDOMWindowOuter* GetWindow() override;
 
-  virtual nsresult GetControllers(nsIControllers** aResult) override;
+  virtual nsresult GetControllers(bool aForVisibleWindow,
+                                  nsIControllers** aResult) override;
   virtual nsresult GetControllerForCommand(const char * aCommand,
+                                           bool aForVisibleWindow,
                                            nsIController** _retval) override;
 
   virtual void GetEnabledDisabledCommands(nsTArray<nsCString>& aEnabledCommands,
                                           nsTArray<nsCString>& aDisabledCommands) override;
 
   virtual nsIDOMNode* GetPopupNode() override;
   virtual void SetPopupNode(nsIDOMNode* aNode) override;
 
--- a/dom/cache/DBSchema.cpp
+++ b/dom/cache/DBSchema.cpp
@@ -2079,17 +2079,27 @@ ReadResponse(mozIStorageConnection* aCon
     aSavedResponseOut->mValue.principalInfo() =
       mozilla::ipc::ContentPrincipalInfo(attrs, void_t(), specNoSuffix);
   }
 
   bool nullPadding = false;
   rv = state->GetIsNull(6, &nullPadding);
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
+#ifdef NIGHTLY_BUILD
+  bool shouldUpdateTo26 = false;
+  if (nullPadding && aSavedResponseOut->mValue.type() == ResponseType::Opaque) {
+    // XXXtt: This should be removed in the future (e.g. Nightly 58) by
+    // bug 1398167.
+    shouldUpdateTo26 = true;
+    aSavedResponseOut->mValue.paddingSize() = 0;
+  } else if (nullPadding) {
+#else
   if (nullPadding) {
+#endif // NIGHTLY_BUILD
     MOZ_DIAGNOSTIC_ASSERT(aSavedResponseOut->mValue.type() !=
                           ResponseType::Opaque);
     aSavedResponseOut->mValue.paddingSize() =
       InternalResponse::UNKNOWN_PADDING_SIZE;
   } else {
     MOZ_DIAGNOSTIC_ASSERT(aSavedResponseOut->mValue.type() ==
                           ResponseType::Opaque);
     int64_t paddingSize = 0;
@@ -2098,16 +2108,30 @@ ReadResponse(mozIStorageConnection* aCon
 
     MOZ_DIAGNOSTIC_ASSERT(paddingSize >= 0);
     aSavedResponseOut->mValue.paddingSize() = paddingSize;
   }
 
   rv = state->GetBlobAsUTF8String(7, aSavedResponseOut->mValue.channelInfo().securityInfo());
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
+#ifdef NIGHTLY_BUILD
+  if (shouldUpdateTo26) {
+    // XXXtt: This is a quick fix for not updating properly in Nightly 57.
+    // Note: This should be removed in the future (e.g. Nightly 58) by
+    // bug 1398167.
+    rv = aConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
+      "UPDATE entries SET response_padding_size = 0 "
+        "WHERE response_type = 4 " // opaque response
+          "AND response_padding_size IS NULL"
+    ));
+    if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
+  }
+#endif // NIGHTLY_BUILD
+
   rv = aConn->CreateStatement(NS_LITERAL_CSTRING(
     "SELECT "
       "name, "
       "value "
     "FROM response_headers "
     "WHERE entry_id=:entry_id;"
   ), getter_AddRefs(state));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
@@ -3156,18 +3180,18 @@ nsresult MigrateFrom25To26(mozIStorageCo
   // Note: only opaque repsonse should be non-null interger.
   nsresult rv = aConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
     "ALTER TABLE entries "
     "ADD COLUMN response_padding_size INTEGER NULL "
   ));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   aConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
-    "UPDATE entries SET response_padding_size = 0"
-    "WHERE response_type = 4" // opaque response
+    "UPDATE entries SET response_padding_size = 0 "
+      "WHERE response_type = 4" // opaque response
   ));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   rv = aConn->SetSchemaVersion(26);
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   aRewriteSchema = true;
 
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..626aa8f625fe8537e3755e2e13917693f3babe4c
GIT binary patch
literal 60710
zc$}2Ebx@tbn(iAyfDqi>-68103GVLh?(V^T;qLD4PH<S*!kysm?sxCGQ!{(cojK>+
zuIjG(>g)dX^FCeG{l}vq4f*ZImw&c^ENba5|I)sH!T;jyV((;VZpx&p0{aCr|969C
z;Xk^o2izBkZ%2?{zWm#u@E?Sk?EgwY{uhFYshOdxjm!T_!VYTC#0&c0kh(MfD+%kr
zAsJgZ+1viRG<N?6P1gS&i2iS-X#b<QgSF2^+JAfr{-cxq&p<|7Qx`)MLl;8^x1aw8
z*ZW7!-T&XZjSXTn-Z$)yU7*?ebkp^<lroYkQnPa5_9D%blF-q$k55xmQ%^~xA^t_i
zKkHh@6!-e44Ay^i;{OX7|54!oq@k%6kR1>Z(D}2ssfdk6l?fn#HHtA!O+!Q7GP}gY
z#Iz)w^7UW5)&5`3nc#ocU~Fh?@$U}*(}c|b{_y|P;mD#FeLb9iLLt7;{-3b_Haasp
zJK9*fnEvmKKFij&AzSkN9fnR3*(vR`q^G%=yeM7U2p-pp9LN;8_~j6~cSWj4t|t;{
zrEF-2j|j-hHw(pA3e_H^Rw`nGiY#D)U1fusO)c`ZQT&D&+4IfUQgJU|R^bksO*Q~i
z^lw;;TtE&9O+*o+9Q;!2+g9X2I^gqp`t$Qp;4n@cy)|w6JMLk{m{ioPj^7!F8HcgH
zLpw8kW8R4ESr%TQH#FiMbN)y-_*PY;?!NQWqII+1ZgM;A_A!eGXwMbM>1MN)<?qgK
z^WJiQfzSWwzBCW>4~O_kvby}{I@+2{yu4)#E#j5gHS?e5sJxp5Q7L9sNl9^L**lKC
zNEI36Y?a{;rS_#v0_oeFcqr8Em=Zlttekw+$s5sdbbq2NA0k3M1Qt~a4v&3Jk4hNI
zk9!d@P|xjfgDa<3EbEvxx$nvjSXEuBcwJm4tvBia7P0Sj5+APCAzV>77IZog?;ExW
zj;Jr0MDp?R8R$5=PLq3qB*G|CNm03|D+~`S$g{$-ThF+9{Z)So%k7*z`aYYsn^i>f
z{&+i&j2c?g;pS9>olc_2s#t(cVYGLW$#H5lZ_DlJ_;*^f(G_R}5ana*cl59XPsVqb
z>qM`+>nejSTsl0Kb1SLxJx>ePY`tEa$B1K!N^0$O2n%4d=SWVJj1K!Jkx1;QgeqMf
zZ71&@D#_+zxv7Ju8FJg2WO4WvpHSA$GlU6xOt^6<uOyzX<|*&K0?UbjSd;R1x9m4!
z#)U>piE}JZcN5xV@f6R<y2Mx~Nm{w|+`YXo))Qw2UQaPFK{G%XU``cUKCks<Ls~S#
z>1~TvmRjn{ai5;qo;(>Vvj^Lw4((G<#-@Hu{{oljc2Z?i7Lcn)m<Fqm`JjD5kHa$u
zll8|)fy0laGCe8^Y1{-WP(j~av)`*$j2NPhvK;7)I6cfSCQ{7!MQWkYNwu(PYClv?
z0^dqUz7xB>eC*_8Cgxi$tLlClkkq0~r(z5($l1z3?mMD-4l9MNXdHIFY(!AMWsv_c
z#`#Vi(KMx+0+(24iM|}#g~KvvN#X}Jj>kap>Cdjv#Uae`bjftp6(iksEtYJJFt}3@
z<d|&-kL!>1K@}HOjDgpPpG%2<nw)N)aZY!}BahEB2h<66Nzt$x6Ke%2Rl6@moL3ag
zXkt3Jx~!wu;~CusPij1;G&C!OS;K0%RLJsBS$!?j*<2eO>S}mJ)hqScG_fu>ShMNj
zRS?lkJ+jgjn7bZ(<T}E;XXR+aD$K@o#+tc3Za*N98i$SDT)zJ2h0{lc$>Wul{TTxA
z4@CTzi^!*hIdd{?#e}fylM}EtG=uan|8hy}(#$T>L;aZyIQTp4oqEjId-#0*1^Tx!
zWX{B=Ja^?;c;cCn`(Kt`SspA-G#qz-K96mE{^|W3uur$2qF?j71BPkVTyNpLz4z|g
zGaoV)K>mxAaW0nhOJgQGhP70pHJRHI&k2(r<BE*4l4s9OKB1J8j77CvPu`B2+SWZ|
zA@p)r&27HpWdE4Y{@ki}@Z&)5CsFUb%o>f>g~c?s;$QMfpQS)wcPhTy14@F5=XSxF
z$q-IQ_b;^z>ujAUPTrgri@i7x_Rs^(trG`{>awGugGmT2!RM%WFJ<Y7lhv$Fpu&?=
z1Xuk}v6jbbeP4%ml7oDbb?A%2Zjx03GfvKR2%=rrFbm3~hX$8XX{f+?Xac{}RkP6E
z&rj=#XZxdnv7@gvct~^ZreTb?JKj()t(k#ot)vwrdh64;RlqJ2;y))oeGYnjemY!C
zvmELJ@TQo!a=AX%u3Lcu&ORI0bU@#c6ywbg<5&G<|D}%-KHJA>f6q+;0sHrW`?bYd
zZT}Umrk5(F>2A(PUloFX^7ySV3ANNN)4VP+@*LRP57pLedM{W7e1@EuER3w|LQY->
znmA<~x$q8_`^4fLQ{5zQXCXm+t&;mmjHS#4>xR~(#SV56SVcL{`=+4&jB;rj-$28*
zmIF!(F*B$LP63^Us&2C*0-vB7?FH)ULd?;h@sdN~s5q>(o2?#iql98bX(cBq@h{xs
z^%3him4h@=Tg{aUxD^$a2jY+P+Z4hoDQt4H>sq~&?fWg1qY1QQ73A|)2dVlkRSeh{
zG%BZ6%wh)>2QX17$xEU7dpt9Fqef9D?KC-St9_2QtI{bUT@iECA1EUvR94%+Q_ad`
z1@I6<u8?J+94Q5D6(EQ{M!Px;G^Nto^zfh*W9a&ou?U?o+FL+j-kiD~Pnrh1>6~X$
zCejD98=8+12$~{fpIi~HNWv1%Riv!4?%MI1ty5q-d*U-V7{|-drD~$r>%T8;gB_Hd
zuMO8=kgKj*M#VFTj%kYjb5dQlG+zNwQutkKYa>N8;J7lHG*3?fW4O7%$;fu-{$=Hm
zgF+6kGXcZzEHYlZCK*_y#6HC!Q9$fSXTGG9ii*G|CZpZYLiGT%W1L#ypKYZ$(jant
zk~i@LPr(H0vIuS#m84!AR|&w|z<AB*gSU<zLjX+=j_^kvD=jI;VA^L1xaTJ#9Z*YK
z&NoIOzMqNp_SC?Vme#bEaWFhWx0baq`;AfK7sKizX16NvBSz;hyQ*ExkdEXLS|e7e
zuALrcysGG?gfTYg#GHf^RSD#Fh6?{FdnI||Uc|7IG&5<ZfqxZIj($^PlUslm!w$59
zDfY_60&3qd)54RvlgsK7$?~gj>X;WD%lTg@HTR7AQUl)CLxy7pS%@5heb8xwWUAmu
zU&}8!Zl#$t2$>3w<>M_il{ZEWBvV#eJl}!)2u(Q_k-s}2G)c;BH37M!a;0XyoJZnw
ztag4bYdd;EUS1VeG7-2Zd~D6$xt&@+LAGGh4BE*`InXY{+|x~-Bj2R*l2!qVyp$rq
zwz6<xo#ghAASEOiRu*DC<aq7W_W+6i_7!ICQI|)H(RL10{F!2U9K|t?ouGSAM#iii
zn*;UrLwpq13WNp!8aFhpyHPFvai#2kRPKLUF7R};DGTamUvqe=9nVIMRL~J>NkDyl
zf^HagD`tOc?CZ-=x3z$1((U}hpVnH{ZI!9@87Y#oPE&+hzAmi>Ite^)>KT>nQbP(3
ze4=wsNyb<!jxx3&`@MUiIj`N4+tI4mpt0^gm9Z_x1Z}ZD2Cv0wTj<&-VL7^RwO`X<
z)?`z&QgeQJ$QZ&pv5fmU@$uZSoxgf6)Wm0ANw%@A8cThfGY8MENmy!wg<2xyTE30y
zmBZm(+{R<#^YNMg?wxiUal1qi1_Zn!W&5AZ6X-jBl<x8!;!SA-$qx0of!PqRvDx~r
zK1(0HKqkNiPa@)ayTNBpqGJ((|Jhr>u0H=o>hJ%!s|0epm>ap92|lhuuLXJ#TKe@_
z<ihM%h$g1#;al2L^|LfHH^F*ZY1caIgFXKKls-d#_k6-*^J{mhmlIVob_z_mwz!$R
zOdDC6+#B|KZ9Ka@b-6z7mIu$Ooqw1%b3A$LA#eMG(m883z1msl1)hgrTk?(9QA!On
z>W#PCumw8}&n?{d7Cpb&=cu(iy6V`Z4w`OS7&=Y&dy%L(FTJo?Ke2Ta8REd5Oqj}L
zX0ygpxxqkheIEM2IDer1m)8n*FW!^VwBw`_9x&FeewUUi%c`wDo)&ib=?~-V2S@NP
zbDyy5G8t|`lnA@b7<0_dn{3uR&spcP6JZN=$Sn~$fIE9M=R&fOkoqs&aCx_@f9a#2
zS@6ejiuGKmqJdlqaCu%N(SJDVTI;qSKm8G${U)Eoh+13!MaylZuM^~7VgFD2w~sB8
zXLI=Xf4+^2Pv@^C0GsE`+{X7K0;EQr-CnfRlLCn%x)75<<bC#rwk`XT2<N*wv;?aq
zJSVbtFi^pzY7~p2IYrXxTRheGoVI9*JUn^Z)*!F^v3qxK5q_Ozxgz)2qe3Un?x5D$
z>?G`+w79e5d2O&*#RC1K+Y*PWUYVMfCIkBAPo7r>7N#Vp<TeEqj1F0%YjbEvo)r~Z
z8nyy(c+vqZ9|p;jN+hD~<pLy5e3|*ZMo&j}3X;-2V<Op&31tG+ol(SuNrYM8)kS=~
z7l#(3x%VE6V)#|NQ*fL#m~ySyx5`T)+GeiW#=cX8E!1>HDFL4@@dxSLk4PIfRKrKO
zpXXb4jboJhTyn=_+=-wRY~NCmyM}to9P6U1@hd$hZK>_yZky;Cx)=$%O!a$<9$dP^
zTUezn#!G_4Vw+(6Wh{z2mrX47@^K-o=7pM+Q7MiDqSczyb|s24QMdVWsozYkBJl*Z
zpwr_(rggrn`$2RXw~7%H0Nxnl_;=mul8`)+*M8LO<x>@3Lk2wilOjD?+-q*Tzlx;#
zvN2P}A~_NJo`E($T@}l3Mkb}&qun`upX=Pc$*^n8;jD@pb(ODFa?JYM`2@gI(1>j%
zu}M6HlEmHb>?|V*2)!rg^IhH%akX*z91j`kI`vp9%MoIcG}(ubZ8qOH&x~7dp96Bi
zWf{ab-q+zdF(Mv%5mzR>fi@(#BEv_CCj24=ei33{zg6^V6Rp$5k#pA;tcQClm&5tp
z@cJcL4)MT@oinPAAzdz14)bM8Ch@@V*E=g@RVd5n-(*R>f+l57*<b<@Ru7|w3!M&$
z<A0dMHvZ9}i8?_t2JZ3j+8>$50h=vk1f6=afG4lZ8dg;s%D$W28<Cake)+oh=He|C
z;=AXnmE{vf0`KvgjU1inDdDRKGV_J6f5<44SJSKTPU@27*cNlE<gtQW#pKTAMi7QZ
zK)3ml-TYn3$+M})7Bc}L7Z1qPV}r!hlPmB|Q7=q{6dN~*I)6^2VpMvCFh%KU_>)RD
zVs=K=0QpOzYteW9i2%iHsV>cp*rxOkW|(1Hflj8<hbh;T_$+mv<t@9c0|ZUp+JTnA
z10f2w6Xy+!!!+4J#|oppKVocVqc6@L3!^cLnTmy5?=T)MT&@gRhZMRryE4)?GADS=
zB+0L;`rWdzdy?eS7xtA{H+aYUGrR+ops(X##B*Wa-MQ7${ZQM({nYvLq)ZzMb#pYM
z$END<kyx#<!+O@soMKaR7-npgs}}g^FHQ0`xW>SWBt<_HDrd-;AS;Sx6RqtBA(t}N
zZMr<J6fky7cr-Hp9Lqs$mJuSV>6TFOlBjWa?8`AN;3iLCbUPT#NUQwpwaq5LHt&`#
z7fGGdz8lYXO!FFP{`}kL*ZXfHU+&cTSTOI;F8)VDn=BiVLS<jHWDS8ePLp5Mh}4{k
zMp)H=O&M$LJx_-4yKNiO*QWDsYvW#~9kFhkK%z|jF$waT!uxQA;RDU=xJq_f&A#-s
z^~oo)AMET*W)5tsmn^>XcDXUK3)R4d`|NvTd#kg;+jW)<@XEFiA@Qz{Uv0{D1B|YG
zA^B-?TNpAcg3p#Zt>-?i)*Nh;8s-&hyu25wh!mBPh^<0v8U-3lLBIG9OaC4%NgKk~
zGMN>u8cH7m{m7GW@%RZA79Fz4Z|N4u3-tL^1%W6*K7(}Zh4H-Q;t^Im#DZoKKD3dG
zM}NGM=5Nn!lEAGr1tj8V5k<AYMoA;GIi%C1S^&F!Na9ep$1HZ3jCAiAyF~OMxIwfm
zfogrj=Hjt!qtJ||-_6aZ+^fF+(y-AF(3pwht64FiRP5ANQ5st&k#2c-yKYD6MEqJL
zw%H3FFWogFA2y-3)xK{<?-hirhbDR?RPCU#XY8~5)0`bBh2FLKCRQW(V2pr~t%~8B
z8%d;En8OCHnYEEQ4dE!uuG+ILZI4zv8`)ipF`AMFhq&}oHmx#z`gO~=EO9{jep*zQ
z5J_?omeS%Z)~2{~XVUZ*Jt)J70CE;#`MhK(GVwR~B$}zsdiBnSA1XUX&4DZDANo9I
z34^pw!G>Y(J&~H<StRPN3ew2QON`LZu#1f11kunP5XGOqZ$3*sK>0wd!KD^G>ha`s
z@|<0bqv+;C75r>yNFaUgUB8c16@%2~#le*F4KrQaq!6>m`zxirw~$BMI3Hx!0++ar
z$EAhtE<UsBey?>pZ~EKFwReGIQ#D2uP2_Dn6b81)Hz#m_g01`+@j*kq=eyc*CbBKq
z<oS=qz!H&cP}8ZfJ?td6LG;XQzWi)R-zERs<$L6tA5L$y{xH+7KY{<#c`dB{r{weG
z*5^a4z~^<X|MUANlYQ<Wmc26n_PO6}a%;ZLlOdA55E)Arn$iuR(rFwfB{)NSMFkIK
z4)r$@0`=^TxW*%1;&`!TN2YTo^di8X<c73|V*}dy$=1HCa1hf*4*U1Ah<zqf>kD$`
zk!@kwoU&};&X05lQk@I$3hra8Q4FS<wcwZ<3ey$<Clf(73;qv1x74_0jRYD;m?3qX
zId%PYpuUft)y65I_(crn^~XM;p{y#0F0MU)Js@)LS3x7rPHJ5X7e(}9Y1pZ_`vMVV
zYH940pey5-B3k{2+;pYe_pGX&N>uS(_V#dPHvn3XTK$ctw6bG)nrly!FTq-*R2q)|
z&0$8qDoom0@q}i9CDoY!e%|u8(JaaJxK|6R?-8xPThRqG1=iq%de${+eRO}iEtSS|
zTd{xVcW$r!2Fefj;08|djh(Us_IA}Ej+gi&rI^BY_uoc2Xal3U_VFBF5*`(me?K;t
zlCo}{c{RvMPo)(tZRHZFLiVLVp!ZqpiFrF!2i8201uh5R(IS#DmU`<Htg*l_hyv<z
z&UYctGm4xI6dgMK%z@#FBWEtf$7{`-2n9x>PB28*X1iK*e>4afcbnXPRb634#;3c6
zoh1?SjcrRG%hm4RL8qcE8?J8b%DQqiRNNfsa<WJx%Ul<1#l9kD%P8Aue-=6N%j{Az
zlom29nU)ffnt@ZYd34N{&vKonIEM6e9h?8=ffRf1Z19};^a!dl&|X0EscQ($t5=&>
zI#_VUcig$u`BoJ(5j=R3MB^;p{bJvxhY3={(#I!H|9n?#@uOQMS5~U$MFZHf+>D=f
zN&B6s%?dfZ8fMr7oD0~bSN>{ks{G|8B(hODAY43wA%B7WTE6Qds$zme|7CNh^`M3V
z*035fKw0BTtLVs2XL=LrEU}+HRc?|Y{&(w@t+ljLmDLTxo%g7hOKTH(D@!6fKO-e{
ztx4|DachejiAae^+F_^j@3<$wtwsr*V(?QqpWi4GKy7BN_ZIxA073oh({oEg%g;+B
zFk@kMfZTMU3qnWDN8Lu(M!g@ou`>*CJy{7HyyU*wPRgQ@Zq&+&vI3w1%@cw?WXziV
z*FJ-Zq(7M6%VHn-UH(>-R2ajJbZW@EAe$ROyNo6AbisV%aHN-HUQW<LvE^jKj6Yb)
z2u9W1-O)ok&_Ua}!y;7tIys06Y(`ot!yekI-@@EAM##8)V)zKy8ss+r)4QZ6`}t=Y
zelMZRX6s?v;u8CYXlx(Jb<=mr;!$B1)^MBLsnC7H`;m6=!`e6Wjz{1wYH8Cvbg-*W
zf#Xl*WveO0eD{u;Q2f;wAx%>Dz>yqy3D>>vs{!33pa>azHuR*^ur0n}4w!5M3W?(N
z?fErKo`L2X^e5Tx@h@jyK(f?5pK=zr0O0IbL_co0flw6EkpSh=x@cEi;AB_0T!`jV
zkq4Y3At<X#+SYG>ckQ};v!186p+GmYc;tu%!Ea-wGM}mF<HGWoq2sqLyb@Imjik*?
zw)Vn9<W{2mzENd+*wGP_>Q*w-h`4+dB1KpKoKbA~B8-#d36+DnBxLfBVff)S)M~T7
ze%CJgs2~h}I5R2RCJ~+DuqtFiP8o97k}Akt$wP1E2wRBdpN?6fG{Phgs_*6Q&vK|K
zt41T+XvXOVnL%~InbOT%fBhbYcEwx}vT=`tj~i(e2XLx9nGmB~#I^5QpQ!I5rj?5(
z>G<vbASJ7%j66uyu1#SW)#AKZRVw~y=GINRNwH5C2dHUMp{cR}h~Z!AvoF9ouJ{z4
zwqlHKv^_f*1kfvcOo1mUtJ`SO^mU%bqmlbQ@#;Etop$QND|)k9hR<`x)`Q;@ktp2t
zHt-jpUVOq-K5u+b+~V~DH)eOSAa=LH&z3WOndqR6J6~q+xvg%SVY6?Pl`4CnPaawe
zSlBeMr&iUdwGlxnI^doHPMiokq_mt4ryiR|jw56gMg-;{zwA!p9HmL*LKtdqZ9R`j
zwU@8cP-i^ACZ?nZ*RfE7jwAa>5_J-q)pCelC!Co(OdlZ?1`14#jAtWv8}ypgxA+ho
zK+STtu(zU2s0fUUT0R)80y74S_aiPLa{W8F&=N~ZT6<3oRvoJu_mEf3<*IB9-TLAc
z=+CaU_EV(|fOR%k`NOGht7s>c3vPRnabn)vY^;b=ihryc3LHw2M?jDw%QU39pD9Z3
zi>0PL*(dYQEfm8hw$66jur(Th!%Mwbcwpz4`T0q#&%`>KLgA&fFu@KIr@G{38Gb<7
z4V32-vck41%XRZgptr_A7aJFC_Re!V4;bODGZU6E_v8pfWA1tQ@>l-u%a=>2rWbfN
z(5L#xC)IxjLmK}}Fhu@;N^orLoy=YTJs(p4pYx&ro=*LLNoQdP{O1n;O*-_S3DiG#
zz+h2%<E#7fC3o`67nT1XJ9u*%ahb82vavIm0yvo&*qF`C7>rCfxENSCj7(TL0j!+t
z05e}kGfO)|oBy4f!FNv|w0&HDL;-moNY>*$yPvjm98IQ_Y#SCO>FE>XG`1v3DMKmQ
z6{9;%vX;cQR-7E7kp+PTJB&4=LZU)L1g**#7_o2{ol1OdmurBN`kqIJ&BxbQzs=9B
z=~qJuszzSW`}(7+{t~_X2cfvcmX5XGbh*iC`QF@!T(|eFnOV=kc3J$IvhDk+_l}ae
zzj^~Ar@}?pijwy1$!X<%wX92P>EeUrDQU@k_K&KITS>`EZ`Eq1&GW=nwC?5}6Mv=}
z&383o%lnbn7f6DLO%HJ^-Rf!Pq`U$ixXc~j?tniY_WGm?F`~E`1$07(!K})B?-4bF
zp&m}Yd8M4q+?$I;5=~1lO>sDE1r>H&(m|CkonLLsFZ}4h1ed11L#$YwFd6cTSYlc~
zs9^aPE4Z}DC!}15%I7q%2AX<40v3NSY;9#)5FCw+f9+l_(8{g&=Ie?mS#cb#eg5#H
z#%<`8p}czT<UHze=>__Q=PL?tDAVYv^{MRLopghi+UaR*?P;x+ErM3pAz|+P(wf?7
z<w;~KRaM1;uc~jvhew`kUMC-pdNiU<li9ItiW#j%;W4J6RmGE-mtz3=3MJyV<q!Of
zZY5ZoAJkGD@%_cc2~C2EDf@fObOQiYnH8zhFf&%VN(;S*aaMH63L|IpDtPJ0CZ~O=
zx5e3?T-emQlKXfxhSPANmE>=&G{g+r?KU|2lgZHNewd}-q&({pk=g|N<kY~oWKzj0
zl&Xf+s^&SGT9q?VbkdcT80Bnruy}RxDf<c!jNHj8*Y}{LiWtOlsA=mz1Dx43*`Aa&
zwK|&PgoaX;#}nb?$tgRCP-{W=NiUj8qC~`a$Al$P1=V*xCB-2*+Kn_0X30%5N>bM{
zRpR-0TvhSFTsc_Hu@V4{vKFoRI1W@Mhb{N*1SW5(Zr?75=Co*C%9291^z;~RNJDaE
z+zD3u&jD0Dft0IjIb^3!O9Y{53PWOPqkg>U4ZfKs`>WP|y3(=Kv5O@|in8d)n0x~Q
zDu>bjv4<DC?Op}?kU!1-==hBQwq!w!NI`9am7XiG@X*m>=uPG%522qpBaQ#yfK4iR
z*6LVB>kq5NW-?vn)n~fTDw6+p>Ugq-X88aM9m&1>u=j4Vl6wII<9%sSjYpThRxWNF
z0dQsGy{)oVV3U!eqgc+G8Qd+^aONOHl!~g$hxsA7O?a2H>EWH5bQ0HrI#xtL^zb4`
z1PxNLl%oZoTgch=@u?M?xVB1HUvs#)m5-d9x5hRWsg9{sCMP*qFA2IA`15g$pM09!
zHv1}>^R5`HM=@9vNRY2lfWWJn8VeB&iQLdHFkZV#;uT95!7ff+s*YS*s7K&%h<85U
z1yxmBHG6!#e3$oHFN%fENJ4)uoK~++ib{6&-}gv&QnrxY-Pad>maY}5Qul+M_5J+&
zpEMDCG~VZ{%^J|JRUpQEtE0^7SF+E_Ho6c74eRR5!qQspkQ8Ybq>_Xn3zoCe0lThw
z&Y8Kyejo=A9zdM9?l!-=7Ry~*7kefs;z>(u{AuQ#tIF@Gas1(9YW3lX7*W)K!Bwtu
za0m4rmJa90x-sEe%Qcor-0xI%Wi~HarU}V^M56k}m)&}|T30RCHvU6}c7+PuEX8El
z@v=@^`fZ`V8A}F9UVXq&mEEX>Fw$xp$BfyiEFXu3omZE&pCmZi&@IEo%F5tc&|1eT
z;*pXY)pqeJac-B~UX`|)76<9<m@Ft{KZFm7DMIU@LbHQona%q>LujxGCrY^z^7K{y
zT!vBAn4n&j0fFlNo@$XHZR7Vo_d}A|(jC=H;`KJ&=-Dzv4bSFf@A3kg{5`p`eTdRK
zs*#y^!4`>c!}AYUvVK`P?AJ0Ag%Uo$5l6~+r5cKr?{2K9=P6X$T65W2JPUk@x-Lee
zomK4Do67>}!-LoRHa(RCZqcDKhO)ey11bCKQdLj_OLy>1lxVi7+&>XrwYwU&&(ieh
zHEnILdwN8yfBH3pq$n}O|8n`;Bd^V(U7qXfpGsF(5I*O-A%?XiqY()GiW(i)kk1GE
zxP}R(nb4-t&+A-YBuis%%h}~|YGM;-OPd#)k90yxW2(Bcp^|`2tCgTfBQ^Ixtv9H;
zl@&9v)!Q}iw~!fzwE1<I@L}^0ak$acmELNuMH0e(+rrVpk^C0EEasM4;;cBCsi7e2
z+u1hYqE%byp_-8qj($mcM&z!Ah1XzXA}86g>AN-BJJ-j;(M6=>%?or#N7d$ihKzAg
z5r=q;EuD^N2^675HHx}-1xSjTvxMh<n@&9}!r=Z+WiF=3YmFnH%CeeCXX*Yb)G}DI
zsdXL&G5dWIb~70V?*Q4YlMXzWexf!!dT~2?XGJPX29`kH80)ekAW3NmyTBvY3YNK~
z0wqLTuv=W4R3k-+A0EpiG`T{f+78GH55QAyV69bpb*LLM_BTb8tHgX;+V;<#kDys{
z_YJ+LUou3Pr75bYiHQ5Hj6@Ufpb^ztE=FA;hTh>}g3m3v{p^B!?P^25qUfBB%dT!u
zKIMFM6`41S2|FxX$xaBLxt*d%dhcrVy~VKY7EirPvV`V5AF-Ltq($snS+c1(D^^kK
z38{SYM2-YmOY&ne;W6uth7P}~J+8XDf;eLFe3-s!f^4=!(7S5@SK{FoP~=t>a>Wq6
zP;W`-s7av8Zz+#uwyq&=Zxmzd`q&&@3P(g4z0g^l9Jl$l80b#udAR9r=kNXs5fz7^
zeHQCe`Lktvw7I)_(W|P*_7E+}jyp49u@4AzO|pzRbY~;j@VpBsj3w+oT$rrQxjmTy
z3%9wA^(?{8by&?s$QMVM^mY)$w#CYV8E>uv*hP*IWpe9_GZp+laOQyL-KWc&RKW8M
zC!0$lo%r#JjiRUJ&F&F9p3mh?7!c9ASlWtnYwpw8hS;c|TdKo!eRnG%FI@X#3c^!-
zZ;OFf1=4FHW&I^tf0Je={VVI%c%}GolF!QlWN9J;S#T2u5S`aq@$JgNzu@(YtoiDq
zy=P?HeTaPfqWitpHBoP0kLGcaZ&WO5k%UPoZ<Bog0)za{aAVFyCJNEfrS<8$J2%Po
zyT6-^Nt(w`EtT7wWF~>gPeQNf>r^7o=NXVYfyDBACct;jZT#g{nH^!HG9jWzuH43p
zsozxp5W=2&J<E5caaWJQ&5bXdvLe>jKf8}Izat1;!t`FPb-|9nCnjz_h1_p`aqr%6
zS$pGM`V+hN>d>*qL!Y?CK^i}%)HNae{;s>cNM(^Q)u_92XJc^^W{c#PeqN8|D{;zt
zlS^FN2@l%X6Un!YP|-DcAI4^Z*P~i_AF;Fp<(9{_T<KRyz1unWDq(k?Cn%D4?Ww-l
zeme+Oo3C<C@p}-I+3+@&WF~oalk79C!zX-K-=w))s`_F_)X{r+?xt*ycptm{!9At0
zcKl;P+_Z8|!3Rj>43(TSTybaE5-nK8?cmY<-8A4}$r!poVPZ&6fXY$;&+sn5eeH1l
zoZ4b=lixQpnd|QqGWR0Pfn7Tv0mF0E%yMVXW#8kjPGwc!S*UDri|1OSxz@Fa(?Y;`
zlIDUPXKnY@U012ST$4K`8jKT{*+Sm~J`CaVil5Ea!pH?acgy9A@#_Vk<ubzf)sD~Y
z(5(Dyx#ykUp>6-~H<;sfrOEiINUNHs^9}n;pVx=hT3_$2o)ec6*7|qW{uelb%J%zs
z<5qspv&FU8^A*Rl#qN=Z8Tlyt4ga%6D&U6KbiFpwTapbRiX@veD>>$>gHZO41!WP&
zXfl&_whn<PY;*nX;3^ZTtNpNg(*DBp_K&Y_FnNnkycjB|He9BayP97*BStBYXET+n
zE^f%T8;4vGoT+$q_t9g5Pw-|yx6<H-FX_|9Vb9Uw)_=n9z$30^KZYZ&=ATC9>vo?r
zUDJCS<;!`|nU=urrcz5|lP%yil>>HWB;Y$d06W(Z@*Spto!w$`oF@b9*4xX;Vl*2M
z=391_+z7f4kA%f9J<mHJZB3-BgR08QTqU;jJm1xk&OQ$+ULTtiZpAjpHD5F5lfoa7
z;3*Ne!qy~~QiLswte^AG4!8<#`vQ_pqycd?kxpg!8$Rbp2P0yf`YavK$aHNNxEnr`
z)C40NTpiDXJ#z~ixM@80XhMZq8F~QDg|${OE7|H}FR$qU$gWBr!ZaQtUm`F``=Q+S
zn{n&Knsb!H)pE|{E2i>nw<$&3MPxGZWK8Rbw<2{jQCo&_M<-K`*mX4Lc&X#YY3IJ?
zs~$;_dDOe&(+^I8WS=?^!`&TBiT%piVE)tL&U1J>WF>UY=293q(d*>kxLZx1)H6@S
zVO#MQ%YOXNa5H>DS11I}IU@cMnT-8X3E?YiFKB^h#?+O_Yedwm^{p>%6VH!YBkjb?
z%l(n{@C+m|5M%CC)Vd=B1bDGdOkd+qn*sS7?2{2R(1zoCkf_k_D3pV)FU;L|k3jt~
z_Qml%`}XmoHayNAPvwZerk3yEOkbwLKX$a{J;e$R1#vcRS_NNdKQJ3&5qmqHj}rG&
z@x#&VnCmP+F<)QyQGPxRst^`po}Q0*k&Pg(d!6+K7{lc7y8ZnycE4PH{7KWn(7QWL
zzfK3o3fyo$t@obhahv{Q{D?@<d1&<}qClCQ`5~SDF;&J$;JvqQjHK^-w!Hx}vn7Fh
ztS@(iDe$gwnNe!bgZwo(z&0Gp+_n<n1p*5%XL##%zZ~t>B6fSBOpH<SPtSjiz8+)z
z**5f1mUi}oK`xrm3)Ry}+UO2^`wB+x51kTxPZ7V>@V^V4=_TC!Tv0ugHq9kkeybf}
z61bu}?eC6~-yB?Fnah4(`Oxm^x{b{8TOt#FQa`5JVMq)wbXaH8zRpfLierA4Y{V-X
zb#nd9Fg&4s7khKUGp;)(Vy%zyR%#RqUP{MSS&fmH`O(~5X<JRwR@t@l;&e#w%u6G1
zBI(&>+Jj^3>#JIB@_H63DBp#VuCCt)Qk6OFbDj@392CB83k-YWt;N8&yRRL2&vtAR
z0NonJw{-<3OD4Oep)ZY=4t1`f5r80jV&A6pBeFj6CU<1rh(MTpT5RubO5K?%Vp@f2
zytom;+B_35?uj>~EpV8!nBAgtov=&kCpY^tH8!Hq*tRi))f{unouPG@??o&@4QSzm
zv4^0n-Ku7KY4VoUeT{IZwZ=A;6>ZwP`_c~L)_KYd$nKn}1YYgQyorFuH<OZOH6_ZS
zj_SRa4-xI$Z<om|3&4Weh+n6D6$qr-YWXkRm2u%!x)FFuEvgaaqX#Ogb9Z?x<qSLR
z^-27P{LMD?%~Dpw@XfTFr_XJJA!Ni0jp{!}lU9c!hKg2Rg~}&EM#0(S4AHf}>M0gV
zyFvoatSm3O+7X`bSKyS#_5@=|Q7pk;Nl>~<#$OTTOm@zn6GKF)ACsLDShaIJ#m;Xs
z$4-E~wA(p?diw4KrBs`}e|wX!%M77a3&{vCW~!CdSRp?6YVtdMMM)64BJb93C5RVy
ztz?^PQw<_ft;u={N-<7t)rnWO=>CkL!iL96mRX`g{gU-Iic@Xx`Os_Y!gqV3!O&ME
z{had(XfdfkVprfJ5Kt!_+PHRoZ|-S-0<?xF-QN{JOCb=mW?i~WFpx|LB26$*L0rBj
zwrOplE<)A(oYlTlK3-?0xzNB8B*2nz{kB~0S*_;o-o;7WDe={=oV2t*^v9)U;x`&F
z6^0tB=_RkyN=O$`jP_|J&L!3w=tqZ=@B66g+Fy&1$7WhYc65>38?U0p&G}XS(F*FL
zs6zf|s-;WmxULozckzN&I`aw7(Qc;Bnvx%#)P&Uz0IL^h^=Bf+;q^^|qf;T=pD#wj
zZhEp?FExuQKmAF^16wxl`EoX$p6o>(I(#*0sG%qrXhR|sC~hgrOGZvElj6|WD@lgR
z;Gs@s-QIS_4T@`amkf%{sKtEiln{0~wff4fD0l$cs%xalLV5<bM{MIx_gYD{hHNnc
z5eIE`;RvW({K5<9)eOjLcjE?v3)it@v87*^Fsq852Tih{=`9NZ<f9!DznKi~4Z1Pa
zNRvk!nx$lm5fP^kJIjMs{(3um-J6Tdl1ddZAgdI(NEf3HWANo|`zIfKlYKLTp8s7D
zeC5qJhq*_koUYuT?8BiL4|$Z#%@ALQLb8sTWWiWol%C{xELHYX;#POez_d<Q@5rPq
zs#0C{#X#uWV_7Jw5z`@2F=tsK6hdsVI&x4qnS3=oEw0+PEF&ql=@8SuJ>K8m&`bex
zs_-45)GB*TQppG?iH{D;tmDWrlLw^9xbHmn%*&W6q!1b6fEK}ipvY-GM`8{`ng+wZ
z#Hc4^7&~pL!ZrUsIzGob!M$V|GW#UeJz31jsl?Ex&bsOSBjsW;RB~NKI_fG3zKSf3
zKksRJz7YcSFaC`AdDZH5stBI1sF-=dir0hNBV!J^VomL}v!NbHh>A^U2xZN|$qw4g
zd4)pvzss?o1bzW(81g^^7L8k)HD6i_{!Ea^psPbC{`nm-682`lm(I1mJ^r15O2Ri@
zDry?2vJ;A#ktSW1XDL;b6&E+*Z63<Zv5<uYRyv5piZIY$jK|};>%BBXc7rA`!^74s
zO=S>~&7*lTTx4{#2U&*eJ|6tKHEk#k_>PMx(5c&3Q!ed1+h(wwmOYTR9g2VGaY6$}
z_oogs{wgmnA-TnulETm}4y@{V(GNGbJZF5!t?aQ*ESn4!R1yq~jjPV_+J0~i1_w5!
zYU)RgtLR^o8BTovBtt{27g*i@LHm%UmsTBuzVY1(Z!Cp8MTRQ={_64u!^26#wT6tg
zm(jedxttysC_;fBWHHZcjiz{<aG#lyL>5ONN!Wv$0=s}WtomS#d31IeUAX+1jyD49
zr7(MFhcDg~Z<=M*G-Pk~b@-})FBRGL$U7Rw_{dtU8lOLxXv83T!aU5c%Y8*BfH{CT
z#zgwwB5FJyM6-)|wI^x=-3!&71*$FG_BkRXZVFWC7%{az`n+FtKvTP6*7eylTa2&9
z#VaziZA<;wt6*aZKAQT9k<IlxU)~dS>Jx?FaqCW;GH=cU!VY2AKYL%tLqX#vQ>RP`
z&(mPfjCL1n8<H9=!h(9T5I;X7eYQgW^9|M?A`Bziu8>F4;K|+P)PjDxSX~SwhT|~g
z1T3aS(M`h?IEAK4N}pPai@Fo+$Q5t?7qd`_h;KTiUYCgQIUL(NBSKC&T60W0oNY2(
z1}rtHa>wzE?It&}7{h%WF?{Sxmir^13>CL07en_xL(ftn+s@?%N<)Y*2dxAo?&cis
z=s-8Zq-tj<E!N&QLN54;1H!2`YwAm#)6K_(pW4+&kwsLPZUv<&;NcYscFQp`v4!X4
zNfw$OEnFh|-T?{}VOW6H_yzm@)knpKqQ!~nNA#<6P9&B9q6loh!hO<T<bORo<ffwU
zWAuJ8?JPCfkU8lSa%g53(-kD<c58u3ijcgxQ14tFew8WDshKF*#hd+NfiZUgNNX>m
z81<!R(UoC0{$k$T))!kV9~hg|6hG^;dQMyp<1B5LAH!L9;UOd6RpWf4SGhF&7L7nK
z#V+VVs{|b}P6UTSvATD#PbHzzl|sdBv&V933P4W|sP*^+$+Riy?1U$K6(D|7&tOOa
z7zkY6Y2D_{q4=wGEux$r7TklEc^E~G$IDy=!YH(seuV@@8F9Czz|!sPB5Gs_1s0se
zWdbG`Hf3PInM9_dC;6S>Dtr<7(}r0lJe<mm50FMcJ)-RHtl%B}8Nv^prgAMtBLIVd
zQhVgw0>|aguspKxU;5Dd4h&hrVFZk-_Hbo3Fk(K0q3~X4EJwQ%h?}DZ=nIWehm9*z
zzu_MYc7BRgY%LC_M|RvR=YTk1z$}S*=6i+*$MawSR7bca*ci?jvM3?<@Np>A%5qz(
zTvjwzxTq>Pm-TGoC;ceQRTguB2R8q7-s7B3jpTx91o#AHtng;~MqGpm$td#_wDHlA
zh0lW@3Q7KL%UmJE$m1FWkddt)A{%ncJTBV)0nsZC`FX_?m&qbiHuho=Udr?{nHGNv
zoAICyij4IeZ;NeFl-O}%llVnrFXc8Jgq$;K^|nw)-=}(&9AjR0-uD6h+0Uyq)dv-j
z{m{h-gq_<sOqx*kRFXPybEZzYC(6P>47y-Nkxoo>RcvX7!!3rHt}1xYxIcC4b-L6X
z<eo^`4$rWr{qg<214qspHk}g==`G|>Jjd%>K9l5;!>dGPUaN%_s8ys7-F!w5eA@Kz
zds<QjWZn#53K23tV;33o&QhPjI_p6I5`ruX+ZQwMC@AMG`I@MF9}K<t^hKbzxA0%Y
z6dpkI-F3WMUZGywu2k!A<fwDZ@ZEPVsKxHLgl@RmLZ$8LXEVfNu6#aeV=7jKVRiBi
zXpTe|e`mJumgN+;Z`km;c`LT@3K0E&-tgTc7!z`?=B1*=-BUXtXq>Xd^-=`o@R!~P
z@EWg8-*Hrxgnv*kA!HNHb;SyibBDM8oQ)V$BpOU!#(jZjdBEzc6f9st1BjsK9EOz|
zVrYJEdIz}kF_-X;zkC|0+yW(Uw)8*xbHt%ahSobe-fR}h^aFL<E4N{3$CYO;g@eFg
zfp~e}H5xk?g!?_0mMrm5J>rr>MC7gUy;jiWFlkfR(c;V~KC0#SsgE^HsRSljs{6v`
z2(q7KHGg&ErMi`4WDRl&%c+w0d%>M6R_*mdC#!#Y#!5`0ME=^rn5$(JF6EDe9O-%V
z$7COD{}#3z_*Uyi>M1eK{=L&H5jxC+a+Zb+wh#%-4*zRtFNMv@mSQ#14rmFkA?Wg;
zn-u#nGEcD{ye|0k5ffe{#!l8EH@BGckUIey=QJj~XD{Hl8ufnR$HG#*i*z_>cEsLE
z#YEQlUKfitPsz^arSZK5>ep3yAu;kVLL+Jvsu2+w<HOgHDkN+^=C?s)MDWauN6@FJ
zC&SyEEI=QPDi<<Sl<w<u|Du1~%&73SoS14T;$Qdc_^Rqe7Hc*QZHcuO`6^Z6Z4G$J
zPIr17FBoSNtn4TSZtc2u^=07KN$xpi(gb4PTmc|T%yz@9(8TucAiA_iM<gM^DuW;C
zOs8=#NusXQ7A2+5BmoPam=Ts~7%hUREgnuv@34q@pZEpX1@(8@?kJ55Fst|^ixR<W
z@md&Ccxh~&JES}KVE{&x3?{Br&WLIIQETK_52w-Yj9>+YsWc^TsglHEEc`Q?ppED{
ze!o|5wlr%j=~EohaEGQ&$(1)hYM=ZepAWPr`S^`=%4N965PjqIN1qx*&E7XO6v!Os
zU$SQW*6+6OnLn$)<}1hfhlvm#xyX3YH~pAW9T1pvy*M1w`n~W~=X)XNc&isBM8;o9
zs-2Z9TL)!mtQwWDnqigrFCLL($v5;4*W~Ct7~P_koYh}7F&_;N0@-;x>05qdlf7Gz
z3<!Pw&^_`%GILBegrzj`LOje9g=3Wr-{+M%_#R3A@Rr{?==mk}0C_LoX97b|ZHD6p
z>pT$ZOX{8iaM&#iG0~%-e-(b(JkT4jTZtDG^gg$0K#kUjy77$>2^P$-2p3*AnVywR
zn(?zb_ZX{;i@&*r83jtt3AyNmjcD`BH9Lg!qv>eX+b=mELu=fujCP~n0s0;ubgU0Q
zxZ1(enl(qBQwc1|zccGE0+Ph($CJf(kl+kumg_jl{7lN?MXICX_a0;X%+7JONDNZq
z`j8mAp_KEL%@6yF;0q!{@ZbKhZu6%l29yI0xye!{IQq|Y21h=To3|BF@4s!lq1epX
zE?$5$XDESBxehTwW{C3nXktkDuzGI|Kr?VelJT$mdUcXLp>@5OPl5~b*~PG*c<UCo
zL=yAb$&$Nqr^_6Pz`}A{1Y!MG?HT#iqkG}oH$3D69F6U|me)f>0m0LD33HdHc(Ar<
zsSjfb14fVg*|m0tKf@$rT1d1zGK$cJXkt$e1k8=`XT$hlCTlQrq<}RItT08myK^{5
zURziMW!KZ9GGy>>YBG~GeX+Pb)O#6bf9_qfJ&_)Dgo_(Qb~9hUHzk`n0#{j8^9{dZ
z7aHw4fln{BMzZ6;Tlk|J;|)-R8u<5<&H?C^Pj$lYllr;3jQ9Pt6awCySSV<Uei&Y(
z6-9VY@Qs4#7JjSi5ZgC91|{Ni{PXK14$h%JTn@5W4A&?pd`Puw{i`@*Aq5%J&wQ!p
zC@?Wrxq6uV@CSbcO@$$c7>;;s9OYr9-4t`Om&vX}QlYuQ_W_3#E>>Z|<U%1+#N%LB
zK>@rMqa%~Flpqfq!LWhFz;GQiO04fteJ()4KYzFOlL6FFBFMRw$_SFSY4d*Q`VQy@
zGNj+=xVzXO_$P!(abqTt)lEqRl<)Ed!Vo;>{!A*7-Ash?Hp7c+TW5A>i#+;Fk_?^!
zaOkRBX6HzvKVHwJzef><B`QLGR4#k-<(fumW--&PV)iL29LJs&l4X0m&83rV6ggS&
zW@WHv37Nmv23R*r3ikXMsG}8EDE3PBlWGFz-BX}yW=@1^!uSNRonK{IpxA9A(q;gd
z`Qi4y;-_WmTr=UxLA0VNlFPq|A6%d2uMMT!RuubLBK88_j%T78rdTB!dD%4^hRcLh
zzK~2i0O6FUpd$!^HJ@d){{o%=N;5uSu8+Z?6us9&sBr;fLgjyo=b}BDH>}i60GeVh
zLk*D>jbris&{D!(0N&6QF_d0eH*j;*%ur_zRi1L;LbF%uB~M8Mk;C?JVb$*u6zHLs
zZcbO;&|xdEB_2l3;vd2?XWHT1PYVoK$WKYm`6~0=qG4p$^yhVwcP;cCxDl32_X%>R
z!0LMy6}g#*DjAcnEsbxA<UKz9A|thLz7})Z@T|+)obt>|a^#h~SmQ~0ukqNw;?Yzl
zOl)$RAz=;ET<2nO1x8ncNY0;0qWIxTO^3ULPglydYsrO9;ZJp6Z0S?qbsbCMTjIY-
z;QRb786M4yyF<=K80%<;_3hI@&lP(dZ8hp~nBOeooj~?I;`L~Zn?K}|*vE&-Co&M}
ziwU0%pypMwU?3No#=sfC`ZFYvxPAX?aNj4jO)T11@RxQFb~|e}JY_{GL_=0Ys$_8*
z1xe*XC{=@Pjy=_QdpI4-=;YU&UD9NdwsDBVYmq2r2w2Z|1+<BAg5eHyw9WBAKNJ|A
zmat*)lD=4Jh2yN^3mY`92b3qytGyUY`9b>>;H}x8+v>-&-SSQ_EGln04H6JOAnMi0
z(o^95`bzC+3|gEc0+BDwZ;>%E{FB>di7pfNm9c+GtBr5Vj*O@OZ`q_X^asKF=~Whr
zzMg3vs%4uApt>%Z29qc6i?6dq3AP)ez)(2^q#dYF#QlMwlr`fkBFx)C2~0SNKW6TP
zD4px|<y$;aG|`1d1aWI9-V_l(^+yIt&RK|lNcC+ff5K_?Vf|vB&p1$xBMRFG^U`J+
z39CbFbF>zl8iNURqcc8-bYwz}GARAL%)>S@{rLWO`8EyN2A1Z|P7*;qR7;_3Ui+}0
z!AEAW>IH5uB);O<qW2dBjPWP}B4?p`!*03*9B)Rlts69ax#<&%3Gfc<?t<zkNd7u2
z;}6vo7pH&ct(~JP^q%>oZ`jPrzU7rDr7zF0XJ~`v{S}XkBC$euxY6IRKl;o!Fx>$W
zYB#Op0}hZQNBJUgjPde#x-5GIsm$?S*Gd84ftl^$>lUy8XY3q{v~vN~SX3v#3nGgF
zjr}^SEB$A^X_Dcg_H^u`1ByszSUU>ZRGg$XFPhvg9y9%$e&4wdX|5d3GZ53UVm_2O
zkbA^rV^Qx}|J9RRH&&C^H`?s>p1OpAdrs>xH$wQGV~_*5`8z|ccBwiO*((?3DZtpl
z<^o*>ry5F<(9a2mal_5~OjlyM_}(SS7Zx|_Seh-D@OPpvg8Xl)+)YUL=cCHHDe>D@
zM(mDM>@z|hZ6C#nd`c8F&9e>Cagq?mA?B<x?O2i%eU%R~0pJ1K1ooANeT+%Fu`sRy
z>B8GmLfosL0zl(D^hU?)VKIt$4Jr(33_fq}TY;1cd{SOm4aM*b`*PTh3~IgD@!=J_
zz$#xfYTPj!ia2f9A{b`RI*jm+pB8>$a1-bK`KnPy<0ja%06w?=UWV7%9L3A0w3RwB
z&kH^G8XJqL+XBC9imVfsVjBzQj%Uw#FX}C%{`81{F}sa{Idd`@@2Ci^fCOHeOEVR3
ze>(fC4b%&eHBruh>b>I{7<+6ZCaVP%zRP=Bke_xY!tnjKBm7Xy63b|5nedxBiZ3pQ
z$>3BgN1N8X!Yp>r7Z#>a@w%1fr1J8c>K&<_EOTGj*IbIByNUejGy5d>4ogJ7{9SGz
z`zsgHSNmrMujmt}&_w6_snmo;)ijbG!ki=DhPa0@A4K6_1Mq7Xz%lxQD>{Qwh4UsR
zvgf&QpwB5^kSK-uawLC_P=UdfLflvysxI#vtmzSc=I@qyo*8LdWg*pJNc92h5RtV-
zA?FU#dUa$8xbBto#U-{_Sc+E5o76Qq@sNA^oh?0BOJ6*eeY`jWZn-xkL!dVcQpfG{
znGcM9QJ0|ad79;4LFjIKQ3Rn{hH?LiRqCw(N5iLFH6l~{l3H--p12|J(i0m^Z^*}F
z4^1plhlL6J1~p9%*)7bm_uE0%2uHGc+sjUOP<h9AG=_0{p2?pv{I{e(e%!OLJhx^`
zAkK&t3CKqq^S~cIi4dGZMra8^=C)?7-wF3uo*mMN2uP$p2F6ifOt_D=Jjb&1cJzPF
zpfedYk(<c=29u&X+%yf-7A}#wuLO3pIX~eab|)peZ?_FVgx5Bi0n+<q?@XGUBy=)_
z-Tzds*yZ?dU@HNUU4n#H7)@4XGq~1-5^|<J+UA9rOx8^Q9{>?R?!VnLm2)3tvtkot
zlZDD)lQ#S+F@|F?1J2Ijf1wgBqo0(V$+5YCzF3$+sW?<Dt}YtApgfO$NE`PP%6SfW
zX_PXu!ZNX2e9t*{_R-5x1-xADT(oT!ZKO4ni~Vd3PoF~Id*?`t_?;6*JtQ(Rf8>ZZ
zn;keC8~5o%B)aT)@%u@5;;v$`Sja|38mbS$QHOYc9?{rw=zdV^VQ|yhEO>k(4T--y
z1TEaD!Qz}f8G%3P0eO0MsKro1671wF!<FWsG0SK%XK7(5mV%X<*`jKlnl`A0W|e&H
z)BZ)_9S^#mClicGme>CZJw@JShgnNlKAkV%J<csmsFNBwSIC#5YhnIZy*(4)Q3)mg
zMaU6ec6JZ%gqcNBL@`iHM_Vw+GBEYduB0AWVtMSyG>(cSvNVx{zIJZGh9^k8hhD=T
zrPs$E=r}}>t*CIR0O2CsJ-y`kQfQjA_mxan??7L_@5WoQ!E{vDj*ER{DI{cthwHIU
z-l98~<h(STp!r0TAEQpRtxg3Tf^iP|3(9u5HP5@SF!rhJhL3po*-OLh49dG1DpNr`
z$HCb*HO_<i7!u-DJ_arGA&~HpFLn=!iqoArx*Y$OW5R=Uigha6iYfsUl!I1@|8)5G
zKH#BI$l|zw+UZ$U_4}!`T4Xbj42Z`$@!Bl7MIh?XYsk{iC?Y{wrRCM9P}(h@a^-&N
zre%Ak!<D&Wcp?cFz3)RKed2gmrBiH735@)A#}*o1u)_BBGm*P^90l}kHX)Cv3H0?t
z{?yRm(&>ba%4=l#4pp9u@Gw(8h)UPH3)mt5GCEK6`7xh_nnECX_f*k5rH0g<P0(|v
z(PE4adL@{XtcQ>Vv{?@^MkV+PhCUxHU?+9Wip`X>TzXQi4AT2;+lZfMK(^bu0nT(-
z^N`)V!D|ax2KO4Af{rsUmM{D1C+vS^KU~G<M-T%ylBAX9**=M$L!XhKiTx<nIAmdD
znv=79asgdR%mtGU7w&kA{zcEGYRR8Y*d!b&k>8^Yqbx0kJKZ!+L-HH&NG{vN-$(Cl
z@X)PtB{qDRM89ni@Ac6bEu_C7Ud+a|Yz(vIINZ^Ocj41~(j<Ofz=YahI`HlC<f6w_
zI+aerv7Sl=Yc8Wz%IUEcIM8QQ9==GNJQ?nBL3koRpAE|KQB@{nusN5sB{HZa&!)@d
z9Vp;q8Ps!xP_x0oRjQqcHt)+9qB<@1H^PPbwi@`c1Vc3~3-xO;NBc>1b}sEM4AE&o
zfJFK3z`Jriy_D^x6Xjug<?%nU8+$Ql;~-bY4gWrB(mE<3qrQi}K166;EZtp;0QRT9
zZMcJ0E1OBqbhaA)DX=HWyJex=<KGKm7rVvz1VTvNBc~2+h7mb%A)13hYp#vIN_l#S
zE{#p0DkQw<ESu=Pv71?UV0!F+>e6C_mdAdlA8~qTAXbFY;$th24AjL|&{lDzLK|kS
zAK9nKp!_-g+W9u^qBmfc+#VpBxEe(f%8ARl;Tt?h3JxE`#M$Spqi102e-Phtp*y$Z
zf6kiZSJ<n?Q5SvIeM4g&mG6D2R(zMEG5`0J7f*4}(-2&$L5xg*V<LQr)cp7^xRZm9
zB0KKx@zLi6gbjUb&DQJK-SkQMZ2yx)-MR*Ldz8;u`5>)CC+p0CTg9B|&S~<NSi?|>
zc#``^5Bpzt9kPexbSAsfy)~zv?ub1<{6!=7_x!C+`L3b;7&SF^_8-2AUdt&)lQ>zx
zVe1q4!W}(Sch_5csf*ULi`*xXB;1)pf{AP3^4y&52O0<?B}G2hx)J`&!ZdY}lkwc;
zpchfmzmR(6?ao#7ZFqJv@{3s{;+fB}Wwer(Ik}u!u*;WV*@@11m>yprT}EdPH;NbW
z)Q8SkL{YrLResMKUMwj~X&}@EvrHH)5<@(7;9yR3Gv*9J_maxl<IrI?q1jF=qKe|k
z#lo3AB5ldpM)M0Bgm6HW+%v>$_^uD>pRk#yRrG7tY0b0&F1o>gt(}}+Rh32(@1ir}
z2j~)_Y2P4i#(c}s*Bgr2OJXLQV(Xo=hmwhp__%WqosRXp7(EGPx!Cj>@*tA_l=Da0
z!ut8y?6nN)$u=9FpO^qoq7%WCY=n_hXacdWgw~aR);N>!@3OPqtJ!E^FBRmv_;ZvW
z$+o*7a7Lv8p1jfZVnRS=?#xwwB1%1BnpE-e5>#9zQqCIoCHf{+wr;FzB>p;jKBqRR
zu(71!A-Ihr+Vt3Xb{cJ?d?L=)70!rN6us*h<r~q0I~w}YkU6)}T3fD&|E=PT6E{M_
z{I+c)^jG;0(gfKabm$s@@g?8@nCBKxkBU(bV>ZDl`6MiV2l0IOwrVV_7_ooX1fq*0
z4!GC>M;zi&C!W8&ghaiUBW;uycYP}#x4vbY*%xUhqu0Yb6Bt#6RW-w2k)1UBuUIjy
zf?qR6o?#WLp+UWr%b&@A=lp{HKqsNAp2|8#{~Z1=7pV`8Y=z&-#ZOAHrQ^j*Cenqp
zmmh9fK(M|}nN!Uqy%V#;^*l9LhW5Cbp?~q;*UcyFGI~?a6Z9(ZsI-QJ$}4$;okTs>
z2wTNp-iS60SH9{NYYUt{ekhjb-$7k_o^j?;&iQrh1~@5?QJciM98BbMX2ejQLY6?U
z;dfIB>&T{a<kd83y$j1qNYI_6A@<;kMq)b#+eo*=bNt8>`6Z}upbHfmCaf;w=XuLG
zej>k`ZIZS4Eb$B{dvv*%Hpd?YCX;@^zu}z5qSM0>fj#P3;ozc}B5S6?G97~iF}9!g
zKE^?j2$?z9-zEf_cQ`2Y03R4m!S)GAE?$Q7CSYLXVBSKt`QFID@LtcNAoa4hz~@=?
z(UF(kI*5Roc7Y!~^Qp{iZ4l{4Cq#1n9<Ni7GvQ2LR6X(#WdubX)Sxw6eiKznC2d81
zD<J^-X$qO%tcYi2=C-}!-Hy>4ZF&<p@++On=D^DW&4<esRHCI5m|2l8BXepA(-IYL
zbUHVgQwdQ;pCMO@mz2|2#Da;8680VO58uW!P_46f!pD=~cf=bxQ@)yhA`WIC3XhL{
z01r(R9~9_=^1tYVXq%fdVsF8wiRE9(V?Z;M|5WY24>oe1pG9oi6aE@`hB{TQXF7v$
zkGtU_xga(d&9t)!9us26<#WWYi7;P*ON;rVa)C3&A!l9EnD2-!Bl^&@E)&_9#=nI=
z{kTM5gk~8!irJlXHjeeV^f&%YbY6PnwrAnTvYlS`72q>PwUkji;nIk4nSWKovp~4~
z+noov7BzgllnnYlm;5v3O>lRH)qMC$+2=nbzB>WN1j{1>EXkl9<r}OlAUynCAZ{=5
zI5;{bHnotMeJMT0dg%vSw=BRRg-dvL8<ZQo;$C50OjjJ=MbEO%qci!9#X-fK6;UFC
znk2uu^bLwQA%b&|Zi<84A>p2Ai>7v(&=j<<XY^!w<~rwi)1gl%VKJ{1k6u<Fo>p&P
z7>4W10^dUy2Q^Nji01|%O&r=nI-z8Gtae2U@!v(Sm2=r^t-G07s(4K>_PbnYrKtTZ
ziw=u}$0v%dGKsQrx?S|t4}Hg|Avyu+uNW=mr^{E1xs$sj_#(^7b8~c$c-#r^l%j6@
z&PjQnH^1UKuTWFfHz-yX5{G!1KhkXtO1-IMyw-<niB)3OY#$fnx>6g8N@fbU$tU(T
zRA&><hkmhhrguwB!fk=hRBvJf9GK-w2D;+iuxAO|ZNG=sI?&&r>h`wI;+;7uTFqy%
zCXuL1=uEV?!`Bx4Hj}yvCF1iuHxstbApy_9S?nIB-GVy@3liOH0zIj|1mrd{wLZA~
z3?lJU6q7*1nu1zid|i*#-LB*j*Q(ysK#yO{lj6xZ)~yXROMQc@q;*}%?mo|{^SJ7&
zDtPY<W~~nQ&3093!C+8sB|fu0*QIKbW|a8qD?XpbXhvWLPraA)2+i^C0j<5qO+AOE
z2iDB!QGHTJBAKl9P11C=Lks#~c|Fl{I*C#8_jJUBe>K5x)64I5Q*$0FwWafju)fw8
zg`Z;H{WG38nGn6>WWuP?UHi$Bhp4U6%U|?f6N3-e5>3sH`MG3jm6lq{SV(`H#KJjT
zm9NelKZ&cUveZl*nNBT#9y5?s<`J%^HvwC_8&)faTAJSw*EYL@LZUz3RrJMd^IclK
zm3W0Yq)J(rw&B?{u0PeIC}j2%MUAsbos%zoBO8aKDw%M9(s&zj^`zR?#Fh8c7)i?6
zOFF$>XK<_H{d{S$(w6F~nmW+mwbGO5CAG0%EBIztiPhCJg-(pvF9!~E)%M0a;=R3A
zGAB=J!#!4FRd=m--ANq!L4E;~>K5<l=hrC5$;(-k%y+)SbNk$sB)n<;B;YL#N2k<!
zn;WVt$#>6F|MR~0`p7KLEn!ku?I!!4BT|37t+P9YHYtjnfr;b;=TrHm-#t#)$I0Tt
z-h5%-eS}yrXDt&LP*$Wj_EFaV-Ccyei^S*}m$anMSLb%@yPXKwn?TVuYkMcA#a{D#
zxc0ky341SG(@bW2g>{UtP65*T2tgYU6g|)gtIu@O<9kPEuiqjC+EZ)0lPRnH%KLX7
z$;rQC4f`#eJCAEm47w)?-Ko`mIWblyQr#rtZX}YMcLmx9x>}u;Oihn>Bj<f>F7dff
z%?Y^k&)D`rFPY(dsHkCXPCnea*85e$C6z5%RL<sOwLScFQX}Vf0hdhF4Tw9x%UNI9
z*J-JWl}si!q`Hp3BTen;O|=iS_1ErySWIo&`j6~XU+vmNH=6-N^GWUD_M$iE=Fo2s
z=2$Syc`xIf<Ff;+dgJl#=}}Vh3U^0_dwNSbaTlS@ADIV#t|#5}r43c2088=Bi1)1-
zX=Cb6_GWJ`E<0s@RZF6;-zslRr1egvO5V7!YKqHG)$|3Ej!mZBlPP0{##W`_(!DAT
z*I%fj*^(Iwv?k{48UGbZsB5+efklg&{8e@<Q+?~$jIrT#T;>j^GpRmb`l1{f|8?L+
z?S^z$m(@0J(O5i9i>EbKQ6ZV=9vD+8E*&amZ#=LjjWp3$#&mkIPRDLe$7S`+>3-wE
z-Rb`DgEyx`&PJkmq>W-waP{@4dgCy(Uh1oAkM~=NWFJgAm82TK+YrCeqYGTTw-#m!
zo(_TY>odIV_(wBou4jcH;P-{z(*<W<(F!476#}W=Rntq-#?BxA$@$~65mtIriA@iV
zx4t5=r4<CjCx6$Gw7f+BKzF=P5&zoYzla&=lebX@8i$a$Cfa@HY%HGI(_gEHbuDE2
zFBH1^Ya?T|6qjf%lSuhmPR*f>lUOD(uW>EU)FtKySTWt<Db9f6%%ZiYc!y3A4?CQ!
z^1Y*Spu0ETmRi+qKiK=g4ZiCfQcX|YsrKuLeVz@c30>BD32L^GE`Y7@$xwE0{EUG_
zuh=Y-KJm-by!T|1O8A=x$I>$UttF|ycfEuWxno&&e`mZeE_t8lnZ9b@GY)o_at(R4
z%=Y22_Kg2OF5T@JzMc#?l7S&qwA0B9bbCLzc<yN#$|)In?WuTQcWHmgDH*<Ja=dTl
zd2h}kRh|nnNI+SeVFRU-Nno}U-fic42fB-PWWeV;>2A{Foh0<$Oh^C@x%qM;?Yfl|
zb$XoNYGpahnpXE?{HY(^NyM)*g@D!D)p)DmnxBkYeb9ZWkW8l5MyoemMe-8e7!t{3
zkuMJ(^#}v&e083i1zL#pw85&0#sZqn;qHY?D4gLeSyAXaC}1e}6>TeM@M3Q5TeF~0
zNcF8;>wVUvro=+;YcFMb9YqUDE4$-stETp~#k=FRn)V}jP6v_zeIosdtnqw1k?X6j
z8uRBZ_2;oYs6M*C$YuQqK7G*X_L8E;{ke0VBVHwc(38h6cTa{3T}5JE;BuClB?Ml(
zME<WBkZW&*faU7%O?9uDzK4njw`mnbd=(T*5RT4W5L3=33nre(Lwx)49Oc!CMSm7K
zr!qCk>IG?qTbUYb`t3x%5U$IF13pjsggL|cW6f!&HftHocU@lp&GhlNW~HtEhI%h_
ziHp3eOUYO??SIR8(KKR~7%RsvU~n0_;NX<B!CO3k)TR;1^HTom!Zc+@TJ^;q_RO)f
zng1;}p3NvzxUm^&xSTg5t<mS*uwa7!#TT|R;)mXgr>4o%_P@hY_KdOGwErzP)~1P{
z@MBMm!)4zS;~J-?u}_JKyrq{F`j5U4OB3(+uJ)!~xtZOvx}1zXJMMqWhG)mIe~&#s
z4wr+^k6YT1Hg<Ge%h7QSGxxnbPMtS)IrG2elgpW+j|(a;%=l?hM$zQ}UkYOjig0ON
zQ1sCr#(Si2wUTz_ZR#n5r>4zaKsq!scE1ysPwscZ_@Xf@t<FjtE1g(fI`N~dw7SQN
z*jc`#+>%T=t>axfa(~@y(xH&C@oBj18lUF7ZKBZEWhH%AS1}#y;HoNN&}v&RmT=9v
zbwW1N)5}isee3r5s~BlM@AU><I9lv-rq1C@lbk$~f^G{gUniF8-jrxkJulGSYpsp<
z&Mna06U38)TYlI0S)PkG6!lLQ_fLjbg9{5uLvckh-#Vs=pKS0Rb}7rMJh5P2TPm5f
zdisiH-oY+trTS}sX>e-;%lf`i8BH(QrQv7b2_hB!rMc?u=klw^G^S=%(N`MR(b18k
z63IKF3F~To5tzP~taoyOJK^yxbpPi!$iv>pwTkNp=Va?1m)<>(6d)l9B;y_ZIWLYa
zAanugh2PhXEhIS$vs+V061&Fs5_2zcF5Y_wAvHypE%F`GwFh-&#25PnN=+t^5RaV+
zQ>sMfuE6IDCzIm7HYBOZ0J6Z6=4?_^a;hh1(Td0P3drubPiH#y1#?KB_k!Jt0hm$c
zjd`56x@p}O##utDoYDAl&+~!S1L+L1%j{k2KTPax-D7%Z7GL@Pj@RAPCSCgPAtGtb
z)N^@h-BYAuw2GIf@1*&(M9voy-Tl2vzu~5EcM$$A7E;~G^`5#-1@Yb!@1pmMtiRE@
z$8%18KCSpqv765Qg4!<&q`KR!-Xkt^mc~<9P^rLpmQHsQ&GNYEdnIH}n0z9o%^v4D
zsHs0M_wT>g?QQ&$P^#6Dxi^rKy4-wf)|+m+u$hWSL~mBEI8I&iH);2r7Cdi!I{&$M
zT^=J%hwjb8kFAHxz9i0RW1o_PpAt+zaQ&tEcP#uYo&T6i%v<!y`^5e;_BJ{AHt`M#
zHy)zi?ZPJ?|DQ92j#S&g?#C!;qygN_){T8g9{iAG$1VH4`n|`9Gx*eU#vL8|hzx#2
zit=1@V-v@2sNQr#wX<LG($&Y)$s*5PcO(70>@mg}`EDll=+0`S$}ZwPCfxf9{340t
z0&chY8(SCPy|+zKI>z-@@^gaZ!%Fpyu{AZgY*<rs=o;R0Rt@pZ-C84ek6p$8b`>w2
z+!^l{`<1eeM0dN?m+Ff5cfwoe7pzYWNNcU`e#o5!dy|r6Pu0;|DfPh4eQ?=9)D3Sh
z+`})a<>}a7zG5#w7D&V8#z5MaAH&a%^3pkfr91PLDe3t%zq-1KQo8#_KJhoz-SoHb
z(yPC!(;g$e|4#3YlG@k3m5yqKoY%{hd|ZF%y7cO$Q;Dy4%~T?d)jPkdcZ&7S>bpsq
z{a#5MW{QNB#4WJG=~|oWO}1MP6!&-bCI;h*6q7tpPb2H|>zG8JxKtDDi4CYgdLS)}
z>5l{VU_o1QpbrnN6f-UnGexE~1%;O|gYmI1(m(qm{iB?;#5v+u!kkU%)hAKypK1A&
zt<z%ZJl(w|U3{Ws?x*Q>e>>}bN%LRHw5^AiK^W*w^l!g5#{b}bC0me6q(yMe4ldEZ
z{*%8*&Pi~zK4%_^`PYELgEJvpWKx4-d&zksQ|`>3*AwsVj>G!POD=YLH}Y4JG<R(5
zSMu7ggtUw6FL9v~NNhOx8>W})2>FDjA=ZtJqi>C)1&LJ&%%OqAwi`%l_g|FE;G>K*
z+a3Lkqjhu07*Aj0Y4O^4Yaod-rq>dmJ#gx4t2YX+ljE&YlQZ<m-$ZF3-~B;67jx)7
zn3_iKD_Wid`*Q^3#$9u#WxHznF#g@;aQrbO^*eSWOwtLB9W1HwtuHF*??h_eZ6&7v
zeLdHjOqKLJWWONwzy+OciGE~P-KYiCa8*#P(u}GOt1aG|O09u89<j$O^e1}y#*(ll
z3FVnreNRJkQ4`0|f^Erowbbam`^#fo+j@!K?W&e$rPjhkjzjhi@h8xto#G=;z$pa`
ze)nFftRed=`IE7{wq!|buAPKy#2HtM)sHt)lpl#M-=C9-Pup=V?0U%7)>Z5$LSI!!
zD<m73-njqdh|(4eM#DzPKx!FPdZ2Q>(AV462Ya6O4qn?`M-~S<6RSD{y+};MR>X=M
z;gDg*!*r%gQWayJZ)JY577Y0$E7@P`E7|HLYDM`KCMEQ9rp*#pUP0>KTW$khM<QoN
zwIiKURw4s)Poi^rIW%UxMqE;Wjs9s-dXdSEEl%IHI6cxDx91c<;O*-}uWm2-o*R4G
zz3FLp!+`Ql+UiC&LAp-Po001NWb?KCp54yMwcYXdYIOLS1BrHV*^_09ER>H@Q)*SB
zdu}v~pEEWmebbzD(nq(#pL1)FcPW+;j<oBV7HSKdR$Bbr)w9!;TC#ptrLKomGt_Qc
zTDwXc$7ZFUF>CK!8lP~+*<(}E2c~F|bW)}LF2eUt%}oX!StT=?wI-oAH*;x-5NYI)
zR+pb&PO7%tpZ19}lPo^((PlY&>>lyAdqifwWleP@dJs6oJs`x_^(3L{Fq{#CTaa19
z^<q((fDD^$iq?8l1x%t_oSX?u1a?MVd%O<?a9j*$iYpG2HPhoyduL>hjm!LQT&6fK
zGylc&_%sjWgeQ11J1Qzu)4u&!`483H>26wGPv#VpIX8}rO)greqnURF3ta8-!FUp`
zdgjJ2i1)}MMw;P{zV<a~Y$Rjfk-_gs(NCV7@6D%G_@dEuV&aOi_@b8hBCdJHT*Z~P
zI(>X~1-Y?0%~fNyw)PgeADO<4Mx?p%ejKSazB)V#BcyWfP}=V0X=9eqXbEJV_nwzM
zJBP`Ptz}<%c~_^^wx&<}gnCvAr|VT#0QqX5t*;NYWuiUM9`8y8Qr!XXPqScT)|klS
z(joGZn1qK(^@|osGx0EqKBly!HCK-P$zAm)r%k6p#ZaSqR8>vA&9vY_Zqt7`Olu{7
zab=N6TdRhy-QI4DH3(XRFeggKKI2+G<Eo!wev*aanO0Xk(AH^nuYyvq_ZoR$cDhY4
zTzTkz@vhe7^z-kXen}>E5BT$f;i_b+zb`(SOJEZh`l0#!{L6#@0*reF%HZ1z(MfRW
zn366u*~it9gl~PF_xxOV=N6ar$>!@<DJd#^viSzd`G)vou7EHUGv<`I#j)P>gT3j>
zE3{IHM57%>YZzlPbXk{Rdu2~qur1ors<vD4P;{&(UF%8T&`p;vrDK<;w_KjCW$|XG
z0M-1y^@1pzI$b@r``)sJ8fhF5*wXXP=0E8X#O3)NXP+vMA4>|qC560`;}|);@gn<q
zG0_yt5bFlolk27KR5#q2&2=RD;r-j0t{(XAEvVi{tfESxq-O&6$>z(&MZ&PkB>GF%
z33IM~MafN*Dd}na$UW!%iuZmlYy6oCU5UQFeQmj}c_=5Fd40}L<D<u_-zGdQteqo~
z-M{j?TPMtZh3QPdkMnoeIq4oUi`U=!gg9%*J|X))ArcCu_IPh!XJU7}oE|4lIp(up
zko=ml&&g$<6IVxSpu7E`IDs_gXwQCVZ~u@Cen^TO06%fsBw>t&O)Stew93rY<AIx=
zOqrF$yN28Fbvhd!n@X>mO0)krHIEs0j!mbVrc<O8%hFcQproGPjf~=|M(T`?&7y;|
zsJB}dH>jj-``CC-Tof<8hqN7ksqq5GhQhS`n(y8tp8sYZS<2JjTKJBSt?s3Kt4SKy
zjF(%Hc@BScFt-%~g-RPOKf5(cgPA4U)mB)|jjiE-Tf++|w<Y+kMLavFs9bD4KSx~1
zFS8K!y6yRUB#hAR{z_>ul^p2CT)npp8s3+zHF0|mq*V9e$zz9dK0B0i@4M`F64%~m
zJrmT>)E-3Wcz<858Vpt%aMnFsrD})+lO(GPP1av)1X&;hCB3V>c_JJv%9-GCoi?X?
zm3QH)lCRrX-E;c~uD12H1AW?0t5+XlxS5GT?X0vN51H{a?Oa3>T0JM9j2-72kMs1~
z8(Y#7HKb*Mshpg?_dSv`b?jsE#K)xJ*WE8wkp^qh-2QRfAE$iHcgM(YH?aA2cf3w&
zpz<Nl3)O;xDafNnD#k^`Pahn59U3wh21xaa2&;NWr@((cg8!J=_8exZ0l2;>Z*8yD
z(-ZIYzBPey)PVk;_do~DAU@yaKEX<KOG<zUHOPBGY<A1;OeY6(Cv&|iNvsNsr-pGY
z>G@&`o5l9{2XZbYoiOhasV|v8IPFZWWo0`PdB3P;i}*%1g9)U-6D^Oh&E|i?Y_U>B
zI7Bp<*ezFIRz-wP^q2#x&07b0wIC_HPI;bK&nsOi?AR4u^jk`Ec;DetW$uSUO>1u*
z^ep$>_3^#`@x0YV>!7&X$49wY3FWQNGa)(IeKx5){1AMUSycEChEmZu*Wh^{J1_n9
zECU+;(OfR3yOuVml|SY>G0hcRvReGTfW)isOItdH<digg!`HVgPMiH)!>!5{RG#hY
zO1b^n_PlJ#L~OwMA*F>GL=yj#$#)m#=42?hQ}|?C{>+?7IefMxos1Z*tfR_R^x`cv
zyHZ*km-^wcd*NyiO0bosq%u}Z20gFK@YyGj|Cq~aA568uV39r5R%^V|N_N0^?oM>h
z-t`jF<HTU1eZWdeYdcf+v`_=_K63|gS$*iGU!GHU$LNAvD$c0R`BeO+Iv-uH;@gK|
zdX1|ufQMhXMV#~qn`=BzDcr9Qy;4#1NVLViVqkf$eS(Rv6W@G)y1$hF6Pac8W1N_L
z#J&<EI;QQ|OwZwbbv4lVI9W%xlWNa%5}8Evl$##0Ux~KghwpmQHMpv7QNL^zEa{ON
zQ@v6He+rjKbypX0=Gn6NZ#Vn4|4GvC*?8ZB?-23P<Ctm9ROY^;MB6}=R|#3%u#j8a
z8He4uyPhMyU3X7^hLqQP0}ju#Vs=j|nP^*2N0{ya{3rLogCswp-A9<-^$qt%n&KF^
zGpv3~TAWHH*HmAc7;RDBoVa9H^b*qTJMH%AM+oA=(T`We(~4-7XSIy<3m*Oqjyd*S
zN((nC?-P;y10>(Q_jpe|gOL`p@!p$h&S=S2PG)|UNR76Kg>M$$5jex;%&bnb`)@aV
z${*w0T3y=s@48vO2X=dMjuHvWQI?M<HFNt|PLh_0-#k8ix;>ZF(91NVpa*43N2<4L
z&rJB|ROHqldf;jA;q6RfaCil2^PJO55__^3s~<Lh#--LuzMmxV?ayGmBuE{-aq)+C
z@dG}uy;5pR_4dHonkz1$=JY&!D(TyE5!comAKp$n#O+@&m6CX0342X3a-4W?BHrB=
z_biPw1AVl6j>T>{g$;yCmi=SvQ$w$}EN8v1-SXfsY4G6$^G<Q!cWLfk<?A#uQ#|F?
zkz3@On3Ll-o@GB-edrJ&gXSH+eGd`3M!Am&Es5U#(WtaAj?$oiy)?ghaqrdX*QPut
zUHRZz%7%uP9e9|qM)kwv;JGVz-A=^joe$ndz~d6E-nLF{?RYxt02UQAA0*tufxf|C
znDf47hSPW4PU@DfaCllA-diR*e^)+dNT(<7OsBW{DuL^_dX<iJB|;v_z4D(q{GLf%
z-I8wjU>O3-Q`MyRfuGHj9pb4DvdDY<Dfp;l>jv1$k@X{Gqzf{paBCAuXbFR~oG4or
zsNgBhUoXCy1xtCRV_nJalZGZSK1sWOd|;f|y3F&?fcM6Fm(-tXw>%r?<g5&2@F!<?
zrCJloc>Z$F*-MoI)Q}Y~_PZ(k!h0|0y${EX)%lchIO_i3IZWi>DR&_U?oJh*+vR?#
z=y`E$+dN#RZ<|-q>+w7;7Aeh6uRBxpG<#2;?wsJAmBnE4zfbT#TJquYtG*yiTlc_C
zfzQPiS!(UrNO#3Z_fYL%vnnLjV7Ir_;k?NAK)uk~-yQH=oFW1Coyu^ywY{}1svB)a
zq}A)+JD-$1CRawn?a{CnY;A3ew9-?}a)nb3&3lFl>qHPHlJ25kpCj|d#;=PuK1o6#
zoLzkyOKBY|P`dmZ@XV9TP)PWa(FISF#CKv!6jT1=Oj|!}%Mnm#1z?w3{PG(Y(wF{J
z>^x>=YuEnf)kC@4Z%Ts)<~5EWAus=3dErI)Tbpw;g)<xFZ|q6O0`O(gjJTq<b+jAp
ztyaj2YD(YWs=#J4qiE?$IA^G!GcLt?dQiY-^!N&O|6SUp)NG+6tj{>xO&f2f%G_~0
zf>jTs)|)pnNc=wL{bh)tUk@#8WOp3RtFn?w1T4?TFED+Qf2SlhA-No|R>j4kR_#HS
z9)Jfkylw8f@dSR(a$bg61)+d=NcSUp-9*Cl^@}%Ulw8-O$V9w9*Uof(N-<H2Gr7Kj
zZX-@~sCib6bGjO-4r~!n#Yn8@ypAmkOy9(Lq#ORs5+~0S0=)xC_-Km@nMA5R|E<w+
zMf?$$7L6!jxNe>+szl5-fJeDV#DJ@xzBCxr0=ll4At_`i!AK}zgz<|e84)EK4rscf
z;Vx*uYlayxR3#V=*>ehngP}k;%GNspjy%q(QV<?HnZfdQKg$_rm`<uxwSX2>f*O_(
z;s--!Afzj(G6Q-@(N&r%(6F=!uEMi>T)L@C8a#D(rLIXqEIq0qX{QdC8B{_h+_aNl
z%|#TGUX~qJg4i%<+gBMh1CgMj2g8!8!{^T&#abjCcN?KVD5yju5y`~18d!-vi<?oe
z22CZTnUbn15e?7L6g{f3i2_y8f>>!ApO_Yu3=^e<6j36&6pkukxiMQ)w5X){^W>Q>
zY`>{O>yu?lR1HgLBO_?|V~iT17c<z(tOcBA8gzVtp-Tp~J0xF3o!MB7W`yAB7wl5i
z0GeK-y_~8W{<BDg%1mfO;0sp@bA1Ay`<X-Q^I1}@Z&G7p!;Bd-N*;Yk`!_AaGD2ZV
z)9m3JzsIF1YA_6&pB18LLO43I*oa8j<q!^BD1v_s$<P!d>VJUKA|bgb7}kwID5RKZ
zW7U-X*#Q%~7RiB-W+*ClJrIg2re=WienyYbNla9QvBR7i4#g-F)x_Qh%G6*apyNqe
zC;(gcGPq~45YYn$d~!jyJqv&yrb>YpF#;+MK&;Y*<(d&U6oi9{h653F4hRu6EPdE6
zmA(<wLg9dkO*JC*Mkw|j3CHdwVRk$d)#-Z@mL_3P1~vMtfPzk=^NH@<P#|F!f~FpT
z*l<Bu!Y-&0&FOUhOOUYBvNi*UL(?TJHG&SJqSfu$G@@Eq@>|5DD}-Pe{l@W667nxX
z2a~YRdRPlAq(T4bTv*ZRIxcKTY=#R<j)Y@Qc?k(vIR$uNScyh;IgdlnqJx|k4mY~f
zhC03SdA;s5!Nh7~ZVr74_TMg`--Y6@qX8|wObLg>l5V1R>DFzW84c01IW-iKc}~~E
zu;4kyROM&5sA<50=ZiHA4^vaju<nGsz5s@yriza3d72(Db;a=iDTH;cjW!5T)eNwM
zc}4*JHxiBUh^P_T%|!Hu^XyqLs1J*!RRUHKfa@M4VcO4V5x27dV<8$f`b>7UE2Jr5
zGj;<P(KPB6f>E>0*#;T+Flu<{3n?55=!Rk%q4)s-V<!Z@`&}69y3X!gYz89|dO^qx
z2hhH#xFu||N-t!w$ru}<s1(Z~p`kfgazy?^2uJlcww;Mce6PQj7%`R8bkkqML=AZq
zo2{Q{tFsT)_PPfe%5i7N>CD3tqam#iUO&hL4SE|B3?tt%RJNB11?T)m%R>L>VTnfM
z=*07iwdaCY(u+?-i?6EAAvx&}*8el9jfTDv)J=>X40o+9pqdC@_)Rg46CSPW{|lYy
z34e^JHUNguIkgiJ7gC~zjfJ{~0i@V)r$izrP>oKa4J6DjTo(x0h7H+e1*3tGiLDRW
zMcKB)vz_yPXhcX2+eoLH*bY@uLpE+<DAgm%nW_}V8Vwtk(7kPwVrwK7&1oR!8uq@n
z6OGZ>MFloInds4UYtV)#HF5%oO^yGM!Hr)rW`zCl6x^>PZkw9j7ae`j4m2FUkBP)C
zo`$VLw8K6jblB(|rHf99sNoI&Gi%@k5ZUvPDiMRv5^OVfucLXG93qA$QLb23(TEX@
z>M-41jInJ4OE?sw8}p)CAdDW&o_`OnX&5xY5JHQAn5jnsDw^Lg0%0^3+R}b44hPvj
z%48czkk#yoR%Fg>3-Yn~1|nrNass!5Av9U|L@wyWu+jN*(C9m-MQkhxX^{XTA|i2E
zqdwkQ)`utHa7Gm)#O8CR8KJWgq(W`%izMQlO>-Eu;cPB!>TaNK2qwZ3bxF~nVb2g^
zO7`2T>_ILZGTBMQ2%Ns9nN}jQ1u-w_b~=eYi@7Hp(j|U;o}I};sxHqJf_fkvd&w!d
zG<(h&|J+%KTOmDwn1~7Je>iK#uCRkQ;B0V?7c^6e#2!Ed538CRSQW?3zXF|HUXhJp
zgs?3??ZPx=YKSz5Z~RUY;+qO^D0Lh2>3J?46H}1-oKE)Ih>5Avu!A`y*>J~BVvL}_
zg9`>tzRCTsYzZri2H8biNXNRe5sQsrxV*!ztpjm5!Y;<FMIS?mN6be!?4YFa+A^-D
zYSlLVX8Vb)Rdx1ETK}J^%uifMu-Qn!rc3{CZSJevVF~seRMRWS!&1^(kDH{m341<a
zpBfI^Q>(`9$#H9ap@{C2?3suE&m>e-LXXVtIq@7-t<Ro0xw@*#p740Beqy#``$;Og
zD`%Y`Nj0nDmuA=cx>Mcp#I}%4ZsN7R_z7~;URX(_{o}2XVszH&!Ei9r=-cBtMYVGq
zI$$!OV*IIwJ$;mBgkyg&;b`n#&NPgn*QqmN;6Rv7K`9a$)T2fxeYmm(qf%9qfiQaC
z9cc)(h#=tz4K0pFk#J}@Hb{>!<Pk6sOH{ffVzVa<VsxZ10*RKmNx=N0(Q^urk>C-L
zK<rjKG7DUWA*sRPdi(WW!)kM3;3AeEoMlSrSVohI=!ldgB1P0rn$LwoA@+5bW}<tu
z?xEv?sy3;y{OqWf4CoSlly)Gsk#r@99*7VSViOXsA+VvHd62>ZUB!eOlIS>M4qeCu
zgZu=d$DZRb_0m}4Rs0*K&vR%cTF)3->~*4Ay-2ZCwv915{RNDf94VZJ5vw8`noSY(
zHPzHQt!V<%i=_2W%&1{JaQOWBm|>FvgtefiVMC&LuxSRj*7hU8nq^{`>N*Yq#yi5E
z8k}X~XhhJs)=YMc2^s7&M3;N%RL(Gr!v+@#by|DMqN>(pVDr%~)J@dkGxM54QDkXG
zyb<$R^U!?y16HOt=}5A4G-)UOjER_X*EIVwFh+tIZqlMQw1;U?HZsDfrp=Z~M81>g
z>jx?Q^5*7iv!e~B773nuZ2@M3Xb4Rj%f%yFT&98TAAOF33td3h8!E~|=pAULLEVVV
zzDiKT!A`o*j+=*F7)~K6HcYhgN83%wz?7of$QCpaSrs#A%t8*NCgsT(kdfmj5lx=Q
zAz@^zi9S+N98@LUo)^ssj=o3?cZPs@FY1rm$GV-YpGb6rpa(*l{7|ukeufzY(-d8b
z-3$GXpT}m=SCPr#DC@CvxTtPg^&}XJjo#`m#j1A9{(?hdEZ;W#9YRFX&ew)Ia;ghy
zh8`V#a`Y!+>}lhIsvdi=p@yjOZi4<CyN?O#!;f=@7LJ`qq7A=thN?CE%BW`Ig2Yws
z3D%Ja(h7S<I8{g2Q<2t}G6BOnPl#ZH;$~&Um=&>o-b@Cf!_U}rH>i3-WK_-SN5&h9
zRTmg4CLlc=lJ{3)P~y5~G=+8b@N>m#C^XANHWiIDypIqy`Vxu8p68Hp#BL=~`Kr7K
zQgTcpdwwkl2650aVyqX?h{)}u#w;U@fNT}YSLB5;2$9&xU(i7TDX&T^<Nv^X*kssK
zHASuMOr$ebNpyB2QE5Ae4X_%B3Kw(qW%*}x>VL4mS7J8CW<?~_s-3hLqvl~t%nRDn
zkf_n-2)f`B#*DI?V+v8Xjt%{r1RE4aHK4&Uf-DV(!#{->{yr@1D-tXZ5Q9DuYoZ%m
zm}U?ab_!-N+$o<bL?V%-dNa|$%{$NIF!K5T&}tmH{hStx4*$uis_u+3dQyH7wF+t(
zB@ztL)AH;&+03XxZyE8(Ggkj2Jv*X?!sd*wf1ob>*kR9Wq3$@u=~8rPC#ME<_BhHD
zd67JGYm`xy;la3{6^8DRc@mP_NqF07Lu1s3ludx=I5tn7ig84RGFwt%XORkq;=e%1
zep7xGF`$vlM)ndlJJ~W4xpxApmux;u6A001HrAz%yux0K>=x5cj)<r1VRxXdZo#lq
z;}IIQhmv1{`Hr8>PNIi6Q!<?#6IR@lhe`^xCRIh26B+q(=lxi28&Tzr)?t|||07#9
z(dUEtm<X+%+vX50zO&&P0S6~)IkM3cG0y4lE_<3a%{pm#o)sd-&?NXigBV+XbgpIs
zrZdK1bZ3$v=)%@EqN(@9{!Jom76}aT_9Qi@m8Zvi@*C`>at4c$L!aPV$`$|5oF+y6
z0tuH#IE)=<IeP_T21c*A;~=Ak%6FoekW9Wt9_1ZG3tY#91MwhHRV&sJJCy{~Ge~Io
zApDE7w$j@%hICp_LJQ8h<46AsBmh4-zU+?uOiShMeC3HLVtfKoJa=$J^FLQ!!)bvi
zkHa(j>){`WvY@2=-k8XqM-2Ht{%n7d&=fMw_{EH7ZvB=RckCzTo<|rhH2UjMII!_>
z9f^+YY;dslEBgXtYUQ)!yN0t^um5I`;UwzNyseY-Y&D}BN%k0oxEjRRsNSR@vP3ZN
zs6je`b`L)akMS{+2}TZ2f9a2GdsZtg#EQilMtm4Kil%%13ycyT%_!56WrpmT0#U=X
za|ID(uSn>^@-bHk(JcsLoC~#nP^XWABydQSVXt%e3=;kF4HBjEg%(UzU%rFG?P9`7
zIu|L(=+==3geXG5@H;Tu5pN&X&>_qDk<Ugxj%6G_7hcC+DOTt3fBi2VUdx2T{sm~y
z#!O;dS;9sb$vEs}f~uTNXAgH4sL@apYNIHO<B2)4(tag!NP-U>J0Epgh_0Rd&W1y<
zfy4YWC4$K}WK#j;QJAev*vZA3{15Y!8v-0=t-5ur_g=wGwOM?&8PR8$<{cL>h5<K2
zC3ZIwK|+j1P~oEtGz*M58AU(*HiwMQI<pw_r-{VbmWKsAqXfZ|LBg<uD?r{6!JJ{j
zSFUVDx8=2XBZt~_6ZSAR@TTfdCnoH0WoxK6bVb~s!5Gou%Un_95N2$ECh|;s`b*WI
zO^g<W0T%}0_e|8ZO3;kdmlwu-ZC_>aF?wj^pXfgC!XHj~JN1c=@db$1Sf;MgLZrm>
zC=-nW;jnzz!NY3;T<RWSF<jDwm=kd+NVks|0u~mc+i~kT9EW|T(-86K0Vb#oMHx+p
z2|U(+Au&cxqKaYrW%9ewfrb{rE*DyZUPAQYxeRjswIm$>g9HzsdDuV<9qprczzuF_
z5?ldWB*AJ2r$v)gkT8>?b_tqo^gU|}hus`z7(FUCqg5l+&qc%1&?bbKVkQ!yPhd0`
zqsM=P4nZd&?0$`a-tIvCtweOp$Vw<EzXc~bv6!HI5@&>x@VT3q!@FHtG~5;tb6j${
zOt87~A6T4BvN5?KNrB=F6ehoje>j+62(}8?S9vxuJ(*5_X?YQ2=<-e`q{FKmgBt2B
zG=~^)T7PhgZqmyTM)r`f{0$nUyZ{BZebq;2J4bdf5tVME`)98urtD;-i2qzP=`07M
zMEtkXpBOVd+{&oI(Gdi(wYIl(i#ud~20Arczo(ysVqel*NVL4rWhXgvIG0m{A?saa
zw4<M)AAcDegR5PPCc)bdnW7OcaB)bR{FtF2<mNC~<+GTeDSu>NW*LXgmiIH!Wb6|X
zj8~(Fyv3lfxF5YqzRaa!>NaSJ6~z1$b20%HR%9|#D1I{>#37O*&2J+Nii-f695Cjl
zDO6>TA!bu-B4#cv3?p1Dn}m;lNX+;$CZxf)LZXOKb%<ra#!R{fAz6MW4~GUxV_5vu
zO$_mt413B(!;sVHOoYV<L_xs)#_*#E7AZPY@!QYa20)%qLdP*lcz$xkjuF#8hY70)
zy2g+b>lwb3L?Iv`+0bH3u~Dl>O3*rT4YuowaxV#q=@=+*rgLOIhj3OtB|C(O6$$ze
z;)rc0;nC;OTiKI_z*-%PlW@a+qQ<s}t1=lqY>kJ1i$ohfLqOCE53NT&E*bvAbcXev
zWzZS)O1Tjoa=#F;=ZtN|bB9MSN22$v=VU0xT#7!0p%mHLJklP=5LJfVB(i^!xPcpT
zS>uQ5h<^B)g0LP!<r|Jtj1crBgp~M)=tUt!avZLZZj~{b<{!dL{As43VBX(~j)##M
zi8i#s!yHkpcjf!zGyKHnS{9B4{TPD`{>vj>mG5Kp2z(6C3qu!M2N{fsS4r4^8C)XJ
zS);$9K4>_=Zs0=Uh>VOyuBSg>%{xaMzI~hto9qm09!7moo=HL&xN0<JPml08kGuE_
ziG)6Zo`h_BJEkJ}Z74w;)JJ)uY&``>Baw@!Xs^*uYah1#7S|pQ9(Q1D%^+rMacmT;
z+hjd}NAAH;(nlJIX>Ec6^d5E<2J<#_tC<Cub|m`(jNhi30dw@g{^{}ih}p1?1cz=#
zh>Oibo$!V|vuL~wU9J^t`<&?FluRsTwS0t_Td%h1&t1S}`TN8h1rqhoV}gc!+SW#5
zisu3v7FoTn!4~wQ5R7tMG^)X3_lUKvlZ4m?d&+~Yf7|SMCUUy@@C$Y-!urr34v}yy
zory-^_8eq=4`2w71Tm1THRxxD97rA)!YTxk;}K6fhlJFKu-oj3(F9TAAtw`^$&C2>
zMl(k3#)r#aKYrcpTSsT$pql#Oee5etNR?5%=|i_s0ZpFnE(^8jrrxRRMvLmXffF_~
ztJ=uduv@^<eufzFZPw}VxSNTD<rjvJ(L(Ftk?w4y!J$ZBY|r5YZ09i29t9Gy)?1?Q
zLQFU%_+gA)$o>CxslJednHh*B>mBgQgaTAL=;)y+@FIY?ENV7IkuYd_WKcDXPTeqD
zG%d2hSJCdHRNL%!8K`ay?`Ain1%Y+j<j;haUKr;<cY3u59^wTxg!#8Qi$gU4Urm6t
zT)qIx@-WWe?p!)Syb2h@gkSUF{ETeW*(e`ioc-dRBMTwn+k7}Llg_vE-;*}g<=~D2
zX!da^=OM#`S-8%_XaP2hF3iamKg@w}0k%Lh#DBY}gkHO7g7|=|WK$NZBzVZ1htdbt
zLx>(m_dCx6p$x2MZUKz)j2fn2!)Jj0_OhGJmzP0qA)9AUq7)WsKD`XwMF>Jq!8`{<
zidZkB8PMbO8yva}e3Zw9BRV~aor4*Q*GL3Zr>#NqkW1W<0bhHeG*>h{;sGZKi)|U0
zLSRciC#fO0Iv*Yq>1H|s!EgdBn}m@G=NEZ6uq%#;zvM8{5c@f3E_gRvwqScc35q*&
zQRd=tCuPALnHbIqu+l?x-b;6KsP1ec1@k?5N?4OnQ^9_l(DZtUCTh7*mJ!QAn;dtd
zhScG`YzT|c<MMm}$dKW@9Bf2BtaFo)Gau=Nc#_w4dN}NY;{`5zzVIL%%#q(h#k2x;
zWier0Ze{c!t+VH1$>qH;I|EOz&W&y3koZH)V^6WC!`_M5fX`eUl31t~>=z-wvaiR7
zpgPCCX9VYh3)4wB1o=3ayr~orbQ6{4z@|Km(Z!e}BVl-|0O~Wr%Er3GaCQMb-JWi#
z+u0yD5v^qcfj_*cJgT{<5{`9ZsX?*W1%J8h_nZeM{2qY_0+u+>13%@<TXMYqmpv6C
zBG(a4Q^K>O@NawXh|6y1BzQ1~gdo=)yPgZ9Xq{ruNMvoN0GlvxAr2iyZI-}|QO|qW
zGfeqS*#B-I(V_VyDqiRGyq_xsm9Q>emkp0e$hXccB4N)jxezIa`vv+J^!sDA7#Tl`
zHnF?MiJiR01&<bsV|iTE)L}OcMp(SX2@?QA<HbDBUMFml#p)b-0Mle96EYxw0)z0^
z;9`uRIMWMDGT|&4?k{jUTk;6<Q$!e|S_N!70!|g(gk6h*Ma0%TR}@8hboNDv%4fks
zz$_1ZCVK0w#q=AoxHSGMcI{Ws@1iw}-ifS=-h=>u`fzFN4We5c(HcQ2h}V1ge4@vX
zz;_ad>H;3h5$nBZxaLgQUw~!ZQvwr8u?KRwJ+Ui}ff<oElE~1hOf-zHiyP?`XkTKd
zsJBG<zg$?-;1`jqBq*0rBqYO&P+u7ye<u3z;!NtHybx-Ns-BiIcsdsaDf})Cp{K$F
z*bKliGySJScdnHxUyt9P&9?9Hgy}Dwu1iiqjL7~jdIyp(1YogC+%rYcFd>WQ<|8W^
zNr#U!G2A<I3sjWvs)ou!$f7^P#B4Z>q6KPvMD_ILVAiB@Thfh#xtZwG2qa^fTqtS`
z?Lt->yA5W!FuOh5P&gdQ4n~ogh2V>c=vX>^0~59ZOUtZd7!hIl4NNDhN}so1zl}Cj
zA#@$g8u~AgEPAUrGHIyYcAKzhP9j?DrxTNMM%fIs$5pWlX**=P3!UOhnMCWn#9Bon
z;`m~80{Nft_#}){O>}rh^6U$QLpu8PSMmnrk0ZY~IOt!r2c1>7{$*<g{(2IXRT8xp
zW4eVvIby;5i8O)iEXYI^YfCJ^7!o~ebT=}b&+JLu!y|Lis`WYY(9nOyZ4wG{*}y2n
zu*$+nrdwi$=#t=&2kw?d1$#9#5X*#BZqE)cp9eFuV*ifW^B7z?@ujN}$l#|OPB%g@
zIHBPn#zm<OO5b?IT9F?^Tl8{hq^SHlu5Qi6!ecie3y8B$!DvE)TH<941(r{Mrze%4
z#bz8|kH!&Xi=9nt0#~p&y3QavU$0E>z>35_y>@y>R1|w<G?knW%gWgQ!j<C4p@xMh
zg%k|jS4K}<X%f%O1#>bn*--3i8z~TmYrQsmesY365ouu&;*T=&FYnDFdeA_2;RFcs
zw161B5Ab=Rh&DYG_KBX->}c3TX${FT^qUHa(<2(>m7<H^QXwcobjVHcSWXeg+x-3-
z5*!{6vpG58k$J@Pqh4sQz|bxoItUz(M$kvUhESpPXe@;zr$Jq|y={03*58ngYL1<N
zL`Bo(+lii7LqfynW60BS5UsRsfu|~Av|OCZp~4%FwJ+e=38(=OZiBIJVFPcKaYj_*
zCmcTyHHP@bL`GBPe{zNz0j&Z{KK_o~oQdK@l-=8=0_LG0o_GZch3(?4c|$+Is}B2C
ztUSRQwEqs>%Gr0kHx;6@M=cxXm-}Kr+gEDE!?`0RNM$?$7<6D9@0x&#0yD(9xz<wj
z3{+=y)zBb`dXi-xIUDUPp5bt*rrBgdW(oZV9G9>mnT}I1EH&JyYLXsQ2i1tyiBzdY
zgRgzCf%8v7_ub9WW)cvWm*VJm7l_Rnu+#hHpCsbHp6c*iHiJnNyMt;88ZyMWNccQG
z1%TY{dxVmZd@mxAg~U*{X9g3XEmu4bDF(zP+J*$U7QrDcAoD0yRR4<jVIdlgNKk{^
z7+%bvpV1*C$kihN3qbV07eJ63dJKpCBF=t+|MALL^!Sf-3p(JuJQ`vQO<XM@6St?<
z1T~Ks?g@#NQ0hSHI9!aTIS0qe{|B@v^kqcZX;{wd88kmOU$F1_k4}o^KzaZJ-CUaP
zn>U%KzB?=OCN<2M9*fj#yDEyVukfZOyX;p0l29?ZKx(&t4Jx2@?ZoO66BtPsuTe0^
zFcCvM*G{MX0`_T=SG<rP{swOJ2vJ=Ni0_mz2p~HPaaUy#j#_3O{nXCWM{^-914gjT
z;!Sz}ed0fPr1a=@UMm-_DnR?e^Ai}Pi7QGt-IU<#O3AP<0ZX<z9PzmnGb$OdOc8LS
z5sMA4h6jo$BWhlZ@G}(T+{5;a=mxx7Fno`IJX?cH%82GUyHNg&DBz!vtr^W>tb{M*
zBrOWhC?qLT9=_rk30Z?Z3;soUWvCC0upU547lB7OMmM0v%U~8wltZRKboM;xpXkCC
z8DY3RKTk98&|sKWV}J&%V)*w2I#GN+4+k_=3b{e?s{)uSK=%ar)?qjH6pRV+&tjM`
z8Doh8od&PieDT2v@Blz0W2kxPhN1C89UL+vaZjP>E<gfMngKOVR3GBhJovlNR*3+`
z*`|G$)SwZYHg-s{7sU_qNqA3-{aDH`4$MWKnlkv57rW%_uo+MgeF)kbW;>;D$OtI9
z9twz$`o%9N3HH@<@#zvy390a6l|2R;l3LYhjzmnDAZ2Uzz3s5)tVxV%4()?WCko+6
zKoRfE&$e%pE857f*x3z15*TfPlVIpLr=adkIY?x*Q{3ffI0c@N*j#vT@}3{jz8faR
zrZ=SE1_yh-J%gy2l;Jxb!`xj2=a$77$hLEIr-VBCo8ba*<ii~tyqy;-gp2dhk6%)c
zx54y^*ln0Vp{0;BLgvsC!88qJG;L%l!nwy)<kAo~b+!=01X3DimMGjlSqL>pgD|0}
z*pxIpI;ti$+CTzZFTkX+7{zO3_z<TAL;gb4NnY!8n`WwTRT08Yb}_2K-Ec^-)7xi0
z#3j|b3#Lxw!pLtgmdK!dEoUS{;#~X32I40%$lXh|_!7ITK>@u)gM<S|GXnS7(qWGS
z+R7PB=W``Ie7I8nIQB88MFR31P6-?IJkB&i;vbM_KNo`15r%{Cp2{JYtv<8zs*Ma2
zi9(+yVJA*JwWYyZ6Ok7U`REw@yU_j#2>6UAn$<Wu74Dw^2MVk|ZO647WDwSrvQdN!
zpCh(Gtj@$SQe$_B<&#KwXfi6Lp-YDB$>6<kaRp4}QQ4cPv*K9QQk5lY^$ON~9MTPJ
zzQ)0JefV!k_YvLSD(Ge;ARgr59H$s{%il7ReHR|X)sDpow8*46R*J)!$HTEq*cE^Y
z1|&I{U(j%dco)R(vFxd1ZUIkwk+=i<5rK0jVJ?wq6r4raCizP=|3^MC&7N;bbwaHW
z`xUJfjGAz10bEp0^oEH{)Es(SXpRKKqkqKAplKwL|EuWlMns|x0sYh%J!liG;Lvbh
zG^(Qr4eq%>Y^=m)ed&bf6?hl{eCRcse2eE#L@ckKgx<VKjy)LfV<I8&X3$6Ni+-Cl
zaToGh`F9-H%1ZGv5q18DDDb@L(&#6cSyB_R#P1R6hAtXC8$y2n3W)M>smmVLp?`5<
z44r&*+TrZsYrsVPz4eC?1Koa+Bc6h&&xX9;0JHJMnee0>+X4P8P7NB+n*py@BJWf{
zakxzTF()|PIel7M(T|#&k{YorT(>yw%d?0*13vwMGqoh#RRYt(BO_RLnk-(73`4HB
zFDqW*M*khbxPo4!mf|LrehMi+%Epl*-T}Kfr-KBB&w_F^!SFNUQ|Rs5$W3U8lQM@J
zkT_1UxqDD-%eJ2sn>djK=`k!dwnw~D!o6D&J0hZ=hjkhDb&M#ykxA6i2Vi_<0b-P-
zDu}hLJ@aTJ2SY)J%na581!eX%l=dRHAjA7vM#DX*Das`@mj=(;1HOrePlH@EWQhAh
zf*J`W;dvewW!U0)&#-t=5whh7h@5E3NKOwkdI%Qyp*ag~DY9pM<$ccoh%<9=R~lG;
zTfk&Z1jzvtG!n9|L)wCdxXmGM&gRF#d_Q*K&g_5^HB6s&sYm;m7CK1{G=z%23fa?i
zXkUeD>?bzuSz)@{1AU!VPu%-lh^edLD@b3-SE1tm-gvz4#H+}@;~_2@jF$W>#F;^@
z`d=Xdze%iztlRx*$Y(mXkA`MH;ce8iwHcT>VzVFRFxKFD6VqK1t`#^vsKdV;7-~U>
zfCFxdXSu}L8E~3_WAT9>KYlgg-eRQO{frUybh<q`83hsKGAbfE<j8xXXu2a==n$`l
zIn7kW-|Zp4PN4RWR9Nu48hg4R5{fiw(U1hUhTsF;zLsA+2}2jAfhWyPFS36+%52gi
zLHj94T@ArMPy-2&VbAXWU^cADpeMsr2b5>RlxhT&$x*nRV+?~{kCxqH)5_yI(MQ*g
z{E6fJx|1%;HgqY3qx#MylBBC(3kT<CBa48KGO(2kgc?mBH1I6FQ^S-R(UZd;aQ0({
z^G+NzHxG^%yX+rT3fqmi0Q0Z-+hnZPk&DRnEgTU!H5?de6R*pIs7MrXT^<(>Md%-}
zJL|+WOPDlXP;pHRATv;-z-i)VK^sQ%HSxWyku$~Xr@(*!;uNvB(*F=BHYI=A!)b=%
zon4LRxp=6we+}Z8n=w^bmyO}k4e?BCJ#<xKYCeRd16+b&KlD1HB0fBaX~clQBsj}K
z--ZVrkWon@?5ik#9wlLUKAchpwV80xh4hFvdS+%ZdK5NSD(9uozM^g+TY^}2KxmBA
z2O%pmdNUW&b!;HfMh<ZiBMB#q;O0n#e~Luth<LdzDBF1PHQ(W)!&~!0s@4<=q4vyU
zf?7izA~}&@d#+$KBWn033zDjb#WO1GU$oMpC>x6y58K?FVVJQJ@04=rFBVI6w4hKi
z^5oEt(JRq-DBvKL4S!%4qP1rw;o}fm<Pia$C>?EsV-9gs5GFfDkHXt-cq9j=l|p_#
z>Mvc8e?ZuIj8jdcbs<Id`dK>iy)Ql3o~<ScjU7+_>3DixNJnZH3~f4|&V;m)3y_dS
z%5Q_4yfEy-BjU$hI{Ih`I!vPC_y4bD>G5>?fgU)?D@dUrX82r^gc0}fcJ!&e74W@N
z{5!*@)nT~L;3VV)KTW`v{p7N*j`xdjwE{_H|Cz{#dUU7|k)`e|g{SK{J=E-BG4Lck
z3}<JN(9m4_Dq^7<;)NKJRrz3LgOWX>(R#G;R)N!k8eCJ0?lgql3nmuAMN=6}iC2IS
zGMi243<>D``fxd?CUpq7?8&S@^gx>Dfq#tJ662aF^Z~T!Ia54WXQAABItrx|P;v}q
zWry`<1M%%~K%3neb7`uE1x(I`Tk;SgLUmuT@I{%pH%rX(ihA~_>@jko&&?nNEbzc3
zZun?gUPx;;kV1ewK}5>6oP|44(GIR)IU^DtUV%{)ymtlooq0G&&4wBB{8c_Wn<U3p
zunSkPSN>~kIlE#x>&<iU^vL6L*09*S(%9G<7MI~Q;x`rNtzkLTO)#IwEeq{0n)<)p
z|7Y2^hAlecI=GN$A`y5-9P47Ycd@RB8B|nUpWDT95j`r#bo?^Ci^Xw^W<Ya><@?`v
zCK43y&He1e4iubeh4!{^6z1i?Es?Q*I$HnfxbibRbVV1dobC2~2}N%>Jj0nhy<?j_
ztGW)W0dATu{^lS1-0{=r4wr^<LWj*+42IDR4#m^b7XjYRKxok;#_=E?rG4(mR-=Yw
zguofb@BjC5+2@WI?n&b`B(@vfBsjLg{oMw)xWSEs_dXy3T;%9IkjAMYO{~DOBVz~B
z<{U`NRt+hnn|Sd5z1+CL{lbAXOm?mcMp9wI6eKyM9Lu0tuq+FnnF)_pAadS|QEYf7
znj%|-wtv`Z%c;qzW#Cl-UY!Vc=28JY@~Kk92`JA)CLU=*Bw;5DS_s*~qmA~3hA9Ph
z;#*t@cNM}9Q^dEk;MQ!^t(s@NPu%gpYnWq`ITI=B<YG=SLol%n%dE^5A}AN2C>PGp
zgZc=9?bXFN3XPTUu@nEMO@y=E@M;u;=d@-xG!a2)z6qsH@uRu$&xzuWX1cp9D1|Wj
zgrZ3!D8A?Qe3Qp$n)uuVcv9lDK^>0x3L>*2nBKxkI5nRH;C>MhYD1X(P0=-xLx$_Q
z*oW}i;zbMZHN@BJz{>SZ%7No<Yyrrk17L0hE&w<+Ph5^9R@{WSo;p$CBG^4rg66E5
z2U$@@RoRJ9K7}^J;V7Ik8Bc!33ng9>q90)U-_L@-oKRhE-;1;v;i3ldML)cpWB&}J
z{WGQ^11>BOL#S3^X1#r56{hFGc*&-Z28_&r9Wl{S4L8m8pDAWVK?uVSIdDO?_;}Rz
z)FaclpcY_<<<G^XD4h&#UBSyYrXlybBnMuv$3eZcn866TD}s&sDxXARm<tq`9BJ5s
zea@MVnbeF8U`KA1nV<;=yf7^Qr{syRc<hvMUj(kVpJMtT4_@-aSDBu(roy`uaj3p5
z;3ORMvtzKq507RMEjC-;iO~0*eGUIHg$)w}alcuz{o~IvsPK8TiIDAuTN)wlBs(wu
zUId?4!cP^LA5w5t^u%>{<k}|8EP&PmxH%td{ihce%V@Mf9XgnJrvl@1VfJh;7?R{y
zus7diVnbF=M6o@nVKtXDVbxDBAW2JyG&g)c5vJwf7OMa@p&jGX*u9`sp?||;m3ZFG
z9(oKum`q17)BjZkH&lE6n1sOAz`-#;G}c;M`GYnu-(?r^3i@Tt0h4nYu9trm?DsEX
z;~7(f@iN?;1FzLm)p{GDpxw&_kmW3uVB<v5JsU~>{At)B-$e0;dMGX<;aHqRJ-KBl
z0zy!gV<-BL3dH0zbXtrdPRBo!6!Ap`9rCMccx*NjGed{_Ywg@{rzD;e;DRWcU-F<n
zUU5m<l3hs5OTCRh<&$2xc2ddD$on<?#7rBk!#^k9-WmHj|An9Pvkg-+jHKrD3_lGW
zC~!TaYSB;m@?Rt}{07a1!#>|n`4sR2dKI`{LQ*c?r9jvz{*>Qv1e%Mm7uV&BZz_01
zUI?X=hAGkM(SF33qUX{J#UJxwXTA_t5&B9N!JLBFm!2Q;#m*8O!@nf!A^5e(8iYgv
zdf8R;yg%f_fjr+2`PL?gPqiO0`5|90f<XzMX@(3BoW9tH#od?>56d{lM+?ZH$F65<
z8yuOzC`QrG`EYJ7+HT}96Aftit*hAgbH23-KjJ>PsR&t27n%WbkS5_ac)i(+yN}@N
zNOJfEc(!RPf@wBU;HZz$4ExB3Cg3NHp-jLdVTLCDobUhM^G24qcq&{_<#~0n*j0(A
zV~Xr;f|U($!y=fb661fH<^{y{i(%&s5*n$*6QQyI$^vM1T*ncO?%6+dBNI((SLcs>
zRC0Ab+*jho&mEISS3{zt0#`dK!J1@W{K+XVdc#YaA-yo+g1_{VYw}}J-!=L0Qvq6k
zUM(?YM!aDf=oK*H6yKZF&<bC94_<@gY-n^N=8Em<xS%s%oiC;dtL;^IWFezU9{c{T
zasa;Do*v(Bs{kJn{&(>Iy{y=tjw%!O`CK6s{UPzJyrEm+UI$z?lZ5K}7}%62zUzRh
zVmK>r>-i9JxWbAV)IDeAA&>K(l_y|EQ>dQ{8w$KvIJ(XIe&M!#2$vrej?DAn$8}6N
zjDJyJX$tJEa+#+6gM#lD7M+EV9rXObqiZZF7^`O%)-waok4<M<r!!Zbg&>##25Lmp
zx*3hI*M#Gx;w=m1L1ft=O~!MgI{c?hd{csi)7FOY^~4j`o*>HuIT@Jv&BI4L_f<e?
zF`~%NUg*paJ5=~V9r*|mo6f>4v??SDL5PJ>T3=#cO!%V2eiq-<B=9;xs(^b1_*I6V
z9FSi=QpKRWICC=ko~LISER$eKBOIDRr`eafMbF7LA~=DGno#b8&s*%<ty%UR%qf-d
zVL3fXLXFv^sU~vGyIrIAfYBs=u@r8^B<y)-BD}wh84SU-bKub?JmuucNHe#iJQFuB
zhN&gui!vhC_$38Rn94BMhvE1_CaEH=B6{pb&l4Hg>Dv|&bM!9wWddAUieJyohE<B#
zW&a4z76l;*y<r-MP<FKgep>`vCqo4fyJZx%a4o>yp={HBFGaIBI5`AQ7mF98+J!O`
zEnH?NvwzJLZ`O!JYe|&W+E1h!QOrz3lZi=DHORAVxquB6M*ksl1#tQ);(1kq5{`u7
zy2bu!HZS{bGTd1qKVVNlzF|2wqpAuU^uS5>Z&R26b8Lm-Da7sLo0Vte*ZOUz5U;6V
zLO58NjL`&7<}wip-j^994D%;pZn*(<<|N2G@snXljUt|o2rMocIt7b;9AM!>`BL$r
z4Ea*n=@Y+1MLGJmnCY?;+Si%zhXj=^P{Kjq9C_HjZ61d1Nn$Yv<EpSd^mo`6#eN@|
zJajtIxAqZT-Uts*hWjc|;TRfZ&9W~|ON$xQ(bbvgHtt!7$8;%Cjn_{ku?8O&cx)1;
z{w5?F;_0P~5r&LRV9TJx1uGR!H=4mY89YAw#kCM*+A{O#$>58?v=EZC4OM~v!c{JM
z6Ksgs_k)L7&?-RW(d-`Lh^=SrTf*`Xk5DmnrS*z^9roi>NK*a|F0i>p9hhnwHfx3k
zGi>iGw?peM`-cZ>g{H8oz^(ReVRP7GG!wq}WvgnaITG=#od^X1MoZEFyik0Cf}B$Z
zBd++hScD32bC{8k9!B6$8GMW#4#7zk^Z}5jz$H`ch*PlU-A?rV*nSdG-eEAc7+XUy
zcOv|J^443~?@;Xqu%EG4nNS$0eH-GuVmz-!f!9xh+}f7s(tPhaDczOI!vn;9D+E;!
zB|W<xC+@c2TY+q*TqEJ($(~)3Sf5Gl=c#{&Nh{%plGwnBEBGUteJLAG*XYEd8kp|?
zQbCuxv<V&KF%jFAZoySkAl(J^Q--j?!>@T#ICh>3ow#p$(Ed@~hI_H6|IqErA1+$P
zn5gJn==mYs;sIn9m^xm}LcsWG_VG?^`71%9`A>((>tIPHh6-YT%)Ux--%=8_WGv|~
z2}^FN!hZi%0+-tN$i61}&;k&eT+zs&{cA|e#O`J2#J%=avmOEIaTqQSgL}d8;gRJ~
zzw*mhV1*kq^<RPbPx1M1+`c05RuHyhZkWIIJ!FnLyk7w~2F0r~khh5iez?5^2l-ck
zQaAwc(gN`*LD22rrWlgpvAJ9@n1uE)6Hvv}QUvDjPO+aKph0-G0^9WsiHw%ON%K7a
z<mfk?5)Hyi7wmQejqZ61E%I45(c(A37a_Fif2+_49ZvAgwePe1W<$h1rdaLv{2JZ*
zHiQ0rlgs9_E9zhtCScgU5Xz9kjogOVslBPZd`p`BG|cUjF>}t%fu?Y*ikQ|zhYb>u
z|A7V1(J)aQe+CqcS<ku}IA<=jmGT<6>tOL@`}wK$nb=$FbWE6|H+Vib?fVbCWup%f
zZS)#&I<UeE`Ozz4_hKn~Zh<TgK@et}f)WYpu&9;jbQ1~fnGYBGhOR;8;aM?hc!zyK
z_|yojo+P?FVkAgk8a~Wux@WQL#2rj)#fd-f=8SH%f12qM5BMwSG&mznkB<BYx|cFx
z310Dl$$@(XTIXU1gQ$0nE`+1zAe^ELQLR&hvt1*XA~2;d<1pGFza9R&%$_&jx($tY
zpCztvA#r|n5;*I{P&0(f#Tm=c!<6EYbnzV#T_0iI03BdobF2d%m;`T}BA<*s9W5tn
z>~<J%iNwQ%jo9<n$=00MztK-_Hqa$MuY#x5BL%2>#;LYD&s>i5R=i+26y%~H5s%J?
zXG7?yS5L9U+ZCrFTP^lruEUxSIMCfU#YW+E6W+-#KL@VOLT3qzr$@vO%k5`l#pAVb
zZU(p)64l*lKNc~Jj9zOGynIiZec|KFY(zSA|9?2J)Bkipzn6;eXEVIu61^r;&IFvU
zz(XNg0vnfEE3v6JX4>3iPd2)HxE!7Hjj1Ha`mI-B!qj1~xzUcP7+ahN-sB+9efV;5
z-xOFP!b>*)zX~;?apKZ7i<<3@L+HKg@RR6q8;QDS0~1z8UOe#%t-%vLA$C<T(IERU
z6ATX*Tj$zp@zHEJng>t2sV#?o5#Vu0wiXRFp;HK%@b^OdCmPaM`FFz=Jbdbgf+|;3
z8w??$=913YjWBp}EC<eTL!k{aOR6El<2h*6(@#gXKSuB7)UX0KEP;<o;1>JI8CJD#
zqy6flKA4H@U)(c@!}UWuR()C)e9y%mzT*P>5_7vrRBt>s)O0ux$K&)|dL}fxK&gaw
zEW*B?`E4!ys*9m|`{1`KF)O#j@jyHV?WHg_l?f<^ABI=O*qieGP*A%^hwSP0?|cRJ
z%m%Oh`=tlrnH&-wat=k{*Nph{@S;cpLoZ_2VF-Dx_>hL3d9s!9Rh869FW;KRMM7cz
z2m9{C5*>OZq|Ptakf8NA{4R{ViTdrEkvHKm=l=}!GPtpk4T`%L0ja`PKHTbmee^9M
zqBlk0TC_v9{Zl(Vg6F#knnIg^87OuWc0DVK?q$Xnqum}9MkUA#19ZX_HF(gQ>gc_m
z+yxjPg&p)9kFRBDIaKQ-kBQaJhUMaX4!YZIo*T8&VajPES7W>9=3x7V?Hk6IPKR^q
z?4O-@#KVP9+AiR1Qe|<Ws081jtQ$H2UAYL%zc7P3co&h*;d5MC$Vdjnx_qJ!|J%O$
z>qH8cF+ngR0h20p%^n4h-wEI6!D?=JXiqwPXJ4E>9)R;ESR3JMm4rMGO&dK;%&UUz
z2?%Gs9Gvf^hhaNEQVCgzw6M2;u7@2Vm^UGI(+RrpU^xUs@*(^AUmWVG1+)$8eK#MT
z^uk*OAmn=nIQX|HmgQh@`~#pVZ@5Byy#*aU0QY-FUI67Z#tgz+K#bU(XeJ~-`xnSB
z*+BeEJ{Q))u~)>$IJj7VTAneCrNe1U?rJ<UkLyUS^Y!NuL+Q^$1re&Y*WsHW^^kRA
ztF-N_wCqOB)a!lX_4W&#@OexKNoo|nbHapGLo=DADZZ6&-!V5@@a#_b-ivjAk|C&u
z77%-9A&m(O_KndoUGq}X0}my=o6EEHpcc^^oU0ilB2ok9+u(MO{WEL(dDP|Gj=+|B
zm}IlmFMz?Ee!zrBb77hQ2QrZ71`#YbpA2WW!#_C2G)7Ow=runar)?rG4I@@{Zo*)Q
zf9>7`U|OB%<>z9LHbfc87`{vVJpmk6xEPMsqa9bzuz$e7mI_}iXHX<K(zIUU(zWR!
z-Pw!PJROCgfO|`)z{mE5dRlEie-VVGE{u*1MMJBG`r+vyB5M%`m#jj6TRMGY91h!h
zCnKp1zu{Wniq+lJWoY#wgWn|9<iaVHc>bH{f!1cup7EmJgzGt&ZY%2x!ZZa1ZZyLe
zg8eI?VfZrwjcxEr5^f4>EiUt0f&)3DXzg^&=ei=kY5%O=hKcZICiogL{5}!Tqr>n>
z2(Fk2{f^<E;TD^X=W*zO-_;AceGy^Z$zDT%kv6CiMqVPCMk40f#1+vRLs92<jHW`=
zZaUnbv~MYt&9QIO?8=mn!?zJQjIcWV6^6?=xH3F+`|#c3xDxnYk{J{(OENh_3k}EM
zcs<Gh(Pjb{a`1=(f9f4SrwK7V80uOMb35Ty2|Jo|3WRWUMb%a_CrfZ;Eo0~n9}r2L
z8M1G}JemS&4kR=2(62bi%7XuhxVpuFS2z%4``n<|WOqn2IxZl>bX^N|ZG;)cFs9kh
z@2;=0FS<UT<ie4FSlWXjya;W6O$Myv;F<^&p30~Z_<1#_>0!Cy|5eqSK(|p{|Ko4$
z8Ar0E8)+gbvST|Vd5P^<@+xn!oyc44*v?`*36KyNNi))DnNemWZ)|ZwSke#(&;(MT
z7?J=1!Wx=DSxiXTX@Ig7T5MXD7HC-t-%_^UowVnF&i`<5G~1i^?((^x`{vDD_yq?(
z3w*}X%{9^QiJ_~m4h9S0U;4tQE8Fq5#fwlO<vD2S@L~`QdR6EJRw~T?1niOd`tslT
zi($RN?*lD~XJZ!f_5gn;Qvjij@SjD<Zmw`xd`(U9MwnhqtwSvQ!k~j3T%*rC{CT;~
zEd5BS+5Tpx6jta>l;%J?Pd9n|ykW4Wdgj-#xxjTchM%1`>$R_t#Z!;KHwJdG%m3h+
z#i!ftuuPBEd(P75MIWxl<Q9&zmU>^~U<1t0vD9%jzG_z$9dBZHHq32AW0;?RhRgi0
z*ig^;K<Gy^dNK#zZ^X|0r5fDJp_s*i*wCp5F_r$06}1$fZ)k|)Z(u_a1Wopb^QVD*
zWDu_I!;IV1<iXT#=_*)jHq}-)j8bRx%DUb&R3pxBSjJ`+>cLyHlSXQxzU;9J7ztiB
z&;!+QX;gp7wJ}Zwpv&SnAxRu`>YsS|S%1DQ4Nzawbq(-{tHGGz9+XL>$I$sQ<kd8k
zerzl}Wb3YhyW(JEvCZE)Kv>{^2yS!h3raSqq|x^|{OerypR4iUiB@<s8%`xK^1zJ4
z^)Bo%gKISmm@yDkZ8_9~y>8@IeM~VJMA)<3@Ol%wZ<R@ZaT}V8Sj`NN3-Hbg+T)vg
z4*_GT&ETsWq|Sw#4VDIPGcts?JL%^7sTFiR=l!1YH)51&WGxAJAPk2s`b_2`yy|LR
zpUCXQY;CKRuHoRBC8oyu+R>8t>H2v2Yml3xo9;1v$;5TJdM<Z!o4&N;S1wC61|7_|
zB;d0#!DLt3T<@S<2VAd1Bywi)!&ylvQ%c^2EhW&^2n%_r?T0IE$mV7+ou-giu~ViQ
zjlFO{pSF0rY3edWvXL%m?qUy>=;dI~gJ3VD_4?}<85@eS8cvp;^Erjxe$)gH)xj6p
zbX^d-vtdagTx-SiEem0hosF5`BIHHJnNGACt6Q%JjG6ScCh0ZY))weXPQD$&CjZY2
zS1f0H>ae|XGyEbOeriQXJ_a}Dz_)Hltc3nB?QJMLYG<=L(MxBR(@kFfN;J}>#dR@h
zU|%YPr~2WgUbx3b*LnOKrmlz0&G1+eq&UYD3-Ub0NE3^~GoKS5v&&Tuf3!ee*IX8y
zYv%)SgGQQWGVsnHX0tYgY|u&})8+aCPL}AeDk9#Tb)JrP^#;1e>-rP+nXT@GH#*=i
zn!Z9P7q9$dyW?U%22p7i6|=Jq$JSuf-#Ec24F6|mw=C-(fK&Cf&%^FZ!GRF<KHR?s
z2G&6lu-(1zcnf&Xg~?*Ldk~HqPEBJQYCBzD%YGb&-R)q@hc=Oo_oAiCeTQb?juJSs
z45a}}mtpgg9oozY66d-7(%i+<3(+*6%ESE^7^a^GEg$T5Nbq!B_0*599^JhrTT$HK
z>oH+2ckU#1@~<Y0jCt$b>^h_%R2gYJbv|2dhN~?4YT)<bO_zT;dy{}eDzW*iA&AH}
zm!>|1--O{31Gd7hGc+_bz<GK(>JIFAaRJ-A#rOl7)3@z#J&U(=by0DI@xyjQO|x&N
z2rf5)uo8uqHHKmO4k$`Z>ovB`D!b3Ge^N@t!7K^FZLI4rq<*G)`bWIUX%>F&^Z%L6
z$;EVz`g!N5!Q0s6T1q!G!FNtfYy9x>Fl@5GSN%F@Kh8n7?03@5KB%xleU3h9TxVv7
z^~Kw*#c&AoWN7PQ_Zs2iGPq<I<+^tn6zK(S%!^2a{~_#!$&Zv0em{uFJli$*N7pen
zI~RUhps!_e<ObPc<J|W!*a8>oe*3&G(M@F#Js+iMa=?8HV7nfaF0t^>!Nu!fn;DWS
zG}f~HdHP(KXaz?fJiEm8l)h~I`EIzZ3x_|gFUhGFu0$$y4zTmq!j?X88rj`8B#c3Q
zKHzTfVG0AVrBhG9>U!bl3e?Fy7XSRs#xjlIVX2q9FTf%GlntMt^W{5ET6C_rx(ywM
zvB5|I^*DC4La!xC^`bvKxr+V!8a%(Un|Tkaov1rGJI~Xj>vRyUXd@4M1|VpF3y1%^
zl>865$OzfZ?QFwp*uT)=8>~SKI1?N09;WMqGmF{nW>Pa<$9@xrt9xOMUDyZi0z-q>
zhe4on1^lamy3^2rncHVM`lFJsI_K82zw9A({0W%pgHKD?-5n6o7Zx7qgFhMAyVgVh
zS^9|$^WpaclppRh7<|4)xVvkr406l-mjcrU)<OQ5>(ZH8_6ZgqDsXk9E`K#&pYr<q
z5*+I;E85bIINY2|JgyJ*MWLM(+No=nG?mP<MXOK<R|Zk|yKC5SbZ#Ht1@GC}_xsr2
z8NjF)M*Vm3)U`Wj&<LKg!_)#;W=0Y>F^PYkD!>Hj*$K9=1k!p+!7N~92h~m2)I$40
z;Mc*OwL7<?4g8n`yGn3KHO{F=P__3ggpU$zVJW(ne;a9@ei+(^s8jm%Rxg}wCJoG5
z_#vNo*$ZoD4#ABs_5};-0<tjEg|8OUHFZ42+Oi?D9BgKU%<h{>_4HE61j6xC>@C$Z
znTHPOiEfVr-b_&(-BABw(bN(Y!800y)=ZLaY-UqS4UL?Sy|okWD%1_B*$GWnIJ-bc
z8QBShWe*fikE4m?S>Rvg)Drk|g0A(l=8YH)9_@p@EIej{oqqOXeVw!8rwj7l<={5S
z|2baqayLxcsJ~(N-Fa+Ass7mT;+79zVt<fMT?HwWyYM->>e)a?{Tzb(XDA-4qx)e>
zU#IzNBX!HvG5E+qypF^DhQ`J^SN!?+;k|xn(VwW*R+0wS&+L5*NaN1k2=_Y+;7tym
zAHlu<hFb>M!w!ArB`LzOdJtx-;XD&m<yxw%>%Gl0x3YiFXVsLxl)Q0zTxYMpaUeBZ
zkq2sz-pTrf)4w(}H8!!|mJ#2~J&sHDr7`Gi-L6XbPXT*Vp5FGID<Nhn$$+6sc>Qd+
zLx10?wqWivC^y284YM(I?mGzi_44&U<iejM@S@J<^kpaA9{$gCqnD~ju)7ylc~HrA
zxXFpewG&v*INioxy#Q_=0yYP}$;RORA%&v+X42mTFFIi&n{ZQ)>F-A0G2MYa`NAlv
zDO{STzhTg9*Vn0CT1c9vD0pYY)n=%#@xbL4>SdVpz~fQ4*$p?D;Ggs13oq=h0F%+u
zP~AA0fT!}|CH*l_kecm&PlxNlVSNd!0j>OveAwa?QtVz#7RRRgNzKe1XtYOT@RNIL
z0pB=NWoYo#y6Ulmv#b0L=&pici8Pc3FUY&yPpW#J$bRsdX1bx4{bwQnFzpMn3bI%B
z=K@5QUoT?EEU-_Wz7?pv?pOJT*o`iiH0=asC9GRKYGPm?Vh1!XfP$)NGx1HE;hZRT
z>yjbZpuep2FbAdQ`o|%`!dm1v^;d0nq+(zkfck9kSWD_*d8Mt%=bIe#!DB--*F1fE
zx=&xE@@DMA1@PTE_SJ=Rw}ZTh`7L^`OMzwC`hu^f9RE2OwPw-4URr>rL-)gb9yriH
z7vN2hwFs8!GHG-nUxUed3cE3V4V<6N|3dgl_{G#l+E)W_*_l#OEA4`X3)!E?TdvIH
zuORguS7bV_T!gv(mGezrA5wqW0j6xYv)A$UCU`r~wPE@-j8ekgq{dO?fRTlBZuG5l
zOgo<?%^$i<%?*=-@H)WmZ1`r-Pr;Hp$7MEyx29=I=LPOs%zO_$58pZTb-{4R0Cz8-
z>fy$GTYWv|*UhlNHnSOZChKo~_D-;?jIa+$E?aA#n}(m0GadSy%Z1QTf^<WF%zxJk
zy3xZPH_UlXUF&$?jGp)>BZ4(-9GvQybH4h)oP|_R`Cu%{Kk~*0)aFwkxV~KVK^82_
zdG!N$u5e}qle(1vi?^_U)~U{OwXWwut)D8Nd2L#MVpBS(uU_cKd#0Qy-`xvsbq)F=
zZ^}W@IOhAjFwX=T2KMC?-CPY{=^4aGa;}X=D|I{cxvJ@H@Q-cm3A1AksfO!${n?)_
z7q$RhU&r2Qg^lOp{Y%zE>3MJw@?FQ`v*)aMGeZwslMDU%@P`dVgCdJb|MUawo$u&e
zhY6B@0wCA*B79`lr_wJ|sVtMPwkZe~xj|Z}uO+F4*YtNR_#A1c4m~B1X@Wor6kX(k
zT4f%oYggvME$iWdY--gvG8<V8ZEjG_t_@INh6}+}>gV99Y<>own9sg3Nfi)}5uMck
z7nJRVTl8Bty7hM--!DX3;y2qGnthXrTE2+(G{DqiRMneBrn>5;Alp`q4)J|2JOJ$4
zweWf|TvF!0SznaV?|+S7)3*(7%QiJO`8euE$LChMx^@~MqYJL6H&xfv2C0i&n_$8K
z%n;mTB=u8o<Au&0r~{t??$;-I$LCY|?7c-gA-Ug(oNp7tM;xYLX4+CenZS&uLQic!
zEFg_j&(O6Vmftb+Des0mOmk(fZ(+IsJ>yiDqsZ)#Q2myv=h>t4O+Ni`?rk}+B!@Ke
zn{be9%Q#v=&<Z^ko%YYV;m->p>eSzFnzsm27E|NoU?Xgc>$Bo*z}nl`)F7N%N;h%S
zU+61+zk-kRpv?duWTTTd0s-3FENww_corrbU}GJu(pmPISBq#1JW>GJm6TJs{ZOx7
zBYG3t?|`dq@L)D3ic?R*qifj8G2)vFz*CFh;{sS*1iMW$?Nc!fdio=XyX{jFsi8im
zn`&Xx&L4{_zPH+Q^6ZO96+ARZvd#0@mr59xT3jgvQ<5ULXJ>O<tJ(aesDJRg)gz3j
z1Xbqanw!(V8=gC#v>Qk0bllqF3@UO;kW=Pd3tkbIjKycZFl}8@$%jH7MaC;sA)dR|
z>E<G;AhxluZ12@ts;clP9`q)ZNhu!Zz3|p{``Hv_X^qsi`;Dv4l<vuuzF5QQRnt0^
zM3PqpE~!dEL966~5g{1kQW1e06L|bbt>og8hP~iY3YSQ0Qm~TK&V1yZON|LaisSKj
zLctbPOjK5IqN*gg9tpdnjC)(FlDUdrrO|4pTdQ)vJm&}Uzi-!H`~xwUj{ZnUr?G$4
zkECos;8mI914=r@e7!j!$bu-PG)@sYy()twhdDmQ4VG^*>Gxv;mlktM68ogrzVzoC
zG>&Kgw1(;UZwZ-y{F|5}LOeP7CFRu8$)uvDM!zAJ)q)V>s6l#pYtJ_ny;5);@6yHu
zRnrGHq1TSvnie$k?@KJ6XP9sF!eu@t|9|xbwer7HE#_-1TuR^*yS^tV!gSnk#4#nB
zrE@L3CWVA`|1syKHx<jmm=-@%{X^QEYbo|<>3|kgrGPN_jW={zLnKqU%)oKkMv8Do
z3sc44w?b4Dy;g{j;H9`nP*uf$k$Y{9DHIZ9Gf#8eMK3VrCS3>c`*p^*amSVIRA8z>
z|K@JO+E*Mv9S0O%4RHleGcNNbEei>8n;#||b9;LMp*eo%&0L$iN{~J4hpTeA`YJc4
zmjqJK)KGe$jGV=%c#oEpWEp!ARN{)-<}MON(fkKnt0X5;A%Z~)otN8NhW3`=$K!$=
zPQlj8x$0^+C-VuRt>72McqlcI6x!U8@{;`jeoMX0ebqIzM}+T&2#?{?{lFfx+|Wpj
zXBD3*$|0PWR^#?Qc;xb_PYh#YW3^vr82?4w-R+*230MAm&m*q0ES{8<imzKlQPW@=
zP(}ses9~cJs9l`tlMStrdZA?6u=S^AhhXD3mvL#0iwQ!KlTugOrri4Xz6CVENWDLU
zqRboCJN!E+XZHo(d&uB@MDzTz<rQL)gm{Q!vic4Y&c1|jHADXA^r3b?Q**>@jwj=M
zP>3k;kbn|7d(HYGu6xkmH^B9F4|Pu^IlZQ!fKpV=*)?yPmw(f1{v9)8o~A}i;<o?R
zTFiaYw~wM~|3L~~B0(_hqSc9lmno{cRTJWf1stzRyvKUIt<9ZM)54V*`n|0!gUjsm
zbE~Y`Hg|h=tCI9zy6%=0yy$NCi{S__>s2V_)+*!TjxtiYbrN^SR3#;$g_V#pK91Y*
z0G`DMiU|o(eWrL=P@~0U1+U?u1X`tD@o<<=DB>DY%!hEN98y&M6rxbYhOiQk77-#b
zMI;R^hQMQl=C@KM&J?dAcm<<N2njPw3{p7#w+dSauLjbgXf-KQu^lyxP$kLHQbH0`
zDV-4H%@oa#QN?sRAodXFIFBc35%x|4f3T^OS5uOpa(!AH9a<B=C&g(zoYqn*AD53)
zBxNp@i;15&Cj~XYOVMaDqcwnI=-?xKf=8eli3ouMgbqZQa)ZiC;^P_gcz`M<G5aUt
zpg#8Ud^sHF^;!wy62h#tU^5{_tfR<Q=IJs`<25eCbA56sYNv_=6WFp4=hd{hmdw55
z#NS~loe*y%WRmHnrO9YDMWR#@k)vLU4kRcyttRA$Gn|1GUKmNswKNw{@TU@&M&*AK
zvXv?xk$E(bN^V$^Q(QNWj892vt+M-8dYF&CoIwY8s@<T;k`&4B71T)~tc=P%nRH-`
zsxzguF+Li@jZvz^lpYmQ38$E(I23b-$|I@=bRD_o*;FYdX^}o=h0Lu9>Ywi)K>(3b
ziaHTkhO&{VErv8gsmkOB!gy^u9-dh&_7WmeCGfi(8_)Idni42Sjk*3~NUMoxzpnd!
zyeK4IPpX5X?)FXuWp0C@hQuo~=vahWVn_rOIX9CICYTbFpel;^K5p<-2`%%{5JSf%
zs3Oxuf|ot7i;>LwAewF`S_bNs^NY`4nm;5Y(}B1Y475<r6dGV>gcmC^=wO_3(NbKr
zP;^jc+|e6w*Er>Ns%Y`3aPxD4Yq3K~JU=e!pY2R3)^9~G=?dZ=C8%gzS-&8}F;bM9
z`Di(X)?9CjD~Uk#gG>^0&6pGnQqc;A4u+{diyT(CGJY_Bk{?C*6w1YWi7R2O&hM9G
zEy8Pj)I&&&I+s>r+ka2UcuA(~Tf?xxZ}$>9s8Sm(s7!81HW>)Y!=x&FDq2KYf@r~=
z^09ezaEx+URQ}{0y!hKp67+vSPbB4zEG~%d+Bqo%BbS}d=nYD^aq{7mz=b~8c4ObD
zBB|n|8D*iEyS+=06TBJ=JWLgjqky_1LQIH9v#I(JDzQsKOW{_cKg#9A7R4P=32vP)
zUO{uA1a2t_MDl5h4k@`MM83>Pl?f=K?qC|NUk!XpH~|~!4o@Ug0XHerP{ZAE1cdmg
zx{3^hx8mm3G>;Y}p}tn8CA6NK7*796YBw5|iazNS@VAyy<euze0nNWV6_J!=bUQ`H
z5pU9}lH9s9@HxpBaU?x_JO+IB){Qh*23xZ&8aK$t=MaCzCo^eLK?hJ3!MaS0oEb@v
z6csHQv?x(7B2!n0-6S9H+oSSwQ2a**9Tw5B1UVRS?Uj2CB$->`T&u(<WI>CrL%_)O
z*oKilL<HEoz=Wj4U%1soa|7yaInFRb&q_WJT{4djqwh{19UaP{$HP<^8UQz(Ql(^I
zDaD0xU@HYh4M*QV{9uYrDjKo)k--*@;DLzTOI3zZX)C1w+H#5)$1*Foj^j2)Oi9s{
z?VgPMF!pz)USaqXio}gYqczy;5L2pNWT+0K>8?a22yrEyjGmoA(##U^&pC8B#kfo<
zjQ-IVfrMR8+S14dH6fa&PzL?#8k!D|S&N*W4hb<UEoNts395oj$R{ah1f}1L*m#u5
zkD%&%kwfh*W`E9c4hFjvWRzB$_+w^SM8-pk97?Nvv;@tXDY1pQenk!kULo{&geoOt
zQ%eR{29^>of)?DHmcxAXRE|?ZwCxKD)S5sqF-h3Ss0(N*#JGtv+C|$W9BQ8$-7ue)
zwlXfVRoq30K)EK5l1l6g;<})-w?R2UNSrD|h!&y+W+(QzFU7~jyE5{lc-kt&a`~Bg
z^mvpiw#jH56M|T3qN7RdRWkYj_HQfYHmIZ0_H%QbQPj^W6iy&Be;hlyN{PsG2@B^>
zDRD82qN576lvYF0U+L((x;Tw!7!tVE%INm=yy6(TUOzv{$0F*R3-V*wQokTii0cjc
z<Jb*!`!KYaO+$hp23ip2B&ytmA(fAQnAsFV#q}e><two<H6;eDbWF9Ee+Ypw>|cy3
zH)zVJn3u!F#_+`S7{;Q##^M-yS^tC@o|sgtC|ev2aDb1#V4~yt)2o#HwS|iZaG!v|
zI(lRtEOXcf1Widr#5ajEj-nkvE9<q>@d>6l`aVU+CCbeqav%{$G9GoXbUZ~>7*dh6
z`e%D}9K|t^9v2Xq)2bL^oC%CYgM2VLl0_$CjN2q&LJ&RQKqtafsV&5Zc`X=Sgqvds
z=W%{aEXbx46UHJmtAj>5F^a$*l12ql#LMGMNi;?XS}941=}bBi(KVt)Aej#pIr6XU
zbYd&xv0>zwwx-1`*r<w_sFzYyXDB+6wk{!3bhnL6FegnDN-7oIO7hWb28D4cC_a;s
zFQWVhrJ(x!TLYC`kAP&0Pa#ns#&9X<2|$v@fZb{ejqwwgxhW3ua1be(G8)w=5=3%=
zLFXu;6EagohZXrGAn{;I3@9h~R1W-xrW2ZRiAB?kv5Pn07LOxVm7u&IBRjH%Nq8qm
zCK>rMDrhy2(0Q+wmQ|gzsN$zadVG{}n?`v}+rA?!Uq(Y%EhKsI-&wRAr`+(V2?~wk
zP$n%0sWQtL*U85xEi^4p8Y>Lv2s||$xP+>d5i(XI>r(k}TC`=*vVi0$EQl!+Er-qS
z=s~<7O%+EEWERU9D$&G5C0=-l4II~_^2l5>6apE9Z|p>_xgxq80~>QbJ;sZo(Wap2
z)+D0a49+BC?OHxITAWWO$EXq#kG{#!<8jn{Vgd<+%}6JCszR65ZU>zVQ$@~Xn&(yv
zW3YR^TwtZglavP|R#1p<ucqnbgt3wir=xY0Es378R){XmbS4o5*G44RVW*MgRcDnY
z5fau)sUWhP!aMBZOB6}E{6taT%P3Bwo3BM*Nr$5sWZIHw&TG@K$N^8;#5-x*R+RNR
zULKo|*{i#KNJz_4^t8dLqRkE|33VdNsiHj(r8W7IdHE_j)zBC^$tMeK0i?IXJoM#p
z$UG6~<3d9GHiOn8R?muF+>+5n{d(PK4byDL#d%}|;tL_I^PJAK91$yMIwo6J+4`jv
z=9X~6YFaIfO5*eAUO{UuJ&>0FZle>TwG8EbcY*l6iB2Z0<+im*R8@hwlnl-+K*=7U
z$f*5t+XhL-JHh-C$4m*mQiV4x>Z2L-m_}*xEsKf9{1V~&w<s!6%z%bs=P<8uBTB+}
z+_qN5E2U_qmDYIb0%tlTaefSOuV)d>bzttQs5z6U)N?f6b0u+=IfV&K$>Z_pOPNIT
zU*ft12QwfjvRGg&(-32jU55Fj5<Pn%t&KCKPRx>d6i)O#DAv#@hU3a8AB$d@MQf6=
zMD64(8p6&nypij!&qMd4HHE4q33UNSCS7;IX<OdFqQJXZ7>IT<<$3FE-7`iue;6tH
zm=ug`f0QAby_+6R%WLK%*q4!{TF0T0q07cEJ3pJmT^G};1k-jB6X%FYLuVb`M`%se
z`LYBVrGYY?C6w4OK@9M!SZ1(k2+YG{a6=)@pGh5b?+`+Id<;$(S;nN)q`)3D2KEt~
zh8%r(LY`;LPoYhW@X}aRFwiMv<#be<4CBv9Y6&`@x+W_>g~mD(LCeH!D}`1wA|d<p
zAi_ppG&xf!wh<*P&d_u!hNLql$UorKiVh}W(VbD2Lh~I#ElDBX@w3e|qF^8xMH<Ld
z(@FyFFGws3OjG$OwEq#bUHSZZbV`Q|H5P4h(5Zy62(Bnrms;sm&{+OAlcAHBU~}Qc
zF9Mw!rF;e)yEtXCrLh<5!zyjCrO_YO$G}=F_GCJFbcyw{1TmQLo4D?T1QQ^Bh9n?h
zuYvgskk*NJEHtGt-*!B*1bWM?+4kj*cOh^W<xHc1)~jjt!tDGsN_G8YK$tAgEFMK?
z+Q7?5>cq7aJ<3zXaJtkYbDdI3^cc%V@rD}&S(r=<(TkkiD2{4_B&6i%vrc+6j47cS
zmew6JV8)f_E($oX1*xZ=nAUrTy@49y+={x`$j1sB^8;ms9uqOt$Kz7pU8bINDjnVK
zLUnI&3R((XRu(@iGzq8~suT{HO~aVUMSoT1oWKs8EhM7b8OtOB+Bxv2`C=1YHi-?N
zBP9ZSV9fhf2C3@1pzz|Q6qR?Zg36(&9wQ-K;MW!T@&6Sj^2&H{&vXUVT6jx^(Nws%
zq9U@iL#u$cd|Q{0PH92WnL!KkhIpo>8xun*`t%Z@49;#X$)9{c5pT5=nhOm`*`qJy
z<XvZ`wV3$Tg3{~EhV;oJ-tRMy+)iz2tUNR40^{Yrm!PN4#s`ErC&GK)V$9pcMC!b1
zcY9vKi>dzGwNp2mjqaXG<C46tN&_A%{I1fb@*zoa7gkr2UU=N=<a$R22U@F`Fx}qD
z%&V0Nsj<tjz+>J)YPN4CWQ5sl8WF}**3I@eT25qaF;mW@D(OYg8xCf)OcQf4aTlsy
zvxRs{@PFpz_9uzC$U0-6zv_1xc`sKngNA@I&b(&Q3jn)4K9X`=QPtFk$wq=xV*CV$
z&J}T=TV;x%d&4Cqo4JHu6i-w*OpW#8t~`?e5bgno&+&itq{@7GYt@(#&?F4ZRql4A
z{Tj5HOBmB?B_+XZp^0yAt)jM*_R$SgThN?Sa&c{pGUyVE)RF`oU&IvJIIcC2P61!)
zI8{w+X{Mm$-;Nh*96PJXdDdL-$5rMQy*5QeiN}>OE3mg;Rbi?!%X&?~Y7R5$u*|Jb
zA`KfWaN2Xs`UIR&$Sba?xTcD3P1asVdLFGB!CUBc<Kyic1sq~L&gr$sIrcw3!-SHq
zIZixKUjVBOu7~-(HjEQqY@@}z6D)P^c@3U(Nfo=bk#Utse0AyhHHCN8uD>U5Q*B=D
zPFP<@s$ADI*)aTQ%W^{HbDk7RE{2WTyBRCt#O-xff!W6}CDn%3NF5C2nB<t|DqQ6w
zt<3M~KCvWwTZA7K&J_LSk}8HCC9PrCf{5mlnh^9k)x7C?45RrV`v~9BM&<s888RgJ
z31$Q3sSYWerg*uvae>!_D^F3yoQm2(9dim(Yg0K?a{`_lK<=YXU28d0g%h5ycO3E=
z(wesf+Z{A8=H~6pXP)a^_g0^ov~17LZmml2lE0O4F?zYZ*1q>kw0wOQFd0!~U$FZ`
z$+d%D<h@qQIQ2Pbq)9(NW<fJd@D=}8<82_AVuuxT-I;mmt>5Q;T}L?fm3j;2;W3YN
ziSc@`lfVGbZSK6s>ezCp<1f_}JDN%;>U{sFj*pwIzsdV;z4uZ=M|^#`M(U^Q$k27f
zb)h#*D#8usz0AM7=hw}ALrd-LdkEpdRYt13^QqA#6!BBlw7Z>|M_LaxmHxV!qTu%C
z_7HLXk>-O(MPlewWUAJ{t=FKl!fM){B!xfwY)FEURIbWsi2wg<jaFCI`YLODrF<f}
z3`MxP-f*Vas3o0BoTstpHIO#X8mL@mUsQ}rlG2GbRS@B(JQBA%slQ=HnriC{F$)dB
zv<k>I^%|t1^*<PIJ)EZCgCf0D`DNwQ+qcc5Ok+|^s%5C&jY1$Kj8?4_QhoBM5+4;p
zRR!-KzJ|DdZNaP~o!UA6;n3W9<@c=0C0iaOiD4sk?n#@b=(W;UJ)J>OgMq6W45=~6
z@oDqlzFL=IUTE?Lm4x*#hu=roFpe0wvK5{}L%F-%Y-8^<koJN+cas4+4GlS&6xDDq
z=H~w^<=wu&4eo2Q=D+z6AwA}EFiXGcIZ_U`3Zra&*qZm?Lj)~MOYvcqPpp2J*bBVJ
z2<17ljwXFpzIi>>q2I)wXPv3Jn&H&n5z^{Df0>b$nPpTRYnFx~gy0g~3GVLh?(Pl;
zcMSvx!QI`02X_t!3GNWw-TmNhbMNh*nZ7+O(^ad!k{|E$?Oj!CRjudJ1E|DA*XD(5
z(Q<d)QZ8M-SQkT;zdd)`Qy&G|lcr1twjnWU4`-xYX&g!vx{pvr@l2^?SUWDBQ<yoh
zYYcTS#4pSErLs~EU<#_=TQARmKcpxR;C0U&aBhkBs$$Z(?Wl@A_v_-%=h2$swQX3}
zCQvn@LltjJG4}h<A?_<;rRCzxj^uopmKt!5Q+EfOpMJUQ4HmDKC6uEXBJ<YqFtZ0Y
zy&0a&Akd76J_j50PLLEDccEE<t)i9GT@1Vzttn`J=zE5(?u52S7dTA0qFC!>=rDKO
z_Fm>z{jzE1rDM4np4Hj2D6jfew^xcx*?xC5r`0%n#ya;b=D)({yKMZ6PwVZBT6RAC
zAYK+GXch(SigXWh{8{AT+_^iuvQWy2No#I{%5o;{?ubd3J6}*tu$gvbN|)lQ;Imd*
zJ662{I;w!E;oOQ-do*Fr`sV17U;Az~E^>Kz<uS`(#Gpg%jNR~6CIVkYXe)KyTvz=8
zH^6KhC!;$aA?(T7)=vdhK?JR#rxosyeIAwnxyxZo+q9`Sn3-58K`b7!49~F4n2Q1I
zZ0WgU(OjS@FC*gC6+x=20vQ<hp}egkDG{6XBXX7g;`Oxw$Jm$xv0bZT^`~*@xK^h(
zqxRXhfx6A+@KVdWeQgYlE0=R|<R^M5$<0s+i-6|NB8yQd9wKmvL*mU=+YL`3PZ7{9
zfwo}e>lfhOUbijp2j=(grkXk3;>pMAXmAp9+y$W)@~1|gT3H+&o8}+P8Qr|u5na0m
zSJsJzgzE??R?jOiuL`b=`*k1PQc36wWra>jB~Dlh?gTPv!o|CN2Sm4=pPNyus@w>S
zv@f>bP1%fEc8dun3~>J-d~hHLS=x&c^AmK%?wKIaYOaG~8{#}Tq;}(h9j`jBDOHWy
z-;Gcrd=?Ek)Rqj(XqC?;_kZeLMrrfi=WCTE9>mmRh8nXsnXjhydzIwqRC@oJM_VNw
z-$1dAPMQLZJ3aQ3b);*CS-%Fo883yC?X+m;lZ2r$Qo0~=?B28}esX=&%k|pyfTEDc
z<Es|1y=8m0bUJpcy4>?6U?QOA1?4{UsJ6WYAy%mOT2)}@K8MjXL4eQzM2CA|lPmCL
z{A7~~fZ~`d@cij@V|W6gd9f$d@~rvG?Kv4{hZTm<w9=X0DH3Xn<BjsyI3L_Gx3`nc
zz<GyH;v<A1njJEeULX%KhYdVYn9n|uJu?n67Z-^@u&ylbw=WgngJ;|N(D~=b9g!pp
z)9$<~y&#7K`k^^IpV(T1)uxfg-6N=r!&eX%2U2y=XqkdM1w^H(?{ZU6r?wgA69l5u
z2o@5>GO?h+q#<!wgZ7YG&c3N=shIL-P$k8=ApJ{C?Ds9_ZBzT+Fz<I>s-G{D2hKaz
z+b-|vs0=?}C;NB^$k2Z~(OER<=!Ol>rT@0)!FjNbK4iRnvL+~6P0V=u3y6HWC?`u8
zX(bX6J;Ds#e?qUJa)cGYYEAT}3`YL2GQXqOTo=~~suY<28B!Wk;@a67GLa3%U^@}M
z@eLE^5$@1|?h_s~5=>Y@?M4bdtbkX_-ROFXh$#;LXYA(kY5`$sT2IWCIrvZ*lJ>H#
z(swK}@oo;~=%0N&bt7lNdIVOK;#py{k<<~M#cMyIq7U*sJ<qmStyCIHHlG8I8V|XP
zeRFc$^yLTIe<@y&iWcg3sJQ@bttnJK(qiBbd5Z1x8-$s1%6n<%u3EmA^NHonJLSo3
z3i_;M1bh)8<6hRf{Dy&|b+Z2s8;zG>*gp7XB#X*1Sv0=6VPJS-^Lq4_iHSwD(D!!m
zb+NSs5WB+ev-7%0rZh^#!|ij&S!H)S*p7(fG~W1BC%q#s=KCJ*RS($Scvs1{-f~e%
z*2>Cy5Ef+0d^G2I-h0wTWr?!J<8x597#M1aqS8Sx=ymqnMF7g0kdM<k)6n+3Dy5!J
zb^h?A*gQ%97XxLlGNHKd(&pXpCA#u(g8Z8Xo9LNg*4^90*AmeaGq3$kT*d3$xBYos
zz;@?@XekdK8d45___KyiD&Lx>ltIFJh5$Nc!S!g!4*Iv9c3u6r#)TYz{BSojCVoBG
z)P@PPvvv?`93{DT0f;xk<<06XFV>-DKamW0@)!}P4X(Q~Yj$-Q$O941kDfNWI}E&n
z2!Z3L+|0o35L>N;GY?$TFA#{kDU}C{&S$L(0aO=dQ{#v?ETh9ld`^$A(;Ym%Z?+vv
zY$9t96}-jG%R+Cv3jRVKXO>SyYr*i{*XF)R7Ih6M(whx;nZun>K`|vRnVZmRf|Qnr
zDu**-tu?OU^*o$=Y==e-6~-y=*;mxO+iN)j(l=I`@b{ZuJRFv9T$hO~<Wqe1npT;m
zEN~stmz(y}x=3O8%jXyTE#Kd_#Y~&(3x`uE5-nYcr$}J^c74x-O?b)kQ6Y7lh`+9W
z@p|JV&%PB)Rh+SX^q_fAD)jyBX^{_@b-GUfiPWU?IbR}2IIN|KJCfYBM3XD|y~B6;
zp`?<6hJLG{wpbgJ=0Y?=$<L2-$e5*;U&g<7eH)mMxetj_juf0mI`fzm^&W@Fn+<A@
zRb#<cpN2DZ@M>m1rzAb-4Qb2g9T{5QvGh3c&LKStFZm9N5%i@C+i-&NeeA8m43px@
z_}<8C6iFxDkPEU|m*Ww)73}lV8Ecp<DR$IT9Mm+5R$D%DAda!Si7<dfk!Y9#A}SkN
z@Cm#eHBBqwb*x=cuta%>$T@Q2bWI5Idq*-w7Ao@3W{L)n6A5tpTpyfFQd!0d^82i7
zv^M44rBtzZ?gtyx-w|i|ZqzM4{kAi<xqW@P$Bs`C|1x&|Gc{Ad`S9f8rGCJ1xju>=
z*oC0EKRC2rR-5Q~vgk-o<7Fwf#)mch9{Ag5<e`9;dE)hAUI4r9@ZqwOP(*vn+w4mT
zvA_G#?5c4+c#2LYm6fMcT{BkNHCB)&6ofRjVwS4K&P0~At<0j@W>i}|6joAyO%w@6
z@fYwrlX_y@9~KmBIjxR00`3>cBM=cR9<++z-Nl02UmQJ+9ElsU(z^Y9K7`*DTs~{|
z&U~k(xVmK^w9zxQF)D3nIb#Y|g9hCMztNk#%BX+~`s8sd^rUeYW$-nur{<ZP{p&mR
zWk7TWMB|h)JC7}(J=bW0{_&RuCarje;6*zP3_+d#l}HnHwLp6?t@aM%UU@zqfCQ%)
zx48?wbAuSW?Is|uT5|^<&(=4es|>`mV?pb3%jwBW;hnLOr@9SMl+@V53Fjh>Hh$xE
z$(psNMGT6H`{Yx)+S1O7T7eMqMd3>U^_;`HBC~2M;>mImpkENBPBzUECGE!-q{Y-w
zrJ@Bn!iK_y>P@`fC1rPJa?WlfDJB3-1a02wlgx1-UpP%Zc@UnNh3h9}gMp{_dBwHP
zF5ea`o|HxvBfQP=hssB6FAEb%<XQPy_j>a&%-@`2-2E-o46>D{>1Sp*W??Ar&}}jw
zbf4@MDm5S}*e7FfwaJsifNw&|a!~K#A%0)lGpXeu{$`<uAb@anb96DWv|uu~0GPPj
zxiOhpxj5QeFqxT{Sy?dIJGxl9TQIS3b1-SB!$ClC_}A&Qf34GT_d<Yxe18B10rAK1
zI|1XjJlH=7-Y-rBp12SY%LEV*>i+@3$AXiY)s%(Xl!3>bi<5z!)r^IK+tiGMfyLaE
zo5h5k!-Uh6$CnXc?O<Z}uVzE|`STb2-SjuM+d<r+g4)8th{A;!02&?Jq?c)F6S^EO
zpNlCv{?>vs@;ACszR(!)6atx;(}j14__Eq)u+|H^{lZpINE8+bNV)Ggq*^zrGa1jJ
zmQGR{Xa-PZX)tt~ke<BW;`mb}&z{=GF9Zr5%OE0N%#H1^+caU2V(l#fcW<R;yIzxs
z7;?c;hPt@RQt$x+WpM=Kheh&&R6lI2ZAM3_p!6D6iw#u~+0uv7p@N^&bf_&xP4`m-
znI_a!_8;v@<2iIvi{YyK5ujO%qA)Lu_&IivKU@?sXg2=z5GL=@6`f7?CFgUHwcsg-
z-{v{ywuNnzm5^AmBu!+yMDO~ZT&m`L<yO2Pqw{I015a0Vu}!kB%h-WGb60~7CVNf-
zwMh3cZS0|$i<wq-x}dBcAn?jCV5ehYWurb~X$cUwY!n-lvA|~%Q;ZLAi4eDs!5p3P
zBEkM~YQk>4)WZGggz@NMvNk^7!gxCj6|FHHS0ql99D_DhqV)AslnRWsiVeRg`Yg|4
zzPT(QAn7s~r;C9Zp|RXb#VJHvB*FC5Qjbg0v8b(w{39axV*$~9ll+dgK&~7>bsIY0
zVvKs7UI~Mhf@=A`{Z@!q$oQR)#H&lSI-?xRa#~$h{>bhveXAC^su_aSDTAAcoqhRg
zn~a`RQboF4@>KS;q+lpQ@Tr=6+JZ8*O3YGf%~-Sei-z*|DqSH;S(bdo{m~)Sq$D%*
z=3`ZOwBeUezQpfl>Jj&benFP5BU9{qyrOHW4LLa)923UD8YML<Doo07Mt&48jXmP(
z7OV?OE@m5Q&Ruc?RRNr>^DzeM(i5nuzhTJjA&@rCn3%eZX%4Sq#H8oN&7^QTX|R1{
zdzY>+JYas<BPp8Q?|MY5aZ0^S+p~FVudpdTs_rhYBd^9WnPiGro#A8f{lX~F?`dF0
zvNCG1_7olZq+?Qk5@Tmh4Kcnro1SojI_Auonip(e>pgw+^GiSM0#C}1p77%6l#mg5
zd5KbH4h3-qnzX(z9=SAXO^pZ!49V`QQ`1}IjE!knRHbJ#d$<Nk6+HADpznaLLgbLQ
zcI0iQ6lulWRh$W48Fov>_YDTY!MAySXlEYg328L@c)Z2y7oRE*S~Zz^C3lexduYjV
zPF|-jZQ~dm>u6LGD&FG4Svd{mx2bAA$O;J$&oi|{7uNPK!55z~av>+w=@o*%Ed&f<
ziH*@p)Hg7&+3XF-#q)IPg&aA3hAOE7nGtt7th?xD#GEz7ur#OdmUeN5(MSbohPB5F
zDKz$;^=)wu6obvo^5Ot5Se50jZ-&@xqZK-=P*^EKQpcwEm^hB!E16gWERz<;LD$oq
zIo}%2R6gCN45HC0%VJ-mL!!~Cb-*aR{A{7Vs22W_Qw)URBQRCXn3Gw_Gc`*bjnz?5
zlyx5S4rm!CIi@8h5`dY`B>r9?{>YY@xFdQ;rdUE2jNeBJ?Bsz9dk_*f^noX*?V_e(
z@pHZ649WqELbl3=!AQy&2vdRde`3^NYrU6!5H40{uO9*d2?1Ci>0bi}TQTQIIAduV
z&%xGc42tH`&xyY<%}E&B#0HI;Q?T-9h(9fQHI9~(7h}rT!Ni&wKn{i2^nX+^J#V}*
z6z5^hVNhw5Z_a9C7NaYuC)P6zUA>6S$D9%Jc)hQd(kE>~Q;bxV%><RkGWcrG$&^|X
zC;4(AymfyCtez2}bEHe(u-RLbWf7bJ?!rDU@>evdC$$TH>=q#H%;{x`Q)-jvx>^;H
zoGe;f&hUf8FSPtnvrtq)0}m_ojQ~}2De9Ai-nfqpmKbO8N!PYz`$8mz8Z3wAH$N+~
zIoE4%%1WE`%)^R>3kzs-Ur!Gz%QN6QkLSAWGD=32=+4hvjf6zpj1=>TQ$y3S*k6P#
zIf|thR8|7Ty)=VQRn{-<yM3THKv=?}_phm2D4SWE;)~^rR*^gR0kLhAfLB0R9ZeoB
z;ERbivX%XZ-sziICzOQ`>m^V!$Gu&czQOPrZoFbwV>1j6YP|u8F>MH`zmiu{O&bd`
zEJ0%?!y#D?N#m!r&r7zZ6o?wzc$Lx7Zjyz=kZK8u`Hc8e8%Br1ypII>8%O?>6?MAa
zKU_ZnJZ|_6Ak!Z?E=sbi4G(xR%o8H~!m1IZ!qe2JRQE;#6)DkXF}Mg!NR2cr7GmzX
zLR=m2+ASBT0f|eHER6j%(jG(oZ(p^abH>#@EoCPqe6NF*F!luyUBVhScY+gVqip)|
zY|<Wqx~CUDv)_&-v91^W#~PTS^K<onIwGAI$Wdv4@yo?HX9~NKmR4Zd+wz>G>`|{6
z02FHM&*QZhLX&miFA0>3mjVSy-}zv$iP{rUYrt-v8Cy=GNB2b29vLp~%P01gCRpk0
zr$>#zUR4E!T7ZTENp!?veTR)AS^f}BmIWEHv=7+ayT?IBF<8`P=d*Ew>5{*DV*w5Q
z5T1MOZJ`foc9)<{ekJjO<B{L=X9U8un%B(ss%^PeEt$lvl<+KnJ{UEakr`;MrM=Z~
zsM_=>gVd%~X>}G%Rjx!;T^dw!i=BC8ZB^L^k{Ng&@mlQ=pC0(>6_3`ElwBjFpQFqy
zhFKkk-uUE)44R@CsfN&t1P=WUSdE)|K@~`$=+ApgR~H7%3hhjIQ=_9q;>=<>w=>Ho
zEvGogEwhqVx@r{tH>)<3I2g8|!E(%*-9WI0=W<pe6(hITj^0|!TEJK7y4PvW3>0Fm
zB$XO^*GOsFI){$_{de1)Vz%Mj{1rp-LHrdX>$2o{%PSuZIg&7LJh8Z5Q>GP<6POh6
zBlh3)2p5W23Y;klMi_ogvpb&ex8JKWFXS&h2@5si_1_7`=s9C@+>-DL<E;TFyW#!i
z6h39MAhLx<kX-V?C*7`_8gJ{WJT~)?_Bnk^gq~h;gvauD(e7HY+>>2Rq+rt$ch+cN
z+{8rX2OyQI7?$Qo7S{#lB;q>);$^%J1DjB=?OzQ))eL08lgm)@J@LE~RBevO0UPdr
zg42kM)>Qs=fR80Dafw>RQ4mGqPMZoL&K4^<4;6S5-JrGLsYh%P*aa8AH1Tv*RgH64
zg5vqkri7XHE6G03hZ`|weKSMzIBi#<(ran@ggrN&lf3Y5p_5-b1Cg{Wjum1xa%8tZ
zh8sD)6Q6r_98O$NY^jr-#sr7CzwvS7ryzCeiAEKcuS5~bN1FH{)dp5iP%mhT+MVOc
zW;6zzbaYSF%tPuvv)2`k*az1YE<;=061%gn_So;-5>XlT&L;+bcP-#}JyW07tuVpT
z$cnfW8DfoEOW*QuRL)g2Q0P0J-_%f_(GY=!7R_tOidcV}!lx^w{>d5=JgKi|bEF(Z
z{aBL|mJ3mEQSBfhRY^P6(YbnRI>@`dbL<wye$A6sXfwLjxq8(3wG`A+_-%1tW4617
zjV;5b+CjI;p4UwLV`hFxl<I6&RQ^dc<%o$?1JOcpO+};k(yDQrmJALC<b`ZxGzqMO
z1~QY4PEp$8xbNwP-x%xQnSHFTHlb9=8=nx&RxI&uF1O)9JM$g&0YYqI>{PnBe<p?D
z<@#QgT8%3_b#rniwTRC1LNXR5u04-pvrY(!>EZo%J!<&yAh)*MuE_g^Qb<@ek0Uhz
zKoU69-C!Zmr^2Mm4Wv(cA0Epk+FQ#0!p7+~oeC>HPGU7wY{Nc#<;-m4jVT0>9U<VZ
zYa3Q*E<NL3b>rT||8aI8fC6cWz1lq=0yPFl5l#vszsKV1hRc%OPb%60@AUkzf3ZCM
zPV7^EOg3UE1$VaCm2*;J)?Zf7As|Js&Q?%fe4K03HW<rdz|w3qGZC?gR~s*3ND;W@
z#4W;L(Wq$fu)|SZW@3#wcINCEJ1H*6YUWAMx=6xwo!>skU>1;XeoY3{OmU`A3Qg|I
zELxK>^4Y$j*F~!Aff3|-!z6_FrOYwNe}+~(iCM7_nS9zW1_AP|!pb8iX|@u}2TmvA
zYcQ@1H6`B{@#j?OdIS1fW)m!GKf^LH|5)DZ5Zr7OlmHECr2O^+Hfy4T=TJw#{jkk=
z96FN;E~ZR(O!?KEJl~aPsi1oPGUY#4sy;EbsXMiqZ;inZRkJ-po3RgUwU&sKG?w!I
z7<S~L+>DMGC$FX+EcT5RMPWW*&1Yj~zka{M&pU0@;6t4+1X>kqc{BBg*w+HcuU{>`
zAER-f-_*AoTc5UIto-O{4X@Jg8xvyd5M-OX7fxjOdc#pOi+IzcP=YcYas*ru!BU)S
zMhY@tOyiSvcZNBkopv8WQ$9Y<20`%`1}YdbH(N#H=a~%BuQo(ww+4%Nr|GTKSK174
z&CbAuiXw{f&mbr42l4qC>b~#o7JV?yKY9?yjCo@+lKpzSq_|;_dGg5xMN`ZRjN|?V
z%#^ZEfHwS;PQ=uCE$2h;z7WT7rv0GA(ll4DgUE%sr~zHNja`GS*4}RE$z%J8Klk=#
zzIx=IWTKu(IJ+azdQ)RRgiVG@3Mn7SN^z8m6jU}p73ZL>RasO95PCg9_#l?`Xwicm
z88B*T9Y2cVu63SD>z|)>r7n=PT;-JA%*y&+IE%%W(9?%uw(7L=Enlpr0Q#x-$lkU|
zvY@7*%k(q+4f|}T^RK4du7l;D4^AERW4}BVKq&f6J`CDW2DTfWT*DuSX=zbZ1mq5V
z$DI233Ezq=6ZKj?aG?gu*%{CHz3X-D+?<HJj|$n(&djyDM><|SR0dnVqfn*B^aRKr
zHi<R(GKlfYD3^I+u7*KZJ=utyBHurO7PrgG+G6aj*=ks;Cg`A|1*IS&i5A+4R{|z4
zOldkRZ&@>NHzcv@A-|B}811<%kk-w&&&s<i#hg<2Jm$zlI+6#^+*6w(z#qZf_VA)n
zr<GpN!;>Y+TO~G&Mhj^`W$eZV#C__OhGn^pgUfgm3=#QAn)LGB$I#VVYN&95-f?fu
zV=fxtk}o(-&xaZJZJcLcfNttox$WRMDy_GDloYo>MdC&v3prTxCAIR9ITNg`R^@}g
zCAUN4PG+M^k(!&9{xEVCNFQ`xpbkORuOkI>J05c4JHv`|UUSp>*j$a}iQQT8f&!+c
zV#^u(Wdv1xT$8<2y|Q^TOcOMpjthpy&ltzJWVWG3&n}rPEjS3XvFaLjS<<k#+%3%T
zSasN~auvJ0_r$`$XP{scAj%xbR%I8z2d_4ax}Gs;5^TU0Gy*{_FW*6E?p;r(sMT+T
zsaLI-l}S`vdxz07?8W#~g*7COY4EuCBZ@lJTRH=`@>LCU?lK!L*OUoCx32VZs8*W(
zd=0!52nw(V5ap$PF&{-}ms=_)c3XPqazc=XsW?vDc#6k41BX|29bLLasOmpP9}@SV
z%n8X69%mMGChaxv;W@%_=*AzcSiYl!?}G!!Kk_!nrkhJrCGjcKr(8l`kG#99iEYJk
zO8Zv0V^CYfEdJmL{Hi6&ri<oY<#FLXL$TfBfED?J36Ua~4TO@i1)kSVE`mH*6Fh{q
zLk%``DBNS6URY=(u|M*0T20WQ&!a}1c@#dlr$ZE!fbnkO4M-U#RQN>Dcz60vQ$xmb
zIwPcAPT4@pmyvNl5-3hZv)@R+t}pp~-sBH#Lhg=dg7E&rb(@{{-u)ql4ddX{Qn>XB
z@#dTj<4zeVuF3MpX(15ZdUgZ<XriRgE#B>My*h;YVbFCA>$S$OvIj%UVcgkZWIrS=
zNynwJ`8X)qs#p^qk`*yv?fv@}Dr*Z0&!Nj5fXzAAcdshj?-E^i_MAe1J&$0B7v%?j
zJG=H|WH)zTagkKZT;SpKEw(;A-xGUFB@|KWuRdakV7yhEa&tt5jjBpGJzR$3R2_G?
zMkopTyPc_i23IE9q2Uxi)`*?TeOHQvAxt1Rq<;_d8@YSw!N)$v@xBkRS<imgp&LBr
zH(Q9P(HNd>$}-u-yU|rtI7i`)+h(QjMDnaNLacwJiW~m;D!0YtG|uEnX1?(e=HuF0
z1`MoA^<1-Qn`O7VK|)nz-hs$~c1u0(-0-wC4%CnRf_H|nGb1H(HR0aDPl1-uE^9dH
z!+YT(t2Wh=&Ow6yNj@GHGthL(pK;7SpKRoxZzYV;I_?`9f&Cf61~U1&Z+8$1zNE)k
zUmeeH`R3QOrj1AM4E~fqx);PLC9FW-`I*P?B0G7LNg+?kv)kI^r=1><%K2F(3yCU7
zdt9u>8LidRhlEcU-n=0!!$_+dKV%SC<6HQsmQn<czYz5>A7$-?tz&H4Domv0>YwgD
z8Z4&0gI!dh<Qq3Xl4J%wjf$4u`T`1*N*I0gkq|D~bBGc(hvV#6Xw6-`Jytq-a5&@+
z+dg7`XhO6{H)n8^cMiobnAcUTzO|9{Qz|Jw=WE5oq7m^rHA>s@ntL?>v(QajA5#$5
z!+$7v?wfMkYwB^U{8H68=Q|#qGTI+}W{c=*B+2CyZH#JZUa*S%?k;NNSHF<9(XjD@
zoVlCb;7nkbV7$0K>TB_~ZP_N>F=QmR2$vc?W=o<&QQ9x1>$mMh%pad+(^cn^O7P(-
z>1OhIc><}T81<`q%!fXB$hhID5zd-})ljI1pJpNq#V9E-B9^#ISi$z>!FNEO0Gbhs
z$bp1_IE~P_Gg<M6_U-g<i<#SkDf&P*eI@&WPz;-?k!B%AWb=qHB{lrPg*h{fhZ~w~
zWIM{UoSpAdv%FOhKuQH$n~r@gP2I$OqfI-G+gtp#Qf2L7fqYB0$DIB3A7T8^HM`ko
z#EZkHNei1qDjPrHJeKE;QgWFQ3?44BNTe?zT)yl8A;M#>Hafg<O^^0$I74(7J3veI
z(;il04Oq=bAAac~<g;-DMYTzI&z^T6)@4skpCk<S!1@<XFpbQs@r>{hN@W;vA|F32
zx6t4e{<QLj9IQZ*?v?79`$_!0??A`^R8HKast0=V{oZWYBr^FHU*97+%NV$@c6Sgz
zn!HbU!E?n&9rF`PVtiYFXIS=`&l)<qRV3;W660+etP#ti?}d5i%@M}+Qt8s<c;pC~
zZ~Qru+yd~5TzGbtjGS+50th%ZoVt*ph^sVGUqXVNH4GnGpS{zd&@Io=bxMs7Db(&U
zfvGo|;r*pyTyYKSP4~7cH|wLgI^&1MxIONj**%!jWjucL##d1{^{($Vk5>9o>f6db
ziKbBrO-{b2FM2phy)2$LfyDS;B;|bnoDylblJ~2LMJO=5_nF4dcdzRLK}wO`F?EM9
z?JYY$DGbT$cAmf~VD3&8dfxudVI^hVY%gdrHEl$~`b>zg;B|~He*mIMZGb>rLKD-_
zh|ucHa5_&hTy@&s(C2A)2H&Ryx1#PUC8p#@2cg8<4;urivShJjr0H94bdM~DiXI@$
zXtz~=$2cw$bN9XnEOoV71FI%J=&t(qk@X}h39{uyQ*ZwBxk8Vyzf@nm4{<Z>@J$UW
z+}lM=BWBbJy+k2AP7by)_MKil<yPNg8QoF2uqTBb>ONkoSkzPXZd7qU2$Phs_1jZ!
zUqgkx00_1!>{Sh#qSf0#_}LUz{T2LR!YON-F^-fm+YYhfRkWQ<bPQe+gO;~m5@%le
z)Fe~~7abABCV*;f&o-4x>OGv%H`F^Ir^()vlF_ReSA8HH&UDuPTpt?5rg=qZfmG8M
zolXk;5yBai1BHP@wRV?b0|zY~)!K!huG5=V24c<%SvtdW+`+HFV#c2rISCoSRf>*g
zK_JUXIvuK&F#f_RX<K+^bB#Q8F)&PWWTKMj{&`cbAt|fr6*9p-@|6BoTJ?MZzwG2$
z>_RYi{ZR}+Zgw8qclVeAA3b|5opPmf_;G9(=yF&4JTJ&{`6KzrJ<|$AzBo|*7(T|Q
zN=hTbS@2dJAyH{YE%e@kj=Aq6*>jE<*5@^4MNU>#`rwklTJQ^VH{l+^k0w*=B4iv^
z!@8&R28^p!_kq}iP+CP_M421jtdn7Ycc531d=JK*qlp73`6*$!YzY*@D_*%hdV0qC
zQt3fW=Z?wj^q7!ii|s6A*_J7T3{!T#Hs&t&+rKcAc|UjdDX-CI-svkVOw_zm$wl4W
zP2~>_m9<?}ky3eQ)aR+K&XP642H59Btth=?in?*g#G#<v+|%X-#m1)fTjt)gmKTz*
zg0DDs3m0T5KF#4xee_Dx4_U_nDF?K;i%#FnWtZbQ>vGsQ9i5c`c2q-7vqZnPi_AD%
zhiM4vW0Ugd=iJ?d+46~05$k+X%q7W=yWT(yUQebXb=zsKMov|6**=^HTPIjr*W<}0
zoUOb9SCTy?qtBW!w~ZLlA&_ohgIM3_eJdnP*Y|;9`Tc#ir)SiB*5j!2=U7q#3;i`n
z#bY-Jt;a%Q<*%*%mu9+i0^`j+bC?AP9R|JiI?fr7Na&c9`eZ7)aW7BV?C{@x9Xv^L
z$1*~Wi}84i@9cn6<VW6<A^25YGpCUfxv(yg&z5`ENr*4e2#={xdH$~z$4E>JnfgPZ
z^Xy3Wv3C7|qiu;v|1ld%;o<14D;WnzhLZ;VZbJ0MV516*BxzpY{7+jXyS*xahfMv;
zBvO)6u}?2u2ax&^)9Ysp`?H_U_?(TyX9Y*T!`Ny-astng`>fY9y|lj6!do&X=b~0N
zJtuvl2(dqK)1`Rx!e#=0@1&attI6rOauT5vw5ygcrj)2p>s+On(T|a0*7OFgEC>0H
z2<k7QDIn|5q6roP=dVYo5T_!)@Bdp0X{bX(K;``-rS!jP6WM=GL;X{l=-;IMw_^Gu
z6({gtrvAMQ!~Roh)IUi5tGN0j{CD^C55xcB!SsG>z~1uP9PMvs!oO`~{}T=Y(Galu
z&%+t*E!<4ZP25ZvJXrq#8UC~0{I76Z!IJX+9mMwA_UTU`bI5-W`q$<BrB`}?cRvaL
z)T@JkPWg-E`~MX3J0ha+(Z~?@_gF{>+P^8JFhJ<tzd`&lx-z;t+gZC={A=D{O49zj
zlF0v55+uRD;r-QH{z20E&q&mNA{qTZNh};Z|AzLLKK@R_WKn+>sDXgU9sAwD{_O+N
z^&ilDxJ<bLY!>Vs3>G|G%na<z004ujIVU#*3#X|$8y6277Y7gEe|+q}@5BGK&wqO1
v#{Qo(`@=>5`#13an&`jn1Nc9n{byeKpUn*V!|!Co-&R6s2#Blw-_QOF)ISkw
new file mode 100644
--- /dev/null
+++ b/dom/cache/test/xpcshell/test_schema_26_upgrade.js
@@ -0,0 +1,21 @@
+/**
+ * The schema_25_profile.zip are made from local Nightly by following step
+ * 1. Go to any website
+ * 2. Open web console and type
+ *      caches.open("test")
+ *        .then(c => fetch("https://www.mozilla.org", {mode:"no-cors"})
+ *        .then(r => c.put("https://www.mozilla.org", r)));
+ * 3. Go to profile directory and rename the website folder to "chrome"
+ */
+
+async function run_test() {
+  do_test_pending();
+  create_test_profile('schema_25_profile.zip');
+
+  let cache = await caches.open("test");
+  let response = await cache.match("https://www.mozilla.org");
+  ok(!!response, "Upgrade from 25 to 26 do succeed");
+  ok(response.type === 'opaque', "The response type does be opaque");
+
+  do_test_finished();
+}
--- a/dom/cache/test/xpcshell/xpcshell.ini
+++ b/dom/cache/test/xpcshell/xpcshell.ini
@@ -1,14 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 [DEFAULT]
 head = head.js
 support-files =
   schema_15_profile.zip
+  schema_25_profile.zip
 
 # dummy test entry to generate profile zip files
 [make_profile.js]
   skip-if = true
 
 [test_migration.js]
+[test_schema_26_upgrade.js]
--- a/dom/canvas/test/webgl-mochitest/mochitest.ini
+++ b/dom/canvas/test/webgl-mochitest/mochitest.ini
@@ -94,15 +94,14 @@ skip-if = toolkit == 'android' #bug 8654
 [test_webgl2_not_exposed.html]
 skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
 [test_webgl2_invalidate_framebuffer.html]
 skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
 [test_webgl2_alpha_luminance.html]
 skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
 [test_fuzzing_bugs.html]
 [test_video_fastpath_mp4.html]
-fail-if = (os == 'win' && os_version == '6.1' && !e10s)
 [test_video_fastpath_theora.html]
 [test_video_fastpath_vp8.html]
 [test_video_fastpath_vp9.html]
 [test_webglcontextcreationerror.html]
 [test_webgl_fingerprinting_resistance.html]
 fail-if = (os == 'mac') || (os == 'win') # on try server, LOCAL_GL_MAX_CUBE_MAP_TEXTURE_SIZE = 512 on mac and LOCAL_GL_ALIASED_LINE_WIDTH_RANGE = [1, 1] on win
--- a/dom/commandhandler/nsCommandManager.cpp
+++ b/dom/commandhandler/nsCommandManager.cpp
@@ -251,10 +251,11 @@ nsCommandManager::GetControllerForComman
   }
 
   auto* window = nsPIDOMWindowOuter::From(mWindow);
   NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
   nsCOMPtr<nsPIWindowRoot> root = window->GetTopWindowRoot();
   NS_ENSURE_TRUE(root, NS_ERROR_FAILURE);
 
   // no target window; send command to focus controller
-  return root->GetControllerForCommand(aCommand, aResult);
+  return root->GetControllerForCommand(aCommand, false /* for any window */,
+                                       aResult);
 }
--- a/dom/events/ContentEventHandler.cpp
+++ b/dom/events/ContentEventHandler.cpp
@@ -510,18 +510,20 @@ nsIContent*
 ContentEventHandler::GetFocusedContent()
 {
   nsIDocument* doc = mPresShell->GetDocument();
   if (!doc) {
     return nullptr;
   }
   nsCOMPtr<nsPIDOMWindowOuter> window = doc->GetWindow();
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
-  return nsFocusManager::GetFocusedDescendant(window, true,
-                                              getter_AddRefs(focusedWindow));
+  return nsFocusManager::GetFocusedDescendant(
+                           window,
+                           nsFocusManager::eIncludeAllDescendants,
+                           getter_AddRefs(focusedWindow));
 }
 
 bool
 ContentEventHandler::IsPlugin(nsIContent* aContent)
 {
   return aContent &&
          aContent->GetDesiredIMEState().mEnabled == IMEState::PLUGIN;
 }
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -5180,18 +5180,20 @@ nsIContent*
 EventStateManager::GetFocusedContent()
 {
   nsIFocusManager* fm = nsFocusManager::GetFocusManager();
   EnsureDocument(mPresContext);
   if (!fm || !mDocument)
     return nullptr;
 
   nsCOMPtr<nsPIDOMWindowOuter> focusedWindow;
-  return nsFocusManager::GetFocusedDescendant(mDocument->GetWindow(), false,
-                                              getter_AddRefs(focusedWindow));
+  return nsFocusManager::GetFocusedDescendant(
+                           mDocument->GetWindow(),
+                           nsFocusManager::eOnlyCurrentWindow,
+                           getter_AddRefs(focusedWindow));
 }
 
 //-------------------------------------------------------
 // Return true if the docshell is visible
 
 bool
 EventStateManager::IsShellVisible(nsIDocShell* aShell)
 {
@@ -5244,18 +5246,21 @@ EventStateManager::DoContentCommandEvent
       cmd = "cmd_pasteTransferable";
       break;
     case eContentCommandLookUpDictionary:
       cmd = "cmd_lookUpDictionary";
       break;
     default:
       return NS_ERROR_NOT_IMPLEMENTED;
   }
+  // If user tries to do something, user must try to do it in visible window.
+  // So, let's retrieve controller of visible window.
   nsCOMPtr<nsIController> controller;
-  nsresult rv = root->GetControllerForCommand(cmd, getter_AddRefs(controller));
+  nsresult rv = root->GetControllerForCommand(cmd, true,
+                                              getter_AddRefs(controller));
   NS_ENSURE_SUCCESS(rv, rv);
   if (!controller) {
     // When GetControllerForCommand succeeded but there is no controller, the
     // command isn't supported.
     aEvent->mIsEnabled = false;
   } else {
     bool canDoIt;
     rv = controller->IsCommandEnabled(cmd, &canDoIt);
--- a/dom/events/test/mochitest.ini
+++ b/dom/events/test/mochitest.ini
@@ -177,9 +177,12 @@ skip-if = toolkit == 'android' #CRASH_DU
 [test_paste_image.html]
 [test_wheel_default_action.html]
 [test_bug687787.html]
 [test_bug1305458.html]
 [test_bug1298970.html]
 [test_bug1304044.html]
 [test_bug1332699.html]
 [test_bug1339758.html]
+[test_bug1369072.html]
+support-files = window_bug1369072.html
+skip-if = toolkit == 'android'
 [test_dnd_with_modifiers.html]
new file mode 100644
--- /dev/null
+++ b/dom/events/test/test_bug1369072.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1369072
+-->
+<head>
+  <title>Test for Bug 1369072</title>
+  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1369072">Mozilla Bug 1369072</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Bug 1369072 **/
+
+SimpleTest.waitForExplicitFinish();
+
+var subWin = window.open("window_bug1369072.html", "_blank",
+                         "width=500,height=500");
+
+function finish()
+{
+  subWin.close();
+  SimpleTest.finish();
+}
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/events/test/window_bug1369072.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1369072
+-->
+<head>
+  <title>Test for Bug 1369072</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1369072">Mozilla Bug 1369072</a>
+<div id="display">
+<iframe id="iframe" srcdoc="<a id='anchor' href='about:home'>anchor text</a><div id='div'></div>" style="width: 300px; height: 300px;"></iframe>
+<!-- make <body> contents overflow -->
+<div style="width: 1000px; height: 1000px;"></div>
+</div>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(runTests, window);
+
+function ok()
+{
+  window.opener.ok.apply(window.opener, arguments);
+}
+
+function is()
+{
+  window.opener.is.apply(window.opener, arguments);
+}
+
+async function runTests()
+{
+  var iframe = document.getElementById("iframe");
+  var anchor = iframe.contentDocument.getElementById("anchor");
+  var div = iframe.contentDocument.getElementById("div");
+
+  function resetScroll()
+  {
+    return new Promise(resolve => {
+      var scrollParent = document.documentElement.scrollTop || document.documentElement.scrollLeft;
+      var scrollChild = iframe.contentDocument.documentElement.scrollTop || iframe.contentDocument.documentElement.scrollLeft;
+      if (scrollParent) {
+        window.addEventListener("scroll", () => {
+          scrollParent = false;
+          if (!scrollChild) {
+            SimpleTest.executeSoon(resolve);
+          }
+        }, { once: true });
+      }
+      if (scrollChild) {
+        iframe.contentWindow.addEventListener("scroll", () => {
+          scrollChild = false;
+          if (!scrollParent) {
+            SimpleTest.executeSoon(resolve);
+          }
+        }, { once: true });
+      }
+      document.documentElement.scrollTop = 0;
+      document.documentElement.scrollLeft = 0;
+      iframe.contentDocument.documentElement.scrollTop = 0;
+      iframe.contentDocument.documentElement.scrollLeft = 0;
+      if (!scrollParent && !scrollChild) {
+        SimpleTest.executeSoon(resolve);
+      }
+    });
+  }
+
+  async function tryToScrollWithKey(aVertical)
+  {
+    await resetScroll();
+
+    return new Promise(resolve => {
+      // Wait scroll event
+      function onScroll() {
+        SimpleTest.executeSoon(resolve);
+      }
+      window.addEventListener("scroll", onScroll, { once: true });
+      iframe.contentWindow.addEventListener("scroll", onScroll, { once: true });
+
+      if (aVertical) {
+        synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
+      } else {
+        synthesizeKey("KEY_ArrowRight", { code: "ArrowRight" });
+      }