merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sun, 03 Sep 2017 10:54:14 +0200
changeset 427984 37824bf5c5b08afa7e689fceb935b8f457ebd9eb
parent 427967 59db725def8282e1d77e83f002d247c7d0f95237 (current diff)
parent 427983 fc9d1811487a2ce8ed2403607fbd168fd2cbc5d9 (diff)
child 427985 a021dc7ffe63cb3b8fe9e0388a1653bb12ff1850
child 427988 0991b275888d200772a54f624a814f0c6060d394
child 427996 38afd700a0ebc04650aa4e178d7b111f596c0c2d
push id7761
push userjlund@mozilla.com
push dateFri, 15 Sep 2017 00:19:52 +0000
treeherdermozilla-beta@c38455951db4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone57.0a1
first release with
nightly linux32
37824bf5c5b0 / 57.0a1 / 20170903100443 / files
nightly linux64
37824bf5c5b0 / 57.0a1 / 20170903100443 / files
nightly mac
37824bf5c5b0 / 57.0a1 / 20170903100443 / files
nightly win32
37824bf5c5b0 / 57.0a1 / 20170903100443 / files
nightly win64
37824bf5c5b0 / 57.0a1 / 20170903100443 / 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: 47jGmg0qsJV
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -7,17 +7,17 @@
   display: flex;
   width: 100vw;
   height: 100vh;
   flex-direction: row;
   align-items: stretch;
   /* Customs properties */
   --title-font-size: 24px;
   --ui-element-font-size: 16px;
-  --primary-line-height: 30px;
+  --primary-line-height: 22px;
   --secondary-line-height: 25px;
   --base-spacing: 20px;
   --base-transition: all 0.25s ease;
 }
 
 .landing-popup {
   min-width: 0;
 }
@@ -50,24 +50,25 @@
 .landing-page .panel .hero {
   height: 100%;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
 }
 
-.landing-page .panel input[type=button] {
+.landing-page button {
   background-color: var(--theme-tab-toolbar-background);
   color: var(--theme-comment);
   font-size: var(--ui-element-font-size);
   border: 1px solid var(--theme-splitter-color);
   padding: calc(var(--base-spacing) / 2);
   margin: 0 var(--base-spacing);
   transition: var(--base-transition);
+  cursor: pointer;
 }
 
 .landing-page .panel header h1 {
   color: var(--theme-body-color);
   font-size: var(--title-font-size);
   margin: 0;
   line-height: var(--primary-line-height);
   font-weight: normal;
@@ -98,16 +99,37 @@
 }
 
 .landing-page .panel .footer-note {
   padding: var(--base-spacing) 0;
   text-align: center;
   font-size: 14px;
   color: var(--theme-comment);
 }
+
+.landing-page .panel .launch-action-container {
+  text-align: center;
+}
+
+.landing-page .panel .under-construction {
+  display: flex;
+  width: 417px;
+  color: var(--theme-comment);
+  font-size: calc(var(--ui-element-font-size) / 1);
+  margin: var(--base-spacing) auto;
+  line-height: 1.4em;
+}
+
+.landing-page .panel .under-construction .under-construction-message {
+  max-width: 350px;
+}
+
+.landing-page .panel .under-construction .github-link {
+  display: block;
+}
 /* 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/. */
 
 .landing-page .tab-group {
   flex: 1;
   overflow-y: auto;
 }
@@ -165,30 +187,31 @@
 .landing-page .tab.active .tab-url {
   color: var(--theme-highlight-gray);
 }
 /* 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/. */
 
 .landing-page .sidebar {
+  --sidebar-width: 200px;
   display: flex;
   background-color: var(--theme-tab-toolbar-background);
-  width: 200px;
+  width: var(--sidebar-width);
   flex-direction: column;
   border-right: 1px solid var(--theme-splitter-color);
 }
 
 .landing-page .sidebar h1 {
   color: var(--theme-body-color);
   font-size: var(--title-font-size);
   margin: 0;
   line-height: var(--primary-line-height);
-  font-weight: normal;
-  padding: calc(2 * var(--base-spacing)) var(--base-spacing);
+  font-weight: bold;
+  padding: var(--base-spacing) var(--base-spacing);
 }
 
 .landing-page .sidebar ul {
   list-style: none;
   padding: 0;
   line-height: var(--primary-line-height);
   font-size: var(--ui-element-font-size);
 }
@@ -217,16 +240,45 @@
   color: var(--theme-selection-color);
   cursor: pointer;
 }
 
 .landing-page .sidebar li:hover a,
 .landing-page .sidebar li:focus a {
   color: inherit;
 }
