merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Wed, 11 Oct 2017 11:41:04 +0200
changeset 385502 20d9ad08dd36fe5230ad0ccf6cb3e4865d7851cf
parent 385430 a72bd6160609be2fa471be5f87955bdd47fafe22 (current diff)
parent 385501 95824b886c451ae21fa14c3add27c5479bc7381b (diff)
child 385503 2c17b581bc180e9200840031527f92d0ea21c464
child 385539 42e13f7fafc6cdd397daee31bb62bc283092abb0
child 385646 c742fe352867fd5c5d801003880ac8f5a8b8f9f0
push id32656
push userarchaeopteryx@coole-files.de
push dateWed, 11 Oct 2017 09:50:40 +0000
treeherdermozilla-central@20d9ad08dd36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
20d9ad08dd36 / 58.0a1 / 20171011100133 / files
nightly linux64
20d9ad08dd36 / 58.0a1 / 20171011100133 / files
nightly mac
20d9ad08dd36 / 58.0a1 / 20171011100133 / files
nightly win32
20d9ad08dd36 / 58.0a1 / 20171011100133 / files
nightly win64
20d9ad08dd36 / 58.0a1 / 20171011100133 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central. r=merge a=merge MozReview-Commit-ID: AgDEPuT8DNK
gfx/angle/README.mozilla
gfx/angle/src/common/BitSetIterator.h
gfx/angle/src/common/BitSetIterator_unittest.cpp
gfx/angle/src/common/third_party/numerics/README.angle
gfx/angle/src/common/third_party/numerics/base/logging.h
gfx/angle/src/common/third_party/numerics/base/numerics/OWNERS
gfx/angle/src/common/third_party/numerics/base/numerics/safe_conversions.h
gfx/angle/src/common/third_party/numerics/base/numerics/safe_conversions_impl.h
gfx/angle/src/common/third_party/numerics/base/numerics/safe_math.h
gfx/angle/src/common/third_party/numerics/base/numerics/safe_math_impl.h
gfx/angle/src/common/third_party/numerics/base/numerics/safe_numerics_unittest.cc
gfx/angle/src/compiler/translator/InitializeParseContext.cpp
gfx/angle/src/compiler/translator/InitializeParseContext.h
gfx/angle/src/compiler/translator/Intermediate.cpp
gfx/angle/src/compiler/translator/Intermediate.h
gfx/angle/src/compiler/translator/VariableInfo.cpp
gfx/angle/src/compiler/translator/VariableInfo.h
gfx/angle/src/compiler/translator/intermOut.cpp
gfx/angle/src/libANGLE/renderer/FenceSyncImpl.h
gfx/angle/src/libANGLE/renderer/d3d/VaryingPacking_unittest.cpp
gfx/angle/src/libANGLE/renderer/d3d/WorkaroundsD3D.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11vs.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11vs.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11vs.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgbapremultiply2d11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgbaunmultiply2d11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgbpremultiply2d11ps.h
gfx/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgbunmultiply2d11ps.h
gfx/angle/src/libANGLE/renderer/d3d/hlsl/VaryingPacking.cpp
gfx/angle/src/libANGLE/renderer/d3d/hlsl/VaryingPacking.h
gfx/angle/src/libANGLE/renderer/d3d/hlsl/hlsl_utils.h
gfx/angle/src/libANGLE/renderer/gl/FenceSyncGL.cpp
gfx/angle/src/libANGLE/renderer/gl/FenceSyncGL.h
gfx/angle/src/libANGLE/renderer/null/FenceSyncNULL.cpp
gfx/angle/src/libANGLE/renderer/null/FenceSyncNULL.h
gfx/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.cpp
gfx/angle/src/libANGLE/renderer/vulkan/FenceSyncVk.h
gfx/angle/src/libANGLE/signal_utils.cpp
gfx/angle/src/libGLESv2/entry_points_gles_2_0.cpp
gfx/angle/src/libGLESv2/entry_points_gles_2_0.h
gfx/angle/src/libGLESv2/entry_points_gles_3_0.cpp
gfx/angle/src/libGLESv2/entry_points_gles_3_0.h
gfx/angle/src/tests/WebGL-CTS-known-failures.txt
gfx/angle/src/tests/compiler_tests/MalformedShader_test.cpp
gfx/angle/src/third_party/murmurhash/LICENSE
gfx/angle/src/third_party/murmurhash/MurmurHash3.cpp
gfx/angle/src/third_party/murmurhash/MurmurHash3.h
testing/talos/talos.json
testing/web-platform/meta/webdriver/elements/active.py.ini
testing/web-platform/tests/webdriver/elements/active.py
toolkit/components/passwordmgr/nsLoginManagerPrompter.js
--- a/accessible/jsat/EventManager.jsm
+++ b/accessible/jsat/EventManager.jsm
@@ -689,18 +689,17 @@ const AccessibilityEventObserver = {
         Logger.eventToString(event), "accessible:",
         Logger.accessibleToString(event.accessible));
       return;
     }
     let content = event.accessibleDocument.window;
     // Match the content window to its EventManager.
     let eventManager = this.getListener(content);
     if (!eventManager || !eventManager._started) {
-      if (Utils.MozBuildApp === "browser" &&
-          !(content instanceof Ci.nsIDOMChromeWindow)) {
+      if (Utils.MozBuildApp === "browser" && !content.isChromeWindow) {
         Logger.warning(
           "AccessibilityEventObserver.observe: ignored event:",
           Logger.eventToString(event), "accessible:",
           Logger.accessibleToString(event.accessible), "document:",
           Logger.accessibleToString(event.accessibleDocument));
       }
       return;
     }
--- a/accessible/jsat/PointerAdapter.jsm
+++ b/accessible/jsat/PointerAdapter.jsm
@@ -86,18 +86,17 @@ var PointerRelay = { // jshint ignore:li
     delete this.onPointerEvent;
     for (let eventType in this._eventsOfInterest) {
       Utils.win.removeEventListener(eventType, this, true, true);
     }
   },
 
   handleEvent: function PointerRelay_handleEvent(aEvent) {
     // Don't bother with chrome mouse events.
-    if (Utils.MozBuildApp === "browser" &&
-      aEvent.view.top instanceof Ci.nsIDOMChromeWindow) {
+    if (Utils.MozBuildApp === "browser" && aEvent.view.top.isChromeWindow) {
       return;
     }
     if (aEvent.mozInputSource === Ci.nsIDOMMouseEvent.MOZ_SOURCE_UNKNOWN ||
         aEvent.isSynthesized) {
       // Ignore events that are scripted or clicks from the a11y API.
       return;
     }
 
--- a/accessible/tests/browser/.eslintrc.js
+++ b/accessible/tests/browser/.eslintrc.js
@@ -1,14 +1,17 @@
 "use strict";
 
 module.exports = {
   "extends": [
     "plugin:mozilla/browser-test"
   ],
+  "globals": {
+    "gBrowser": false
+  },
   "rules": {
     "mozilla/no-aArgs": "error",
     "mozilla/no-cpows-in-tests": "error",
     "mozilla/reject-importGlobalProperties": "error",
     "mozilla/var-only-at-top-level": "error",
 
     "block-scoped-var": "error",
     "camelcase": "error",
--- a/accessible/tests/browser/e10s/browser_caching_name.js
+++ b/accessible/tests/browser/e10s/browser_caching_name.js
@@ -307,100 +307,99 @@ const markupTests = [{
     <a id="a-img"
        aria-label="test1"
        aria-labelledby="l1 l2"
        title="test4"><img alt="test5"/></a>`,
   expected: ["test2 test3", "test1", "test5", "test4"]
 }];
 
 /**
- * Wait for an accessible event to happen and, in case given accessible is
- * defunct, update it to one that is attached to the accessible event.
- * @param {Promise} onEvent      accessible event promise
- * @param {Object}  target       { acc, parent, id } structure that contains an
- *                                accessible, its parent and its content element
- *                                id.
- */
-async function updateAccessibleIfNeeded(onEvent, target) {
-  let event = await onEvent;
-  if (isDefunct(target.acc)) {
-    target.acc = findAccessibleChildByID(event.accessible, target.id);
-  }
-}
-
-/**
  * Test accessible name that is calculated from an attribute, remove the
  * attribute before proceeding to the next name test. If attribute removal
  * results in a reorder or text inserted event - wait for it. If accessible
  * becomes defunct, update its reference using the one that is attached to one
  * of the above events.
  * @param {Object} browser      current "tabbrowser" element
  * @param {Object} target       { acc, parent, id } structure that contains an
  *                               accessible, its parent and its content element
  *                               id.
  * @param {Object} rule         current attr rule for name calculation
  * @param {[type]} expected     expected name value
  */
 async function testAttrRule(browser, target, rule, expected) {
-  testName(target.acc, expected);
-  let onEvent;
-  if (rule.recreated) {
-    onEvent = waitForEvent(EVENT_REORDER, target.parent);
-  } else if (rule.textchanged) {
-    onEvent = waitForEvent(EVENT_TEXT_INSERTED, target.id);
-  }
-  await invokeSetAttribute(browser, target.id, rule.attr);
-  if (onEvent) {
-    await updateAccessibleIfNeeded(onEvent, target);
+  let {id, parent, acc} = target;
+  let {recreated, textchanged, attr} = rule;
+
+  testName(acc, expected);
+
+  if (recreated || textchanged) {
+    let [event] = await contentSpawnMutation(browser, {
+      expected: [recreated ? [EVENT_REORDER, parent] : [EVENT_TEXT_INSERTED, id]]
+    }, ([contentId, contentAttr]) =>
+      document.getElementById(contentId).removeAttribute(contentAttr), [id, attr]);
+
+    // Update accessible just in case it is now defunct.
+    target.acc = findAccessibleChildByID(event.accessible, id);
+  } else {
+    await invokeSetAttribute(browser, id, attr);
   }
 }
 
 /**
  * Test accessible name that is calculated from an element name, remove the
  * element before proceeding to the next name test. If element removal results
  * in a reorder event - wait for it. If accessible becomes defunct, update its
  * reference using the one that is attached to a possible reorder event.
  * @param {Object} browser      current "tabbrowser" element
  * @param {Object} target       { acc, parent, id } structure that contains an
  *                               accessible, its parent and its content element
  *                               id.
  * @param {Object} rule         current elm rule for name calculation
  * @param {[type]} expected     expected name value
  */
 async function testElmRule(browser, target, rule, expected) {
-  testName(target.acc, expected);
-  let onEvent = waitForEvent(EVENT_REORDER, rule.isSibling ?
-    target.parent : target.id);
-  await ContentTask.spawn(browser, rule.elm, elm =>
-    content.document.querySelector(`${elm}`).remove());
-  await updateAccessibleIfNeeded(onEvent, target);
+  let {id, parent, acc} = target;
+  let {isSibling, elm} = rule;
+
+  testName(acc, expected);
+  let [event] = await contentSpawnMutation(browser, {
+    expected: [[EVENT_REORDER, isSibling ? parent : id]]
+  }, contentElm => document.querySelector(`${contentElm}`).remove(), elm);
+
+  // Update accessible just in case it is now defunct.
+  target.acc = findAccessibleChildByID(event.accessible, id);
 }
 
 /**
  * Test accessible name that is calculated from its subtree, remove the subtree
  * and wait for a reorder event before proceeding to the next name test. If
  * accessible becomes defunct, update its reference using the one that is
  * attached to a reorder event.
  * @param {Object} browser      current "tabbrowser" element
  * @param {Object} target       { acc, parent, id } structure that contains an
  *                               accessible, its parent and its content element
  *                               id.
  * @param {Object} rule         current subtree rule for name calculation
  * @param {[type]} expected     expected name value
  */
 async function testSubtreeRule(browser, target, rule, expected) {
-  testName(target.acc, expected);
-  let onEvent = waitForEvent(EVENT_REORDER, target.id);
-  await ContentTask.spawn(browser, target.id, id => {
-    let elm = content.document.getElementById(id);
+  let {id, acc} = target;
+
+  testName(acc, expected);
+  let [event] = await contentSpawnMutation(browser, {
+    expected: [[EVENT_REORDER, id]]
+  }, contentId => {
+    let elm = document.getElementById(contentId);
     while (elm.firstChild) {
       elm.firstChild.remove();
     }
-  });
-  await updateAccessibleIfNeeded(onEvent, target);
+  }, id);
+
+  // Update accessible just in case it is now defunct.
+  target.acc = findAccessibleChildByID(event.accessible, id);
 }
 
 /**
  * Iterate over a list of rules and test accessible names for each one of the
  * rules.
  * @param {Object} browser      current "tabbrowser" element
  * @param {Object} target       { acc, parent, id } structure that contains an
  *                               accessible, its parent and its content element
--- a/accessible/tests/browser/events.js
+++ b/accessible/tests/browser/events.js
@@ -8,17 +8,17 @@
 // globals from there.
 /* import-globals-from shared-head.js */
 /* import-globals-from ../mochitest/common.js */
 
 /* exported EVENT_REORDER, EVENT_SHOW, EVENT_TEXT_INSERTED, EVENT_TEXT_REMOVED,
             EVENT_DOCUMENT_LOAD_COMPLETE, EVENT_HIDE, EVENT_TEXT_CARET_MOVED,
             EVENT_DESCRIPTION_CHANGE, EVENT_NAME_CHANGE, EVENT_STATE_CHANGE,
             EVENT_VALUE_CHANGE, EVENT_TEXT_VALUE_CHANGE, EVENT_FOCUS,
-            EVENT_DOCUMENT_RELOAD, UnexpectedEvents,
+            EVENT_DOCUMENT_RELOAD, UnexpectedEvents, contentSpawnMutation,
             waitForEvent, waitForEvents, waitForOrderedEvents */
 
 const EVENT_DOCUMENT_LOAD_COMPLETE = nsIAccessibleEvent.EVENT_DOCUMENT_LOAD_COMPLETE;
 const EVENT_HIDE = nsIAccessibleEvent.EVENT_HIDE;
 const EVENT_REORDER = nsIAccessibleEvent.EVENT_REORDER;
 const EVENT_SHOW = nsIAccessibleEvent.EVENT_SHOW;
 const EVENT_STATE_CHANGE = nsIAccessibleEvent.EVENT_STATE_CHANGE;
 const EVENT_TEXT_CARET_MOVED = nsIAccessibleEvent.EVENT_TEXT_CARET_MOVED;
@@ -178,8 +178,49 @@ function waitForEvents(events, ordered =
     unexpectedListener.stop();
     return results;
   });
 }
 
 function waitForOrderedEvents(events) {
   return waitForEvents(events, true);
 }
+
+/*
+ * This function spawns a content task and awaits expected mutation events from
+ * various content changes. It's good at catching events we did *not* expect. We
+ * do this advancing the layout refresh to flush the relocations/insertions
+ * queue.
+ */
+async function contentSpawnMutation(browser, waitFor, func, args = null) {
+  let onReorders = waitForEvents({ expected: waitFor.expected || [] });
+  let unexpectedListener = new UnexpectedEvents(waitFor.unexpected || []);
+
+  function tick() {
+    // 100ms is an arbitrary positive number to advance the clock.
+    // We don't need to advance the clock for a11y mutations, but other
+    // tick listeners may depend on an advancing clock with each refresh.
+    content.QueryInterface(Ci.nsIInterfaceRequestor)
+      .getInterface(Ci.nsIDOMWindowUtils).advanceTimeAndRefresh(100);
+  }
+
+  // This stops the refreh driver from doing its regular ticks, and leaves
+  // us in control.
+  await ContentTask.spawn(browser, null, tick);
+
+  // Perform the tree mutation.
+  await ContentTask.spawn(browser, args, func);
+
+  // Do one tick to flush our queue (insertions, relocations, etc.)
+  await ContentTask.spawn(browser, null, tick);
+
+  let events = await onReorders;
+
+  unexpectedListener.stop();
+
+  // Go back to normal refresh driver ticks.
+  await ContentTask.spawn(browser, null, function() {
+    content.QueryInterface(Ci.nsIInterfaceRequestor)
+      .getInterface(Ci.nsIDOMWindowUtils).restoreNormalRefresh();
+  });
+
+  return events;
+}
--- a/accessible/tests/browser/tree/head.js
+++ b/accessible/tests/browser/tree/head.js
@@ -1,15 +1,15 @@
 /* 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";
 
-/* exported contentSpawnMutation, testChildrenIds */
+/* exported testChildrenIds */
 
 // Load the shared-head file first.
 /* import-globals-from ../shared-head.js */
 Services.scriptloader.loadSubScript(
   "chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js",
   this);
 
 // Loading and common.js from accessible/tests/mochitest/ for all tests, as
@@ -20,46 +20,8 @@ loadScripts({ name: "common.js", dir: MO
  * A test function for comparing the IDs of an accessible's children
  * with an expected array of IDs.
  */
 function testChildrenIds(acc, expectedIds) {
   let ids = arrayFromChildren(acc).map(child => getAccessibleDOMNodeID(child));
   Assert.deepEqual(ids, expectedIds,
     `Children for ${getAccessibleDOMNodeID(acc)} are wrong.`);
 }
-
-/*
- * This function spawns a content task and awaits expected mutation events from
- * aria-owns changes. It's good at catching events we did *not* expect. We do
- * this advancing the layout refresh to flush the relocations/insertions queue.
- */
-async function contentSpawnMutation(browser, waitFor, func) {
-  let onReorders = waitForEvents({ expected: waitFor.expected || [] });
-  let unexpectedListener = new UnexpectedEvents(waitFor.unexpected || []);
-
-  function tick() {
-    // 100ms is an arbitrary positive number to advance the clock.
-    // We don't need to advance the clock for a11y mutations, but other
-    // tick listeners may depend on an advancing clock with each refresh.
-    content.QueryInterface(Ci.nsIInterfaceRequestor)
-      .getInterface(Ci.nsIDOMWindowUtils).advanceTimeAndRefresh(100);
-  }
-
-  // This stops the refreh driver from doing its regular ticks, and leaves
-  // us in control.
-  await ContentTask.spawn(browser, null, tick);
-
-  // Perform the tree mutation.
-  await ContentTask.spawn(browser, null, func);
-
-  // Do one tick to flush our queue (insertions, relocations, etc.)
-  await ContentTask.spawn(browser, null, tick);
-
-  await onReorders;
-
-  unexpectedListener.stop();
-
-  // Go back to normal refresh driver ticks.
-  await ContentTask.spawn(browser, null, function() {
-    content.QueryInterface(Ci.nsIInterfaceRequestor)
-      .getInterface(Ci.nsIDOMWindowUtils).restoreNormalRefresh();
-  });
-}
--- a/browser/base/content/browser-pageActions.js
+++ b/browser/base/content/browser-pageActions.js
@@ -846,26 +846,27 @@ BrowserPageActions.sendToDevice = {
     let url = browser.currentURI.spec;
     let title = browser.contentTitle;
 
     let bodyNode = panelViewNode.firstChild;
     let panelNode = panelViewNode.closest("panel");
 
     // This is on top because it also clears the device list between state
     // changes.
-    gSync.populateSendTabToDevicesMenu(bodyNode, url, title, (clientId, name, clientType) => {
+    gSync.populateSendTabToDevicesMenu(bodyNode, url, title, (clientId, name, clientType, lastModified) => {
       if (!name) {
         return document.createElement("toolbarseparator");
       }
       let item = document.createElement("toolbarbutton");
       item.classList.add("pageAction-sendToDevice-device", "subviewbutton");
       if (clientId) {
         item.classList.add("subviewbutton-iconic");
+        item.setAttribute("tooltiptext", gSync.formatLastSyncDate(lastModified));
       }
-      item.setAttribute("tooltiptext", name);
+
       item.addEventListener("command", event => {
         if (panelNode) {
           panelNode.hidePopup();
         }
         // There are items in the subview that don't represent devices: "Sign
         // in", "Learn about Sync", etc.  Device items will be .sendtab-target.
         if (event.target.classList.contains("sendtab-target")) {
           let action = PageActions.actionForID("sendToDevice");
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -292,17 +292,17 @@ var gSync = {
   sendTabToDevice(url, clientId, title) {
     Weave.Service.clientsEngine.sendURIToClientForDisplay(url, clientId, title).catch(e => {
       console.error("Could not send tab to device", e);
     });
   },
 
   populateSendTabToDevicesMenu(devicesPopup, url, title, createDeviceNodeFn) {
     if (!createDeviceNodeFn) {
-      createDeviceNodeFn = (clientId, name, clientType) => {
+      createDeviceNodeFn = (clientId, name, clientType, lastModified) => {
         let eltName = name ? "menuitem" : "menuseparator";
         return document.createElement(eltName);
       };
     }
 
     // remove existing menu items
     for (let i = devicesPopup.childNodes.length - 1; i >= 0; --i) {
       let child = devicesPopup.childNodes[i];
@@ -337,31 +337,31 @@ var gSync = {
     const onTargetDeviceCommand = (event) => {
       let clients = event.target.getAttribute("clientId") ?
         [event.target.getAttribute("clientId")] :
         this.remoteClients.map(client => client.id);
 
       clients.forEach(clientId => this.sendTabToDevice(url, clientId, title));
     }
 
-    function addTargetDevice(clientId, name, clientType) {
-      const targetDevice = createDeviceNodeFn(clientId, name, clientType);
+    function addTargetDevice(clientId, name, clientType, lastModified) {
+      const targetDevice = createDeviceNodeFn(clientId, name, clientType, lastModified);
       targetDevice.addEventListener("command", onTargetDeviceCommand, true);
       targetDevice.classList.add("sync-menuitem", "sendtab-target");
       targetDevice.setAttribute("clientId", clientId);
       targetDevice.setAttribute("clientType", clientType);
       targetDevice.setAttribute("label", name);
       fragment.appendChild(targetDevice);
     }
 
     const clients = this.remoteClients;
     for (let client of clients) {
       const type = client.formfactor && client.formfactor.includes("tablet") ?
                    "tablet" : client.type;
-      addTargetDevice(client.id, client.name, type);
+      addTargetDevice(client.id, client.name, type, client.serverLastModified * 1000);
     }
 
     // "Send to All Devices" menu item
     if (clients.length > 1) {
       const separator = createDeviceNodeFn();
       separator.classList.add("sync-menuitem");
       fragment.appendChild(separator);
       const allDevicesLabel = this.fxaStrings.GetStringFromName("sendToAllDevices.menuitem");
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -7069,17 +7069,17 @@
           var dt = event.dataTransfer;
           if (dt.mozItemCount == 1) {
             var types = dt.mozTypesAt(0);
             // tabs are always added as the first type
             if (types[0] == TAB_DROP_TYPE) {
               let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
               if (sourceNode instanceof XULElement &&
                   sourceNode.localName == "tab" &&
-                  sourceNode.ownerGlobal instanceof ChromeWindow &&
+                  sourceNode.ownerGlobal.isChromeWindow &&
                   sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
                   sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.parentNode) {
                 // Do not allow transfering a private tab to a non-private window
                 // and vice versa.
                 if (PrivateBrowsingUtils.isWindowPrivate(window) !=
                     PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
                   return "none";
 
--- a/browser/base/content/test/alerts/head.js
+++ b/browser/base/content/test/alerts/head.js
@@ -27,21 +27,23 @@ function promiseWindowClosed(window) {
  * These two functions work with file_dom_notifications.html to open the
  * notification and close it.
  *
  * |fn| can be showNotification1 or showNotification2.
  * if |timeout| is passed, then the promise returned from this function is
  * rejected after the requested number of miliseconds.
  */
 function openNotification(aBrowser, fn, timeout) {
+  info(`openNotification: ${fn}`);
   return ContentTask.spawn(aBrowser, [fn, timeout], async function([contentFn, contentTimeout]) {
-    let win = content.wrappedJSObject;
-    let notification = win[contentFn]();
-    win._notification = notification;
     await new Promise((resolve, reject) => {
+      let win = content.wrappedJSObject;
+      let notification = win[contentFn]();
+      win._notification = notification;
+
       function listener() {
         notification.removeEventListener("show", listener);
         resolve();
       }
 
       notification.addEventListener("show", listener);
 
       if (contentTimeout) {
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -2,20 +2,21 @@
 
 /* global sinon, UIState */
 Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js");
 
 registerCleanupFunction(function() {
   delete window.sinon;
 });
 
+const lastModifiedFixture = 1507655615.87; // Approx Oct 10th 2017
 const mockRemoteClients = [
-  { id: "0", name: "foo", type: "mobile" },
-  { id: "1", name: "bar", type: "desktop" },
-  { id: "2", name: "baz", type: "mobile" },
+  { id: "0", name: "foo", type: "mobile", serverLastModified: lastModifiedFixture },
+  { id: "1", name: "bar", type: "desktop", serverLastModified: lastModifiedFixture },
+  { id: "2", name: "baz", type: "mobile", serverLastModified: lastModifiedFixture },
 ];
 
 add_task(async function init() {
   // Disable panel animations.  They cause intermittent timeouts on Linux when
   // the test tries to synthesize clicks on items in newly opened panels.
   BrowserPageActions._disablePanelAnimations = true;
   registerCleanupFunction(() => {
     BrowserPageActions._disablePanelAnimations = false;
@@ -273,16 +274,17 @@ add_task(async function sendToDevice_syn
           },
         ];
         for (let client of mockRemoteClients) {
           expectedItems.push({
             attrs: {
               clientId: client.id,
               label: client.name,
               clientType: client.type,
+              tooltiptext: gSync.formatLastSyncDate(lastModifiedFixture * 1000)
             },
           });
         }
         expectedItems.push(
           null,
           {
             attrs: {
               label: "Send to All Devices"
--- a/browser/base/content/test/webextensions/head.js
+++ b/browser/base/content/test/webextensions/head.js
@@ -310,18 +310,20 @@ async function testInstallMethod(install
     if (filename == PERMS_XPI) {
       // The icon should come from the extension, don't bother with the precise
       // path, just make sure we've got a jar url pointing to the right path
       // inside the jar.
       checkNotification(panel, /^jar:file:\/\/.*\/icon\.png$/, [
         ["webextPerms.hostDescription.wildcard", "wildcard.domain"],
         ["webextPerms.hostDescription.oneSite", "singlehost.domain"],
         ["webextPerms.description.nativeMessaging"],
+        // The below permissions are deliberately in this order as permissions
+        // are sorted alphabetically by the permission string to match AMO.
+        ["webextPerms.description.history"],
         ["webextPerms.description.tabs"],
-        ["webextPerms.description.history"],
       ]);
     } else if (filename == NO_PERMS_XPI) {
       checkNotification(panel, isDefaultIcon, []);
     }
 
     if (cancel) {
       panel.secondaryButton.click();
       try {
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -806,17 +806,17 @@ file, You can obtain one at http://mozil
 
       <method name="maybeCanonizeURL">
         <parameter name="aTriggeringEvent"/>
         <parameter name="aUrl"/>
         <body><![CDATA[
           // Only add the suffix when the URL bar value isn't already "URL-like",
           // and only if we get a keyboard event, to match user expectations.
           if (!/^\s*[^.:\/\s]+(?:\/.*|\s*)$/i.test(aUrl) ||
-              !(aTriggeringEvent instanceof KeyEvent)) {
+              !(aTriggeringEvent instanceof KeyboardEvent)) {
             return;
           }
 
           let url = aUrl;
           let accel = AppConstants.platform == "macosx" ?
                       aTriggeringEvent.metaKey :
                       aTriggeringEvent.ctrlKey;
           let shift = aTriggeringEvent.shiftKey;
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -1635,17 +1635,17 @@ var PlacesControllerDragHelper = {
       dtItems.push({flavor, data});
     }
 
     for (let {flavor, data} of dtItems) {
       let nodes;
       if (flavor != TAB_DROP_TYPE) {
         nodes = PlacesUtils.unwrapNodes(data, flavor);
       } else if (data instanceof XULElement && data.localName == "tab" &&
-               data.ownerGlobal instanceof ChromeWindow) {
+               data.ownerGlobal.isChromeWindow) {
         let uri = data.linkedBrowser.currentURI;
         let spec = uri ? uri.spec : "about:blank";
         nodes = [{ uri: spec,
                    title: data.label,
                    type: PlacesUtils.TYPE_X_MOZ_URL}];
       } else
         throw new Error("bogus data was passed as a tab");
 
--- a/browser/components/sessionstore/test/browser_394759_basic.js
+++ b/browser/components/sessionstore/test/browser_394759_basic.js
@@ -45,17 +45,17 @@ function test() {
            "Non-serialized data is the same as serialized data")
 
         ok(data[0].title == TEST_URL && JSON.stringify(data[0]).indexOf(uniqueText) > -1,
            "The closed window data was stored correctly");
 
         // Reopen the closed window and ensure its integrity.
         let newWin2 = ss.undoCloseWindow(0);
 
-        ok(newWin2 instanceof ChromeWindow,
+        ok(newWin2.isChromeWindow,
            "undoCloseWindow actually returned a window");
         is(ss.getClosedWindowCount(), 0,
            "The reopened window was removed from Recently Closed Windows");
 
         // SSTabRestored will fire more than once, so we need to make sure we count them.
         let restoredTabs = 0;
         let expectedTabs = data[0].tabs.length;
         newWin2.addEventListener("SSTabRestored", function sstabrestoredListener(aEvent) {
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/README.mozilla
@@ -0,0 +1,11 @@
+This is the debugger.html project output.
+See https://github.com/devtools-html/debugger.html
+
+Taken from upstream commit: 6d850d386e2dfef08077602191808fd5c3d8b1ee
+
+Packages:
+- babel-plugin-transform-es2015-modules-commonjs @6.26.0
+- babel-preset-react @6.24.1
+- react @15.6.2
+- react-dom @15.6.2
+- webpack @3.6.0
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -407,43 +407,43 @@ body {
 }
 
 :root.theme-dark .CodeMirror-scrollbar-filler {
   background: transparent;
 }
 .modal-wrapper {
   position: fixed;
   display: flex;
-  justify-content: center;
+  align-items: center;
   width: 100%;
   height: 100%;
   top: 0;
   left: 0;
   transition: z-index 200ms;
   z-index: 100;
 }
 
 .modal {
   top: 0;
-  height: 230px;
+  margin: auto;
   width: 500px;
   background-color: var(--theme-toolbar-background);
   transform: translateY(-250px);
   transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
   box-shadow: 0 0 10px 2px var(--popup-shadow-color);
 }
 
 .modal.entering,
 .modal.exited {
   transform: translateY(-250px);
 }
 
 .modal.entered,
 .modal.exiting {
-  transform: translateY(30px);
+  transform: translateY(0px);
 }
 
 @media (max-width: 520px) {
   .modal {
     width: 80%;
     left: 10%;
   }
 }
@@ -485,17 +485,16 @@ body {
   list-style: none;
   margin: 0px;
   padding: 0px;
   overflow: auto;
   width: calc(100% - 1px); /* 1px fixes the hidden right border */
 }
 
 .shortcuts-modal {
-  height: fit-content;
   width: 45%;
 }
 
 .shortcuts-list li {
   font-size: 12px;
   color: var(--theme-body-color);
   padding-top: 5px;
   display: flex;
@@ -968,17 +967,17 @@ html .arrow.expanded svg {
 .arrow.hidden {
   visibility: hidden;
 }
 
 .webpack svg {
   width: 15px;
   height: 15px;
   margin-right: 5px;
-  vertical-align: bottom;
+  vertical-align: sub;
 }
 
 .theme-dark .webpack {
   opacity: 0.5;
 }
 .managed-tree .tree {
   -webkit-user-select: none;
   -moz-user-select: none;
@@ -1423,16 +1422,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   user-select: none;
 }
 
 .sources-list {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
+  padding-top: 11px;
 }
 
 .sources-list .managed-tree {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
 }
@@ -1457,16 +1457,21 @@ html[dir="rtl"] .managed-tree .tree .nod
   background-color: var(--theme-selection-background);
 }
 
 .sources-list .tree .label {
   padding: 3px 0px 3px 0px;
   display: inline-block;
 }
 
+.sources-list .tree .node .no-arrow {
+  width: 10px;
+  display: inline-block;
+}
+
 .no-sources-message {
   font-size: 12px;
   color: var(--theme-comment-alt);
   font-weight: lighter;
   padding-top: 5px;
   flex-grow: 1;
   display: flex;
   justify-content: center;
@@ -1492,17 +1497,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   flex: 1;
   justify-content: center;
   border-bottom: 1px solid transparent;
   border-left: 1px solid transparent;
   display: inline-flex;
   position: relative;
   transition: all 0.25s ease;
   overflow: hidden;
-  padding: 6.5px;
+  padding: 8px 8px 7px 8px;
   margin-bottom: 0px;
   margin-top: -1px;
   cursor: default;
 }
 
 .source-outline-tabs .tab:first-child {
   border-left: 0;
 }
@@ -1537,24 +1542,38 @@ html[dir="rtl"] .managed-tree .tree .nod
   text-align: center;
   padding: 0.5em;
   user-select: none;
   font-size: 12px;
 }
 
 .outline-list {
   list-style-type: none;
-  padding-left: 0px;
   width: 100%;
+  padding: 10px;
+  margin: 0;
+}
+
+.outline-list__class-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  padding-left: 10px;
+}
+
+.outline-list h2 {
+  font-weight: normal;
+  font-size: 1em;
+  margin: 10px 0;
+  color: var(--theme-body-color);
 }
 
 .outline-list__element {
   color: blue;
   padding-bottom: 0.2rem;
-  padding-left: 1rem;
   padding-right: 0.5rem;
   padding-top: 0.2rem;
   cursor: default;
 }
 
 .outline-list__element:hover {
   background: var(--theme-toolbar-background-hover);
 }
@@ -1572,50 +1591,16 @@ html[dir="rtl"] .managed-tree .tree .nod
 
 .function-signature .paren {
   color: var(--object-color);
 }
 
 .function-signature .comma {
   color: var(--object-color);
 }
-.conditional-breakpoint-panel {
-  cursor: initial;
-  margin: 1em 0;
-  position: relative;
-  display: flex;
-  align-items: center;
-  background: var(--theme-toolbar-background);
-  border-top: 1px solid var(--theme-splitter-color);
-  border-bottom: 1px solid var(--theme-splitter-color);
-}
-
-.conditional-breakpoint-panel .prompt {
-  font-size: 1.8em;
-  color: var(--theme-conditional-breakpoint-color);
-  padding-left: 3px;
-  padding-right: 3px;
-  padding-bottom: 3px;
-  text-align: right;
-  width: 30px;
-}
-
-.conditional-breakpoint-panel input {
-  margin: 5px 10px;
-  width: calc(100% - 4em);
-  border: none;
-  background: var(--theme-toolbar-background);
-  font-size: 14px;
-  color: var(--theme-conditional-breakpoint-color);
-  line-height: 30px;
-}
-
-.conditional-breakpoint-panel input:focus {
-  outline-width: 0;
-}
 .toggle-button-start,
 .toggle-button-end {
   transform: translate(0, 0px);
   transition: transform 0.25s ease-in-out;
   padding: 5px 5px;
 }
 
 .toggle-button-start.vertical,
@@ -2324,16 +2309,50 @@ html[dir="rtl"] .arrow svg,
 }
 
 .theme-dark .call-site-bp::before {
   border-bottom-color: #dd4d4d;
 }
 .empty-line .CodeMirror-linenumber {
   opacity: 0.5;
 }
+.conditional-breakpoint-panel {
+  cursor: initial;
+  margin: 1em 0;
+  position: relative;
+  display: flex;
+  align-items: center;
+  background: var(--theme-toolbar-background);
+  border-top: 1px solid var(--theme-splitter-color);
+  border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.conditional-breakpoint-panel .prompt {
+  font-size: 1.8em;
+  color: var(--theme-conditional-breakpoint-color);
+  padding-left: 3px;
+  padding-right: 3px;
+  padding-bottom: 3px;
+  text-align: right;
+  width: 30px;
+}
+
+.conditional-breakpoint-panel input {
+  margin: 5px 10px;
+  width: calc(100% - 4em);
+  border: none;
+  background: var(--theme-toolbar-background);
+  font-size: 14px;
+  color: var(--theme-conditional-breakpoint-color);
+  line-height: 30px;
+}
+
+.conditional-breakpoint-panel input:focus {
+  outline-width: 0;
+}
 .editor-wrapper {
   --debug-line-border: rgb(145, 188, 219);
   --debug-expression-background: rgba(202, 227, 255, 0.5);
   --editor-searchbar-height: 27px;
   --editor-second-searchbar-height: 27px;
 }
 
 .theme-dark .editor-wrapper {
@@ -2348,21 +2367,16 @@ html[dir="rtl"] .arrow svg,
 .theme-dark {
   --theme-conditional-breakpoint-color: #9fa4a9;
 }
 
 .theme-light {
   --theme-conditional-breakpoint-color: var(--theme-body-color);
 }
 
-.paused .CodeMirror-line,
-.paused .CodeMirror-linenumber {
-  opacity: 0.7;
-}
-
 /**
  * There's a known codemirror flex issue with chrome that this addresses.
  * BUG https://github.com/devtools-html/debugger.html/issues/63
  */
 .editor-wrapper {
   position: absolute;
   height: calc(100% - 31px);
   width: calc(100% - 1.5px);
@@ -2624,16 +2638,17 @@ html .breakpoints-list .breakpoint.pause
 }
 
 .breakpoint-label .location {
   width: 100%;
   display: inline-block;
   overflow-x: hidden;
   text-overflow: ellipsis;
   padding: 1px 0;
+  vertical-align: bottom;
 }
 
 .breakpoints-list .pause-indicator {
   flex: 0 1 content;
   order: 3;
 }
 
 :root.theme-light .breakpoint-snippet,
@@ -3024,17 +3039,16 @@ html .breakpoints-list .breakpoint.pause
 .accordion .header-buttons button::-moz-focus-inner {
   border: none;
 }
 .command-bar {
   flex: 0 0 29px;
   border-bottom: 1px solid var(--theme-splitter-color);
   display: flex;
   overflow: hidden;
-  position: sticky;
   z-index: 1;
   background-color: var(--theme-toolbar-background);
 }
 
 html[dir="rtl"] .command-bar {
   border-right: 1px solid var(--theme-splitter-color);
 }
 
@@ -3139,32 +3153,37 @@ html .command-bar > button:disabled {
 .scopes-pane {
   overflow: auto;
 }
 
 .scopes-list .function-signature {
   display: inline-block;
 }
 .secondary-panes {
+  overflow: scroll;
   display: flex;
   flex-direction: column;
   flex: 1;
   white-space: nowrap;
   --breakpoint-expression-right-clear-space: 36px;
 }
 
 /*
   We apply overflow to the container with the commandbar.
   This allows the commandbar to remain fixed when scrolling
   until the content completely ends. Not just the height of
   the wrapper.
   Ref: https://github.com/devtools-html/debugger.html/issues/3426
 */
-.secondary-panes--sticky-commandbar {
-  overflow-y: scroll;
+
+.secondary-panes-wrapper {
+  height: 100%;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
 }
 
 .secondary-panes .accordion {
   flex: 1 0 auto;
 }
 
 .pane {
   color: var(--theme-body-color);
@@ -3211,31 +3230,63 @@ html .command-bar > button:disabled {
 .welcomebox .toggle-button-end {
   position: absolute;
   top: auto;
   bottom: 0;
   offset-inline-end: 0;
   offset-inline-start: auto;
 }
 
+.welcomebox .small-size-layout {
+  display: none;
+}
+
+.welcomebox .normal-layout {
+  display: inline-block;
+}
+
 .shortcutKeys {
   text-align: right;
   float: left;
   font-family: Courier;
 }
 
+.shortcutKey {
+  display: inline-block;
+  margin-right: 10px;
+  font-family: Courier;
+}
+
 .shortcutFunction {
   text-align: left;
   float: left;
   margin-left: 25px;
 }
 
 html .welcomebox .toggle-button-end.collapsed {
   bottom: 1px;
 }
+
+@media (max-width: 430px) {
+  .welcomebox .small-size-layout {
+    display: inline-block;
+  }
+
+  .welcomebox .normal-layout {
+    display: none;
+  }
+
+  .shortcutFunction {
+    margin-left: 0;
+  }
+
+  .shortcutKey {
+    display: block;
+  }
+}
 .source-header {
   border-bottom: 1px solid var(--theme-splitter-color);
   width: 100%;
   height: 29px;
   display: flex;
   align-items: flex-end;
 }
 
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -1290,17 +1290,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.addSearchQuery = addSearchQuery;
 exports.clearSearchQuery = clearSearchQuery;
 exports.clearSearchResults = clearSearchResults;
 exports.searchSources = searchSources;
 exports.searchSource = searchSource;
 
-var _search = __webpack_require__(1115);
+var _search = __webpack_require__(1210);
 
 var _selectors = __webpack_require__(242);
 
 var _source = __webpack_require__(233);
 
 var _sources = __webpack_require__(254);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
@@ -1536,111 +1536,133 @@ Object.defineProperty(exports, "isNotJav
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.addToTree = addToTree;
 
 var _utils = __webpack_require__(18);
 
+var _treeOrder = __webpack_require__(1239);
+
 var _getURL = __webpack_require__(24);
 
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-function createNodeInTree(part, path, tree) {
+function createNodeInTree(part, path, tree, index) {
   var node = (0, _utils.createNode)(part, path, []);
+
   // we are modifying the tree
-  tree.contents = [].concat(_toConsumableArray(tree.contents), [node]);
+  var contents = tree.contents.slice(0);
+  contents.splice(index, 0, node);
+  tree.contents = contents;
+
   return node;
 }
 
 /*
  * Look for the child directory
  * 1. if it exists return it
  * 2. if it does not exist create it
  * 3. if it is a file, replace it with a directory
  */
-function findOrCreateNode(parts, subTree, path, part, index, url) {
-  var child = subTree.contents.find(c => c.name === part);
+
+
+function findOrCreateNode(parts, subTree, path, part, index, url, debuggeeHost) {
+  var addedPartIsFile = (0, _utils.partIsFile)(index, parts, url);
+
+  var _findNodeInContents = (0, _treeOrder.findNodeInContents)(subTree, (0, _treeOrder.createTreeNodeMatcher)(part, !addedPartIsFile, debuggeeHost)),
+      childFound = _findNodeInContents.found,
+      childIndex = _findNodeInContents.index;
 
   // we create and enter the new node
-  if (!child) {
-    return createNodeInTree(part, path, subTree);
+
+
+  if (!childFound) {
+    return createNodeInTree(part, path, subTree, childIndex);
   }
 
   // we found a path with the same name as the part. We need to determine
   // if this is the correct child, or if we have a naming conflict
-  var addedPartIsFile = (0, _utils.partIsFile)(index, parts, url);
+  var child = subTree.contents[childIndex];
   var childIsFile = !(0, _utils.nodeHasChildren)(child);
 
   // if we have a naming conflict, we'll create a new node
   if (childIsFile && !addedPartIsFile || !childIsFile && addedPartIsFile) {
-    return createNodeInTree(part, path, subTree);
+    return createNodeInTree(part, path, subTree, childIndex);
   }
 
   // if there is no naming conflict, we can traverse into the child
   return child;
 }
 
 /*
  * walk the source tree to the final node for a given url,
  * adding new nodes along the way
  */
-function traverseTree(url, tree) {
+function traverseTree(url, tree, debuggeeHost) {
   url.path = decodeURIComponent(url.path);
 
   var parts = url.path.split("/").filter(p => p !== "");
   parts.unshift(url.group);
 
   var path = "";
   return parts.reduce((subTree, part, index) => {
     path = `${path}/${part}`;
-    return findOrCreateNode(parts, subTree, path, part, index, url);
+    var debuggeeHostIfRoot = index === 0 ? debuggeeHost : null;
+    return findOrCreateNode(parts, subTree, path, part, index, url, debuggeeHostIfRoot);
   }, tree);
 }
 
 /*
  * Add a source file to a directory node in the tree
  */
 function addSourceToNode(node, url, source) {
   var isFile = !(0, _utils.isDirectory)(url);
 
   // if we have a file, and the subtree has no elements, overwrite the
   // subtree contents with the source
   if (isFile) {
     return source;
   }
 
   var name = (0, _getURL.getFilenameFromPath)(url.path);
-  var existingNode = node.contents.find(childNode => childNode.name === name);
+
+  var _findNodeInContents2 = (0, _treeOrder.findNodeInContents)(node, (0, _treeOrder.createTreeNodeMatcher)(name, false, null)),
+      childFound = _findNodeInContents2.found,
+      childIndex = _findNodeInContents2.index;
 
   // if we are readding an existing file in the node, overwrite the existing
   // file and return the node's contents
-  if (existingNode) {
+
+
+  if (childFound) {
+    var existingNode = node.contents[childIndex];
     existingNode.contents = source;
     return node.contents;
   }
 
   // if this is a new file, add the new file;
   var newNode = (0, _utils.createNode)(name, source.get("url"), source);
-  return [].concat(_toConsumableArray(node.contents), [newNode]);
+  var contents = node.contents.slice(0);
+  contents.splice(childIndex, 0, newNode);
+  return contents;
 }
 
 /**
  * @memberof utils/sources-tree
  * @static
  */
 function addToTree(tree, source, debuggeeUrl) {
   var url = (0, _getURL.getURL)(source.get("url"), debuggeeUrl);
+  var debuggeeHost = (0, _treeOrder.getDomain)(debuggeeUrl);
 
   if ((0, _utils.isInvalidUrl)(url, source)) {
     return;
   }
 
-  var finalNode = traverseTree(url, tree);
+  var finalNode = traverseTree(url, tree, debuggeeHost);
   finalNode.contents = addSourceToNode(finalNode, url, source);
 }
 
 /***/ }),
 /* 41 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -5428,22 +5450,20 @@ module.exports = {
   sidePanelItems
 };
 
 /***/ }),
 /* 146 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /**
- *  Copyright (c) 2014-2015, Facebook, Inc.
- *  All rights reserved.
- *
- *  This source code is licensed under the BSD-style license found in the
- *  LICENSE file in the root directory of this source tree. An additional grant
- *  of patent rights can be found in the PATENTS file in the same directory.
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
  */
 
 (function (global, factory) {
    true ? module.exports = factory() :
   typeof define === 'function' && define.amd ? define(factory) :
   (global.Immutable = factory());
 }(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;
 
@@ -11870,17 +11890,17 @@ module.exports = {
 
 
 /* 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/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(851);
+__webpack_require__(1221);
 var dom = React.DOM;
 
 var ImPropTypes = __webpack_require__(150);
 var configMap = __webpack_require__(145).sidePanelItems;
 var Tabs = React.createFactory(__webpack_require__(172));
 var Sidebar = React.createFactory(__webpack_require__(176));
 var Settings = React.createFactory(__webpack_require__(179));
 
@@ -12297,17 +12317,17 @@ function combineReducers(reducers) {
 
 
 /* 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/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(852);
+__webpack_require__(1222);
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 function getTabURL(tab, paramName) {
   var tabID = tab.get("id");
   return `/?${paramName}=${tabID}`;
 }
@@ -12534,17 +12554,17 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBP
 
 /* 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/. */
 
 var React = __webpack_require__(0);
 var createElement = React.createElement;
 
-__webpack_require__(853);
+__webpack_require__(1223);
 var rocketSvg = __webpack_require__(1126);
 var InlineSVG = __webpack_require__(1205);
 
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 var Sidebar = React.createClass({
@@ -13196,17 +13216,17 @@ module.exports = {
 "use strict";
 
 
 /* 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/. */
 
 var classnames = __webpack_require__(175);
-__webpack_require__(856);
+__webpack_require__(1225);
 
 module.exports = function (className) {
   var root = document.createElement("div");
   root.className = classnames(className);
   root.style.setProperty("flex", 1);
   return root;
 };
 
@@ -13443,19 +13463,19 @@ exports.log = log;
  * A middleware that logs all actions coming through the system
  * to the console.
  */
 function log(_ref) {
   var dispatch = _ref.dispatch,
       getState = _ref.getState;
 
   return next => action => {
-    var actionText = JSON.stringify(action, null, 2);
-    var truncatedActionText = `${actionText.slice(0, 1000)}...`;
-    console.log(`[DISPATCH ${action.type}]`, action, truncatedActionText);
+    var status = action.status == "done" ? "<-" : "->";
+    var asyncMsg = !action.status ? "" : status;
+    console.log(action, asyncMsg);
     next(action);
   };
 }
 
 /***/ }),
 /* 192 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -13575,17 +13595,17 @@ exports.promise = promiseMiddleware;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.createPrettySource = createPrettySource;
 
 var _selectors = __webpack_require__(242);
 
-var _prettyPrint = __webpack_require__(903);
+var _prettyPrint = __webpack_require__(1213);
 
 var _pause = __webpack_require__(255);
 
 var _source = __webpack_require__(233);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function createPrettySource(sourceId) {
@@ -13869,17 +13889,16 @@ const prefsSchemaVersion = "1.0.3";
 
 const pref = Services.pref;
 
 if (isDevelopment()) {
   pref("devtools.source-map.client-service.enabled", true);
   pref("devtools.debugger.pause-on-exceptions", false);
   pref("devtools.debugger.ignore-caught-exceptions", false);
   pref("devtools.debugger.call-stack-visible", false);
-  pref("devtools.debugger.scopes-visible", false);
   pref("devtools.debugger.start-panel-collapsed", false);
   pref("devtools.debugger.end-panel-collapsed", false);
   pref("devtools.debugger.tabs", "[]");
   pref("devtools.debugger.ui.framework-grouping-on", true);
   pref("devtools.debugger.pending-selected-location", "{}");
   pref("devtools.debugger.pending-breakpoints", "{}");
   pref("devtools.debugger.expressions", "[]");
   pref("devtools.debugger.file-search-case-sensitive", false);
@@ -13892,17 +13911,16 @@ if (isDevelopment()) {
   pref("devtools.debugger.features.shortcuts", true);
 }
 
 const prefs = new PrefsHelper("devtools", {
   clientSourceMapsEnabled: ["Bool", "source-map.client-service.enabled"],
   pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
   ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
   callStackVisible: ["Bool", "debugger.call-stack-visible"],
-  scopesVisible: ["Bool", "debugger.scopes-visible"],
   startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"],
   endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"],
   frameworkGroupingOn: ["Bool", "debugger.ui.framework-grouping-on"],
   tabs: ["Json", "debugger.tabs", []],
   pendingSelectedLocation: ["Json", "debugger.pending-selected-location", {}],
   pendingBreakpoints: ["Json", "debugger.pending-breakpoints", {}],
   expressions: ["Json", "debugger.expressions", []],
   fileSearchCaseSensitive: ["Bool", "debugger.file-search-case-sensitive"],
@@ -14585,17 +14603,17 @@ exports.default = update;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isThirdParty = exports.isPretty = exports.isJavaScript = undefined;
+exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFileURL = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isThirdParty = exports.isPretty = exports.isJavaScript = undefined;
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _utils = __webpack_require__(234);
 
 var _path = __webpack_require__(235);
 
 var _url = __webpack_require__(334);
@@ -14684,41 +14702,69 @@ function getPrettySourceURL(url) {
 /**
  * @memberof utils/source
  * @static
  */
 function getRawSourceURL(url) {
   return url.replace(/:formatted$/, "");
 }
 
-function getFilenameFromURL(url) {
+function resolveFileURL(url) {
+  var transformUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialUrl => initialUrl;
+
   url = getRawSourceURL(url || "");
-  var name = (0, _path.basename)(url) || "(index)";
+  var name = transformUrl(url);
   return (0, _utils.endTruncateStr)(name, 50);
 }
 
+function getFilenameFromURL(url) {
+  return resolveFileURL(url, initialUrl => (0, _path.basename)(initialUrl) || "(index)");
+}
+
+function getFormattedSourceId(id) {
+  var sourceId = id.split("/")[1];
+  return `SOURCE${sourceId}`;
+}
+
 /**
  * Show a source url's filename.
  * If the source does not have a url, use the source id.
  *
  * @memberof utils/source
  * @static
  */
 function getFilename(source) {
   var url = source.url,
       id = source.id;
 
   if (!url) {
-    var sourceId = id.split("/")[1];
-    return `SOURCE${sourceId}`;
+    return getFormattedSourceId(id);
   }
 
   return getFilenameFromURL(url);
 }
 
+/**
+ * Show a source url.
+ * If the source does not have a url, use the source id.
+ *
+ * @memberof utils/source
+ * @static
+ */
+function getFileURL(source) {
+  var url = source.url,
+      id = source.id;
+
+  if (!url) {
+    return getFormattedSourceId(id);
+  }
+
+  return resolveFileURL(url);
+}
+
 var contentTypeModeMap = {
   "text/javascript": { name: "javascript" },
   "text/typescript": { name: "javascript", typescript: true },
   "text/coffeescript": "coffeescript",
   "text/typescript-jsx": {
     name: "jsx",
     base: { name: "javascript", typescript: true }
   },
@@ -14820,16 +14866,17 @@ function isLoaded(source) {
 exports.isJavaScript = isJavaScript;
 exports.isPretty = isPretty;
 exports.isThirdParty = isThirdParty;
 exports.shouldPrettyPrint = shouldPrettyPrint;
 exports.getPrettySourceURL = getPrettySourceURL;
 exports.getRawSourceURL = getRawSourceURL;
 exports.getFilename = getFilename;
 exports.getFilenameFromURL = getFilenameFromURL;
+exports.getFileURL = getFileURL;
 exports.getSourcePath = getSourcePath;
 exports.getSourceLineCount = getSourceLineCount;
 exports.getMode = getMode;
 exports.isLoaded = isLoaded;
 
 /***/ }),
 /* 234 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -14984,16 +15031,17 @@ var _extends = Object.assign || function
  */
 
 exports.initialState = initialState;
 exports.getBreakpoints = getBreakpoints;
 exports.getBreakpoint = getBreakpoint;
 exports.getBreakpointsDisabled = getBreakpointsDisabled;
 exports.getBreakpointsLoading = getBreakpointsLoading;
 exports.getBreakpointsForSource = getBreakpointsForSource;
+exports.getBreakpointForLine = getBreakpointForLine;
 
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
@@ -15149,16 +15197,24 @@ function getBreakpointsForSource(state, 
   var breakpoints = getBreakpoints(state);
 
   return breakpoints.filter(bp => {
     var location = isGeneratedSource ? bp.generatedLocation || bp.location : bp.location;
     return location.sourceId === sourceId;
   });
 }
 
+function getBreakpointForLine(state, sourceId, line) {
+  if (!sourceId) {
+    return I.Map();
+  }
+  var breakpoints = getBreakpointsForSource(state, sourceId);
+  return breakpoints.find(breakpoint => breakpoint.location.line === line);
+}
+
 var getHiddenBreakpoint = exports.getHiddenBreakpoint = (0, _reselect.createSelector)(getBreakpoints, function (breakpoints) {
   var hiddenBreakpoints = breakpoints.valueSeq().filter(breakpoint => breakpoint.hidden).first();
   return hiddenBreakpoints;
 });
 
 var getHiddenBreakpointLocation = exports.getHiddenBreakpointLocation = (0, _reselect.createSelector)(getHiddenBreakpoint, function (hiddenBreakpoint) {
   if (!hiddenBreakpoint) {
     return null;
@@ -15334,16 +15390,17 @@ exports.getSelectedFrame = exports.getSe
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 /* 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/. */
 
 exports.isStepping = isStepping;
 exports.isPaused = isPaused;
 exports.isEvaluatingExpression = isEvaluatingExpression;
+exports.pausedInEval = pausedInEval;
 exports.getLoadedObject = getLoadedObject;
 exports.getObjectProperties = getObjectProperties;
 exports.getIsWaitingOnBreak = getIsWaitingOnBreak;
 exports.getShouldPauseOnExceptions = getShouldPauseOnExceptions;
 exports.getShouldIgnoreCaughtExceptions = getShouldIgnoreCaughtExceptions;
 exports.getFrames = getFrames;
 exports.getFrameScopes = getFrameScopes;
 exports.getDebuggeeUrl = getDebuggeeUrl;
@@ -15516,16 +15573,29 @@ function isStepping(state) {
 function isPaused(state) {
   return !!getPause(state);
 }
 
 function isEvaluatingExpression(state) {
   return state.pause.command === "expression";
 }
 
+function pausedInEval(state) {
+  if (!state.pause.pause) {
+    return false;
+  }
+
+  var exception = state.pause.pause.why.exception;
+  if (!exception) {
+    return false;
+  }
+
+  return exception.preview.fileName === "debugger eval code";
+}
+
 function getLoadedObject(state, objectId) {
   return getLoadedObjects(state)[objectId];
 }
 
 function getObjectProperties(state, parentId) {
   return getLoadedObjects(state).filter(obj => obj.parentId == parentId);
 }
 
@@ -15579,41 +15649,43 @@ exports.default = update;
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.State = undefined;
 exports.getActiveSearch = getActiveSearch;
+exports.getContextMenu = getContextMenu;
 exports.getFileSearchQueryState = getFileSearchQueryState;
 exports.getFileSearchModifierState = getFileSearchModifierState;
 exports.getSearchResults = getSearchResults;
 exports.getFrameworkGroupingState = getFrameworkGroupingState;
 exports.getSymbolSearchType = getSymbolSearchType;
 exports.getShownSource = getShownSource;
 exports.getPaneCollapse = getPaneCollapse;
 exports.getHighlightedLineRange = getHighlightedLineRange;
-exports.getConditionalBreakpointPanel = getConditionalBreakpointPanel;
+exports.getConditionalPanelLine = getConditionalPanelLine;
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * UI reducer
  * @module reducers/ui
  */
 
 var State = exports.State = (0, _makeRecord2.default)({
   activeSearch: null,
+  contextMenu: {},
   fileSearchQuery: "",
   fileSearchModifiers: (0, _makeRecord2.default)({
     caseSensitive: _prefs.prefs.fileSearchCaseSensitive,
     wholeWord: _prefs.prefs.fileSearchWholeWord,
     regexMatch: _prefs.prefs.fileSearchRegexMatch
   })(),
   symbolSearchType: "functions",
   searchResults: {
@@ -15622,17 +15694,17 @@ var State = exports.State = (0, _makeRec
     index: -1,
     count: 0
   },
   shownSource: "",
   startPanelCollapsed: _prefs.prefs.startPanelCollapsed,
   endPanelCollapsed: _prefs.prefs.endPanelCollapsed,
   frameworkGroupingOn: _prefs.prefs.frameworkGroupingOn,
   highlightedLineRange: undefined,
-  conditionalBreakpointPanel: null
+  conditionalPanelLine: null
 });
 
 function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : State();
   var action = arguments[1];
 
   switch (action.type) {
     case "TOGGLE_ACTIVE_SEARCH":
@@ -15675,16 +15747,21 @@ function update() {
         return state.setIn(["fileSearchModifiers", action.modifier], actionVal);
       }
 
     case "SET_SYMBOL_SEARCH_TYPE":
       {
         return state.set("symbolSearchType", action.symbolType);
       }
 
+    case "SET_CONTEXT_MENU":
+      {
+        return state.set("contextMenu", action.contextMenu);
+      }
+
     case "SHOW_SOURCE":
       {
         return state.set("shownSource", action.sourceUrl);
       }
 
     case "TOGGLE_PANE":
       {
         if (action.position == "start") {
@@ -15708,32 +15785,39 @@ function update() {
         lineRange = { start: _start, end: _end, sourceId: _sourceId };
       }
 
       return state.set("highlightedLineRange", lineRange);
 
     case "CLEAR_HIGHLIGHT_LINES":
       return state.set("highlightedLineRange", {});
 
-    case "TOGGLE_CONDITIONAL_BREAKPOINT_PANEL":
-      return state.set("conditionalBreakpointPanel", action.line);
+    case "OPEN_CONDITIONAL_PANEL":
+      return state.set("conditionalPanelLine", action.line);
+
+    case "CLOSE_CONDITIONAL_PANEL":
+      return state.set("conditionalPanelLine", null);
 
     default:
       {
         return state;
       }
   }
 }
 
 // NOTE: we'd like to have the app state fully typed
 // https://github.com/devtools-html/debugger.html/blob/master/src/reducers/sources.js#L179-L185
 function getActiveSearch(state) {
   return state.ui.get("activeSearch");
 }
 
+function getContextMenu(state) {
+  return state.ui.get("contextMenu");
+}
+
 function getFileSearchQueryState(state) {
   return state.ui.get("fileSearchQuery");
 }
 
 function getFileSearchModifierState(state) {
   return state.ui.get("fileSearchModifiers");
 }
 
@@ -15760,18 +15844,18 @@ function getPaneCollapse(state, position
 
   return state.ui.get("endPanelCollapsed");
 }
 
 function getHighlightedLineRange(state) {
   return state.ui.get("highlightedLineRange");
 }
 
-function getConditionalBreakpointPanel(state) {
-  return state.ui.get("conditionalBreakpointPanel");
+function getConditionalPanelLine(state) {
+  return state.ui.get("conditionalPanelLine");
 }
 
 exports.default = update;
 
 /***/ }),
 /* 241 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -15841,16 +15925,18 @@ exports.default = update;
 
 /***/ }),
 /* 242 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
 var _expressions = __webpack_require__(228);
 
 var expressions = _interopRequireWildcard(_expressions);
 
 var _sources = __webpack_require__(232);
 
 var sources = _interopRequireWildcard(_sources);
 
@@ -15917,17 +16003,17 @@ var _isSelectedFrameVisible2 = _interopR
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 /**
  * @param object - location
  */
 
-module.exports = Object.assign({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, {
+module.exports = _extends({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, {
   getBreakpointAtLocation: _breakpointAtLocation2.default,
   getInScopeLines: _linesInScope2.default,
   getVisibleBreakpoints: _visibleBreakpoints2.default,
   isSelectedFrameVisible: _isSelectedFrameVisible2.default
 });
 
 /***/ }),
 /* 243 */
@@ -15935,16 +16021,20 @@ module.exports = Object.assign({}, expre
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -15957,23 +16047,23 @@ var _actions2 = _interopRequireDefault(_
 var _ShortcutsModal = __webpack_require__(1181);
 
 var _selectors = __webpack_require__(242);
 
 var _ui = __webpack_require__(1128);
 
 var _devtoolsModules = __webpack_require__(830);
 
-__webpack_require__(857);
-
-__webpack_require__(858);
-
-__webpack_require__(859);
-
-__webpack_require__(860);
+__webpack_require__(1228);
+
+__webpack_require__(1229);
+
+__webpack_require__(1230);
+
+__webpack_require__(1231);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
 var _ProjectSearch = __webpack_require__(1139);
 
 var _ProjectSearch2 = _interopRequireDefault(_ProjectSearch);
@@ -16025,26 +16115,28 @@ class App extends _react.Component {
     };
 
     this.getChildContext = this.getChildContext.bind(this);
     this.onLayoutChange = this.onLayoutChange.bind(this);
     this.toggleSymbolModal = this.toggleSymbolModal.bind(this);
     this.renderEditorPane = this.renderEditorPane.bind(this);
     this.renderVerticalLayout = this.renderVerticalLayout.bind(this);
     this.onEscape = this.onEscape.bind(this);
+    this.onCommandSlash = this.onCommandSlash.bind(this);
   }
 
   getChildContext() {
     return { shortcuts };
   }
 
   componentDidMount() {
     verticalLayoutBreakpoint.addListener(this.onLayoutChange);
     shortcuts.on(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
     shortcuts.on("Escape", this.onEscape);
+    shortcuts.on("Cmd+/", this.onCommandSlash);
   }
 
   componentWillUnmount() {
     verticalLayoutBreakpoint.removeListener(this.onLayoutChange);
     shortcuts.off(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
     shortcuts.off("Escape", this.onEscape);
   }
 
@@ -16055,16 +16147,20 @@ class App extends _react.Component {
 
 
     if (activeSearch) {
       e.preventDefault();
       closeActiveSearch();
     }
   }
 
+  onCommandSlash() {
+    this.toggleShortcutsModal();
+  }
+
   toggleSymbolModal(_, e) {
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         activeSearch = _props2.activeSearch,
         closeActiveSearch = _props2.closeActiveSearch,
         setActiveSearch = _props2.setActiveSearch;
 
 
@@ -16231,17 +16327,17 @@ class App extends _react.Component {
       { className: "debugger" },
       this.state.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
       this.renderSymbolModal(),
       this.renderShortcutsModal()
     );
   }
 }
 
-App.childContextTypes = { shortcuts: _react.PropTypes.object };
+App.childContextTypes = { shortcuts: _propTypes2.default.object };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   selectedSource: (0, _selectors.getSelectedSource)(state),
   startPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "start"),
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end"),
   activeSearch: (0, _selectors.getActiveSearch)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(App);
 
@@ -16360,16 +16456,18 @@ var _breakpoint = __webpack_require__(10
 var _addBreakpoint = __webpack_require__(1136);
 
 var _addBreakpoint2 = _interopRequireDefault(_addBreakpoint);
 
 var _remapLocations = __webpack_require__(188);
 
 var _remapLocations2 = _interopRequireDefault(_remapLocations);
 
+var _ast = __webpack_require__(1058);
+
 var _syncBreakpoint = __webpack_require__(1137);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 /* 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/. */
@@ -16759,20 +16857,22 @@ function setBreakpointCondition(location
 
 function toggleBreakpoint(line, column) {
   return (_ref33) => {
     var dispatch = _ref33.dispatch,
         getState = _ref33.getState,
         client = _ref33.client,
         sourceMaps = _ref33.sourceMaps;
 
-    var selectedSource = (0, _selectors.getSelectedSource)(getState());
-    var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
-
-    if (bp && bp.loading) {
+    var state = getState();
+    var selectedSource = (0, _selectors.getSelectedSource)(state);
+    var bp = (0, _selectors.getBreakpointAtLocation)(state, { line, column });
+    var isEmptyLine = (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS());
+
+    if (isEmptyLine || bp && bp.loading) {
       return;
     }
 
     if (bp) {
       // NOTE: it's possible the breakpoint has slid to a column
       return dispatch(removeBreakpoint({
         sourceId: bp.location.sourceId,
         sourceUrl: bp.location.sourceUrl,
@@ -17183,26 +17283,60 @@ function isSlowBuffer (obj) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getMappedExpression = undefined;
+
+/**
+ * Gets information about original variable names from the source map
+ * and replaces all posible generated names.
+ */
+var getMappedExpression = exports.getMappedExpression = (() => {
+  var _ref9 = _asyncToGenerator(function* (_ref10, generatedLocation, expression) {
+    var sourceMaps = _ref10.sourceMaps;
+
+    var astScopes = yield parser.getScopes(generatedLocation);
+
+    var generatedScopes = yield sourceMaps.getLocationScopes(generatedLocation, astScopes);
+
+    if (!generatedScopes) {
+      return expression;
+    }
+
+    return (0, _utils.replaceOriginalVariableName)(expression, generatedScopes);
+  });
+
+  return function getMappedExpression(_x4, _x5, _x6) {
+    return _ref9.apply(this, arguments);
+  };
+})();
+
 exports.addExpression = addExpression;
 exports.updateExpression = updateExpression;
 exports.deleteExpression = deleteExpression;
 exports.evaluateExpressions = evaluateExpressions;
 
 var _selectors = __webpack_require__(242);
 
+var _promise = __webpack_require__(193);
+
+var _utils = __webpack_require__(1206);
+
+var _sources = __webpack_require__(254);
+
+var _devtoolsSourceMap = __webpack_require__(898);
+
 var _expressions = __webpack_require__(1177);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 var parser = _interopRequireWildcard(_parser);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
@@ -17305,31 +17439,56 @@ function evaluateExpressions() {
   })();
 }
 
 function evaluateExpression(expression) {
   return (() => {
     var _ref7 = _asyncToGenerator(function* (_ref8) {
       var dispatch = _ref8.dispatch,
           getState = _ref8.getState,
-          client = _ref8.client;
+          client = _ref8.client,
+          sourceMaps = _ref8.sourceMaps;
 
       if (!expression.input) {
         console.warn("Expressions should not be empty");
         return;
       }
 
-      var error = yield parser.hasSyntaxError(expression.input);
+      var input = expression.input;
+      var error = yield parser.hasSyntaxError(input);
+      if (error) {
+        return dispatch({
+          type: "EVALUATE_EXPRESSION",
+          input: expression.input,
+          value: { input: expression.input, result: error }
+        });
+      }
+
+      var frame = (0, _selectors.getSelectedFrame)(getState());
+
+      if (frame) {
+        var location = frame.location,
+            generatedLocation = frame.generatedLocation;
+
+        var source = (0, _selectors.getSource)(getState(), location.sourceId);
+        var sourceId = source.get("id");
+
+        if (!(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
+          var generatedSourceId = generatedLocation.sourceId;
+          yield dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
+
+          input = yield getMappedExpression({ sourceMaps }, generatedLocation, input);
+        }
+      }
+
       var frameId = (0, _selectors.getSelectedFrameId)(getState());
-      var value = error ? { input: expression.input, result: error } : yield client.evaluate((0, _expressions.wrapExpression)(expression.input), { frameId });
-
       return dispatch({
         type: "EVALUATE_EXPRESSION",
         input: expression.input,
-        value
+        [_promise.PROMISE]: client.evaluate((0, _expressions.wrapExpression)(input), { frameId })
       });
     });
 
     return function (_x3) {
       return _ref7.apply(this, arguments);
     };
   })();
 }
@@ -17562,49 +17721,35 @@ var checkSelectedSource = (() => {
     }
   });
 
   return function checkSelectedSource(_x, _x2, _x3) {
     return _ref.apply(this, arguments);
   };
 })();
 
-var checkPendingBreakpoint = (() => {
-  var _ref2 = _asyncToGenerator(function* (state, dispatch, pendingBreakpoint, source) {
-    var sourceUrl = pendingBreakpoint.location.sourceUrl;
-
-    var sameSource = sourceUrl && sourceUrl === source.url;
-
-    if (sameSource) {
-      yield dispatch((0, _breakpoints.syncBreakpoint)(source.id, pendingBreakpoint));
-    }
-  });
-
-  return function checkPendingBreakpoint(_x4, _x5, _x6, _x7) {
-    return _ref2.apply(this, arguments);
-  };
-})();
-
 var checkPendingBreakpoints = (() => {
-  var _ref3 = _asyncToGenerator(function* (state, dispatch, source) {
+  var _ref2 = _asyncToGenerator(function* (state, dispatch, sourceId) {
+    // source may have been modified by selectSource
+    var source = (0, _selectors.getSource)(state, sourceId).toJS();
     var pendingBreakpoints = (0, _selectors.getPendingBreakpointsForSource)(state, source.url);
     if (!pendingBreakpoints.size) {
       return;
     }
 
     // load the source text if there is a pending breakpoint for it
     yield dispatch((0, _loadSourceText.loadSourceText)(source));
     var pendingBreakpointsArray = pendingBreakpoints.valueSeq().toJS();
     for (var pendingBreakpoint of pendingBreakpointsArray) {
-      yield checkPendingBreakpoint(state, dispatch, pendingBreakpoint, source);
-    }
-  });
-
-  return function checkPendingBreakpoints(_x8, _x9, _x10) {
-    return _ref3.apply(this, arguments);
+      yield dispatch((0, _breakpoints.syncBreakpoint)(sourceId, pendingBreakpoint));
+    }
+  });
+
+  return function checkPendingBreakpoints(_x4, _x5, _x6) {
+    return _ref2.apply(this, arguments);
   };
 })();
 
 /**
  * Handler for the debugger client's unsolicited newSource notification.
  * @memberof actions/sources
  * @static
  */
@@ -17645,17 +17790,17 @@ var _createPrettySource = __webpack_requ
 var _loadSourceText = __webpack_require__(1143);
 
 var _prefs = __webpack_require__(226);
 
 var _editor = __webpack_require__(257);
 
 var _sourceMaps = __webpack_require__(797);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 var parser = _interopRequireWildcard(_parser);
 
 var _selectors = __webpack_require__(242);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -17668,101 +17813,106 @@ function _asyncToGenerator(fn) { return 
 
 /**
  * Redux actions for the sources state
  * @module actions/sources
  */
 
 function newSource(source) {
   return (() => {
-    var _ref4 = _asyncToGenerator(function* (_ref5) {
-      var dispatch = _ref5.dispatch,
-          getState = _ref5.getState;
+    var _ref3 = _asyncToGenerator(function* (_ref4) {
+      var dispatch = _ref4.dispatch,
+          getState = _ref4.getState;
 
       var _source = (0, _selectors.getSource)(getState(), source.id);
       if (_source) {
         return;
       }
 
       dispatch({ type: "ADD_SOURCE", source });
 
       if (_prefs.prefs.clientSourceMapsEnabled) {
         yield dispatch(loadSourceMap(source));
       }
 
       yield checkSelectedSource(getState(), dispatch, source);
-      yield checkPendingBreakpoints(getState(), dispatch, source);
-    });
-
-    return function (_x11) {
-      return _ref4.apply(this, arguments);
+      yield checkPendingBreakpoints(getState(), dispatch, source.id);
+    });
+
+    return function (_x7) {
+      return _ref3.apply(this, arguments);
     };
   })();
 }
 
 function newSources(sources) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState;
 
       var filteredSources = sources.filter(function (source) {
         return !(0, _selectors.getSource)(getState(), source.id);
       });
 
       for (var source of filteredSources) {
         yield dispatch(newSource(source));
       }
     });
 
-    return function (_x12) {
-      return _ref6.apply(this, arguments);
+    return function (_x8) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceMap(generatedSource) {
   return (() => {
-    var _ref8 = _asyncToGenerator(function* (_ref9) {
-      var dispatch = _ref9.dispatch,
-          getState = _ref9.getState,
-          sourceMaps = _ref9.sourceMaps;
+    var _ref7 = _asyncToGenerator(function* (_ref8) {
+      var dispatch = _ref8.dispatch,
+          getState = _ref8.getState,
+          sourceMaps = _ref8.sourceMaps;
 
       var urls = yield sourceMaps.getOriginalURLs(generatedSource);
       if (!urls) {
         // If this source doesn't have a sourcemap, do nothing.
         return;
       }
 
-      var state = getState();
       var originalSources = urls.map(function (originalUrl) {
         return {
           url: originalUrl,
           id: sourceMaps.generatedToOriginalId(generatedSource.id, originalUrl),
           isPrettyPrinted: false,
           isWasm: false,
           isBlackBoxed: false,
           loadedState: "unloaded"
         };
       });
 
       dispatch({ type: "ADD_SOURCES", sources: originalSources });
 
-      originalSources.forEach(function (source) {
-        checkSelectedSource(state, dispatch, source);
-        checkPendingBreakpoints(state, dispatch, source);
-      });
-    });
-
-    return function (_x13) {
-      return _ref8.apply(this, arguments);
+      originalSources.forEach((() => {
+        var _ref9 = _asyncToGenerator(function* (source) {
+          yield checkSelectedSource(getState(), dispatch, source);
+          checkPendingBreakpoints(getState(), dispatch, source.id);
+        });
+
+        return function (_x10) {
+          return _ref9.apply(this, arguments);
+        };
+      })());
+    });
+
+    return function (_x9) {
+      return _ref7.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Deterministically select a source that has a given URL. This will
  * work regardless of the connection status or if the source exists
  * yet. This exists mostly for external things to interact with the
@@ -17787,17 +17937,17 @@ function selectSourceURL(url) {
           type: "SELECT_SOURCE_URL",
           url: url,
           tabIndex: options.tabIndex,
           line: options.line
         });
       }
     });
 
-    return function (_x15) {
+    return function (_x12) {
       return _ref10.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
@@ -17864,17 +18014,17 @@ function jumpToMappedLocation(sourceLoca
         pairedLocation = yield (0, _sourceMaps.getGeneratedLocation)(getState(), source.toJS(), sourceLocation, sourceMaps);
       } else {
         pairedLocation = yield sourceMaps.getOriginalLocation(sourceLocation, source.toJS());
       }
 
       return dispatch(selectSource(pairedLocation.sourceId, { line: pairedLocation.line }));
     });
 
-    return function (_x17) {
+    return function (_x14) {
       return _ref14.apply(this, arguments);
     };
   })();
 }
 
 function addTab(source, tabIndex) {
   return {
     type: "ADD_TAB",
@@ -17981,17 +18131,17 @@ function togglePrettyPrint(sourceId) {
       yield dispatch((0, _breakpoints.remapBreakpoints)(sourceId));
       yield dispatch((0, _ast.setEmptyLines)(newPrettySource.id));
 
       return dispatch(selectSource(newPrettySource.id, {
         line: selectedOriginalLocation.line
       }));
     });
 
-    return function (_x18) {
+    return function (_x15) {
       return _ref18.apply(this, arguments);
     };
   })();
 }
 
 function toggleBlackBox(source) {
   return (() => {
     var _ref21 = _asyncToGenerator(function* (_ref22) {
@@ -18005,17 +18155,17 @@ function toggleBlackBox(source) {
 
       return dispatch({
         type: "BLACKBOX",
         source,
         [_promise.PROMISE]: client.blackBox(id, isBlackBoxed)
       });
     });
 
-    return function (_x19) {
+    return function (_x16) {
       return _ref21.apply(this, arguments);
     };
   })();
 }
 
 /**
   Load the text for all the available sources
  * @memberof actions/sources
@@ -18043,17 +18193,17 @@ function loadAllSources() {
         // If there is a current search query we search
         // each of the source texts as they get loaded
         if (query) {
           yield dispatch((0, _projectTextSearch.searchSource)(source.id, query));
         }
       }
     });
 
-    return function (_x20) {
+    return function (_x17) {
       return _ref23.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Ensures parser has source text
  *
@@ -18067,17 +18217,17 @@ function ensureParserHasSourceText(sourc
           getState = _ref28.getState;
 
       if (!(yield parser.hasSource(sourceId))) {
         yield dispatch((0, _loadSourceText.loadSourceText)((0, _selectors.getSource)(getState(), sourceId).toJS()));
         yield parser.setSource((0, _selectors.getSource)(getState(), sourceId).toJS());
       }
     });
 
-    return function (_x21) {
+    return function (_x18) {
       return _ref27.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 255 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -18127,17 +18277,17 @@ var getPausedPosition = exports.getPause
   };
 })();
 
 exports.updateFrameLocations = updateFrameLocations;
 exports.getPauseReason = getPauseReason;
 
 var _lodash = __webpack_require__(2);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function updateFrameLocations(frames, sourceMaps) {
   if (!frames || frames.length == 0) {
     return Promise.resolve(frames);
   }
 
@@ -18415,17 +18565,17 @@ module.exports = escapeRegExp;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
+exports.showLoading = exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
 
 var _source = __webpack_require__(233);
 
 var _wasm = __webpack_require__(23);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 var resizeBreakpointGutter = _devtoolsSourceEditor.SourceEditorUtils.resizeBreakpointGutter;
@@ -18464,22 +18614,35 @@ function updateLineNumberFormat(editor, 
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
   resizeBreakpointGutter(cm);
 }
 
 function updateDocument(editor, sourceId) {
   if (!sourceId) {
     return;
   }
+
   var doc = getDocument(sourceId) || editor.createDocument();
   editor.replaceDocument(doc);
 
   updateLineNumberFormat(editor, sourceId);
 }
 
+function showLoading(editor) {
+  if (getDocument("loading")) {
+    return;
+  }
+
+  var doc = editor.createDocument();
+  setDocument("loading", doc);
+  editor.replaceDocument(doc);
+  editor.setText(L10N.getStr("loadingText"));
+  editor.setMode({ name: "text" });
+}
+
 function setEditorText(editor, source) {
   var text = source.text,
       sourceId = source.id;
 
   if (source.isWasm) {
     var wasmLines = (0, _wasm.renderWasmText)(sourceId, text);
     // cm will try to split into lines anyway, saving memory
     var wasmText = { split: () => wasmLines, match: () => false };
@@ -18521,30 +18684,31 @@ function showSourceText(editor, source) 
 exports.getDocument = getDocument;
 exports.setDocument = setDocument;
 exports.removeDocument = removeDocument;
 exports.clearDocuments = clearDocuments;
 exports.resetLineNumberFormat = resetLineNumberFormat;
 exports.updateLineNumberFormat = updateLineNumberFormat;
 exports.updateDocument = updateDocument;
 exports.showSourceText = showSourceText;
+exports.showLoading = showLoading;
 
 /***/ }),
 /* 261 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getMatchIndex = exports.removeOverlay = exports.findPrev = exports.findNext = exports.find = exports.buildQuery = undefined;
 
-var _buildQuery = __webpack_require__(1138);
+var _buildQuery = __webpack_require__(1211);
 
 var _buildQuery2 = _interopRequireDefault(_buildQuery);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * @memberof utils/source-search
  * @static
@@ -18930,27 +19094,25 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.createTree = createTree;
 
 var _utils = __webpack_require__(18);
 
 var _collapseTree = __webpack_require__(41);
 
-var _sortTree = __webpack_require__(794);
-
 var _addToTree = __webpack_require__(40);
 
 function createTree(sources, debuggeeUrl) {
   var uncollapsedTree = (0, _utils.createNode)("root", "", []);
   for (var source of sources.valueSeq()) {
     (0, _addToTree.addToTree)(uncollapsedTree, source, debuggeeUrl);
   }
 
-  var sourceTree = (0, _sortTree.sortEntireTree)((0, _collapseTree.collapseTree)(uncollapsedTree), debuggeeUrl);
+  var sourceTree = (0, _collapseTree.collapseTree)(uncollapsedTree);
 
   return {
     uncollapsedTree,
     sourceTree,
     parentMap: (0, _utils.createParentMap)(sourceTree),
     focusedItem: null
   };
 }
@@ -18969,16 +19131,20 @@ function createTree(sources, debuggeeUrl
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -19011,18 +19177,18 @@ class ToggleSearch extends _react.Compon
         L10N.getStr("projectTextSearch.placeholder")
       )
     );
   }
 }
 
 exports.default = ToggleSearch;
 ToggleSearch.propTypes = {
-  kind: _react.PropTypes.string.isRequired,
-  toggle: _react.PropTypes.func.isRequired
+  kind: _propTypes2.default.string.isRequired,
+  toggle: _propTypes2.default.func.isRequired
 };
 
 /***/ }),
 /* 285 */,
 /* 286 */,
 /* 287 */,
 /* 288 */,
 /* 289 */,
@@ -19079,88 +19245,17 @@ module.exports = hasPath;
 
 /***/ }),
 /* 298 */,
 /* 299 */,
 /* 300 */,
 /* 301 */,
 /* 302 */,
 /* 303 */,
-/* 304 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var isObject = __webpack_require__(84),
-    isSymbol = __webpack_require__(72);
-
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
-
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
-
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
-
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
-
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
-
-/**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
-function toNumber(value) {
-  if (typeof value == 'number') {
-    return value;
-  }
-  if (isSymbol(value)) {
-    return NAN;
-  }
-  if (isObject(value)) {
-    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
-    value = isObject(other) ? (other + '') : other;
-  }
-  if (typeof value != 'string') {
-    return value === 0 ? value : +value;
-  }
-  value = value.replace(reTrim, '');
-  var isBinary = reIsBinary.test(value);
-  return (isBinary || reIsOctal.test(value))
-    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
-    : (reIsBadHex.test(value) ? NAN : +value);
-}
-
-module.exports = toNumber;
-
-
-/***/ }),
+/* 304 */,
 /* 305 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -19306,44 +19401,52 @@ module.exports = baseHas;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.DebugLine = undefined;
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
 var _sourceDocuments = __webpack_require__(260);
 
+var _reactRedux = __webpack_require__(1189);
+
+var _selectors = __webpack_require__(242);
+
 class DebugLine extends _react.Component {
 
   constructor() {
     super();
     this.state = { debugExpression: { clear: () => {} } };
   }
 
-  componentWillMount() {
+  componentDidMount() {
     this.setDebugLine(this.props.selectedFrame, this.props.selectedLocation, this.props.editor);
   }
 
   componentWillReceiveProps(nextProps) {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
     this.setDebugLine(nextProps.selectedFrame, nextProps.selectedLocation, nextProps.editor);
   }
 
   componentWillUnmount() {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
   }
 
   setDebugLine(selectedFrame, selectedLocation, editor) {
+    if (!selectedFrame) {
+      return;
+    }
     var location = selectedFrame.location,
         sourceId = selectedFrame.location.sourceId;
 
     var _toEditorPosition = (0, _editor.toEditorPosition)(sourceId, location),
         line = _toEditorPosition.line,
         column = _toEditorPosition.column;
 
     var doc = (0, _sourceDocuments.getDocument)(sourceId);
@@ -19355,16 +19458,19 @@ class DebugLine extends _react.Component
     var debugExpression = (0, _editor.markText)(editor, "debug-expression", {
       start: { line, column },
       end: { line, column: null }
     });
     this.setState({ debugExpression });
   }
 
   clearDebugLine(selectedFrame, editor) {
+    if (!selectedFrame) {
+      return;
+    }
     var _selectedFrame$locati = selectedFrame.location,
         line = _selectedFrame$locati.line,
         sourceId = _selectedFrame$locati.sourceId;
     var debugExpression = this.state.debugExpression;
 
     if (debugExpression) {
       debugExpression.clear();
     }
@@ -19377,17 +19483,22 @@ class DebugLine extends _react.Component
 
     doc.removeLineClass(editorLine, "line", "new-debug-line");
   }
 
   render() {
     return null;
   }
 }
-exports.default = DebugLine;
+
+exports.DebugLine = DebugLine;
+exports.default = (0, _reactRedux.connect)(state => ({
+  selectedLocation: (0, _selectors.getSelectedLocation)(state),
+  selectedFrame: (0, _selectors.getSelectedFrame)(state)
+}))(DebugLine);
 
 /***/ }),
 /* 314 */,
 /* 315 */,
 /* 316 */,
 /* 317 */,
 /* 318 */,
 /* 319 */
@@ -19402,16 +19513,21 @@ Object.defineProperty(exports, "__esModu
 
 var _getScopeBindings = (() => {
   var _ref = _asyncToGenerator(function* (_ref2, generatedLocation, scopes) {
     var dispatch = _ref2.dispatch,
         getState = _ref2.getState,
         sourceMaps = _ref2.sourceMaps;
     var sourceId = generatedLocation.sourceId;
 
+    var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
+    if (sourceRecord.get("isWasm")) {
+      return scopes;
+    }
+
     yield dispatch((0, _sources.ensureParserHasSourceText)(sourceId));
 
     return yield (0, _pause.updateScopeBindings)(scopes, generatedLocation, sourceMaps);
   });
 
   return function _getScopeBindings(_x, _x2, _x3) {
     return _ref.apply(this, arguments);
   };
@@ -19453,17 +19569,17 @@ var _selectors = __webpack_require__(242
 var _pause = __webpack_require__(255);
 
 var _expressions = __webpack_require__(252);
 
 var _breakpoints = __webpack_require__(245);
 
 var _breakpoints2 = __webpack_require__(236);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 var parser = _interopRequireWildcard(_parser);
 
 var _prefs = __webpack_require__(226);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
@@ -19475,22 +19591,24 @@ function resumed() {
     var dispatch = _ref3.dispatch,
         client = _ref3.client,
         getState = _ref3.getState;
 
     if (!(0, _selectors.isPaused)(getState())) {
       return;
     }
 
+    var wasPausedInEval = (0, _selectors.pausedInEval)(getState());
+
     dispatch({
       type: "RESUME",
       value: undefined
     });
 
-    if (!(0, _selectors.isStepping)(getState())) {
+    if (!(0, _selectors.isStepping)(getState()) && !wasPausedInEval) {
       dispatch((0, _expressions.evaluateExpressions)());
     }
   };
 }
 
 function continueToHere(line) {
   return (() => {
     var _ref4 = _asyncToGenerator(function* (_ref5) {
@@ -19549,17 +19667,21 @@ function paused(pauseInfo) {
         selectedFrameId: frame.id,
         loadedObjects: loadedObjects || []
       });
 
       var hiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
       if (hiddenBreakpointLocation) {
         dispatch((0, _breakpoints.removeBreakpoint)(hiddenBreakpointLocation));
       }
-      dispatch((0, _expressions.evaluateExpressions)());
+
+      if (!(0, _selectors.isEvaluatingExpression)(getState())) {
+        dispatch((0, _expressions.evaluateExpressions)());
+      }
+
       dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
     });
 
     return function (_x5) {
       return _ref6.apply(this, arguments);
     };
   })();
 }
@@ -19813,17 +19935,17 @@ exports.navigated = navigated;
 var _editor = __webpack_require__(257);
 
 var _sources = __webpack_require__(232);
 
 var _utils = __webpack_require__(234);
 
 var _sources2 = __webpack_require__(254);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 var _wasm = __webpack_require__(23);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
  * Redux actions for the navigation state
  * @module actions/navigation
@@ -19901,84 +20023,94 @@ function navigated() {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.setContextMenu = setContextMenu;
 exports.closeActiveSearch = closeActiveSearch;
 exports.setActiveSearch = setActiveSearch;
 exports.toggleFrameworkGrouping = toggleFrameworkGrouping;
 exports.setSelectedSymbolType = setSelectedSymbolType;
 exports.setFileSearchQuery = setFileSearchQuery;
 exports.updateSearchResults = updateSearchResults;
 exports.toggleFileSearchModifier = toggleFileSearchModifier;
 exports.showSource = showSource;
 exports.togglePaneCollapse = togglePaneCollapse;
 exports.highlightLineRange = highlightLineRange;
 exports.clearHighlightLineRange = clearHighlightLineRange;
-exports.toggleConditionalBreakpointPanel = toggleConditionalBreakpointPanel;
+exports.openConditionalPanel = openConditionalPanel;
+exports.closeConditionalPanel = closeConditionalPanel;
 
 var _selectors = __webpack_require__(242);
 
 var _sourceSearch = __webpack_require__(1144);
 
-function closeActiveSearch() {
+function setContextMenu(type, event) {
   return (_ref) => {
-    var getState = _ref.getState,
-        dispatch = _ref.dispatch;
+    var dispatch = _ref.dispatch;
+
+    dispatch({ type: "SET_CONTEXT_MENU", contextMenu: { type, event } });
+  };
+}
+
+function closeActiveSearch() {
+  return (_ref2) => {
+    var getState = _ref2.getState,
+        dispatch = _ref2.dispatch;
 
     var activeSearch = (0, _selectors.getActiveSearch)(getState());
 
     if (activeSearch == "source") {
       dispatch((0, _sourceSearch.clearSourceSearchQuery)());
     }
 
     dispatch({
       type: "TOGGLE_ACTIVE_SEARCH",
       value: null
     });
   };
 }
 
 function setActiveSearch(activeSearch) {
-  return (_ref2) => {
-    var dispatch = _ref2.dispatch,
-        getState = _ref2.getState;
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch,
+        getState = _ref3.getState;
 
     var activeSearchState = (0, _selectors.getActiveSearch)(getState());
     if (activeSearchState === activeSearch) {
       return;
     }
 
     dispatch({
       type: "TOGGLE_ACTIVE_SEARCH",
       value: activeSearch
     });
   };
 }
 
 function toggleFrameworkGrouping(toggleValue) {
-  return (_ref3) => {
-    var dispatch = _ref3.dispatch,
-        getState = _ref3.getState;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch,
+        getState = _ref4.getState;
 
     dispatch({
       type: "TOGGLE_FRAMEWORK_GROUPING",
       value: toggleValue
     });
   };
 }
 
 function setSelectedSymbolType(symbolType) {
-  return (_ref4) => {
-    var dispatch = _ref4.dispatch,
-        getState = _ref4.getState;
+  return (_ref5) => {
+    var dispatch = _ref5.dispatch,
+        getState = _ref5.getState;
 
     dispatch({
       type: "SET_SYMBOL_SEARCH_TYPE",
       symbolType
     });
   };
 }
 
@@ -19996,19 +20128,19 @@ function updateSearchResults(results) {
   };
 }
 
 function toggleFileSearchModifier(modifier) {
   return { type: "TOGGLE_FILE_SEARCH_MODIFIER", modifier };
 }
 
 function showSource(sourceId) {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch,
-        getState = _ref5.getState;
+  return (_ref6) => {
+    var dispatch = _ref6.dispatch,
+        getState = _ref6.getState;
 
     var source = (0, _selectors.getSource)(getState(), sourceId);
 
     dispatch({
       type: "SHOW_SOURCE",
       sourceUrl: ""
     });
 
@@ -20043,23 +20175,29 @@ function highlightLineRange(location) {
  * @static
  */
 function clearHighlightLineRange() {
   return {
     type: "CLEAR_HIGHLIGHT_LINES"
   };
 }
 
-function toggleConditionalBreakpointPanel(line) {
-  return {
-    type: "TOGGLE_CONDITIONAL_BREAKPOINT_PANEL",
+function openConditionalPanel(line) {
+  return {
+    type: "OPEN_CONDITIONAL_PANEL",
     line: line
   };
 }
 
+function closeConditionalPanel() {
+  return {
+    type: "CLOSE_CONDITIONAL_PANEL"
+  };
+}
+
 /***/ }),
 /* 322 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -20108,42 +20246,43 @@ function recordCoverage() {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Modal = undefined;
 exports.default = Slide;
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
-__webpack_require__(952);
+__webpack_require__(1226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Modal extends _react.Component {
-
-  constructor(props) {
-    super(props);
-    var self = this;
-    self.onClick = this.onClick.bind(this);
-  }
-
-  onClick(e) {
-    e.stopPropagation();
+  constructor() {
+    var _temp;
+
+    return _temp = super(...arguments), this.onClick = e => {
+      e.stopPropagation();
+    }, _temp;
   }
 
   render() {
     var status = this.props.status;
 
 
     return _react2.default.createElement(
       "div",
@@ -20157,17 +20296,17 @@ class Modal extends _react.Component {
         this.props.children
       )
     );
   }
 }
 
 exports.Modal = Modal;
 Modal.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 function Slide(_ref) {
   var inProp = _ref.in,
       children = _ref.children,
       additionalClass = _ref.additionalClass,
       handleClose = _ref.handleClose;
 
@@ -21588,17 +21727,17 @@ var _react2 = _interopRequireDefault(_re
 var _fuzzaldrinPlus = __webpack_require__(161);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _resultList = __webpack_require__(343);
 
-__webpack_require__(867);
+__webpack_require__(1240);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
@@ -21820,17 +21959,17 @@ exports.handleKeyDown = handleKeyDown;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _Svg = __webpack_require__(345);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(862);
+__webpack_require__(1234);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * This file maps the SVG React Components in the assets/images directory.
  */
 
 exports.default = _Svg2.default;
@@ -21853,32 +21992,34 @@ var svg = {
   angular: __webpack_require__(247),
   arrow: __webpack_require__(348),
   backbone: __webpack_require__(997),
   blackBox: __webpack_require__(349),
   breakpoint: __webpack_require__(350),
   "column-breakpoint": __webpack_require__(998),
   "case-match": __webpack_require__(351),
   close: __webpack_require__(352),
+  choo: __webpack_require__(1290),
   dojo: __webpack_require__(806),
   domain: __webpack_require__(353),
   file: __webpack_require__(354),
   folder: __webpack_require__(355),
   globe: __webpack_require__(356),
   jquery: __webpack_require__(999),
   underscore: __webpack_require__(1117),
   lodash: __webpack_require__(1118),
   ember: __webpack_require__(1119),
   vuejs: __webpack_require__(1174),
   "magnifying-glass": __webpack_require__(357),
   "arrow-up": __webpack_require__(919),
   "arrow-down": __webpack_require__(920),
   pause: __webpack_require__(358),
   "pause-exceptions": __webpack_require__(359),
   plus: __webpack_require__(360),
+  preact: __webpack_require__(1233),
   prettyPrint: __webpack_require__(361),
   react: __webpack_require__(1000),
   "regex-match": __webpack_require__(362),
   redux: __webpack_require__(256),
   immutable: __webpack_require__(258),
   resume: __webpack_require__(363),
   settings: __webpack_require__(364),
   stepIn: __webpack_require__(365),
@@ -22283,17 +22424,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(865);
+__webpack_require__(1237);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var arrowBtn = (onClick, type, className, tooltip) => {
   var props = {
     onClick,
     type,
     className,
@@ -22427,17 +22568,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(864);
+__webpack_require__(1236);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function CloseButton(_ref) {
   var handleClick = _ref.handleClick,
       buttonClass = _ref.buttonClass,
       tooltip = _ref.tooltip;
 
@@ -22471,17 +22612,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(868);
+__webpack_require__(1241);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ResultList extends _react.Component {
 
   constructor(props) {
     super(props);
     this.renderListItem = this.renderListItem.bind(this);
@@ -22628,37 +22769,60 @@ Object.defineProperty(exports, "__esModu
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(863);
+__webpack_require__(1235);
 
 var _devtoolsComponents = __webpack_require__(1007);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Tree = (0, _react.createFactory)(_devtoolsComponents.Tree);
 
 class ManagedTree extends _react.Component {
 
   constructor(props) {
     super();
 
+    this.setExpanded = (item, isExpanded) => {
+      var expanded = this.state.expanded;
+      var itemPath = this.props.getPath(item);
+      if (isExpanded) {
+        expanded.add(itemPath);
+      } else {
+        expanded.delete(itemPath);
+      }
+      this.setState({ expanded });
+
+      if (isExpanded && this.props.onExpand) {
+        this.props.onExpand(item, expanded);
+      } else if (!isExpanded && this.props.onCollapse) {
+        this.props.onCollapse(item, expanded);
+      }
+    };
+
+    this.focusItem = item => {
+      if (!this.props.disabledFocus && this.state.focusedItem !== item) {
+        this.setState({ focusedItem: item });
+
+        if (this.props.onFocus) {
+          this.props.onFocus(item);
+        }
+      }
+    };
+
     this.state = {
       expanded: props.expanded || new Set(),
       focusedItem: null
     };
-
-    var self = this;
-    self.setExpanded = this.setExpanded.bind(this);
-    self.focusItem = this.focusItem.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     var listItems = nextProps.listItems;
     if (listItems && listItems != this.props.listItems && listItems.length) {
       this.expandListItems(listItems);
     }
 
@@ -22667,33 +22831,16 @@ class ManagedTree extends _react.Compone
       this.highlightItem(highlightItems);
     }
 
     if (nextProps.focused && nextProps.focused !== this.props.focused) {
       this.focusItem(nextProps.focused);
     }
   }
 
-  setExpanded(item, isExpanded) {
-    var expanded = this.state.expanded;
-    var itemPath = this.props.getPath(item);
-    if (isExpanded) {
-      expanded.add(itemPath);
-    } else {
-      expanded.delete(itemPath);
-    }
-    this.setState({ expanded });
-
-    if (isExpanded && this.props.onExpand) {
-      this.props.onExpand(item, expanded);
-    } else if (!isExpanded && this.props.onCollapse) {
-      this.props.onCollapse(item, expanded);
-    }
-  }
-
   expandListItems(listItems) {
     var expanded = this.state.expanded;
     listItems.forEach(item => expanded.add(this.props.getPath(item)));
     this.focusItem(listItems[0]);
     this.setState({ expanded });
   }
 
   highlightItem(highlightItems) {
@@ -22705,26 +22852,16 @@ class ManagedTree extends _react.Compone
     } else {
       // Look at folders starting from the top-level until finds a
       // closed folder and highlights this folder
       var index = highlightItems.reverse().findIndex(item => !expanded.has(this.props.getPath(item)));
       this.focusItem(highlightItems[index]);
     }
   }
 
-  focusItem(item) {
-    if (!this.props.disabledFocus && this.state.focusedItem !== item) {
-      this.setState({ focusedItem: item });
-
-      if (this.props.onFocus) {
-        this.props.onFocus(item);
-      }
-    }
-  }
-
   render() {
     var _this = this;
 
     var _state = this.state,
         expanded = _state.expanded,
         focusedItem = _state.focusedItem;
 
 
@@ -22752,18 +22889,16 @@ class ManagedTree extends _react.Compone
     return _react2.default.createElement(
       "div",
       { className: "managed-tree" },
       _react2.default.createElement(Tree, props)
     );
   }
 }
 
-ManagedTree.propTypes = Object.assign({}, Tree.propTypes);
-
 exports.default = ManagedTree;
 
 /***/ }),
 /* 420 */,
 /* 421 */,
 /* 422 */,
 /* 423 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -22799,16 +22934,20 @@ exports.copyToTheClipboard = copyToTheCl
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
@@ -22819,35 +22958,23 @@ var _reactImmutableProptypes2 = _interop
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-var _devtoolsConfig = __webpack_require__(828);
-
-var _GutterMenu = __webpack_require__(655);
-
-var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
-
-var _EditorMenu = __webpack_require__(656);
-
-var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
-
-var _ConditionalPanel = __webpack_require__(711);
-
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _source = __webpack_require__(233);
 
-var _function = __webpack_require__(1169);
-
-var _ast = __webpack_require__(1058);
+var _devtoolsConfig = __webpack_require__(828);
+
+var _devtoolsSourceEditor = __webpack_require__(994);
 
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _Footer = __webpack_require__(427);
@@ -22881,63 +23008,162 @@ var _CallSites2 = _interopRequireDefault
 var _DebugLine = __webpack_require__(313);
 
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
 var _EmptyLines = __webpack_require__(1146);
 
 var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
 
+var _GutterMenu = __webpack_require__(655);
+
+var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
+
+var _EditorMenu = __webpack_require__(656);
+
+var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
+
+var _ConditionalPanel = __webpack_require__(711);
+
+var _ConditionalPanel2 = _interopRequireDefault(_ConditionalPanel);
+
 var _editor = __webpack_require__(257);
 
-__webpack_require__(905);
-
-__webpack_require__(906);
-
-var _devtoolsSourceEditor = __webpack_require__(994);
+__webpack_require__(1257);
+
+__webpack_require__(1258);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
   footerHeight: "var(--editor-footer-height)"
 };
 
 class Editor extends _react.PureComponent {
 
   constructor() {
     super();
 
-    this.cbPanel = null;
+    this.onToggleBreakpoint = (key, e) => {
+      e.preventDefault();
+      var codeMirror = this.state.editor.codeMirror;
+      var selectedSource = this.props.selectedSource;
+
+      var line = (0, _editor.getCursorLine)(codeMirror);
+
+      if (!selectedSource) {
+        return;
+      }
+
+      var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
+
+      if (e.shiftKey) {
+        this.toggleConditionalPanel(sourceLine);
+      } else {
+        this.props.toggleBreakpoint(sourceLine);
+      }
+    };
+
+    this.onEscape = (key, e) => {
+      if (!this.state.editor) {
+        return;
+      }
+
+      var codeMirror = this.state.editor.codeMirror;
+
+      if (codeMirror.listSelections().length > 1) {
+        codeMirror.execCommand("singleSelection");
+        e.preventDefault();
+      }
+    };
+
+    this.onSearchAgain = (_, e) => {
+      var _props = this.props,
+          query = _props.query,
+          searchModifiers = _props.searchModifiers;
+      var codeMirror = this.state.editor.editor.codeMirror;
+
+      var ctx = { ed: this.state.editor, cm: codeMirror };
+
+      var direction = e.shiftKey ? "prev" : "next";
+      (0, _editor.traverseResults)(e, ctx, query, direction, searchModifiers.toJS());
+    };
+
+    this.onGutterClick = (cm, line, gutter, ev) => {
+      var _props2 = this.props,
+          selectedSource = _props2.selectedSource,
+          toggleBreakpoint = _props2.toggleBreakpoint,
+          conditionalPanelLine = _props2.conditionalPanelLine,
+          closeConditionalPanel = _props2.closeConditionalPanel,
+          addOrToggleDisabledBreakpoint = _props2.addOrToggleDisabledBreakpoint,
+          continueToHere = _props2.continueToHere;
+
+      // ignore right clicks in the gutter
+
+      if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed") || !selectedSource) {
+        return;
+      }
+
+      if (conditionalPanelLine) {
+        return closeConditionalPanel();
+      }
+
+      if (gutter === "CodeMirror-foldgutter") {
+        return;
+      }
+
+      var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
+
+      if (ev.altKey) {
+        return continueToHere(sourceLine);
+      }
+
+      if (ev.shiftKey) {
+        return addOrToggleDisabledBreakpoint(sourceLine);
+      }
+      return toggleBreakpoint(sourceLine);
+    };
+
+    this.onGutterContextMenu = event => {
+      return this.props.setContextMenu("Gutter", event);
+    };
+
+    this.toggleConditionalPanel = line => {
+      var _props3 = this.props,
+          conditionalPanelLine = _props3.conditionalPanelLine,
+          closeConditionalPanel = _props3.closeConditionalPanel,
+          openConditionalPanel = _props3.openConditionalPanel;
+
+      if (conditionalPanelLine) {
+        return closeConditionalPanel();
+      }
+
+      return openConditionalPanel(line);
+    };
+
+    this.closeConditionalPanel = () => {
+      return this.props.closeConditionalPanel();
+    };
+
     this.pendingJumpLocation = null;
     this.lastJumpLine = null;
 
     this.state = {
       highlightedLineRange: null,
       editor: null
     };
-
-    var self = this;
-    self.closeConditionalPanel = this.closeConditionalPanel.bind(this);
-    self.onEscape = this.onEscape.bind(this);
-    self.onGutterClick = this.onGutterClick.bind(this);
-    self.onGutterContextMenu = this.onGutterContextMenu.bind(this);
-    self.onSearchAgain = this.onSearchAgain.bind(this);
-    self.onToggleBreakpoint = this.onToggleBreakpoint.bind(this);
-    self.toggleConditionalPanel = this.toggleConditionalPanel.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
-    this.setSize(nextProps);
-    this.setText(nextProps);
     (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
   }
 
   setupEditor() {
     var editor = (0, _editor.createEditor)();
 
     // disables the default search shortcuts
 
@@ -22970,42 +23196,49 @@ class Editor extends _react.PureComponen
       }
     };
 
     var codeMirrorGutter = codeMirror.getGutterElement();
     codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
     codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
 
     if (!(0, _devtoolsConfig.isFirefox)()) {
-      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
-
-      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, editor));
-    } else {
-      codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, editor));
+      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => {
+        event.stopPropagation();
+        event.preventDefault();
+        return this.onGutterContextMenu(event);
+      });
+
+      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event));
+    } else {
+      codeMirrorWrapper.addEventListener("contextmenu", event => {
+        event.stopPropagation();
+        event.preventDefault();
+        return this.openMenu(event);
+      });
     }
 
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
-    this.cbPanel = null;
     var editor = this.setupEditor();
 
-    var _props = this.props,
-        selectedSource = _props.selectedSource,
-        selectedLocation = _props.selectedLocation;
+    var _props4 = this.props,
+        selectedSource = _props4.selectedSource,
+        selectedLocation = _props4.selectedLocation;
     var shortcuts = this.context.shortcuts;
 
 
     var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
 
     shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint);
-    shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.onToggleBreakpoint);
+    shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.toggleConditionalPanel);
     shortcuts.on("Esc", this.onEscape);
     shortcuts.on(searchAgainPrevKey, this.onSearchAgain);
     shortcuts.on(searchAgainKey, this.onSearchAgain);
 
     if (selectedLocation && !!selectedLocation.line) {
       this.pendingJumpLocation = selectedLocation;
     }
 
@@ -23021,23 +23254,28 @@ class Editor extends _react.PureComponen
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
     var shortcuts = this.context.shortcuts;
     shortcuts.off(L10N.getStr("toggleBreakpoint.key"));
     shortcuts.off(L10N.getStr("toggleCondPanel.key"));
     shortcuts.off(searchAgainPrevKey);
     shortcuts.off(searchAgainKey);
   }
 
+  componentWillUpdate(nextProps) {
+    this.setText(nextProps);
+    this.setSize(nextProps);
+  }
+
   componentDidUpdate(prevProps) {
     // This is in `componentDidUpdate` so helper functions can expect
     // `this.props` to be the current props. This lifecycle method is
     // responsible for updating the editor annotations.
-    var _props2 = this.props,
-        selectedLocation = _props2.selectedLocation,
-        selectedSource = _props2.selectedSource;
+    var _props5 = this.props,
+        selectedLocation = _props5.selectedLocation,
+        selectedSource = _props5.selectedSource;
 
     // If the location is different and a new line is requested,
     // update the pending jump line. Note that if jumping to a line in
     // a source where the text hasn't been loaded yet, we will set the
     // line here but not jump until rendering the actual source.
 
     if (prevProps.selectedLocation !== selectedLocation) {
       if (selectedLocation && selectedLocation.line != undefined) {
@@ -23046,41 +23284,17 @@ class Editor extends _react.PureComponen
         this.pendingJumpLocation = null;
       }
     }
 
     // Only update and jump around in real source texts. This will
     // keep the jump state around until the real source text is
     // loaded.
     if (selectedSource && selectedSource.has("text")) {
-      this.highlightLine();
-    }
-
-    if (this.props.conditionalBreakpointPanel !== null && this.cbPanel == null) {
-      this.toggleConditionalPanel(this.props.conditionalBreakpointPanel);
-    }
-  }
-
-  onToggleBreakpoint(key, e) {
-    e.preventDefault();
-    var codeMirror = this.state.editor.codeMirror;
-    var selectedSource = this.props.selectedSource;
-
-    var line = (0, _editor.getCursorLine)(codeMirror);
-
-    if (!selectedSource) {
-      return;
-    }
-
-    var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
-
-    if (e.shiftKey) {
-      this.toggleConditionalPanel(sourceLine);
-    } else {
-      this.props.toggleBreakpoint(sourceLine);
+      this.flashLine();
     }
   }
 
   onKeyDown(e) {
     var codeMirror = this.state.editor.codeMirror;
     var key = e.key,
         target = e.target;
 
@@ -23099,205 +23313,44 @@ class Editor extends _react.PureComponen
   }
 
   /*
    * The default Esc command is overridden in the CodeMirror keymap to allow
    * the Esc keypress event to be catched by the toolbox and trigger the
    * split console. Restore it here, but preventDefault if and only if there
    * is a multiselection.
    */
-  onEscape(key, e) {
-    if (!this.state.editor) {
-      return;
-    }
-
-    var codeMirror = this.state.editor.codeMirror;
-
-    if (codeMirror.listSelections().length > 1) {
-      codeMirror.execCommand("singleSelection");
-      e.preventDefault();
-    }
-  }
-
-  onSearchAgain(_, e) {
-    var _props3 = this.props,
-        query = _props3.query,
-        searchModifiers = _props3.searchModifiers;
-    var codeMirror = this.state.editor.editor.codeMirror;
-
-    var ctx = { ed: this.state.editor, cm: codeMirror };
-
-    var direction = e.shiftKey ? "prev" : "next";
-    (0, _editor.traverseResults)(e, ctx, query, direction, searchModifiers.toJS());
-  }
-
-  inSelectedFrameSource() {
-    var _props4 = this.props,
-        selectedLocation = _props4.selectedLocation,
-        selectedFrame = _props4.selectedFrame;
-
-    return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
-  }
-
-  openMenu(event, editor) {
-    var _props5 = this.props,
-        selectedSource = _props5.selectedSource,
-        selectedLocation = _props5.selectedLocation,
-        showSource = _props5.showSource,
-        jumpToMappedLocation = _props5.jumpToMappedLocation,
-        addExpression = _props5.addExpression,
-        toggleBlackBox = _props5.toggleBlackBox,
-        getFunctionText = _props5.getFunctionText;
-
-
-    return (0, _EditorMenu2.default)({
-      editor,
-      event,
-      selectedLocation,
-      selectedSource,
-      showSource,
-      jumpToMappedLocation,
-      addExpression,
-      toggleBlackBox,
-      getFunctionText,
-      onGutterContextMenu: this.onGutterContextMenu
-    });
-  }
-
-  onGutterClick(cm, line, gutter, ev) {
-    var _props6 = this.props,
-        selectedSource = _props6.selectedSource,
-        toggleBreakpoint = _props6.toggleBreakpoint,
-        addOrToggleDisabledBreakpoint = _props6.addOrToggleDisabledBreakpoint,
-        isEmptyLine = _props6.isEmptyLine,
-        continueToHere = _props6.continueToHere;
-
-    // ignore right clicks in the gutter
-
-    if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed")) {
-      return;
-    }
-
-    if (isEmptyLine(line)) {
-      return;
-    }
-
-    if (this.isCbPanelOpen()) {
-      return this.closeConditionalPanel();
-    }
-
-    if (!selectedSource) {
-      return;
-    }
-
-    if (gutter !== "CodeMirror-foldgutter") {
-      if (ev.altKey) {
-        continueToHere((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-      } else if (ev.shiftKey) {
-        addOrToggleDisabledBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-      } else {
-        toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-      }
-    }
-  }
-
-  onGutterContextMenu(event) {
-    var _props7 = this.props,
-        selectedSource = _props7.selectedSource,
-        breakpoints = _props7.breakpoints,
-        toggleBreakpoint = _props7.toggleBreakpoint,
-        toggleDisabledBreakpoint = _props7.toggleDisabledBreakpoint,
-        isEmptyLine = _props7.isEmptyLine,
-        pauseData = _props7.pauseData,
-        continueToHere = _props7.continueToHere;
-
-
-    if (selectedSource && selectedSource.get("isBlackBoxed")) {
-      event.preventDefault();
-      return;
-    }
-
-    var sourceId = selectedSource ? selectedSource.get("id") : "";
-    var line = (0, _editor.lineAtHeight)(this.state.editor, sourceId, event);
-    var breakpoint = breakpoints.find(bp => bp.location.line === line);
-
-    if (isEmptyLine(line - 1)) {
-      return;
-    }
-
-    (0, _GutterMenu2.default)({
-      event,
-      line,
-      breakpoint,
-      toggleBreakpoint,
-      toggleDisabledBreakpoint,
-      pauseData,
-      continueToHere,
-
-      showConditionalPanel: this.toggleConditionalPanel,
-      isCbPanelOpen: this.isCbPanelOpen(),
-      closeConditionalPanel: this.closeConditionalPanel
-    });
+
+
+  openMenu(event) {
+    var setContextMenu = this.props.setContextMenu;
+
+
+    if (event.target.classList.contains("CodeMirror-linenumber")) {
+      return setContextMenu("Gutter", event);
+    }
+
+    return setContextMenu("Editor", event);
   }
 
   onClick(e) {
-    var _props8 = this.props,
-        selectedLocation = _props8.selectedLocation,
-        jumpToMappedLocation = _props8.jumpToMappedLocation;
+    var _props6 = this.props,
+        selectedLocation = _props6.selectedLocation,
+        jumpToMappedLocation = _props6.jumpToMappedLocation;
 
 
     if (e.metaKey && e.altKey) {
       var sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(this.state.editor, selectedLocation, e);
       jumpToMappedLocation(sourceLocation);
     }
   }
 
-  toggleConditionalPanel(line) {
-    if (this.isCbPanelOpen()) {
-      return this.closeConditionalPanel();
-    }
-
-    var _props9 = this.props,
-        selectedLocation = _props9.selectedLocation,
-        setBreakpointCondition = _props9.setBreakpointCondition,
-        breakpoints = _props9.breakpoints;
-
-    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
-
-    var breakpoint = breakpoints.find(bp => bp.location.line === line);
-    var location = { sourceId, line };
-    var condition = breakpoint ? breakpoint.condition : "";
-
-    var panel = (0, _ConditionalPanel.renderConditionalPanel)({
-      condition,
-      setBreakpoint: value => setBreakpointCondition(location, { condition: value }),
-      closePanel: this.closeConditionalPanel
-    });
-
-    var editorLine = (0, _editor.toEditorLine)(sourceId, line);
-    this.cbPanel = this.state.editor.codeMirror.addLineWidget(editorLine, panel, {
-      coverGutter: true,
-      noHScroll: false
-    });
-    this.cbPanel.node.querySelector("input").focus();
-  }
-
-  closeConditionalPanel() {
-    this.props.toggleConditionalBreakpointPanel(null);
-    this.cbPanel.clear();
-    this.cbPanel = null;
-  }
-
-  isCbPanelOpen() {
-    return !!this.cbPanel;
-  }
-
   // If the location has changed and a specific line is requested,
   // move to that line and flash it.
-  highlightLine() {
+  flashLine() {
     if (!this.pendingJumpLocation) {
       return;
     }
 
     // Make sure to clean up after ourselves. Not only does this
     // cancel any existing animation, but it avoids it from
     // happening ever again (in case CodeMirror re-applies the
     // class, etc).
@@ -23329,58 +23382,55 @@ class Editor extends _react.PureComponen
       return;
     }
 
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
   }
 
-  setText(nextProps) {
+  setText(props) {
+    var selectedSource = props.selectedSource;
+
     if (!this.state.editor) {
       return;
     }
 
-    if (!nextProps.selectedSource) {
-      if (this.props.selectedSource) {
-        return this.showMessage("");
-      }
-
-      return;
-    }
-
-    if (!(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
-      return this.showMessage(L10N.getStr("loadingText"));
-    }
-
-    if (nextProps.selectedSource.get("error")) {
-      return this.showMessage(nextProps.selectedSource.get("error"));
-    }
-
-    if (nextProps.selectedSource !== this.props.selectedSource) {
-      return (0, _editor.showSourceText)(this.state.editor, nextProps.selectedSource.toJS());
+    if (!selectedSource) {
+      return this.showMessage("");
+    }
+
+    if (!(0, _source.isLoaded)(selectedSource.toJS())) {
+      return (0, _editor.showLoading)(this.state.editor);
+    }
+
+    if (selectedSource.get("error")) {
+      return this.showMessage(selectedSource.get("error"));
+    }
+
+    if (selectedSource) {
+      return (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS());
     }
   }
 
   showMessage(msg) {
-    if (!this.state.editor) {
-      return;
-    }
-
-    this.state.editor.replaceDocument(this.state.editor.createDocument());
-    this.state.editor.setText(msg);
-    this.state.editor.setMode({ name: "text" });
-    (0, _editor.resetLineNumberFormat)(this.state.editor);
+    var editor = this.state.editor;
+
+    if (!editor) {
+      return;
+    }
+
+    (0, _editor.resetLineNumberFormat)(editor);
   }
 
   getInlineEditorStyles() {
-    var _props10 = this.props,
-        selectedSource = _props10.selectedSource,
-        horizontal = _props10.horizontal,
-        searchOn = _props10.searchOn;
+    var _props7 = this.props,
+        selectedSource = _props7.selectedSource,
+        horizontal = _props7.horizontal,
+        searchOn = _props7.searchOn;
 
 
     var subtractions = [];
 
     if ((0, _editor.shouldShowFooter)(selectedSource, horizontal)) {
       subtractions.push(cssVars.footerHeight);
     }
 
@@ -23389,229 +23439,133 @@ class Editor extends _react.PureComponen
       subtractions.push(cssVars.secondSearchbarHeight);
     }
 
     return {
       height: subtractions.length === 0 ? "100%" : `calc(100% - ${subtractions.join(" - ")})`
     };
   }
 
-  renderHighlightLines() {
-    var highlightedLineRange = this.props.highlightedLineRange;
-
-
-    if (!highlightedLineRange || !this.state.editor) {
-      return;
-    }
-
-    return _react2.default.createElement(_HighlightLines2.default, {
-      editor: this.state.editor,
-      highlightedLineRange: highlightedLineRange
-    });
-  }
-
   renderHitCounts() {
-    var _props11 = this.props,
-        hitCount = _props11.hitCount,
-        selectedSource = _props11.selectedSource;
+    var _props8 = this.props,
+        hitCount = _props8.hitCount,
+        selectedSource = _props8.selectedSource;
 
 
     if (!selectedSource || !(0, _source.isLoaded)(selectedSource.toJS()) || !hitCount || !this.state.editor) {
       return;
     }
 
     return hitCount.filter(marker => marker.get("count") > 0).map(marker => _react2.default.createElement(_HitMarker2.default, {
       key: marker.get("line"),
       hitData: marker.toJS(),
       editor: this.state.editor.codeMirror
     }));
   }
 
-  renderPreview() {
-    var selectedSource = this.props.selectedSource;
-
-    if (!this.state.editor || !selectedSource) {
+  renderItems() {
+    var _props9 = this.props,
+        selectedSource = _props9.selectedSource,
+        horizontal = _props9.horizontal;
+    var editor = this.state.editor;
+
+
+    if (!editor || !selectedSource || !(0, _source.isLoaded)(selectedSource.toJS())) {
       return null;
     }
-
-    return _react2.default.createElement(_Preview2.default, { editor: this.state.editor });
-  }
-
-  renderCallSites() {
-    var editor = this.state.editor;
-
-    if (!editor || !(0, _devtoolsConfig.isEnabled)("columnBreakpoints")) {
-      return null;
-    }
-    return _react2.default.createElement(_CallSites2.default, { editor: editor });
+    return _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(_DebugLine2.default, { editor: editor }),
+      _react2.default.createElement(_EmptyLines2.default, { editor: editor }),
+      _react2.default.createElement(_Breakpoints2.default, { editor: editor }),
+      _react2.default.createElement(_CallSites2.default, { editor: editor }),
+      _react2.default.createElement(_Preview2.default, { editor: editor }),
+      ";",
+      _react2.default.createElement(_Footer2.default, { editor: editor, horizontal: horizontal }),
+      _react2.default.createElement(_HighlightLines2.default, { editor: editor }),
+      _react2.default.createElement(_EditorMenu2.default, { editor: editor }),
+      _react2.default.createElement(_GutterMenu2.default, { editor: editor }),
+      _react2.default.createElement(_ConditionalPanel2.default, { editor: editor }),
+      this.renderHitCounts()
+    );
   }
 
   renderSearchBar() {
-    var _props12 = this.props,
-        selectSource = _props12.selectSource,
-        selectedSource = _props12.selectedSource,
-        highlightLineRange = _props12.highlightLineRange,
-        clearHighlightLineRange = _props12.clearHighlightLineRange;
-
-
-    if (!this.state.editor) {
-      return null;
-    }
-
-    return _react2.default.createElement(_SearchBar2.default, {
-      editor: this.state.editor,
-      selectSource: selectSource,
-      selectedSource: selectedSource,
-      highlightLineRange: highlightLineRange,
-      clearHighlightLineRange: clearHighlightLineRange
-    });
-  }
-
-  renderFooter() {
-    var horizontal = this.props.horizontal;
-
-
-    if (!this.state.editor) {
-      return null;
-    }
-    return _react2.default.createElement(_Footer2.default, { editor: this.state.editor, horizontal: horizontal });
-  }
-
-  renderBreakpoints() {
-    if (!this.state.editor) {
+    var editor = this.state.editor;
+
+
+    if (!editor) {
       return null;
     }
 
-    return _react2.default.createElement(_Breakpoints2.default, { editor: this.state.editor });
-  }
-
-  renderEmptyLines() {
-    if (!this.state.editor) {
-      return null;
-    }
-
-    return _react2.default.createElement(_EmptyLines2.default, { editor: this.state.editor });
-  }
-
-  renderDebugLine() {
-    var editor = this.state.editor;
-    var _props13 = this.props,
-        selectedLocation = _props13.selectedLocation,
-        selectedFrame = _props13.selectedFrame;
-
-    if (!editor || !selectedLocation || !selectedFrame || !selectedLocation.line || selectedFrame.location.sourceId !== selectedLocation.sourceId) {
-      return null;
-    }
-
-    return _react2.default.createElement(_DebugLine2.default, {
-      editor: editor,
-      selectedFrame: selectedFrame,
-      selectedLocation: selectedLocation
-    });
-  }
-
-  render() {
-    var _props14 = this.props,
-        coverageOn = _props14.coverageOn,
-        pauseData = _props14.pauseData;
+    return _react2.default.createElement(_SearchBar2.default, { editor: editor });
+  }
+
+  render() {
+    var coverageOn = this.props.coverageOn;
 
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("editor-wrapper", {
-          "coverage-on": coverageOn,
-          paused: !!pauseData && (0, _devtoolsConfig.isEnabled)("highlightScopeLines")
+          "coverage-on": coverageOn
         })
       },
       this.renderSearchBar(),
       _react2.default.createElement("div", {
         className: "editor-mount devtools-monospace",
         style: this.getInlineEditorStyles()
       }),
-      this.renderHighlightLines(),
-      this.renderHitCounts(),
-      this.renderFooter(),
-      this.renderPreview(),
-      this.renderCallSites(),
-      this.renderDebugLine(),
-      this.renderBreakpoints(),
-      this.renderEmptyLines()
+      this.renderItems()
     );
   }
 }
 
 Editor.propTypes = {
-  breakpoints: _reactImmutableProptypes2.default.map,
-  hitCount: _react.PropTypes.object,
-  selectedLocation: _react.PropTypes.object,
+  hitCount: _propTypes2.default.object,
+  selectedLocation: _propTypes2.default.object,
   selectedSource: _reactImmutableProptypes2.default.map,
-  highlightLineRange: _react.PropTypes.func,
-  clearHighlightLineRange: _react.PropTypes.func,
-  highlightedLineRange: _react.PropTypes.object,
-  searchOn: _react.PropTypes.bool,
-  addBreakpoint: _react.PropTypes.func.isRequired,
-  disableBreakpoint: _react.PropTypes.func.isRequired,
-  enableBreakpoint: _react.PropTypes.func.isRequired,
-  removeBreakpoint: _react.PropTypes.func.isRequired,
-  setBreakpointCondition: _react.PropTypes.func.isRequired,
-  selectSource: _react.PropTypes.func,
-  jumpToMappedLocation: _react.PropTypes.func,
-  toggleBlackBox: _react.PropTypes.func,
-  showSource: _react.PropTypes.func,
-  coverageOn: _react.PropTypes.bool,
-  pauseData: _react.PropTypes.object,
-  selectedFrame: _react.PropTypes.object,
-  addExpression: _react.PropTypes.func.isRequired,
-  horizontal: _react.PropTypes.bool,
-  query: _react.PropTypes.string.isRequired,
-  searchModifiers: _reactImmutableProptypes2.default.recordOf({
-    caseSensitive: _react.PropTypes.bool.isRequired,
-    regexMatch: _react.PropTypes.bool.isRequired,
-    wholeWord: _react.PropTypes.bool.isRequired
-  }).isRequired,
-  startPanelSize: _react.PropTypes.number,
-  endPanelSize: _react.PropTypes.number,
-  linesInScope: _react.PropTypes.array,
-  toggleBreakpoint: _react.PropTypes.func.isRequired,
-  addOrToggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
-  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
-  conditionalBreakpointPanel: _react.PropTypes.number,
-  toggleConditionalBreakpointPanel: _react.PropTypes.func.isRequired,
-  isEmptyLine: _react.PropTypes.func,
-  continueToHere: _react.PropTypes.func,
-  getFunctionText: _react.PropTypes.func
+  searchOn: _propTypes2.default.bool,
+  addOrToggleDisabledBreakpoint: _propTypes2.default.func,
+  toggleBreakpoint: _propTypes2.default.func,
+  selectSource: _propTypes2.default.func,
+  jumpToMappedLocation: _propTypes2.default.func,
+  coverageOn: _propTypes2.default.bool,
+  selectedFrame: _propTypes2.default.object,
+  searchModifiers: _propTypes2.default.object,
+  query: _propTypes2.default.string,
+  horizontal: _propTypes2.default.bool,
+  startPanelSize: _propTypes2.default.number,
+  endPanelSize: _propTypes2.default.number,
+  conditionalPanelLine: _propTypes2.default.number,
+  openConditionalPanel: _propTypes2.default.func,
+  closeConditionalPanel: _propTypes2.default.func,
+  continueToHere: _propTypes2.default.func,
+  setContextMenu: _propTypes2.default.func
 };
 
 Editor.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
-  var selectedLocation = (0, _selectors.getSelectedLocation)(state);
-  var sourceId = selectedLocation && selectedLocation.sourceId;
   var selectedSource = (0, _selectors.getSelectedSource)(state);
-
-  return {
-    selectedLocation,
+  var sourceId = selectedSource ? selectedSource.get("id") : "";
+  return {
+    selectedLocation: (0, _selectors.getSelectedLocation)(state),
     selectedSource,
-    highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state),
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
-    loadedObjects: (0, _selectors.getLoadedObjects)(state),
-    breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
     hitCount: (0, _selectors.getHitCountForSource)(state, sourceId),
     selectedFrame: (0, _selectors.getSelectedFrame)(state),
-    pauseData: (0, _selectors.getPause)(state),
+    query: (0, _selectors.getFileSearchQueryState)(state),
+    modifiers: (0, _selectors.getFileSearchModifierState)(state),
     coverageOn: (0, _selectors.getCoverageEnabled)(state),
-    query: (0, _selectors.getFileSearchQueryState)(state),
-    searchModifiers: (0, _selectors.getFileSearchModifierState)(state),
-    linesInScope: (0, _selectors.getInScopeLines)(state),
-    getFunctionText: line => (0, _function.findFunctionText)(line, selectedSource.toJS(), (0, _selectors.getSymbols)(state, selectedSource.toJS())),
-    isEmptyLine: line => (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS()),
-    conditionalBreakpointPanel: (0, _selectors.getConditionalBreakpointPanel)(state)
+    conditionalPanelLine: (0, _selectors.getConditionalPanelLine)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Editor);
 
 /***/ }),
 /* 427 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -23648,17 +23602,17 @@ var _devtoolsConfig = __webpack_require_
 var _source = __webpack_require__(233);
 
 var _editor = __webpack_require__(257);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(875);
+__webpack_require__(1248);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceFooter extends _react.PureComponent {
 
   prettyPrintButton() {
     var _props = this.props,
         selectedSource = _props.selectedSource,
@@ -23827,17 +23781,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(874);
+__webpack_require__(1247);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
     var _props = this.props,
         collapsed = _props.collapsed,
@@ -23883,16 +23837,20 @@ exports.default = PaneToggleButton;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactRedux = __webpack_require__(1189);
 
@@ -23905,33 +23863,33 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _editor = __webpack_require__(257);
 
-var _search = __webpack_require__(1115);
+var _search = __webpack_require__(1210);
 
 var _resultList = __webpack_require__(343);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _lodash = __webpack_require__(2);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(876);
+__webpack_require__(1249);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function getShortcuts() {
   var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
   var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
@@ -23942,38 +23900,259 @@ function getShortcuts() {
     searchAgainShortcut: searchAgainKey,
     searchShortcut: searchKey
   };
 }
 
 class SearchBar extends _react.Component {
 
   constructor(props) {
-    super(props);
+    var _this;
+
+    _this = super(props);
+
+    this.onEscape = e => {
+      this.closeSearch(e);
+    };
+
+    this.clearSearch = () => {
+      var _props = this.props,
+          ed = _props.editor,
+          query = _props.query,
+          modifiers = _props.modifiers;
+
+      if (ed && modifiers) {
+        var ctx = { ed, cm: ed.codeMirror };
+        (0, _editor.removeOverlay)(ctx, query, modifiers.toJS());
+      }
+    };
+
+    this.closeSearch = e => {
+      var _props2 = this.props,
+          editor = _props2.editor,
+          setFileSearchQuery = _props2.setFileSearchQuery,
+          searchOn = _props2.searchOn;
+
+
+      if (editor && searchOn) {
+        setFileSearchQuery("");
+        this.clearSearch();
+        this.props.setActiveSearch();
+        this.props.clearHighlightLineRange();
+        e.stopPropagation();
+        e.preventDefault();
+      }
+    };
+
+    this.toggleSearch = e => {
+      e.stopPropagation();
+      e.preventDefault();
+      var editor = this.props.editor;
+
+
+      if (!this.props.searchOn) {
+        this.props.setActiveSearch("file");
+      }
+
+      if (this.props.searchOn && editor) {
+        var selection = editor.codeMirror.getSelection();
+        this.setSearchValue(selection);
+        if (selection !== "") {
+          this.doSearch(selection);
+        }
+        this.selectSearchInput();
+      }
+    };
+
+    this.setSearchValue = value => {
+      var searchInput = this.searchInput();
+      if (value == "" || !searchInput) {
+        return;
+      }
+
+      searchInput.value = value;
+    };
+
+    this.selectSearchInput = () => {
+      var searchInput = this.searchInput();
+      if (searchInput) {
+        searchInput.setSelectionRange(0, searchInput.value.length);
+        searchInput.focus();
+      }
+    };
+
+    this.searchInput = () => {
+      var node = (0, _reactDom.findDOMNode)(this);
+      if (node instanceof HTMLElement) {
+        var input = node.querySelector("input");
+        if (input instanceof HTMLInputElement) {
+          return input;
+        }
+      }
+      return null;
+    };
+
+    this.doSearch = query => {
+      var _props3 = this.props,
+          selectedSource = _props3.selectedSource,
+          setFileSearchQuery = _props3.setFileSearchQuery;
+
+      if (!selectedSource || !selectedSource.get("text")) {
+        return;
+      }
+
+      setFileSearchQuery(query);
+
+      this.searchContents(query);
+    };
+
+    this.updateSearchResults = (characterIndex, line, matches) => {
+      var matchIndex = matches.findIndex(elm => elm.line === line && elm.ch === characterIndex);
+      this.props.updateSearchResults({
+        matches,
+        matchIndex,
+        count: matches.length,
+        index: characterIndex
+      });
+    };
+
+    this.searchContents = (() => {
+      var _ref = _asyncToGenerator(function* (query) {
+        var _props4 = _this.props,
+            selectedSource = _props4.selectedSource,
+            modifiers = _props4.modifiers,
+            ed = _props4.editor;
+
+
+        if (!query || !ed || !selectedSource || !selectedSource.get("text") || !modifiers) {
+          return;
+        }
+
+        var ctx = { ed, cm: ed.codeMirror };
+
+        var _modifiers = modifiers.toJS();
+        var matches = yield (0, _search.getMatches)(query, selectedSource.get("text"), _modifiers);
+
+        var _find = (0, _editor.find)(ctx, query, true, _modifiers),
+            ch = _find.ch,
+            line = _find.line;
+
+        _this.updateSearchResults(ch, line, matches);
+      });
+
+      return function (_x) {
+        return _ref.apply(this, arguments);
+      };
+    })();
+
+    this.traverseResults = (e, rev) => {
+      e.stopPropagation();
+      e.preventDefault();
+      var ed = this.props.editor;
+
+      if (!ed) {
+        return;
+      }
+
+      var ctx = { ed, cm: ed.codeMirror };
+
+      var _props5 = this.props,
+          query = _props5.query,
+          modifiers = _props5.modifiers,
+          matches = _props5.searchResults.matches;
+
+
+      if (query === "") {
+        this.props.setActiveSearch("file");
+      }
+
+      if (modifiers) {
+        var matchedLocations = matches || [];
+
+        var _ref2 = rev ? (0, _editor.findPrev)(ctx, query, true, modifiers.toJS()) : (0, _editor.findNext)(ctx, query, true, modifiers.toJS()),
+            ch = _ref2.ch,
+            line = _ref2.line;
+
+        this.updateSearchResults(ch, line, matchedLocations);
+      }
+    };
+
+    this.onChange = e => {
+      return this.doSearch(e.target.value);
+    };
+
+    this.onKeyUp = e => {
+      if (e.key !== "Enter" && e.key !== "F3") {
+        return;
+      }
+
+      this.traverseResults(e, e.shiftKey);
+      e.preventDefault();
+    };
+
+    this.renderSearchModifiers = () => {
+      var _props6 = this.props,
+          modifiers = _props6.modifiers,
+          toggleFileSearchModifier = _props6.toggleFileSearchModifier;
+
+
+      function SearchModBtn(_ref3) {
+        var modVal = _ref3.modVal,
+            className = _ref3.className,
+            svgName = _ref3.svgName,
+            tooltip = _ref3.tooltip;
+
+        var preppedClass = (0, _classnames2.default)(className, {
+          active: modifiers && modifiers.get(modVal)
+        });
+        return _react2.default.createElement(
+          "button",
+          {
+            className: preppedClass,
+            onClick: () => toggleFileSearchModifier(modVal),
+            title: tooltip
+          },
+          _react2.default.createElement(_Svg2.default, { name: svgName })
+        );
+      }
+
+      return _react2.default.createElement(
+        "div",
+        { className: "search-modifiers" },
+        _react2.default.createElement(
+          "span",
+          { className: "search-type-name" },
+          L10N.getStr("symbolSearch.searchModifier.modifiersLabel")
+        ),
+        _react2.default.createElement(SearchModBtn, {
+          modVal: "regexMatch",
+          className: "regex-match-btn",
+          svgName: "regex-match",
+          tooltip: L10N.getStr("symbolSearch.searchModifier.regex")
+        }),
+        _react2.default.createElement(SearchModBtn, {
+          modVal: "caseSensitive",
+          className: "case-sensitive-btn",
+          svgName: "case-match",
+          tooltip: L10N.getStr("symbolSearch.searchModifier.caseSensitive")
+        }),
+        _react2.default.createElement(SearchModBtn, {
+          modVal: "wholeWord",
+          className: "whole-word-btn",
+          svgName: "whole-word-match",
+          tooltip: L10N.getStr("symbolSearch.searchModifier.wholeWord")
+        })
+      );
+    };
+
     this.state = {
       selectedResultIndex: 0,
       count: 0,
       index: -1
     };
-
-    var self = this;
-    self.onEscape = this.onEscape.bind(this);
-    self.clearSearch = this.clearSearch.bind(this);
-    self.closeSearch = this.closeSearch.bind(this);
-    self.toggleSearch = this.toggleSearch.bind(this);
-    self.setSearchValue = this.setSearchValue.bind(this);
-    self.selectSearchInput = this.selectSearchInput.bind(this);
-    self.searchInput = this.searchInput.bind(this);
-    self.doSearch = this.doSearch.bind(this);
-    self.searchContents = this.searchContents.bind(this);
-    self.traverseResults = this.traverseResults.bind(this);
-    self.onChange = this.onChange.bind(this);
-    self.onKeyUp = this.onKeyUp.bind(this);
-    self.buildSummaryMsg = this.buildSummaryMsg.bind(this);
-    self.renderSearchModifiers = this.renderSearchModifiers.bind(this);
   }
 
   componentWillUnmount() {
     var shortcuts = this.context.shortcuts;
 
     var _getShortcuts = getShortcuts(),
         searchShortcut = _getShortcuts.searchShortcut,
         searchAgainShortcut = _getShortcuts.searchAgainShortcut,
@@ -23983,17 +24162,16 @@ class SearchBar extends _react.Component
     shortcuts.off("Escape");
     shortcuts.off(searchAgainShortcut);
     shortcuts.off(shiftSearchAgainShortcut);
   }
 
   componentDidMount() {
     // overwrite searchContents with a debounced version to reduce the
     // frequency of queries which improves perf on large files
-    // $FlowIgnore
     this.searchContents = (0, _lodash.debounce)(this.searchContents, 100);
 
     var shortcuts = this.context.shortcuts;
 
     var _getShortcuts2 = getShortcuts(),
         searchShortcut = _getShortcuts2.searchShortcut,
         searchAgainShortcut = _getShortcuts2.searchAgainShortcut,
         shiftSearchAgainShortcut = _getShortcuts2.shiftSearchAgainShortcut;
@@ -24013,202 +24191,26 @@ class SearchBar extends _react.Component
       searchInput.focus();
     }
 
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedResultIndex);
     }
   }
 
-  onEscape(e) {
-    this.closeSearch(e);
-  }
-
-  clearSearch() {
-    var _props = this.props,
-        ed = _props.editor,
-        query = _props.query,
-        modifiers = _props.modifiers;
-
-    if (ed && modifiers) {
-      var ctx = { ed, cm: ed.codeMirror };
-      (0, _editor.removeOverlay)(ctx, query, modifiers.toJS());
-    }
-  }
-
-  closeSearch(e) {
-    var _props2 = this.props,
-        editor = _props2.editor,
-        setFileSearchQuery = _props2.setFileSearchQuery,
-        searchOn = _props2.searchOn;
-
-
-    if (editor && searchOn) {
-      setFileSearchQuery("");
-      this.clearSearch();
-      this.props.setActiveSearch();
-      this.props.clearHighlightLineRange();
-      e.stopPropagation();
-      e.preventDefault();
-    }
-  }
-
-  toggleSearch(e) {
-    e.stopPropagation();
-    e.preventDefault();
-    var editor = this.props.editor;
-
-
-    if (!this.props.searchOn) {
-      this.props.setActiveSearch("file");
-    }
-
-    if (this.props.searchOn && editor) {
-      var selection = editor.codeMirror.getSelection();
-      this.setSearchValue(selection);
-      if (selection !== "") {
-        this.doSearch(selection);
-      }
-      this.selectSearchInput();
-    }
-  }
-
-  setSearchValue(value) {
-    var searchInput = this.searchInput();
-    if (value == "" || !searchInput) {
-      return;
-    }
-
-    searchInput.value = value;
-  }
-
-  selectSearchInput() {
-    var searchInput = this.searchInput();
-    if (searchInput) {
-      searchInput.setSelectionRange(0, searchInput.value.length);
-      searchInput.focus();
-    }
-  }
-
-  searchInput() {
-    var node = (0, _reactDom.findDOMNode)(this);
-    if (node instanceof HTMLElement) {
-      var input = node.querySelector("input");
-      if (input instanceof HTMLInputElement) {
-        return input;
-      }
-    }
-    return null;
-  }
-
-  doSearch(query) {
-    var _props3 = this.props,
-        selectedSource = _props3.selectedSource,
-        setFileSearchQuery = _props3.setFileSearchQuery;
-
-    if (!selectedSource || !selectedSource.get("text")) {
-      return;
-    }
-
-    setFileSearchQuery(query);
-
-    this.searchContents(query);
-  }
-
-  updateSearchResults(characterIndex, line, matches) {
-    var matchIndex = matches.findIndex(elm => elm.line === line && elm.ch === characterIndex);
-    this.props.updateSearchResults({
-      matches,
-      matchIndex,
-      count: matches.length,
-      index: characterIndex
-    });
-  }
-
-  searchContents(query) {
-    var _this = this;
-
-    return _asyncToGenerator(function* () {
-      var _props4 = _this.props,
-          selectedSource = _props4.selectedSource,
-          modifiers = _props4.modifiers,
-          ed = _props4.editor;
-
-
-      if (!query || !ed || !selectedSource || !selectedSource.get("text") || !modifiers) {
-        return;
-      }
-
-      var ctx = { ed, cm: ed.codeMirror };
-
-      var _modifiers = modifiers.toJS();
-      var matches = yield (0, _search.getMatches)(query, selectedSource.get("text"), _modifiers);
-
-      var _find = (0, _editor.find)(ctx, query, true, _modifiers),
-          ch = _find.ch,
-          line = _find.line;
-
-      _this.updateSearchResults(ch, line, matches);
-    })();
-  }
-
-  traverseResults(e, rev) {
-    e.stopPropagation();
-    e.preventDefault();
-    var ed = this.props.editor;
-
-    if (!ed) {
-      return;
-    }
-
-    var ctx = { ed, cm: ed.codeMirror };
-
-    var _props5 = this.props,
-        query = _props5.query,
-        modifiers = _props5.modifiers,
-        matches = _props5.searchResults.matches;
-
-
-    if (query === "") {
-      this.props.setActiveSearch("file");
-    }
-
-    if (modifiers) {
-      var matchedLocations = matches || [];
-
-      var _ref = rev ? (0, _editor.findPrev)(ctx, query, true, modifiers.toJS()) : (0, _editor.findNext)(ctx, query, true, modifiers.toJS()),
-          ch = _ref.ch,
-          line = _ref.line;
-
-      this.updateSearchResults(ch, line, matchedLocations);
-    }
-  }
-
   // Handlers
 
-  onChange(e) {
-    return this.doSearch(e.target.value);
-  }
-
-  onKeyUp(e) {
-    if (e.key !== "Enter" && e.key !== "F3") {
-      return;
-    }
-
-    this.traverseResults(e, e.shiftKey);
-    e.preventDefault();
-  }
   // Renderers
   buildSummaryMsg() {
-    var _props6 = this.props,
-        _props6$searchResults = _props6.searchResults,
-        matchIndex = _props6$searchResults.matchIndex,
-        count = _props6$searchResults.count,
-        index = _props6$searchResults.index,
-        query = _props6.query;
+    var _props7 = this.props,
+        _props7$searchResults = _props7.searchResults,
+        matchIndex = _props7$searchResults.matchIndex,
+        count = _props7$searchResults.count,
+        index = _props7$searchResults.index,
+        query = _props7.query;
 
 
     if (query.trim() == "") {
       return "";
     }
 
     if (count == 0) {
       return L10N.getStr("editor.noResults");
@@ -24216,71 +24218,16 @@ class SearchBar extends _react.Component
 
     if (index == -1) {
       return L10N.getFormatStr("sourceSearch.resultsSummary1", count);
     }
 
     return L10N.getFormatStr("editor.searchResults", matchIndex + 1, count);
   }
 
-  renderSearchModifiers() {
-    var _props7 = this.props,
-        modifiers = _props7.modifiers,
-        toggleFileSearchModifier = _props7.toggleFileSearchModifier;
-
-
-    function SearchModBtn(_ref2) {
-      var modVal = _ref2.modVal,
-          className = _ref2.className,
-          svgName = _ref2.svgName,
-          tooltip = _ref2.tooltip;
-
-      var preppedClass = (0, _classnames2.default)(className, {
-        active: modifiers && modifiers.get(modVal)
-      });
-      return _react2.default.createElement(
-        "button",
-        {
-          className: preppedClass,
-          onClick: () => toggleFileSearchModifier(modVal),
-          title: tooltip
-        },
-        _react2.default.createElement(_Svg2.default, { name: svgName })
-      );
-    }
-
-    return _react2.default.createElement(
-      "div",
-      { className: "search-modifiers" },
-      _react2.default.createElement(
-        "span",
-        { className: "search-type-name" },
-        L10N.getStr("symbolSearch.searchModifier.modifiersLabel")
-      ),
-      _react2.default.createElement(SearchModBtn, {
-        modVal: "regexMatch",
-        className: "regex-match-btn",
-        svgName: "regex-match",
-        tooltip: L10N.getStr("symbolSearch.searchModifier.regex")
-      }),
-      _react2.default.createElement(SearchModBtn, {
-        modVal: "caseSensitive",
-        className: "case-sensitive-btn",
-        svgName: "case-match",
-        tooltip: L10N.getStr("symbolSearch.searchModifier.caseSensitive")
-      }),
-      _react2.default.createElement(SearchModBtn, {
-        modVal: "wholeWord",
-        className: "whole-word-btn",
-        svgName: "whole-word-match",
-        tooltip: L10N.getStr("symbolSearch.searchModifier.wholeWord")
-      })
-    );
-  }
-
   renderSearchType() {
     return _react2.default.createElement(
       "div",
       { className: "search-type-toggles" },
       _react2.default.createElement(
         "span",
         {
           className: "search-type-name",
@@ -24322,24 +24269,27 @@ class SearchBar extends _react.Component
         this.renderSearchType(),
         this.renderSearchModifiers()
       )
     );
   }
 }
 
 SearchBar.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
+    selectedSource: (0, _selectors.getSelectedSource)(state),
+    selectedLocation: (0, _selectors.getSelectedLocation)(state),
     query: (0, _selectors.getFileSearchQueryState)(state),
     modifiers: (0, _selectors.getFileSearchModifierState)(state),
+    highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state),
     searchResults: (0, _selectors.getSearchResults)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SearchBar);
 
 /***/ }),
 /* 434 */,
 /* 435 */,
 /* 436 */,
@@ -24552,264 +24502,61 @@ exports.default = (0, _reactRedux.connec
 /* 643 */,
 /* 644 */,
 /* 645 */,
 /* 646 */,
 /* 647 */,
 /* 648 */,
 /* 649 */,
 /* 650 */,
-/* 651 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var isObject = __webpack_require__(84),
-    now = __webpack_require__(652),
-    toNumber = __webpack_require__(304);
-
-/** Error message constants. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
-    nativeMin = Math.min;
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- *  Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- *  The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- *  Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- *   'leading': true,
- *   'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
-function debounce(func, wait, options) {
-  var lastArgs,
-      lastThis,
-      maxWait,
-      result,
-      timerId,
-      lastCallTime,
-      lastInvokeTime = 0,
-      leading = false,
-      maxing = false,
-      trailing = true;
-
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  wait = toNumber(wait) || 0;
-  if (isObject(options)) {
-    leading = !!options.leading;
-    maxing = 'maxWait' in options;
-    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
-    trailing = 'trailing' in options ? !!options.trailing : trailing;
-  }
-
-  function invokeFunc(time) {
-    var args = lastArgs,
-        thisArg = lastThis;
-
-    lastArgs = lastThis = undefined;
-    lastInvokeTime = time;
-    result = func.apply(thisArg, args);
-    return result;
-  }
-
-  function leadingEdge(time) {
-    // Reset any `maxWait` timer.
-    lastInvokeTime = time;
-    // Start the timer for the trailing edge.
-    timerId = setTimeout(timerExpired, wait);
-    // Invoke the leading edge.
-    return leading ? invokeFunc(time) : result;
-  }
-
-  function remainingWait(time) {
-    var timeSinceLastCall = time - lastCallTime,
-        timeSinceLastInvoke = time - lastInvokeTime,
-        result = wait - timeSinceLastCall;
-
-    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
-  }
-
-  function shouldInvoke(time) {
-    var timeSinceLastCall = time - lastCallTime,
-        timeSinceLastInvoke = time - lastInvokeTime;
-
-    // Either this is the first call, activity has stopped and we're at the
-    // trailing edge, the system time has gone backwards and we're treating
-    // it as the trailing edge, or we've hit the `maxWait` limit.
-    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
-      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
-  }
-
-  function timerExpired() {
-    var time = now();
-    if (shouldInvoke(time)) {
-      return trailingEdge(time);
-    }
-    // Restart the timer.
-    timerId = setTimeout(timerExpired, remainingWait(time));
-  }
-
-  function trailingEdge(time) {
-    timerId = undefined;
-
-    // Only invoke if we have `lastArgs` which means `func` has been
-    // debounced at least once.
-    if (trailing && lastArgs) {
-      return invokeFunc(time);
-    }
-    lastArgs = lastThis = undefined;
-    return result;
-  }
-
-  function cancel() {
-    if (timerId !== undefined) {
-      clearTimeout(timerId);
-    }
-    lastInvokeTime = 0;
-    lastArgs = lastCallTime = lastThis = timerId = undefined;
-  }
-
-  function flush() {
-    return timerId === undefined ? result : trailingEdge(now());
-  }
-
-  function debounced() {
-    var time = now(),
-        isInvoking = shouldInvoke(time);
-
-    lastArgs = arguments;
-    lastThis = this;
-    lastCallTime = time;
-
-    if (isInvoking) {
-      if (timerId === undefined) {
-        return leadingEdge(lastCallTime);
-      }
-      if (maxing) {
-        // Handle invocations in a tight loop.
-        timerId = setTimeout(timerExpired, wait);
-        return invokeFunc(lastCallTime);
-      }
-    }
-    if (timerId === undefined) {
-      timerId = setTimeout(timerExpired, wait);
-    }
-    return result;
-  }
-  debounced.cancel = cancel;
-  debounced.flush = flush;
-  return debounced;
-}
-
-module.exports = debounce;
-
-
-/***/ }),
-/* 652 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var root = __webpack_require__(8);
-
-/**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- *   console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
-var now = function() {
-  return root.Date.now();
-};
-
-module.exports = now;
-
-
-/***/ }),
+/* 651 */,
+/* 652 */,
 /* 653 */,
 /* 654 */,
 /* 655 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-exports.default = GutterMenu;
+exports.gutterMenu = gutterMenu;
+
+var _react = __webpack_require__(0);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
-function GutterMenu(_ref) {
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(1189);
+
+var _editor = __webpack_require__(257);
+
+var _selectors = __webpack_require__(242);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
+
+function gutterMenu(_ref) {
   var breakpoint = _ref.breakpoint,
       line = _ref.line,
       event = _ref.event,
       pauseData = _ref.pauseData,
       toggleBreakpoint = _ref.toggleBreakpoint,
-      showConditionalPanel = _ref.showConditionalPanel,
+      openConditionalPanel = _ref.openConditionalPanel,
       toggleDisabledBreakpoint = _ref.toggleDisabledBreakpoint,
       isCbPanelOpen = _ref.isCbPanelOpen,
       closeConditionalPanel = _ref.closeConditionalPanel,
       continueToHere = _ref.continueToHere;
 
   event.stopPropagation();
   event.preventDefault();
 
@@ -24853,17 +24600,17 @@ function GutterMenu(_ref) {
         closeConditionalPanel();
       }
     }
   }, breakpoint ? gutterItems.removeBreakpoint : gutterItems.addBreakpoint);
 
   var conditionalBreakpoint = Object.assign({
     accesskey: "C",
     disabled: false,
-    click: () => showConditionalPanel(line)
+    click: () => openConditionalPanel(line)
   }, breakpoint && breakpoint.condition ? gutterItems.editConditional : gutterItems.addConditional);
 
   var items = [toggleBreakpointItem, conditionalBreakpoint];
 
   if (pauseData) {
     var continueToHereItem = _extends({
       accesskey: L10N.getStr("editor.continueToHere.accesskey"),
       disabled: false,
@@ -24879,57 +24626,96 @@ function GutterMenu(_ref) {
       click: () => toggleDisabledBreakpoint(line)
     }, breakpoint.disabled ? gutterItems.enableBreakpoint : gutterItems.disableBreakpoint);
     items.push(disableBreakpoint);
   }
 
   (0, _devtoolsLaunchpad.showMenu)(event, items);
 }
 
+class GutterContextMenuComponent extends _react.PureComponent {
+
+  constructor() {
+    super();
+  }
+
+  shouldComponentUpdate(nextProps) {
+    return nextProps.contextMenu.type === "Gutter";
+  }
+
+  componentWillUpdate(nextProps) {
+    // clear the context menu since it is open
+    this.props.setContextMenu("", null);
+    return this.showMenu(nextProps);
+  }
+
+  showMenu(nextProps) {
+    var contextMenu = nextProps.contextMenu,
+        props = _objectWithoutProperties(nextProps, ["contextMenu"]);
+
+    var event = contextMenu.event;
+
+    var sourceId = props.selectedSource ? props.selectedSource.get("id") : "";
+    var line = (0, _editor.lineAtHeight)(props.editor, sourceId, event);
+    var breakpoint = nextProps.breakpoints.find(bp => bp.location.line === line);
+
+    gutterMenu(_extends({ event, sourceId, line, breakpoint }, props));
+  }
+
+  render() {
+    return null;
+  }
+}
+
+exports.default = (0, _reactRedux.connect)(state => {
+  return {
+    selectedLocation: (0, _selectors.getSelectedLocation)(state),
+    selectedSource: (0, _selectors.getSelectedSource)(state),
+    breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
+    pauseData: (0, _selectors.getPause)(state),
+    contextMenu: (0, _selectors.getContextMenu)(state)
+  };
+}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(GutterContextMenuComponent);
+
 /***/ }),
 /* 656 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var EditorMenu = (() => {
-  var _ref2 = _asyncToGenerator(function* (options) {
-    var event = options.event,
-        onGutterContextMenu = options.onGutterContextMenu;
-
-
-    if (event.target.classList.contains("CodeMirror-linenumber")) {
-      return onGutterContextMenu(event);
-    }
-
-    event.stopPropagation();
-    event.preventDefault();
-
-    (0, _devtoolsLaunchpad.showMenu)(event, getMenuItems(event, options));
-  });
-
-  return function EditorMenu(_x) {
-    return _ref2.apply(this, arguments);
-  };
-})();
+var _react = __webpack_require__(0);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _clipboard = __webpack_require__(423);
 
 var _editor = __webpack_require__(257);
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(1189);
+
+var _function = __webpack_require__(1169);
+
+var _selectors = __webpack_require__(242);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
 
 function getMenuItems(event, _ref) {
   var editor = _ref.editor,
       selectedLocation = _ref.selectedLocation,
       selectedSource = _ref.selectedSource,
       showSource = _ref.showSource,
       onGutterContextMenu = _ref.onGutterContextMenu,
       jumpToMappedLocation = _ref.jumpToMappedLocation,
@@ -25021,17 +24807,55 @@ function getMenuItems(event, _ref) {
 
   if (textSelected) {
     menuItems.push(watchExpressionLabel);
   }
 
   return menuItems;
 }
 
-exports.default = EditorMenu;
+class EditorMenu extends _react.PureComponent {
+
+  constructor() {
+    super();
+  }
+
+  shouldComponentUpdate(nextProps) {
+    return nextProps.contextMenu.type === "Editor";
+  }
+
+  componentWillUpdate(nextProps) {
+    // clear the context menu since it is open
+    this.props.setContextMenu("", null);
+    return this.showMenu(nextProps);
+  }
+
+  showMenu(nextProps) {
+    var contextMenu = nextProps.contextMenu,
+        options = _objectWithoutProperties(nextProps, ["contextMenu"]);
+
+    var event = contextMenu.event;
+
+    (0, _devtoolsLaunchpad.showMenu)(event, getMenuItems(event, options));
+  }
+
+  render() {
+    return null;
+  }
+}
+
+exports.default = (0, _reactRedux.connect)(state => {
+  var selectedSource = (0, _selectors.getSelectedSource)(state);
+  return {
+    selectedLocation: (0, _selectors.getSelectedLocation)(state),
+    selectedSource,
+    contextMenu: (0, _selectors.getContextMenu)(state),
+    getFunctionText: line => (0, _function.findFunctionText)(line, selectedSource.toJS(), (0, _selectors.getSymbols)(state, selectedSource.toJS()))
+  };
+}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EditorMenu);
 
 /***/ }),
 /* 657 */,
 /* 658 */,
 /* 659 */,
 /* 660 */,
 /* 661 */,
 /* 662 */,
@@ -25101,21 +24925,22 @@ var _reactDom2 = _interopRequireDefault(
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _BracketArrow = __webpack_require__(1029);
 
 var _BracketArrow2 = _interopRequireDefault(_BracketArrow);
 
-__webpack_require__(880);
+__webpack_require__(1253);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Popover extends _react.Component {
+
   constructor() {
     super();
     this.onMouseLeave = this.onMouseLeave.bind(this);
     this.state = {
       left: 0,
       top: 0
     };
   }
@@ -25266,24 +25091,16 @@ class Popover extends _react.Component {
     if (type === "tooltip") {
       return this.renderTooltip();
     }
 
     return this.renderPopover();
   }
 }
 
-Popover.propTypes = {
-  target: _react.PropTypes.object,
-  targetPosition: _react.PropTypes.object,
-  children: _react.PropTypes.object,
-  onMouseLeave: _react.PropTypes.func,
-  type: _react.PropTypes.string
-};
-
 Popover.defaultProps = {
   onMouseLeave: () => {},
   type: "popover"
 };
 
 exports.default = Popover;
 
 /***/ }),
@@ -25303,87 +25120,157 @@ exports.default = Popover;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.renderConditionalPanel = undefined;
+exports.ConditionalPanel = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(1189);
+
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(873);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function renderConditionalPanel(_ref) {
-  var condition = _ref.condition,
-      closePanel = _ref.closePanel,
-      setBreakpoint = _ref.setBreakpoint;
-
-  var panel = document.createElement("div");
-  var input = null;
-
-  function setInput(node) {
-    input = node;
-  }
-
-  function saveAndClose() {
-    if (input) {
-      setBreakpoint(input.value);
-    }
-
-    closePanel();
-  }
-
-  function onKey(e) {
-    if (e.key === "Enter") {
-      saveAndClose();
-    } else if (e.key === "Escape") {
-      closePanel();
-    }
-  }
-
-  _reactDom2.default.render(_react2.default.createElement(
-    "div",
-    { className: "conditional-breakpoint-panel" },
-    _react2.default.createElement(
-      "div",
-      { className: "prompt" },
-      "\xBB"
-    ),
-    _react2.default.createElement("input", {
-      defaultValue: condition,
-      placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
-      onKeyDown: onKey,
-      ref: setInput
-    }),
-    _react2.default.createElement(_Close2.default, {
-      handleClick: closePanel,
-      buttonClass: "big",
-      tooltip: L10N.getStr("editor.conditionalPanel.close")
-    })
-  ), panel);
-
-  return panel;
-}
-
-exports.renderConditionalPanel = renderConditionalPanel;
+__webpack_require__(1246);
+
+var _editor = __webpack_require__(257);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _selectors = __webpack_require__(242);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class ConditionalPanel extends _react.PureComponent {
+
+  constructor() {
+    super();
+
+    this.setInput = node => {
+      this.input = node;
+    };
+
+    this.saveAndClose = () => {
+      if (this.input) {
+        this.setBreakpoint(this.input.value);
+      }
+
+      this.props.closeConditionalPanel();
+    };
+
+    this.onKey = e => {
+      if (e.key === "Enter") {
+        this.saveAndClose();
+      } else if (e.key === "Escape") {
+        this.props.closeConditionalPanel();
+      }
+    };
+
+    this.cbPanel = null;
+    this.input = {};
+  }
+
+  setBreakpoint(condition) {
+    var _props = this.props,
+        selectedLocation = _props.selectedLocation,
+        line = _props.line;
+
+    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
+    var location = { sourceId, line };
+    return this.props.setBreakpointCondition(location, { condition });
+  }
+
+  clearConditionalPanel() {
+    if (this.cbPanel) {
+      this.cbPanel.clear();
+      this.cbPanel = null;
+    }
+  }
+
+  componentWillUpdate(nextProps) {
+    if (nextProps.line) {
+      return this.renderToWidget(nextProps);
+    }
+    return this.clearConditionalPanel();
+  }
+
+  renderToWidget(props) {
+    var selectedLocation = props.selectedLocation,
+        line = props.line,
+        editor = props.editor;
+
+    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
+
+    var editorLine = (0, _editor.toEditorLine)(sourceId, line);
+    this.cbPanel = editor.codeMirror.addLineWidget(editorLine, this.renderConditionalPanel(props), {
+      coverGutter: true,
+      noHScroll: false
+    });
+    this.input.focus();
+  }
+
+  renderConditionalPanel(props) {
+    var breakpoint = props.breakpoint;
+
+    var condition = breakpoint ? breakpoint.condition : "";
+    var panel = document.createElement("div");
+    _reactDom2.default.render(_react2.default.createElement(
+      "div",
+      { className: "conditional-breakpoint-panel" },
+      _react2.default.createElement(
+        "div",
+        { className: "prompt" },
+        "\xBB"
+      ),
+      _react2.default.createElement("input", {
+        defaultValue: condition,
+        placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
+        onKeyDown: this.onKey,
+        ref: this.setInput
+      }),
+      _react2.default.createElement(_Close2.default, {
+        handleClick: this.props.closeConditionalPanel,
+        buttonClass: "big",
+        tooltip: L10N.getStr("editor.conditionalPanel.close")
+      })
+    ), panel);
+    return panel;
+  }
+
+  render() {
+    return null;
+  }
+}
+
+exports.ConditionalPanel = ConditionalPanel;
+exports.default = (0, _reactRedux.connect)(state => {
+  var line = (0, _selectors.getConditionalPanelLine)(state);
+  var selectedLocation = (0, _selectors.getSelectedLocation)(state);
+  return {
+    selectedLocation,
+    breakpoint: (0, _selectors.getBreakpointForLine)(state, selectedLocation.sourceId, line),
+    line
+  };
+}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ConditionalPanel);
 
 /***/ }),
 /* 712 */,
 /* 713 */,
 /* 714 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -25594,16 +25481,20 @@ exports.default = HitMarker;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -25664,17 +25555,17 @@ var _UtilsBar2 = _interopRequireDefault(
 var _ChromeScopes = __webpack_require__(728);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(731);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
-__webpack_require__(921);
+__webpack_require__(1267);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? _ChromeScopes2.default : _Scopes3.default;
 
 function debugBtn(onClick, type, className, tooltip) {
@@ -25839,37 +25730,41 @@ class SecondaryPanes extends _react.Comp
       horizontal: this.props.horizontal,
       toggleShortcutsModal: this.props.toggleShortcutsModal
     });
   }
 
   render() {
     return _react2.default.createElement(
       "div",
-      { className: "secondary-panes secondary-panes--sticky-commandbar" },
+      { className: "secondary-panes-wrapper" },
       _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
-      this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
+      _react2.default.createElement(
+        "div",
+        { className: "secondary-panes" },
+        this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
+      ),
       this.renderUtilsBar()
     );
   }
 }
 
 SecondaryPanes.propTypes = {
-  evaluateExpressions: _react.PropTypes.func.isRequired,
-  pauseData: _react.PropTypes.object,
-  horizontal: _react.PropTypes.bool,
+  evaluateExpressions: _propTypes2.default.func.isRequired,
+  pauseData: _propTypes2.default.object,
+  horizontal: _propTypes2.default.bool,
   breakpoints: _reactImmutableProptypes2.default.map.isRequired,
-  breakpointsDisabled: _react.PropTypes.bool,
-  breakpointsLoading: _react.PropTypes.bool,
-  toggleAllBreakpoints: _react.PropTypes.func.isRequired,
-  toggleShortcutsModal: _react.PropTypes.func
+  breakpointsDisabled: _propTypes2.default.bool,
+  breakpointsLoading: _propTypes2.default.bool,
+  toggleAllBreakpoints: _propTypes2.default.func.isRequired,
+  toggleShortcutsModal: _propTypes2.default.func
 };
 
 SecondaryPanes.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseData: (0, _selectors.getPause)(state),
   breakpoints: (0, _selectors.getBreakpoints)(state),
   breakpointsDisabled: (0, _selectors.getBreakpointsDisabled)(state),
   breakpointsLoading: (0, _selectors.getBreakpointsLoading)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SecondaryPanes);
@@ -25902,17 +25797,17 @@ var _selectors = __webpack_require__(242
 var _expressions = __webpack_require__(1177);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(908);
+__webpack_require__(1260);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Expressions extends _react.PureComponent {
 
   constructor() {
     super(...arguments);
 
@@ -26147,36 +26042,42 @@ var _utils = __webpack_require__(234);
 var _source = __webpack_require__(233);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(907);
+__webpack_require__(1259);
 
 var _lodash = __webpack_require__(2);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
 function isCurrentlyPausedAtBreakpoint(pause, breakpoint) {
   if (!pause || pause.isInterrupted) {
     return false;
   }
 
   var bpId = (0, _breakpoint.makeLocationId)(breakpoint.location);
   var pausedId = (0, _breakpoint.makeLocationId)((0, _lodash.get)(pause, "frame.location"));
   return bpId === pausedId;
 }
 
+function getBreakpointFilename(source) {
+  return source && source.toJS ? (0, _source.getFilename)(source.toJS()) : "";
+}
+
 function renderSourceLocation(source, line, column) {
-  var filename = source ? (0, _source.getFilename)(source.toJS()) : null;
+  var filename = getBreakpointFilename(source);
   var isWasm = source && source.get("isWasm");
   var columnVal = (0, _devtoolsConfig.isEnabled)("columnBreakpoints") && column ? `:${column}` : "";
   var bpLocation = isWasm ? `0x${line.toString(16).toUpperCase()}` : `${line}${columnVal}`;
 
   if (!filename) {
     return null;
   }
 
@@ -26419,26 +26320,26 @@ class Breakpoints extends _react.PureCom
           paused: isCurrentlyPaused,
           disabled: isDisabled,
           "is-conditional": isConditional
         }),
         key: locationId,
         onClick: () => this.selectBreakpoint(breakpoint),
         onContextMenu: e => this.showContextMenu(e, breakpoint)
       },
+      _react2.default.createElement("input", {
+        type: "checkbox",
+        className: "breakpoint-checkbox",
+        checked: !isDisabled,
+        onChange: () => this.handleCheckbox(breakpoint),
+        onClick: ev => ev.stopPropagation()
+      }),
       _react2.default.createElement(
         "label",
         { className: "breakpoint-label", title: breakpoint.text },
-        _react2.default.createElement("input", {
-          type: "checkbox",
-          className: "breakpoint-checkbox",
-          checked: !isDisabled,
-          onChange: () => this.handleCheckbox(breakpoint),
-          onClick: ev => ev.stopPropagation()
-        }),
         renderSourceLocation(breakpoint.location.source, line, column)
       ),
       _react2.default.createElement(
         "div",
         { className: "breakpoint-snippet" },
         snippet
       ),
       _react2.default.createElement(_Close2.default, {
@@ -26450,17 +26351,17 @@ class Breakpoints extends _react.PureCom
 
   render() {
     var breakpoints = this.props.breakpoints;
 
     var children = breakpoints.size === 0 ? _react2.default.createElement(
       "div",
       { className: "pane-info" },
       L10N.getStr("breakpoints.none")
-    ) : breakpoints.valueSeq().map(bp => this.renderBreakpoint(bp));
+    ) : (0, _lodash.sortBy)([].concat(_toConsumableArray(breakpoints.valueSeq())), [bp => getBreakpointFilename(bp.location.source), bp => bp.location.line]).map(bp => this.renderBreakpoint(bp));
 
     return _react2.default.createElement(
       "div",
       { className: "pane breakpoints-list" },
       children
     );
   }
 }
@@ -26518,17 +26419,17 @@ var _selectors = __webpack_require__(242
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
-__webpack_require__(850);
+__webpack_require__(1216);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 // check to see if its an object with propertie
 function nodeHasProperties(item) {
   return !nodeHasChildren(item) && item.contents.value.type === "object";
 }
 
@@ -26755,17 +26656,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _scopes = __webpack_require__(732);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(850);
+__webpack_require__(1216);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Scopes extends _react.PureComponent {
 
   constructor(props) {
     var pauseInfo = props.pauseInfo,
         selectedFrame = props.selectedFrame,
@@ -27052,17 +26953,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(915);
+__webpack_require__(1264);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EventListeners extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -27166,34 +27067,63 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(917);
+__webpack_require__(1266);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 class Accordion extends _react.Component {
 
   constructor(props) {
     super();
 
+    this.renderContainer = (item, i) => {
+      var _state = this.state,
+          opened = _state.opened,
+          created = _state.created;
+
+      var containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
+
+      return _react2.default.createElement(
+        "div",
+        { className: containerClassName, key: i },
+        _react2.default.createElement(
+          "div",
+          { className: "_header", onClick: () => this.handleHeaderClick(i) },
+          _react2.default.createElement(_Svg2.default, { name: "arrow", className: opened[i] ? "expanded" : "" }),
+          item.header,
+          item.buttons ? _react2.default.createElement(
+            "div",
+            { className: "header-buttons" },
+            item.buttons
+          ) : null
+        ),
+        created[i] || opened[i] ? _react2.default.createElement(
+          "div",
+          {
+            className: "_content",
+            style: { display: opened[i] ? "block" : "none" }
+          },
+          (0, _react.createElement)(item.component, item.componentProps || {})
+        ) : null
+      );
+    };
+
     this.state = {
       opened: props.items.map(item => item.opened),
       created: []
     };
-
-    var self = this;
-    self.renderContainer = this.renderContainer.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     var newOpened = this.state.opened.map((isOpen, i) => {
       var shouldOpen = nextProps.items[i].shouldOpen;
 
 
       return isOpen || shouldOpen && shouldOpen();
@@ -27216,48 +27146,16 @@ class Accordion extends _react.Component
 
     if (item.onToggle) {
       item.onToggle(opened[i]);
     }
 
     this.setState({ opened, created });
   }
 
-  renderContainer(item, i) {
-    var _state = this.state,
-        opened = _state.opened,
-        created = _state.created;
-
-    var containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
-
-    return _react2.default.createElement(
-      "div",
-      { className: containerClassName, key: i },
-      _react2.default.createElement(
-        "div",
-        { className: "_header", onClick: () => this.handleHeaderClick(i) },
-        _react2.default.createElement(_Svg2.default, { name: "arrow", className: opened[i] ? "expanded" : "" }),
-        item.header,
-        item.buttons ? _react2.default.createElement(
-          "div",
-          { className: "header-buttons" },
-          item.buttons
-        ) : null
-      ),
-      created[i] || opened[i] ? _react2.default.createElement(
-        "div",
-        {
-          className: "_content",
-          style: { display: opened[i] ? "block" : "none" }
-        },
-        (0, _react.createElement)(item.component, item.componentProps || {})
-      ) : null
-    );
-  }
-
   render() {
     return _react2.default.createElement(
       "div",
       { className: "accordion" },
       this.props.items.map(this.renderContainer)
     );
   }
 }
@@ -27274,16 +27172,20 @@ exports.default = Accordion;
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -27298,17 +27200,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _text = __webpack_require__(389);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
-__webpack_require__(918);
+__webpack_require__(1215);
 
 var _devtoolsModules = __webpack_require__(830);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var appinfo = _devtoolsModules.Services.appinfo;
 
 
@@ -27468,17 +27370,17 @@ class CommandBar extends _react.Componen
       this.renderPauseButton(),
       this.renderStepButtons(),
       this.renderPauseOnExceptions()
     );
   }
 }
 
 CommandBar.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     pause: (0, _selectors.getPause)(state),
     isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
     shouldPauseOnExceptions: (0, _selectors.getShouldPauseOnExceptions)(state),
     shouldIgnoreCaughtExceptions: (0, _selectors.getShouldIgnoreCaughtExceptions)(state)
@@ -27515,17 +27417,17 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _text = __webpack_require__(389);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(922);
+__webpack_require__(1268);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class WelcomeBox extends _react.Component {
 
   renderToggleButton() {
     var _props = this.props,
         horizontal = _props.horizontal,
@@ -27554,17 +27456,46 @@ class WelcomeBox extends _react.Componen
     var setActiveSearch = this.props.setActiveSearch;
 
 
     return _react2.default.createElement(
       "div",
       { className: "welcomebox" },
       _react2.default.createElement(
         "div",
-        { className: "alignlabel" },
+        { className: "alignlabel small-size-layout" },
+        _react2.default.createElement(
+          "div",
+          { className: "shortcutFunction" },
+          _react2.default.createElement(
+            "p",
+            { onClick: setActiveSearch.bind(null, "source") },
+            _react2.default.createElement(
+              "span",
+              { className: "shortcutKey" },
+              searchSourcesShortcut
+            ),
+            searchSourcesLabel
+          ),
+          _react2.default.createElement(
+            "p",
+            { onClick: setActiveSearch.bind(null, "project") },
+            _react2.default.createElement(
+              "span",
+              { className: "shortcutKey" },
+              searchProjectShortcut
+            ),
+            searchProjectLabel
+          )
+        ),
+        this.renderToggleButton()
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "alignlabel normal-layout" },
         _react2.default.createElement(
           "div",
           { className: "shortcutKeys" },
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "source") },
             searchSourcesShortcut
           ),
@@ -27582,18 +27513,17 @@ class WelcomeBox extends _react.Componen
             { onClick: setActiveSearch.bind(null, "source") },
             searchSourcesLabel
           ),
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "project") },
             searchProjectLabel
           )
-        ),
-        this.renderToggleButton()
+        )
       )
     );
   }
 }
 
 exports.default = (0, _reactRedux.connect)(state => ({
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(WelcomeBox);
@@ -27646,17 +27576,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _lodash = __webpack_require__(2);
 
 var _text = __webpack_require__(389);
 
-__webpack_require__(923);
+__webpack_require__(1269);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 var _Dropdown = __webpack_require__(751);
 
 var _Dropdown2 = _interopRequireDefault(_Dropdown);
@@ -27767,25 +27697,25 @@ class SourceTabs extends _react.PureComp
         togglePrettyPrint = _props.togglePrettyPrint;
 
 
     var closeTabLabel = L10N.getStr("sourceTabs.closeTab");
     var closeOtherTabsLabel = L10N.getStr("sourceTabs.closeOtherTabs");
     var closeTabsToEndLabel = L10N.getStr("sourceTabs.closeTabsToEnd");
     var closeAllTabsLabel = L10N.getStr("sourceTabs.closeAllTabs");
     var revealInTreeLabel = L10N.getStr("sourceTabs.revealInTree");
-    var copyLinkLabel = L10N.getStr("sourceTabs.copyLink");
+    var copyLinkLabel = L10N.getStr("copySourceUri2");
     var prettyPrintLabel = L10N.getStr("sourceTabs.prettyPrint");
 
     var closeTabKey = L10N.getStr("sourceTabs.closeTab.accesskey");
     var closeOtherTabsKey = L10N.getStr("sourceTabs.closeOtherTabs.accesskey");
     var closeTabsToEndKey = L10N.getStr("sourceTabs.closeTabsToEnd.accesskey");
     var closeAllTabsKey = L10N.getStr("sourceTabs.closeAllTabs.accesskey");
     var revealInTreeKey = L10N.getStr("sourceTabs.revealInTree.accesskey");
-    var copyLinkKey = L10N.getStr("sourceTabs.copyLink.accesskey");
+    var copyLinkKey = L10N.getStr("copySourceUri2.accesskey");
     var prettyPrintKey = L10N.getStr("sourceTabs.prettyPrint.accesskey");
 
     var tabs = sourceTabs.map(t => t.get("id"));
     var otherTabs = sourceTabs.filter(t => t.get("id") !== tab);
     var sourceTab = sourceTabs.find(t => t.get("id") == tab);
     var tabURLs = sourceTabs.map(thisTab => thisTab.get("url"));
     var otherTabURLs = otherTabs.map(thisTab => thisTab.get("url"));
 
@@ -27996,17 +27926,17 @@ class SourceTabs extends _react.PureComp
 
     return _react2.default.createElement(
       "div",
       {
         className: className,
         key: source.get("id"),
         onClick: () => selectSource(source.get("id")),
         onContextMenu: e => this.onTabContextMenu(e, source.get("id")),
-        title: (0, _source.getFilename)(source.toJS())
+        title: (0, _source.getFileURL)(source.toJS())
       },
       sourceAnnotation,
       _react2.default.createElement(
         "div",
         { className: "filename" },
         filename
       ),
       _react2.default.createElement(_Close2.default, {
@@ -28117,17 +28047,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(935);
+__webpack_require__(1270);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Dropdown extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = {
@@ -28404,17 +28334,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _lodash = __webpack_require__(2);
 
 var _frame = __webpack_require__(1014);
 
-__webpack_require__(872);
+__webpack_require__(1245);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getFunctionName(func) {
   var name = func.userDisplayName || func.displayName || func.name;
   return (0, _frame.simplifyDisplayName)(name);
 }
 
@@ -28518,29 +28448,35 @@ var findScopeByName = exports.findScopeB
     });
   });
 
   return function findScopeByName(_x3, _x4) {
     return _ref2.apply(this, arguments);
   };
 })();
 
+exports.containsPosition = containsPosition;
 exports.findClosestScope = findClosestScope;
 
-var _parser = __webpack_require__(827);
-
-var _contains = __webpack_require__(1127);
+var _parser = __webpack_require__(1208);
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
+function containsPosition(a, b) {
+  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
+  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
+
+  return startsBefore && endsAfter;
+}
+
 function findClosestScope(functions, location) {
   return functions.reduce((found, currNode) => {
-    if (currNode.name === "anonymous" || !(0, _contains.containsPosition)(currNode.location, location)) {
+    if (currNode.name === "anonymous" || !containsPosition(currNode.location, location)) {
       return found;
     }
 
     if (!found) {
       return currNode;
     }
 
     if (found.location.start.line > currNode.location.start.line) {
@@ -28603,19 +28539,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
-var _debounce = __webpack_require__(651);
-
-var _debounce2 = _interopRequireDefault(_debounce);
+var _lodash = __webpack_require__(2);
 
 var _Popup = __webpack_require__(810);
 
 var _Popup2 = _interopRequireDefault(_Popup);
 
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
@@ -28628,17 +28562,17 @@ function _interopRequireDefault(obj) { r
 
 class Preview extends _react.PureComponent {
 
   constructor() {
     super();
 
     var self = this;
     self.onScroll = this.onScroll.bind(this);
-    self.onMouseOver = (0, _debounce2.default)(this.onMouseOver, 40);
+    self.onMouseOver = (0, _lodash.debounce)(this.onMouseOver, 40);
   }
 
   componentDidMount() {
     var codeMirror = this.props.editor.codeMirror;
 
     var codeMirrorWrapper = codeMirror.getWrapperElement();
 
     codeMirror.on("scroll", this.onScroll);
@@ -28752,25 +28686,31 @@ var _Popover = __webpack_require__(698);
 var _Popover2 = _interopRequireDefault(_Popover);
 
 var _PreviewFunction = __webpack_require__(798);
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(881);
+__webpack_require__(1254);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Rep = _devtoolsReps2.default.REPS.Rep,
     MODE = _devtoolsReps2.default.MODE,
     ObjectInspectorUtils = _devtoolsReps2.default.ObjectInspectorUtils;
 var ObjectInspector = _devtoolsReps2.default.ObjectInspector;
 var getChildren = ObjectInspectorUtils.getChildren;
+
+
+function isReactComponent(roots) {
+  return roots.some(root => root.name === "_reactInternalInstance");
+}
+
 class Popup extends _react.Component {
 
   componentDidMount() {
     var _props = this.props,
         loadObjectProperties = _props.loadObjectProperties,
         loadedObjects = _props.loadedObjects,
         value = _props.value,
         editor = _props.editor,
@@ -28821,20 +28761,33 @@ class Popup extends _react.Component {
         className: "preview-popup",
         onClick: () => selectSourceURL(location.url, { line: location.line })
       },
       _react2.default.createElement(_PreviewFunction2.default, { func: value })
     );
   }
 
   renderObjectPreview(expression, root) {
+    var loadedObjects = this.props.loadedObjects;
+
+    var getObjectProperties = id => loadedObjects[id];
+    var roots = this.getChildren(root, getObjectProperties);
+
+    if (!roots) {
+      return null;
+    }
+
+    if (isReactComponent(roots)) {
+      roots = roots.filter(r => ["state", "props"].includes(r.name));
+    }
+
     return _react2.default.createElement(
       "div",
       { className: "preview-popup" },
-      this.renderObjectInspector(root)
+      this.renderObjectInspector(roots)
     );
   }
 
   renderSimplePreview(value) {
     var openLink = this.props.openLink;
 
     return _react2.default.createElement(
       "div",
@@ -28842,29 +28795,23 @@ class Popup extends _react.Component {
       Rep({
         object: value,
         mode: MODE.LONG,
         openLink
       })
     );
   }
 
-  renderObjectInspector(root) {
+  renderObjectInspector(roots) {
     var _props2 = this.props,
         loadObjectProperties = _props2.loadObjectProperties,
         loadedObjects = _props2.loadedObjects,
         openLink = _props2.openLink;
 
-
     var getObjectProperties = id => loadedObjects[id];
-    var roots = this.getChildren(root, getObjectProperties);
-
-    if (!roots) {
-      return null;
-    }
 
     return _react2.default.createElement(ObjectInspector, {
       roots: roots,
       autoExpandDepth: 0,
       disableWrap: true,
       disabledFocus: true,
       openLink: openLink,
       getObjectProperties: getObjectProperties,
@@ -28925,31 +28872,30 @@ class Popup extends _react.Component {
         this.renderAddToExpressionBar(expression)
       );
     }
 
     return this.renderSimplePreview(value);
   }
 
   getPreviewType(value) {
-    if (typeof value == "number" || typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
+    if (typeof value == "number" || typeof value == "boolean" || typeof value == "string" && value.length < 10 || typeof value == "number" && value.toString().length < 10 || value.type == "null" || value.type == "undefined" || value.class === "Function") {
       return "tooltip";
     }
 
     return "popover";
   }
 
   render() {
     var _props3 = this.props,
         popoverPos = _props3.popoverPos,
         onClose = _props3.onClose,
         value = _props3.value,
         expression = _props3.expression;
 
-
     var type = this.getPreviewType(value);
 
     return _react2.default.createElement(
       _Popover2.default,
       { targetPosition: popoverPos, onMouseLeave: onClose, type: type },
       this.renderPreview(expression, value)
     );
   }
@@ -28972,52 +28918,17 @@ exports.default = (0, _reactRedux.connec
 /* 819 */,
 /* 820 */,
 /* 821 */,
 /* 822 */,
 /* 823 */,
 /* 824 */,
 /* 825 */,
 /* 826 */,
-/* 827 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.hasSyntaxError = exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearScopes = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getScopes = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
-var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
-
-var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
-var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
-var getScopes = exports.getScopes = dispatcher.task("getScopes");
-var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
-var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
-var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
-var clearScopes = exports.clearScopes = dispatcher.task("clearScopes");
-var clearASTs = exports.clearASTs = dispatcher.task("clearASTs");
-var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
-var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
-var hasSource = exports.hasSource = dispatcher.task("hasSource");
-var setSource = exports.setSource = dispatcher.task("setSource");
-var clearSources = exports.clearSources = dispatcher.task("clearSources");
-var hasSyntaxError = exports.hasSyntaxError = dispatcher.task("hasSyntaxError");
-
-/***/ }),
+/* 827 */,
 /* 828 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var feature = __webpack_require__(829);
 
@@ -29171,214 +29082,54 @@ module.exports = {
 /* 842 */,
 /* 843 */,
 /* 844 */,
 /* 845 */,
 /* 846 */,
 /* 847 */,
 /* 848 */,
 /* 849 */,
-/* 850 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 851 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 852 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 853 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 854 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 850 */,
+/* 851 */,
+/* 852 */,
+/* 853 */,
+/* 854 */,
 /* 855 */
 /***/ (function(module, exports) {
 
 module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABqCAMAAAAC5xbnAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CkzCJ1kAAAMAUExURUxpcf/fQOF4Wf6qob2GSbyGTP61q++hVlpCNO+ATLuESaZzPYdWLZ1uN/KOQywvJ/OGDfeTGWRSMlpFNvqrQ/yNkPipLfeTGviRGyobJAYCC5BgL/y2MKJrRg0gKH5ULfSTIWhnYyIeJv5/g7K1tfiSGviWIIZgPP+jn6KnqJxqNvmWH/qdTJNkM/6GjPmdKX5JIKiIafeVHTcuLK9uHvTn0/iUH5NiKQUbM/eTH0ExL/6hmv/TStTCqvidK/6Oi/uTkOnZv/mgNLaHbZppFu6ooPeMGYJVJOzbu5pqOap2RY+WnZaOgv+cmahkY/LjzvaEE+vew/2blzs+Ov6enQohIsVvb/+QkP6Bg4+YntB4de7Ru7yfg6KEaf+movj07s7Husx9atqYPJVKKLqESf/47v22GuJOM/3LLf/////ZY//37fyzGP3y4v2rFv3JLP3z5fuiEt9HM/3CKAAAAN1BL//+9f7NLtk7KP726NY0ILB4P/7XYvukH95HLf/88v65Gvy6J/7IKPPizLZ7QPqPEPru3N1AJ7+ITP+vprqAQ+p5IPiZGbV/Rfz8/PyzJv+lmP7VOfitIvqzT/zozeTMtf/RLvycCcSKTP29Hv/ocf/Btv3LOOdpHQQaI/7RY+JcJaltNP66r/3AM6OEMPCMH+nq6/Lz9JpiLzk3M/nYxE40H7WTMcgvHk9AMsLEwyQsL/u8ANrEqurWwJp2Jtrc3WRNR//76fzPsmJHI+FZHvfo1+WiHf3BV/p4dHVdMwABKfDALbV6Kt9PJ91+YHY/L6OVhJksJyIdGcUjB4VrMLd9OMqiL7EqIEJAP/3LXtu5maAFBP7OQ/yWj5GXl7w7K8GLHH1RLNyuLXklJ83Q0WYzLs2THIJJC/+PeXp4cIoABOe4LTUlJ//hbMWXYISKivqqA8udeemXhXtaHOiHc9YLAM1AKI+Ec7ideFVgYNs0BrgSAJh3YcRwII1ZGMCsj2QCAteBEXqDgviWNfW4esd1S8e4ofbDnNVeSrxWUew/xBkAAABkdFJOUwD+EP7//v4CAwX8/mb9HhH/MP3+/TT9TdYm/oP90bA4bPtYefztff7J+buL991SyUn+Y9v62T+cfp3S9P5co9TrkLj++vmqnHCp90X+nf3EvKx27ZH14bSWoqznwX6h/sly7fPC0KykAAAQBUlEQVRo3tyYe0xTWR7Hb+nwKKs4IK9UnAED+CIiLMvE9ZH1Oc64Pnc0O7O7/0nDo8/0BtKUptQ+VgzSUqCVR0oKXWhpAx0oQsOrGDWkQ8AVFggBFBWVSZTERxzHcXZ/59wWWakOGdl/9isgve39nO/9nd/5/c6BIP6/Fcj4X4EDA+Eb/4+00nTkPJAICcW/en6sJB2FJTQmJgp+i00lVtQ/wLYmJ0bFRpfQEnYk7tPx0vGzrNyEhtbR1BKuurpEreaqS0qi4SGIFZpmwIRG19FiWGxZdYlMxpJVVxcpD6UTKxIhYDASi7iyEhmFxz8lXIHyUOgKzDDQ05PrhDKMV9ct4LkCQULsB/Ph9tTIEhpNpi6pk7FldTRZhQfPZXMlWz+QD95jY2ggoZomZHO16jqtlqsVYjyL9cF8BhGlRvQSobYuMjy8lFJ4JODZLDbwUz8EzyBCIhE8kyeMLO0eqqnJR6qp6Q4XAB7xE0KAH8hgMH5d4PdA3Et4vDx1aU12dr5H2fmlAqADnsXdQfzq9QWrKQbRMzMBn79I2d0YD3x2AqSn3+5TET5X4/tGDoIH3lqC6bw82X/h73rwMIAkkTj8l4Ba+qkl3hjvK334OiOZRuN58DWL8JVDXvcsffJJToAmoDZg2+IigStSYOg7Fx5c/XTd51siaTqgv42/Wzkk8eDVyiRR7TCdHlC1aQFFtYOQ2H3h4e9I3EAi6JurPVevqkuw+UweK3wBn323ksKzIfQS/UvNMF2D8H7YPlVJ/aL2JHXDHaVRvgoffOLP06Akdh4Puxe+wQO8srJGgtKexRYIJMokOoVn4BRFt4cmJpcO1UCCZQ/t8Z0yERrNTo1m+j4PWT8nRPhsr3WEj2QVQFYK9Hrlxy81dE1hQNVRz2yGpO4LR8bxx2uSQnzYZxDbAgI0GA8SgioQ3sOuvAt4rqRIiVUE/MKAgMJtuKVF7YCgLCyR7PzuWJ/4CHpt4cOHSXqJRKvVqtVqbThatDVDQ90gKAuIXQRvqiH4SRpqZqmg5NekxN3btWvXTdCu/Jp9PiYXSvymqoOXX9TdrNMWUZJERkokEgEWlLaYOpCMfV9f9PTL/RvXHoS8REEZGtq1yzbY1NQ3PnMOKfNmeKjv6NQetL6IjLlJo1XfrPaKl5kH0unOfYt0X69/+Y9nrvl5O/PBV4zkGLBbzTvXZxkYcJtclnH4JEQ2JtF3UztaldJvvfbiPgJVfEsJHMeAIsNLf/zx9euOxk5V24h98PJpw3oiNaY6D+zydLawTN2AxdZks5n6YARhtJ+P1A8k/DZV7Tcw48obGzs6Hr7uQLqRlvb06VPz1HV+hrQ4Kwu+srIaNpPMy2dCiER1Jg+nWa9jfMbkmAmzNbl6+/ryzhVF+VpZDOAXriVnGwBRb59ApKwJst8sNjrJWQxui6tHIzSTd85AQQstEiK+LtPhOu0IGze5HW6bZSDMMS7Y4TM6ML1Hn5A/FAOimYzH+M3kmOKiwsycBy51FeN/j3N7nwxqx8yArs80MGC3rbWFjdvcpqbT9iLcEnzuP1aRcQ0Y34x4DXGk+YJCYbSSE+hlGzmCxownNxBowcZKhJk6k3t8QKfrC3OZTO4ZGMI9OaoVpPreETGINX9itgG+fnMDZddqVIjF4jEUHfg324zcz5J/I4JQX0tg5fF6bb0mGzzBTN9a+1q3ze4arWBxT7yrrh1+To7gOCPVz5PXxK9eKRTmfngar9qYU+sDcZHcIxGOh7mbIGdMjj7duLt3IOzAZBcLdxyfdc3vd3IrM76+obi4oaF+4hZ559nVnp6eV0Yr83IzXIXcaWi7Rf5GvB1uh6ZfVDBqt/eGmUx2l6lvJk83bjA4cN1L9I3fm6V60M+c/2F29lbcIEnap4wYL3522kAOxs2OjIzMzpNjwZe2UGaiuXOuXnvvQNO422RymYQFXQfmtAXQ76MZS6MDdUeVm9N6z0lSsjqnzGKx8WcjTO6U9Y7nKukU+5//8lM8uVslcw63axwnfa/bNTnZVUE1zKL0JfahoRwvzskQNd54nPLkScqTKbPRKEYTi2Q0ms0bx65Zr21crfjobPD5dajUQ+pztc8cWsuAyW1yTjpHnaOjk97txNv2YV6l0pycDKmqDCRvfZCWRqEVlIzmMeuY+IK/v//Z4Evr1xBBcH8yt0DL7rIarKNOg8uRZp1zjVI9Lfrt1EfzCuYz4Isjb5XDCC33FIoLFxUKsdG82jzmtPYbmAeuXElL+84/GEUnCKc+G5rM5NykY+7ZXJfT5ewqADirgpuwFH84F7FBIlX54+vPf2q5sd/8bAo0t9pJMg12i+HxjfLW8hv3rpz1P7sKRyckAbXIgoKCtEmHY9RlmKyAVyzY6u55Kzhe86AcPoff+Ueyv99iSXn8+Dkg5U9Ii2WQvCUv44hEfFXLd8GX1lEN+pAAB4PFKhh1OA84RyvYbDgIRCf6LTG/my+l8Bl8DkfEeURa7OTjMg6H097efp0ctNj7W8rk8JKTkVsefOkLXKOIKKV3e1XQNdplvcLVKxN2RDF8TOze3IyMBbyqvdViHyQfcdo5ZRw+5zoJ5h/J5Sp4iyPKyG25soXA0fGL1gu4XgmevlCeiA0hfB6Sjhd78SLkUQSODU1ywKva2x/+s8lwx2Oen5Mj7aTco9RXCjzSK5XRW0MXNj5L8ibXExsUfMC3kBbDvzra28vK2jume3puPyrzms+Rqu595jn6pn+sx2wIyqEoP7zTDPRdbhbwlP3Wy8x/90x3lEHv0tALNT3lco95jF+HowvxOaHHex8qKEGMd+0wg46/wUP0+Sr5rdtQb6Y1AYWwqYFtTaPXPOA7L26HvMeFJFaJgpJO/Y3gPdvvk960R+EBfNlPP08P02sDKNFr5Z0eOuAbD6zB+CAi6JOxNE9Q3n8u2d0ufWMfwqNqHB4upESn0wsbVRwvPUfa8jllPYjYMGjYQPzyHwQWLauF8Hc2VtUiVXU0NnZyvN7BPH//dk9FXPPbwU+I5ZyGFq8rD58v4nNUWBw+n5pVCp/xV5w3EQxiQxNzAzULv6y9uYv5OD35lHDKiLxv5PIjUKhDdh6N+AP9m2WfCoNOSqUZix8AY7H4b+Bgfu8RtBMJKaw9M4wOEYHLPBYSezszUMl/8wQibF60cA33g+b45t2QNat2Hjw2XPjVMo/p8KEjX8fL+ainLBrhzVBI0lyRfGKieGL9Z1+sN35/7Bi96uDy3EPqfB3fVh+f0sqBEGHYIix+JZVKOY0P4toaiidSLp0//5HxzrHhnaeWeTw/srkNth8jt//+fXnnfzq1vpC2rjAe9F4bc80MhhZCpqIWnDJLhw8V+2BhD4Wtb13pnvZ0axzahN6QeU0w/ol6r0muFldbRSK2I7F/Fh2KsqogGmOUzGGpobMOdFKmqN10o66Ubuw79yaptrGc5PeQnHvP+X7fd77z7zvnnpq6iApJRx1CTcv9f2d2t/cLPG0jswSsiQ/XN3uSk3DOqI7JPj/paWvzjIzOm7Z3P371o62lRuQET4H/r47bOhdffXtLtWtm5tVP2zyzdppX/tCb+dUXSXieKYAoqd9TsMZYGZ/qlsoxs7nY2Tk8PGwDDP31n297W/W70+0yWZm1l/39BTQhPOwt1uA5Ri7LvjAoGc/omL4T39W6tre3d3e5efXwuK3lwtqu2WRyfNiud/oYHbs/+PXgJ/a7vXO5YriAwa4pCs4+7fcsgfE6k8NYXeVgdDrGxDFrS5XfjKh3dAx6bSjXu0w63d6fnpFZYaA3S4Y1YGFAFXYR5NLI4IMdE/C4DQaRRsT+YOXLRyjB9HVUdOvdVkitLXlOrs7NYU4HctlpC6Gwf1qQs2ey6hhfbYXB2ceI5IzOO7oakBSZ3GD+tT7Q61WfLPh5DtN4sF5LkDTN5yxzyHhXA+yPfEzYet3CfjhhcrVXG/UOoGcWLubMzWkw5zK5TAuBEU892OGsopHVRuSDMEL+SMpXa6joRvViTP5L61m4M6XkHDojYEWOtQKJ0c2aIgj5GcbEILBu2Kx1IPN1oXuXcI1Hc0Yh35W/bDazJisHLQj0LkcEf/v7wrA6GlAWC6rZALbxYsdUCgMhl8vhdjtrgcPQADCKaJx4cqK9o70DQcyqdTscrr6d4vR4+LMv3u5oB0bxNKdC3OoDIHXzl8mpmxWRJ/Gox9jQ3l57uyQu89VTYXHEAGg0RqyfnKo2iK8MYo6ovaJxIh7zZVk/3ZTEgbYbUF9eHglNn/zWaKg4BIOxobzqbi5+19FkgPFQ7W4IzlEw+gZ695OJ+vLublQRBHSShILu+l9xhxV0nZLvq43l+mvOZpUKGs7lGovCNeb/B96qmpudTlCmr6qSIu76jgwN7qSQXjqhd6ugQ/isVqm3M1HsrOzAW6vP5xvrg77lULmdSEt5/XQJLn2uHzEj0uhgZaxh7KyEoqpAL8tyvjGXQ9Wsn8D0jlxWEmCjzCKvVAWOY1nWuxIyA9iDgGduzIHrHVnWAhfl5oAUxL3zYeythLiDxPCDikDKj9V3IMwt9cJ0gJhZs9e7EAgs7y/7/aMS1OuP9h6FsbfnNYerwsHEUIJHn14sSQHz8opanZH/4vXroaFOCUOro6vPL8wCnj9fzVlZDgQWxNIsF8rC7ThexA3Uk/lKCrbhGzcgPKgJY3wcYu+WlvEbNlvnH3fzJzPUoANUcKFSvJYF55gXlgcmlZYmu91O03Rww3al7ko4yqkTgx74rxzegGzYpivzkYqFUCnWvHAMmjZwL59qEqkRyCA/BOGmqKGyBoWYEPDYFsmglA06LMpJ9co9DZ7zc9cHlE0RbpHfPv1syHZVCs9QhDY+vMhP28loAYIghPySdMwpp5iyC/RBkGTTNL+BNvw223Dn0ItnQSAnD5YQD40wh22acEhUUmAPTgftBI/+p4M0+VYJBX8GM/aG1YTiFfS7CkjkZ2gRkiTfzRXSsEOF9Myud+nf6IgBBU9l4y/mWuII+qMArpfjrycxvfM+4PtG7ACF8dEr+KI41tpU2en4zCcFbRwrOXj/DB2rDRUIsYzPlMfzZRU6TxFBvsVLkoQEkjysRMErs+MxXgw0lQIflSf5ri6eoAVBsAgCbKR4eIoqIGkqLT52VNPzSguaSwiQJ2gqs/CMVpsmQQvb2M8EqJ1YF1qgzsf9TRu5x0JRYKygIJTa7Lemq3RNWhGtgMpAGSqeXnNg5rEIlBJAFWVLNZKnSpC4NEWQd5uiBEtaAhcuYIuVOYPQZQdx+eFNn1wuT5WlzWxtbm5tbWUmYDzQHz93J6U1+fHZx3mxB8flnp6UO9eTW88dT+Bzf6osr+d+T0pKMsgnxTzeb0XZ6NguLwHnpMpOtYJ4a2tya1ls+rOIHZ2s5SV22SXv8kdlZWWXvzwe+/5F3rnrwH39cVkizhFFUpOSUo/O/uBUHuBUkiwxRD+tH3V/5HC5hO5zvUcWhsCx9991OIT/AVwXLXUhLDYVAAAAAElFTkSuQmCC"
 
 /***/ }),
-/* 856 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 857 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 858 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 859 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 860 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 861 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 862 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 863 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 864 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 865 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 866 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 867 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 868 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 869 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 870 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 871 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 872 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 873 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 874 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 875 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 876 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 877 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 878 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 879 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 880 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 881 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 882 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 856 */,
+/* 857 */,
+/* 858 */,
+/* 859 */,
+/* 860 */,
+/* 861 */,
+/* 862 */,
+/* 863 */,
+/* 864 */,
+/* 865 */,
+/* 866 */,
+/* 867 */,
+/* 868 */,
+/* 869 */,
+/* 870 */,
+/* 871 */,
+/* 872 */,
+/* 873 */,
+/* 874 */,
+/* 875 */,
+/* 876 */,
+/* 877 */,
+/* 878 */,
+/* 879 */,
+/* 880 */,
+/* 881 */,
+/* 882 */,
 /* 883 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(884);
 var fs = __webpack_require__(118);
 
 function Iterator(text) {
 	var pos = 0, length = text.length;
@@ -30377,19 +30128,23 @@ var onConnect = exports.onConnect = (() 
     tabTarget.on("will-navigate", actions.willNavigate);
     tabTarget.on("navigate", actions.navigated);
 
     yield threadClient.reconfigure({
       observeAsmJS: true,
       wasmBinarySource: supportsWasm
     });
 
-    threadClient._parent.listWorkers().then(function (workers) {
-      return actions.setWorkers(workers);
-    });
+    // NOTE: The Worker and Browser Content toolboxes do not have a parent
+    // with a listWorkers function
+    if (threadClient._parent && threadClient._parent.listWorkers) {
+      threadClient._parent.listWorkers().then(function (workers) {
+        return actions.setWorkers(workers);
+      });
+    }
 
     // In Firefox, we need to initially request all of the sources. This
     // usually fires off individual `newSource` notifications as the
     // debugger finds them, but there may be existing sources already in
     // the debugger (if it's paused already, or if loading the page from
     // bfcache) so explicity fire `newSource` events for all returned
     // sources.
     var sources = yield _commands.clientCommands.fetchSources();
@@ -31310,21 +31065,21 @@ var _reactDom = __webpack_require__(4);
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _devtoolsConfig = __webpack_require__(828);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
-var _search = __webpack_require__(1115);
-
-var _prettyPrint = __webpack_require__(903);
-
-var _parser = __webpack_require__(827);
+var _search = __webpack_require__(1210);
+
+var _prettyPrint = __webpack_require__(1213);
+
+var _parser = __webpack_require__(1208);
 
 var _createStore = __webpack_require__(189);
 
 var _createStore2 = _interopRequireDefault(_createStore);
 
 var _reducers = __webpack_require__(227);
 
 var _reducers2 = _interopRequireDefault(_reducers);
@@ -31622,69 +31377,17 @@ function streamingWorkerHandler(publicIn
 
 module.exports = {
   WorkerDispatcher,
   workerHandler,
   streamingWorkerHandler
 };
 
 /***/ }),
-/* 903 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.prettyPrint = exports.stopPrettyPrintWorker = exports.startPrettyPrintWorker = undefined;
-
-var prettyPrint = exports.prettyPrint = (() => {
-  var _ref = _asyncToGenerator(function* (_ref2) {
-    var source = _ref2.source,
-        url = _ref2.url;
-
-    var indent = 2;
-
-    (0, _assert2.default)((0, _source.isJavaScript)(source), "Can't prettify non-javascript files.");
-
-    return yield _prettyPrint({
-      url,
-      indent,
-      source: source.text
-    });
-  });
-
-  return function prettyPrint(_x) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var _source = __webpack_require__(233);
-
-var _assert = __webpack_require__(223);
-
-var _assert2 = _interopRequireDefault(_assert);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startPrettyPrintWorker = exports.startPrettyPrintWorker = dispatcher.start.bind(dispatcher);
-var stopPrettyPrintWorker = exports.stopPrettyPrintWorker = dispatcher.stop.bind(dispatcher);
-var _prettyPrint = dispatcher.task("prettyPrint");
-
-/***/ }),
+/* 903 */,
 /* 904 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -31732,58 +31435,38 @@ function updatePreview(target, editor, _
 
     // We are mousing over a new token that is not in the preview
     if (!target.classList.contains("debug-expression")) {
       clearPreview();
     }
   }
 
   var invalidToken = tokenText === "" || tokenText.match(/[(){}\|&%,.;=<>\+-/\*\s]/);
+
   var invalidTarget = target.parentElement && !target.parentElement.closest(".CodeMirror-line") || cursorPos.top == 0;
+
   var isUpdating = preview && preview.updating;
+
   var inScope = linesInScope && linesInScope.includes(location.line);
 
-  if (invalidTarget || !inScope || isUpdating || invalidToken) {
+  var invaildType = target.className === "cm-string" || target.className === "cm-number" || target.className === "cm-atom";
+
+  if (invalidTarget || !inScope || isUpdating || invalidToken || invaildType) {
     return;
   }
 
   setPreview(tokenText, location, cursorPos);
 }
 
 /***/ }),
-/* 905 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 906 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 907 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 908 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 909 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 905 */,
+/* 906 */,
+/* 907 */,
+/* 908 */,
+/* 909 */,
 /* 910 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var SplitBox = __webpack_require__(911);
 
@@ -31798,17 +31481,17 @@ module.exports = SplitBox;
 
 var React = __webpack_require__(0);
 var ReactDOM = __webpack_require__(4);
 var Draggable = React.createFactory(__webpack_require__(912));
 var dom = React.DOM,
     PropTypes = React.PropTypes;
 
 
-__webpack_require__(861);
+__webpack_require__(1232);
 
 /**
  * This component represents a Splitter. The splitter supports vertical
  * as well as horizontal mode.
  */
 var SplitBox = React.createClass({
   propTypes: {
     // Custom class name. You can use more names separated by a space.
@@ -32101,34 +31784,19 @@ var Draggable = React.createClass({
       onMouseDown: this.startDragging
     });
   }
 });
 
 module.exports = Draggable;
 
 /***/ }),
-/* 913 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 914 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 915 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 913 */,
+/* 914 */,
+/* 915 */,
 /* 916 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */
 ;(function(root) {
 
 	/** Detect free variables */
 	var freeExports = typeof exports == 'object' && exports &&
@@ -32658,58 +32326,33 @@ module.exports = Draggable;
 		root.punycode = punycode;
 	}
 
 }(this));
 
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(793)(module), __webpack_require__(792)))
 
 /***/ }),
-/* 917 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 918 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 917 */,
+/* 918 */,
 /* 919 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
 /* 920 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
-/* 921 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 922 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 923 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 921 */,
+/* 922 */,
+/* 923 */,
 /* 924 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -32768,17 +32411,17 @@ module.exports = {
 
 "use strict";
 
 
 /* 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/. */
 
-__webpack_require__(877);
+__webpack_require__(1250);
 
 // Load all existing rep templates
 var Undefined = __webpack_require__(929);
 var Null = __webpack_require__(930);
 var StringRep = __webpack_require__(931);
 var LongStringRep = __webpack_require__(932);
 var Number = __webpack_require__(933);
 var ArrayRep = __webpack_require__(934);
@@ -33853,22 +33496,17 @@ maxLengthMap.set(MODE.LONG, 10);
 // Exports from this module
 module.exports = {
   rep: wrapRender(ArrayRep),
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
-/* 935 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 935 */,
 /* 936 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
@@ -35541,22 +35179,17 @@ function supportsObject(object) {
 
 // Exports from this module
 module.exports = {
   rep: wrapRender(ElementNode),
   supportsObject
 };
 
 /***/ }),
-/* 952 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 952 */,
 /* 953 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -36396,26 +36029,21 @@ module.exports = {
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
 /* 960 */
 /***/ (function(module, exports) {
 
-module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy link address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n"
+module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\n"
 
 /***/ }),
 /* 961 */,
-/* 962 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 962 */,
 /* 963 */,
 /* 964 */,
 /* 965 */
 /***/ (function(module, exports) {
 
 
 /**
  * slice() reference.
@@ -38757,57 +38385,57 @@ var Tree = module.exports = createClass(
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getAndProcessFrames = getAndProcessFrames;
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _reselect = __webpack_require__(993);
 
 var _lodash = __webpack_require__(2);
 
 var _Frame = __webpack_require__(1013);
 
 var _Frame2 = _interopRequireDefault(_Frame);
 
-var _Group2 = __webpack_require__(1015);
-
-var _Group3 = _interopRequireDefault(_Group2);
+var _Group = __webpack_require__(1015);
+
+var _Group2 = _interopRequireDefault(_Group);
 
 var _WhyPaused = __webpack_require__(1120);
 
 var _WhyPaused2 = _interopRequireDefault(_WhyPaused);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _frame = __webpack_require__(1014);
 
 var _clipboard = __webpack_require__(423);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(914);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var FrameComponent = (0, _react.createFactory)(_Frame2.default);
-
-var Group = (0, _react.createFactory)(_Group3.default);
+__webpack_require__(1263);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var NUM_FRAMES_SHOWN = 7;
 
 class Frames extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -38876,33 +38504,33 @@ class Frames extends _react.Component {
 
 
     var framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
 
 
     return _react2.default.createElement(
       "ul",
       null,
-      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
+      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? _react2.default.createElement(_Frame2.default, {
         frame: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
-        frameworkGroupingOn,
-        selectFrame,
-        selectedFrame,
-        toggleBlackBox,
+        frameworkGroupingOn: frameworkGroupingOn,
+        selectFrame: selectFrame,
+        selectedFrame: selectedFrame,
+        toggleBlackBox: toggleBlackBox,
         key: frameOrGroup.id
-      }) : Group({
+      }) : _react2.default.createElement(_Group2.default, {
         group: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
-        frameworkGroupingOn,
-        selectFrame,
-        selectedFrame,
-        toggleBlackBox,
+        frameworkGroupingOn: frameworkGroupingOn,
+        selectFrame: selectFrame,
+        selectedFrame: selectedFrame,
+        toggleBlackBox: toggleBlackBox,
         key: frameOrGroup[0].id
       }))
     );
   }
 
   renderToggleButton(frames) {
     var buttonMessage = this.state.showAllFrames ? L10N.getStr("callStack.collapse") : L10N.getStr("callStack.expand");
 
@@ -38942,23 +38570,23 @@ class Frames extends _react.Component {
       this.renderFrames(frames),
       (0, _WhyPaused2.default)({ pause }),
       this.renderToggleButton(frames)
     );
   }
 }
 
 Frames.propTypes = {
-  frames: _react.PropTypes.array,
-  frameworkGroupingOn: _react.PropTypes.bool.isRequired,
-  toggleFrameworkGrouping: _react.PropTypes.func.isRequired,
-  selectedFrame: _react.PropTypes.object,
-  selectFrame: _react.PropTypes.func.isRequired,
-  toggleBlackBox: _react.PropTypes.func,
-  pause: _react.PropTypes.object
+  frames: _propTypes2.default.array,
+  frameworkGroupingOn: _propTypes2.default.bool.isRequired,
+  toggleFrameworkGrouping: _propTypes2.default.func.isRequired,
+  selectedFrame: _propTypes2.default.object,
+  selectFrame: _propTypes2.default.func.isRequired,
+  toggleBlackBox: _propTypes2.default.func,
+  pause: _propTypes2.default.object
 };
 
 function getSourceForFrame(sources, frame) {
   return (0, _selectors.getSourceInSources)(sources, frame.location.sourceId);
 }
 
 function appendSource(sources, frame) {
   return Object.assign({}, frame, {
@@ -39200,16 +38828,20 @@ function isUnderscore(frame) {
 function isLodash(frame) {
   return getFrameUrl(frame).match(/lodash/i);
 }
 
 function isEmber(frame) {
   return getFrameUrl(frame).match(/ember/i);
 }
 
+function isChoo(frame) {
+  return getFrameUrl(frame).match(/choo/i);
+}
+
 function isVueJS(frame) {
   return getFrameUrl(frame).match(/vue\.js/i);
 }
 
 function isRxJs(frame) {
   return getFrameUrl(frame).match(/rxjs/i);
 }
 
@@ -39220,44 +38852,57 @@ function isAngular(frame) {
 function isRedux(frame) {
   return getFrameUrl(frame).match(/redux/i);
 }
 
 function isDojo(frame) {
   return getFrameUrl(frame).match(/dojo/i);
 }
 
+function isPreact(frame) {
+  return getFrameUrl(frame).match(/preact/i);
+}
+
 function getLibraryFromUrl(frame) {
   // @TODO each of these fns calls getFrameUrl, just call it once
   // (assuming there's not more complex logic to identify a lib)
 
   if (isBackbone(frame)) {
     return "Backbone";
   }
 
   if (isJQuery(frame)) {
     return "jQuery";
   }
 
+  // Needs to remain before "react", otherwise "react" can also match "preact"
+  if (isPreact(frame)) {
+    return "Preact";
+  }
+
   if (isReact(frame)) {
     return "React";
   }
 
   if (isWebpack(frame)) {
     return "Webpack";
   }
 
   if (isNodeInternal(frame)) {
     return "Node";
   }
 
   if (isExpress(frame)) {
     return "Express";
   }
 
+  if (isChoo(frame)) {
+    return "Choo";
+  }
+
   if (isPug(frame)) {
     return "Pug";
   }
 
   if (isExtJs(frame)) {
     return "ExtJS";
   }
 
@@ -39471,70 +39116,67 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _frame = __webpack_require__(1014);
 
 var _FrameMenu = __webpack_require__(1032);
 
 var _FrameMenu2 = _interopRequireDefault(_FrameMenu);
 
-__webpack_require__(909);
+__webpack_require__(1261);
 
 var _Frame = __webpack_require__(1013);
 
 var _Frame2 = _interopRequireDefault(_Frame);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-var FrameComponent = (0, _react.createFactory)(_Frame2.default);
-
 function FrameLocation(_ref) {
   var frame = _ref.frame;
 
   var library = (0, _frame.getLibraryFromUrl)(frame);
   if (!library) {
     return null;
   }
 
   return _react2.default.createElement(
     "div",
     { className: "location" },
     library,
     _react2.default.createElement(_Svg2.default, { name: library.toLowerCase(), className: "annotation-logo" })
   );
 }
 
+
 FrameLocation.displayName = "FrameLocation";
 
 class Group extends _react.Component {
 
   constructor() {
     super(...arguments);
+
+    this.toggleFrames = () => {
+      this.setState({ expanded: !this.state.expanded });
+    };
+
     this.state = { expanded: false };
-    var self = this;
-
-    self.toggleFrames = this.toggleFrames.bind(this);
   }
 
   onContextMenu(event) {
     var _props = this.props,
         group = _props.group,
         copyStackTrace = _props.copyStackTrace,
         toggleFrameworkGrouping = _props.toggleFrameworkGrouping,
         toggleBlackBox = _props.toggleBlackBox,
         frameworkGroupingOn = _props.frameworkGroupingOn;
 
     var frame = group[0];
     (0, _FrameMenu2.default)(frame, frameworkGroupingOn, { copyStackTrace, toggleFrameworkGrouping, toggleBlackBox }, event);
   }
 
-  toggleFrames() {
-    this.setState({ expanded: !this.state.expanded });
-  }
-
   renderFrames() {
     var _props2 = this.props,
         group = _props2.group,
         selectFrame = _props2.selectFrame,
         selectedFrame = _props2.selectedFrame,
         toggleFrameworkGrouping = _props2.toggleFrameworkGrouping,
         frameworkGroupingOn = _props2.frameworkGroupingOn,
         toggleBlackBox = _props2.toggleBlackBox,
@@ -39543,27 +39185,27 @@ class Group extends _react.Component {
 
     if (!expanded) {
       return null;
     }
 
     return _react2.default.createElement(
       "div",
       { className: "frames-list" },
-      group.map(frame => FrameComponent({
-        frame,
-        copyStackTrace,
-        toggleFrameworkGrouping,
-        frameworkGroupingOn,
-        selectFrame,
-        selectedFrame,
-        toggleBlackBox,
+      group.map(frame => _react2.default.createElement(_Frame2.default, {
+        copyStackTrace: copyStackTrace,
+        frame: frame,
+        frameworkGroupingOn: frameworkGroupingOn,
+        hideLocation: true,
         key: frame.id,
-        hideLocation: true,
-        shouldMapDisplayName: false
+        selectedFrame: selectedFrame,
+        selectFrame: selectFrame,
+        shouldMapDisplayName: false,
+        toggleBlackBox: toggleBlackBox,
+        toggleFrameworkGrouping: toggleFrameworkGrouping
       }))
     );
   }
 
   renderDescription() {
     var frame = this.props.group[0];
     var displayName = (0, _frame.formatDisplayName)(frame);
     return _react2.default.createElement(
@@ -39620,16 +39262,20 @@ Group.displayName = "Group";
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _lodash = __webpack_require__(2);
 
+var _reactRedux = __webpack_require__(1189);
+
+var _selectors = __webpack_require__(242);
+
 class HighlightLines extends _react.Component {
 
   constructor() {
     super();
     this.highlightLineRange = this.highlightLineRange.bind(this);
   }
 
   componentDidMount() {
@@ -39692,17 +39338,19 @@ class HighlightLines extends _react.Comp
       });
     });
   }
 
   render() {
     return null;
   }
 }
-exports.default = HighlightLines;
+exports.default = (0, _reactRedux.connect)(state => ({
+  highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state)
+}))(HighlightLines);
 
 /***/ }),
 /* 1026 */,
 /* 1027 */,
 /* 1028 */,
 /* 1029 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -39716,17 +39364,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(879);
+__webpack_require__(1252);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var BracketArrow = (_ref) => {
   var orientation = _ref.orientation,
       left = _ref.left,
       top = _ref.top,
       bottom = _ref.bottom;
@@ -40151,16 +39799,21 @@ function update() {
         });
       }
 
     case "RESUMED":
       {
         return state.set("outOfScopeLocations", null);
       }
 
+    case "NAVIGATE":
+      {
+        return initialState();
+      }
+
     default:
       {
         return state;
       }
   }
 }
 
 // NOTE: we'd like to have the app state fully typed
@@ -40214,65 +39867,41 @@ exports.default = update;
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-/**
- * Gets information about original variable names from the source map
- * and replaces all posible generated names.
- */
-var getSourcemapedExpression = (() => {
-  var _ref = _asyncToGenerator(function* (_ref2, generatedLocation, expression) {
-    var sourceMaps = _ref2.sourceMaps;
-
-    var astScopes = yield (0, _parser.getScopes)(generatedLocation);
-
-    var generatedScopes = yield sourceMaps.getLocationScopes(generatedLocation, astScopes);
-
-    if (!generatedScopes) {
-      return expression;
-    }
-
-    return (0, _utils.replaceOriginalVariableName)(expression, generatedScopes);
-  });
-
-  return function getSourcemapedExpression(_x, _x2, _x3) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
 exports.setSymbols = setSymbols;
 exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
 exports.clearPreview = clearPreview;
 exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(242);
 
 var _sources = __webpack_require__(254);
 
+var _expressions = __webpack_require__(252);
+
 var _promise = __webpack_require__(193);
 
-var _parser = __webpack_require__(827);
+var _parser = __webpack_require__(1208);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
-var _utils = __webpack_require__(1206);
-
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function setSymbols(sourceId) {
   return (() => {
-    var _ref3 = _asyncToGenerator(function* (_ref4) {
-      var dispatch = _ref4.dispatch,
-          getState = _ref4.getState;
+    var _ref = _asyncToGenerator(function* (_ref2) {
+      var dispatch = _ref2.dispatch,
+          getState = _ref2.getState;
 
       var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
       if (!sourceRecord) {
         return;
       }
 
       var source = sourceRecord.toJS();
       if (!source.text || (0, _selectors.hasSymbols)(getState(), source)) {
@@ -40283,27 +39912,27 @@ function setSymbols(sourceId) {
 
       dispatch({
         type: "SET_SYMBOLS",
         source,
         symbols
       });
     });
 
-    return function (_x4) {
-      return _ref3.apply(this, arguments);
+    return function (_x) {
+      return _ref.apply(this, arguments);
     };
   })();
 }
 
 function setEmptyLines(sourceId) {
   return (() => {
-    var _ref5 = _asyncToGenerator(function* (_ref6) {
-      var dispatch = _ref6.dispatch,
-          getState = _ref6.getState;
+    var _ref3 = _asyncToGenerator(function* (_ref4) {
+      var dispatch = _ref4.dispatch,
+          getState = _ref4.getState;
 
       var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
       if (!sourceRecord) {
         return;
       }
 
       var source = sourceRecord.toJS();
       if (!source.text) {
@@ -40314,27 +39943,27 @@ function setEmptyLines(sourceId) {
 
       dispatch({
         type: "SET_EMPTY_LINES",
         source,
         emptyLines
       });
     });
 
-    return function (_x5) {
-      return _ref5.apply(this, arguments);
+    return function (_x2) {
+      return _ref3.apply(this, arguments);
     };
   })();
 }
 
 function setOutOfScopeLocations() {
   return (() => {
-    var _ref7 = _asyncToGenerator(function* (_ref8) {
-      var dispatch = _ref8.dispatch,
-          getState = _ref8.getState;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState;
 
       var location = (0, _selectors.getSelectedLocation)(getState());
       if (!location) {
         return;
       }
 
       var source = (0, _selectors.getSource)(getState(), location.sourceId);
 
@@ -40348,27 +39977,27 @@ function setOutOfScopeLocations() {
       var locations = yield (0, _parser.getOutOfScopeLocations)(source.toJS(), location);
 
       return dispatch({
         type: "OUT_OF_SCOPE_LOCATIONS",
         locations
       });
     });
 
-    return function (_x6) {
-      return _ref7.apply(this, arguments);
+    return function (_x3) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 function clearPreview() {
-  return (_ref9) => {
-    var dispatch = _ref9.dispatch,
-        getState = _ref9.getState,
-        client = _ref9.client;
+  return (_ref7) => {
+    var dispatch = _ref7.dispatch,
+        getState = _ref7.getState,
+        client = _ref7.client;
 
     var currentSelection = (0, _selectors.getPreview)(getState());
     if (!currentSelection) {
       return;
     }
 
     return dispatch({
       type: "CLEAR_SELECTION"
@@ -40390,21 +40019,21 @@ function findBestMatch(symbols, tokenPos
     }
 
     return found;
   }, {});
 }
 
 function setPreview(token, tokenPos, cursorPos) {
   return (() => {
-    var _ref10 = _asyncToGenerator(function* (_ref11) {
-      var dispatch = _ref11.dispatch,
-          getState = _ref11.getState,
-          client = _ref11.client,
-          sourceMaps = _ref11.sourceMaps;
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          client = _ref9.client,
+          sourceMaps = _ref9.sourceMaps;
 
       var currentSelection = (0, _selectors.getPreview)(getState());
       if (currentSelection && currentSelection.updating) {
         return;
       }
 
       yield dispatch({
         type: "SET_PREVIEW",
@@ -40427,43 +40056,43 @@ function setPreview(token, tokenPos, cur
 
           var sourceId = source.get("id");
           if (location && !(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
             var generatedLocation = yield sourceMaps.getGeneratedLocation(_extends({}, location.start, { sourceId }), source.toJS());
 
             var generatedSourceId = generatedLocation.sourceId;
             yield dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
 
-            expression = yield getSourcemapedExpression({ dispatch, sourceMaps }, generatedLocation, expression);
+            expression = yield (0, _expressions.getMappedExpression)({ sourceMaps }, generatedLocation, expression);
           }
 
           var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
 
-          var _ref13 = yield client.evaluate(expression, {
+          var _ref11 = yield client.evaluate(expression, {
             frameId: selectedFrame.id
           }),
-              result = _ref13.result;
+              result = _ref11.result;
 
           if (result === undefined) {
             return;
           }
 
           return {
             expression,
             result,
             location,
             tokenPos,
             cursorPos
           };
         })()
       });
     });
 
-    return function (_x7) {
-      return _ref10.apply(this, arguments);
+    return function (_x4) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 1060 */,
 /* 1061 */,
 /* 1062 */,
@@ -40473,16 +40102,20 @@ function setPreview(token, tokenPos, cur
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -40493,17 +40126,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(866);
+__webpack_require__(1238);
 
 var _sourcesTree = __webpack_require__(39);
 
 var _highlight = __webpack_require__(1184);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class TextSearch extends _react.Component {
@@ -40701,27 +40334,27 @@ class TextSearch extends _react.Componen
       ),
       this.renderResults()
     );
   }
 }
 
 exports.default = TextSearch;
 TextSearch.propTypes = {
-  sources: _react.PropTypes.object,
-  results: _react.PropTypes.array,
-  query: _react.PropTypes.string,
-  closeActiveSearch: _react.PropTypes.func,
-  searchSources: _react.PropTypes.func,
-  selectSource: _react.PropTypes.func,
-  searchBottomBar: _react.PropTypes.object
+  sources: _propTypes2.default.object,
+  results: _propTypes2.default.array,
+  query: _propTypes2.default.string,
+  closeActiveSearch: _propTypes2.default.func,
+  searchSources: _propTypes2.default.func,
+  selectSource: _propTypes2.default.func,
+  searchBottomBar: _propTypes2.default.object
 };
 
 TextSearch.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 /***/ }),
 /* 1065 */,
 /* 1066 */,
 /* 1067 */,
 /* 1068 */,
 /* 1069 */,
@@ -40765,41 +40398,17 @@ TextSearch.contextTypes = {
 /* 1107 */,
 /* 1108 */,
 /* 1109 */,
 /* 1110 */,
 /* 1111 */,
 /* 1112 */,
 /* 1113 */,
 /* 1114 */,
-/* 1115 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.findSourceMatches = exports.searchSources = exports.getMatches = exports.stopSearchWorker = exports.startSearchWorker = undefined;
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startSearchWorker = exports.startSearchWorker = dispatcher.start.bind(dispatcher);
-var stopSearchWorker = exports.stopSearchWorker = dispatcher.stop.bind(dispatcher);
-
-var getMatches = exports.getMatches = dispatcher.task("getMatches");
-var searchSources = exports.searchSources = dispatcher.task("searchSources");
-var findSourceMatches = exports.findSourceMatches = dispatcher.task("findSourceMatches");
-
-/***/ }),
+/* 1115 */,
 /* 1116 */,
 /* 1117 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 32 32\"><rect fill=\"#002f42\" width=\"16\" x=\"0\" y=\"28\" height=\"4\"></rect><rect fill=\"#0072b1\" width=\"16\" x=\"16\" y=\"28\" height=\"4\"></rect></svg>"
 
 /***/ }),
 /* 1118 */
@@ -40828,17 +40437,17 @@ exports.default = renderWhyPaused;
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _lodash = __webpack_require__(2);
 
 var _pause = __webpack_require__(255);
 
-__webpack_require__(913);
+__webpack_require__(1262);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderExceptionSummary(exception) {
   if ((0, _lodash.isString)(exception)) {
     return exception;
   }
 
@@ -40953,44 +40562,17 @@ function getInScopeLines(state) {
 /***/ }),
 /* 1125 */,
 /* 1126 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg enable-background=\"new 0 0 800 800\" id=\"GUIDE\" version=\"1.1\" viewBox=\"0 0 800 800\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><path d=\"M580.562,219.439c-12.721-12.723-29.637-19.728-47.623-19.728c-17.987,0-34.903,7.005-47.625,19.728 c-12.72,12.72-19.725,29.634-19.725,47.621c0,17.99,7.005,34.904,19.725,47.625c12.722,12.721,29.633,19.723,47.618,19.726 c0.007,0,0.007,0,0.007,0c17.986,0,34.902-7.005,47.623-19.726c12.721-12.723,19.726-29.636,19.726-47.625 C600.286,249.073,593.281,232.16,580.562,219.439z M553.771,287.895c-5.566,5.568-12.96,8.636-20.834,8.636l0,0 c-7.872-0.002-15.271-3.068-20.834-8.636c-5.566-5.562-8.633-12.96-8.633-20.834c0-7.868,3.065-15.269,8.633-20.834 c5.563-5.565,12.967-8.63,20.834-8.63c7.868,0,15.268,3.063,20.834,8.63C565.263,257.715,565.263,276.407,553.771,287.895z\" fill=\"#041C3F\"></path><g><path d=\"M62.282,627.218c-4.847,0-9.693-1.847-13.392-5.546c-7.398-7.397-7.398-19.395,0-26.79L158.42,485.35 c7.398-7.397,19.392-7.397,26.79,0s7.398,19.395,0,26.792L75.676,621.672C71.978,625.371,67.131,627.218,62.282,627.218z\" fill=\"#041C3F\"></path></g><g><path d=\"M86.774,732.172c-4.85,0-9.696-1.85-13.395-5.549c-7.398-7.397-7.398-19.389,0-26.786L187.545,585.67 c7.398-7.398,19.392-7.398,26.787,0c7.398,7.398,7.398,19.393,0,26.79L100.168,726.623C96.47,730.322,91.62,732.172,86.774,732.172 z\" fill=\"#041C3F\"></path></g><g><path d=\"M191.725,756.661c-4.849,0-9.696-1.847-13.395-5.546c-7.398-7.397-7.398-19.393,0-26.789L287.863,614.79 c7.396-7.394,19.392-7.396,26.787,0c7.398,7.397,7.398,19.395,0,26.793L205.12,751.115 C201.421,754.813,196.574,756.661,191.725,756.661z\" fill=\"#041C3F\"></path></g><path d=\"M751.113,48.891c-4.302-4.3-10.409-6.278-16.403-5.311c-2.202,0.357-54.705,8.98-126.25,36.316 c-41.974,16.034-81.85,35.237-118.529,57.076c-45.039,26.814-85.356,57.721-119.899,91.871l-143.055,27.85 c-3.693,0.718-7.086,2.524-9.753,5.177L87.618,391.06c-5.907,5.886-7.267,14.938-3.36,22.301c3.33,6.27,9.818,10.059,16.725,10.059 c1.202,0,2.415-0.114,3.628-0.347l146.185-28.463c-9.516,18.672-18.419,38.055-26.683,58.144 c-2.904,7.072-1.279,15.194,4.125,20.603l35.811,35.811l-33.27,33.27c-7.398,7.398-7.398,19.39,0,26.787 c3.699,3.699,8.545,5.549,13.397,5.549c4.847,0,9.693-1.85,13.392-5.546l33.27-33.271l35.811,35.813 c3.625,3.619,8.469,5.548,13.4,5.548c2.423,0,4.871-0.467,7.199-1.426c20.091-8.262,39.475-17.165,58.141-26.678l-28.455,146.186 c-1.593,8.183,2.35,16.443,9.709,20.352c2.806,1.488,5.852,2.213,8.879,2.213c4.917,0,9.778-1.918,13.417-5.573l129.188-129.604 c2.656-2.663,4.459-6.061,5.181-9.753l27.845-143.055c34.148-34.547,65.06-74.859,91.876-119.901 c21.834-36.683,41.04-76.558,57.077-118.529c27.33-71.551,35.958-124.048,36.313-126.25 C757.386,59.292,755.407,53.188,751.113,48.891z M158.393,374.001l81.489-81.224l87.674-17.069 c-19.015,23.391-36.655,48.634-52.847,75.648L158.393,374.001z M507.219,560.121l-81.222,81.489l22.643-116.316 c27.021-16.192,52.259-33.83,75.648-52.848L507.219,560.121z M684.359,178.936c-23.915,62.371-68.01,152.302-142.237,226.531 c-34.171,34.168-73.96,64.54-118.89,90.838c-0.804,0.401-1.585,0.854-2.322,1.366c-24.049,13.943-49.566,26.728-76.476,38.302 l-26.806-26.809l54.11-54.106c7.395-7.397,7.395-19.392,0-26.79c-7.398-7.397-19.392-7.396-26.79,0l-54.109,54.106l-26.806-26.809 c11.578-26.913,24.361-52.433,38.308-76.488c0.508-0.732,0.951-1.5,1.35-2.295c26.298-44.938,56.672-84.732,90.849-118.909 c74.225-74.225,164.156-118.319,226.527-142.235c37.897-14.537,70.522-23.601,92.09-28.797 C707.959,108.412,698.894,141.038,684.359,178.936z\" fill=\"#041C3F\"></path></svg>"
 
 /***/ }),
-/* 1127 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.containsPosition = containsPosition;
-exports.containsLocation = containsLocation;
-exports.nodeContainsPosition = nodeContainsPosition;
-function containsPosition(a, b) {
-  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
-  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
-
-  return startsBefore && endsAfter;
-}
-
-function containsLocation(a, b) {
-  return containsPosition(a, b.start) && containsPosition(a, b.end);
-}
-
-function nodeContainsPosition(node, position) {
-  return containsPosition(node.loc, position);
-}
-
-/***/ }),
+/* 1127 */,
 /* 1128 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -41022,17 +40604,17 @@ var _require = __webpack_require__(830),
     Menu = _require.Menu,
     MenuItem = _require.MenuItem;
 
 function inToolbox() {
   return window.parent.document.documentURI == "about:devtools-toolbox";
 }
 
 if (!inToolbox()) {
-  __webpack_require__(854);
+  __webpack_require__(1224);
 }
 
 function createPopup(doc) {
   var popup = doc.createElement("menupopup");
   popup.className = "landing-popup";
   if (popup.openPopupAtScreen) {
     return popup;
   }
@@ -41693,113 +41275,31 @@ function createSyncData(pendingBreakpoin
   var overrides = _extends({}, pendingBreakpoint, { generatedLocation });
   var breakpoint = (0, _breakpoint.createBreakpoint)(location, overrides);
 
   (0, _breakpoint.assertBreakpoint)(breakpoint);
   return { breakpoint, previousLocation };
 }
 
 /***/ }),
-/* 1138 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = buildQuery;
-
-var _escapeRegExp = __webpack_require__(259);
-
-var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Ignore doing outline matches for less than 3 whitespaces
- *
- * @memberof utils/source-search
- * @static
- */
-function ignoreWhiteSpace(str) {
-  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
-  );
-}
-
-
-function wholeMatch(query, wholeWord) {
-  if (query === "" || !wholeWord) {
-    return query;
-  }
-
-  return `\\b${query}\\b`;
-}
-
-function buildFlags(caseSensitive, isGlobal) {
-  if (caseSensitive && isGlobal) {
-    return "g";
-  }
-
-  if (!caseSensitive && isGlobal) {
-    return "gi";
-  }
-
-  if (!caseSensitive && !isGlobal) {
-    return "i";
-  }
-
-  return;
-}
-
-function buildQuery(originalQuery, modifiers, _ref) {
-  var _ref$isGlobal = _ref.isGlobal,
-      isGlobal = _ref$isGlobal === undefined ? false : _ref$isGlobal,
-      _ref$ignoreSpaces = _ref.ignoreSpaces,
-      ignoreSpaces = _ref$ignoreSpaces === undefined ? false : _ref$ignoreSpaces;
-  var caseSensitive = modifiers.caseSensitive,
-      regexMatch = modifiers.regexMatch,
-      wholeWord = modifiers.wholeWord;
-
-
-  if (originalQuery === "") {
-    return new RegExp(originalQuery);
-  }
-
-  var query = originalQuery;
-  if (ignoreSpaces) {
-    query = ignoreWhiteSpace(query);
-  }
-
-  if (!regexMatch) {
-    query = (0, _escapeRegExp2.default)(query);
-  }
-
-  query = wholeMatch(query, wholeWord);
-  var flags = buildFlags(caseSensitive, isGlobal);
-
-  if (flags) {
-    return new RegExp(query, flags);
-  }
-
-  return new RegExp(query);
-}
-
-/***/ }),
+/* 1138 */,
 /* 1139 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -41818,17 +41318,17 @@ var _SourceSearch2 = _interopRequireDefa
 var _ToggleSearch = __webpack_require__(284);
 
 var _ToggleSearch2 = _interopRequireDefault(_ToggleSearch);
 
 var _prefs = __webpack_require__(226);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(869);
+__webpack_require__(1242);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ProjectSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
@@ -41945,31 +41445,31 @@ class ProjectSearch extends _react.Compo
       "div",
       { className: "search-container" },
       this.isProjectSearchEnabled() ? this.renderTextSearch() : this.renderSourceSearch()
     );
   }
 }
 
 ProjectSearch.propTypes = {
-  sources: _react.PropTypes.object.isRequired,
-  results: _react.PropTypes.object,
-  textSearchQuery: _react.PropTypes.string,
-  setActiveSearch: _react.PropTypes.func.isRequired,
-  closeActiveSearch: _react.PropTypes.func.isRequired,
-  searchSources: _react.PropTypes.func,
-  activeSearch: _react.PropTypes.string,
-  selectSource: _react.PropTypes.func.isRequired,
-  sourceSearchQuery: _react.PropTypes.string,
-  setSourceSearchQuery: _react.PropTypes.func,
-  clearSourceSearchQuery: _react.PropTypes.func
+  sources: _propTypes2.default.object.isRequired,
+  results: _propTypes2.default.object,
+  textSearchQuery: _propTypes2.default.string,
+  setActiveSearch: _propTypes2.default.func.isRequired,
+  closeActiveSearch: _propTypes2.default.func.isRequired,
+  searchSources: _propTypes2.default.func,
+  activeSearch: _propTypes2.default.string,
+  selectSource: _propTypes2.default.func.isRequired,
+  sourceSearchQuery: _propTypes2.default.string,
+  setSourceSearchQuery: _propTypes2.default.func,
+  clearSourceSearchQuery: _propTypes2.default.func
 };
 
 ProjectSearch.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearch)(state),
   results: (0, _selectors.getTextSearchResults)(state),
   textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
   sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
@@ -41982,16 +41482,20 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _source = __webpack_require__(233);
 
 var _utils = __webpack_require__(234);
 
@@ -42033,17 +41537,17 @@ class SourceSearch extends _react.Compon
       },
       searchBottomBar
     );
   }
 }
 
 exports.default = SourceSearch;
 SourceSearch.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 /***/ }),
 /* 1142 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -42065,17 +41569,17 @@ var _text = __webpack_require__(389);
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-__webpack_require__(870);
+__webpack_require__(1243);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Outline = __webpack_require__(1145);
 
 var _Outline2 = _interopRequireDefault(_Outline);
@@ -42311,22 +41815,24 @@ var _redux = __webpack_require__(3);
 var _reactRedux = __webpack_require__(1189);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(871);
+__webpack_require__(1244);
 
 var _PreviewFunction = __webpack_require__(798);
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
+var _lodash = __webpack_require__(2);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
 
   selectItem(location) {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         selectSource = _props.selectSource;
@@ -42359,34 +41865,65 @@ class Outline extends _react.Component {
         key: `${name}:${location.start.line}:${location.start.column}`,
         className: "outline-list__element",
         onClick: () => this.selectItem(location)
       },
       _react2.default.createElement(_PreviewFunction2.default, { func: { name, parameterNames } })
     );
   }
 
-  renderFunctions(symbols) {
+  renderClassFunctions(functions) {
+    var classFunctions = functions.filter(func => func.name != "anonymous" && !!func.klass);
+
+    if (classFunctions.length == 0) {
+      return null;
+    }
+
+    var klass = classFunctions[0].klass;
+    var klassFunc = (0, _lodash.find)(functions, func => func.name === klass);
+
+    return _react2.default.createElement(
+      "div",
+      { className: "outline-list__class" },
+      _react2.default.createElement(
+        "h2",
+        null,
+        klassFunc ? this.renderFunction(klassFunc) : klass
+      ),
+      _react2.default.createElement(
+        "ul",
+        { className: "outline-list__class-list" },
+        classFunctions.map(func => this.renderFunction(func))
+      )
+    );
+  }
+
+  renderFunctions(functions) {
+    var classes = (0, _lodash.uniq)(functions.map(func => func.klass));
+
+    var namedFunctions = functions.filter(func => func.name != "anonymous" && !func.klass && !classes.includes(func.name));
+
     return _react2.default.createElement(
       "ul",
       { className: "outline-list" },
-      symbols.map(func => this.renderFunction(func))
+      namedFunctions.map(func => this.renderFunction(func)),
+      this.renderClassFunctions(functions)
     );
   }
 
   render() {
     var symbols = this.props.symbols;
 
 
     var symbolsToDisplay = symbols.functions.filter(func => func.name != "anonymous");
 
     return _react2.default.createElement(
       "div",
       { className: "outline" },
-      symbolsToDisplay.length > 0 ? this.renderFunctions(symbolsToDisplay) : this.renderPlaceholder()
+      symbolsToDisplay.length > 0 ? this.renderFunctions(symbols.functions) : this.renderPlaceholder()
     );
   }
 }
 
 exports.Outline = Outline;
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
@@ -42413,17 +41950,17 @@ var _redux = __webpack_require__(3);
 var _react = __webpack_require__(0);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(1161);
+__webpack_require__(1256);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EmptyLines extends _react.Component {
 
   componentDidMount() {
     this.disableEmptyLines();
   }
@@ -42480,50 +42017,46 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _redux = __webpack_require__(3);
-
-var _reactRedux = __webpack_require__(1189);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-var _reactImmutableProptypes = __webpack_require__(150);
-
-var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
-
-var _immutable = __webpack_require__(146);
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(1189);
 
 var _selectors = __webpack_require__(242);
 
-var _sourcesTree = __webpack_require__(39);
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
 
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
+var _sourcesTree = __webpack_require__(39);
+
+var _immutable = __webpack_require__(146);
+
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _clipboard = __webpack_require__(423);
 
 var _utils = __webpack_require__(234);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
@@ -42606,18 +42139,17 @@ class SourcesTree extends _react.Compone
     // state of ManagedTree, because it depends on item instances
     // being the same. The result is that if a source is added at a
     // later time, all expanded state is lost.
     var sourceTree = this.state.sourceTree;
     if (newSet.size > 0) {
       for (var source of newSet) {
         (0, _sourcesTree.addToTree)(uncollapsedTree, source, this.props.debuggeeUrl);
       }
-      var unsortedTree = (0, _sourcesTree.collapseTree)(uncollapsedTree);
-      sourceTree = (0, _sourcesTree.sortEntireTree)(unsortedTree, nextProps.debuggeeUrl);
+      sourceTree = (0, _sourcesTree.collapseTree)(uncollapsedTree);
     }
 
     this.setState({
       uncollapsedTree,
       sourceTree,
       parentMap: (0, _sourcesTree.createParentMap)(sourceTree)
     });
   }
@@ -42628,17 +42160,17 @@ class SourcesTree extends _react.Compone
 
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
   getIcon(item, depth) {
-    if (item.path === "/webpack://") {
+    if (item.path === "/Webpack") {
       return _react2.default.createElement(_Svg2.default, { name: "webpack" });
     }
 
     if (depth === 0) {
       return _react2.default.createElement(_Svg2.default, { name: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
@@ -42671,39 +42203,38 @@ class SourcesTree extends _react.Compone
     }
 
     (0, _devtoolsLaunchpad.showMenu)(event, menuOptions);
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
-    var arrow = _react2.default.createElement(_Svg2.default, {
+    var arrow = (0, _sourcesTree.nodeHasChildren)(item) ? _react2.default.createElement(_Svg2.default, {
       name: "arrow",
       className: (0, _classnames2.default)({
-        expanded: expanded,
-        hidden: !(0, _sourcesTree.nodeHasChildren)(item)
+        expanded: expanded
       }),
       onClick: e => {
         e.stopPropagation();
         setExpanded(item, !expanded);
       }
-    });
+    }) : _react2.default.createElement("i", { className: "no-arrow" });
 
     var icon = this.getIcon(item, depth);
     var paddingDir = "paddingRight";
     if (document.body && document.body.parentElement) {
       paddingDir = document.body.parentElement.dir == "ltr" ? "paddingLeft" : "paddingRight";
     }
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("node", { focused }),
-        style: { [paddingDir]: `${depth * 15}px` },
+        style: { [paddingDir]: `${depth * 15 + 5}px` },
         key: item.path,
         onClick: () => {
           this.selectItem(item);
           setExpanded(item, !expanded);
         },
         onContextMenu: e => this.onContextMenu(e, item)
       },
       arrow,
@@ -42768,26 +42299,29 @@ class SourcesTree extends _react.Compone
     return _react2.default.createElement(
       "div",
       { className: "sources-list", onKeyDown: onKeyDown },
       tree
     );
   }
 }
 
-SourcesTree.propTypes = {
-  sources: _reactImmutableProptypes2.default.map.isRequired,
-  selectSource: _react.PropTypes.func.isRequired,
-  shownSource: _react.PropTypes.string,
-  selectedSource: _reactImmutableProptypes2.default.map,
-  debuggeeUrl: _react.PropTypes.string.isRequired,
-  setExpandedState: _react.PropTypes.func,
-  expanded: _react.PropTypes.any
-};
-
+// Utils
+
+
+// Components
+
+
+// Types
+
+
+// Redux
+
+
+// React
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
     debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state),
     expanded: (0, _selectors.getExpandedState)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
@@ -42803,17 +42337,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.Workers = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(1162);
+__webpack_require__(1265);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _selectors = __webpack_require__(242);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Workers extends _react.PureComponent {
@@ -42917,17 +42451,17 @@ module.exports = "<!-- This Source Code 
 
 var _require = __webpack_require__(0),
     Component = _require.Component,
     createFactory = _require.createFactory,
     dom = _require.DOM,
     PropTypes = _require.PropTypes;
 
 var Tree = createFactory(__webpack_require__(1007).Tree);
-__webpack_require__(878);
+__webpack_require__(1251);
 
 var classnames = __webpack_require__(175);
 var Svg = __webpack_require__(1151);
 
 var _require2 = __webpack_require__(926),
     _require2$REPS = _require2.REPS,
     Rep = _require2$REPS.Rep,
     Grip = _require2$REPS.Grip;
@@ -44104,28 +43638,18 @@ exports.default = (0, _reactRedux.connec
     selectedSource,
     callSites: getCallSites(symbols, breakpoints),
     breakpoints: breakpoints
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(CallSites);
 
 /***/ }),
 /* 1160 */,
-/* 1161 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1162 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 1161 */,
+/* 1162 */,
 /* 1163 */,
 /* 1164 */,
 /* 1165 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* 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/. */
@@ -44169,47 +43693,44 @@ module.exports = networkRequest;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(882);
+__webpack_require__(1255);
 
 class CallSite extends _react.Component {
 
   constructor() {
     super();
 
+    this.addCallSite = nextProps => {
+      var _ref = nextProps || this.props,
+          editor = _ref.editor,
+          callSite = _ref.callSite,
+          breakpoint = _ref.breakpoint,
+          source = _ref.source;
+
+      var className = !breakpoint ? "call-site" : "call-site-bp";
+      var sourceId = source.get("id");
+      var editorRange = (0, _editor.toEditorRange)(sourceId, callSite.location);
+      this.marker = (0, _editor.markText)(editor, className, editorRange);
+    };
+
+    this.clearCallSite = () => {
+      if (this.marker) {
+        this.marker.clear();
+        this.marker = null;
+      }
+    };
+
     this.marker = undefined;
-    var self = this;
-    self.addCallSite = this.addCallSite.bind(this);
-    self.clearCallSite = this.clearCallSite.bind(this);
-  }
-
-  addCallSite(nextProps) {
-    var _ref = nextProps || this.props,
-        editor = _ref.editor,
-        callSite = _ref.callSite,
-        breakpoint = _ref.breakpoint,
-        source = _ref.source;
-
-    var className = !breakpoint ? "call-site" : "call-site-bp";
-    var sourceId = source.get("id");
-    var editorRange = (0, _editor.toEditorRange)(sourceId, callSite.location);
-    this.marker = (0, _editor.markText)(editor, className, editorRange);
-  }
-
-  clearCallSite() {
-    if (this.marker) {
-      this.marker.clear();
-      this.marker = null;
-    }
   }
 
   shouldComponentUpdate(nextProps) {
     return this.props.editor !== nextProps.editor;
   }
 
   componentDidMount() {
     var _props = this.props,
@@ -44406,63 +43927,55 @@ module.exports = {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.findFunctionText = findFunctionText;
 
 var _astBreakpointLocation = __webpack_require__(804);
 
+var _indentation = __webpack_require__(1214);
+
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
-function getIndentation(lines) {
-  var firstLine = lines[0];
-  var secondLine = lines[1];
-  var lastLine = lines[lines.length - 1];
-
-  var _getIndentation = line => line && line.match(/^\s*/)[0].length;
-
-  var indentations = [_getIndentation(firstLine), _getIndentation(secondLine), _getIndentation(lastLine)];
-
-  return Math.max.apply(Math, indentations.concat([0]));
-}
-
 function findFunctionText(line, source, symbols) {
   var func = (0, _astBreakpointLocation.findClosestScope)(symbols.functions, { line, column: Infinity });
   if (!func) {
     return null;
   }
 
   var _func$location = func.location,
       start = _func$location.start,
       end = _func$location.end;
 
   var lines = source.text.split("\n");
   var firstLine = lines[start.line - 1].slice(start.column);
   var lastLine = lines[end.line - 1].slice(0, end.column);
   var middle = lines.slice(start.line, end.line - 1);
-  var functionLines = [firstLine].concat(_toConsumableArray(middle), [lastLine]);
-
-  var indentation = getIndentation(functionLines);
-  var formattedLines = functionLines.map(_line => _line.replace(new RegExp(`^\\s{0,${indentation - 1}}`), ""));
-
-  return formattedLines.join("\n").trim();
+  var functionText = [firstLine].concat(_toConsumableArray(middle), [lastLine]).join("\n");
+  var indentedFunctionText = (0, _indentation.correctIndentation)(functionText);
+
+  return indentedFunctionText;
 }
 
 /***/ }),
 /* 1170 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -44483,17 +43996,17 @@ var _Modal2 = _interopRequireDefault(_Mo
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
 
-__webpack_require__(962);
+__webpack_require__(1271);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function formatSymbol(symbol) {
   return {
     id: `${symbol.name}:${symbol.location.start.line}`,
     title: symbol.name,
     subtitle: `:${symbol.location.start.line}`,
@@ -44501,117 +44014,167 @@ function formatSymbol(symbol) {
     location: symbol.location
   };
 }
 
 class SymbolModal extends _react.Component {
 
   constructor(props) {
     super(props);
+
+    this.onClick = e => {
+      e.stopPropagation();
+    };
+
+    this.onChange = e => {
+      var selectedSource = this.props.selectedSource;
+
+      if (!selectedSource || !selectedSource.get("text")) {
+        return;
+      }
+
+      this.setState({ query: e.target.value });
+      return this.updateResults(e.target.value);
+    };
+
+    this.closeModal = () => {
+      this.props.closeActiveSearch();
+      this.props.clearHighlightLineRange();
+    };
+
+    this.selectResultItem = (e, item) => {
+      var _props = this.props,
+          selectSource = _props.selectSource,
+          selectedSource = _props.selectedSource;
+
+
+      if (!selectedSource || !item) {
+        return;
+      }
+
+      selectSource(selectedSource.get("id"), {
+        line: item.location.start.line
+      });
+
+      this.closeModal();
+    };
+
+    this.updateResults = query => {
+      var _props2 = this.props,
+          symbolType = _props2.symbolType,
+          symbols = _props2.symbols;
+
+
+      var symbolSearchResults = symbols[symbolType];
+      if (query == "") {
+        this.setState({ results: symbolSearchResults });
+        return;
+      }
+
+      symbolSearchResults = (0, _fuzzaldrinPlus.filter)(symbolSearchResults, query, {
+        key: "value"
+      });
+
+      this.setState({ results: symbolSearchResults });
+    };
+
+    this.traverseResults = direction => {
+      var _state = this.state,
+          resultsIndex = _state.resultsIndex,
+          results = _state.results;
+
+      var resultCount = this.resultsCount();
+      var index = resultsIndex + direction;
+      var nextIndex = (index + resultCount) % resultCount;
+
+      this.setState({ resultsIndex: nextIndex });
+
+      if (results) {
+        this.onSelectResultItem(results[nextIndex]);
+      }
+    };
+
+    this.onKeyUp = e => {
+      e.preventDefault();
+      var enabled = this.props.enabled;
+      var _state2 = this.state,
+          results = _state2.results,
+          resultsIndex = _state2.resultsIndex;
+
+
+      if (!enabled || !results) {
+        return;
+      }
+
+      if (e.key === "ArrowUp") {
+        this.traverseResults(-1);
+      } else if (e.key === "ArrowDown") {
+        this.traverseResults(1);
+      } else if (e.key === "Enter") {
+        this.selectResultItem(e, results[resultsIndex]);
+        this.closeModal();
+      } else if (e.key === "Tab") {
+        this.closeModal();
+      }
+    };
+
+    this.renderResults = () => {
+      var _state3 = this.state,
+          resultsIndex = _state3.resultsIndex,
+          results = _state3.results;
+      var enabled = this.props.enabled;
+
+      if (!enabled || !results) {
+        return null;
+      }
+
+      return _react2.default.createElement(_ResultList2.default, {
+        key: "results",
+        items: results,
+        selected: resultsIndex,
+        selectItem: this.selectResultItem,
+        ref: "resultList"
+      });
+    };
+
+    this.buildSummaryMsg = () => {
+      var resultsIndex = this.state.resultsIndex;
+
+      var count = this.resultsCount();
+
+      if (count > 1) {
+        return L10N.getFormatStr("editor.searchResults", resultsIndex + 1, count);
+      } else if (count === 1) {
+        return L10N.getFormatStr("editor.singleResult");
+      }
+    };
+
+    this.buildPlaceHolder = () => {
+      var symbolType = this.props.symbolType;
+
+      return L10N.getFormatStr(`symbolSearch.search.${symbolType}Placeholder`);
+    };
+
     this.state = { results: null, query: "", resultsIndex: 0 };
-
-    var self = this;
-    self.onClick = this.onClick.bind(this);
-    self.closeModal = this.closeModal.bind(this);
-    self.onChange = this.onChange.bind(this);
-    self.onKeyUp = this.onKeyUp.bind(this);
-    self.updateResults = this.updateResults.bind(this);
-    self.traverseResults = this.traverseResults.bind(this);
-    self.renderResults = this.renderResults.bind(this);
-    self.buildSummaryMsg = this.buildSummaryMsg.bind(this);
-    self.buildPlaceHolder = this.buildPlaceHolder.bind(this);
-    self.selectResultItem = this.selectResultItem.bind(this);
   }
 
   componentDidMount() {
     this.updateResults(this.state.query);
   }
 
   componentDidUpdate(prevProps, prevState) {
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.resultsIndex);
     }
 
     if (!prevProps.enabled && this.props.enabled) {
       this.updateResults(this.state.query);
     }
   }
 
-  onClick(e) {
-    e.stopPropagation();
-  }
-
-  onChange(e) {
-    var selectedSource = this.props.selectedSource;
-
-    if (!selectedSource || !selectedSource.get("text")) {
-      return;
-    }
-
-    this.setState({ query: e.target.value });
-    return this.updateResults(e.target.value);
-  }
-
-  closeModal() {
-    this.props.closeActiveSearch();
-    this.props.clearHighlightLineRange();
-  }
-
-  selectResultItem(e, item) {
-    var _props = this.props,
-        selectSource = _props.selectSource,
-        selectedSource = _props.selectedSource;
-
-
-    if (!selectedSource || !item) {
-      return;
-    }
-
-    selectSource(selectedSource.get("id"), {
-      line: item.location.start.line
-    });
-
-    this.closeModal();
-  }
-
-  updateResults(query) {
-    var _props2 = this.props,
-        symbolType = _props2.symbolType,
-        symbols = _props2.symbols;
-
-
-    var symbolSearchResults = symbols[symbolType];
-    if (query == "") {
-      this.setState({ results: symbolSearchResults });
-      return;
-    }
-
-    symbolSearchResults = (0, _fuzzaldrinPlus.filter)(symbolSearchResults, query, {
-      key: "value"
-    });
-
-    this.setState({ results: symbolSearchResults });
-  }
-
-  traverseResults(direction) {
-    var _state = this.state,
-        resultsIndex = _state.resultsIndex,
-        results = _state.results;
-
-    var resultCount = this.resultsCount();
-    var index = resultsIndex + direction;
-    var nextIndex = (index + resultCount) % resultCount;
-
-    this.setState({ resultsIndex: nextIndex });
-
-    if (results) {
-      this.onSelectResultItem(results[nextIndex]);
-    }
-  }
-
   onSelectResultItem(item) {
     var _props3 = this.props,
         selectSource = _props3.selectSource,
         selectedSource = _props3.selectedSource,
         symbolType = _props3.symbolType,
         highlightLineRange = _props3.highlightLineRange;
 
 
@@ -44625,59 +44188,16 @@ class SymbolModal extends _react.Compone
       highlightLineRange({
         start: item.location.start.line,
         end: item.location.end.line,
         sourceId: selectedSource.get("id")
       });
     }
   }
 
-  onKeyUp(e) {
-    e.preventDefault();
-    var enabled = this.props.enabled;
-    var _state2 = this.state,
-        results = _state2.results,
-        resultsIndex = _state2.resultsIndex;
-
-
-    if (!enabled || !results) {
-      return;
-    }
-
-    if (e.key === "ArrowUp") {
-      this.traverseResults(-1);
-    } else if (e.key === "ArrowDown") {
-      this.traverseResults(1);
-    } else if (e.key === "Enter") {
-      this.selectResultItem(e, results[resultsIndex]);
-      this.closeModal();
-    } else if (e.key === "Tab") {
-      this.closeModal();
-    }
-  }
-
-  renderResults() {
-    var _state3 = this.state,
-        resultsIndex = _state3.resultsIndex,
-        results = _state3.results;
-    var enabled = this.props.enabled;
-
-    if (!enabled || !results) {
-      return null;
-    }
-
-    return _react2.default.createElement(_ResultList2.default, {
-      key: "results",
-      items: results,
-      selected: resultsIndex,
-      selectItem: this.selectResultItem,
-      ref: "resultList"
-    });
-  }
-
   renderInput() {
     var query = this.state.query;
 
 
     return _react2.default.createElement(
       "div",
       { key: "input", className: "input-wrapper" },
       _react2.default.createElement(_SearchInput2.default, {
@@ -44689,38 +44209,20 @@ class SymbolModal extends _react.Compone
         onKeyUp: this.onKeyUp,
         handleNext: () => this.traverseResults(1),
         handlePrev: () => this.traverseResults(-1),
         handleClose: this.closeModal
       })
     );
   }
 
-  buildSummaryMsg() {
-    var resultsIndex = this.state.resultsIndex;
-
-    var count = this.resultsCount();
-
-    if (count > 1) {
-      return L10N.getFormatStr("editor.searchResults", resultsIndex + 1, count);
-    } else if (count === 1) {
-      return L10N.getFormatStr("editor.singleResult");
-    }
-  }
-
   resultsCount() {
     return this.state.results ? this.state.results.length : 0;
   }
 
-  buildPlaceHolder() {
-    var symbolType = this.props.symbolType;
-
-    return L10N.getFormatStr(`symbolSearch.search.${symbolType}Placeholder`);
-  }
-
   render() {
     var enabled = this.props.enabled;
 
 
     if (!enabled) {
       return null;
     }
 
@@ -44729,17 +44231,17 @@ class SymbolModal extends _react.Compone
       { "in": enabled, handleClose: this.closeModal },
       this.renderInput(),
       this.renderResults()
     );
   }
 }
 
 SymbolModal.contextTypes = {
-  shortcuts: _react.PropTypes.object
+  shortcuts: _propTypes2.default.object
 };
 
 function _getFormattedSymbols(state, source) {
   if (!source) {
     return { variables: [], functions: [] };
   }
 
   var _getSymbols = (0, _selectors.getSymbols)(state, source.toJS()),
@@ -44949,38 +44451,39 @@ function getExpandedState(state) {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.sanitizeInput = sanitizeInput;
 exports.wrapExpression = wrapExpression;
 exports.getValue = getValue;
 
+var _indentation = __webpack_require__(1214);
 
 // replace quotes and slashes that could interfere with the evaluation.
 function sanitizeInput(input) {
   return input.replace(/\\/g, "\\\\").replace(/"/g, "\\$&");
 }
 
 /*
  * wrap the expression input in a try/catch so that it can be safely
  * evaluated.
  *
  * NOTE: we add line after the expression to protect against comments.
 */
 
 
 function wrapExpression(input) {
-  return `eval(\`
+  return (0, _indentation.correctIndentation)(`
     try {
       ${sanitizeInput(input)}
     } catch (e) {
       e
     }
-  \`)`.trim();
+  `);
 }
 
 function getValue(expression) {
   var value = expression.value;
   if (!value) {
     return {
       path: expression.from,
       value: { unavailable: true }
@@ -45129,17 +44632,17 @@ var _Modal = __webpack_require__(332);
 var _Modal2 = _interopRequireDefault(_Modal);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _text = __webpack_require__(389);
 
-__webpack_require__(1182);
+__webpack_require__(1227);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ShortcutsModal extends _react.Component {
 
   renderPrettyCombos(combo) {
     return combo.split(" ").map(c => _react2.default.createElement(
       "span",
@@ -45249,27 +44752,20 @@ class ShortcutsModal extends _react.Comp
         "in": enabled,
         additionalClass: "shortcuts-modal",
         handleClose: this.props.handleClose
       },
       this.renderShortcutsContent()
     );
   }
 }
-
 exports.ShortcutsModal = ShortcutsModal;
-ShortcutsModal.displayName = "ShortcutsModal";
-
-/***/ }),
-/* 1182 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+
+/***/ }),
+/* 1182 */,
 /* 1183 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 18.200781 11.335548\" id=\"svg2\" version=\"1.1\" inkscape:version=\"0.91 r13725\" sodipodi:docname=\"shortcut.svg\" style=\"fill:#000000\"><path d=\"m -0.90376632,-5.8726701 24.00000032,0 0,24.0000001 -24.00000032,0 z\" id=\"path6\" inkscape:connector-curvature=\"0\" style=\"fill:none\"></path><path id=\"path4160\" style=\"font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:-1.55000007px;word-spacing:0px;fill:#241f1c;fill-opacity:1;stroke:#241f1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"m 0.2,0.2 0,10.935547 1.4785157,0 0,-5.2675782 5.2519531,5.2675782 1.9472656,0 L 3.0632813,5.2976562 8.4910157,0.2 6.5867188,0.2 1.6785157,4.8210938 1.6785157,0.2 Z m 12.490235,0.8840675 0,4.078125 -4.0800787,0 0,1.2460938 4.0800787,0 0,4.0800777 1.230468,0 0,-4.0800777 4.080078,0 0,-1.2460938 -4.080078,0 0,-4.078125 z\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ccccccccccccccccccccccccc\"></path></svg>"
 
 /***/ }),
 /* 1184 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -45336,17 +44832,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(918);
+__webpack_require__(1215);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function debugBtn(onClick, type, className, tooltip) {
   var disabled = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
 
   var props = {
     onClick,
@@ -45361,17 +44857,17 @@ function debugBtn(onClick, type, classNa
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
     _react2.default.createElement(_Svg2.default, { name: type })
   );
 }
 
 class UtilsBar extends _react.Component {
 
   renderUtilButtons() {
-    return [debugBtn(this.props.toggleShortcutsModal, "shortcut", "active", "shortcuts", false)];
+    return [debugBtn(this.props.toggleShortcutsModal, "shortcut", "active", L10N.getStr("shortcuts.buttonName"), false)];
   }
 
   render() {
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("command-bar bottom", {
           vertical: !this.props.horizontal
@@ -46744,11 +46240,716 @@ function replaceOriginalVariableName(exp
   // with found generated name.
   const generatedName = foundScope.bindings[originalName];
   const expressionWoOriginalName = expression.substring(originalName.length);
   return `${generatedName}${expressionWoOriginalName}`;
 }
 
 module.exports = { replaceOriginalVariableName };
 
+/***/ }),
+/* 1207 */,
+/* 1208 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.hasSyntaxError = exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearScopes = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getScopes = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
+var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
+
+var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
+var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
+var getScopes = exports.getScopes = dispatcher.task("getScopes");
+var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
+var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
+var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
+var clearScopes = exports.clearScopes = dispatcher.task("clearScopes");
+var clearASTs = exports.clearASTs = dispatcher.task("clearASTs");
+var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
+var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
+var hasSource = exports.hasSource = dispatcher.task("hasSource");
+var setSource = exports.setSource = dispatcher.task("setSource");
+var clearSources = exports.clearSources = dispatcher.task("clearSources");
+var hasSyntaxError = exports.hasSyntaxError = dispatcher.task("hasSyntaxError");
+
+/***/ }),
+/* 1209 */,
+/* 1210 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.findSourceMatches = exports.searchSources = exports.getMatches = exports.stopSearchWorker = exports.startSearchWorker = undefined;
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startSearchWorker = exports.startSearchWorker = dispatcher.start.bind(dispatcher);
+var stopSearchWorker = exports.stopSearchWorker = dispatcher.stop.bind(dispatcher);
+
+var getMatches = exports.getMatches = dispatcher.task("getMatches");
+var searchSources = exports.searchSources = dispatcher.task("searchSources");
+var findSourceMatches = exports.findSourceMatches = dispatcher.task("findSourceMatches");
+
+/***/ }),
+/* 1211 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = buildQuery;
+
+var _escapeRegExp = __webpack_require__(259);
+
+var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str) {
+  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
+  );
+}
+
+
+function wholeMatch(query, wholeWord) {
+  if (query === "" || !wholeWord) {
+    return query;
+  }
+
+  return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive, isGlobal) {
+  if (caseSensitive && isGlobal) {
+    return "g";
+  }
+
+  if (!caseSensitive && isGlobal) {
+    return "gi";
+  }
+
+  if (!caseSensitive && !isGlobal) {
+    return "i";
+  }
+
+  return;
+}
+
+function buildQuery(originalQuery, modifiers, _ref) {
+  var _ref$isGlobal = _ref.isGlobal,
+      isGlobal = _ref$isGlobal === undefined ? false : _ref$isGlobal,
+      _ref$ignoreSpaces = _ref.ignoreSpaces,
+      ignoreSpaces = _ref$ignoreSpaces === undefined ? false : _ref$ignoreSpaces;
+  var caseSensitive = modifiers.caseSensitive,
+      regexMatch = modifiers.regexMatch,
+      wholeWord = modifiers.wholeWord;
+
+
+  if (originalQuery === "") {
+    return new RegExp(originalQuery);
+  }
+
+  var query = originalQuery;
+  if (ignoreSpaces) {
+    query = ignoreWhiteSpace(query);
+  }
+
+  if (!regexMatch) {
+    query = (0, _escapeRegExp2.default)(query);
+  }
+
+  query = wholeMatch(query, wholeWord);
+  var flags = buildFlags(caseSensitive, isGlobal);
+
+  if (flags) {
+    return new RegExp(query, flags);
+  }
+
+  return new RegExp(query);
+}
+
+/***/ }),
+/* 1212 */,
+/* 1213 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.prettyPrint = exports.stopPrettyPrintWorker = exports.startPrettyPrintWorker = undefined;
+
+var prettyPrint = exports.prettyPrint = (() => {
+  var _ref = _asyncToGenerator(function* (_ref2) {
+    var source = _ref2.source,
+        url = _ref2.url;
+
+    var indent = 2;
+
+    (0, _assert2.default)((0, _source.isJavaScript)(source), "Can't prettify non-javascript files.");
+
+    return yield _prettyPrint({
+      url,
+      indent,
+      source: source.text
+    });
+  });
+
+  return function prettyPrint(_x) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var _source = __webpack_require__(233);
+
+var _assert = __webpack_require__(223);
+
+var _assert2 = _interopRequireDefault(_assert);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startPrettyPrintWorker = exports.startPrettyPrintWorker = dispatcher.start.bind(dispatcher);
+var stopPrettyPrintWorker = exports.stopPrettyPrintWorker = dispatcher.stop.bind(dispatcher);
+var _prettyPrint = dispatcher.task("prettyPrint");
+
+/***/ }),
+/* 1214 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.correctIndentation = correctIndentation;
+function getIndentation(lines) {
+  var firstLine = lines[0];
+  var secondLine = lines[1];
+  var lastLine = lines[lines.length - 1];
+
+  var _getIndentation = line => line && line.match(/^\s*/)[0].length;
+
+  var indentations = [_getIndentation(firstLine), _getIndentation(secondLine), _getIndentation(lastLine)];
+
+  return Math.max.apply(Math, indentations);
+}
+
+function correctIndentation(text) {
+  var lines = text.trim().split("\n");
+  var indentation = getIndentation(lines);
+  var formattedLines = lines.map(_line => _line.replace(new RegExp(`^\\s{0,${indentation - 1}}`), ""));
+
+  return formattedLines.join("\n");
+}
+
+/***/ }),
+/* 1215 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1216 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1217 */,
+/* 1218 */,
+/* 1219 */,
+/* 1220 */,
+/* 1221 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1222 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1223 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1224 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1225 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1226 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1227 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1228 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1229 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1230 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1231