+
+.landing-page .sidebar li:last-child {
+  border-top: 2px solid var(--theme-splitter-color);
+  margin: 2px;
+}
+
+.landing-page .sidebar .title-wrapper .launchpad-container {
+  padding-left: var(--base-spacing);
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container .launchpad-container-icon {
+  display: inline-block;
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container svg {
+  width: 24px;
+  height: 24px;
+}
+
+.landing-page .sidebar .title-wrapper  .launchpad-container svg path {
+  width: 24px;
+  height: 24px;
+  fill: var(--theme-body-color);
+}
+
+.landing-page .sidebar .title-wrapper .launchpad-container .launchpad-container-title {
+  display: inline;
+  padding-left: 3px;
+}
 /* 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/. */
 
 menu {
   display: inline;
   padding: 0;
 }
@@ -434,21 +486,21 @@ menuitem {
   user-select: none;
 }
 
 menuitem:hover {
   background: #3780fb;
   color: white;
 }
 
-menuitem[disabled=true] {
+menuitem[disabled="true"] {
   color: #cccccc;
 }
 
-menuitem[disabled=true]:hover {
+menuitem[disabled="true"]:hover {
   background-color: transparent;
   cursor: default;
 }
 
 menuseparator {
   border-bottom: 1px solid #cacdd3;
   width: 100%;
   height: 5px;
@@ -1001,23 +1053,24 @@ html[dir="rtl"] .managed-tree .tree .nod
 .search-field .search-nav-buttons .nav-btn path {
   fill: var(--theme-comment);
 }
 .project-text-search {
   flex-grow: 1;
   display: flex;
   flex-direction: column;
   overflow-y: hidden;
+  height: 100%;
 }
 
 .project-text-search .result {
   display: flex;
   cursor: default;
-  margin-bottom: 1px;
   padding: 4px 0 4px 30px;
+  line-height: 16px;
   font-size: 10px;
 }
 
 .project-text-search .matches-summary {
   margin-left: 5px;
 }
 
 .project-text-search .result {
@@ -1044,18 +1097,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   margin-right: 1em;
   width: 2em;
 }
 
 .project-text-search .file-result {
   font-weight: bold;
   line-height: 20px;
   cursor: default;
-  margin: 2px 0;
-  padding: 3px 0 3px 5px;
+  padding: 2px 0 2px 5px;
   font-size: 12px;
 }
 
 .project-text-search .file-result .arrow {
   margin: 2px 0 2px 0;
 }
 
 .project-text-search .file-result.focused {
@@ -1070,16 +1122,21 @@ html[dir="rtl"] .managed-tree .tree .nod
 .project-text-search .search-field {
   display: flex;
   align-self: stretch;
   flex-grow: 1;
 }
 
 .project-text-search .managed-tree {
   overflow-y: auto;
+  height: calc(100% - 81px);
+}
+
+.project-text-search .managed-tree .tree {
+  height: 100%;
 }
 .autocomplete {
   position: relative;
   width: 100%;
   height: 100%;
 }
 
 .autocomplete .no-result-msg {
@@ -1127,17 +1184,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   border-color: var(--theme-selection-background);
 }
 
 .result-list.small li.selected {
   background-color: var(--theme-selection-background);
   color: white;
 }
 
-.theme-dark  .result-list.small li.selected {
+.theme-dark .result-list.small li.selected {
   background-color: var(--theme-body-background);
 }
 
 .result-list li .title {
   line-height: 1.5em;
   word-break: break-all;
 }
 
@@ -1319,17 +1376,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   border: 1px solid transparent;
   border-bottom-left-radius: 2px;
   border-bottom-right-radius: 2px;
   display: inline-flex;
   position: relative;
   transition: all 0.25s ease;
   overflow: hidden;
   padding: 5px;
-  margin-bottom: 4px;
+  margin-bottom: 0px;
   margin-top: -1px;
 }
 
 .source-footer .tab:hover {
   background-color: var(--theme-toolbar-background-alt);
   border-color: var(--theme-splitter-color);
 }
 
@@ -1920,17 +1977,17 @@ html[dir="rtl"] .arrow svg,
 }
 
 .bracket-arrow {
   position: absolute;
 }
 
 .bracket-arrow::before,
 .bracket-arrow::after {
-  content: '';
+  content: "";
   height: 0;
   width: 0;
   position: absolute;
   border: 7px solid transparent;
 }
 
 .bracket-arrow.up::before {
   border-bottom-color: var(--theme-splitter-color);
@@ -1965,93 +2022,97 @@ html[dir="rtl"] .arrow svg,
   position: fixed;
   z-index: 100;
 }
 
 .popover .gap {
   height: 5px;
   padding-top: 5px;
 }
-.popover .preview {
+.popover .preview-popup {
   background: var(--theme-body-background);
   width: 350px;
   min-height: 80px;
   border: 1px solid var(--theme-splitter-color);
   padding: 10px;
   height: auto;
   min-height: inherit;
   max-height: 200px;
   overflow: auto;
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
-.theme-dark .popover .preview {
+.theme-dark .popover .preview-popup {
   box-shadow: 1px 2px 3px var(--popup-shadow-color);
 }
 
-.popover .preview .header {
+.popover .preview-popup .header {
   width: 100%;
   line-height: 20px;
   border-bottom: 1px solid #cccccc;
   display: flex;
   flex-direction: column;
 }
 
-.popover .preview .header .link {
+.popover .preview-popup .header .link {
   align-self: flex-end;
   color: var(--theme-highlight-blue);
   text-decoration: underline;
 }
 
-.selection,
-.debug-expression.selection {
+.preview-selection:hover {
+  cursor: default;
+}
+
+.preview-selection,
+.debug-expression.preview-selection {
   background-color: var(--theme-highlight-yellow);
 }
 
-.theme-dark .selection,
-.theme-dark .debug-expression.selection {
+.theme-dark .preview-selection,
+.theme-dark .debug-expression.preview-selection {
   background-color: #743884;
 }
 
-.theme-dark .cm-s-mozilla .selection,
-.theme-dark .cm-s-mozilla .debug-expression.selection {
+.theme-dark .cm-s-mozilla .preview-selection,
+.theme-dark .cm-s-mozilla .debug-expression.preview-selection {
   color: #e7ebee;
 }
 
-.popover .preview .function-signature {
+.popover .preview-popup .function-signature {
   padding-top: 10px;
 }
 
-.theme-dark .popover .preview {
+.theme-dark .popover .preview-popup {
   border-color: var(--theme-body-color);
 }
 
-.theme-dark .popover .preview .arrow svg {
+.theme-dark .popover .preview-popup .arrow svg {
   fill: var(--theme-content-color3);
 }
 
 .tooltip {
   position: fixed;
   z-index: 100;
 }
 
-.tooltip .preview {
+.tooltip .preview-popup {
   background: var(--theme-toolbar-background);
   max-width: inherit;
   min-height: 80px;
   border: 1px solid var(--theme-splitter-color);
   box-shadow: 1px 2px 4px 1px var(--theme-toolbar-background-alt);
   padding: 5px;
   height: auto;
   min-height: inherit;
   max-height: 200px;
   overflow: auto;
 }
 
-.theme-dark .tooltip .preview {
+.theme-dark .tooltip .preview-popup {
   border-color: var(--theme-body-color);
 }
 
 .tooltip .gap {
   height: 4px;
   padding-top: 4px;
 }
 
@@ -2123,16 +2184,19 @@ html[dir="rtl"] .arrow svg,
 
 .theme-dark .call-site-bp {
   background-color: #4b3f3f;
 }
 
 .theme-dark .call-site-bp::before {
   border-bottom-color: #dd4d4d;
 }
+.empty-line .CodeMirror-linenumber {
+  opacity: 0.5;
+}
 .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 {
@@ -2822,16 +2886,20 @@ html .breakpoints-list .breakpoint.pause
   height: 16px;
 }
 
 .accordion ._content {
   border-bottom: 1px solid var(--theme-splitter-color);
   font-size: 12px;
 }
 
+.accordion div:last-child ._content {
+  border-bottom: none;
+}
+
 .accordion ._header .header-buttons {
   display: flex;
   margin-left: auto;
   padding-right: 5px;
 }
 
 .accordion .header-buttons .add-button {
   font-size: 180%;
@@ -2859,16 +2927,20 @@ html .breakpoints-list .breakpoint.pause
   height: 30px;
   overflow: hidden;
   position: sticky;
   top: 0;
   z-index: 1;
   background-color: var(--theme-body-background);
 }
 
+.command-bar.vertical {
+  width: 100vw;
+}
+
 html[dir="rtl"] .command-bar {
   border-right: 1px solid var(--theme-splitter-color);
 }
 
 .theme-dark .command-bar {
   background-color: var(--theme-tab-toolbar-background);
 }
 
@@ -3011,16 +3083,21 @@ html .command-bar > button:disabled {
   text-align: center;
   font-size: 1.25em;
   color: var(--theme-comment-alt);
   background-color: var(--theme-tab-toolbar-background);
   font-weight: lighter;
   z-index: 100;
 }
 
+.alignlabel {
+  display: inline-block;
+  text-align: left;
+}
+
 .welcomebox .toggle-button-end {
   position: absolute;
   top: auto;
   bottom: 0;
   offset-inline-end: 0;
   offset-inline-start: auto;
 }
 
@@ -3036,25 +3113,31 @@ html .welcomebox .toggle-button-end.coll
 }
 
 .source-header * {
   -moz-user-select: none;
   user-select: none;
 }
 
 .source-header .new-tab-btn {
-  padding: 0px 4px;
+  padding: 4px;
   margin-top: 4px;
+  margin-left: 2px;
   fill: var(--theme-content-color3);
   transition: 0.1s ease;
   align-self: center;
 }
 
+.source-header .new-tab-btn:hover {
+  background-color: var(--theme-toolbar-background-hover);
+}
+
 .source-header .new-tab-btn svg {
   width: 12px;
+  display: block;
 }
 
 .source-tabs {
   max-width: calc(100% - 80px);
   align-self: flex-start;
 }
 
 .source-tab {
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -535,17 +535,17 @@ function isDirectory(url) {
   var parts = url.path.split("/").filter(p => p !== "");
 
   // Assume that all urls point to files except when they end with '/'
   // Or directory node has children
   return parts.length === 0 || url.path.slice(-1) === "/" || nodeHasChildren(url);
 }
 
 function isInvalidUrl(url, source) {
-  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loading") || !url.group || (0, _source.isPretty)(source.toJS());
+  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loadedState") === "loading" || !url.group || (0, _source.isPretty)(source.toJS());
 }
 
 function partIsFile(index, parts, url) {
   var isLastPart = index === parts.length - 1;
   return !isDirectory(url) && isLastPart;
 }
 
 function createNode(name, path, contents) {
@@ -705,18 +705,18 @@ function getWasmText(sourceId, data) {
   var dis = new _WasmDis.WasmDisassembler();
   dis.addOffsets = true;
   var done = dis.disassembleChunk(parser);
   var result = dis.getResult();
   if (result.lines.length === 0) {
     result = { lines: ["No luck with wast conversion"], offsets: [0], done };
   }
 
-  var offsets = result.offsets,
-      lines = [];
+  var offsets = result.offsets;
+  var lines = [];
   for (var i = 0; i < offsets.length; i++) {
     lines[offsets[i]] = i;
   }
 
   wasmStates[sourceId] = { offsets, lines };
 
   return { lines: result.lines, done: result.done };
 }
@@ -5901,17 +5901,17 @@ var _require5 = __webpack_require__(828)
     isDevelopment = _require5.isDevelopment;
 
 var L10N = __webpack_require__(185);
 
 var _require6 = __webpack_require__(1130),
     showMenu = _require6.showMenu,
     buildMenu = _require6.buildMenu;
 
-setConfig({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js","searchURL":"resource://devtools/client/debugger/new/search-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"codeFolding":{"enabled":false},"searchNav":{"enabled":true},"collapseFrame":{"enabled":true},"outline":{"enabled":true}}});
+setConfig({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js","searchURL":"resource://devtools/client/debugger/new/search-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"codeFolding":{"enabled":false},"searchNav":{"enabled":true},"collapseFrame":{"enabled":true},"outline":{"enabled":true},"wasm":{"enabled":true}}});
 
 // Set various flags before requiring app code.
 if (getValue("logging.client")) {
   // DevToolsUtils.dumpn.wantLogging = true;
 }
 
 var _require7 = __webpack_require__(885),
     firefox = _require7.firefox,
@@ -6768,23 +6768,25 @@ var sidePanelItems = {
     clientType: "firefox",
     paramName: "firefox-tab",
     docsUrlPart: "firefox"
   },
   Chrome: {
     name: "Chrome",
     clientType: "chrome",
     paramName: "chrome-tab",
-    docsUrlPart: "chrome"
+    docsUrlPart: "chrome",
+    isUnderConstruction: true
   },
   Node: {
     name: "Node",
     clientType: "node",
     paramName: "node-tab",
-    docsUrlPart: "node"
+    docsUrlPart: "node",
+    isUnderConstruction: true
   },
   Settings: {
     name: "Settings",
     clientType: "settings",
     paramName: "settings-tab",
     docsUrlPart: "settings"
   }
 };
@@ -13904,34 +13906,35 @@ 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__(680);
+__webpack_require__(851);
 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));
 
 var githubUrl = "https://github.com/devtools-html/debugger.html/blob/master";
 
 function getTabsByClientType(tabs, clientType) {
   return tabs.valueSeq().filter(tab => tab.get("clientType") == clientType);
 }
 
 function firstTimeMessage(title, urlPart) {
   return dom.div({ className: "footer-note" }, `First time connecting to ${title}? Checkout out the `, dom.a({
-    href: `${githubUrl}/docs/getting-setup.md#starting-${urlPart}`
+    href: `${githubUrl}/docs/getting-setup.md#starting-${urlPart}`,
+    target: "_blank"
   }, "docs"), ".");
 }
 
 var LandingPage = React.createClass({
   displayName: "LandingPage",
 
   propTypes: {
     tabs: ImPropTypes.map.isRequired,
@@ -13964,35 +13967,48 @@ var LandingPage = React.createClass({
   },
 
   onSideBarItemClick(itemTitle) {
     if (itemTitle !== this.state.selectedPane) {
       this.setState({ selectedPane: itemTitle });
     }
   },
 
-  renderLaunchButton() {
+  renderLaunchOptions() {
     var selectedPane = this.state.selectedPane;
-    var name = configMap[selectedPane].name;
+    var _configMap$selectedPa = configMap[selectedPane],
+        name = _configMap$selectedPa.name,
+        isUnderConstruction = _configMap$selectedPa.isUnderConstruction;
 
 
     var isConnected = name === configMap.Firefox.name ? this.state.firefoxConnected : this.state.chromeConnected;
     var isNodeSelected = name === configMap.Node.name;
 
     if (isNodeSelected) {
-      return dom.h3({}, "Run a node script in the terminal with `--inspect`");
+      return dom.div({ className: "launch-action-container" }, dom.h3({}, "Run a node script in the terminal with `--inspect`"), isUnderConstruction ? this.renderExperimentalMessage(name) : null);
     }
 
     var connectedStateText = isNodeSelected ? null : `Please open a tab in ${name}`;
 
-    return isConnected ? connectedStateText : dom.input({
-      type: "button",
-      value: `Launch ${configMap[selectedPane].name}`,
-      onClick: () => this.launchBrowser(configMap[selectedPane].name)
-    });
+    return isConnected ? connectedStateText : this.renderLaunchButton(name, isUnderConstruction);
+  },
+
+  renderLaunchButton(browserName, isUnderConstruction) {
+    return dom.div({ className: "launch-action-container" }, dom.button({ onClick: () => this.launchBrowser(browserName) }, `Launch ${browserName}`), isUnderConstruction ? this.renderExperimentalMessage(browserName) // eslint-disable-line max-len
+    : null);
+  },
+
+  renderExperimentalMessage(browserName) {
+    var underConstructionMessage = "Debugging is experimental and certain features won't work (i.e, seeing variables, attaching breakpoints)"; // eslint-disable-line max-len
+    var githubIssuesUrl = "https://github.com/devtools-html/debugger.html/issues?q=is%3Aopen+is%3Aissue+label%3A";
+    var underConstructionImageSrc = __webpack_require__(855);
+    return dom.div({ className: "under-construction" }, dom.img({ src: underConstructionImageSrc }), dom.div({ className: "under-construction-message" }, underConstructionMessage, // eslint-disable-line max-len
+    dom.a({ className: "github-link",
+      href: `${githubIssuesUrl}${browserName}`,
+      target: "_blank" }, "Help us make it happen")));
   },
 
   launchBrowser(browser) {
     fetch("/launch", {
       body: JSON.stringify({ browser }),
       headers: {
         "Content-Type": "application/json"
       },
@@ -14004,17 +14020,17 @@ var LandingPage = React.createClass({
         this.setState({ chromeConnected: true });
       }
     }).catch(err => {
       alert(`Error launching ${browser}. ${err.message}`);
     });
   },
 
   renderEmptyPanel() {
-    return dom.div({ className: "hero" }, this.renderLaunchButton());
+    return dom.div({ className: "hero" }, this.renderLaunchOptions());
   },
 
   renderSettings() {
     var _props = this.props,
         config = _props.config,
         setValue = _props.setValue;
 
 
@@ -14022,19 +14038,19 @@ var LandingPage = React.createClass({
   },
 
   renderFilter() {
     var selectedPane = this.state.selectedPane;
     var _props2 = this.props,
         tabs = _props2.tabs,
         _props2$filterString = _props2.filterString,
         filterString = _props2$filterString === undefined ? "" : _props2$filterString;
-    var _configMap$selectedPa = configMap[selectedPane],
-        clientType = _configMap$selectedPa.clientType,
-        paramName = _configMap$selectedPa.paramName;
+    var _configMap$selectedPa2 = configMap[selectedPane],
+        clientType = _configMap$selectedPa2.clientType,
+        paramName = _configMap$selectedPa2.paramName;
 
 
     var targets = getTabsByClientType(tabs, clientType);
 
     return dom.header({}, dom.input({
       ref: "filterInput",
       placeholder: "Filter tabs",
       value: filterString,
@@ -14049,20 +14065,20 @@ var LandingPage = React.createClass({
     }));
   },
 
   renderPanel() {
     var _props3 = this.props,
         onTabClick = _props3.onTabClick,
         tabs = _props3.tabs;
     var selectedPane = this.state.selectedPane;
-    var _configMap$selectedPa2 = configMap[selectedPane],
-        name = _configMap$selectedPa2.name,
-        clientType = _configMap$selectedPa2.clientType,
-        paramName = _configMap$selectedPa2.paramName;
+    var _configMap$selectedPa3 = configMap[selectedPane],
+        name = _configMap$selectedPa3.name,
+        clientType = _configMap$selectedPa3.clientType,
+        paramName = _configMap$selectedPa3.paramName;
 
 
     var clientTargets = getTabsByClientType(tabs, clientType);
     var tabsDetected = clientTargets && clientTargets.count() > 0;
     var targets = clientTargets.filter(t => !t.get("filteredOut"));
 
     var isSettingsPaneSelected = name === configMap.Settings.name;
 
@@ -14079,19 +14095,19 @@ var LandingPage = React.createClass({
 
   render() {
     var _props4 = this.props,
         supportsFirefox = _props4.supportsFirefox,
         supportsChrome = _props4.supportsChrome,
         title = _props4.title;
     var selectedPane = this.state.selectedPane;
     var onSideBarItemClick = this.onSideBarItemClick;
-    var _configMap$selectedPa3 = configMap[selectedPane],
-        name = _configMap$selectedPa3.name,
-        docsUrlPart = _configMap$selectedPa3.docsUrlPart;
+    var _configMap$selectedPa4 = configMap[selectedPane],
+        name = _configMap$selectedPa4.name,
+        docsUrlPart = _configMap$selectedPa4.docsUrlPart;
 
 
     return dom.div({
       className: "landing-page"
     }, Sidebar({
       supportsFirefox,
       supportsChrome,
       title,
@@ -14317,17 +14333,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__(681);
+__webpack_require__(852);
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 function getTabURL(tab, paramName) {
   var tabID = tab.get("id");
   return `/?${paramName}=${tabID}`;
 }
@@ -14553,63 +14569,73 @@ 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);
 
-__webpack_require__(682);
+__webpack_require__(853);
+var rocketSvg = __webpack_require__(1126);
+
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 var Sidebar = React.createClass({
   displayName: "Sidebar",
 
   propTypes: {
     supportsFirefox: React.PropTypes.bool.isRequired,
     supportsChrome: React.PropTypes.bool.isRequired,
     title: React.PropTypes.string.isRequired,
     selectedPane: React.PropTypes.string.isRequired,
     onSideBarItemClick: React.PropTypes.func.isRequired
   },
 
-  render() {
-    var connections = [];
-
-    if (this.props.supportsFirefox) {
-      connections.push("Firefox");
-    }
-
-    if (this.props.supportsChrome) {
-      connections.push("Chrome", "Node");
-    }
-
-    connections.push("Settings");
-
-    return dom.aside({
-      className: "sidebar"
-    }, dom.h1({}, this.props.title), dom.ul({}, connections.map(title => dom.li({
+  renderTitle(title) {
+    return dom.div({ className: "title-wrapper" }, dom.h1({}, title), dom.div({ className: "launchpad-container" }, dom.div({
+      className: "launchpad-container-icon",
+      dangerouslySetInnerHTML: { __html: rocketSvg }
+    }), dom.h2({ className: "launchpad-container-title" }, "Launchpad")));
+  },
+
+  renderItem(title) {
+    return dom.li({
       className: classnames({
         selected: title == this.props.selectedPane
       }),
       key: title,
       tabIndex: 0,
       role: "button",
       onClick: () => this.props.onSideBarItemClick(title),
       onKeyDown: e => {
         if (e.keyCode === 13) {
           this.props.onSideBarItemClick(title);
         }
       }
-    }, dom.a({}, title)))));
-  }
-});
+    }, dom.a({}, title));
+  },
+
+  render() {
+    var connections = [];
+
+    if (this.props.supportsFirefox) {
+      connections.push("Firefox");
+    }
+
+    if (this.props.supportsChrome) {
+      connections.push("Chrome", "Node");
+    }
+
+    return dom.aside({
+      className: "sidebar"
+    }, this.renderTitle(this.props.title), dom.ul({}, connections.map(title => this.renderItem(title)), this.renderItem("Settings")));
+  } });
 
 module.exports = Sidebar;
 
 /***/ }),
 /* 177 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -15208,17 +15234,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__(684);
+__webpack_require__(856);
 
 module.exports = function (className) {
   var root = document.createElement("div");
   root.className = classnames(className);
   root.style.setProperty("flex", 1);
   return root;
 };
 
@@ -15636,17 +15662,17 @@ function createPrettySource(sourceId) {
   return (() => {
     var _ref = _asyncToGenerator(function* (_ref2) {
       var dispatch = _ref2.dispatch,
           getState = _ref2.getState,
           sourceMaps = _ref2.sourceMaps;
 
       var source = (0, _selectors.getSource)(getState(), sourceId).toJS();
       var url = (0, _source.getPrettySourceURL)(source.url);
-      var id = sourceMaps.generatedToOriginalId(sourceId, url);
+      var id = yield sourceMaps.generatedToOriginalId(sourceId, url);
 
       var _ref3 = yield (0, _prettyPrint.prettyPrint)({
         source,
         url
       }),
           code = _ref3.code,
           mappings = _ref3.mappings;
 
@@ -15659,17 +15685,17 @@ function createPrettySource(sourceId) {
 
       var prettySource = {
         url,
         id,
         isPrettyPrinted: true,
         text: code,
         contentType: "text/javascript",
         frames,
-        loading: false
+        loadedState: "loaded"
       };
 
       return dispatch({
         type: "ADD_SOURCE",
         source: prettySource
       });
     });
 
@@ -15895,18 +15921,20 @@ function thunk(makeArgs) {
       return typeof action === "function" ? action(makeArgs ? makeArgs(args, getState()) : args) : next(action);
     };
   };
 }
 
 /***/ }),
 /* 225 */,
 /* 226 */
-/***/ (function(module, exports, __webpack_require__) {
-
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 // @flow
 
 const { isDevelopment } = __webpack_require__(828);
 const { Services, PrefsHelper } = __webpack_require__(830);
 
 const prefsSchemaVersion = "1.0.2";
 
 const pref = Services.pref;
@@ -15924,16 +15952,17 @@ if (isDevelopment()) {
   pref("devtools.debugger.pending-selected-location", "{}");
   pref("devtools.debugger.pending-breakpoints", "{}");
   pref("devtools.debugger.expressions", "[]");
   pref("devtools.debugger.file-search-case-sensitive", false);
   pref("devtools.debugger.file-search-whole-word", false);
   pref("devtools.debugger.file-search-regex-match", false);
   pref("devtools.debugger.prefs-schema-version", "1.0.1");
   pref("devtools.debugger.project-text-search-enabled", true);
+  pref("devtools.debugger.features.async-stepping", false);
 }
 
 const prefs = new PrefsHelper("devtools", {
   clientSourceMapsEnabled: ["Bool", "debugger.client-source-maps-enabled"],
   pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
   ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
   callStackVisible: ["Bool", "debugger.call-stack-visible"],
   scopesVisible: ["Bool", "debugger.scopes-visible"],
@@ -15949,25 +15978,33 @@ const prefs = new PrefsHelper("devtools"
   fileSearchRegexMatch: ["Bool", "debugger.file-search-regex-match"],
   debuggerPrefsSchemaVersion: ["Char", "debugger.prefs-schema-version"],
   projectTextSearchEnabled: [
     "Bool",
     "debugger.project-text-search-enabled",
     false
   ]
 });
+/* harmony export (immutable) */ __webpack_exports__["prefs"] = prefs;
+
+
+const features = new PrefsHelper("devtools.debugger.features", {
+  asyncStepping: ["Bool", "async-stepping", false]
+});
+/* harmony export (immutable) */ __webpack_exports__["features"] = features;
+
+
+debugger;
 
 if (prefs.debuggerPrefsSchemaVersion !== prefsSchemaVersion) {
   // clear pending Breakpoints
   prefs.pendingBreakpoints = {};
   prefs.debuggerPrefsSchemaVersion = prefsSchemaVersion;
 }
 
-module.exports = { prefs };
-
 
 /***/ }),
 /* 227 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -16014,53 +16051,62 @@ var _ast2 = _interopRequireDefault(_ast)
 var _coverage = __webpack_require__(241);
 
 var _coverage2 = _interopRequireDefault(_coverage);
 
 var _projectTextSearch = __webpack_require__(31);
 
 var _projectTextSearch2 = _interopRequireDefault(_projectTextSearch);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _sourceSearch = __webpack_require__(1132);
+
+var _sourceSearch2 = _interopRequireDefault(_sourceSearch);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* 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.default = {
   expressions: _expressions2.default,
   eventListeners: _eventListeners2.default,
   sources: _sources2.default,
   breakpoints: _breakpoints2.default,
   pendingBreakpoints: _pendingBreakpoints2.default,
   asyncRequests: _asyncRequests2.default,
   pause: _pause2.default,
   ui: _ui2.default,
   ast: _ast2.default,
   coverage: _coverage2.default,
-  projectTextSearch: _projectTextSearch2.default
-}; /* 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/. */
+  projectTextSearch: _projectTextSearch2.default,
+  sourceSearch: _sourceSearch2.default
+};
 
 /***/ }),
 /* 228 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getVisibleExpressions = exports.getExpressions = exports.State = undefined;
+exports.getExpressions = exports.State = undefined;
 exports.getExpression = getExpression;
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _immutable = __webpack_require__(146);
 
+var _lodash = __webpack_require__(2);
+
 var _reselect = __webpack_require__(993);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var State = exports.State = (0, _makeRecord2.default)({
   expressions: (0, _immutable.List)(restoreExpressions())
@@ -16070,34 +16116,31 @@ function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : State();
   var action = arguments[1];
 
   switch (action.type) {
     case "ADD_EXPRESSION":
       return appendToList(state, ["expressions"], {
         input: action.input,
         value: null,
-        updating: true,
-        visible: action.visible
+        updating: true
       });
     case "UPDATE_EXPRESSION":
       var key = action.expression.input;
       return updateItemInList(state, ["expressions"], key, {
         input: action.input,
         value: null,
-        updating: true,
-        visible: action.visible
+        updating: true
       });
     case "EVALUATE_EXPRESSION":
       if (action.status === "done") {
         return updateItemInList(state, ["expressions"], action.input, {
           input: action.input,
           value: action.value,
-          updating: false,
-          visible: action.visible
+          updating: false
         });
       }
       break;
     case "DELETE_EXPRESSION":
       return deleteExpression(state, action.input);
   }
 
   return state;
@@ -16107,17 +16150,19 @@ function restoreExpressions() {
   var exprs = _prefs.prefs.expressions;
   if (exprs.length == 0) {
     return;
   }
   return exprs;
 }
 
 function storeExpressions(state) {
-  _prefs.prefs.expressions = state.getIn(["expressions"]).filter(e => e.visible).toJS();
+  var expressions = state.getIn(["expressions"]).map(expression => (0, _lodash.omit)(expression, "value")).toJS();
+
+  _prefs.prefs.expressions = expressions;
 }
 
 function appendToList(state, path, value) {
   var newState = state.updateIn(path, () => {
     return state.getIn(path).push(value);
   });
   storeExpressions(newState);
   return newState;
@@ -16139,18 +16184,16 @@ function deleteExpression(state, input) 
   storeExpressions(newState);
   return newState;
 }
 
 var getExpressionsWrapper = state => state.expressions;
 
 var getExpressions = exports.getExpressions = (0, _reselect.createSelector)(getExpressionsWrapper, expressions => expressions.get("expressions"));
 
-var getVisibleExpressions = exports.getVisibleExpressions = (0, _reselect.createSelector)(getExpressions, expressions => expressions.filter(e => e.visible));
-
 function getExpression(state, input) {
   return getExpressions(state).find(exp => exp.input == input);
 }
 
 exports.default = update;
 
 /***/ }),
 /* 229 */,
@@ -16387,43 +16430,43 @@ function update() {
       }
       break;
 
     case "TOGGLE_PRETTY_PRINT":
       return setSourceTextProps(state, action);
 
     case "NAVIGATE":
       var source = getSelectedSource({ sources: state });
-      var _url = source && source.get("url");
-
-      if (!_url) {
+      var url = source && source.get("url");
+
+      if (!url) {
         return initialState();
       }
 
-      return initialState().set("pendingSelectedLocation", { url: _url });
+      return initialState().set("pendingSelectedLocation", { url });
   }
 
   return state;
 }
 
 function getTextPropsFromAction(action) {
   var source = action.source;
   var value = action.value;
 
 
   if (action.status === "start") {
-    return { id: source.id, loading: true };
+    return { id: source.id, loadedState: "loading" };
   } else if (action.status === "error") {
-    return { id: source.id, error: action.error, loading: false };
+    return { id: source.id, error: action.error, loadedState: "loaded" };
   }
   return {
     text: value.text,
     id: source.id,
     contentType: value.contentType,
-    loading: false
+    loadedState: "loaded"
   };
 }
 
 // TODO: Action is coerced to `any` unfortunately because how we type
 // asynchronous actions is wrong. The `value` may be null for the
 // "start" and "error" states but we don't type it like that. We need
 // to rethink how we type async actions.
 function setSourceTextProps(state, action) {
@@ -16607,17 +16650,17 @@ exports.default = update;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isPretty = exports.isJavaScript = undefined;
+exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = 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);
@@ -16817,26 +16860,31 @@ function getMode(source) {
 
   if (isHTMLLike) {
     return { name: "htmlmixed" };
   }
 
   return { name: "text" };
 }
 
+function isLoaded(source) {
+  return source.loadedState === "loaded";
+}
+
 exports.isJavaScript = isJavaScript;
 exports.isPretty = isPretty;
 exports.shouldPrettyPrint = shouldPrettyPrint;
 exports.getPrettySourceURL = getPrettySourceURL;
 exports.getRawSourceURL = getRawSourceURL;
 exports.getFilename = getFilename;
 exports.getFilenameFromURL = getFilenameFromURL;
 exports.getSourcePath = getSourcePath;
 exports.getSourceLineCount = getSourceLineCount;
 exports.getMode = getMode;
+exports.isLoaded = isLoaded;
 
 /***/ }),
 /* 234 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -16969,16 +17017,17 @@ exports.join = join;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getHiddenBreakpointLocation = exports.getHiddenBreakpoint = undefined;
 
 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/. */
 
 /**
  * Breakpoints reducer
@@ -16999,16 +17048,18 @@ var I = _interopRequireWildcard(_immutab
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _breakpoint2 = __webpack_require__(1057);
 
+var _reselect = __webpack_require__(993);
+
 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; } }
 
 function initialState() {
   return (0, _makeRecord2.default)({
     breakpoints: I.Map(),
     breakpointsDisabled: false
@@ -17146,16 +17197,28 @@ function getBreakpointsForSource(state, 
   var breakpoints = getBreakpoints(state);
 
   return breakpoints.filter(bp => {
     var location = isGeneratedSource ? bp.generatedLocation || bp.location : bp.location;
     return location.sourceId === sourceId;
   });
 }
 
+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;
+  }
+  return hiddenBreakpoint.location;
+});
+
 exports.default = update;
 
 /***/ }),
 /* 237 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -17839,37 +17902,50 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(241);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(31);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
+var _sourceSearch = __webpack_require__(1132);
+
+var sourceSearch = _interopRequireWildcard(_sourceSearch);
+
 var _breakpointAtLocation = __webpack_require__(1134);
 
 var _breakpointAtLocation2 = _interopRequireDefault(_breakpointAtLocation);
 
 var _linesInScope = __webpack_require__(1124);
 
 var _linesInScope2 = _interopRequireDefault(_linesInScope);
 
 var _visibleBreakpoints = __webpack_require__(1135);
 
 var _visibleBreakpoints2 = _interopRequireDefault(_visibleBreakpoints);
 
+var _isSelectedFrameVisible = __webpack_require__(805);
+
+var _isSelectedFrameVisible2 = _interopRequireDefault(_isSelectedFrameVisible);
+
 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, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, { getBreakpointAtLocation: _breakpointAtLocation2.default, getInScopeLines: _linesInScope2.default, getVisibleBreakpoints: _visibleBreakpoints2.default });
+module.exports = Object.assign({}, expressions, sources, pause, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, {
+  getBreakpointAtLocation: _breakpointAtLocation2.default,
+  getInScopeLines: _linesInScope2.default,
+  getVisibleBreakpoints: _visibleBreakpoints2.default,
+  isSelectedFrameVisible: _isSelectedFrameVisible2.default
+});
 
 /***/ }),
 /* 243 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -17890,23 +17966,23 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _ui = __webpack_require__(1128);
 
 var _devtoolsModules = __webpack_require__(830);
 
-__webpack_require__(685);
-
-__webpack_require__(686);
-
-__webpack_require__(687);
-
-__webpack_require__(688);
+__webpack_require__(857);
+
+__webpack_require__(858);
+
+__webpack_require__(859);
+
+__webpack_require__(860);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
 var _ProjectSearch = __webpack_require__(1139);
 
 var _ProjectSearch2 = _interopRequireDefault(_ProjectSearch);
@@ -18146,19 +18222,23 @@ var ast = _interopRequireWildcard(_ast);
 var _coverage = __webpack_require__(322);
 
 var coverage = _interopRequireWildcard(_coverage);
 
 var _projectTextSearch = __webpack_require__(37);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
+var _sourceSearch = __webpack_require__(1143);
+
+var sourceSearch = _interopRequireWildcard(_sourceSearch);
+
 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; } }
 
-exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch);
+exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch, sourceSearch);
 
 /***/ }),
 /* 245 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -18178,26 +18258,28 @@ var _extends = Object.assign || function
  * @module actions/breakpoints
  */
 
 // this will need to be changed so that addCLientBreakpoint is removed
 
 
 exports.syncBreakpoint = syncBreakpoint;
 exports.addBreakpoint = addBreakpoint;
+exports.addHiddenBreakpoint = addHiddenBreakpoint;
 exports.removeBreakpoint = removeBreakpoint;
 exports.enableBreakpoint = enableBreakpoint;
 exports.disableBreakpoint = disableBreakpoint;
 exports.toggleAllBreakpoints = toggleAllBreakpoints;
 exports.toggleBreakpoints = toggleBreakpoints;
 exports.removeAllBreakpoints = removeAllBreakpoints;
 exports.removeBreakpoints = removeBreakpoints;
 exports.remapBreakpoints = remapBreakpoints;
 exports.setBreakpointCondition = setBreakpointCondition;
 exports.toggleBreakpoint = toggleBreakpoint;
+exports.addOrToggleDisabledBreakpoint = addOrToggleDisabledBreakpoint;
 exports.toggleDisabledBreakpoint = toggleDisabledBreakpoint;
 
 var _promise = __webpack_require__(193);
 
 var _selectors = __webpack_require__(242);
 
 var _breakpoint = __webpack_require__(1057);
 
@@ -18216,28 +18298,28 @@ function _interopRequireDefault(obj) { r
 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"); }); }; }
 
 /**
  * Syncing a breakpoint add breakpoint information that is stored, and
  * contact the server for more data.
  *
  * @memberof actions/breakpoints
  * @static
- * @param {String} $1.source Source  value
+ * @param {String} $1.sourceId String  value
  * @param {PendingBreakpoint} $1.location PendingBreakpoint  value
  */
 function syncBreakpoint(source, pendingBreakpoint) {
   return (_ref) => {
     var dispatch = _ref.dispatch,
         getState = _ref.getState,
         client = _ref.client,
         sourceMaps = _ref.sourceMaps;
 
-		var sourceId = source.id;
-		var _pendingBreakpoint$lo = pendingBreakpoint.location,
+    var sourceId = source.id;
+    var _pendingBreakpoint$lo = pendingBreakpoint.location,
         line = _pendingBreakpoint$lo.line,
         sourceUrl = _pendingBreakpoint$lo.sourceUrl,
         column = _pendingBreakpoint$lo.column;
 
     var location = { sourceId, sourceUrl, line, column };
     var breakpoint = (0, _breakpoint.createBreakpoint)(location, pendingBreakpoint);
 
     var syncPromise = (0, _syncBreakpoint.syncClientBreakpoint)(getState, client, sourceMaps, source, pendingBreakpoint);
@@ -18254,41 +18336,56 @@ function syncBreakpoint(source, pendingB
  * Add a new breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  * @param {String} $1.condition Conditional breakpoint condition value
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 
-function addBreakpoint(location, condition) {
-  var breakpoint = (0, _breakpoint.createBreakpoint)(location, { condition });
+function addBreakpoint(location, condition, hidden) {
+  var breakpoint = (0, _breakpoint.createBreakpoint)(location, { condition, hidden });
   return (_ref2) => {
     var dispatch = _ref2.dispatch,
         getState = _ref2.getState,
         sourceMaps = _ref2.sourceMaps,
         client = _ref2.client;
 
     var action = { type: "ADD_BREAKPOINT", breakpoint };
     var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
     return dispatch(_extends({}, action, { [_promise.PROMISE]: promise }));
   };
 }
 
 /**
+ * Add a new hidden breakpoint
+ *
+ * @memberOf actions/breakpoints
+ * @param location
+ * @return {function(ThunkArgs)}
+ */
+function addHiddenBreakpoint(location) {
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch;
+
+    return dispatch(addBreakpoint(location, "", true));
+  };
+}
+
+/**
  * Remove a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoint(location) {
-  return (_ref3) => {
-    var dispatch = _ref3.dispatch,
-        getState = _ref3.getState,
-        client = _ref3.client;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch,
+        getState = _ref4.getState,
+        client = _ref4.client;
 
     var bp = (0, _selectors.getBreakpoint)(getState(), location);
     if (!bp) {
       throw new Error("attempt to remove breakpoint that does not exist");
     }
 
     if (bp.loading) {
       // TODO(jwl): make this wait until the breakpoint is saved if it
@@ -18320,54 +18417,54 @@ function removeBreakpoint(location) {
  * will reuse the existing breakpoint information that is stored.
  *
  * @memberof actions/breakpoints
  * @static
  * @param {Location} $1.location Location  value
  */
 function enableBreakpoint(location) {
   return (() => {
-    var _ref4 = _asyncToGenerator(function* (_ref5) {
-      var dispatch = _ref5.dispatch,
-          getState = _ref5.getState,
-          client = _ref5.client,
-          sourceMaps = _ref5.sourceMaps;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState,
+          client = _ref6.client,
+          sourceMaps = _ref6.sourceMaps;
 
       var breakpoint = (0, _selectors.getBreakpoint)(getState(), location);
       if (!breakpoint) {
         throw new Error("attempted to enable a breakpoint that does not exist");
       }
 
       var action = { type: "ENABLE_BREAKPOINT", breakpoint };
       var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
       return dispatch({
         type: "ENABLE_BREAKPOINT",
         breakpoint,
         [_promise.PROMISE]: promise
       });
     });
 
     return function (_x) {
-      return _ref4.apply(this, arguments);
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Disable a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function disableBreakpoint(location) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
+    var _ref7 = _asyncToGenerator(function* (_ref8) {
+      var dispatch = _ref8.dispatch,
+          getState = _ref8.getState,
+          client = _ref8.client;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
 
       if (!bp) {
         throw new Error("attempt to disable a breakpoint that does not exist");
       }
 
       if (bp.loading) {
@@ -18381,155 +18478,155 @@ function disableBreakpoint(location) {
 
       return dispatch({
         type: "DISABLE_BREAKPOINT",
         breakpoint: newBreakpoint
       });
     });
 
     return function (_x2) {
-      return _ref6.apply(this, arguments);
+      return _ref7.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle All Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleAllBreakpoints(shouldDisableBreakpoints) {
   return (() => {
-    var _ref8 = _asyncToGenerator(function* (_ref9) {
-      var dispatch = _ref9.dispatch,
-          getState = _ref9.getState;
+    var _ref9 = _asyncToGenerator(function* (_ref10) {
+      var dispatch = _ref10.dispatch,
+          getState = _ref10.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref10 of breakpoints) {
-        var _ref11 = _slicedToArray(_ref10, 2);
-
-        var breakpoint = _ref11[1];
+      for (var _ref11 of breakpoints) {
+        var _ref12 = _slicedToArray(_ref11, 2);
+
+        var breakpoint = _ref12[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
     return function (_x3) {
-      return _ref8.apply(this, arguments);
+      return _ref9.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleBreakpoints(shouldDisableBreakpoints, breakpoints) {
   return (() => {
-    var _ref12 = _asyncToGenerator(function* (_ref13) {
-      var dispatch = _ref13.dispatch;
-
-      for (var _ref14 of breakpoints) {
-        var _ref15 = _slicedToArray(_ref14, 2);
-
-        var breakpoint = _ref15[1];
+    var _ref13 = _asyncToGenerator(function* (_ref14) {
+      var dispatch = _ref14.dispatch;
+
+      for (var _ref15 of breakpoints) {
+        var _ref16 = _slicedToArray(_ref15, 2);
+
+        var breakpoint = _ref16[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
     return function (_x4) {
-      return _ref12.apply(this, arguments);
+      return _ref13.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes all breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeAllBreakpoints() {
   return (() => {
-    var _ref16 = _asyncToGenerator(function* (_ref17) {
-      var dispatch = _ref17.dispatch,
-          getState = _ref17.getState;
+    var _ref17 = _asyncToGenerator(function* (_ref18) {
+      var dispatch = _ref18.dispatch,
+          getState = _ref18.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref18 of breakpoints) {
-        var _ref19 = _slicedToArray(_ref18, 2);
-
-        var breakpoint = _ref19[1];
+      for (var _ref19 of breakpoints) {
+        var _ref20 = _slicedToArray(_ref19, 2);
+
+        var breakpoint = _ref20[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
     return function (_x5) {
-      return _ref16.apply(this, arguments);
+      return _ref17.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoints(breakpoints) {
   return (() => {
-    var _ref20 = _asyncToGenerator(function* (_ref21) {
-      var dispatch = _ref21.dispatch;
-
-      for (var _ref22 of breakpoints) {
-        var _ref23 = _slicedToArray(_ref22, 2);
-
-        var breakpoint = _ref23[1];
+    var _ref21 = _asyncToGenerator(function* (_ref22) {
+      var dispatch = _ref22.dispatch;
+
+      for (var _ref23 of breakpoints) {
+        var _ref24 = _slicedToArray(_ref23, 2);
+
+        var breakpoint = _ref24[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
     return function (_x6) {
-      return _ref20.apply(this, arguments);
+      return _ref21.apply(this, arguments);
     };
   })();
 }
 
 function remapBreakpoints(sourceId) {
   return (() => {
-    var _ref24 = _asyncToGenerator(function* (_ref25) {
-      var dispatch = _ref25.dispatch,
-          getState = _ref25.getState,
-          sourceMaps = _ref25.sourceMaps;
+    var _ref25 = _asyncToGenerator(function* (_ref26) {
+      var dispatch = _ref26.dispatch,
+          getState = _ref26.getState,
+          sourceMaps = _ref26.sourceMaps;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
       var newBreakpoints = yield (0, _remapLocations2.default)(breakpoints, sourceId, sourceMaps);
 
       return dispatch({
         type: "REMAP_BREAKPOINTS",
         breakpoints: newBreakpoints
       });
     });
 
     return function (_x7) {
-      return _ref24.apply(this, arguments);
+      return _ref25.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Update the condition of a breakpoint.
  *
  * @throws {Error} "not implemented"
@@ -18537,61 +18634,66 @@ function remapBreakpoints(sourceId) {
  * @static
  * @param {Location} location
  *        @see DebuggerController.Breakpoints.addBreakpoint
  * @param {string} condition
  *        The condition to set on the breakpoint
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 function setBreakpointCondition(location) {
-  var _ref26 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-      condition = _ref26.condition;
+  var _ref27 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+      condition = _ref27.condition;
 
   return (() => {
-    var _ref27 = _asyncToGenerator(function* (_ref28) {
-      var dispatch = _ref28.dispatch,
-          getState = _ref28.getState,
-          client = _ref28.client,
-          sourceMaps = _ref28.sourceMaps;
+    var _ref28 = _asyncToGenerator(function* (_ref29) {
+      var dispatch = _ref29.dispatch,
+          getState = _ref29.getState,
+          client = _ref29.client,
+          sourceMaps = _ref29.sourceMaps;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
       if (!bp) {
         return dispatch(addBreakpoint(location, condition));
       }
 
       if (bp.loading) {
         // TODO(jwl): when this function is called, make sure the action
         // creator waits for the breakpoint to exist
         throw new Error("breakpoint must be saved");
       }
 
+      if (bp.disabled) {
+        yield dispatch(enableBreakpoint(location));
+        bp.disabled = !bp.disabled;
+      }
+
       yield client.setBreakpointCondition(bp.id, location, condition, sourceMaps.isOriginalId(bp.location.sourceId));
 
       var newBreakpoint = _extends({}, bp, { condition });
 
       (0, _breakpoint.assertBreakpoint)(newBreakpoint);
 
       return dispatch({
         type: "SET_BREAKPOINT_CONDITION",
         breakpoint: newBreakpoint
       });
     });
 
     return function (_x9) {
-      return _ref27.apply(this, arguments);
+      return _ref28.apply(this, arguments);
     };
   })();
 }
 
 function toggleBreakpoint(line, column) {
-  return (_ref29) => {
-    var dispatch = _ref29.dispatch,
-        getState = _ref29.getState,
-        client = _ref29.client,
-        sourceMaps = _ref29.sourceMaps;
+  return (_ref30) => {
+    var dispatch = _ref30.dispatch,
+        getState = _ref30.getState,
+        client = _ref30.client,
+        sourceMaps = _ref30.sourceMaps;
 
     var selectedSource = (0, _selectors.getSelectedSource)(getState());
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
 
     if (bp && bp.loading) {
       return;
     }
 
@@ -18609,22 +18711,50 @@ function toggleBreakpoint(line, column) 
       sourceId: selectedSource.get("id"),
       sourceUrl: selectedSource.get("url"),
       line: line,
       column: column
     }));
   };
 }
 
+function addOrToggleDisabledBreakpoint(line, column) {
+  return (_ref31) => {
+    var dispatch = _ref31.dispatch,
+        getState = _ref31.getState,
+        client = _ref31.client,
+        sourceMaps = _ref31.sourceMaps;
+
+    var selectedSource = (0, _selectors.getSelectedSource)(getState());
+    var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
+
+    if (bp && bp.loading) {
+      return;
+    }
+
+    if (bp) {
+      // NOTE: it's possible the breakpoint has slid to a column
+      return dispatch(toggleDisabledBreakpoint(line, column || bp.location.column));
+    }
+
+    return dispatch(addBreakpoint({
+      sourceId: selectedSource.get("id"),
+      sourceUrl: selectedSource.get("url"),
+      line: line,
+      column: column
+    }));
+  };
+}
+
 function toggleDisabledBreakpoint(line, column) {
-  return (_ref30) => {
-    var dispatch = _ref30.dispatch,
-        getState = _ref30.getState,
-        client = _ref30.client,
-        sourceMaps = _ref30.sourceMaps;
+  return (_ref32) => {
+    var dispatch = _ref32.dispatch,
+        getState = _ref32.getState,
+        client = _ref32.client,
+        sourceMaps = _ref32.sourceMaps;
 
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
     if (bp && bp.loading) {
       return;
     }
 
     if (!bp) {
       throw new Error("attempt to disable breakpoint that does not exist");
@@ -19003,145 +19133,132 @@ function _asyncToGenerator(fn) { return 
  * Add expression for debugger to watch
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
  * @static
  */
 function addExpression(input) {
-  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-      _ref$visible = _ref.visible,
-      visible = _ref$visible === undefined ? true : _ref$visible;
-
   return (() => {
-    var _ref2 = _asyncToGenerator(function* (_ref3) {
-      var dispatch = _ref3.dispatch,
-          getState = _ref3.getState;
+    var _ref = _asyncToGenerator(function* (_ref2) {
+      var dispatch = _ref2.dispatch,
+          getState = _ref2.getState;
 
       if (!input) {
         return;
       }
 
       var expression = (0, _selectors.getExpression)(getState(), input);
-      if (expression && expression.visible) {
-        return;
-      }
-
-      // Lets make the expression visible
       if (expression) {
         return dispatch({
           type: "UPDATE_EXPRESSION",
           expression,
-          input,
-          visible: true
+          input
         });
       }
 
       dispatch({
         type: "ADD_EXPRESSION",
-        input,
-        visible
+        input
       });
 
       var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
       var selectedFrameId = selectedFrame ? selectedFrame.id : null;
-      dispatch(evaluateExpression({ input, visible }, selectedFrameId));
-    });
-
-    return function (_x2) {
-      return _ref2.apply(this, arguments);
+      dispatch(evaluateExpression({ input }, selectedFrameId));
+    });
+
+    return function (_x) {
+      return _ref.apply(this, arguments);
     };
   })();
 }
 
 function updateExpression(input, expression) {
-  return (_ref4) => {
-    var dispatch = _ref4.dispatch,
-        getState = _ref4.getState;
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch,
+        getState = _ref3.getState;
 
     if (!input || input == expression.input) {
       return;
     }
 
     dispatch({
       type: "UPDATE_EXPRESSION",
       expression,
-      input: input,
-      visible: expression.visible
+      input: input
     });
 
     var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
     var selectedFrameId = selectedFrame ? selectedFrame.id : null;
     dispatch(evaluateExpressions(selectedFrameId));
   };
 }
 
 /**
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
  * @static
  */
 function deleteExpression(expression) {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch;
 
     dispatch({
       type: "DELETE_EXPRESSION",
       input: expression.input
     });
   };
 }
 
 /**
  *
  * @memberof actions/pause
  * @param {number} selectedFrameId
  * @static
  */
 function evaluateExpressions(frameId) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState,
+          client = _ref6.client;
 
       var expressions = (0, _selectors.getExpressions)(getState()).toJS();
       if (!frameId) {
         var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
         frameId = selectedFrame ? selectedFrame.id : null;
       }
       for (var expression of expressions) {
         yield dispatch(evaluateExpression(expression, frameId));
       }
     });
 
-    return function (_x3) {
-      return _ref6.apply(this, arguments);
+    return function (_x2) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 function evaluateExpression(expression, frameId) {
-  return function (_ref8) {
-    var dispatch = _ref8.dispatch,
-        getState = _ref8.getState,
-        client = _ref8.client;
+  return function (_ref7) {
+    var dispatch = _ref7.dispatch,
+        getState = _ref7.getState,
+        client = _ref7.client;
 
     if (!expression.input) {
       console.warn("Expressions should not be empty");
       return;
     }
 
     return dispatch({
       type: "EVALUATE_EXPRESSION",
       input: expression.input,
-      visible: expression.visible,
       [_promise.PROMISE]: client.evaluate(expression.input, { frameId })
     });
   };
 }
 
 /***/ }),
 /* 253 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -19354,47 +19471,63 @@ function updateEventBreakpoints(eventNam
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 
+// If a request has been made to show this source, go ahead and
+// select it.
+var checkSelectedSource = (() => {
+  var _ref = _asyncToGenerator(function* (state, dispatch, source) {
+    var pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
+
+    if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
+      yield dispatch(selectSource(source.id, { line: pendingLocation.line }));
+    }
+  });
+
+  return function checkSelectedSource(_x, _x2, _x3) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
 var checkPendingBreakpoint = (() => {
-  var _ref = _asyncToGenerator(function* (state, dispatch, pendingBreakpoint, source) {
+  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, pendingBreakpoint));
     }
   });
 
-  return function checkPendingBreakpoint(_x, _x2, _x3, _x4) {
-    return _ref.apply(this, arguments);
+  return function checkPendingBreakpoint(_x4, _x5, _x6, _x7) {
+    return _ref2.apply(this, arguments);
   };
 })();
 
 var checkPendingBreakpoints = (() => {
-  var _ref2 = _asyncToGenerator(function* (state, dispatch, source) {
+  var _ref3 = _asyncToGenerator(function* (state, dispatch, source) {
     var pendingBreakpoints = (0, _selectors.getPendingBreakpoints)(state);
     if (!pendingBreakpoints) {
       return;
     }
 
     var pendingBreakpointsArray = pendingBreakpoints.valueSeq().toJS();
     for (var pendingBreakpoint of pendingBreakpointsArray) {
       yield checkPendingBreakpoint(state, dispatch, pendingBreakpoint, source);
     }
   });
 
-  return function checkPendingBreakpoints(_x5, _x6, _x7) {
-    return _ref2.apply(this, arguments);
+  return function checkPendingBreakpoints(_x8, _x9, _x10) {
+    return _ref3.apply(this, arguments);
   };
 })();
 
 /**
  * Handler for the debugger client's unsolicited newSource notification.
  * @memberof actions/sources
  * @static
  */
@@ -19444,78 +19577,69 @@ function _asyncToGenerator(fn) { return 
  * 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/. */
 
 /**
  * Redux actions for the sources state
  * @module actions/sources
  */
 
-// If a request has been made to show this source, go ahead and
-// select it.
-function checkSelectedSource(state, dispatch, source) {
-  var pendingLocation = (0, _selectors.getPendingSelectedLocation)(state);
-
-  if (pendingLocation && !!source.url && pendingLocation.url === source.url) {
-    dispatch(selectSource(source.id, { line: pendingLocation.line }));
-  }
-}
-
 function newSource(source) {
   return (() => {
-    var _ref3 = _asyncToGenerator(function* (_ref4) {
-      var dispatch = _ref4.dispatch,
-          getState = _ref4.getState;
+    var _ref4 = _asyncToGenerator(function* (_ref5) {
+      var dispatch = _ref5.dispatch,
+          getState = _ref5.getState;
 
       dispatch({ type: "ADD_SOURCE", source });
+
       if (_prefs.prefs.clientSourceMapsEnabled) {
         yield dispatch(loadSourceMap(source));
       }
 
-      checkSelectedSource(getState(), dispatch, source);
+      yield checkSelectedSource(getState(), dispatch, source);
       yield checkPendingBreakpoints(getState(), dispatch, source);
     });
 
-    return function (_x8) {
-      return _ref3.apply(this, arguments);
+    return function (_x11) {
+      return _ref4.apply(this, arguments);
     };
   })();
 }
 
 function newSources(sources) {
   return (() => {
-    var _ref5 = _asyncToGenerator(function* (_ref6) {
-      var dispatch = _ref6.dispatch,
-          getState = _ref6.getState;
+    var _ref6 = _asyncToGenerator(function* (_ref7) {
+      var dispatch = _ref7.dispatch,
+          getState = _ref7.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 (_x9) {
-      return _ref5.apply(this, arguments);
+    return function (_x12) {
+      return _ref6.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceMap(generatedSource) {
   return (() => {
-    var _ref7 = _asyncToGenerator(function* (_ref8) {
-      var dispatch = _ref8.dispatch,
-          getState = _ref8.getState,
-          sourceMaps = _ref8.sourceMaps;
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          sourceMaps = _ref9.sourceMaps;
 
       var urls = yield sourceMaps.getOriginalURLs(generatedSource);
       if (!urls) {
         // If this source doesn't have a sourcemap, do nothing.
         return;
       }
 
       var state = getState();
@@ -19530,63 +19654,69 @@ function loadSourceMap(generatedSource) 
       dispatch({ type: "ADD_SOURCES", sources: originalSources });
 
       originalSources.forEach(function (source) {
         checkSelectedSource(state, dispatch, source);
         checkPendingBreakpoints(state, dispatch, source);
       });
     });
 
-    return function (_x10) {
-      return _ref7.apply(this, arguments);
+    return function (_x13) {
+      return _ref8.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
  * debugger.
  *
  * @memberof actions/sources
  * @static
  */
 function selectSourceURL(url) {
   var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-  return (_ref9) => {
-    var dispatch = _ref9.dispatch,
-        getState = _ref9.getState;
-
-    var source = (0, _selectors.getSourceByURL)(getState(), url);
-    if (source) {
-      dispatch(selectSource(source.get("id"), options));
-    } else {
-      dispatch({
-        type: "SELECT_SOURCE_URL",
-        url: url,
-        tabIndex: options.tabIndex,
-        line: options.line
-      });
-    }
-  };
+  return (() => {
+    var _ref10 = _asyncToGenerator(function* (_ref11) {
+      var dispatch = _ref11.dispatch,
+          getState = _ref11.getState;
+
+      var source = (0, _selectors.getSourceByURL)(getState(), url);
+      if (source) {
+        yield dispatch(selectSource(source.get("id"), options));
+      } else {
+        dispatch({
+          type: "SELECT_SOURCE_URL",
+          url: url,
+          tabIndex: options.tabIndex,
+          line: options.line
+        });
+      }
+    });
+
+    return function (_x15) {
+      return _ref10.apply(this, arguments);
+    };
+  })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function selectSource(id) {
   var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-  return (_ref10) => {
-    var dispatch = _ref10.dispatch,
-        getState = _ref10.getState,
-        client = _ref10.client;
+  return (_ref12) => {
+    var dispatch = _ref12.dispatch,
+        getState = _ref12.getState,
+        client = _ref12.client;
 
     if (!client) {
       // No connection, do nothing. This happens when the debugger is
       // shut down too fast and it tries to display a default source.
       return;
     }
 
     var source = (0, _selectors.getSource)(getState(), id);
@@ -19616,39 +19746,39 @@ function selectSource(id) {
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function jumpToMappedLocation(sourceLocation) {
   return (() => {
-    var _ref12 = _asyncToGenerator(function* (_ref13) {
-      var dispatch = _ref13.dispatch,
-          getState = _ref13.getState,
-          client = _ref13.client,
-          sourceMaps = _ref13.sourceMaps;
+    var _ref14 = _asyncToGenerator(function* (_ref15) {
+      var dispatch = _ref15.dispatch,
+          getState = _ref15.getState,
+          client = _ref15.client,
+          sourceMaps = _ref15.sourceMaps;
 
       if (!client) {
         return;
       }
 
       var source = (0, _selectors.getSource)(getState(), sourceLocation.sourceId);
       var pairedLocation = void 0;
       if (sourceMaps.isOriginalId(sourceLocation.sourceId)) {
         pairedLocation = yield sourceMaps.getGeneratedLocation(sourceLocation, source.toJS());
       } else {
         pairedLocation = yield sourceMaps.getOriginalLocation(sourceLocation, source.toJS());
       }
 
       return dispatch(selectSource(pairedLocation.sourceId, { line: pairedLocation.line }));
     });
 
-    return function (_x13) {
-      return _ref12.apply(this, arguments);
+    return function (_x17) {
+      return _ref14.apply(this, arguments);
     };
   })();
 }
 
 function addTab(source, tabIndex) {
   return {
     type: "ADD_TAB",
     source,
@@ -19664,39 +19794,39 @@ function moveTab(url, tabIndex) {
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function closeTab(url) {
-  return (_ref14) => {
-    var dispatch = _ref14.dispatch,
-        getState = _ref14.getState,
-        client = _ref14.client;
+  return (_ref16) => {
+    var dispatch = _ref16.dispatch,
+        getState = _ref16.getState,
+        client = _ref16.client;
 
     (0, _editor.removeDocument)(url);
     var tabs = (0, _selectors.removeSourceFromTabList)((0, _selectors.getSourceTabs)(getState()), url);
     var sourceId = (0, _selectors.getNewSelectedSourceId)(getState(), tabs);
 
     dispatch({ type: "CLOSE_TAB", url, tabs });
     dispatch(selectSource(sourceId));
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function closeTabs(urls) {
-  return (_ref15) => {
-    var dispatch = _ref15.dispatch,
-        getState = _ref15.getState,
-        client = _ref15.client;
+  return (_ref17) => {
+    var dispatch = _ref17.dispatch,
+        getState = _ref17.getState,
+        client = _ref17.client;
 
     urls.forEach(url => {
       var source = (0, _selectors.getSourceByURL)(getState(), url);
       if (source) {
         (0, _editor.removeDocument)(source.get("id"));
       }
     });
 
@@ -19717,25 +19847,25 @@ function closeTabs(urls) {
  * @static
  * @param string id The source form from the RDP.
  * @returns Promise
  *          A promise that resolves to [aSource, prettyText] or rejects to
  *          [aSource, error].
  */
 function togglePrettyPrint(sourceId) {
   return (() => {
-    var _ref16 = _asyncToGenerator(function* (_ref17) {
-      var dispatch = _ref17.dispatch,
-          getState = _ref17.getState,
-          client = _ref17.client,
-          sourceMaps = _ref17.sourceMaps;
+    var _ref18 = _asyncToGenerator(function* (_ref19) {
+      var dispatch = _ref19.dispatch,
+          getState = _ref19.getState,
+          client = _ref19.client,
+          sourceMaps = _ref19.sourceMaps;
 
       var source = (0, _selectors.getSource)(getState(), sourceId).toJS();
 
-      if (source && source.loading) {
+      if (source && !(0, _source.isLoaded)(source)) {
         return {};
       }
 
       (0, _assert2.default)(sourceMaps.isGeneratedId(sourceId), "Pretty-printing only allowed on generated sources");
 
       var selectedLocation = (0, _selectors.getSelectedLocation)(getState());
       var selectedOriginalLocation = selectedLocation ? yield sourceMaps.getOriginalLocation(selectedLocation) : {};
 
@@ -19743,67 +19873,68 @@ function togglePrettyPrint(sourceId) {
       var prettySource = (0, _selectors.getSourceByURL)(getState(), url);
 
       if (prettySource) {
         return dispatch(selectSource(prettySource.get("id"), {
           line: selectedOriginalLocation.line
         }));
       }
 
-      var _ref18 = yield dispatch((0, _createPrettySource.createPrettySource)(sourceId)),
-          newPrettySource = _ref18.source;
+      var _ref20 = yield dispatch((0, _createPrettySource.createPrettySource)(sourceId)),
+          newPrettySource = _ref20.source;
 
       yield dispatch((0, _breakpoints.remapBreakpoints)(sourceId));
+      yield dispatch((0, _ast.setEmptyLines)(newPrettySource.id));
 
       return dispatch(selectSource(newPrettySource.id, {
         line: selectedOriginalLocation.line
       }));
     });
 
-    return function (_x14) {
-      return _ref16.apply(this, arguments);
+    return function (_x18) {
+      return _ref18.apply(this, arguments);
     };
   })();
 }
 
 function toggleBlackBox(source) {
   return (() => {
-    var _ref19 = _asyncToGenerator(function* (_ref20) {
-      var dispatch = _ref20.dispatch,
-          getState = _ref20.getState,
-          client = _ref20.client,
-          sourceMaps = _ref20.sourceMaps;
+    var _ref21 = _asyncToGenerator(function* (_ref22) {
+      var dispatch = _ref22.dispatch,
+          getState = _ref22.getState,
+          client = _ref22.client,
+          sourceMaps = _ref22.sourceMaps;
       var isBlackBoxed = source.isBlackBoxed,
           id = source.id;
 
 
       return dispatch({
         type: "BLACKBOX",
         source,
         [_promise.PROMISE]: client.blackBox(id, isBlackBoxed)
       });
     });
 
-    return function (_x15) {
-      return _ref19.apply(this, arguments);
+    return function (_x19) {
+      return _ref21.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceText(source) {
   return (() => {
-    var _ref21 = _asyncToGenerator(function* (_ref22) {
-      var dispatch = _ref22.dispatch,
-          getState = _ref22.getState,
-          client = _ref22.client,
-          sourceMaps = _ref22.sourceMaps;
+    var _ref23 = _asyncToGenerator(function* (_ref24) {
+      var dispatch = _ref24.dispatch,
+          getState = _ref24.getState,
+          client = _ref24.client,
+          sourceMaps = _ref24.sourceMaps;
 
       // Fetch the source text only once.
       if (source.text) {
         return Promise.resolve(source);
       }
 
       yield dispatch({
         type: "LOAD_SOURCE_TEXT",
@@ -19819,73 +19950,94 @@ function loadSourceText(source) {
             id: source.id,
             text: response.source,
             contentType: response.contentType || "text/javascript"
           };
         })()
       });
 
       yield dispatch((0, _ast.setSymbols)(source.id));
-    });
-
-    return function (_x16) {
-      return _ref21.apply(this, arguments);
+      yield dispatch((0, _ast.setEmptyLines)(source.id));
+    });
+
+    return function (_x20) {
+      return _ref23.apply(this, arguments);
     };
   })();
 }
 
 /**
   Load the text for all the avaliable sources
  * @memberof actions/sources
  * @static
  */
 function loadAllSources() {
   return (() => {
-    var _ref24 = _asyncToGenerator(function* (_ref25) {
-      var dispatch = _ref25.dispatch,
-          getState = _ref25.getState;
+    var _ref26 = _asyncToGenerator(function* (_ref27) {
+      var dispatch = _ref27.dispatch,
+          getState = _ref27.getState;
 
       var sources = (0, _selectors.getSources)(getState());
       var query = (0, _selectors.getTextSearchQuery)(getState());
-      for (var _ref26 of sources) {
-        var _ref27 = _slicedToArray(_ref26, 2);
-
-        var src = _ref27[1];
+      for (var _ref28 of sources) {
+        var _ref29 = _slicedToArray(_ref28, 2);
+
+        var src = _ref29[1];
 
         var source = src.toJS();
         yield dispatch(loadSourceText(source));
         // 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, query));
         }
       }
     });
 
-    return function (_x17) {
-      return _ref24.apply(this, arguments);
+    return function (_x21) {
+      return _ref26.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 255 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.getPausedPosition = undefined;
+
+var getPausedPosition = exports.getPausedPosition = (() => {
+  var _ref = _asyncToGenerator(function* (pauseInfo, sourceMaps) {
+    var frames = pauseInfo.frames;
+
+    frames = yield updateFrameLocations(frames, sourceMaps);
+    var frame = frames[0];
+    var location = frame.location;
+
+    return location;
+  });
+
+  return function getPausedPosition(_x, _x2) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
 exports.updateFrameLocations = updateFrameLocations;
 exports.getPauseReason = getPauseReason;
 
 var _lodash = __webpack_require__(2);
 
+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);
   }
 
   return Promise.all(frames.map(frame => {
     return sourceMaps.getOriginalLocation(frame.location).then(loc => {
       return Object.assign({}, frame, {
@@ -20140,16 +20292,21 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 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;
+
+
 var sourceDocs = {};
 
 function getDocument(key) {
   return sourceDocs[key];
 }
 
 function setDocument(key, doc) {
   sourceDocs[key] = doc;
@@ -20161,26 +20318,27 @@ function removeDocument(key) {
 
 function clearDocuments() {
   sourceDocs = {};
 }
 
 function resetLineNumberFormat(editor) {
   var cm = editor.codeMirror;
   cm.setOption("lineNumberFormatter", number => number);
+  resizeBreakpointGutter(cm);
 }
 
 function updateLineNumberFormat(editor, sourceId) {
   if (!(0, _wasm.isWasm)(sourceId)) {
-    resetLineNumberFormat(editor);
-    return;
+    return resetLineNumberFormat(editor);
   }
   var cm = editor.codeMirror;
   var lineNumberFormatter = (0, _wasm.getWasmLineNumberFormatter)(sourceId);
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
+  resizeBreakpointGutter(cm);
 }
 
 function updateDocument(editor, sourceId) {
   if (!sourceId) {
     return;
   }
   var doc = getDocument(sourceId) || editor.createDocument();
   editor.replaceDocument(doc);
@@ -20805,17 +20963,88 @@ module.exports = hasPath;
 
 /***/ }),
 /* 298 */,
 /* 299 */,
 /* 300 */,
 /* 301 */,
 /* 302 */,
 /* 303 */,
-/* 304 */,
+/* 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;
+
+
+/***/ }),
 /* 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
@@ -21062,27 +21291,40 @@ exports.pauseOnExceptions = pauseOnExcep
 exports.command = command;
 exports.stepIn = stepIn;
 exports.stepOver = stepOver;
 exports.stepOut = stepOut;
 exports.resume = resume;
 exports.breakOnNext = breakOnNext;
 exports.selectFrame = selectFrame;
 exports.loadObjectProperties = loadObjectProperties;
+exports.astCommand = astCommand;
 
 var _sources = __webpack_require__(254);
 
 var _promise = __webpack_require__(193);
 
 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 = _interopRequireWildcard(_parser);
+
+var _prefs = __webpack_require__(226);
+
+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"); }); }; }
 
 /**
  * Redux actions for the pause state
  * @module actions/pause
  */
 
 /**
@@ -21202,51 +21444,51 @@ function command(_ref5) {
  * @returns {Function} {@link command}
  */
 function stepIn() {
   return (_ref7) => {
     var dispatch = _ref7.dispatch,
         getState = _ref7.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepIn" }));
+      return dispatch(astCommand("stepIn"));
     }
   };
 }
 
 /**
  * stepOver
  * @memberof actions/pause
  * @static
  * @returns {Function} {@link command}
  */
 function stepOver() {
   return (_ref8) => {
     var dispatch = _ref8.dispatch,
         getState = _ref8.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepOver" }));
+      return dispatch(astCommand("stepOver"));
     }
   };
 }
 
 /**
  * stepOut
  * @memberof actions/pause
  * @static
  * @returns {Function} {@link command}
  */
 function stepOut() {
   return (_ref9) => {
     var dispatch = _ref9.dispatch,
         getState = _ref9.getState;
 
     if ((0, _selectors.getPause)(getState())) {
-      return dispatch(command({ type: "stepOut" }));
+      return dispatch(astCommand("stepOut"));
     }
   };
 }
 
 /**
  * resume
  * @memberof actions/pause
  * @static
@@ -21332,16 +21574,57 @@ function loadObjectProperties(object) {
     dispatch({
       type: "LOAD_OBJECT_PROPERTIES",
       objectId,
       [_promise.PROMISE]: client.getProperties(object)
     });
   };
 }
 
+/**
+ * @memberOf actions/pause
+ * @static
+ * @param stepType
+ * @returns {function(ThunkArgs)}
+ */
+function astCommand(stepType) {
+  return (() => {
+    var _ref15 = _asyncToGenerator(function* (_ref16) {
+      var dispatch = _ref16.dispatch,
+          getState = _ref16.getState,
+          sourceMaps = _ref16.sourceMaps;
+
+      if (!_prefs.features.asyncStepping) {
+        return dispatch(command({ type: stepType }));
+      }
+
+      var pauseInfo = (0, _selectors.getPause)(getState());
+      var source = (0, _selectors.getSelectedSource)(getState()).toJS();
+      var currentHiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
+      if (currentHiddenBreakpointLocation) {
+        dispatch((0, _breakpoints.removeBreakpoint)(currentHiddenBreakpointLocation));
+      }
+      var pausedPosition = yield (0, _pause.getPausedPosition)(pauseInfo, sourceMaps);
+
+      var _ref17 = yield parser.getNextStep(source, stepType, pausedPosition),
+          nextStepType = _ref17.nextStepType,
+          nextHiddenBreakpointLocation = _ref17.nextHiddenBreakpointLocation;
+
+      if (nextHiddenBreakpointLocation) {
+        yield dispatch((0, _breakpoints.addHiddenBreakpoint)(nextHiddenBreakpointLocation));
+      }
+      return dispatch(command({ type: nextStepType }));
+    });
+
+    return function (_x3) {
+      return _ref15.apply(this, arguments);
+    };
+  })();
+}
+
 /***/ }),
 /* 320 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -21525,16 +21808,22 @@ function toggleFileSearchModifier(modifi
 }
 
 function showSource(sourceId) {
   return (_ref4) => {
     var dispatch = _ref4.dispatch,
         getState = _ref4.getState;
 
     var source = (0, _selectors.getSource)(getState(), sourceId);
+
+    dispatch({
+      type: "SHOW_SOURCE",
+      sourceUrl: ""
+    });
+
     dispatch({
       type: "SHOW_SOURCE",
       sourceUrl: source.get("url")
     });
   };
 }
 
 function togglePaneCollapse(position, paneCollapsed) {
@@ -21631,17 +21920,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
-__webpack_require__(737);
+__webpack_require__(952);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Modal extends _react.Component {
 
   constructor(props) {
     super(props);
     var self = this;
@@ -23083,17 +23372,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__(695);
+__webpack_require__(867);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
@@ -23102,36 +23391,34 @@ function _interopRequireDefault(obj) { r
 
 class Autocomplete extends _react.Component {
 
   constructor(props) {
     super(props);
 
     this.onKeyDown = this.onKeyDown.bind(this);
     this.state = {
-      inputValue: props.inputValue,
       selectedIndex: 0,
       focused: false
     };
   }
 
   componentDidUpdate() {
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedIndex);
     }
   }
 
   getSearchResults() {
-    var inputValue = this.state.inputValue;
-
+    var inputValue = this.props.inputValue;
     if (inputValue == "") {
       return [];
     }
 
-    return (0, _fuzzaldrinPlus.filter)(this.props.items, this.state.inputValue, {
+    return (0, _fuzzaldrinPlus.filter)(this.props.items, inputValue, {
       key: "value"
     });
   }
 
   onKeyDown(e) {
     var searchResults = this.getSearchResults(),
         resultCount = searchResults.length;
 
@@ -23148,21 +23435,21 @@ class Autocomplete extends _react.Compon
       if (this.props.onSelectedItem) {
         this.props.onSelectedItem(searchResults[_selectedIndex2]);
       }
       e.preventDefault();
     } else if (e.key === "Enter") {
       if (searchResults.length) {
         this.props.selectItem(e, searchResults[this.state.selectedIndex]);
       } else {
-        this.props.close(this.state.inputValue);
+        this.props.close(this.props.inputValue);
       }
       e.preventDefault();
     } else if (e.key === "Tab") {
-      this.props.close(this.state.inputValue);
+      this.props.close(this.props.inputValue);
       e.preventDefault();
     }
   }
 
   renderResults(results) {
     var size = this.props.size;
 
 
@@ -23172,17 +23459,17 @@ class Autocomplete extends _react.Compon
         selected: this.state.selectedIndex,
         selectItem: this.props.selectItem,
         close: this.props.close,
         size,
         ref: "resultList"
       };
 
       return _react2.default.createElement(_ResultList2.default, props);
-    } else if (this.state.inputValue && !results.length) {
+    } else if (this.props.inputValue && !results.length) {
       return _react2.default.createElement(
         "div",
         { className: "no-result-msg absolute-center" },
         L10N.getStr("sourceSearch.noResults2")
       );
     }
   }
 
@@ -23191,26 +23478,28 @@ class Autocomplete extends _react.Compon
     var _props = this.props,
         size = _props.size,
         children = _props.children;
 
     var searchResults = this.getSearchResults();
     var summaryMsg = L10N.getFormatStr("sourceSearch.resultsSummary1", searchResults.length);
 
     var searchProps = {
-      query: this.state.inputValue,
+      query: this.props.inputValue,
       count: searchResults.length,
       placeholder: this.props.placeholder,
       size,
       showErrorEmoji: true,
       summaryMsg,
-      onChange: e => this.setState({
-        inputValue: e.target.value,
-        selectedIndex: 0
-      }),
+      onChange: e => {
+        this.props.onChangeHandler(e.target.value);
+        this.setState({
+          selectedIndex: 0
+        });
+      },
       onFocus: () => this.setState({ focused: true }),
       onBlur: () => this.setState({ focused: false }),
       onKeyDown: this.onKeyDown,
       handleClose: this.props.close
     };
 
     return _react2.default.createElement(
       "div",
@@ -23316,17 +23605,17 @@ exports.handleKeyDown = handleKeyDown;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _Svg = __webpack_require__(345);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(690);
+__webpack_require__(862);
 
 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;
@@ -23349,16 +23638,17 @@ 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),
+  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),
@@ -23390,38 +23680,48 @@ var svg = {
   node: __webpack_require__(1002),
   express: __webpack_require__(1003),
   pug: __webpack_require__(1004),
   extjs: __webpack_require__(1043),
   showSources: __webpack_require__(1044),
   showOutline: __webpack_require__(1045)
 };
 
-module.exports = function (name, props) {
-  // eslint-disable-line
+function Svg(_ref) {
+  var name = _ref.name,
+      className = _ref.className,
+      onClick = _ref.onClick,
+      ariaLabel = _ref["aria-label"];
+
   if (!svg[name]) {
-    var error = "Unknown SVG: " + name;
+    var error = `Unknown SVG: ${name}`;
     if (isDevelopment()) {
       throw new Error(error);
     }
 
     console.warn(error);
     return;
   }
 
-  var className = name;
-  if (props && props.className) {
-    className = `${name} ${props.className}`;
-  }
+  className = `${name} ${className || ""}`;
   if (name === "subSettings") {
     className = "";
   }
-  props = Object.assign({}, props, { className, src: svg[name] });
+  var props = {
+    className,
+    onClick,
+    ["aria-label"]: ariaLabel,
+    src: svg[name]
+  };
   return React.createElement(InlineSVG, props);
-};
+}
+
+Svg.displayName = "Svg";
+
+module.exports = Svg;
 
 /***/ }),
 /* 346 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -23765,33 +24065,33 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(693);
+__webpack_require__(865);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var arrowBtn = (onClick, type, className, tooltip) => {
   var props = {
     onClick,
     type,
     className,
     title: tooltip,
     key: type
   };
 
   return _react2.default.createElement(
     "button",
     props,
-    (0, _Svg2.default)(type)
+    _react2.default.createElement(_Svg2.default, { name: type })
   );
 };
 
 arrowBtn.displayName = "ArrowButton";
 
 class SearchInput extends _react.Component {
 
   componentDidMount() {
@@ -23804,20 +24104,20 @@ class SearchInput extends _react.Compone
         query = _props.query,
         showErrorEmoji = _props.showErrorEmoji;
 
     return count === 0 && query.trim() !== "" && !showErrorEmoji;
   }
 
   renderSvg() {
     if (this.shouldShowErrorEmoji()) {
-      return (0, _Svg2.default)("sad-face");
-    }
-
-    return (0, _Svg2.default)("magnifying-glass");
+      return _react2.default.createElement(_Svg2.default, { name: "sad-face" });
+    }
+
+    return _react2.default.createElement(_Svg2.default, { name: "magnifying-glass" });
   }
 
   renderArrowButtons() {
     var _props2 = this.props,
         handleNext = _props2.handleNext,
         handlePrev = _props2.handlePrev;
 
 
@@ -23911,33 +24211,33 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(692);
+__webpack_require__(864);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function CloseButton(_ref) {
   var handleClick = _ref.handleClick,
       buttonClass = _ref.buttonClass,
       tooltip = _ref.tooltip;
 
   return _react2.default.createElement(
     "div",
     {
       className: buttonClass ? `close-btn ${buttonClass}` : "close-btn",
       onClick: handleClick,
       title: tooltip
     },
-    (0, _Svg2.default)("close")
+    _react2.default.createElement(_Svg2.default, { name: "close" })
   );
 }
 
 
 CloseButton.displayName = "CloseButton";
 CloseButton.propTypes = {
   handleClick: _react.PropTypes.func.isRequired
 };
@@ -23962,17 +24262,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__(696);
+__webpack_require__(868);
 
 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);
@@ -24119,17 +24419,17 @@ 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__(691);
+__webpack_require__(863);
 
 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 {
@@ -24310,30 +24610,32 @@ var _redux = __webpack_require__(3);
 var _reactRedux = __webpack_require__(151);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-var _lodash = __webpack_require__(2);
-
 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 _ast = __webpack_require__(1058);
+
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _Footer = __webpack_require__(427);
 
@@ -24342,17 +24644,17 @@ var _Footer2 = _interopRequireDefault(_F
 var _SearchBar = __webpack_require__(433);
 
 var _SearchBar2 = _interopRequireDefault(_SearchBar);
 
 var _HighlightLines = __webpack_require__(1025);
 
 var _HighlightLines2 = _interopRequireDefault(_HighlightLines);
 
-var _Preview = __webpack_require__(657);
+var _Preview = __webpack_require__(809);
 
 var _Preview2 = _interopRequireDefault(_Preview);
 
 var _Breakpoints = __webpack_require__(1158);
 
 var _Breakpoints2 = _interopRequireDefault(_Breakpoints);
 
 var _HitMarker = __webpack_require__(715);
@@ -24362,21 +24664,25 @@ var _HitMarker2 = _interopRequireDefault
 var _CallSites = __webpack_require__(1159);
 
 var _CallSites2 = _interopRequireDefault(_CallSites);
 
 var _DebugLine = __webpack_require__(313);
 
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
+var _EmptyLines = __webpack_require__(1144);
+
+var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
+
 var _editor = __webpack_require__(257);
 
-__webpack_require__(716);
-
-__webpack_require__(717);
+__webpack_require__(905);
+
+__webpack_require__(906);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
@@ -24398,20 +24704,18 @@ class Editor extends _react.PureComponen
       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.onScroll = this.onScroll.bind(this);
     self.onSearchAgain = this.onSearchAgain.bind(this);
     self.onToggleBreakpoint = this.onToggleBreakpoint.bind(this);
-    self.onMouseOver = (0, _lodash.debounce)(this.onMouseOver, 40);
     self.toggleConditionalPanel = this.toggleConditionalPanel.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     // This lifecycle method is responsible for updating the editor
     // text.
     var selectedSource = nextProps.selectedSource;
 
@@ -24419,17 +24723,17 @@ class Editor extends _react.PureComponen
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
 
     if (!selectedSource) {
       if (this.props.selectedSource) {
         this.showMessage("");
       }
-    } else if (selectedSource.get("loading")) {
+    } else if (!(0, _source.isLoaded)(selectedSource.toJS())) {
       this.showMessage(L10N.getStr("loadingText"));
     } else if (selectedSource.get("error")) {
       this.showMessage(selectedSource.get("error"));
     } else if (this.props.selectedSource !== selectedSource) {
       (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS());
     }
 
     if (this.state.editor && this.props.linesInScope !== nextProps.linesInScope) {
@@ -24459,17 +24763,16 @@ class Editor extends _react.PureComponen
     (0, _editor.resizeBreakpointGutter)(codeMirror);
     (0, _devtoolsLaunchpad.debugGlobal)("cm", codeMirror);
 
     codeMirror.on("gutterClick", this.onGutterClick);
 
     // Set code editor wrapper to be focusable
     codeMirrorWrapper.tabIndex = 0;
     codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e));
-    codeMirrorWrapper.addEventListener("mouseover", e => this.onMouseOver(e));
 
     var toggleFoldMarkerVisibility = e => {
       if (node instanceof HTMLElement) {
         node.querySelectorAll(".CodeMirror-guttermarker-subtle").forEach(elem => {
           elem.classList.toggle("visible");
         });
       }
     };
@@ -24481,18 +24784,16 @@ class Editor extends _react.PureComponen
     if (!(0, _devtoolsConfig.isFirefox)()) {
       codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
 
       codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, cm));
     } else {
       codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, codeMirror));
     }
 
-    codeMirror.on("scroll", this.onScroll);
-
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     this.cbPanel = null;
     var editor = this.setupEditor();
 
@@ -24614,36 +24915,28 @@ class Editor extends _react.PureComponen
     var codeMirror = this.state.editor.codeMirror;
 
     if (codeMirror.listSelections().length > 1) {
       codeMirror.execCommand("singleSelection");
       e.preventDefault();
     }
   }
 
-  onScroll() {
-    this.clearPreviewSelection();
-  }
-
   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());
   }
 
-  clearPreviewSelection() {
-    this.props.clearSelection();
-  }
-
   inSelectedFrameSource() {
     var _props4 = this.props,
         selectedLocation = _props4.selectedLocation,
         selectedFrame = _props4.selectedFrame;
 
     return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
   }
 
@@ -24668,75 +24961,82 @@ class Editor extends _react.PureComponen
       toggleBlackBox,
       onGutterContextMenu: this.onGutterContextMenu
     });
   }
 
   onGutterClick(cm, line, gutter, ev) {
     var _props6 = this.props,
         selectedSource = _props6.selectedSource,
-        toggleBreakpoint = _props6.toggleBreakpoint;
+        toggleBreakpoint = _props6.toggleBreakpoint,
+        addOrToggleDisabledBreakpoint = _props6.addOrToggleDisabledBreakpoint,
+        isEmptyLine = _props6.isEmptyLine;
 
     // 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") {
-      toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      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;
+        toggleDisabledBreakpoint = _props7.toggleDisabledBreakpoint,
+        isEmptyLine = _props7.isEmptyLine;
 
 
     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,
 
       showConditionalPanel: this.toggleConditionalPanel,
       isCbPanelOpen: this.isCbPanelOpen(),
       closeConditionalPanel: this.closeConditionalPanel
     });
   }
 
-  onMouseOver(e) {
-    var target = e.target;
-
-    if (this.inSelectedFrameSource()) {
-      (0, _editor.updateSelection)(target, this.state.editor, this.props);
-    }
-  }
-
   toggleConditionalPanel(line) {
     if (this.isCbPanelOpen()) {
       return this.closeConditionalPanel();
     }
 
     var _props8 = this.props,
         selectedLocation = _props8.selectedLocation,
         setBreakpointCondition = _props8.setBreakpointCondition,
@@ -24850,60 +25150,35 @@ class Editor extends _react.PureComponen
   }
 
   renderHitCounts() {
     var _props10 = this.props,
         hitCount = _props10.hitCount,
         selectedSource = _props10.selectedSource;
 
 
-    if (!selectedSource || selectedSource.get("loading") || !hitCount || !this.state.editor) {
+    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 _props11 = this.props,
-        selectedSource = _props11.selectedSource,
-        selection = _props11.selection;
+    var selectedSource = this.props.selectedSource;
 
     if (!this.state.editor || !selectedSource) {
       return null;
     }
 
-    if (!selection || selection.updating) {
-      return;
-    }
-
-    var result = selection.result,
-        expression = selection.expression,
-        location = selection.location,
-        cursorPos = selection.cursorPos;
-
-    var value = result;
-    if (typeof value == "undefined" || value.optimizedOut) {
-      return;
-    }
-
-    var editorRange = (0, _editor.toEditorRange)(selectedSource.get("id"), location);
-
-    return _react2.default.createElement(_Preview2.default, {
-      value: value,
-      editor: this.state.editor,
-      range: editorRange,
-      expression: expression,
-      popoverPos: cursorPos,
-      onClose: () => this.clearPreviewSelection()
-    });
+    return _react2.default.createElement(_Preview2.default, { editor: this.state.editor });
   }
 
   renderInScopeLines() {
     var linesInScope = this.props.linesInScope;
 
     if (!this.state.editor || !(0, _devtoolsConfig.isEnabled)("highlightScopeLines") || !linesInScope || !this.inSelectedFrameSource()) {
       return;
     }
@@ -24920,21 +25195,21 @@ class Editor extends _react.PureComponen
 
     if (!editor || !(0, _devtoolsConfig.isEnabled)("columnBreakpoints")) {
       return null;
     }
     return _react2.default.createElement(_CallSites2.default, { editor: editor });
   }
 
   renderSearchBar() {
-    var _props12 = this.props,
-        selectSource = _props12.selectSource,
-        selectedSource = _props12.selectedSource,
-        highlightLineRange = _props12.highlightLineRange,
-        clearHighlightLineRange = _props12.clearHighlightLineRange;
+    var _props11 = this.props,
+        selectSource = _props11.selectSource,
+        selectedSource = _props11.selectedSource,
+        highlightLineRange = _props11.highlightLineRange,
+        clearHighlightLineRange = _props11.clearHighlightLineRange;
 
 
     if (!this.state.editor) {
       return null;
     }
 
     return _react2.default.createElement(_SearchBar2.default, {
       editor: this.state.editor,
@@ -24958,37 +25233,45 @@ class Editor extends _react.PureComponen
   renderBreakpoints() {
     if (!this.state.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;
+    var _props12 = this.props,
+        selectedLocation = _props12.selectedLocation,
+        selectedFrame = _props12.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;
+    var _props13 = this.props,
+        coverageOn = _props13.coverageOn,
+        pauseData = _props13.pauseData;
 
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("editor-wrapper", {
           "coverage-on": coverageOn,
           paused: !!pauseData && (0, _devtoolsConfig.isEnabled)("highlightScopeLines")
@@ -25001,17 +25284,18 @@ class Editor extends _react.PureComponen
       }),
       this.renderHighlightLines(),
       this.renderInScopeLines(),
       this.renderHitCounts(),
       this.renderFooter(),
       this.renderPreview(),
       this.renderCallSites(),
       this.renderDebugLine(),
-      this.renderBreakpoints()
+      this.renderBreakpoints(),
+      this.renderEmptyLines()
     );
   }
 }
 
 Editor.displayName = "Editor";
 
 Editor.propTypes = {
   breakpoints: _reactImmutableProptypes2.default.map,
@@ -25037,23 +25321,23 @@ Editor.propTypes = {
   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,
-  selection: _react.PropTypes.object,
   startPanelSize: _react.PropTypes.number,
   endPanelSize: _react.PropTypes.number,
-  clearSelection: _react.PropTypes.func.isRequired,
   linesInScope: _react.PropTypes.array,
   toggleBreakpoint: _react.PropTypes.func.isRequired,
-  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired
+  addOrToggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  isEmptyLine: _react.PropTypes.func
 };
 
 Editor.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedLocation = (0, _selectors.getSelectedLocation)(state);
@@ -25069,17 +25353,17 @@ exports.default = (0, _reactRedux.connec
     breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
     hitCount: (0, _selectors.getHitCountForSource)(state, sourceId),
     selectedFrame: (0, _selectors.getSelectedFrame)(state),
     pauseData: (0, _selectors.getPause)(state),
     coverageOn: (0, _selectors.getCoverageEnabled)(state),
     query: (0, _selectors.getFileSearchQueryState)(state),
     searchModifiers: (0, _selectors.getFileSearchModifierState)(state),
     linesInScope: (0, _selectors.getInScopeLines)(state),
-    selection: (0, _selectors.getSelection)(state)
+    isEmptyLine: line => (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS())
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Editor);
 
 /***/ }),
 /* 427 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -25116,28 +25400,28 @@ 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__(705);
+__webpack_require__(875);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceFooter extends _react.PureComponent {
 
   prettyPrintButton() {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         togglePrettyPrint = _props.togglePrettyPrint;
 
-    var sourceLoaded = selectedSource && !selectedSource.get("loading");
+    var sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
     if (!(0, _editor.shouldShowPrettyPrint)(selectedSource)) {
       return;
     }
 
     var tooltip = L10N.getStr("sourceTabs.prettyPrint");
     var type = "prettyPrint";
 
@@ -25148,26 +25432,26 @@ class SourceFooter extends _react.PureCo
         className: (0, _classnames2.default)("action", type, {
           active: sourceLoaded,
           pretty: (0, _source.isPretty)(selectedSource.toJS())
         }),
         key: type,
         title: tooltip,
         "aria-label": tooltip
       },
-      (0, _Svg2.default)(type)
+      _react2.default.createElement(_Svg2.default, { name: type })
     );
   }
 
   blackBoxButton() {
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         toggleBlackBox = _props2.toggleBlackBox;
 
-    var sourceLoaded = selectedSource && !selectedSource.get("loading");
+    var sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
     var blackboxed = selectedSource.get("isBlackBoxed");
 
     if (!(0, _devtoolsConfig.isEnabled)("blackbox")) {
       return;
     }
 
     var tooltip = L10N.getStr("sourceFooter.blackbox");
@@ -25180,17 +25464,17 @@ class SourceFooter extends _react.PureCo
         className: (0, _classnames2.default)("action", type, {
           active: sourceLoaded,
           blackboxed: blackboxed
         }),
         key: type,
         title: tooltip,
         "aria-label": tooltip
       },
-      (0, _Svg2.default)("blackBox")
+      _react2.default.createElement(_Svg2.default, { name: "blackBox" })
     );
   }
 
   blackBoxSummary() {
     var selectedSource = this.props.selectedSource;
 
     var blackboxed = selectedSource.get("isBlackBoxed");
 
@@ -25304,17 +25588,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__(704);
+__webpack_require__(874);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
     var _props = this.props,
         collapsed = _props.collapsed,
@@ -25338,17 +25622,17 @@ class PaneToggleButton extends _react.Co
       {
         className: (0, _classnames2.default)(`toggle-button-${position}`, {
           collapsed,
           vertical: horizontal != null ? !horizontal : false
         }),
         onClick: () => handleClick(position, collapsed),
         title: title
       },
-      (0, _Svg2.default)("togglePanes")
+      _react2.default.createElement(_Svg2.default, { name: "togglePanes" })
     );
   }
 }
 
 PaneToggleButton.displayName = "PaneToggleButton";
 
 exports.default = PaneToggleButton;
 
@@ -25386,31 +25670,33 @@ 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 _source = __webpack_require__(233);
+
 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__(706);
+__webpack_require__(876);
 
 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");
@@ -25497,18 +25783,18 @@ class SearchBar extends _react.Component
     if (searchInput) {
       searchInput.focus();
     }
 
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedResultIndex);
     }
 
-    var hasLoaded = selectedSource && !selectedSource.get("loading");
-    var wasLoading = prevProps.selectedSource && prevProps.selectedSource.get("loading");
+    var hasLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
+    var wasLoading = prevProps.selectedSource && (0, _source.isLoaded)(prevProps.selectedSource.toJS());
 
     var doneLoading = wasLoading && hasLoaded;
     var changedFiles = selectedSource != prevProps.selectedSource && hasLoaded;
     var modifiersUpdated = modifiers && !modifiers.equals(prevProps.modifiers);
 
     if (searchOn && (doneLoading || changedFiles || modifiersUpdated)) {
       this.doSearch(query);
     }
@@ -25734,17 +26020,17 @@ class SearchBar extends _react.Component
       });
       return _react2.default.createElement(
         "button",
         {
           className: preppedClass,
           onClick: () => toggleFileSearchModifier(modVal),
           title: tooltip
         },
-        (0, _Svg2.default)(svgName)
+        _react2.default.createElement(_Svg2.default, { name: svgName })
       );
     }
 
     return _react2.default.createElement(
       "div",
       { className: "search-modifiers" },
       _react2.default.createElement(
         "span",
@@ -26049,18 +26335,239 @@ exports.default = (0, _reactRedux.connec
 /* 643 */,
 /* 644 */,
 /* 645 */,
 /* 646 */,
 /* 647 */,
 /* 648 */,
 /* 649 */,
 /* 650 */,
-/* 651 */,
-/* 652 */,
+/* 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;
+
+
+/***/ }),
 /* 653 */,
 /* 654 */,
 /* 655 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -26187,33 +26694,43 @@ function getMenuItems(event, _ref) {
       selectedLocation = _ref.selectedLocation,
       selectedSource = _ref.selectedSource,
       showSource = _ref.showSource,
       onGutterContextMenu = _ref.onGutterContextMenu,
       jumpToMappedLocation = _ref.jumpToMappedLocation,
       toggleBlackBox = _ref.toggleBlackBox,
       addExpression = _ref.addExpression;
 
+  var copySourceLabel = L10N.getStr("copySource");
+  var copySourceKey = L10N.getStr("copySource.accesskey");
   var copySourceUrlLabel = L10N.getStr("copySourceUrl");
   var copySourceUrlKey = L10N.getStr("copySourceUrl.accesskey");
   var revealInTreeLabel = L10N.getStr("sourceTabs.revealInTree");
   var revealInTreeKey = L10N.getStr("sourceTabs.revealInTree.accesskey");
   var blackboxLabel = L10N.getStr("sourceFooter.blackbox");
   var unblackboxLabel = L10N.getStr("sourceFooter.unblackbox");
   var blackboxKey = L10N.getStr("sourceFooter.blackbox.accesskey");
   var toggleBlackBoxLabel = selectedSource.get("isBlackBoxed") ? unblackboxLabel : blackboxLabel;
 
   var copySourceUrl = {
-    id: "node-menu-copy-source",
+    id: "node-menu-copy-source-url",
     label: copySourceUrlLabel,
     accesskey: copySourceUrlKey,
     disabled: false,
     click: () => (0, _clipboard.copyToTheClipboard)(selectedSource.get("url"))
   };
 
+  var copySource = {
+    id: "node-menu-copy-source",
+    label: copySourceLabel,
+    accesskey: copySourceKey,
+    disabled: false,
+    click: () => (0, _clipboard.copyToTheClipboard)(codeMirror.getSelection())
+  };
+
   var _codeMirror$coordsCha = codeMirror.coordsChar({
     left: event.clientX,
     top: event.clientY
   }),
       line = _codeMirror$coordsCha.line,
       ch = _codeMirror$coordsCha.ch;
 
   var sourceLocation = {
@@ -26255,263 +26772,29 @@ function getMenuItems(event, _ref) {
     disabled: false,
     click: () => showSource(selectedSource.get("id"))
   };
 
   if (selectedSource && selectedSource.get("isBlackBoxed")) {
     return [blackBoxMenuItem];
   }
 
-  var menuItems = [copySourceUrl, jumpLabel, showSourceMenuItem, blackBoxMenuItem];
+  var menuItems = [copySource, copySourceUrl, jumpLabel, showSourceMenuItem, blackBoxMenuItem];
 
   if (textSelected) {
     menuItems.push(watchExpressionLabel);
   }
 
   return menuItems;
 }
 
 exports.default = EditorMenu;
 
 /***/ }),
-/* 657 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Preview = undefined;
-
-var _react = __webpack_require__(0);
-
-var _react2 = _interopRequireDefault(_react);
-
-var _reactRedux = __webpack_require__(151);
-
-var _redux = __webpack_require__(3);
-
-var _devtoolsConfig = __webpack_require__(828);
-
-var _devtoolsReps = __webpack_require__(924);
-
-var _devtoolsReps2 = _interopRequireDefault(_devtoolsReps);
-
-var _Popover = __webpack_require__(698);
-
-var _Popover2 = _interopRequireDefault(_Popover);
-
-var _previewFunction = __webpack_require__(701);
-
-var _previewFunction2 = _interopRequireDefault(_previewFunction);
-
-var _selectors = __webpack_require__(242);
-
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-var _editor = __webpack_require__(257);
-
-__webpack_require__(712);
-
-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;
-class Preview extends _react.Component {
-
-  componentDidMount() {
-    var _props = this.props,
-        loadObjectProperties = _props.loadObjectProperties,
-        loadedObjects = _props.loadedObjects,
-        value = _props.value,
-        editor = _props.editor,
-        range = _props.range;
-
-
-    this.marker = (0, _editor.markText)(editor, "selection", range);
-
-    if (!value || !value.type == "object") {
-      return;
-    }
-
-    if (value.actor && !loadedObjects[value.actor]) {
-      loadObjectProperties(value);
-    }
-  }
-
-  componentWillUnmount() {
-    if (this.marker) {
-      this.marker.clear();
-    }
-  }
-
-  getChildren(root, getObjectProperties) {
-    var actors = {};
-
-    var children = getChildren({
-      getObjectProperties,
-      actors,
-      item: root
-    });
-
-    if (children.length > 0) {
-      return children;
-    }
-
-    return [root];
-  }
-
-  renderFunctionPreview(value, root) {
-    var selectSourceURL = this.props.selectSourceURL;
-    var location = value.location;
-
-
-    return _react2.default.createElement(
-      "div",
-      {
-        className: "preview",
-        onClick: () => selectSourceURL(location.url, { line: location.line })
-      },
-      (0, _previewFunction2.default)(value)
-    );
-  }
-
-  renderObjectPreview(expression, root) {
-    return _react2.default.createElement(
-      "div",
-      { className: "preview" },
-      this.renderObjectInspector(root)
-    );
-  }
-
-  renderSimplePreview(value) {
-    return _react2.default.createElement(
-      "div",
-      { className: "preview" },
-      Rep({ object: value, mode: MODE.LONG })
-    );
-  }
-
-  renderObjectInspector(root) {
-    var _props2 = this.props,
-        loadObjectProperties = _props2.loadObjectProperties,
-        loadedObjects = _props2.loadedObjects;
-
-
-    var getObjectProperties = id => loadedObjects[id];
-    var roots = this.getChildren(root, getObjectProperties);
-
-    return _react2.default.createElement(ObjectInspector, {
-      roots: roots,
-      autoExpandDepth: 0,
-      disableWrap: true,
-      disabledFocus: true,
-      getObjectProperties: getObjectProperties,
-      loadObjectProperties: loadObjectProperties
-      // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
-      , getObjectEntries: actor => {},
-      loadObjectEntries: grip => {}
-    });
-  }
-
-  renderAddToExpressionBar(expression) {
-    if (!(0, _devtoolsConfig.isEnabled)("previewWatch")) {
-      return null;
-    }
-
-    var addExpression = this.props.addExpression;
-
-    return _react2.default.createElement(
-      "div",
-      { className: "add-to-expression-bar" },
-      _react2.default.createElement(
-        "div",
-        { className: "prompt" },
-        "\xBB"
-      ),
-      _react2.default.createElement(
-        "div",
-        { className: "expression-to-save-label" },
-        expression
-      ),
-      _react2.default.createElement(
-        "div",
-        {
-          className: "expression-to-save-button",
-          onClick: event => addExpression(event)
-        },
-        L10N.getStr("addWatchExpressionButton")
-      )
-    );
-  }
-
-  renderPreview(expression, value) {
-    var root = {
-      name: expression,
-      path: expression,
-      contents: { value }
-    };
-
-    if (value.class === "Function") {
-      return this.renderFunctionPreview(value, root);
-    }
-
-    if (value.type === "object") {
-      return _react2.default.createElement(
-        "div",
-        null,
-        this.renderObjectPreview(expression, root),
-        this.renderAddToExpressionBar(expression)
-      );
-    }
-
-    return this.renderSimplePreview(value);
-  }
-
-  getPreviewType(value) {
-    if (typeof value == "boolean" || 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)
-    );
-  }
-}
-
-exports.Preview = Preview;
-Preview.displayName = "Preview";
-
-exports.default = (0, _reactRedux.connect)(state => ({
-  loadedObjects: (0, _selectors.getLoadedObjects)(state)
-}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Preview);
-
-/***/ }),
+/* 657 */,
 /* 658 */,
 /* 659 */,
 /* 660 */,
 /* 661 */,
 /* 662 */,
 /* 663 */,
 /* 664 */,
 /* 665 */,
@@ -26533,130 +26816,35 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 
 /***/ }),
 /* 678 */
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_678__;
 
 /***/ }),
-/* 679 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 680 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 681 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 682 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 683 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 684 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 685 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 686 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 687 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 688 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 689 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 690 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 691 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 692 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 693 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 694 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 695 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 696 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 697 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 679 */,
+/* 680 */,
+/* 681 */,
+/* 682 */,
+/* 683 */,
+/* 684 */,
+/* 685 */,
+/* 686 */,
+/* 687 */,
+/* 688 */,
+/* 689 */,
+/* 690 */,
+/* 691 */,
+/* 692 */,
+/* 693 */,
+/* 694 */,
+/* 695 */,
+/* 696 */,
+/* 697 */,
 /* 698 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -26673,23 +26861,24 @@ var _reactDom2 = _interopRequireDefault(
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _BracketArrow = __webpack_require__(1029);
 
 var _BracketArrow2 = _interopRequireDefault(_BracketArrow);
 
-__webpack_require__(710);
+__webpack_require__(880);
 
 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
     };
   }
 
   componentDidMount() {
     var type = this.props.type;
@@ -26774,32 +26963,42 @@ class Popover extends _react.Component {
       orientation: arrowOrientation,
       left,
       [arrowProp]: arrowPropValue
     };
 
     return _react2.default.createElement(_BracketArrow2.default, arrowProps);
   }
 
+  onMouseLeave(e) {
+    var onMouseLeave = this.props.onMouseLeave;
+
+
+    if (e.target.className.match(/(bracket-arrow|gap)/)) {
+      return;
+    }
+
+    onMouseLeave();
+  }
+
   renderPopover() {
-    var onMouseLeave = this.props.onMouseLeave;
     var _state = this.state,
         top = _state.top,
         left = _state.left,
         orientation = _state.orientation,
         targetMid = _state.targetMid;
 
 
     var arrow = this.getPopoverArrow(orientation, targetMid);
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("popover", { up: orientation === "up" }),
-        onMouseLeave: onMouseLeave,
+        onMouseLeave: this.onMouseLeave,
         style: { top, left }
       },
       arrow,
       this.getChildren()
     );
   }
 
   renderTooltip() {
@@ -26845,156 +27044,52 @@ Popover.defaultProps = {
   type: "popover"
 };
 
 Popover.displayName = "Popover";
 
 exports.default = Popover;
 
 /***/ }),
-/* 699 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 700 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 701 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _react = __webpack_require__(0);
-
-var _lodash = __webpack_require__(2);
-
-var _frame = __webpack_require__(1014);
-
-__webpack_require__(702);
-
-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 getFunctionName(func) {
-  var name = func.userDisplayName || func.displayName || func.name;
-  return (0, _frame.simplifyDisplayName)(name);
-}
-
-function renderFunctionName(func) {
-  var name = getFunctionName(func);
-  return _react.DOM.span({ className: "function-name" }, name);
-}
-
-function renderParams(func) {
-  var _func$parameterNames = func.parameterNames,
-      parameterNames = _func$parameterNames === undefined ? [] : _func$parameterNames;
-
-  var params = parameterNames.filter(i => i).map(param => _react.DOM.span({ className: "param" }, param));
-
-  var commas = (0, _lodash.times)(params.length - 1).map(() => _react.DOM.span({ className: "delimiter" }, ", "));
-
-  return (0, _lodash.flatten)((0, _lodash.zip)(params, commas));
-}
-
-function renderParen(paren) {
-  return _react.DOM.span({ className: "paren" }, paren);
-}
-
-function previewFunction(func) {
-  return _react.DOM.span.apply(_react.DOM, [{ className: "function-signature" }, renderFunctionName(func), renderParen("(")].concat(_toConsumableArray(renderParams(func)), [renderParen(")")]));
-}
-
-exports.default = previewFunction;
-
-/***/ }),
-/* 702 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 703 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 704 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 705 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 706 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 707 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 708 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 709 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 710 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 699 */,
+/* 700 */,
+/* 701 */,
+/* 702 */,
+/* 703 */,
+/* 704 */,
+/* 705 */,
+/* 706 */,
+/* 707 */,
+/* 708 */,
+/* 709 */,
+/* 710 */,
 /* 711 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.renderConditionalPanel = undefined;
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(703);
+__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;
 
@@ -27016,57 +27111,59 @@ function renderConditionalPanel(_ref) {
   function onKey(e) {
     if (e.key === "Enter") {
       saveAndClose();
     } else if (e.key === "Escape") {
       closePanel();
     }
   }
 
-  _reactDom2.default.render(_react.DOM.div({ className: "conditional-breakpoint-panel" }, _react.DOM.div({ className: "prompt" }, "»"), _react.DOM.input({
-    defaultValue: condition,
-    placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
-    onKeyDown: onKey,
-    ref: setInput
-  }), (0, _Close2.default)({
-    handleClick: closePanel,
-    buttonClass: "big",
-    tooltip: L10N.getStr("editor.conditionalPanel.close")
-  })), panel);
+  _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;
 
 /***/ }),
-/* 712 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 713 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 712 */,
+/* 713 */,
 /* 714 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _devtoolsConfig = __webpack_require__(828);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _classnames = __webpack_require__(175);
 
@@ -27076,17 +27173,17 @@ var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _editor = __webpack_require__(257);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var breakpointSvg = document.createElement("div");
-_reactDom2.default.render((0, _Svg2.default)("breakpoint"), breakpointSvg);
+_reactDom2.default.render(_react2.default.createElement(_Svg2.default, { name: "breakpoint" }), breakpointSvg);
 
 function makeMarker(isDisabled) {
   var bp = breakpointSvg.cloneNode(true);
   bp.className = (0, _classnames2.default)("editor new-breakpoint", {
     "breakpoint-disabled": isDisabled,
     "folding-enabled": (0, _devtoolsConfig.isEnabled)("codeFolding")
   });
 
@@ -27101,19 +27198,24 @@ class Breakpoint extends _react.Componen
   }
 
   addBreakpoint() {
     var _props = this.props,
         breakpoint = _props.breakpoint,
         editor = _props.editor,
         selectedSource = _props.selectedSource;
 
+    // Hidden Breakpoints are never rendered on the client
+
+    if (breakpoint.hidden) {
+      return;
+    }
+
     // NOTE: we need to wait for the breakpoint to be loaded
     // to get the generated location
-
     if (!selectedSource || breakpoint.loading) {
       return;
     }
 
     var sourceId = selectedSource.get("id");
     var line = (0, _editor.toEditorLine)(sourceId, breakpoint.location.line);
 
     (0, _editor.showSourceText)(editor, selectedSource.toJS());
@@ -27129,17 +27231,17 @@ class Breakpoint extends _react.Componen
   }
 
   shouldComponentUpdate(nextProps) {
     var _props2 = this.props,
         editor = _props2.editor,
         breakpoint = _props2.breakpoint,
         selectedSource = _props2.selectedSource;
 
-    return editor !== nextProps.editor || breakpoint.disabled !== nextProps.breakpoint.disabled || breakpoint.condition !== nextProps.breakpoint.condition || breakpoint.loading !== nextProps.breakpoint.loading || selectedSource !== nextProps.selectedSource;
+    return editor !== nextProps.editor || breakpoint.disabled !== nextProps.breakpoint.disabled || breakpoint.hidden !== nextProps.breakpoint.hidden || breakpoint.condition !== nextProps.breakpoint.condition || breakpoint.loading !== nextProps.breakpoint.loading || selectedSource !== nextProps.selectedSource;
   }
 
   componentDidMount() {
     this.addBreakpoint();
   }
 
   componentDidUpdate() {
     this.addBreakpoint();
@@ -27246,40 +27348,32 @@ class HitMarker extends _react.Component
   }
 }
 
 HitMarker.displayName = "HitMarker";
 
 exports.default = HitMarker;
 
 /***/ }),
-/* 716 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 717 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 716 */,
+/* 717 */,
 /* 718 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
 var _reactImmutableProptypes = __webpack_require__(150);
 
 var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
 
@@ -27292,112 +27386,113 @@ var _selectors = __webpack_require__(242
 var _devtoolsConfig = __webpack_require__(828);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _prefs = __webpack_require__(226);
 
-var _Breakpoints2 = __webpack_require__(725);
-
-var _Breakpoints3 = _interopRequireDefault(_Breakpoints2);
-
-var _Expressions2 = __webpack_require__(719);
-
-var _Expressions3 = _interopRequireDefault(_Expressions2);
+var _Breakpoints = __webpack_require__(725);
+
+var _Breakpoints2 = _interopRequireDefault(_Breakpoints);
+
+var _Expressions = __webpack_require__(719);
+
+var _Expressions2 = _interopRequireDefault(_Expressions);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
-var _Frames2 = __webpack_require__(1012);
-
-var _Frames3 = _interopRequireDefault(_Frames2);
-
-var _EventListeners2 = __webpack_require__(736);
-
-var _EventListeners3 = _interopRequireDefault(_EventListeners2);
-
-var _Accordion2 = __webpack_require__(739);
-
-var _Accordion3 = _interopRequireDefault(_Accordion2);
-
-var _CommandBar2 = __webpack_require__(742);
-
-var _CommandBar3 = _interopRequireDefault(_CommandBar2);
+var _Frames = __webpack_require__(1012);
+
+var _Frames2 = _interopRequireDefault(_Frames);
+
+var _EventListeners = __webpack_require__(736);
+
+var _EventListeners2 = _interopRequireDefault(_EventListeners);
+
+var _Workers = __webpack_require__(1147);
+
+var _Workers2 = _interopRequireDefault(_Workers);
+
+var _Accordion = __webpack_require__(739);
+
+var _Accordion2 = _interopRequireDefault(_Accordion);
+
+var _CommandBar = __webpack_require__(742);
+
+var _CommandBar2 = _interopRequireDefault(_CommandBar);
 
 var _ChromeScopes = __webpack_require__(728);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(731);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
-__webpack_require__(730);
+__webpack_require__(921);
 
 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 Breakpoints = (0, _react.createFactory)(_Breakpoints3.default);
-
-var Expressions = (0, _react.createFactory)(_Expressions3.default);
-
-var SplitBox = (0, _react.createFactory)(_devtoolsSplitter2.default);
-
-var Frames = (0, _react.createFactory)(_Frames3.default);
-
-var EventListeners = (0, _react.createFactory)(_EventListeners3.default);
-
-var Accordion = (0, _react.createFactory)(_Accordion3.default);
-
-var CommandBar = (0, _react.createFactory)(_CommandBar3.default);
-
-var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? (0, _react.createFactory)(_ChromeScopes2.default) : (0, _react.createFactory)(_Scopes3.default);
+var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? _ChromeScopes2.default : _Scopes3.default;
 
 function debugBtn(onClick, type, className, tooltip) {
-  className = `${type} ${className}`;
-  return _react.DOM.button({ onClick, className, key: type, title: tooltip }, (0, _Svg2.default)(type, { title: tooltip, "aria-label": tooltip }));
-}
+  return _react2.default.createElement(
+    "button",
+    {
+      onClick: onClick,
+      className: `${type} ${className}`,
+      key: type,
+      title: tooltip
+    },
+    _react2.default.createElement(_Svg2.default, { name: type, title: tooltip, "aria-label": tooltip })
+  );
+}
+debugBtn.displayName = "DebugButton";
 
 class SecondaryPanes extends _react.Component {
   renderBreakpointsToggle() {
     var _props = this.props,
         toggleAllBreakpoints = _props.toggleAllBreakpoints,
         breakpoints = _props.breakpoints,
         breakpointsDisabled = _props.breakpointsDisabled,
         breakpointsLoading = _props.breakpointsLoading;
 
     var boxClassName = "breakpoints-toggle";
     var isIndeterminate = !breakpointsDisabled && breakpoints.some(x => x.disabled);
 
     if (breakpoints.size == 0) {
       return null;
     }
 
-    return _react.DOM.input({
+    var inputProps = {
       type: "checkbox",
       "aria-label": breakpointsDisabled ? L10N.getStr("breakpoints.enable") : L10N.getStr("breakpoints.disable"),
       className: boxClassName,
       disabled: breakpointsLoading,
       onChange: e => {
         e.stopPropagation();
         toggleAllBreakpoints(!breakpointsDisabled);
       },
       onClick: e => e.stopPropagation(),
       checked: !breakpointsDisabled && !isIndeterminate,
       ref: input => {
         if (input) {
           input.indeterminate = isIndeterminate;
         }
       },
       title: breakpointsDisabled ? L10N.getStr("breakpoints.enable") : L10N.getStr("breakpoints.disable")
-    });
+    };
+
+    return _react2.default.createElement("input", inputProps);
   }
 
   watchExpressionHeaderButtons() {
     return [debugBtn(evt => {
       evt.stopPropagation();
       this.props.evaluateExpressions();
     }, "refresh", "refresh", L10N.getStr("watchExpressions.refreshButton"))];
   }
@@ -27415,58 +27510,63 @@ class SecondaryPanes extends _react.Comp
       shouldOpen: isPaused
     };
   }
 
   getWatchItem() {
     return {
       header: L10N.getStr("watchExpressions.header"),
       buttons: this.watchExpressionHeaderButtons(),
-      component: Expressions,
+      component: _Expressions2.default,
       opened: true
     };
   }
 
   getStartItems() {
     var scopesContent = this.props.horizontal ? this.getScopeItem() : null;
     var isPaused = () => !!this.props.pauseData;
 
     var items = [{
       header: L10N.getStr("breakpoints.header"),
       buttons: this.renderBreakpointsToggle(),
-      component: Breakpoints,
+      component: _Breakpoints2.default,
       opened: true
     }, {
       header: L10N.getStr("callStack.header"),
-      component: Frames,
+      component: _Frames2.default,
       opened: _prefs.prefs.callStackVisible,
       onToggle: opened => {
         _prefs.prefs.callStackVisible = opened;
       },
       shouldOpen: isPaused
     }, scopesContent];
 
     if ((0, _devtoolsConfig.isEnabled)("eventListeners")) {
       items.push({
         header: L10N.getStr("eventListenersHeader"),
-        component: EventListeners
+        component: _EventListeners2.default
+      });
+    }
+
+    if ((0, _devtoolsConfig.isEnabled)("workers")) {
+      items.push({
+        header: L10N.getStr("workersHeader"),
+        component: _Workers2.default
       });
     }
 
     if (this.props.horizontal) {
       items.unshift(this.getWatchItem());
     }
 
     return items.filter(item => item);
   }
 
   renderHorizontalLayout() {
-    return Accordion({
-      items: this.getItems()
-    });
+    return _react2.default.createElement(_Accordion2.default, { items: this.getItems() });
   }
 
   getEndItems() {
     var items = [];
 
     if (!this.props.horizontal) {
       items.unshift(this.getScopeItem());
     }
@@ -27478,31 +27578,34 @@ class SecondaryPanes extends _react.Comp
     return items;
   }
 
   getItems() {
     return [].concat(_toConsumableArray(this.getStartItems()), _toConsumableArray(this.getEndItems()));
   }
 
   renderVerticalLayout() {
-    return SplitBox({
+    return _react2.default.createElement(_devtoolsSplitter2.default, {
       style: { width: "100vw" },
       initialSize: "300px",
       minSize: 10,
       maxSize: "50%",
       splitterSize: 1,
-      startPanel: Accordion({ items: this.getStartItems() }),
-      endPanel: Accordion({ items: this.getEndItems() })
-    });
-  }
-
-  render() {
-    return _react.DOM.div({
-      className: "secondary-panes secondary-panes--sticky-commandbar"
-    }, CommandBar(), this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout());
+      startPanel: _react2.default.createElement(_Accordion2.default, { items: this.getStartItems() }),
+      endPanel: _react2.default.createElement(_Accordion2.default, { items: this.getEndItems() })
+    });
+  }
+
+  render() {
+    return _react2.default.createElement(
+      "div",
+      { className: "secondary-panes secondary-panes--sticky-commandbar" },
+      _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
+      this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
+    );
   }
 }
 
 SecondaryPanes.propTypes = {
   evaluateExpressions: _react.PropTypes.func.isRequired,
   pauseData: _react.PropTypes.object,
   horizontal: _react.PropTypes.bool,
   breakpoints: _reactImmutableProptypes2.default.map.isRequired,
@@ -27550,17 +27653,17 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(721);
+__webpack_require__(908);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getValue(expression) {
   var value = expression.value;
   if (!value) {
     return {
       path: expression.from,
@@ -27779,63 +27882,40 @@ class Expressions extends _react.PureCom
     );
   }
 }
 
 Expressions.displayName = "Expressions";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
-  expressions: (0, _selectors.getVisibleExpressions)(state),
+  expressions: (0, _selectors.getExpressions)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Expressions);
 
 /***/ }),
-/* 720 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 721 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 722 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 723 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 724 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 720 */,
+/* 721 */,
+/* 722 */,
+/* 723 */,
+/* 724 */,
 /* 725 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _reactRedux = __webpack_require__(151);
 
 var _reselect = __webpack_require__(993);
 
@@ -27860,42 +27940,51 @@ 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__(720);
+__webpack_require__(907);
 
 var _lodash = __webpack_require__(2);
 
-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; } }
 
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
 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 renderSourceLocation(source, line, column) {
   var filename = source ? (0, _source.getFilename)(source.toJS()) : null;
   var isWasm = source && source.get("isWasm");
   var columnVal = (0, _devtoolsConfig.isEnabled)("columnBreakpoints") && column ? `:${column}` : "";
   var bpLocation = isWasm ? `0x${line.toString(16).toUpperCase()}` : `${line}${columnVal}`;
 
-  return filename ? _react.DOM.div({ className: "location" }, `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`) : null;
-}
+  if (!filename) {
+    return null;
+  }
+
+  return _react2.default.createElement(
+    "div",
+    { className: "location" },
+    `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`
+  );
+}
+renderSourceLocation.displayName = "SourceLocation";
 
 class Breakpoints extends _react.PureComponent {
 
   shouldComponentUpdate(nextProps, nextState) {
     var breakpoints = this.props.breakpoints;
 
     return breakpoints !== nextProps.breakpoints;
   }
@@ -28053,47 +28142,77 @@ class Breakpoints extends _react.PureCom
   renderBreakpoint(breakpoint) {
     var snippet = breakpoint.text || "";
     var locationId = breakpoint.locationId;
     var line = breakpoint.location.line;
     var column = breakpoint.location.column;
     var isCurrentlyPaused = breakpoint.isCurrentlyPaused;
     var isDisabled = breakpoint.disabled;
     var isConditional = !!breakpoint.condition;
-
-    return _react.DOM.div({
-      className: (0, _classnames2.default)({
-        breakpoint,
-        paused: isCurrentlyPaused,
-        disabled: isDisabled,
-        "is-conditional": isConditional
+    var isHidden = breakpoint.hidden;
+
+    if (isHidden) {
+      return;
+    }
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)({
+          breakpoint,
+          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()
       }),
-      key: locationId,
-      onClick: () => this.selectBreakpoint(breakpoint),
-      onContextMenu: e => this.showContextMenu(e, breakpoint)
-    }, _react.DOM.input({
-      type: "checkbox",
-      className: "breakpoint-checkbox",
-      checked: !isDisabled,
-      onChange: () => this.handleCheckbox(breakpoint),
-      // Prevent clicking on the checkbox from triggering the onClick of
-      // the surrounding div
-      onClick: ev => ev.stopPropagation()
-    }), _react.DOM.div({ className: "breakpoint-label", title: breakpoint.text }, _react.DOM.div({}, renderSourceLocation(breakpoint.location.source, line, column))), _react.DOM.div({ className: "breakpoint-snippet" }, snippet), (0, _Close2.default)({
-      handleClick: ev => this.removeBreakpoint(ev, breakpoint),
-      tooltip: L10N.getStr("breakpoints.removeBreakpointTooltip")
-    }));
+      _react2.default.createElement(
+        "div",
+        { className: "breakpoint-label", title: breakpoint.text },
+        _react2.default.createElement(
+          "div",
+          null,
+          renderSourceLocation(breakpoint.location.source, line, column)
+        )
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "breakpoint-snippet" },
+        snippet
+      ),
+      _react2.default.createElement(_Close2.default, {
+        handleClick: ev => this.removeBreakpoint(ev, breakpoint),
+        tooltip: L10N.getStr("breakpoints.removeBreakpointTooltip")
+      })
+    );
   }
 
   render() {
     var breakpoints = this.props.breakpoints;
 
-    return _react.DOM.div({ className: "pane breakpoints-list" }, breakpoints.size === 0 ? _react.DOM.div({ className: "pane-info" }, L10N.getStr("breakpoints.none")) : breakpoints.valueSeq().map(bp => {
-      return this.renderBreakpoint(bp);
-    }));
+    var children = breakpoints.size === 0 ? _react2.default.createElement(
+      "div",
+      { className: "pane-info" },
+      L10N.getStr("breakpoints.none")
+    ) : breakpoints.valueSeq().map(bp => this.renderBreakpoint(bp));
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane breakpoints-list" },
+      children
+    );
   }
 }
 
 Breakpoints.displayName = "Breakpoints";
 
 function updateLocation(sources, pause, bp) {
   var source = (0, _selectors.getSourceInSources)(sources, bp.location.sourceId);
   var isCurrentlyPaused = isCurrentlyPausedAtBreakpoint(pause, bp);
@@ -28109,28 +28228,18 @@ function updateLocation(sources, pause, 
   return localBP;
 }
 
 var _getBreakpoints = (0, _reselect.createSelector)(_selectors.getBreakpoints, _selectors.getSources, _selectors.getPause, (breakpoints, sources, pause) => breakpoints.map(bp => updateLocation(sources, pause, bp)).filter(bp => bp.location.source && !bp.location.source.get("isBlackBoxed")));
 
 exports.default = (0, _reactRedux.connect)((state, props) => ({ breakpoints: _getBreakpoints(state) }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Breakpoints);
 
 /***/ }),
-/* 726 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 727 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 726 */,
+/* 727 */,
 /* 728 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28155,29 +28264,23 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(679);
-
-var _ManagedTree2 = __webpack_require__(419);
-
-var _ManagedTree3 = _interopRequireDefault(_ManagedTree2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ManagedTree = (0, _react.createFactory)(_ManagedTree3.default);
-
-function info(text) {
-  return _react.DOM.div({ className: "pane-info" }, text);
-}
+var _ManagedTree = __webpack_require__(419);
+
+var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
+
+__webpack_require__(850);
+
+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";
 }
 
 function nodeIsPrimitive(item) {}
 
@@ -28233,33 +28336,53 @@ class Scopes extends _react.Component {
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
     var notEnumberable = false;
     var objectValue = "";
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("node object-node", {
-        focused: false,
-        "not-enumerable": notEnumberable
+    return React.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("node object-node", {
+          focused: false,
+          "not-enumerable": notEnumberable
+        }),
+        style: { marginLeft: depth * 15 },
+        key: item.path,
+        onClick: e => {
+          e.stopPropagation();
+          setExpanded(item, !expanded);
+        }
+      },
+      React.createElement(_Svg2.default, {
+        name: "arrow",
+        className: (0, _classnames2.default)({
+          expanded,
+          hidden: nodeIsPrimitive(item)
+        })
       }),
-      style: { marginLeft: depth * 15 },
-      key: item.path,
-      onClick: e => {
-        e.stopPropagation();
-        setExpanded(item, !expanded);
-      }
-    }, (0, _Svg2.default)("arrow", {
-      className: (0, _classnames2.default)({
-        expanded: expanded,
-        hidden: nodeIsPrimitive(item)
-      })
-    }), _react.DOM.span({ className: "object-label" }, item.name), _react.DOM.span({ className: "object-delimiter" }, objectValue ? ": " : ""), _react.DOM.span({ className: "object-value" }, objectValue || ""));
+      React.createElement(
+        "span",
+        { className: "object-label" },
+        item.name
+      ),
+      React.createElement(
+        "span",
+        { className: "object-delimiter" },
+        objectValue ? ": " : ""
+      ),
+      React.createElement(
+        "span",
+        { className: "object-value" },
+        objectValue || ""
+      )
+    );
   }
 
   getObjectProperties(item) {
     this.props.loadedObjects[item.contents.value.objectId];
   }
 
   getChildren(item) {
     var obj = item.contents;
@@ -28314,34 +28437,46 @@ class Scopes extends _react.Component {
     });
   }
 
   render() {
     var pauseInfo = this.props.pauseInfo;
 
 
     if (!pauseInfo) {
-      return _react.DOM.div({ className: "pane scopes-list" }, info(L10N.getStr("scopes.notPaused")));
+      return React.createElement(
+        "div",
+        { className: (0, _classnames2.default)("pane", "scopes-list") },
+        React.createElement(
+          "div",
+          { className: "pane-info" },
+          L10N.getStr("scopes.notPaused")
+        )
+      );
     }
 
     var roots = this.getRoots();
 
-    return _react.DOM.div({ className: "pane scopes-list" }, ManagedTree({
-      itemHeight: 20,
-      getParent: item => null,
-      getChildren: this.getChildren,
-      getRoots: () => roots,
-      getPath: item => item.path,
-      autoExpand: 0,
-      autoExpandDepth: 1,
-      autoExpandAll: false,
-      disabledFocus: true,
-      onExpand: this.onExpand,
-      renderItem: this.renderItem
-    }));
+    return React.createElement(
+      "div",
+      { className: (0, _classnames2.default)("pane", "scopes-list") },
+      React.createElement(_ManagedTree2.default, {
+        itemHeight: 20,
+        getParent: item => null,
+        getChildren: this.getChildren,
+        getRoots: () => roots,
+        getPath: item => item.path,
+        autoExpand: 0,
+        autoExpandDepth: 1,
+        autoExpandAll: false,
+        disabledFocus: true,
+        onExpand: this.onExpand,
+        renderItem: this.renderItem
+      })
+    );
   }
 }
 
 Scopes.propTypes = {
   scopes: _react.PropTypes.array,
   loadedObjects: _reactImmutableProptypes2.default.map,
   loadObjectProperties: _react.PropTypes.func,
   pauseInfo: _react.PropTypes.object
@@ -28351,28 +28486,18 @@ Scopes.displayName = "Scopes";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state),
   scopes: (0, _selectors.getChromeScopes)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Scopes);
 
 /***/ }),
-/* 729 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 730 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 729 */,
+/* 730 */,
 /* 731 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28391,17 +28516,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__(679);
+__webpack_require__(850);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Scopes extends _react.PureComponent {
 
   constructor(props) {
     var pauseInfo = props.pauseInfo,
         selectedFrame = props.selectedFrame,
@@ -28635,34 +28760,19 @@ function getScopes(pauseInfo, selectedFr
     }
     scopeIndex++;
   } while (scope = scope.parent); // eslint-disable-line no-cond-assign
 
   return scopes;
 }
 
 /***/ }),
-/* 733 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 734 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 735 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 733 */,
+/* 734 */,
+/* 735 */,
 /* 736 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28681,17 +28791,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__(726);
+__webpack_require__(915);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EventListeners extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -28779,28 +28889,18 @@ exports.default = (0, _reactRedux.connec
       line: l.line
     })
   }));
 
   return { listeners };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EventListeners);
 
 /***/ }),
-/* 737 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 738 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
+/* 737 */,
+/* 738 */,
 /* 739 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -28809,17 +28909,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__(727);
+__webpack_require__(917);
 
 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) {
@@ -28872,17 +28972,17 @@ class Accordion extends _react.Component
     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) },
-        (0, _Svg2.default)("arrow", { className: opened[i] ? "expanded" : "" }),
+        _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(
@@ -28943,17 +29043,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__(729);
+__webpack_require__(918);
 
 var _devtoolsModules = __webpack_require__(830);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var appinfo = _devtoolsModules.Services.appinfo;
 
 
@@ -29013,17 +29113,17 @@ function debugBtn(onClick, type, classNa
     "aria-label": tooltip,
     title: tooltip,
     disabled
   };
 
   return _react2.default.createElement(
     "button",
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
-    (0, _Svg2.default)(type)
+    _react2.default.createElement(_Svg2.default, { name: type })
   );
 }
 
 debugBtn.displayName = "CommandBarButton";
 
 class CommandBar extends _react.Component {
 
   componentWillUnmount() {
@@ -29101,17 +29201,21 @@ class CommandBar extends _react.Componen
     }
 
     return debugBtn(() => pauseOnExceptions(false, false), "pause-exceptions", "all enabled", L10N.getStr("pauseOnExceptions"));
   }
 
   render() {
     return _react2.default.createElement(
       "div",
-      { className: "command-bar" },
+      {
+        className: (0, _classnames2.default)("command-bar", {
+          vertical: !this.props.horizontal
+        })
+      },
       this.renderPauseButton(),
       this.renderStepButtons(),
       this.renderPauseOnExceptions()
     );
   }
 }
 
 CommandBar.contextTypes = {
@@ -29159,19 +29263,22 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _text = __webpack_require__(389);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(733);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+__webpack_require__(922);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _require = __webpack_require__(828),
+    isEnabled = _require.isEnabled;
 
 class WelcomeBox extends _react.Component {
 
   renderToggleButton() {
     var _props = this.props,
         horizontal = _props.horizontal,
         endPanelCollapsed = _props.endPanelCollapsed,
         togglePaneCollapse = _props.togglePaneCollapse;
@@ -29184,23 +29291,55 @@ class WelcomeBox extends _react.Componen
       position: "end",
       collapsed: !endPanelCollapsed,
       horizontal: horizontal,
       handleClick: togglePaneCollapse
     });
   }
 
   render() {
-    var searchLabel = L10N.getFormatStr("welcome.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2")));
+    var keyCombinationOne = (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"));
+
+    var keyCombinationTwo = (0, _text.formatKeyShortcut)(L10N.getStr("projectTextSearch.key"));
+
+    var searchSourcesLabel = L10N.getStr("welcome.search").substring(2);
+    var searchProjectLabel = L10N.getStr("welcome.findInFiles").substring(2);
+
+    var searchProjectLabelComp = _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(
+        "b",
+        null,
+        keyCombinationTwo
+      ),
+      searchProjectLabel
+    );
+
+    var searchSourcesLabelComp = _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(
+        "b",
+        null,
+        keyCombinationOne
+      ),
+      searchSourcesLabel
+    );
 
     return _react2.default.createElement(
       "div",
       { className: "welcomebox" },
-      searchLabel,
-      this.renderToggleButton()
+      _react2.default.createElement(
+        "div",
+        { className: "alignlabel" },
+        searchSourcesLabelComp,
+        isEnabled("searchNav") ? searchProjectLabelComp : null,
+        this.renderToggleButton()
+      )
     );
   }
 }
 
 WelcomeBox.displayName = "WelcomeBox";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
@@ -29254,17 +29393,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__(734);
+__webpack_require__(923);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 var _Dropdown = __webpack_require__(751);
 
 var _Dropdown2 = _interopRequireDefault(_Dropdown);
@@ -29639,17 +29778,17 @@ class SourceTabs extends _react.PureComp
 
     return _react2.default.createElement(
       "div",
       {
         className: "new-tab-btn",
         onClick: onButtonClick,
         title: newTabTooltip
       },
-      (0, _Svg2.default)("plus")
+      _react2.default.createElement(_Svg2.default, { name: "plus" })
     );
   }
 
   renderDropdown() {
     var hiddenSourceTabs = this.state.hiddenSourceTabs;
     if (!hiddenSourceTabs || hiddenSourceTabs.size == 0) {
       return null;
     }
@@ -29683,20 +29822,20 @@ class SourceTabs extends _react.PureComp
       horizontal: this.props.horizontal
     });
   }
 
   getSourceAnnotation(source) {
     var sourceObj = source.toJS();
 
     if ((0, _source.isPretty)(sourceObj)) {
-      return (0, _Svg2.default)("prettyPrint");
+      return _react2.default.createElement(_Svg2.default, { name: "prettyPrint" });
     }
     if (sourceObj.isBlackBoxed) {
-      return (0, _Svg2.default)("blackBox");
+      return _react2.default.createElement(_Svg2.default, { name: "blackBox" });
     }
   }
 
   render() {
     return _react2.default.createElement(
       "div",
       { className: "source-header" },
       this.renderStartPanelToggleButton(),
@@ -29730,17 +29869,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(735);
+__webpack_require__(935);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Dropdown extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = {
@@ -29959,30 +30098,610 @@ function sortTree(tree) {
     }
     return previousNode.name.localeCompare(currentNode.name);
   });
 }
 
 /***/ }),
 /* 795 */,
 /* 796 */,
-/* 797 */,
-/* 798 */,
+/* 797 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getGeneratedLocation = undefined;
+
+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 getGeneratedLocation = exports.getGeneratedLocation = (() => {
+  var _ref = _asyncToGenerator(function* (state, source, location, sourceMaps) {
+    if (!sourceMaps.isOriginalId(location.sourceId)) {
+      return location;
+    }
+
+    var generatedLocation = yield sourceMaps.getGeneratedLocation(location, source);
+    var generatedSource = (0, _selectors.getSource)(state, generatedLocation.sourceId);
+    var sourceUrl = generatedSource.get("url");
+    return _extends({}, generatedLocation, { sourceUrl });
+  });
+
+  return function getGeneratedLocation(_x, _x2, _x3, _x4) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var _selectors = __webpack_require__(242);
+
+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"); }); }; }
+
+/***/ }),
+/* 798 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _lodash = __webpack_require__(2);
+
+var _frame = __webpack_require__(1014);
+
+__webpack_require__(872);
+
+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);
+}
+
+class PreviewFunction extends _react.Component {
+  renderFunctionName(func) {
+    var name = getFunctionName(func);
+    return _react2.default.createElement(
+      "span",
+      { className: "function-name" },
+      name
+    );
+  }
+
+  renderParams(func) {
+    var _func$parameterNames = func.parameterNames,
+        parameterNames = _func$parameterNames === undefined ? [] : _func$parameterNames;
+
+    var params = parameterNames.filter(i => i).map(param => _react2.default.createElement(
+      "span",
+      { className: "param", key: param },
+      param
+    ));
+
+    var commas = (0, _lodash.times)(params.length - 1).map((_, i) => _react2.default.createElement(
+      "span",
+      { className: "delimiter", key: i },
+      ", "
+    ));
+
+    return (0, _lodash.flatten)((0, _lodash.zip)(params, commas));
+  }
+
+  render() {
+    return _react2.default.createElement(
+      "span",
+      { className: "function-signature" },
+      this.renderFunctionName(this.props.func),
+      _react2.default.createElement(
+        "span",
+        { className: "paren" },
+        "("
+      ),
+      this.renderParams(this.props.func),
+      _react2.default.createElement(
+        "span",
+        { className: "paren" },
+        ")"
+      )
+    );
+  }
+}
+
+exports.default = PreviewFunction;
+PreviewFunction.displayName = "PreviewFunction";
+
+/***/ }),
 /* 799 */,
 /* 800 */,
 /* 801 */,
 /* 802 */,
 /* 803 */,
-/* 804 */,
-/* 805 */,
-/* 806 */,
+/* 804 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.findScopeByName = exports.getASTLocation = undefined;
+
+var getASTLocation = exports.getASTLocation = (() => {
+  var _ref = _asyncToGenerator(function* (source, location) {
+    var symbols = yield (0, _parser.getSymbols)(source);
+    var functions = [].concat(_toConsumableArray(symbols.functions), _toConsumableArray(symbols.memberExpressions));
+
+    var scope = findClosestScope(functions, location);
+    if (scope) {
+      var line = location.line - scope.location.start.line;
+      var column = location.column;
+      return { name: scope.name, offset: { line, column } };
+    }
+    return { name: undefined, offset: location };
+  });
+
+  return function getASTLocation(_x, _x2) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var findScopeByName = exports.findScopeByName = (() => {
+  var _ref2 = _asyncToGenerator(function* (source, name) {
+    var symbols = yield (0, _parser.getSymbols)(source);
+    var functions = symbols.functions;
+
+    return functions.find(function (node) {
+      return node.name === name;
+    });
+  });
+
+  return function findScopeByName(_x3, _x4) {
+    return _ref2.apply(this, arguments);
+  };
+})();
+
+var _parser = __webpack_require__(827);
+
+var _contains = __webpack_require__(1127);
+
+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 findClosestScope(functions, location) {
+  return functions.reduce((found, currNode) => {
+    if (currNode.name === "anonymous" || !(0, _contains.containsPosition)(currNode.location, location)) {
+      return found;
+    }
+
+    if (!found) {
+      return currNode;
+    }
+
+    if (found.location.start.line > currNode.location.start.line || found.location.start.column > currNode.location.start.column) {
+      return found;
+    }
+
+    return currNode;
+  }, null);
+}
+
+/***/ }),
+/* 805 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = isSelectedFrameVisible;
+
+var _pause = __webpack_require__(239);
+
+var _sources = __webpack_require__(232);
+
+/*
+ * Checks to if the selected frame's source is currently
+ * selected.
+ */
+function isSelectedFrameVisible(state) {
+  var selectedLocation = (0, _sources.getSelectedLocation)(state);
+  var selectedFrame = (0, _pause.getSelectedFrame)(state);
+
+  return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
+}
+
+/***/ }),
+/* 806 */
+/***/ (function(module, exports) {
+
+module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 256 256\"><defs><style>.cls-1{isolation:isolate;}.cls-17,.cls-2,.cls-25{fill:none;}.cls-17,.cls-2{stroke-miterlimit:10;}.cls-2{stroke-width:0.75px;stroke:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:#f15a24;}.cls-5{fill:#ed1c24;}.cls-6{fill:#c1272d;}.cls-7{fill:url(#linear-gradient-3);}.cls-8{fill:url(#linear-gradient-4);}.cls-9{fill:url(#linear-gradient-5);}.cls-10{fill:url(#linear-gradient-6);}.cls-11{opacity:0.49;fill:url(#linear-gradient-7);}.cls-12{fill:url(#linear-gradient-8);}.cls-13{fill:#2db5f9;}.cls-13,.cls-14{mix-blend-mode:screen;}.cls-14{fill:#5fd2ff;}.cls-15{fill:#219058;}.cls-16{fill:url(#linear-gradient-9);}.cls-17{stroke:#fff;stroke-width:1.87px;}.cls-18{fill:#f7b852;}.cls-19{fill:#ff8431;}.cls-20{fill:#fffb69;}.cls-21{fill:#44c688;}.cls-22{fill:#29b36e;}.cls-23{fill:#6fd191;}.cls-24{fill:#c83ad7;}.cls-26{fill:#fba9ff;}.cls-27{fill:#ff737d;}.cls-28{fill:#fdc666;}</style><linearGradient id=\"linear-gradient\" x1=\"67.45\" y1=\"154.72\" x2=\"67.29\" y2=\"155.43\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ff1d25\" stop-opacity=\"0.5\"></stop><stop offset=\"0.06\" stop-color=\"#ff1d25\" stop-opacity=\"0.54\"></stop><stop offset=\"0.37\" stop-color=\"#ff1d25\" stop-opacity=\"0.74\"></stop><stop offset=\"0.64\" stop-color=\"#ff1d25\" stop-opacity=\"0.88\"></stop><stop offset=\"0.86\" stop-color=\"#ff1d25\" stop-opacity=\"0.97\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient><linearGradient id=\"linear-gradient-2\" x1=\"73.09\" y1=\"170.74\" x2=\"73.09\" y2=\"153.5\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ffdd42\"></stop><stop offset=\"1\" stop-color=\"#fb784b\"></stop></linearGradient><linearGradient id=\"linear-gradient-3\" x1=\"201.52\" y1=\"95.13\" x2=\"207.88\" y2=\"89.89\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#5bcb99\"></stop><stop offset=\"1\" stop-color=\"#85a8e8\"></stop></linearGradient><linearGradient id=\"linear-gradient-4\" x1=\"81.17\" y1=\"158.3\" x2=\"279.32\" y2=\"55.49\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#34e28b\"></stop><stop offset=\"1\"></stop></linearGradient><linearGradient id=\"linear-gradient-5\" x1=\"117.57\" y1=\"178.22\" x2=\"133.15\" y2=\"178.22\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#c297ff\"></stop><stop offset=\"1\" stop-color=\"#ae31bb\"></stop></linearGradient><linearGradient id=\"linear-gradient-6\" x1=\"54.05\" y1=\"253.29\" x2=\"251.08\" y2=\"99.63\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-color=\"#d23de2\"></stop></linearGradient><linearGradient id=\"linear-gradient-7\" x1=\"199.8\" y1=\"86.45\" x2=\"191.83\" y2=\"113.37\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-opacity=\"0\"></stop></linearGradient><linearGradient id=\"linear-gradient-8\" x1=\"126.87\" y1=\"190.63\" x2=\"182.9\" y2=\"204.2\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#2db5f9\"></stop><stop offset=\"1\" stop-color=\"#092432\"></stop></linearGradient><linearGradient id=\"linear-gradient-9\" x1=\"83.08\" y1=\"49.55\" x2=\"46.06\" y2=\"151.24\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"0.21\" stop-color=\"#48080a\"></stop><stop offset=\"0.42\" stop-color=\"#891014\"></stop><stop offset=\"0.61\" stop-color=\"#bc151b\"></stop><stop offset=\"0.78\" stop-color=\"#e01a21\"></stop><stop offset=\"0.91\" stop-color=\"#f71c24\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient></defs><title>dojo_square</title><g class=\"cls-1\"><g id=\"Layer_1\" data-name=\"Layer 1\"><line class=\"cls-2\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-3\" d=\"M42.28,150.4l.52.82A58,58,0,0,0,52,161.49a45.23,45.23,0,0,0,28.74,10.25c.65,0,1.31,0,2,0a67.32,67.32,0,0,0,21.13-5.26,67.38,67.38,0,0,1-9.09.83,36.92,36.92,0,0,1-27.44-12.17A66.82,66.82,0,0,1,42.28,150.4Z\"></path><path class=\"cls-4\" d=\"M80.79,80.88a45.4,45.4,0,0,1,38.89,21.94A37,37,0,0,0,84.43,94.7c8.29,4,19.66,7.08,35.28,8.15,0,0-.77-14.87-19.8-22.64-26.57-10.84-30.33-8.69-37.06-19.9a30.09,30.09,0,0,0,6,22.15A45.45,45.45,0,0,1,80.79,80.88Z\"></path><path class=\"cls-5\" d=\"M99.92,80.21c-9.1-3.71-15.52-5.9-20.3-7.62A33.4,33.4,0,0,0,84.54,81a45.42,45.42,0,0,1,35.13,21.78,36.87,36.87,0,0,0-20.54-9.34,109,109,0,0,0,20,9.32l.59,0S118.94,88,99.92,80.21Z\"></path><path class=\"cls-6\" d=\"M119.69,102.85h.1c.29-1.62,2.07-14.46-12.4-25.7C85.78,60.37,81.56,58.82,80.53,49.94a27.8,27.8,0,0,0-.91,22.65c4.78,1.72,11.21,3.91,20.3,7.62,19,7.77,19.8,22.64,19.8,22.64Z\"></path><path class=\"cls-7\" d=\"M185.28,88.22a33.64,33.64,0,0,1,22.08,8.23,29.8,29.8,0,0,1,19,8S208.22,78,176.19,89a41.72,41.72,0,0,0-8.2,4A33.64,33.64,0,0,1,185.28,88.22Z\"></path><path class=\"cls-8\" d=\"M185.28,88.22A33.62,33.62,0,0,0,168,93l.93-.56c-25.88,15.24-57.6,62.06-101.56,62.65h0a36.92,36.92,0,0,0,27.44,12.17,67.38,67.38,0,0,0,9.09-.83c28.6-11.79,56.09-40,68.55-53.64,11.56-12.67,24.22-17,34.91-16.34A33.64,33.64,0,0,0,185.28,88.22Z\"></path><path class=\"cls-9\" d=\"M118.48,179a20.94,20.94,0,0,0-.92,5.86,22.25,22.25,0,0,0,1,6.74,16.56,16.56,0,0,1,5.5-14.74c0-.17.09-.34.14-.51a20.37,20.37,0,0,1,8.91-11.47l-.08,0a37.84,37.84,0,0,0-4,1.53A20.87,20.87,0,0,0,118.48,179Z\"></path><path class=\"cls-10\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-11\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-12\" d=\"M137.8,201.88a20.44,20.44,0,0,1-13.68-25.12h0l0,.08a16.56,16.56,0,0,0-5.5,14.73,20.94,20.94,0,0,0,33.63,9.38A20.37,20.37,0,0,1,137.8,201.88Z\"></path><path class=\"cls-13\" d=\"M144.91,200.4c2.12-6.17,9-15.7,16.33-11.34,0,0,6,3.36,7.23-6.11,0,0,4.49,22.28-17.1,21.53,0,0,4.86-3.55,4.81-7.2A24.73,24.73,0,0,1,144.91,200.4Z\"></path><path class=\"cls-14\" d=\"M153.52,186.75c2.14-1.09,4.16-2.18,8.08-.44,3,1.35,6.88-3.94,3.56-8.66,0,0,.21,4.88-3.72,4.84A8.81,8.81,0,0,0,153.52,186.75Z\"></path><path class=\"cls-15\" d=\"M175.21,115.88c-5.17,7-12.75,12.95-13.64,14.39s1.5,6.11,5,6.45.82-1.36.52-3,1.06,1,5.27.42-1.53-2.2-1.14-4.33,4.74-6.17,6.47-10.25,4.7,0,3.18,3.18c-.6,1.26,4.81-3.54,2.08-7.21S178.22,111.77,175.21,115.88Z\"></path><path class=\"cls-15\" d=\"M160.47,131.28c-.76.73-3,2.37-3,2.37s2.19,3.05,5,3c0,0,.61-.29-.27-1.18S160.27,131.82,160.47,131.28Z\"></path><path class=\"cls-16\" d=\"M84.43,94.7c-7.35-3.56-12.27-7.88-15.54-12.24A45.42,45.42,0,0,0,42.28,150.4a66.82,66.82,0,0,0,25.09,4.67h0A37,37,0,0,1,84.43,94.7Z\"></path><line class=\"cls-17\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-18\" d=\"M84.52,81c2,2.91,7.81,7.94,14.63,12.44a36.87,36.87,0,0,1,20.52,9.33A45.42,45.42,0,0,0,84.52,81Z\"></path><path class=\"cls-19\" d=\"M84.52,81c-1.23-.1-2.48-.16-3.74-.16a45.45,45.45,0,0,0-11.89,1.58c3.27,4.36,8.19,8.67,15.54,12.24a36.72,36.72,0,0,1,14.72-1.22C92.33,89,86.54,83.95,84.52,81Z\"></path><path class=\"cls-20\" d=\"M109.73,91.38a33.29,33.29,0,0,0-12.21-7.29C100.46,89.66,103,91.38,109.73,91.38Z\"></path><path class=\"cls-6\" d=\"M96.89,67.66a63.16,63.16,0,0,1,6.54,4.58c.52.39-.93-3.55-2.62-4.3A7.5,7.5,0,0,0,96.89,67.66Z\"></path><path class=\"cls-6\" d=\"M105,73.37a70.75,70.75,0,0,1,6.5,4.64c.53.38-.9-3.56-2.57-4.33A7.5,7.5,0,0,0,105,73.37Z\"></path><path class=\"cls-6\" d=\"M112.55,79a19.59,19.59,0,0,1,3.52,4.39c.26.38.07-2.58-.92-3.42A5.28,5.28,0,0,0,112.55,79Z\"></path><path class=\"cls-21\" d=\"M77.55,151c-.2-.65,2.35-1.48,3-1.51a11.91,11.91,0,0,1,3.57,1.19,16.34,16.34,0,0,1-4.89,1A4.46,4.46,0,0,1,77.55,151Z\"></path><path class=\"cls-21\" d=\"M86.73,148.78c-.22-.51,1.75-1.38,2.29-1.46a9.58,9.58,0,0,1,3,.65,13.15,13.15,0,0,1-3.83,1.23A3.59,3.59,0,0,1,86.73,148.78Z\"></path><path class=\"cls-21\" d=\"M94.41,146c-.22-.4,1.32-1.29,1.76-1.41a7.92,7.92,0,0,1,2.48.27,10.87,10.87,0,0,1-3,1.35A3,3,0,0,1,94.41,146Z\"></path><path class=\"cls-21\" d=\"M100.52,143.19c-.23-.35,1.11-1.27,1.5-1.41a7.25,7.25,0,0,1,2.29.07,10,10,0,0,1-2.67,1.45A2.72,2.72,0,0,1,100.52,143.19Z\"></path><path class=\"cls-21\" d=\"M106.23,140.07c-.22-.29.9-1.16,1.24-1.3a6.31,6.31,0,0,1,2,0,8.66,8.66,0,0,1-2.25,1.39A2.36,2.36,0,0,1,106.23,140.07Z\"></path><path class=\"cls-21\" d=\"M68.34,151.69c-.11-.73,2.73-1.16,3.46-1.09a12.76,12.76,0,0,1,3.57,1.86,17.51,17.51,0,0,1-5.35.26A4.78,4.78,0,0,1,68.34,151.69Z\"></path><path class=\"cls-6\" d=\"M70.08,65.82c2,2.27,6.68,3.74,6.68,3.74A19,19,0,0,1,75.83,62c0-.18-5.75-.09-6.73-4.81C68.91,56.23,68.1,63.55,70.08,65.82Z\"></path><path class=\"cls-4\" d=\"M50.54,174.68a5.49,5.49,0,0,1,2.24-3.88l.19-.11a14,14,0,0,0-1.43-.25c-6.85-1-8.59,3.06-8.95,7.64,0,.26,0,.53,0,.78a8.31,8.31,0,0,1,7.89-4.2Z\"></path><path class=\"cls-4\" d=\"M58.88,173.19c-6.81-4.13-10.63-4.43-12.15,7.14,0,0,7.17-5.67,10.55-1.92,3.68,4.07,8.68.32,6.05-2.06A18.77,18.77,0,0,0,58.88,173.19Z\"></path><path class=\"cls-4\" d=\"M56.06,174.53c-3.86,2.57-3.86,8.62-3.86,8.62s7-3.81,6.5-6.19A2.93,2.93,0,0,0,56.06,174.53Z\"></path><path class=\"cls-4\" d=\"M24,127a5.49,5.49,0,0,1,4.43-.68l.2.08a14,14,0,0,0-.7-1.27c-3.49-6-7.76-4.79-11.56-2.21-.22.15-.43.31-.63.47a8.31,8.31,0,0,1,8.21,3.53Z\"></path><path class=\"cls-4\" d=\"M31.29,134.08c-2.48-9.82-4.47-13.62-14-6.83,0,0,8.13-2.34,9.06,9.22.44,5.47,5.69,6.57,5.63,3A18.77,18.77,0,0,0,31.29,134.08Z\"></path><path class=\"cls-4\" d=\"M27.83,128.82c-4.52-1.07-8.94,3.06-8.94,3.06s6.94-.24,7.78,4C27.14,138.23,27.83,128.82,27.83,128.82Z\"></path><path class=\"cls-22\" d=\"M172.45,112.79a55.39,55.39,0,0,1,15.49-12.5c5.64-3,13.66-4.84,18.5-4.61l1.85,1.59-1-.08a37.75,37.75,0,0,0-19,3.76A55,55,0,0,0,172.45,112.79Z\"></path><path class=\"cls-23\" d=\"M207.12,95.74a34.5,34.5,0,0,1,10.45,2.68,27.42,27.42,0,0,1,8.81,6,27.05,27.05,0,0,0-9.09-5.29,43.65,43.65,0,0,0-9-1.84l-1.84-1.59Z\"></path><path class=\"cls-24\" d=\"M124.52,175.47a27.43,27.43,0,0,1,3.11-1.9,25.35,25.35,0,0,1,2.31-1c.78-.34,1.58-.58,2.38-.84a45.63,45.63,0,0,1,9.84-1.81,95.67,95.67,0,0,1,19.84.78,194.33,194.33,0,0,0,19.66,1.89,66.25,66.25,0,0,0,19.6-1.93,66.44,66.44,0,0,1-19.6,2.3,194.82,194.82,0,0,1-19.75-1.52,94.77,94.77,0,0,0-19.65-.41,44.43,44.43,0,0,0-9.55,1.94c-.76.27-1.53.52-2.27.85a24,24,0,0,0-2.18,1,21.38,21.38,0,0,0-3.93,2.7l-.53.47A18.42,18.42,0,0,1,124.52,175.47Z\"></path><line class=\"cls-25\" x1=\"124.09\" y1=\"176.84\" x2=\"124.09\" y2=\"176.84\"></line><path class=\"cls-6\" d=\"M85.66,97.64c-6.36,1.4-5.37,6.45-5.37,6.45s2-2.43,13.09-3.74A52.36,52.36,0,0,1,85.66,97.64Z\"></path><path class=\"cls-26\" d=\"M118.59,191.58a16.4,16.4,0,0,1-.08-4.24,18.64,18.64,0,0,1,.91-4.18,18.86,18.86,0,0,1,1.87-3.9,19.81,19.81,0,0,1,2.78-3.38l.46-.42s-.63,2-.7,2.51a19.27,19.27,0,0,0-1.61,1.93,17.84,17.84,0,0,0-3.33,7.5A16.22,16.22,0,0,0,118.59,191.58Z\"></path><path class=\"cls-27\" d=\"M65.89,155.08c-3.61-4-6.65-10.29-7.95-16.2a36.79,36.79,0,0,1-.82-9.49l.14-2.38.33-2.36a23,23,0,0,1,.47-2.33,19.65,19.65,0,0,1,.6-2.3,35.6,35.6,0,0,1,3.83-8.64,39.45,39.45,0,0,1,2.68-3.89l1.53-1.8c.51-.6,1.1-1.13,1.64-1.69a37.2,37.2,0,0,1,7.47-5.68,39.82,39.82,0,0,1,8.62-3.62A39.67,39.67,0,0,0,76,98.56a36.78,36.78,0,0,0-7.22,5.83c-.52.57-1.08,1.11-1.56,1.71l-1.45,1.81a38.67,38.67,0,0,0-2.51,3.89,34.62,34.62,0,0,0-3.48,8.52,18.77,18.77,0,0,0-.52,2.24,21.9,21.9,0,0,0-.38,2.27l-.25,2.28-.06,2.3a35.25,35.25,0,0,0,1.06,9.07,36.17,36.17,0,0,0,8.62,15.83l.66.71S66.44,155.12,65.89,155.08Z\"></path><path class=\"cls-28\" d=\"M103.89,166.42A47.14,47.14,0,0,1,94,167.55,37.09,37.09,0,0,1,84,165.91,46.7,46.7,0,0,1,74.71,162a34.57,34.57,0,0,1-8.12-6.17l-.69-.74s2.38,0,3-.06a33.57,33.57,0,0,0,6.72,5.5,45.26,45.26,0,0,0,8.82,4.27A36.2,36.2,0,0,0,94,166.91,47.78,47.78,0,0,0,103.89,166.42Z\"></path></g></g></svg>"
+
+/***/ }),
 /* 807 */,
 /* 808 */,
-/* 809 */,
-/* 810 */,
+/* 809 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(151);
+
+var _debounce = __webpack_require__(651);
+
+var _debounce2 = _interopRequireDefault(_debounce);
+
+var _Popup = __webpack_require__(810);
+
+var _Popup2 = _interopRequireDefault(_Popup);
+
+var _selectors = __webpack_require__(242);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _editor = __webpack_require__(257);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class Preview extends _react.PureComponent {
+
+  constructor() {
+    super();
+
+    var self = this;
+    self.onScroll = this.onScroll.bind(this);
+    self.onMouseOver = (0, _debounce2.default)(this.onMouseOver, 40);
+  }
+
+  componentDidMount() {
+    var codeMirror = this.props.editor.codeMirror;
+
+    var codeMirrorWrapper = codeMirror.getWrapperElement();
+
+    codeMirror.on("scroll", this.onScroll);
+    codeMirrorWrapper.addEventListener("mouseover", e => this.onMouseOver(e));
+    codeMirrorWrapper.addEventListener("mouseup", e => this.onMouseUp(e));
+    codeMirrorWrapper.addEventListener("mousedown", e => this.onMouseDown(e));
+  }
+
+  onMouseOver(e) {
+    var target = e.target;
+
+    if (this.props.selectedFrameVisible) {
+      (0, _editor.updatePreview)(target, this.props.editor, this.props);
+    }
+  }
+
+  onMouseUp() {
+    this.currentlySelecting = false;
+  }
+
+  onMouseDown() {
+    this.currentlySelecting = true;
+  }
+
+  onScroll() {
+    this.props.clearPreview();
+  }
+
+  onClose(e) {
+    this.props.clearPreview();
+  }
+
+  render() {
+    var _props = this.props,
+        selectedSource = _props.selectedSource,
+        preview = _props.preview;
+
+
+    if (!this.props.editor || !selectedSource || this.currentlySelecting) {
+      return null;
+    }
+
+    if (!preview || preview.updating) {
+      return null;
+    }
+
+    var result = preview.result,
+        expression = preview.expression,
+        location = preview.location,
+        cursorPos = preview.cursorPos;
+
+    var value = result;
+    if (typeof value == "undefined" || value.optimizedOut) {
+      return null;
+    }
+
+    var editorRange = (0, _editor.toEditorRange)(selectedSource.get("id"), location);
+
+    return _react2.default.createElement(_Popup2.default, {
+      value: value,
+      editor: this.props.editor,
+      range: editorRange,
+      expression: expression,
+      popoverPos: cursorPos,
+      onClose: e => this.onClose(e)
+    });
+  }
+}
+
+Preview.displayName = "Preview";
+
+exports.default = (0, _reactRedux.connect)(state => ({
+  preview: (0, _selectors.getPreview)(state),
+  selectedSource: (0, _selectors.getSelectedSource)(state),
+  linesInScope: (0, _selectors.getInScopeLines)(state),
+  selectedFrameVisible: (0, _selectors.isSelectedFrameVisible)(state)
+}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Preview);
+
+/***/ }),
+/* 810 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Popup = undefined;
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _reactRedux = __webpack_require__(151);
+
+var _redux = __webpack_require__(3);
+
+var _devtoolsConfig = __webpack_require__(828);
+
+var _devtoolsReps = __webpack_require__(924);
+
+var _devtoolsReps2 = _interopRequireDefault(_devtoolsReps);
+
+var _actions = __webpack_require__(244);
+
+var _actions2 = _interopRequireDefault(_actions);
+
+var _selectors = __webpack_require__(242);
+
+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);
+
+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;
+class Popup extends _react.Component {
+
+  componentDidMount() {
+    var _props = this.props,
+        loadObjectProperties = _props.loadObjectProperties,
+        loadedObjects = _props.loadedObjects,
+        value = _props.value,
+        editor = _props.editor,
+        range = _props.range;
+
+
+    this.marker = (0, _editor.markText)(editor, "preview-selection", range);
+
+    if (!value || !value.type == "object") {
+      return;
+    }
+
+    if (value.actor && !loadedObjects[value.actor]) {
+      loadObjectProperties(value);
+    }
+  }
+
+  componentWillUnmount() {
+    if (this.marker) {
+      this.marker.clear();
+    }
+  }
+
+  getChildren(root, getObjectProperties) {
+    var actors = {};
+
+    var children = getChildren({
+      getObjectProperties,
+      actors,
+      item: root
+    });
+
+    if (children.length > 0) {
+      return children;
+    }
+
+    return null;
+  }
+
+  renderFunctionPreview(value, root) {
+    var selectSourceURL = this.props.selectSourceURL;
+    var location = value.location;
+
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: "preview-popup",
+        onClick: () => selectSourceURL(location.url, { line: location.line })
+      },
+      _react2.default.createElement(_PreviewFunction2.default, { func: value })
+    );
+  }
+
+  renderObjectPreview(expression, root) {
+    return _react2.default.createElement(
+      "div",
+      { className: "preview-popup" },
+      this.renderObjectInspector(root)
+    );
+  }
+
+  renderSimplePreview(value) {
+    return _react2.default.createElement(
+      "div",
+      { className: "preview-popup" },
+      Rep({ object: value, mode: MODE.LONG })
+    );
+  }
+
+  renderObjectInspector(root) {
+    var _props2 = this.props,
+        loadObjectProperties = _props2.loadObjectProperties,
+        loadedObjects = _props2.loadedObjects;
+
+
+    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,
+      getObjectProperties: getObjectProperties,
+      loadObjectProperties: loadObjectProperties
+      // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
+      , getObjectEntries: actor => {},
+      loadObjectEntries: grip => {}
+    });
+  }
+
+  renderAddToExpressionBar(expression) {
+    if (!(0, _devtoolsConfig.isEnabled)("previewWatch")) {
+      return null;
+    }
+
+    var addExpression = this.props.addExpression;
+
+    return _react2.default.createElement(
+      "div",
+      { className: "add-to-expression-bar" },
+      _react2.default.createElement(
+        "div",
+        { className: "prompt" },
+        "\xBB"
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "expression-to-save-label" },
+        expression
+      ),
+      _react2.default.createElement(
+        "div",
+        {
+          className: "expression-to-save-button",
+          onClick: event => addExpression(event)
+        },
+        L10N.getStr("addWatchExpressionButton")
+      )
+    );
+  }
+
+  renderPreview(expression, value) {
+    var root = {
+      name: expression,
+      path: expression,
+      contents: { value }
+    };
+
+    if (value.class === "Function") {
+      return this.renderFunctionPreview(value, root);
+    }
+
+    if (value.type === "object") {
+      return _react2.default.createElement(
+        "div",
+        null,
+        this.renderObjectPreview(expression, root),
+        this.renderAddToExpressionBar(expression)
+      );
+    }
+
+    return this.renderSimplePreview(value);
+  }
+
+  getPreviewType(value) {
+    if (typeof value == "boolean" || 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)
+    );
+  }
+}
+
+exports.Popup = Popup;
+Popup.displayName = "Popup";
+
+exports.default = (0, _reactRedux.connect)(state => ({
+  loadedObjects: (0, _selectors.getLoadedObjects)(state)
+}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Popup);
+
+/***/ }),
 /* 811 */,
 /* 812 */,
 /* 813 */,
 /* 814 */,
 /* 815 */,
 /* 816 */,
 /* 817 */,
 /* 818 */,
@@ -29998,32 +30717,34 @@ function sortTree(tree) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
+exports.getEmptyLines = exports.getNextStep = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = 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 getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
 var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
 var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
+var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
+var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
 
 /***/ }),
 /* 828 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -30179,49 +30900,214 @@ module.exports = {
 /* 842 */,
 /* 843 */,
 /* 844 */,
 /* 845 */,
 /* 846 */,
 /* 847 */,
 /* 848 */,
 /* 849 */,
-/* 850 */,
-/* 851 */,
-/* 852 */,
-/* 853 */,
-/* 854 */,
-/* 855 */,
-/* 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 */,
+/* 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
+
+/***/ }),
+/* 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
+
+/***/ }),
 /* 883 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(884);
 var fs = __webpack_require__(118);
 
 function Iterator(text) {
 	var pos = 0, length = text.length;
@@ -31104,16 +31990,17 @@ var onConnect = (() => {
 
     window.getGlobalsForTesting = function () {
       return {
         store,
         actions,
         selectors,
         client: client.clientCommands,
         prefs: _prefs.prefs,
+        features: _prefs.features,
         connection
       };
     };
 
     if (!(0, _devtoolsConfig.isFirefoxPanel)()) {
       console.group("Development Notes");
       var baseUrl = "https://devtools-html.github.io/debugger.html";
       var localDevelopmentUrl = `${baseUrl}/docs/local-development.html`;
@@ -31588,17 +32475,18 @@ function createSource(source, _ref) {
   var supportsWasm = _ref.supportsWasm;
 
   return {
     id: source.actor,
     url: source.url,
     isPrettyPrinted: false,
     isWasm: supportsWasm && source.introductionType === "wasm",
     sourceMapURL: source.sourceMapURL,
-    isBlackBoxed: false
+    isBlackBoxed: false,
+    loadedState: "unloaded"
   };
 }
 
 function createPause(packet, response) {
   // NOTE: useful when the debugger is already paused
   var frame = packet.frame || response.frames[0];
 
   return Object.assign({}, packet, {
@@ -32436,22 +33324,27 @@ WorkerDispatcher.prototype = {
 };
 
 function workerHandler(publicInterface) {
   return function (msg) {
     const { id, method, args } = msg.data;
     try {
       const response = publicInterface[method].apply(undefined, args);
       if (response instanceof Promise) {
-        response.then(val => self.postMessage({ id, response: val }), err => self.postMessage({ id, error: err }));
+        response.then(val => self.postMessage({ id, response: val }),
+        // Error can't be sent via postMessage, so be sure to
+        // convert to string.
+        err => self.postMessage({ id, error: err.toString() }));
       } else {
         self.postMessage({ id, response });
       }
     } catch (error) {
-      self.postMessage({ id, error });
+      // Error can't be sent via postMessage, so be sure to convert to
+      // string.
+      self.postMessage({ id, error: error.toString() });
     }
   };
 }
 
 function streamingWorkerHandler(publicInterface, { timeout = 100 } = {}, worker = self) {
   let streamingWorker = (() => {
     var _ref = _asyncToGenerator(function* (id, tasks) {
       let isWorking = true;
@@ -32569,17 +33462,17 @@ var _prettyPrint = dispatcher.task("pret
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getTokenLocation = getTokenLocation;
-exports.updateSelection = updateSelection;
+exports.updatePreview = updatePreview;
 
 var _lodash = __webpack_require__(2);
 
 function getTokenLocation(codeMirror, tokenEl) {
   var _tokenEl$getBoundingC = tokenEl.getBoundingClientRect(),
       left = _tokenEl$getBoundingC.left,
       top = _tokenEl$getBoundingC.top,
       width = _tokenEl$getBoundingC.width,
@@ -32593,56 +33486,81 @@ function getTokenLocation(codeMirror, to
       ch = _codeMirror$coordsCha.ch;
 
   return {
     line: line + 1,
     column: ch
   };
 }
 
-function updateSelection(target, editor, _ref) {
+function updatePreview(target, editor, _ref) {
   var linesInScope = _ref.linesInScope,
-      selection = _ref.selection,
-      setSelection = _ref.setSelection,
-      clearSelection = _ref.clearSelection;
+      preview = _ref.preview,
+      setPreview = _ref.setPreview,
+      clearPreview = _ref.clearPreview;
 
   var location = getTokenLocation(editor.codeMirror, target);
   var tokenText = target.innerText ? target.innerText.trim() : "";
   var cursorPos = target.getBoundingClientRect();
 
-  if (selection) {
+  if (preview) {
     // We are mousing over the same token as before
-    if ((0, _lodash.isEqual)(selection.tokenPos, location)) {
-      return;
-    }
-
-    // We are mousing over a new token that is not in the selection
+    if ((0, _lodash.isEqual)(preview.tokenPos, location)) {
+      return;
+    }
+
+    // We are mousing over a new token that is not in the preview
     if (!target.classList.contains("debug-expression")) {
-      clearSelection();
+      clearPreview();
     }
   }
 
   var invalidToken = tokenText === "" || tokenText.match(/[(){},.;\s]/);
   var invalidTarget = target.parentElement && !target.parentElement.closest(".CodeMirror-line") || cursorPos.top == 0;
-  var isUpdating = selection && selection.updating;
+  var isUpdating = preview && preview.updating;
   var inScope = linesInScope && linesInScope.includes(location.line);
 
   if (invalidTarget || !inScope || isUpdating || invalidToken) {
     return;
   }
 
-  setSelection(tokenText, location, cursorPos);
-}
-
-/***/ }),
-/* 905 */,
-/* 906 */,
-/* 907 */,
-/* 908 */,
-/* 909 */,
+  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
+
+/***/ }),
 /* 910 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var SplitBox = __webpack_require__(911);
 
@@ -32657,17 +33575,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__(689);
+__webpack_require__(861);
 
 /**
  * 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.
@@ -32960,19 +33878,34 @@ var Draggable = React.createClass({
       onMouseDown: this.startDragging
     });
   }
 });
 
 module.exports = Draggable;
 
 /***/ }),
-/* 913 */,
-/* 914 */,
-/* 915 */,
+/* 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
+
+/***/ }),
 /* 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 &&
@@ -33502,33 +34435,58 @@ module.exports = Draggable;
 		root.punycode = punycode;
 	}
 
 }(this));
 
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(793)(module), __webpack_require__(792)))
 
 /***/ }),
-/* 917 */,
-/* 918 */,
+/* 917 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 918 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 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 */,
-/* 922 */,
-/* 923 */,
+/* 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
+
+/***/ }),
 /* 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
@@ -33587,17 +34545,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__(707);
+__webpack_require__(877);
 
 // 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);
@@ -34672,17 +35630,22 @@ maxLengthMap.set(MODE.LONG, 10);
 // Exports from this module
 module.exports = {
   rep: wrapRender(ArrayRep),
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
-/* 935 */,
+/* 935 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 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); } }
 
@@ -36355,17 +37318,22 @@ function supportsObject(object) {
 
 // Exports from this module
 module.exports = {
   rep: wrapRender(ElementNode),
   supportsObject
 };
 
 /***/ }),
-/* 952 */,
+/* 952 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 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
@@ -37205,21 +38173,26 @@ 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 (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\n\n# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from\n# the context menu.\ncopySourceUrl.accesskey=u\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\n\n# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from\n# the context menu.\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 (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 (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 (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.enableSelf=Enable breakpoint\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.deleteAll=Remove all breakpoints\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteSelf.accesskey): Access key to remove the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.deleteSelf.accesskey=r\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableSelf.accesskey): Access key to enable the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.enableSelf.accesskey=e\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableSelf.accesskey): Access key to disable the \n# currently selected breakpoint from the context menu\nbreakpointMenuItem.disableSelf.accesskey=d\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteAll.accesskey): Access key to remove all \n# the breakpoints from the context menu\nbreakpointMenuItem.deleteAll.accesskey=a\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableAll.accesskey): Access key to enable all \n# the breakpoints from the context menu\nbreakpointMenuItem.enableAll.accesskey=b\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableAll.accesskey): Access key to disable all \n# the breakpoints from the context menu\nbreakpointMenuItem.disableAll.accesskey=c\n\n# LOCALIZATION NOTE (breakpointMenuItem.deleteOthers.accesskey): Access key to remove  \n# other breakpoints from the context menu\nbreakpointMenuItem.deleteOthers.accesskey=p\n\n# LOCALIZATION NOTE (breakpointMenuItem.enableOthers.accesskey): Access key to enable  \n# other breakpoints from the context menu\nbreakpointMenuItem.enableOthers.accesskey=q\n\n# LOCALIZATION NOTE (breakpointMenuItem.disableOthers.accesskey): Access key to disable  \n# other breakpoints from the context menu\nbreakpointMenuItem.disableOthers.accesskey=s\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.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\n\n# LOCALIZATION NOTE (framework.disableGrouping.accesskey): Access key to toggle\n# framework grouping from the context menu.\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\n\n# LOCALIZATION NOTE (framework.enableGrouping.accesskey): Access key to toggle\n# framework grouping from the context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select\n# source tab from the editor context menu item.\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 others\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs\n# from the editor context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs\n# after the selected tab from the editor context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the\n# editor context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the\n# tree from the context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the\n# editor context menu.\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\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from\n# the editor context menu.\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.blackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\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 (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 (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 (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %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"
+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 (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\ncopySourceUrl.accesskey=u\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 (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 (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.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\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.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 others\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 (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 (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 (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 (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %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"
 
 /***/ }),
 /* 961 */,
-/* 962 */,
+/* 962 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 963 */,
 /* 964 */,
 /* 965 */
 /***/ (function(module, exports) {
 
 
 /**
  * slice() reference.
@@ -39563,16 +40536,18 @@ var Tree = module.exports = createClass(
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getAndProcessFrames = getAndProcessFrames;
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 var _reselect = __webpack_require__(993);
 
 var _lodash = __webpack_require__(2);
 
@@ -39593,17 +40568,17 @@ 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__(724);
+__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);
 
 var NUM_FRAMES_SHOWN = 7;
@@ -39675,59 +40650,81 @@ class Frames extends _react.Component {
         selectedFrame = _props3.selectedFrame,
         toggleBlackBox = _props3.toggleBlackBox,
         frameworkGroupingOn = _props3.frameworkGroupingOn;
 
 
     var framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
 
 
-    return _react.DOM.ul({}, framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
-      frame: frameOrGroup,
-      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
-      copyStackTrace: this.copyStackTrace,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frameOrGroup.id
-    }) : Group({
-      group: frameOrGroup,
-      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
-      copyStackTrace: this.copyStackTrace,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frameOrGroup[0].id
-    })));
+    return _react2.default.createElement(
+      "ul",
+      null,
+      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
+        frame: frameOrGroup,
+        toggleFrameworkGrouping: this.toggleFrameworkGrouping,
+        copyStackTrace: this.copyStackTrace,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frameOrGroup.id
+      }) : Group({
+        group: frameOrGroup,
+        toggleFrameworkGrouping: this.toggleFrameworkGrouping,
+        copyStackTrace: this.copyStackTrace,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frameOrGroup[0].id
+      }))
+    );
   }
 
   renderToggleButton(frames) {
     var buttonMessage = this.state.showAllFrames ? L10N.getStr("callStack.collapse") : L10N.getStr("callStack.expand");
 
     frames = this.collapseFrames(frames);
     if (frames.length <= NUM_FRAMES_SHOWN) {
       return null;
     }
 
-    return _react.DOM.div({ className: "show-more", onClick: this.toggleFramesDisplay }, buttonMessage);
+    return _react2.default.createElement(
+      "div",
+      { className: "show-more", onClick: this.toggleFramesDisplay },
+      buttonMessage
+    );
   }
 
   render() {
     var _props4 = this.props,
         frames = _props4.frames,
         pause = _props4.pause;
 
 
     if (!frames) {
-      return _react.DOM.div({ className: "pane frames" }, _react.DOM.div({ className: "pane-info empty" }, L10N.getStr("callStack.notPaused")));
-    }
-
-    return _react.DOM.div({ className: "pane frames" }, this.renderFrames(frames), (0, _WhyPaused2.default)({ pause }), this.renderToggleButton(frames));
+      return _react2.default.createElement(
+        "div",
+        { className: "pane frames" },
+        _react2.default.createElement(
+          "div",
+          { className: "pane-info empty" },
+          L10N.getStr("callStack.notPaused")
+        )
+      );
+    }
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane frames" },
+      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,
@@ -39775,16 +40772,18 @@ exports.default = (0, _reactRedux.connec
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
@@ -39793,37 +40792,55 @@ var _frame = __webpack_require__(1014);
 var _source = __webpack_require__(233);
 
 var _FrameMenu = __webpack_require__(1032);
 
 var _FrameMenu2 = _interopRequireDefault(_FrameMenu);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function renderFrameTitle(frame, options) {
+function FrameTitle(_ref) {
+  var frame = _ref.frame,
+      options = _ref.options;
+
   var displayName = (0, _frame.formatDisplayName)(frame, options);
-  return _react.DOM.div({ className: "title" }, displayName);
-}
-
-function renderFrameLocation(_ref) {
-  var source = _ref.source,
-      location = _ref.location,
-      library = _ref.library;
-
-  if (!source) {
+  return _react2.default.createElement(
+    "div",
+    { className: "title" },
+    displayName
+  );
+}
+
+FrameTitle.displayName = "FrameTitle";
+
+function FrameLocation(_ref2) {
+  var frame = _ref2.frame;
+
+  if (!frame.source) {
     return;
   }
 
-  if (library) {
-    return _react.DOM.div({ className: "location" }, library, (0, _Svg2.default)(library.toLowerCase(), { className: "annotation-logo" }));
-  }
-
-  var filename = (0, _source.getFilename)(source);
-  return _react.DOM.div({ className: "location" }, `${filename}: ${location.line}`);
-}
+  if (frame.library) {
+    return _react2.default.createElement(
+      "div",
+      { className: "location" },
+      frame.library,
+      _react2.default.createElement(_Svg2.default, { name: frame.library.toLowerCase(), className: "annotation-logo" })
+    );
+  }
+
+  var filename = (0, _source.getFilename)(frame.source);
+  return _react2.default.createElement(
+    "div",
+    { className: "location" },
+    `${filename}: ${frame.location.line}`
+  );
+}
+
+FrameLocation.displayName = "FrameLocation";
 
 class FrameComponent extends _react.Component {
 
   constructor() {
     super();
   }
 
   onContextMenu(event) {
@@ -39854,26 +40871,32 @@ class FrameComponent extends _react.Comp
   render() {
     var _props2 = this.props,
         frame = _props2.frame,
         selectedFrame = _props2.selectedFrame,
         hideLocation = _props2.hideLocation,
         shouldMapDisplayName = _props2.shouldMapDisplayName;
 
 
-    return _react.DOM.li({
-      key: frame.id,
-      className: (0, _classnames2.default)("frame", {
-        selected: selectedFrame && selectedFrame.id === frame.id
-      }),
-      onMouseDown: e => this.onMouseDown(e, frame, selectedFrame),
-      onKeyUp: e => this.onKeyUp(e, frame, selectedFrame),
-      onContextMenu: e => this.onContextMenu(e),
-      tabIndex: 0
-    }, renderFrameTitle(frame, { shouldMapDisplayName }), !hideLocation ? renderFrameLocation(frame) : null);
+    var className = (0, _classnames2.default)("frame", {
+      selected: selectedFrame && selectedFrame.id === frame.id
+    });
+    return _react2.default.createElement(
+      "li",
+      {
+        key: frame.id,
+        className: className,
+        onMouseDown: e => this.onMouseDown(e, frame, selectedFrame),
+        onKeyUp: e => this.onKeyUp(e, frame, selectedFrame),
+        onContextMenu: e => this.onContextMenu(e),
+        tabIndex: 0
+      },
+      _react2.default.createElement(FrameTitle, { frame: frame, options: { shouldMapDisplayName } }),
+      !hideLocation && _react2.default.createElement(FrameLocation, { frame: frame })
+    );
   }
 }
 
 exports.default = FrameComponent;
 FrameComponent.defaultProps = {
   hideLocation: false,
   shouldMapDisplayName: true
 };
@@ -39974,16 +40997,20 @@ function isRxJs(frame) {
 function isAngular(frame) {
   return getFrameUrl(frame).match(/angular/i);
 }
 
 function isRedux(frame) {
   return getFrameUrl(frame).match(/redux/i);
 }
 
+function isDojo(frame) {
+  return getFrameUrl(frame).match(/dojo/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";
   }
 
@@ -40038,16 +41065,20 @@ function getLibraryFromUrl(frame) {
   if (isAngular(frame)) {
     return "Angular";
   }
 
   if (isRedux(frame)) {
     return "Redux";
   }
 
+  if (isDojo(frame)) {
+    return "Dojo";
+  }
+
   if (isImmutable(frame)) {
     return "Immutable";
   }
 }
 
 var displayNameMap = {
   Backbone: {
     "extend/child": "Create Class",
@@ -40205,49 +41236,59 @@ function collapseLastFrames(frames) {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 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__(722);
+__webpack_require__(909);
 
 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 renderFrameLocation(frame) {
+function FrameLocation(_ref) {
+  var frame = _ref.frame;
+
   var library = (0, _frame.getLibraryFromUrl)(frame);
   if (!library) {
     return null;
   }
 
-  return _react.DOM.div({ className: "location" }, library, (0, _Svg2.default)(library.toLowerCase(), { className: "annotation-logo" }));
-}
+  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.state = { expanded: false };
     var self = this;
 
@@ -40279,48 +41320,67 @@ class Group extends _react.Component {
         frameworkGroupingOn = _props2.frameworkGroupingOn,
         toggleBlackBox = _props2.toggleBlackBox,
         copyStackTrace = _props2.copyStackTrace;
     var expanded = this.state.expanded;
 
     if (!expanded) {
       return null;
     }
-    return _react.DOM.div({ className: "frames-list" }, group.map(frame => FrameComponent({
-      frame,
-      copyStackTrace,
-      toggleFrameworkGrouping,
-      frameworkGroupingOn,
-      selectFrame,
-      selectedFrame,
-      toggleBlackBox,
-      key: frame.id,
-      hideLocation: true,
-      shouldMapDisplayName: false
-    })));
+
+    return _react2.default.createElement(
+      "div",
+      { className: "frames-list" },
+      group.map(frame => FrameComponent({
+        frame,
+        copyStackTrace,
+        toggleFrameworkGrouping,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
+        key: frame.id,
+        hideLocation: true,
+        shouldMapDisplayName: false
+      }))
+    );
   }
 
   renderDescription() {
     var frame = this.props.group[0];
     var displayName = (0, _frame.formatDisplayName)(frame);
-    return _react.DOM.li({
-      key: frame.id,
-      className: (0, _classnames2.default)("group"),
-      onClick: this.toggleFrames,
-      tabIndex: 0
-    }, _react.DOM.div({ className: "title" }, displayName), renderFrameLocation(frame));
+    return _react2.default.createElement(
+      "li",
+      {
+        key: frame.id,
+        className: (0, _classnames2.default)("group"),
+        onClick: this.toggleFrames,
+        tabIndex: 0
+      },
+      _react2.default.createElement(
+        "div",
+        { className: "title" },
+        displayName
+      ),
+      _react2.default.createElement(FrameLocation, { frame: frame })
+    );
   }
 
   render() {
     var expanded = this.state.expanded;
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("frames-group", { expanded }),
-      onContextMenu: e => this.onContextMenu(e)
-    }, this.renderDescription(), this.renderFrames());
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("frames-group", { expanded }),
+        onContextMenu: e => this.onContextMenu(e)
+      },
+      this.renderDescription(),
+      this.renderFrames()
+    );
   }
 }
 
 exports.default = Group;
 Group.displayName = "Group";
 
 /***/ }),
 /* 1016 */,
@@ -40441,17 +41501,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__(709);
+__webpack_require__(879);
 
 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;
@@ -40593,32 +41653,32 @@ module.exports = "<svg viewBox=\"0 0 14 
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getGeneratedLocation = undefined;
-
-var getGeneratedLocation = exports.getGeneratedLocation = (() => {
-  var _ref2 = _asyncToGenerator(function* (source, sourceMaps, location) {
-    if (!sourceMaps.isOriginalId(location.sourceId)) {
-      return location;
-    }
-
-    return yield sourceMaps.getGeneratedLocation(location, source.toJS());
-  });
-
-  return function getGeneratedLocation(_x2, _x3, _x4) {
-    return _ref2.apply(this, arguments);
-  };
-})();
-
+exports.findScopeByName = exports.getASTLocation = undefined;
+
+var _astBreakpointLocation = __webpack_require__(804);
+
+Object.defineProperty(exports, "getASTLocation", {
+  enumerable: true,
+  get: function () {
+    return _astBreakpointLocation.getASTLocation;
+  }
+});
+Object.defineProperty(exports, "findScopeByName", {
+  enumerable: true,
+  get: function () {
+    return _astBreakpointLocation.findScopeByName;
+  }
+});
 exports.firstString = firstString;
 exports.locationMoved = locationMoved;
 exports.makeLocationId = makeLocationId;
 exports.makePendingLocationId = makePendingLocationId;
 exports.assertBreakpoint = assertBreakpoint;
 exports.assertPendingBreakpoint = assertPendingBreakpoint;
 exports.assertLocation = assertLocation;
 exports.assertPendingLocation = assertPendingLocation;
@@ -40632,18 +41692,16 @@ var _devtoolsConfig = __webpack_require_
 var _selectors = __webpack_require__(242);
 
 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"); }); }; }
-
 // Return the first argument that is a string, or null if nothing is a
 // string.
 function firstString() {
   for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
     args[_key] = arguments[_key];
   }
 
   for (var arg of args) {
@@ -40733,42 +41791,43 @@ function breakpointExists(state, locatio
   var currentBp = (0, _selectors.getBreakpoint)(state, location);
   return currentBp && !currentBp.disabled;
 }
 
 function createBreakpoint(location) {
   var overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
   var condition = overrides.condition,
       disabled = overrides.disabled,
+      hidden = overrides.hidden,
       generatedLocation = overrides.generatedLocation;
 
   var properties = {
     condition: condition || null,
     disabled: disabled || false,
+    hidden: hidden || false,
     generatedLocation: generatedLocation || location,
     location
   };
 
   return properties;
 }
 
 function createPendingLocation(location) {
   var sourceUrl = location.sourceUrl,
       line = location.line,
       column = location.column;
 
-  return { sourceUrl: sourceUrl, line, column };
+  return { sourceUrl, line, column };
 }
 
 function createPendingBreakpoint(bp) {
   var pendingLocation = createPendingLocation(bp.location);
   var pendingGeneratedLocation = createPendingLocation(bp.generatedLocation);
 
   assertPendingLocation(pendingLocation);
-  assertPendingLocation(pendingLocation);
 
   return {
     condition: bp.condition,
     disabled: bp.disabled,
     location: pendingLocation,
     generatedLocation: pendingGeneratedLocation
   };
 }
@@ -40781,18 +41840,20 @@ function createPendingBreakpoint(bp) {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.initialState = initialState;
 exports.getSymbols = getSymbols;
 exports.hasSymbols = hasSymbols;
+exports.isEmptyLineInSource = isEmptyLineInSource;
+exports.getEmptyLines = getEmptyLines;
 exports.getOutOfScopeLocations = getOutOfScopeLocations;
-exports.getSelection = getSelection;
+exports.getPreview = getPreview;
 
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
@@ -40804,62 +41865,71 @@ function _interopRequireWildcard(obj) { 
 /**
  * UI reducer
  * @module reducers/ui
  */
 
 function initialState() {
   return (0, _makeRecord2.default)({
     symbols: I.Map(),
+    emptyLines: I.Map(),
     outOfScopeLocations: null,
-    selection: null
+    preview: null
   })();
 }
 
 function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState();
   var action = arguments[1];
 
   switch (action.type) {
     case "SET_SYMBOLS":
       {
         var source = action.source,
             _symbols = action.symbols;
 
         return state.setIn(["symbols", source.id], _symbols);
       }
 
+    case "SET_EMPTY_LINES":
+      {
+        var _source = action.source,
+            _emptyLines = action.emptyLines;
+
+        return state.setIn(["emptyLines", _source.id], _emptyLines);
+      }
+
     case "OUT_OF_SCOPE_LOCATIONS":
       {
         return state.set("outOfScopeLocations", action.locations);
       }
 
     case "CLEAR_SELECTION":
       {
-        return state.set("selection", null);
-      }
-
-    case "SET_SELECTION":
+        return state.set("preview", null);
+      }
+
+    case "SET_PREVIEW":
       {
         if (action.status == "start") {
-          return state.set("selection", { updating: true });
+          return state.set("preview", { updating: true });
         }
 
         if (!action.value) {
-          return state.set("selection", null);
+          return state.set("preview", null);
         }
 
         var _action$value = action.value,
             _expression = _action$value.expression,
             _location = _action$value.location,
             _result = _action$value.result,
             _tokenPos = _action$value.tokenPos,
             _cursorPos = _action$value.cursorPos;
 
-        return state.set("selection", {
+        return state.set("preview", {
           updating: false,
           expression: _expression,
           location: _location,
           result: _result,
           tokenPos: _tokenPos,
           cursorPos: _cursorPos
         });
       }
@@ -40891,40 +41961,54 @@ function getSymbols(state, source) {
 function hasSymbols(state, source) {
   if (!source) {
     return false;
   }
 
   return !!state.ast.getIn(["symbols", source.id]);
 }
 
+function isEmptyLineInSource(state, line, selectedSource) {
+  var emptyLines = getEmptyLines(state, selectedSource);
+  return emptyLines.includes(line);
+}
+
+function getEmptyLines(state, source) {
+  if (!source) {
+    return [];
+  }
+
+  return state.ast.getIn(["emptyLines", source.id]) || [];
+}
+
 function getOutOfScopeLocations(state) {
   return state.ast.get("outOfScopeLocations");
 }
 
-function getSelection(state) {
-  return state.ast.get("selection");
+function getPreview(state) {
+  return state.ast.get("preview");
 }
 
 exports.default = update;
 
 /***/ }),
 /* 1059 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.setSymbols = setSymbols;
+exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
-exports.clearSelection = clearSelection;
-exports.setSelection = setSelection;
+exports.clearPreview = clearPreview;
+exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(242);
 
 var _promise = __webpack_require__(193);
 
 var _parser = __webpack_require__(827);
 
 var parser = _interopRequireWildcard(_parser);
@@ -40959,22 +42043,53 @@ function setSymbols(sourceId) {
     });
 
     return function (_x) {
       return _ref.apply(this, arguments);
     };
   })();
 }
 
-function setOutOfScopeLocations() {
+function setEmptyLines(sourceId) {
   return (() => {
     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) {
+        return;
+      }
+
+      var emptyLines = yield parser.getEmptyLines(source);
+
+      dispatch({
+        type: "SET_EMPTY_LINES",
+        source,
+        emptyLines
+      });
+    });
+
+    return function (_x2) {
+      return _ref3.apply(this, arguments);
+    };
+  })();
+}
+
+function setOutOfScopeLocations() {
+  return (() => {
+    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);
 
       if (!location.line || !source) {
@@ -40987,29 +42102,29 @@ function setOutOfScopeLocations() {
       var locations = yield parser.getOutOfScopeLocations(source.toJS(), location);
 
       return dispatch({
         type: "OUT_OF_SCOPE_LOCATIONS",
         locations
       });
     });
 
-    return function (_x2) {
-      return _ref3.apply(this, arguments);
+    return function (_x3) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
-function clearSelection() {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch,
-        getState = _ref5.getState,
-        client = _ref5.client;
-
-    var currentSelection = (0, _selectors.getSelection)(getState());
+function clearPreview() {
+  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"
     });
   };
@@ -41027,30 +42142,30 @@ function findBestMatch(symbols, tokenPos
     if (overlaps) {
       return expression;
     }
 
     return found;
   }, {});
 }
 
-function setSelection(token, tokenPos, cursorPos) {
+function setPreview(token, tokenPos, cursorPos) {
   return (() => {
-    var _ref6 = _asyncToGenerator(function* (_ref7) {
-      var dispatch = _ref7.dispatch,
-          getState = _ref7.getState,
-          client = _ref7.client;
-
-      var currentSelection = (0, _selectors.getSelection)(getState());
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          client = _ref9.client;
+
+      var currentSelection = (0, _selectors.getPreview)(getState());
       if (currentSelection && currentSelection.updating) {
         return;
       }
 
       yield dispatch({
-        type: "SET_SELECTION",
+        type: "SET_PREVIEW",
         [_promise.PROMISE]: _asyncToGenerator(function* () {
           var source = (0, _selectors.getSelectedSource)(getState());
           var _symbols = yield parser.getSymbols(source.toJS());
 
           var found = findBestMatch(_symbols, tokenPos, token);
           if (!found) {
             return;
           }
@@ -41060,38 +42175,38 @@ function setSelection(token, tokenPos, c
 
 
           if (!expression) {
             return;
           }
 
           var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
 
-          var _ref9 = yield client.evaluate(expression, {
+          var _ref11 = yield client.evaluate(expression, {
             frameId: selectedFrame.id
           }),
-              result = _ref9.result;
+              result = _ref11.result;
 
           if (!result) {
             return;
           }
 
           return {
             expression,
             result,
             location,
             tokenPos,
             cursorPos
           };
         })()
       });
     });
 
-    return function (_x3) {
-      return _ref6.apply(this, arguments);
+    return function (_x4) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 1060 */,
 /* 1061 */,
 /* 1062 */,
@@ -41123,17 +42238,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__(694);
+__webpack_require__(866);
 
 var _sourcesTree = __webpack_require__(39);
 
 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"); }); }; }
 
 class TextSearch extends _react.Component {
@@ -41202,35 +42317,27 @@ class TextSearch extends _react.Componen
     this.props.selectSource(matchItem.sourceId, { line: matchItem.line });
   }
 
   renderFile(file, focused, expanded, setExpanded) {
     if (focused) {
       this.focused = { setExpanded, file, expanded };
     }
 
-    var svgArrow = (0, _Svg2.default)("arrow", {
-      className: (0, _classnames2.default)({
-        expanded
-      })
-    });
-
-    var svgFile = (0, _Svg2.default)("file");
-
     var matches = ` (${file.matches.length} match${file.matches.length > 1 ? "es" : ""})`;
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("file-result", { focused }),
         key: file.sourceId,
         onClick: e => setExpanded(file, !expanded)
       },
-      svgArrow,
-      svgFile,
+      _react2.default.createElement(_Svg2.default, { name: "arrow", className: (0, _classnames2.default)({ expanded }) }),
+      _react2.default.createElement(_Svg2.default, { name: "file" }),
       _react2.default.createElement(
         "span",
         { className: "file-path" },
         (0, _sourcesTree.getRelativePath)(file.filepath)
       ),
       _react2.default.createElement(
         "span",
         { className: "matches-summary" },
@@ -41269,42 +42376,46 @@ class TextSearch extends _react.Componen
     while ((match = re.exec(value)) !== null) {
       matchIndexes.push(match.index);
     }
 
     matchIndexes.forEach((matchIndex, index) => {
       if (matchIndex > 0 && index === 0) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case1-${index}` },
           value.slice(0, matchIndex)
         ));
       }
       if (matchIndex > matchIndexes[index - 1] + len) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case2-${index}` },
           value.slice(matchIndexes[index - 1] + len, matchIndex)
         ));
       }
       matches.push(_react2.default.createElement(
         "span",
         { className: "query-match", key: index },
         value.substr(matchIndex, len)
       ));
       if (index === matchIndexes.length - 1) {
         matches.push(_react2.default.createElement(
           "span",
-          { className: "line-match" },
+          { className: "line-match", key: `case3-${index}` },
           value.slice(matchIndex + len, value.length)
         ));
       }
     });
 
-    return _react.DOM.span.apply(_react.DOM, [{ className: "line-value" }].concat(matches));
+    return _react2.default.createElement(
+      "span",
+      { className: "line-value" },
+      matches
+    );
   }
 
   getResults() {
     var results = this.props.results;
 
     return results.filter(result => result.filepath && result.matches.length > 0);
   }
 
@@ -41319,17 +42430,17 @@ class TextSearch extends _react.Componen
       var setExpanded = _ref.setExpanded;
 
       return item.filepath ? this.renderFile(item, focused, expanded, setExpanded) : this.renderMatch(item, focused);
     };
 
     return _react2.default.createElement(_ManagedTree2.default, {
       getRoots: () => results,
       getChildren: file => file.matches || [],
-      itemHeight: 20,
+      itemHeight: 24,
       autoExpand: 1,
       autoExpandDepth: 1,
       focused: results[0],
       getParent: item => null,
       getPath: getFilePath,
       renderItem: renderItem
     });
   }
@@ -41501,17 +42612,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__(723);
+__webpack_require__(913);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderExceptionSummary(exception) {
   if ((0, _lodash.isString)(exception)) {
     return exception;
   }
 
@@ -41621,18 +42732,49 @@ function getInScopeLines(state) {
     return sourceLines;
   }
 
   return _lodash.without.apply(undefined, [sourceLines].concat(_toConsumableArray(linesOutOfScope)));
 }
 
 /***/ }),
 /* 1125 */,
-/* 1126 */,
-/* 1127 */,
+/* 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);
+}
+
+/***/ }),
 /* 1128 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -41664,17 +42806,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__(683);
+  __webpack_require__(854);
 }
 
 function createPopup(doc) {
   var popup = doc.createElement("menupopup");
   popup.className = "landing-popup";
   if (popup.openPopupAtScreen) {
     return popup;
   }
@@ -41800,17 +42942,59 @@ function buildMenu(items) {
 
 module.exports = {
   showMenu,
   buildMenu
 };
 
 /***/ }),
 /* 1131 */,
-/* 1132 */,
+/* 1132 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = update;
+exports.getSourceSearchQuery = getSourceSearchQuery;
+
+var _makeRecord = __webpack_require__(230);
+
+var _makeRecord2 = _interopRequireDefault(_makeRecord);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function InitialState() {
+  return (0, _makeRecord2.default)({
+    queryString: ""
+  })();
+}
+
+function update() {
+  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : InitialState();
+  var action = arguments[1];
+
+  switch (action.type) {
+    case "SET_QUERY_STRING":
+      return state.update("queryString", value => action.queryString);
+    case "CLEAR_QUERY_STRING":
+      return state.update("queryString", value => "");
+    default:
+      return state;
+  }
+}
+
+function getSourceSearchQuery(state) {
+  return state.sourceSearch.get("queryString");
+}
+
+/***/ }),
 /* 1133 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -42029,26 +43213,28 @@ var _devtoolsSourceMap = __webpack_requi
 
 function getLocation(breakpoint, isGeneratedSource) {
   return isGeneratedSource ? breakpoint.generatedLocation || breakpoint.location : breakpoint.location;
 }
 
 function formatBreakpoint(breakpoint, selectedSource) {
   var condition = breakpoint.condition,
       loading = breakpoint.loading,
-      disabled = breakpoint.disabled;
+      disabled = breakpoint.disabled,
+      hidden = breakpoint.hidden;
 
   var sourceId = selectedSource.get("id");
   var isGeneratedSource = (0, _devtoolsSourceMap.isGeneratedId)(sourceId);
 
   return {
     location: getLocation(breakpoint, isGeneratedSource),
     condition,
     loading,
-    disabled
+    disabled,
+    hidden
   };
 }
 
 function isVisible(breakpoint, selectedSource) {
   var sourceId = selectedSource.get("id");
   var isGeneratedSource = (0, _devtoolsSourceMap.isGeneratedId)(sourceId);
 
   var location = getLocation(breakpoint, isGeneratedSource);
@@ -42076,66 +43262,55 @@ function getVisibleBreakpoints(state) {
 
 
 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 _getGeneratedLocation = (() => {
-  var _ref = _asyncToGenerator(function* (state, source, sourceMaps, location) {
-    var generatedLocation = yield (0, _breakpoint.getGeneratedLocation)(source, sourceMaps, location);
-
-    var generatedSource = (0, _selectors.getSource)(state, generatedLocation.sourceId);
-    var sourceUrl = generatedSource.get("url");
-    return _extends({}, generatedLocation, { sourceUrl });
-  });
-
-  return function _getGeneratedLocation(_x, _x2, _x3, _x4) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
 var _breakpoint = __webpack_require__(1057);
 
 var _selectors = __webpack_require__(242);
 
+var _sourceMaps = __webpack_require__(797);
+
 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"); }); }; }
 
 exports.default = (() => {
-  var _ref2 = _asyncToGenerator(function* (getState, client, sourceMaps, _ref3) {
-    var breakpoint = _ref3.breakpoint;
+  var _ref = _asyncToGenerator(function* (getState, client, sourceMaps, _ref2) {
+    var breakpoint = _ref2.breakpoint;
 
     var state = getState();
 
     var source = (0, _selectors.getSource)(state, breakpoint.location.sourceId);
     var location = _extends({}, breakpoint.location, { sourceUrl: source.get("url") });
-    var generatedLocation = yield _getGeneratedLocation(state, source, sourceMaps, location);
+    var generatedLocation = yield (0, _sourceMaps.getGeneratedLocation)(state, source.toJS(), location, sourceMaps);
 
     (0, _breakpoint.assertLocation)(location);
     (0, _breakpoint.assertLocation)(generatedLocation);
 
     if ((0, _breakpoint.breakpointExists)(state, location)) {
       var _newBreakpoint = _extends({}, breakpoint, { location, generatedLocation });
       (0, _breakpoint.assertBreakpoint)(_newBreakpoint);
       return { breakpoint: _newBreakpoint };
     }
 
-    var _ref4 = yield client.setBreakpoint(generatedLocation, breakpoint.condition, sourceMaps.isOriginalId(location.sourceId)),
-        id = _ref4.id,
-        hitCount = _ref4.hitCount,
-        actualLocation = _ref4.actualLocation;
+    var _ref3 = yield client.setBreakpoint(generatedLocation, breakpoint.condition, sourceMaps.isOriginalId(location.sourceId)),
+        id = _ref3.id,
+        hitCount = _ref3.hitCount,
+        actualLocation = _ref3.actualLocation;
 
     var newGeneratedLocation = actualLocation || generatedLocation;
     var newLocation = yield sourceMaps.getOriginalLocation(newGeneratedLocation);
 
     var newBreakpoint = {
       id,
       disabled: false,
+      hidden: breakpoint.hidden,
       loading: false,
       condition: breakpoint.condition,
       location: newLocation,
       hitCount,
       generatedLocation: newGeneratedLocation
     };
 
     (0, _breakpoint.assertBreakpoint)(newBreakpoint);
@@ -42143,72 +43318,52 @@ exports.default = (() => {
     var previousLocation = (0, _breakpoint.locationMoved)(location, newLocation) ? location : null;
 
     return {
       breakpoint: newBreakpoint,
       previousLocation
     };
   });
 
-  function addBreakpoint(_x5, _x6, _x7, _x8) {
-    return _ref2.apply(this, arguments);
+  function addBreakpoint(_x, _x2, _x3, _x4) {
+    return _ref.apply(this, arguments);
   }
 
   return addBreakpoint;
 })();
 
 /***/ }),
 /* 1137 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.syncClientBreakpoint = undefined;
-var _selectors = __webpack_require__(242);
 
 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; };
 
-async function getGeneratedLocation(
-  state,
-  source,
-  location,
-  sourceMaps
-) {
-  if (!sourceMaps.isOriginalId(location.sourceId)) {
-    return location;
-  }
-
-  const generatedLocation = await sourceMaps.getGeneratedLocation(
-    location,
-    source
-  );
-  const generatedSource = _selectors.getSource(state, generatedLocation.sourceId);
-  const sourceUrl = generatedSource.get("url");
-  return { ...generatedLocation, sourceUrl };
-}
-
 // we have three forms of syncing: disabled syncing, existing server syncing
 // and adding a new breakpoint
 var syncClientBreakpoint = exports.syncClientBreakpoint = (() => {
   var _ref = _asyncToGenerator(function* (getState, client, sourceMaps, source, pendingBreakpoint) {
-		var sourceId = source.id;
-		var generatedSourceId = sourceMaps.isOriginalId(sourceId) ? (0, _devtoolsSourceMap.originalToGeneratedId)(sourceId) : sourceId;
+    var sourceId = source.id;
+    var generatedSourceId = sourceMaps.isOriginalId(sourceId) ? (0, _devtoolsSourceMap.originalToGeneratedId)(sourceId) : sourceId;
 
     // this is the generatedLocation of the pending breakpoint, with
     // the source id updated to reflect the new connection
     var generatedLocation = _extends({}, pendingBreakpoint.generatedLocation, {
       sourceId: generatedSourceId
     });
 
     var location = _extends({}, pendingBreakpoint.location, {
-      sourceId: sourceId
+      sourceId
     });
 
     (0, _breakpoint3.assertPendingBreakpoint)(pendingBreakpoint);
 
     /** ******* CASE 1: Disabled ***********/
     // early return if breakpoint is disabled, send overrides to update
     // the id as expected
     if (pendingBreakpoint.disabled) {
@@ -42227,42 +43382,31 @@ var syncClientBreakpoint = exports.syncC
     }
 
     /** ******* CASE 2: Merge Server Breakpoint ***********/
     // early return if breakpoint exists on the server, send overrides
     // to update the id as expected
     var existingClient = client.getBreakpointByLocation(generatedLocation);
 
     if (existingClient) {
-			const newGeneratedLocation = yield getGeneratedLocation(
-	      getState(),
-	      source,
-	      location,
-	      sourceMaps
-	    );
-
-	    if ((0, _breakpoint3.locationMoved)(generatedLocation, newGeneratedLocation)) {
-	      yield client.removeBreakpoint(generatedLocation);
-	      yield client.setBreakpoint(
-	        newGeneratedLocation,
-	        pendingBreakpoint.condition,
-	        sourceMaps.isOriginalId(sourceId)
-	      );
-	    }
-
-	    const breakpoint = {
-	      ...pendingBreakpoint,
-	      id: (0, _breakpoint3.makeLocationId)(location),
-	      generatedLocation: newGeneratedLocation,
-	      location: location
-	    };
-
-	    (0, _breakpoint3.assertPendingBreakpoint)(breakpoint);
-	    return { breakpoint, previousLocation: location };
-
+      var _newGeneratedLocation = yield (0, _sourceMaps.getGeneratedLocation)(getState(), source, location, sourceMaps);
+
+      if ((0, _breakpoint3.locationMoved)(generatedLocation, _newGeneratedLocation)) {
+        yield client.removeBreakpoint(generatedLocation);
+        yield client.setBreakpoint(_newGeneratedLocation, pendingBreakpoint.condition, sourceMaps.isOriginalId(sourceId));
+      }
+
+      var _breakpoint2 = _extends({}, pendingBreakpoint, {
+        id: (0, _breakpoint3.makeLocationId)(location),
+        generatedLocation: _newGeneratedLocation,
+        location: location
+      });
+
+      (0, _breakpoint3.assertBreakpoint)(_breakpoint2);
+      return { breakpoint: _breakpoint2, previousLocation: location };
     }
 
     /** ******* CASE 3: Add New Breakpoint ***********/
     // If we are not disabled, set the breakpoint on the server and get
     // that info so we can set it on our breakpoints.
     var clientBreakpoint = yield client.setBreakpoint(generatedLocation, pendingBreakpoint.condition, sourceMaps.isOriginalId(sourceId));
 
     var newGeneratedLocation = clientBreakpoint.actualLocation;
@@ -42273,23 +43417,25 @@ var syncClientBreakpoint = exports.syncC
       generatedLocation: newGeneratedLocation,
       location: newLocation
     });
 
     (0, _breakpoint3.assertBreakpoint)(breakpoint);
     return { breakpoint, previousLocation: location };
   });
 
-  return function syncClientBreakpoint(_x, _x2, _x3, _x4) {
+  return function syncClientBreakpoint(_x, _x2, _x3, _x4, _x5) {
     return _ref.apply(this, arguments);
   };
 })();
 
 var _breakpoint3 = __webpack_require__(1057);
 
+var _sourceMaps = __webpack_require__(797);
+
 var _devtoolsSourceMap = __webpack_require__(898);
 
 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"); }); }; }
 
 /***/ }),
 /* 1138 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -42410,17 +43556,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__(697);
+__webpack_require__(869);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ProjectSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
@@ -42487,43 +43633,49 @@ class ProjectSearch extends _react.Compo
   isSourceSearchEnabled() {
     return this.props.activeSearch === "source";
   }
 
   renderSourceSearch() {
     var _props3 = this.props,
         sources = _props3.sources,
         selectSource = _props3.selectSource,
-        closeActiveSearch = _props3.closeActiveSearch;
+        closeActiveSearch = _props3.closeActiveSearch,
+        sourceSearchQuery = _props3.sourceSearchQuery,
+        setSourceSearchQuery = _props3.setSourceSearchQuery,
+        clearSourceSearchQuery = _props3.clearSourceSearchQuery;
 
     return _react2.default.createElement(_SourceSearch2.default, {
       sources: sources,
       selectSource: selectSource,
       closeActiveSearch: closeActiveSearch,
-      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "sources", toggle: this.toggleProjectTextSearch })
+      searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "sources", toggle: this.toggleProjectTextSearch }),
+      query: sourceSearchQuery,
+      setQuery: setSourceSearchQuery,
+      clearQuery: clearSourceSearchQuery
     });
   }
 
   renderTextSearch() {
     var _props4 = this.props,
         sources = _props4.sources,
         results = _props4.results,
         searchSources = _props4.searchSources,
         closeActiveSearch = _props4.closeActiveSearch,
         selectSource = _props4.selectSource,
-        query = _props4.query;
+        textSearchQuery = _props4.textSearchQuery;
 
 
     return _react2.default.createElement(_TextSearch2.default, {
       sources: sources,
       results: results.valueSeq().toJS(),
       searchSources: searchSources,
       closeActiveSearch: closeActiveSearch,
       selectSource: selectSource,
-      query: query,
+      query: textSearchQuery,
       searchBottomBar: _react2.default.createElement(_ToggleSearch2.default, { kind: "project", toggle: this.toggleSourceSearch })
     });
   }
 
   render() {
     if (!(this.isProjectSearchEnabled() || this.isSourceSearchEnabled())) {
       return null;
     }
@@ -42534,35 +43686,39 @@ class ProjectSearch extends _react.Compo
       this.isProjectSearchEnabled() ? this.renderTextSearch() : this.renderSourceSearch()
     );
   }
 }
 
 ProjectSearch.propTypes = {
   sources: _react.PropTypes.object.isRequired,
   results: _react.PropTypes.object,
-  query: _react.PropTypes.string,
+  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
+  selectSource: _react.PropTypes.func.isRequired,
+  sourceSearchQuery: _react.PropTypes.string,
+  setSourceSearchQuery: _react.PropTypes.func,
+  clearSourceSearchQuery: _react.PropTypes.func
 };
 
 ProjectSearch.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 ProjectSearch.displayName = "ProjectSearch";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearchState)(state),
   results: (0, _selectors.getTextSearchResults)(state),
-  query: (0, _selectors.getTextSearchQuery)(state)
+  textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
+  sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ProjectSearch);
 
 /***/ }),
 /* 1140 */,
 /* 1141 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -42587,20 +43743,16 @@ var _Autocomplete2 = _interopRequireDefa
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
     this.close = this.close.bind(this);
-
-    this.state = {
-      inputValue: ""
-    };
   }
 
   componentWillUnmount() {
     var shortcuts = this.context.shortcuts;
     shortcuts.off("Escape", this.onEscape);
   }
 
   componentDidMount() {
@@ -42620,37 +43772,40 @@ class SourceSearch extends _react.Compon
       value: (0, _source.getSourcePath)(source),
       title: (0, _source.getSourcePath)(source).split("/").pop(),
       subtitle: (0, _utils.endTruncateStr)((0, _source.getSourcePath)(source), 100),
       id: source.id
     }));
   }
 
   close() {
-    this.setState({ inputValue: "" });
+    this.props.clearQuery();
     this.props.closeActiveSearch();
   }
 
   render() {
     var _props = this.props,
         sources = _props.sources,
         searchBottomBar = _props.searchBottomBar,
-        selectSource = _props.selectSource;
+        selectSource = _props.selectSource,
+        query = _props.query,
+        setQuery = _props.setQuery;
 
     return _react2.default.createElement(
       _Autocomplete2.default,
       {
         selectItem: (e, result) => {
           selectSource(result.id);
           this.close();
         },
         close: this.close,
         items: this.searchResults(sources),
-        inputValue: this.state.inputValue,
+        inputValue: query,
         placeholder: L10N.getStr("sourceSearch.search"),
+        onChangeHandler: setQuery,
         size: "big"
       },
       searchBottomBar
     );
   }
 }
 
 exports.default = SourceSearch;
@@ -42668,49 +43823,47 @@ SourceSearch.displayName = "SourceSearch
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 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__(699);
+__webpack_require__(870);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-var _Outline2 = __webpack_require__(1145);
-
-var _Outline3 = _interopRequireDefault(_Outline2);
-
-var _SourcesTree2 = __webpack_require__(1148);
-
-var _SourcesTree3 = _interopRequireDefault(_SourcesTree2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var Outline = (0, _react.createFactory)(_Outline3.default);
-
-var SourcesTree = (0, _react.createFactory)(_SourcesTree3.default);
+var _Outline = __webpack_require__(1145);
+
+var _Outline2 = _interopRequireDefault(_Outline);
+
+var _SourcesTree = __webpack_require__(1148);
+
+var _SourcesTree2 = _interopRequireDefault(_SourcesTree);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PrimaryPanes extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = { selectedPane: "sources" };
 
     this.renderShortcut = this.renderShortcut.bind(this);
@@ -42722,90 +43875,229 @@ class PrimaryPanes extends _react.Compon
     this.setState({ selectedPane });
   }
 
   renderOutlineTabs() {
     if (!(0, _devtoolsConfig.isEnabled)("outline")) {
       return;
     }
 
-    return [_react.DOM.div({
-      className: (0, _classnames2.default)("tab", {
-        active: this.state.selectedPane === "sources"
-      }),
-      onClick: () => this.showPane("sources"),
-      key: "sources-tab"
-    }, "Sources View"), _react.DOM.div({
-      className: (0, _classnames2.default)("tab", {
-        active: this.state.selectedPane === "outline"
-      }),
-      onClick: () => this.showPane("outline"),
-      key: "outline-tab"
-    }, "Outline View")];
+    return [_react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("tab", {
+          active: this.state.selectedPane === "sources"
+        }),
+        onClick: () => this.showPane("sources"),
+        key: "sources-tab"
+      },
+      "Sources View"
+    ), _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("tab", {
+          active: this.state.selectedPane === "outline"
+        }),
+        onClick: () => this.showPane("outline"),
+        key: "outline-tab"
+      },
+      "Outline View"
+    )];
   }
 
   renderFooter() {
-    return _react.DOM.div({
-      className: "source-footer"
-    }, this.renderOutlineTabs());
+    return _react2.default.createElement(
+      "div",
+      { className: "source-footer" },
+      this.renderOutlineTabs()
+    );
   }
 
   renderShortcut() {
     if (this.props.horizontal) {
-      return _react.DOM.span({
-        className: "sources-header-info",
-        dir: "ltr",
-        onClick: () => {
-          if (this.props.sourceSearchOn) {
-            return this.props.closeActiveSearch();
-          }
-          this.props.setActiveSearch("source");
-        }
-      }, L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2"))));
+      var onClick = () => {
+        if (this.props.sourceSearchOn) {
+          return this.props.closeActiveSearch();
+        }
+        this.props.setActiveSearch("source");
+      };
+      return _react2.default.createElement(
+        "span",
+        { className: "sources-header-info", dir: "ltr", onClick: onClick },
+        L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2")))
+      );
     }
   }
 
   renderHeader() {
-    return _react.DOM.div({ className: "sources-header" }, this.renderShortcut());
+    return _react2.default.createElement(
+      "div",
+      { className: "sources-header" },
+      this.renderShortcut()
+    );
   }
 
   render() {
     var selectedPane = this.state.selectedPane;
     var _props = this.props,
         sources = _props.sources,
         selectSource = _props.selectSource;
 
 
-    return _react.DOM.div({ className: "sources-panel" }, this.renderHeader(), SourcesTree({
-      sources,
-      selectSource,
-      isHidden: selectedPane === "outline"
-    }), Outline({ selectSource, isHidden: selectedPane === "sources" }), this.renderFooter());
+    return _react2.default.createElement(
+      "div",
+      { className: "sources-panel" },
+      this.renderHeader(),
+      _react2.default.createElement(_SourcesTree2.default, {
+        sources: sources,
+        selectSource: selectSource,
+        isHidden: selectedPane === "outline"
+      }),
+      _react2.default.createElement(_Outline2.default, {
+        selectSource: selectSource,
+        isHidden: selectedPane === "sources"
+      }),
+      this.renderFooter()
+    );
   }
 }
 
 PrimaryPanes.displayName = "PrimaryPanes";
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   sourceSearchOn: (0, _selectors.getActiveSearchState)(state) === "source"
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(PrimaryPanes);
 
 /***/ }),
-/* 1143 */,
-/* 1144 */,
+/* 1143 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.setSourceSearchQuery = setSourceSearchQuery;
+exports.clearSourceSearchQuery = clearSourceSearchQuery;
+function setSourceSearchQuery(queryString) {
+  return (_ref) => {
+    var dispatch = _ref.dispatch,
+        getState = _ref.getState;
+
+    dispatch({
+      type: "SET_QUERY_STRING",
+      queryString
+    });
+  };
+}
+
+function clearSourceSearchQuery() {
+  return (_ref2) => {
+    var dispatch = _ref2.dispatch,
+        getState = _ref2.getState;
+
+    dispatch({
+      type: "CLEAR_QUERY_STRING"
+    });
+  };
+}
+
+/***/ }),
+/* 1144 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _reactRedux = __webpack_require__(151);
+
+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__(1146);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class EmptyLines extends _react.Component {
+
+  componentDidMount() {
+    this.disableEmptyLines();
+  }
+
+  componentDidUpdate() {
+    this.disableEmptyLines();
+  }
+
+  componentWillUnmount() {
+    var _props = this.props,
+        emptyLines = _props.emptyLines,
+        editor = _props.editor;
+
+
+    if (!emptyLines) {
+      return;
+    }
+    editor.codeMirror.operation(() => {
+      emptyLines.forEach(line => editor.codeMirror.removeLineClass(line, "line", "empty-line"));
+    });
+  }
+
+  disableEmptyLines() {
+    var _props2 = this.props,
+        emptyLines = _props2.emptyLines,
+        editor = _props2.editor;
+
+
+    if (!emptyLines) {
+      return;
+    }
+    editor.codeMirror.operation(() => {
+      emptyLines.forEach(line => editor.codeMirror.addLineClass(line, "line", "empty-line"));
+    });
+  }
+
+  render() {
+    return null;
+  }
+}
+
+EmptyLines.displayName = "EmptyLines";
+
+exports.default = (0, _reactRedux.connect)(state => {
+  var selectedSource = (0, _selectors.getSelectedSource)(state);
+  return {
+    selectedSource,
+    emptyLines: selectedSource ? (0, _selectors.getEmptyLines)(state, selectedSource.toJS()) : []
+  };
+}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EmptyLines);
+
+/***/ }),
 /* 1145 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.Outline = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
@@ -42817,31 +44109,26 @@ var _classnames2 = _interopRequireDefaul
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-__webpack_require__(700);
-
-var _previewFunction = __webpack_require__(701);
-
-var _previewFunction2 = _interopRequireDefault(_previewFunction);
+__webpack_require__(871);
+
+var _PreviewFunction = __webpack_require__(798);
+
+var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
 
-  constructor(props) {
-    super(props);
-    this.state = {};
-  }
-
   selectItem(location) {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         selectSource = _props.selectSource;
 
     if (!selectedSource) {
       return;
     }
@@ -42857,17 +44144,17 @@ class Outline extends _react.Component {
 
     return _react2.default.createElement(
       "li",
       {
         key: `${name}:${location.start.line}:${location.start.column}`,
         className: "outline-list__element",
         onClick: () => this.selectItem(location)
       },
-      (0, _previewFunction2.default)({ name })
+      _react2.default.createElement(_PreviewFunction2.default, { func: { name } })
     );
   }
 
   renderFunctions() {
     var symbols = this.props.symbols;
 
 
     return symbols.functions.filter(func => func.name != "anonymous").map(func => this.renderFunction(func));
@@ -42887,62 +44174,130 @@ class Outline extends _react.Component {
         "ul",
         { className: "outline-list" },
         this.renderFunctions()
       )
     );
   }
 }
 
+exports.Outline = Outline;
 Outline.displayName = "Outline";
 
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
     symbols: (0, _selectors.getSymbols)(state, selectedSource && selectedSource.toJS()),
     selectedSource
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Outline);
 
 /***/ }),
-/* 1146 */,
-/* 1147 */,
+/* 1146 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1147 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Workers = undefined;
+
+var _react = __webpack_require__(0);
+
+var _react2 = _interopRequireDefault(_react);
+
+__webpack_require__(1149);
+
+var _reactRedux = __webpack_require__(151);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class Workers extends _react.PureComponent {
+  renderWorkers(workers) {
+    return workers.map(w => _react2.default.createElement(
+      "div",
+      null,
+      w
+    ));
+  }
+
+  renderNoWorkersPlaceholder() {
+    return L10N.getStr("noWorkersText");
+  }
+
+  render() {
+    var workers = this.props.workers;
+
+    return _react2.default.createElement(
+      "div",
+      { className: "pane" },
+      _react2.default.createElement(
+        "div",
+        { className: "pane-info" },
+        workers && workers.length > 0 ? this.renderWorkers(workers) : this.renderNoWorkersPlaceholder()
+      )
+    );
+  }
+}
+
+exports.Workers = Workers;
+Workers.displayName = "Workers";
+Workers.propTypes = {
+  workers: _react.PropTypes.array.isRequired
+};
+
+function mapStateToProps(state) {
+  return { workers: [] };
+}
+exports.default = (0, _reactRedux.connect)(mapStateToProps)(Workers);
+
+/***/ }),
 /* 1148 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 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 _selectors = __webpack_require__(242);
 
 var _sourcesTree = __webpack_require__(39);
 
-var _ManagedTree2 = __webpack_require__(419);
-
-var _ManagedTree3 = _interopRequireDefault(_ManagedTree2);
+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);
@@ -42950,18 +44305,16 @@ var _Svg2 = _interopRequireDefault(_Svg)
 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 }; }
 
-var ManagedTree = (0, _react.createFactory)(_ManagedTree3.default);
-
 class SourcesTree extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = (0, _sourcesTree.createTree)(this.props.sources, this.props.debuggeeUrl);
 
     this.focusItem = this.focusItem.bind(this);
     this.selectItem = this.selectItem.bind(this);
@@ -43060,24 +44413,24 @@ class SourcesTree extends _react.Compone
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
   getIcon(item, depth) {
     if (depth === 0) {
-      return (0, _Svg2.default)("domain");
+      return _react2.default.createElement(_Svg2.default, { name: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
-      return (0, _Svg2.default)("file");
-    }
-
-    return (0, _Svg2.default)("folder");
+      return _react2.default.createElement(_Svg2.default, { name: "file" });
+    }
+
+    return _react2.default.createElement(_Svg2.default, { name: "folder" });
   }
 
   onContextMenu(event, item) {
     var copySourceUrlLabel = L10N.getStr("copySourceUrl");
     var copySourceUrlKey = L10N.getStr("copySourceUrl.accesskey");
 
     event.stopPropagation();
     event.preventDefault();
@@ -43098,94 +44451,107 @@ class SourcesTree extends _react.Compone
     }
 
     (0, _devtoolsLaunchpad.showMenu)(event, menuOptions);
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
-    var arrow = (0, _Svg2.default)("arrow", {
+    var arrow = _react2.default.createElement(_Svg2.default, {
+      name: "arrow",
       className: (0, _classnames2.default)({
         expanded: expanded,
         hidden: !(0, _sourcesTree.nodeHasChildren)(item)
       }),
       onClick: e => {
         e.stopPropagation();
         setExpanded(item, !expanded);
       }
     });
 
     var icon = this.getIcon(item, depth);
     var paddingDir = "paddingRight";
     if (document.body && document.body.parentElement) {
       paddingDir = document.body.parentElement.dir == "ltr" ? "paddingLeft" : "paddingRight";
     }
 
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("node", { focused }),
-      style: { [paddingDir]: `${depth * 15}px` },
-      key: item.path,
-      onClick: () => {
-        this.selectItem(item);
-        setExpanded(item, !expanded);
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("node", { focused }),
+        style: { [paddingDir]: `${depth * 15}px` },
+        key: item.path,
+        onClick: () => {
+          this.selectItem(item);
+          setExpanded(item, !expanded);
+        },
+        onContextMenu: e => this.onContextMenu(e, item)
       },
-      onContextMenu: e => this.onContextMenu(e, item)
-    }, _react.DOM.div(null, arrow, icon, item.name));
+      _react2.default.createElement(
+        "div",
+        null,
+        arrow,
+        icon,
+        item.name
+      )
+    );
   }
 
   render() {
     var isHidden = this.props.isHidden;
     var _state = this.state,
         focusedItem = _state.focusedItem,
         sourceTree = _state.sourceTree,
         parentMap = _state.parentMap,
         listItems = _state.listItems,
         highlightItems = _state.highlightItems;
 
 
     var isEmpty = sourceTree.contents.length === 0;
 
-    var tree = ManagedTree({
+    var treeProps = {
       key: isEmpty ? "empty" : "full",
-      getParent: item => {
-        return parentMap.get(item);
-      },
-      getChildren: item => {
-        if ((0, _sourcesTree.nodeHasChildren)(item)) {
-          return item.contents;
-        }
-        return [];
-      },
+      getParent: item => parentMap.get(item),
+      getChildren: item => (0, _sourcesTree.nodeHasChildren)(item) ? item.contents : [],
       getRoots: () => sourceTree.contents,
       getPath: item => `${item.path}/${item.name}`,
       itemHeight: 21,
       autoExpandDepth: 1,
       autoExpandAll: false,
       onFocus: this.focusItem,
       listItems,
       highlightItems,
       renderItem: this.renderItem
-    });
-
-    var noSourcesMessage = _react.DOM.div({
-      className: "no-sources-message"
-    }, L10N.getStr("sources.noSourcesAvailable"));
+    };
+
+    var tree = _react2.default.createElement(_ManagedTree2.default, treeProps);
 
     if (isEmpty) {
-      return noSourcesMessage;
-    }
-    return _react.DOM.div({
-      className: (0, _classnames2.default)("sources-list", { hidden: isHidden }),
-      onKeyDown: e => {
-        if (e.keyCode === 13 && focusedItem) {
-          this.selectItem(focusedItem);
-        }
-      }
-    }, tree);
+      return _react2.default.createElement(
+        "div",
+        { className: "no-sources-message" },
+        L10N.getStr("sources.noSourcesAvailable")
+      );
+    }
+
+    var onKeyDown = e => {
+      if (e.keyCode === 13 && focusedItem) {
+        this.selectItem(focusedItem);
+      }
+    };
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("sources-list", { hidden: isHidden }),
+        onKeyDown: onKeyDown
+      },
+      tree
+    );
   }
 }
 
 SourcesTree.propTypes = {
   isHidden: _react.PropTypes.bool,
   sources: _reactImmutableProptypes2.default.map.isRequired,
   selectSource: _react.PropTypes.func.isRequired,
   shownSource: _react.PropTypes.string,
@@ -43199,17 +44565,22 @@ exports.default = (0, _reactRedux.connec
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
     debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
 
 /***/ }),
-/* 1149 */,
+/* 1149 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1150 */,
 /* 1151 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -43270,17 +44641,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__(708);
+__webpack_require__(878);
 
 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;
@@ -44164,22 +45535,24 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _visibleBreakpoints = __webpack_require__(1135);
 
 var _visibleBreakpoints2 = _interopRequireDefault(_visibleBreakpoints);
 
 var _breakpoint = __webpack_require__(1057);
 
+var _source = __webpack_require__(233);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Breakpoints extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
-    if (nextProps.selectedSource && nextProps.selectedSource.get("loading")) {
+    if (nextProps.selectedSource && !(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
       return false;
     }
 
     return true;
   }
 
   render() {
     var _props = this.props,
@@ -44224,40 +45597,40 @@ exports.default = (0, _reactRedux.connec
 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 _react = __webpack_require__(0);
 
+var _react2 = _interopRequireDefault(_react);
+
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
 var _devtoolsConfig = __webpack_require__(828);
 
 var _lodash = __webpack_require__(2);
 
-var _CallSite2 = __webpack_require__(1167);
-
-var _CallSite3 = _interopRequireDefault(_CallSite2);
+var _CallSite = __webpack_require__(1167);
+
+var _CallSite2 = _interopRequireDefault(_CallSite);
 
 var _selectors = __webpack_require__(242);
 
 var _editor = __webpack_require__(257);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-var CallSite = (0, _react.createFactory)(_CallSite3.default);
-
 function getCallSiteAtLocation(callSites, location) {
   return (0, _lodash.find)(callSites, callSite => (0, _lodash.isEqualWith)(callSite.location, location, (cloc, loc) => {
     return loc.line === cloc.start.line && loc.column >= cloc.start.column && loc.column <= cloc.end.column;
   }));
 }
 
 class CallSites extends _react.Component {
 
@@ -44307,27 +45680,27 @@ class CallSites extends _react.Component
 
   onTokenClick(e) {
     var target = e.target;
     var _props = this.props,
         editor = _props.editor,
         selectedLocation = _props.selectedLocation;
 
 
-    if (!(0, _devtoolsConfig.isEnabled)("columnBreakpoints") || !e.altKey || !target.classList.contains("call-site") && !target.classList.contains("call-site-bp")) {
+    if (!(0, _devtoolsConfig.isEnabled)("columnBreakpoints") || !e.altKey && !target.classList.contains("call-site-bp") || !target.classList.contains("call-site") && !target.classList.contains("call-site-bp")) {
       return;
     }
 
     var sourceId = selectedLocation.sourceId;
 
     var _getTokenLocation = (0, _editor.getTokenLocation)(editor.codeMirror, target),
         line = _getTokenLocation.line,
         column = _getTokenLocation.column;
 
-    this.toggleBreakpoint((0, _editor.toSourceLine)(sourceId, line), (0, _editor.isWasm)(sourceId) ? undefined : column - 2);
+    this.toggleBreakpoint(line, (0, _editor.isWasm)(sourceId) ? undefined : column);
   }
 
   toggleBreakpoint(line) {
     var column = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         selectedLocation = _props2.selectedLocation,
         addBreakpoint = _props2.addBreakpoint,
@@ -44376,26 +45749,32 @@ class CallSites extends _react.Component
     var showCallSites = this.state.showCallSites;
 
     var sites = void 0;
     if (!callSites) {
       return null;
     }
 
     editor.codeMirror.operation(() => {
-      sites = _react.DOM.div({}, callSites.map((callSite, index) => {
-        return CallSite({
+      var childCallSites = callSites.map((callSite, index) => {
+        var props = {
           key: index,
           callSite,
           editor,
           source: selectedSource,
           breakpoint: callSite.breakpoint,
           showCallSite: showCallSites
-        });
-      }));
+        };
+        return _react2.default.createElement(_CallSite2.default, props);
+      });
+      sites = _react2.default.createElement(
+        "div",
+        null,
+        childCallSites
+      );
     });
     return sites;
   }
 }
 
 CallSites.displayName = "CallSites";
 function getCallSites(symbols, breakpoints) {
   if (!symbols || !symbols.callExpressions) {
@@ -44473,17 +45852,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(713);
+__webpack_require__(882);
 
 class CallSite extends _react.Component {
 
   constructor() {
     super();
 
     this.marker = undefined;
     var self = this;
@@ -44531,19 +45910,21 @@ class CallSite extends _react.Component 
   componentWillReceiveProps(nextProps) {
     var _props2 = this.props,
         breakpoint = _props2.breakpoint,
         showCallSite = _props2.showCallSite;
 
 
     if (nextProps.breakpoint !== breakpoint) {
       if (this.marker) {
-        this.marker.clear();
-      }
-      this.addCallSite(nextProps);
+        this.clearCallSite();
+      }
+      if (nextProps.showCallSite) {
+        this.addCallSite(nextProps);
+      }
     }
 
     if (nextProps.showCallSite !== showCallSite) {
       if (nextProps.showCallSite) {
         if (!this.marker) {
           this.addCallSite();
         }
       } else if (!nextProps.breakpoint) {
@@ -44605,17 +45986,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__(738);
+__webpack_require__(962);
 
 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}`,
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -2285,52 +2285,17 @@ module.exports = invariant;
 /* 188 */,
 /* 189 */,
 /* 190 */,
 /* 191 */,
 /* 192 */,
 /* 193 */,
 /* 194 */,
 /* 195 */,
-/* 196 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseToPairs = __webpack_require__(796),
-    getTag = __webpack_require__(198),
-    mapToArray = __webpack_require__(203),
-    setToPairs = __webpack_require__(204);
-
-/** `Object#toString` result references. */
-var mapTag = '[object Map]',
-    setTag = '[object Set]';
-
-/**
- * Creates a `_.toPairs` or `_.toPairsIn` function.
- *
- * @private
- * @param {Function} keysFunc The function to get the keys of a given object.
- * @returns {Function} Returns the new pairs function.
- */
-function createToPairs(keysFunc) {
-  return function(object) {
-    var tag = getTag(object);
-    if (tag == mapTag) {
-      return mapToArray(object);
-    }
-    if (tag == setTag) {
-      return setToPairs(object);
-    }
-    return baseToPairs(object, keysFunc(object));
-  };
-}
-
-module.exports = createToPairs;
-
-
-/***/ }),
+/* 196 */,
 /* 197 */,
 /* 198 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var DataView = __webpack_require__(199),
     Map = __webpack_require__(101),
     Promise = __webpack_require__(200),
     Set = __webpack_require__(201),
@@ -2462,40 +2427,17 @@ function mapToArray(map) {
   });
   return result;
 }
 
 module.exports = mapToArray;
 
 
 /***/ }),
-/* 204 */
-/***/ (function(module, exports) {
-
-/**
- * Converts `set` to its value-value pairs.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the value-value pairs.
- */
-function setToPairs(set) {
-  var index = -1,
-      result = Array(set.size);
-
-  set.forEach(function(value) {
-    result[++index] = [value, value];
-  });
-  return result;
-}
-
-module.exports = setToPairs;
-
-
-/***/ }),
+/* 204 */,
 /* 205 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var arrayLikeKeys = __webpack_require__(206),
     baseKeys = __webpack_require__(217),
     isArrayLike = __webpack_require__(220);
 
 /**
@@ -3590,20 +3532,102 @@ function stubArray() {
 
 module.exports = stubArray;
 
 
 /***/ }),
 /* 291 */,
 /* 292 */,
 /* 293 */,
-/* 294 */,
+/* 294 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsEqual = __webpack_require__(799),
+    get = __webpack_require__(67),
+    hasIn = __webpack_require__(837),
+    isKey = __webpack_require__(71),
+    isStrictComparable = __webpack_require__(801),
+    matchesStrictComparable = __webpack_require__(803),
+    toKey = __webpack_require__(111);
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/**
+ * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
+function baseMatchesProperty(path, srcValue) {
+  if (isKey(path) && isStrictComparable(srcValue)) {
+    return matchesStrictComparable(toKey(path), srcValue);
+  }
+  return function(object) {
+    var objValue = get(object, path);
+    return (objValue === undefined && objValue === srcValue)
+      ? hasIn(object, path)
+      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+  };
+}
+
+module.exports = baseMatchesProperty;
+
+
+/***/ }),
 /* 295 */,
 /* 296 */,
-/* 297 */,
+/* 297 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var castPath = __webpack_require__(69),
+    isArguments = __webpack_require__(208),
+    isArray = __webpack_require__(70),
+    isIndex = __webpack_require__(117),
+    isLength = __webpack_require__(214),
+    toKey = __webpack_require__(111);
+
+/**
+ * Checks if `path` exists on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @param {Function} hasFunc The function to check properties.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ */
+function hasPath(object, path, hasFunc) {
+  path = castPath(path, object);
+
+  var index = -1,
+      length = path.length,
+      result = false;
+
+  while (++index < length) {
+    var key = toKey(path[index]);
+    if (!(result = object != null && hasFunc(object, key))) {
+      break;
+    }
+    object = object[key];
+  }
+  if (result || ++index != length) {
+    return result;
+  }
+  length = object == null ? 0 : object.length;
+  return !!length && isLength(length) && isIndex(key, length) &&
+    (isArray(object) || isArguments(object));
+}
+
+module.exports = hasPath;
+
+
+/***/ }),
 /* 298 */
 /***/ (function(module, exports) {
 
 /**
  * This method returns the first argument it receives.
  *
  * @static
  * @since 0.1.0
@@ -4097,17 +4121,55 @@ var baseCreate = (function() {
     return result;
   };
 }());
 
 module.exports = baseCreate;
 
 
 /***/ }),
-/* 404 */,
+/* 404 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArrayLike = __webpack_require__(220),
+    isObjectLike = __webpack_require__(14);
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+  return isObjectLike(value) && isArrayLike(value);
+}
+
+module.exports = isArrayLikeObject;
+
+
+/***/ }),
 /* 405 */,
 /* 406 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var assignValue = __webpack_require__(114),
     baseAssignValue = __webpack_require__(115);
 
 /**
@@ -12370,17 +12432,17 @@ var global = module.exports = typeof win
   : Function('return this')();
 if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef