To delete draft
authorNicolas Chevobbe <nchevobbe@mozilla.com>
Mon, 31 Jul 2017 15:29:00 +0200
changeset 618442 6cefd789cbf6e7e4f56fe6d2c328c864243dece7
parent 618288 a6c502679d442596b8b4410d6413cd310ac46408
child 618443 1b50d44595506f0c893be0ebfbce3c10641b5229
push id71330
push userbmo:nchevobbe@mozilla.com
push dateMon, 31 Jul 2017 13:29:53 +0000
milestone56.0a1
To delete MozReview-Commit-ID: 3MIq3raS9hn
devtools/client/shared/components/reps/reps.css
devtools/client/shared/components/reps/reps.js
--- a/devtools/client/shared/components/reps/reps.css
+++ b/devtools/client/shared/components/reps/reps.css
@@ -249,8 +249,12 @@ html[dir="rtl"] .arrow svg,
 
 .arrow.expanded.expanded svg {
   transform: rotate(0deg);
 }
 
 .object-label {
   color: var(--theme-highlight-blue);
 }
+
+.default-property {
+  opacity: 0.6;
+}
--- a/devtools/client/shared/components/reps/reps.js
+++ b/devtools/client/shared/components/reps/reps.js
@@ -55,17 +55,17 @@ return /******/ (function(modules) { // 
 /***/ function(module, exports, __webpack_require__) {
 
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 	const { MODE } = __webpack_require__(1);
 	const { REPS, getRep } = __webpack_require__(2);
-	const ObjectInspector = __webpack_require__(44);
+	const ObjectInspector = __webpack_require__(45);
 
 	const {
 	  parseURLEncodedText,
 	  parseURLParams,
 	  maybeEscapePropertyName,
 	  getGripPreviewItems
 	} = __webpack_require__(7);
 
@@ -133,22 +133,23 @@ return /******/ (function(modules) { // 
 	const ElementNode = __webpack_require__(32);
 	const TextNode = __webpack_require__(37);
 	const ErrorRep = __webpack_require__(38);
 	const Window = __webpack_require__(39);
 	const ObjectWithText = __webpack_require__(40);
 	const ObjectWithURL = __webpack_require__(41);
 	const GripArray = __webpack_require__(42);
 	const GripMap = __webpack_require__(43);
+	const GripMapEntry = __webpack_require__(44);
 	const Grip = __webpack_require__(17);
 
 	// List of all registered template.
 	// XXX there should be a way for extensions to register a new
 	// or modify an existing rep.
-	let reps = [RegExp, StyleSheet, Event, DateTime, CommentNode, ElementNode, TextNode, Attribute, LongStringRep, Func, PromiseRep, ArrayRep, Document, Window, ObjectWithText, ObjectWithURL, ErrorRep, GripArray, GripMap, Grip, Undefined, Null, StringRep, Number, SymbolRep, InfinityRep, NaNRep, Accessor];
+	let reps = [RegExp, StyleSheet, Event, DateTime, CommentNode, ElementNode, TextNode, Attribute, LongStringRep, Func, PromiseRep, ArrayRep, Document, Window, ObjectWithText, ObjectWithURL, ErrorRep, GripArray, GripMap, GripMapEntry, Grip, Undefined, Null, StringRep, Number, SymbolRep, InfinityRep, NaNRep, Accessor];
 
 	/**
 	 * Generic rep that is using for rendering native JS types or an object.
 	 * The right template used for rendering is picked automatically according
 	 * to the current value type. The value must be passed is as 'object'
 	 * property.
 	 */
 	const Rep = function (props) {
@@ -215,16 +216,17 @@ return /******/ (function(modules) { // 
 	    Document,
 	    ElementNode,
 	    ErrorRep,
 	    Event,
 	    Func,
 	    Grip,
 	    GripArray,
 	    GripMap,
+	    GripMapEntry,
 	    InfinityRep,
 	    LongStringRep,
 	    NaNRep,
 	    Null,
 	    Number,
 	    Obj,
 	    ObjectWithText,
 	    ObjectWithURL,
@@ -1272,16 +1274,17 @@ return /******/ (function(modules) { // 
 	  // or another object for maps and weakmaps.
 	  if (typeof name === "string") {
 	    if (!suppressQuotes) {
 	      name = maybeEscapePropertyName(name);
 	    }
 	    key = span({ "className": "nodeName" }, name);
 	  } else {
 	    key = Rep(Object.assign({}, props, {
+	      className: "nodeName",
 	      object: name,
 	      mode: mode || MODE.TINY,
 	      defaultRep: Grip
 	    }));
 	  }
 
 	  return [key, span({
 	    "className": "objectEqual"
@@ -1337,21 +1340,17 @@ return /******/ (function(modules) { // 
 	  } = props;
 
 	  const config = {
 	    "data-link-actor-id": object.actor,
 	    className: "objectBox objectBox-object"
 	  };
 
 	  if (mode === MODE.TINY) {
-	    let propertiesLength = object.preview && object.preview.ownPropertiesLength ? object.preview.ownPropertiesLength : object.ownPropertyLength;
-
-	    if (object.preview && object.preview.safeGetterValues) {
-	      propertiesLength += Object.keys(object.preview.safeGetterValues).length;
-	    }
+	    let propertiesLength = getPropertiesLength(object);
 
 	    const tinyModeItems = [];
 	    if (getTitle(props, object) !== DEFAULT_TITLE) {
 	      tinyModeItems.push(getTitleElement(props, object));
 	    } else {
 	      tinyModeItems.push(span({
 	        className: "objectLeftBrace"
 	      }, "{"), propertiesLength > 0 ? span({
@@ -1380,16 +1379,30 @@ return /******/ (function(modules) { // 
 	    className: "objectTitle"
 	  }, getTitle(props, object));
 	}
 
 	function getTitle(props, object) {
 	  return props.title || object.class || DEFAULT_TITLE;
 	}
 
+	function getPropertiesLength(object) {
+	  let propertiesLength = object.preview && object.preview.ownPropertiesLength ? object.preview.ownPropertiesLength : object.ownPropertyLength;
+
+	  if (object.preview && object.preview.safeGetterValues) {
+	    propertiesLength += Object.keys(object.preview.safeGetterValues).length;
+	  }
+
+	  if (object.preview && object.preview.ownSymbols) {
+	    propertiesLength += object.preview.ownSymbolsLength;
+	  }
+
+	  return propertiesLength;
+	}
+
 	function safePropIterator(props, object, max) {
 	  max = typeof max === "undefined" ? maxLengthMap.get(MODE.SHORT) : max;
 	  try {
 	    return propIterator(props, object, max);
 	  } catch (err) {
 	    console.error(err);
 	  }
 	  return [];
@@ -1407,37 +1420,57 @@ return /******/ (function(modules) { // 
 	  }
 
 	  // Property filter. Show only interesting properties to the user.
 	  let isInterestingProp = props.isInterestingProp || ((type, value) => {
 	    return type == "boolean" || type == "number" || type == "string" && value.length != 0;
 	  });
 
 	  let properties = object.preview ? object.preview.ownProperties : {};
-	  let propertiesLength = object.preview && object.preview.ownPropertiesLength ? object.preview.ownPropertiesLength : object.ownPropertyLength;
+	  let propertiesLength = getPropertiesLength(object);
 
 	  if (object.preview && object.preview.safeGetterValues) {
 	    properties = Object.assign({}, properties, object.preview.safeGetterValues);
-	    propertiesLength += Object.keys(object.preview.safeGetterValues).length;
 	  }
 
 	  let indexes = getPropIndexes(properties, max, isInterestingProp);
 	  if (indexes.length < max && indexes.length < propertiesLength) {
 	    // There are not enough props yet. Then add uninteresting props to display them.
 	    indexes = indexes.concat(getPropIndexes(properties, max - indexes.length, (t, value, name) => {
 	      return !isInterestingProp(t, value, name);
 	    }));
 	  }
 
 	  // The server synthesizes some property names for a Proxy, like
 	  // <target> and <handler>; we don't want to quote these because,
 	  // as synthetic properties, they appear more natural when
 	  // unquoted.
 	  const suppressQuotes = object.class === "Proxy";
 	  let propsArray = getProps(props, properties, indexes, suppressQuotes);
+
+	  // Show symbols.
+	  if (object.preview && object.preview.ownSymbols) {
+	    const { ownSymbols } = object.preview;
+	    const length = max - indexes.length;
+
+	    const symbolsProps = ownSymbols.slice(0, length).map(symbolItem => {
+	      return PropRep(Object.assign({}, props, {
+	        mode: MODE.TINY,
+	        name: symbolItem,
+	        object: symbolItem.descriptor.value,
+	        equal: ": ",
+	        defaultRep: Grip,
+	        title: null,
+	        suppressQuotes
+	      }));
+	    });
+
+	    propsArray.push(...symbolsProps);
+	  }
+
 	  if (Object.keys(properties).length > max || propertiesLength > max
 	  // When the object has non-enumerable properties, we don't have them in the packet,
 	  // but we might want to show there's something in the object.
 	  || propertiesLength > propsArray.length) {
 	    // There are some undisplayed props. Then display "more...".
 	    propsArray.push(span({
 	      key: "more",
 	      className: "more-ellipsis",
@@ -1551,17 +1584,18 @@ return /******/ (function(modules) { // 
 	  return value;
 	}
 
 	// Registration
 	function supportsObject(object, type, noGrip = false) {
 	  if (noGrip === true || !isGrip(object)) {
 	    return false;
 	  }
-	  return object.preview && object.preview.ownProperties;
+
+	  return object.preview ? typeof object.preview.ownProperties !== "undefined" : typeof object.ownPropertyLength !== "undefined";
 	}
 
 	const maxLengthMap = new Map();
 	maxLengthMap.set(MODE.SHORT, 3);
 	maxLengthMap.set(MODE.LONG, 10);
 
 	// Grip is used in propIterator and has to be defined here.
 	let Grip = {
@@ -1592,20 +1626,23 @@ return /******/ (function(modules) { // 
 	/**
 	 * Renders a symbol.
 	 */
 	SymbolRep.propTypes = {
 	  object: React.PropTypes.object.isRequired
 	};
 
 	function SymbolRep(props) {
-	  let { object } = props;
+	  let {
+	    className = "objectBox objectBox-symbol",
+	    object
+	  } = props;
 	  let { name } = object;
 
-	  return span({ className: "objectBox objectBox-symbol" }, `Symbol(${name || ""})`);
+	  return span({ className }, `Symbol(${name || ""})`);
 	}
 
 	function supportsObject(object, type) {
 	  return type == "symbol";
 	}
 
 	// Exports from this module
 	module.exports = {
@@ -3488,17 +3525,17 @@ return /******/ (function(modules) { // 
 	  });
 
 	  return indexes.map((index, i) => {
 	    let [key, entryValue] = entries[index];
 	    let value = entryValue.value !== undefined ? entryValue.value : entryValue;
 
 	    return PropRep({
 	      name: key,
-	      equal: ": ",
+	      equal: " \u2192 ",
 	      object: value,
 	      mode: MODE.TINY,
 	      onDOMNodeMouseOver,
 	      onDOMNodeMouseOut,
 	      onInspectIconClick
 	    });
 	  });
 	}
@@ -3549,45 +3586,126 @@ return /******/ (function(modules) { // 
 /***/ },
 /* 44 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+	// Dependencies
+	const React = __webpack_require__(8);
+	// Shortcuts
+	const { span } = React.DOM;
+	const {
+	  wrapRender
+	} = __webpack_require__(7);
+	const PropRep = __webpack_require__(16);
+	const { MODE } = __webpack_require__(1);
+	/**
+	 * Renders an map entry. A map entry is represented by its key, a column and its value.
+	 */
+	GripMapEntry.propTypes = {
+	  object: React.PropTypes.object,
+	  // @TODO Change this to Object.values once it's supported in Node's version of V8
+	  mode: React.PropTypes.oneOf(Object.keys(MODE).map(key => MODE[key])),
+	  onDOMNodeMouseOver: React.PropTypes.func,
+	  onDOMNodeMouseOut: React.PropTypes.func,
+	  onInspectIconClick: React.PropTypes.func
+	};
+
+	function GripMapEntry(props) {
+	  const {
+	    object
+	  } = props;
+
+	  const {
+	    key,
+	    value
+	  } = object.preview;
+
+	  return span({
+	    className: "objectBox objectBox-map-entry"
+	  }, ...PropRep(Object.assign({}, props, {
+	    name: key,
+	    object: value,
+	    equal: " \u2192 ",
+	    title: null,
+	    suppressQuotes: false
+	  })));
+	}
+
+	function supportsObject(grip, type, noGrip = false) {
+	  if (noGrip === true) {
+	    return false;
+	  }
+	  return grip && grip.type === "mapEntry" && grip.preview;
+	}
+
+	function createGripMapEntry(key, value) {
+	  return {
+	    type: "mapEntry",
+	    preview: {
+	      key,
+	      value
+	    }
+	  };
+	}
+
+	// Exports from this module
+	module.exports = {
+	  rep: wrapRender(GripMapEntry),
+	  createGripMapEntry,
+	  supportsObject
+	};
+
+/***/ },
+/* 45 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* This Source Code Form is subject to the terms of the Mozilla Public
+	 * License, v. 2.0. If a copy of the MPL was not distributed with this
+	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
 	const {
 	  Component,
 	  createFactory,
 	  DOM: dom,
 	  PropTypes
 	} = __webpack_require__(8);
 
-	const Tree = createFactory(__webpack_require__(45).Tree);
-	__webpack_require__(47);
-
-	const classnames = __webpack_require__(49);
+	const Tree = createFactory(__webpack_require__(46).Tree);
+	__webpack_require__(48);
+
+	const classnames = __webpack_require__(50);
 	const Svg = __webpack_require__(33);
 	const {
-	  REPS: { Rep }
+	  REPS: {
+	    Rep,
+	    Grip
+	  }
 	} = __webpack_require__(2);
 	const {
 	  MODE
 	} = __webpack_require__(1);
 
 	const {
 	  getChildren,
+	  getParent,
 	  getValue,
-	  isDefault,
+	  nodeHasAllEntriesInPreview,
+	  nodeIsDefault,
 	  nodeHasAccessors,
 	  nodeHasProperties,
+	  nodeIsEntries,
+	  nodeIsMapEntry,
 	  nodeIsMissingArguments,
 	  nodeIsOptimizedOut,
 	  nodeIsPrimitive
-	} = __webpack_require__(50);
+	} = __webpack_require__(51);
 
 	// This implements a component that renders an interactive inspector
 	// for looking at JavaScript objects. It expects descriptions of
 	// objects from the protocol, and will dynamically fetch child
 	// properties as objects are expanded.
 	//
 	// If you want to inspect a single object, pass the name and the
 	// protocol descriptor of it:
@@ -3627,28 +3745,28 @@ return /******/ (function(modules) { // 
 	    self.renderTreeItem = this.renderTreeItem.bind(this);
 	    self.setExpanded = this.setExpanded.bind(this);
 	    self.focusItem = this.focusItem.bind(this);
 	    self.getRoots = this.getRoots.bind(this);
 	  }
 
 	  isDefaultProperty(item) {
 	    const roots = this.props.roots;
-	    return isDefault(item, roots);
-	  }
-
-	  getParent(item) {
-	    return null;
+	    return nodeIsDefault(item, roots);
 	  }
 
 	  getChildren(item) {
-	    const { getObjectProperties } = this.props;
+	    const {
+	      getObjectEntries,
+	      getObjectProperties
+	    } = this.props;
 	    const { actors } = this;
 
 	    return getChildren({
+	      getObjectEntries,
 	      getObjectProperties,
 	      actors,
 	      item
 	    });
 	  }
 
 	  getRoots() {
 	    return this.props.roots;
@@ -3668,22 +3786,33 @@ return /******/ (function(modules) { // 
 	      expandedKeys.delete(key);
 	    }
 
 	    this.setState({ expandedKeys });
 
 	    if (expand === true) {
 	      const {
 	        getObjectProperties,
-	        loadObjectProperties
+	        getObjectEntries,
+	        loadObjectProperties,
+	        loadObjectEntries
 	      } = this.props;
 
 	      const value = getValue(item);
+	      const parent = getParent(item);
+	      const parentValue = getValue(parent);
+	      const parentActor = parentValue ? parentValue.actor : null;
+
 	      if (nodeHasProperties(item) && value && !getObjectProperties(value.actor)) {
 	        loadObjectProperties(value);
+	        return;
+	      }
+
+	      if (nodeIsEntries(item) && !nodeHasAllEntriesInPreview(parent) && !getObjectEntries(parentActor)) {
+	        loadObjectEntries(parentValue);
 	      }
 	    }
 	  }
 
 	  focusItem(item) {
 	    if (!this.props.disabledFocus && this.state.focusedItem !== item) {
 	      this.setState({
 	        focusedItem: item
@@ -3703,25 +3832,28 @@ return /******/ (function(modules) { // 
 	    const isPrimitive = nodeIsPrimitive(item);
 
 	    const unavailable = isPrimitive && itemValue && itemValue.hasOwnProperty && itemValue.hasOwnProperty("unavailable");
 
 	    if (nodeIsOptimizedOut(item)) {
 	      objectValue = dom.span({ className: "unavailable" }, "(optimized away)");
 	    } else if (nodeIsMissingArguments(item) || unavailable) {
 	      objectValue = dom.span({ className: "unavailable" }, "(unavailable)");
-	    } else if (nodeHasProperties(item) || nodeHasAccessors(item) || isPrimitive) {
+	    } else if (nodeHasProperties(item) || nodeHasAccessors(item) || nodeIsMapEntry(item) || isPrimitive) {
 	      let repsProp = Object.assign({}, this.props);
 	      if (depth > 0) {
 	        repsProp.mode = this.props.mode === MODE.LONG ? MODE.SHORT : MODE.TINY;
 	      }
 
 	      objectValue = this.renderGrip(item, repsProp);
 	    }
 
+	    const hasLabel = label !== null && typeof label !== "undefined";
+	    const hasValue = typeof objectValue !== "undefined";
+
 	    const SINGLE_INDENT_WIDTH = 15;
 	    const indentWidth = (depth + (isPrimitive ? 1 : 0)) * SINGLE_INDENT_WIDTH;
 
 	    const {
 	      onDoubleClick,
 	      onLabelClick
 	    } = this.props;
 
@@ -3744,35 +3876,36 @@ return /******/ (function(modules) { // 
 	          focused,
 	          expanded
 	        });
 	      } : null
 	    }, isPrimitive === false ? Svg("arrow", {
 	      className: classnames({
 	        expanded: expanded
 	      })
-	    }) : null, label ? dom.span({
+	    }) : null, hasLabel ? dom.span({
 	      className: "object-label",
 	      onClick: onLabelClick ? event => {
 	        event.stopPropagation();
 	        onLabelClick(item, {
 	          depth,
 	          focused,
 	          expanded,
 	          setExpanded: this.setExpanded
 	        });
 	      } : null
-	    }, label) : null, label && objectValue ? dom.span({ className: "object-delimiter" }, " : ") : null, objectValue);
+	    }, label) : null, hasLabel && hasValue ? dom.span({ className: "object-delimiter" }, " : ") : null, hasValue ? objectValue : null);
 	  }
 
 	  renderGrip(item, props) {
 	    const object = getValue(item);
 	    return Rep(Object.assign({}, props, {
 	      object,
-	      mode: props.mode || MODE.TINY
+	      mode: props.mode || MODE.TINY,
+	      defaultRep: Grip
 	    }));
 	  }
 
 	  render() {
 	    const {
 	      autoExpandDepth = 1,
 	      autoExpandAll = true,
 	      disabledFocus,
@@ -3796,17 +3929,17 @@ return /******/ (function(modules) { // 
 	      autoExpandDepth,
 	      disabledFocus,
 	      itemHeight,
 
 	      isExpanded: item => expandedKeys.has(this.getKey(item)),
 	      focused: focusedItem,
 
 	      getRoots: this.getRoots,
-	      getParent: this.getParent,
+	      getParent,
 	      getChildren: this.getChildren,
 	      getKey: this.getKey,
 
 	      onExpand: item => this.setExpanded(item, true),
 	      onCollapse: item => this.setExpanded(item, false),
 	      onFocus: this.focusItem,
 
 	      renderItem: this.renderTreeItem
@@ -3829,27 +3962,27 @@ return /******/ (function(modules) { // 
 	  onFocus: PropTypes.func,
 	  onDoubleClick: PropTypes.func,
 	  onLabelClick: PropTypes.func
 	};
 
 	module.exports = ObjectInspector;
 
 /***/ },
-/* 45 */
+/* 46 */
 /***/ function(module, exports, __webpack_require__) {
 
-	const Tree = __webpack_require__(46);
+	const Tree = __webpack_require__(47);
 
 	module.exports = {
 	  Tree
 	};
 
 /***/ },
-/* 46 */
+/* 47 */
 /***/ function(module, exports, __webpack_require__) {
 
 	const { DOM: dom, createClass, createFactory, PropTypes } = __webpack_require__(8);
 
 	const AUTO_EXPAND_DEPTH = 0; // depth
 
 	/**
 	 * An arrow that displays whether its node is expanded (▼) or collapsed
@@ -4383,24 +4516,24 @@ return /******/ (function(modules) { // 
 	      }
 	    }
 
 	    this._focus(parentIndex, parent);
 	  })
 	});
 
 /***/ },
-/* 47 */
+/* 48 */
 /***/ function(module, exports) {
 
 	// removed by extract-text-webpack-plugin
 
 /***/ },
-/* 48 */,
-/* 49 */
+/* 49 */,
+/* 50 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 	  Copyright (c) 2016 Jed Watson.
 	  Licensed under the MIT License (MIT), see
 	  http://jedwatson.github.io/classnames
 	*/
 	/* global define */
@@ -4444,63 +4577,93 @@ return /******/ (function(modules) { // 
 			}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
 		} else {
 			window.classNames = classNames;
 		}
 	}());
 
 
 /***/ },
-/* 50 */
+/* 51 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-	const get = __webpack_require__(51);
-	const has = __webpack_require__(103);
+	const get = __webpack_require__(52);
+	const has = __webpack_require__(104);
 	const { maybeEscapePropertyName } = __webpack_require__(7);
+	const GripMapEntry = __webpack_require__(44);
+
+	const NODE_TYPES = {
+	  BUCKET: Symbol("[n…n]"),
+	  DEFAULT_PROPERTIES: Symbol("[default properties]"),
+	  ENTRIES: Symbol("<entries>"),
+	  GET: Symbol("<get>"),
+	  GRIP: Symbol("GRIP"),
+	  MAP_ENTRY_KEY: Symbol("<key>"),
+	  MAP_ENTRY_VALUE: Symbol("<value>"),
+	  PROMISE_REASON: Symbol("<reason>"),
+	  PROMISE_STATE: Symbol("<state>"),
+	  PROMISE_VALUE: Symbol("<value>"),
+	  SET: Symbol("<set>")
+	};
 
 	let WINDOW_PROPERTIES = {};
 
 	if (typeof window === "object") {
 	  WINDOW_PROPERTIES = Object.getOwnPropertyNames(window);
 	}
 
+	const SAFE_PATH_PREFIX = "##-";
+
+	function getType(item) {
+	  return item.type;
+	}
+
 	function getValue(item) {
 	  if (has(item, "contents.value")) {
 	    return get(item, "contents.value");
 	  }
 
 	  if (has(item, "contents.getterValue")) {
 	    return get(item, "contents.getterValue", undefined);
 	  }
 
 	  if (nodeHasAccessors(item)) {
 	    return item.contents;
 	  }
 
 	  return undefined;
 	}
 
-	function isBucket(item) {
-	  return item.path && item.path.match(/bucket(\d+)$/);
+	function nodeIsBucket(item) {
+	  return getType(item) === NODE_TYPES.BUCKET;
+	}
+
+	function nodeIsEntries(item) {
+	  return getType(item) === NODE_TYPES.ENTRIES;
+	}
+
+	function nodeIsMapEntry(item) {
+	  return GripMapEntry.supportsObject(getValue(item));
 	}
 
 	function nodeHasChildren(item) {
-	  return Array.isArray(item.contents) || isBucket(item);
+	  return Array.isArray(item.contents) || nodeIsBucket(item);
 	}
 
 	function nodeIsObject(item) {
 	  const value = getValue(item);
 	  return value && value.type === "object";
 	}
 
-	function nodeIsArray(value) {
+	function nodeIsArray(item) {
+	  const value = getValue(item);
 	  return value && value.class === "Array";
 	}
 
 	function nodeIsFunction(item) {
 	  const value = getValue(item);
 	  return value && value.class === "Function";
 	}
 
@@ -4514,257 +4677,385 @@ return /******/ (function(modules) { // 
 	  return !nodeHasChildren(item) && value && value.missingArguments;
 	}
 
 	function nodeHasProperties(item) {
 	  return !nodeHasChildren(item) && nodeIsObject(item);
 	}
 
 	function nodeIsPrimitive(item) {
-	  return !nodeHasChildren(item) && !nodeHasProperties(item) && !nodeHasAccessors(item);
-	}
-
-	function isPromise(item) {
+	  return !nodeHasChildren(item) && !nodeHasProperties(item) && !nodeIsEntries(item) && !nodeIsMapEntry(item) && !nodeHasAccessors(item);
+	}
+
+	function nodeIsDefault(item, roots) {
+	  if (roots && roots.length === 1) {
+	    const value = getValue(roots[0]);
+	    return value.class === "Window";
+	  }
+	  return WINDOW_PROPERTIES.includes(item.name);
+	}
+
+	function isDefaultWindowProperty(name) {
+	  return WINDOW_PROPERTIES.includes(name);
+	}
+
+	function nodeIsPromise(item) {
 	  const value = getValue(item);
+	  if (!value) {
+	    return false;
+	  }
+
 	  return value.class == "Promise";
 	}
 
-	function getPromiseProperties(item) {
+	function nodeHasAccessors(item) {
+	  return !!getNodeGetter(item) || !!getNodeSetter(item);
+	}
+
+	function nodeHasEntries(item) {
+	  const value = getValue(item);
+	  if (!value) {
+	    return false;
+	  }
+
+	  return value.class === "Map" || value.class === "Set" || value.class === "WeakMap" || value.class === "WeakSet";
+	}
+
+	function nodeHasAllEntriesInPreview(item) {
+	  const { preview } = getValue(item) || {};
+	  if (!preview) {
+	    return false;
+	  }
+
+	  const {
+	    entries,
+	    items,
+	    length,
+	    size
+	  } = preview;
+
+	  return entries ? entries.length === size : items.length === length;
+	}
+
+	function nodeSupportsBucketing(item) {
+	  return nodeIsArray(item) || nodeIsEntries(item);
+	}
+
+	function makeNodesForPromiseProperties(item) {
 	  const { promiseState: { reason, value, state } } = getValue(item);
 
 	  const properties = [];
 
 	  if (state) {
-	    properties.push(createNode("<state>", `${item.path}/state`, { value: state }));
+	    properties.push(createNode(item, "<state>", `${item.path}/${SAFE_PATH_PREFIX}state`, { value: state }, NODE_TYPES.PROMISE_STATE));
 	  }
 
 	  if (reason) {
-	    properties.push(createNode("<reason>", `${item.path}/reason`, { value: reason }));
+	    properties.push(createNode(item, "<reason>", `${item.path}/${SAFE_PATH_PREFIX}reason`, { value: reason }, NODE_TYPES.PROMISE_REASON));
 	  }
 
 	  if (value) {
-	    properties.push(createNode("<value>", `${item.path}/value`, { value: value }));
+	    properties.push(createNode(item, "<value>", `${item.path}/${SAFE_PATH_PREFIX}value`, { value: value }, NODE_TYPES.PROMISE_VALUE));
 	  }
 
 	  return properties;
 	}
 
+	function makeNodesForEntries(item) {
+	  const { path } = item;
+	  const { preview } = getValue(item);
+	  const nodeName = "<entries>";
+	  const entriesPath = `${path}/${SAFE_PATH_PREFIX}entries`;
+
+	  if (nodeHasAllEntriesInPreview(item)) {
+	    let entriesNodes = [];
+	    if (preview.entries) {
+	      entriesNodes = preview.entries.map(([key, value], index) => {
+	        return createNode(item, index, `${entriesPath}/${index}`, { value: GripMapEntry.createGripMapEntry(key, value) });
+	      });
+	    } else if (preview.items) {
+	      entriesNodes = preview.items.map((value, index) => {
+	        return createNode(item, index, `${entriesPath}/${index}`, { value });
+	      });
+	    }
+	    return createNode(item, nodeName, entriesPath, entriesNodes, NODE_TYPES.ENTRIES);
+	  }
+	  return createNode(item, nodeName, entriesPath, null, NODE_TYPES.ENTRIES);
+	}
+
+	function makeNodesForMapEntry(item) {
+	  const nodeValue = getValue(item);
+	  if (!nodeValue || !nodeValue.preview) {
+	    return [];
+	  }
+
+	  const { key, value } = nodeValue.preview;
+	  const path = item.path;
+
+	  return [createNode(item, "<key>", `${path}/${SAFE_PATH_PREFIX}key`, { value: key }, NODE_TYPES.MAP_ENTRY_KEY), createNode(item, "<value>", `${path}/${SAFE_PATH_PREFIX}value`, { value }, NODE_TYPES.MAP_ENTRY_VALUE)];
+	}
+
 	function getNodeGetter(item) {
 	  return get(item, "contents.get", undefined);
 	}
 
 	function getNodeSetter(item) {
 	  return get(item, "contents.set", undefined);
 	}
 
-	function nodeHasAccessors(item) {
-	  return !!getNodeGetter(item) || !!getNodeSetter(item);
-	}
-
-	function getAccessors(item) {
+	function makeNodesForAccessors(item) {
 	  const accessors = [];
 
 	  const getter = getNodeGetter(item);
 	  if (getter && getter.type !== "undefined") {
-	    accessors.push(createNode("<get>", `${item.path}/get`, { value: getter }));
+	    accessors.push(createNode(item, "<get>", `${item.path}/${SAFE_PATH_PREFIX}get`, { value: getter }, NODE_TYPES.GET));
 	  }
 
 	  const setter = getNodeSetter(item);
 	  if (setter && setter.type !== "undefined") {
-	    accessors.push(createNode("<set>", `${item.path}/set`, { value: setter }));
+	    accessors.push(createNode(item, "<set>", `${item.path}/${SAFE_PATH_PREFIX}set`, { value: setter }, NODE_TYPES.SET));
 	  }
 
 	  return accessors;
 	}
 
-	function isDefault(item, roots) {
-	  if (roots && roots.length === 1) {
-	    const value = getValue(roots[0]);
-	    return value.class === "Window";
-	  }
-	  return WINDOW_PROPERTIES.includes(item.name);
-	}
-
 	function sortProperties(properties) {
 	  return properties.sort((a, b) => {
 	    // Sort numbers in ascending order and sort strings lexicographically
 	    const aInt = parseInt(a, 10);
 	    const bInt = parseInt(b, 10);
 
 	    if (isNaN(aInt) || isNaN(bInt)) {
 	      return a > b ? 1 : -1;
 	    }
 
 	    return aInt - bInt;
 	  });
 	}
 
-	function makeNumericalBuckets(props, bucketSize, parentPath, ownProperties) {
-	  const numProperties = props.length;
+	function makeNumericalBuckets(propertiesNames, bucketSize, parent, ownProperties) {
+	  const parentPath = parent.path;
+	  const numProperties = propertiesNames.length;
 	  const numBuckets = Math.ceil(numProperties / bucketSize);
 	  let buckets = [];
 	  for (let i = 1; i <= numBuckets; i++) {
-	    const bucketKey = `bucket${i}`;
+	    const bucketKey = `${SAFE_PATH_PREFIX}bucket${i}`;
 	    const minKey = (i - 1) * bucketSize;
 	    const maxKey = Math.min(i * bucketSize - 1, numProperties);
 	    const bucketName = `[${minKey}..${maxKey}]`;
-	    const bucketProperties = props.slice(minKey, maxKey);
-
-	    const bucketNodes = bucketProperties.map(name => createNode(name, `${parentPath}/${bucketKey}/${name}`, ownProperties[name]));
-
-	    buckets.push(createNode(bucketName, `${parentPath}/${bucketKey}`, bucketNodes));
+	    const bucketProperties = propertiesNames.slice(minKey, maxKey);
+
+	    const bucketNodes = bucketProperties.map(name => createNode(parent, name, `${parentPath}/${bucketKey}/${name}`, ownProperties[name]));
+
+	    buckets.push(createNode(parent, bucketName, `${parentPath}/${bucketKey}`, bucketNodes, NODE_TYPES.BUCKET));
 	  }
 	  return buckets;
 	}
 
-	function makeDefaultPropsBucket(props, parentPath, ownProperties) {
-	  const userProps = props.filter(name => !isDefault({ name }));
-	  const defaultProps = props.filter(name => isDefault({ name }));
-
-	  let nodes = makeNodesForOwnProps(userProps, parentPath, ownProperties);
-
-	  if (defaultProps.length > 0) {
-	    const defaultNodes = defaultProps.map((name, index) => createNode(maybeEscapePropertyName(name), `${parentPath}/bucket${index}/${name}`, ownProperties[name]));
-	    nodes.push(createNode("[default properties]", `${parentPath}/##-default`, defaultNodes));
+	function makeDefaultPropsBucket(propertiesNames, parent, ownProperties) {
+	  const parentPath = parent.path;
+
+	  const [userPropertiesNames, defaultProperties] = propertiesNames.reduce((res, name) => {
+	    const [userProps, defaultProps] = res;
+	    (isDefaultWindowProperty(name) ? defaultProps : userProps).push(name);
+	    return res;
+	  }, [[], []]);
+
+	  let nodes = makeNodesForOwnProps(userPropertiesNames, parent, ownProperties);
+
+	  if (defaultProperties.length > 0) {
+	    const defaultPropertiesNode = createNode(parent, "[default properties]", `${parentPath}/${SAFE_PATH_PREFIX}default`, null, NODE_TYPES.DEFAULT_PROPERTIES);
+
+	    const defaultNodes = defaultProperties.map((name, index) => createNode(defaultPropertiesNode, maybeEscapePropertyName(name), `${parentPath}/${SAFE_PATH_PREFIX}bucket${index}/${name}`, ownProperties[name]));
+	    nodes.push(setNodeChildren(defaultPropertiesNode, defaultNodes));
 	  }
 	  return nodes;
 	}
 
-	function makeNodesForOwnProps(properties, parentPath, ownProperties) {
-	  return properties.map(name => createNode(maybeEscapePropertyName(name), `${parentPath}/${name}`, ownProperties[name]));
-	}
-
-	/*
-	 * Ignore properties that are neither non-concrete nor getters/setters.
-	*/
-	function makeNodesForProperties(objProps, parent, { bucketSize = 100 } = {}) {
+	function makeNodesForOwnProps(properties, parent, ownProperties) {
+	  const parentPath = parent.path;
+	  return properties.map(name => createNode(parent, maybeEscapePropertyName(name), `${parentPath}/${name}`, ownProperties[name]));
+	}
+
+	function makeNodesForProperties(objProps, parent, {
+	  bucketSize = 100
+	} = {}) {
 	  const {
-	    ownProperties,
+	    ownProperties = {},
 	    ownSymbols,
 	    prototype,
 	    safeGetterValues
 	  } = objProps;
 
 	  const parentPath = parent.path;
 	  const parentValue = getValue(parent);
 
 	  let allProperties = Object.assign({}, ownProperties, safeGetterValues);
-	  const properties = sortProperties(Object.keys(allProperties)).filter(name => allProperties[name].hasOwnProperty("value") || allProperties[name].hasOwnProperty("getterValue") || allProperties[name].hasOwnProperty("get") || allProperties[name].hasOwnProperty("set"));
-
-	  const numProperties = properties.length;
+
+	  // Ignore properties that are neither non-concrete nor getters/setters.
+	  const propertiesNames = sortProperties(Object.keys(allProperties)).filter(name => allProperties[name].hasOwnProperty("value") || allProperties[name].hasOwnProperty("getterValue") || allProperties[name].hasOwnProperty("get") || allProperties[name].hasOwnProperty("set"));
+
+	  const numProperties = propertiesNames.length;
 
 	  let nodes = [];
-	  if (nodeIsArray(prototype) && numProperties > bucketSize) {
-	    nodes = makeNumericalBuckets(properties, bucketSize, parentPath, allProperties);
-	  } else if (parentValue.class == "Window") {
-	    nodes = makeDefaultPropsBucket(properties, parentPath, allProperties);
+	  if (nodeSupportsBucketing(parent) && numProperties > bucketSize) {
+	    nodes = makeNumericalBuckets(propertiesNames, bucketSize, parent, allProperties);
+	  } else if (parentValue && parentValue.class == "Window") {
+	    nodes = makeDefaultPropsBucket(propertiesNames, parent, allProperties);
 	  } else {
-	    nodes = makeNodesForOwnProps(properties, parentPath, allProperties);
-	  }
-
-	  for (let index in ownSymbols) {
-	    nodes.push(createNode(ownSymbols[index].name, `${parentPath}/##symbol-${index}`, ownSymbols[index].descriptor));
-	  }
-
-	  if (isPromise(parent)) {
-	    nodes.push(...getPromiseProperties(parent));
+	    nodes = makeNodesForOwnProps(propertiesNames, parent, allProperties);
+	  }
+
+	  if (Array.isArray(ownSymbols)) {
+	    ownSymbols.forEach((ownSymbol, index) => {
+	      nodes.push(createNode(parent, ownSymbol.name, `${parentPath}/${SAFE_PATH_PREFIX}symbol-${index}`, ownSymbol.descriptor));
+	    }, this);
+	  }
+
+	  if (nodeIsPromise(parent)) {
+	    nodes.push(...makeNodesForPromiseProperties(parent));
+	  }
+
+	  if (nodeHasEntries(parent)) {
+	    nodes.push(makeNodesForEntries(parent));
 	  }
 
 	  // Add the prototype if it exists and is not null
 	  if (prototype && prototype.type !== "null") {
-	    nodes.push(createNode("__proto__", `${parentPath}/__proto__`, { value: prototype }));
+	    nodes.push(createNode(parent, "__proto__", `${parentPath}/__proto__`, { value: prototype }));
 	  }
 
 	  return nodes;
 	}
 
-	function createNode(name, path, contents) {
+	function createNode(parent, name, path, contents, type = NODE_TYPES.GRIP) {
 	  if (contents === undefined) {
 	    return null;
 	  }
+
 	  // The path is important to uniquely identify the item in the entire
 	  // tree. This helps debugging & optimizes React's rendering of large
 	  // lists. The path will be separated by property name,
 	  // i.e. `{ foo: { bar: { baz: 5 }}}` will have a path of `foo/bar/baz`
 	  // for the inner object.
-	  return { name, path, contents };
-	}
-
-	function getChildren({ getObjectProperties, actors, item }) {
+	  return {
+	    parent,
+	    name,
+	    path,
+	    contents,
+	    type
+	  };
+	}
+
+	function setNodeChildren(node, children) {
+	  node.contents = children;
+	  return node;
+	}
+
+	function getChildren(options) {
+	  const {
+	    actors = {},
+	    getObjectEntries,
+	    getObjectProperties,
+	    item
+	  } = options;
 	  // Nodes can either have children already, or be an object with
 	  // properties that we need to go and fetch.
 	  if (nodeHasAccessors(item)) {
-	    return getAccessors(item);
+	    return makeNodesForAccessors(item);
+	  }
+
+	  if (nodeIsMapEntry(item)) {
+	    return makeNodesForMapEntry(item);
 	  }
 
 	  if (nodeHasChildren(item)) {
 	    return item.contents;
 	  }
 
-	  if (!nodeHasProperties(item)) {
+	  if (!nodeHasProperties(item) && !nodeIsEntries(item)) {
 	    return [];
 	  }
 
 	  // Because we are dynamically creating the tree as the user
 	  // expands it (not precalculated tree structure), we cache child
 	  // arrays. This not only helps performance, but is necessary
 	  // because the expanded state depends on instances of nodes
 	  // being the same across renders. If we didn't do this, each
 	  // node would be a new instance every render.
 	  const key = item.path;
 	  if (actors && actors[key]) {
 	    return actors[key];
 	  }
 
-	  if (isBucket(item)) {
+	  if (nodeIsBucket(item)) {
 	    return item.contents.children;
 	  }
 
-	  const actor = get(getValue(item), "actor", undefined);
-	  const loadedProps = getObjectProperties(actor);
+	  let loadedProps;
+	  if (nodeIsEntries(item)) {
+	    // If `item` is an <entries> node, we need to get the entries
+	    // matching the parent node actor.
+	    const parent = getParent(item);
+	    loadedProps = getObjectEntries(get(getValue(parent), "actor", undefined));
+	  } else {
+	    loadedProps = getObjectProperties(get(getValue(item), "actor", undefined));
+	  }
+
 	  const {
 	    ownProperties,
 	    ownSymbols,
 	    safeGetterValues,
 	    prototype
 	  } = loadedProps || {};
 
 	  if (!ownProperties && !ownSymbols && !safeGetterValues && !prototype) {
 	    return [];
 	  }
 
 	  let children = makeNodesForProperties(loadedProps, item);
 	  actors[key] = children;
 	  return children;
 	}
 
+	function getParent(item) {
+	  return item.parent;
+	}
+
 	module.exports = {
 	  createNode,
 	  getChildren,
-	  getPromiseProperties,
+	  getParent,
 	  getValue,
-	  isDefault,
-	  isPromise,
+	  makeNodesForPromiseProperties,
 	  makeNodesForProperties,
 	  nodeHasAccessors,
+	  nodeHasAllEntriesInPreview,
 	  nodeHasChildren,
 	  nodeHasProperties,
+	  nodeIsDefault,
+	  nodeIsEntries,
 	  nodeIsFunction,
+	  nodeIsMapEntry,
 	  nodeIsMissingArguments,
 	  nodeIsObject,
 	  nodeIsOptimizedOut,
 	  nodeIsPrimitive,
-	  sortProperties
+	  nodeIsPromise,
+	  sortProperties,
+	  NODE_TYPES,
+	  // Export for testing purpose.
+	  SAFE_PATH_PREFIX
 	};
 
 /***/ },
-/* 51 */
+/* 52 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseGet = __webpack_require__(52);
+	var baseGet = __webpack_require__(53);
 
 	/**
 	 * Gets the value at `path` of `object`. If the resolved value is
 	 * `undefined`, the `defaultValue` is returned in its place.
 	 *
 	 * @static
 	 * @memberOf _
 	 * @since 3.7.0
@@ -4790,21 +5081,21 @@ return /******/ (function(modules) { // 
 	  var result = object == null ? undefined : baseGet(object, path);
 	  return result === undefined ? defaultValue : result;
 	}
 
 	module.exports = get;
 
 
 /***/ },
-/* 52 */
+/* 53 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var castPath = __webpack_require__(53),
-	    toKey = __webpack_require__(102);
+	var castPath = __webpack_require__(54),
+	    toKey = __webpack_require__(103);
 
 	/**
 	 * The base implementation of `_.get` without support for default values.
 	 *
 	 * @private
 	 * @param {Object} object The object to query.
 	 * @param {Array|string} path The path of the property to get.
 	 * @returns {*} Returns the resolved value.
@@ -4820,23 +5111,23 @@ return /******/ (function(modules) { // 
 	  }
 	  return (index && index == length) ? object : undefined;
 	}
 
 	module.exports = baseGet;
 
 
 /***/ },
-/* 53 */
+/* 54 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isArray = __webpack_require__(54),
-	    isKey = __webpack_require__(55),
-	    stringToPath = __webpack_require__(64),
-	    toString = __webpack_require__(99);
+	var isArray = __webpack_require__(55),
+	    isKey = __webpack_require__(56),
+	    stringToPath = __webpack_require__(65),
+	    toString = __webpack_require__(100);
 
 	/**
 	 * Casts `value` to a path array if it's not one.
 	 *
 	 * @private
 	 * @param {*} value The value to inspect.
 	 * @param {Object} [object] The object to query keys on.
 	 * @returns {Array} Returns the cast property path array.
@@ -4847,17 +5138,17 @@ return /******/ (function(modules) { // 
 	  }
 	  return isKey(value, object) ? [value] : stringToPath(toString(value));
 	}
 
 	module.exports = castPath;
 
 
 /***/ },
-/* 54 */
+/* 55 */
 /***/ function(module, exports) {
 
 	/**
 	 * Checks if `value` is classified as an `Array` object.
 	 *
 	 * @static
 	 * @memberOf _
 	 * @since 0.1.0
@@ -4879,21 +5170,21 @@ return /******/ (function(modules) { // 
 	 * // => false
 	 */
 	var isArray = Array.isArray;
 
 	module.exports = isArray;
 
 
 /***/ },
-/* 55 */
+/* 56 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isArray = __webpack_require__(54),
-	    isSymbol = __webpack_require__(56);
+	var isArray = __webpack_require__(55),
+	    isSymbol = __webpack_require__(57);
 
 	/** Used to match property names within property paths. */
 	var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
 	    reIsPlainProp = /^\w*$/;
 
 	/**
 	 * Checks if `value` is a property name and not a property path.
 	 *
@@ -4914,21 +5205,21 @@ return /******/ (function(modules) { // 
 	  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
 	    (object != null && value in Object(object));
 	}
 
 	module.exports = isKey;
 
 
 /***/ },
-/* 56 */
+/* 57 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseGetTag = __webpack_require__(57),
-	    isObjectLike = __webpack_require__(63);
+	var baseGetTag = __webpack_require__(58),
+	    isObjectLike = __webpack_require__(64);
 
 	/** `Object#toString` result references. */
 	var symbolTag = '[object Symbol]';
 
 	/**
 	 * Checks if `value` is classified as a `Symbol` primitive or object.
 	 *
 	 * @static
@@ -4949,22 +5240,22 @@ return /******/ (function(modules) { // 
 	  return typeof value == 'symbol' ||
 	    (isObjectLike(value) && baseGetTag(value) == symbolTag);
 	}
 
 	module.exports = isSymbol;
 
 
 /***/ },
-/* 57 */
+/* 58 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var Symbol = __webpack_require__(58),
-	    getRawTag = __webpack_require__(61),
-	    objectToString = __webpack_require__(62);
+	var Symbol = __webpack_require__(59),
+	    getRawTag = __webpack_require__(62),
+	    objectToString = __webpack_require__(63);
 
 	/** `Object#toString` result references. */
 	var nullTag = '[object Null]',
 	    undefinedTag = '[object Undefined]';
 
 	/** Built-in value references. */
 	var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
 
@@ -4983,58 +5274,58 @@ return /******/ (function(modules) { // 
 	    ? getRawTag(value)
 	    : objectToString(value);
 	}
 
 	module.exports = baseGetTag;
 
 
 /***/ },
-/* 58 */
+/* 59 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var root = __webpack_require__(59);
+	var root = __webpack_require__(60);
 
 	/** Built-in value references. */
 	var Symbol = root.Symbol;
 
 	module.exports = Symbol;
 
 
 /***/ },
-/* 59 */
+/* 60 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var freeGlobal = __webpack_require__(60);
+	var freeGlobal = __webpack_require__(61);
 
 	/** Detect free variable `self`. */
 	var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
 
 	/** Used as a reference to the global object. */
 	var root = freeGlobal || freeSelf || Function('return this')();
 
 	module.exports = root;
 
 
 /***/ },
-/* 60 */
+/* 61 */
 /***/ function(module, exports) {
 
 	/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
 	var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
 
 	module.exports = freeGlobal;
 
 	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
 
 /***/ },
-/* 61 */
+/* 62 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var Symbol = __webpack_require__(58);
+	var Symbol = __webpack_require__(59);
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/** Used to check objects for own properties. */
 	var hasOwnProperty = objectProto.hasOwnProperty;
 
 	/**
@@ -5073,17 +5364,17 @@ return /******/ (function(modules) { // 
 	  }
 	  return result;
 	}
 
 	module.exports = getRawTag;
 
 
 /***/ },
-/* 62 */
+/* 63 */
 /***/ function(module, exports) {
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/**
 	 * Used to resolve the
 	 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
@@ -5101,17 +5392,17 @@ return /******/ (function(modules) { // 
 	function objectToString(value) {
 	  return nativeObjectToString.call(value);
 	}
 
 	module.exports = objectToString;
 
 
 /***/ },
-/* 63 */
+/* 64 */
 /***/ function(module, exports) {
 
 	/**
 	 * Checks if `value` is object-like. A value is object-like if it's not `null`
 	 * and has a `typeof` result of "object".
 	 *
 	 * @static
 	 * @memberOf _
@@ -5136,20 +5427,20 @@ return /******/ (function(modules) { // 
 	function isObjectLike(value) {
 	  return value != null && typeof value == 'object';
 	}
 
 	module.exports = isObjectLike;
 
 
 /***/ },
-/* 64 */
+/* 65 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var memoizeCapped = __webpack_require__(65);
+	var memoizeCapped = __webpack_require__(66);
 
 	/** Used to match property names within property paths. */
 	var reLeadingDot = /^\./,
 	    rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
 
 	/** Used to match backslashes in property paths. */
 	var reEscapeChar = /\\(\\)?/g;
 
@@ -5170,20 +5461,20 @@ return /******/ (function(modules) { // 
 	  });
 	  return result;
 	});
 
 	module.exports = stringToPath;
 
 
 /***/ },
-/* 65 */
+/* 66 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var memoize = __webpack_require__(66);
+	var memoize = __webpack_require__(67);
 
 	/** Used as the maximum memoize cache size. */
 	var MAX_MEMOIZE_SIZE = 500;
 
 	/**
 	 * A specialized version of `_.memoize` which clears the memoized function's
 	 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
 	 *
@@ -5202,20 +5493,20 @@ return /******/ (function(modules) { // 
 	  var cache = result.cache;
 	  return result;
 	}
 
 	module.exports = memoizeCapped;
 
 
 /***/ },
-/* 66 */
+/* 67 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var MapCache = __webpack_require__(67);
+	var MapCache = __webpack_require__(68);
 
 	/** Error message constants. */
 	var FUNC_ERROR_TEXT = 'Expected a function';
 
 	/**
 	 * Creates a function that memoizes the result of `func`. If `resolver` is
 	 * provided, it determines the cache key for storing the result based on the
 	 * arguments provided to the memoized function. By default, the first argument
@@ -5281,24 +5572,24 @@ return /******/ (function(modules) { // 
 
 	// Expose `MapCache`.
 	memoize.Cache = MapCache;
 
 	module.exports = memoize;
 
 
 /***/ },
-/* 67 */
+/* 68 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var mapCacheClear = __webpack_require__(68),
-	    mapCacheDelete = __webpack_require__(93),
-	    mapCacheGet = __webpack_require__(96),
-	    mapCacheHas = __webpack_require__(97),
-	    mapCacheSet = __webpack_require__(98);
+	var mapCacheClear = __webpack_require__(69),
+	    mapCacheDelete = __webpack_require__(94),
+	    mapCacheGet = __webpack_require__(97),
+	    mapCacheHas = __webpack_require__(98),
+	    mapCacheSet = __webpack_require__(99);
 
 	/**
 	 * Creates a map cache object to store key-value pairs.
 	 *
 	 * @private
 	 * @constructor
 	 * @param {Array} [entries] The key-value pairs to cache.
 	 */
@@ -5319,22 +5610,22 @@ return /******/ (function(modules) { // 
 	MapCache.prototype.get = mapCacheGet;
 	MapCache.prototype.has = mapCacheHas;
 	MapCache.prototype.set = mapCacheSet;
 
 	module.exports = MapCache;
 
 
 /***/ },
-/* 68 */
+/* 69 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var Hash = __webpack_require__(69),
-	    ListCache = __webpack_require__(84),
-	    Map = __webpack_require__(92);
+	var Hash = __webpack_require__(70),
+	    ListCache = __webpack_require__(85),
+	    Map = __webpack_require__(93);
 
 	/**
 	 * Removes all key-value entries from the map.
 	 *
 	 * @private
 	 * @name clear
 	 * @memberOf MapCache
 	 */
@@ -5346,24 +5637,24 @@ return /******/ (function(modules) { // 
 	    'string': new Hash
 	  };
 	}
 
 	module.exports = mapCacheClear;
 
 
 /***/ },
-/* 69 */
+/* 70 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var hashClear = __webpack_require__(70),
-	    hashDelete = __webpack_require__(80),
-	    hashGet = __webpack_require__(81),
-	    hashHas = __webpack_require__(82),
-	    hashSet = __webpack_require__(83);
+	var hashClear = __webpack_require__(71),
+	    hashDelete = __webpack_require__(81),
+	    hashGet = __webpack_require__(82),
+	    hashHas = __webpack_require__(83),
+	    hashSet = __webpack_require__(84);
 
 	/**
 	 * Creates a hash object.
 	 *
 	 * @private
 	 * @constructor
 	 * @param {Array} [entries] The key-value pairs to cache.
 	 */
@@ -5384,20 +5675,20 @@ return /******/ (function(modules) { // 
 	Hash.prototype.get = hashGet;
 	Hash.prototype.has = hashHas;
 	Hash.prototype.set = hashSet;
 
 	module.exports = Hash;
 
 
 /***/ },
-/* 70 */
+/* 71 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var nativeCreate = __webpack_require__(71);
+	var nativeCreate = __webpack_require__(72);
 
 	/**
 	 * Removes all key-value entries from the hash.
 	 *
 	 * @private
 	 * @name clear
 	 * @memberOf Hash
 	 */
@@ -5405,33 +5696,33 @@ return /******/ (function(modules) { // 
 	  this.__data__ = nativeCreate ? nativeCreate(null) : {};
 	  this.size = 0;
 	}
 
 	module.exports = hashClear;
 
 
 /***/ },
-/* 71 */
+/* 72 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getNative = __webpack_require__(72);
+	var getNative = __webpack_require__(73);
 
 	/* Built-in method references that are verified to be native. */
 	var nativeCreate = getNative(Object, 'create');
 
 	module.exports = nativeCreate;
 
 
 /***/ },
-/* 72 */
+/* 73 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseIsNative = __webpack_require__(73),
-	    getValue = __webpack_require__(79);
+	var baseIsNative = __webpack_require__(74),
+	    getValue = __webpack_require__(80);
 
 	/**
 	 * Gets the native function at `key` of `object`.
 	 *
 	 * @private
 	 * @param {Object} object The object to query.
 	 * @param {string} key The key of the method to get.
 	 * @returns {*} Returns the function if it's native, else `undefined`.
@@ -5440,23 +5731,23 @@ return /******/ (function(modules) { // 
 	  var value = getValue(object, key);
 	  return baseIsNative(value) ? value : undefined;
 	}
 
 	module.exports = getNative;
 
 
 /***/ },
-/* 73 */
+/* 74 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isFunction = __webpack_require__(74),
-	    isMasked = __webpack_require__(76),
-	    isObject = __webpack_require__(75),
-	    toSource = __webpack_require__(78);
+	var isFunction = __webpack_require__(75),
+	    isMasked = __webpack_require__(77),
+	    isObject = __webpack_require__(76),
+	    toSource = __webpack_require__(79);
 
 	/**
 	 * Used to match `RegExp`
 	 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 	 */
 	var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
 
 	/** Used to detect host constructors (Safari). */
@@ -5493,21 +5784,21 @@ return /******/ (function(modules) { // 
 	  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
 	  return pattern.test(toSource(value));
 	}
 
 	module.exports = baseIsNative;
 
 
 /***/ },
-/* 74 */
+/* 75 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseGetTag = __webpack_require__(57),
-	    isObject = __webpack_require__(75);
+	var baseGetTag = __webpack_require__(58),
+	    isObject = __webpack_require__(76);
 
 	/** `Object#toString` result references. */
 	var asyncTag = '[object AsyncFunction]',
 	    funcTag = '[object Function]',
 	    genTag = '[object GeneratorFunction]',
 	    proxyTag = '[object Proxy]';
 
 	/**
@@ -5536,17 +5827,17 @@ return /******/ (function(modules) { // 
 	  var tag = baseGetTag(value);
 	  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
 	}
 
 	module.exports = isFunction;
 
 
 /***/ },
-/* 75 */
+/* 76 */
 /***/ function(module, exports) {
 
 	/**
 	 * Checks if `value` is the
 	 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 	 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 	 *
 	 * @static
@@ -5573,20 +5864,20 @@ return /******/ (function(modules) { // 
 	  var type = typeof value;
 	  return value != null && (type == 'object' || type == 'function');
 	}
 
 	module.exports = isObject;
 
 
 /***/ },
-/* 76 */
+/* 77 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var coreJsData = __webpack_require__(77);
+	var coreJsData = __webpack_require__(78);
 
 	/** Used to detect methods masquerading as native. */
 	var maskSrcKey = (function() {
 	  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
 	  return uid ? ('Symbol(src)_1.' + uid) : '';
 	}());
 
 	/**
@@ -5599,29 +5890,29 @@ return /******/ (function(modules) { // 
 	function isMasked(func) {
 	  return !!maskSrcKey && (maskSrcKey in func);
 	}
 
 	module.exports = isMasked;
 
 
 /***/ },
-/* 77 */
+/* 78 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var root = __webpack_require__(59);
+	var root = __webpack_require__(60);
 
 	/** Used to detect overreaching core-js shims. */
 	var coreJsData = root['__core-js_shared__'];
 
 	module.exports = coreJsData;
 
 
 /***/ },
-/* 78 */
+/* 79 */
 /***/ function(module, exports) {
 
 	/** Used for built-in method references. */
 	var funcProto = Function.prototype;
 
 	/** Used to resolve the decompiled source of functions. */
 	var funcToString = funcProto.toString;
 
@@ -5643,17 +5934,17 @@ return /******/ (function(modules) { // 
 	  }
 	  return '';
 	}
 
 	module.exports = toSource;
 
 
 /***/ },
-/* 79 */
+/* 80 */
 /***/ function(module, exports) {
 
 	/**
 	 * Gets the value at `key` of `object`.
 	 *
 	 * @private
 	 * @param {Object} [object] The object to query.
 	 * @param {string} key The key of the property to get.
@@ -5662,17 +5953,17 @@ return /******/ (function(modules) { // 
 	function getValue(object, key) {
 	  return object == null ? undefined : object[key];
 	}
 
 	module.exports = getValue;
 
 
 /***/ },
-/* 80 */
+/* 81 */
 /***/ function(module, exports) {
 
 	/**
 	 * Removes `key` and its value from the hash.
 	 *
 	 * @private
 	 * @name delete
 	 * @memberOf Hash
@@ -5685,20 +5976,20 @@ return /******/ (function(modules) { // 
 	  this.size -= result ? 1 : 0;
 	  return result;
 	}
 
 	module.exports = hashDelete;
 
 
 /***/ },
-/* 81 */
+/* 82 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var nativeCreate = __webpack_require__(71);
+	var nativeCreate = __webpack_require__(72);
 
 	/** Used to stand-in for `undefined` hash values. */
 	var HASH_UNDEFINED = '__lodash_hash_undefined__';
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/** Used to check objects for own properties. */
@@ -5721,20 +6012,20 @@ return /******/ (function(modules) { // 
 	  }
 	  return hasOwnProperty.call(data, key) ? data[key] : undefined;
 	}
 
 	module.exports = hashGet;
 
 
 /***/ },
-/* 82 */
+/* 83 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var nativeCreate = __webpack_require__(71);
+	var nativeCreate = __webpack_require__(72);
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/** Used to check objects for own properties. */
 	var hasOwnProperty = objectProto.hasOwnProperty;
 
 	/**
@@ -5750,20 +6041,20 @@ return /******/ (function(modules) { // 
 	  var data = this.__data__;
 	  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
 	}
 
 	module.exports = hashHas;
 
 
 /***/ },
-/* 83 */
+/* 84 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var nativeCreate = __webpack_require__(71);
+	var nativeCreate = __webpack_require__(72);
 
 	/** Used to stand-in for `undefined` hash values. */
 	var HASH_UNDEFINED = '__lodash_hash_undefined__';
 
 	/**
 	 * Sets the hash `key` to `value`.
 	 *
 	 * @private
@@ -5779,24 +6070,24 @@ return /******/ (function(modules) { // 
 	  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
 	  return this;
 	}
 
 	module.exports = hashSet;
 
 
 /***/ },
-/* 84 */
+/* 85 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var listCacheClear = __webpack_require__(85),
-	    listCacheDelete = __webpack_require__(86),
-	    listCacheGet = __webpack_require__(89),
-	    listCacheHas = __webpack_require__(90),
-	    listCacheSet = __webpack_require__(91);
+	var listCacheClear = __webpack_require__(86),
+	    listCacheDelete = __webpack_require__(87),
+	    listCacheGet = __webpack_require__(90),
+	    listCacheHas = __webpack_require__(91),
+	    listCacheSet = __webpack_require__(92);
 
 	/**
 	 * Creates an list cache object.
 	 *
 	 * @private
 	 * @constructor
 	 * @param {Array} [entries] The key-value pairs to cache.
 	 */
@@ -5817,17 +6108,17 @@ return /******/ (function(modules) { // 
 	ListCache.prototype.get = listCacheGet;
 	ListCache.prototype.has = listCacheHas;
 	ListCache.prototype.set = listCacheSet;
 
 	module.exports = ListCache;
 
 
 /***/ },
-/* 85 */
+/* 86 */
 /***/ function(module, exports) {
 
 	/**
 	 * Removes all key-value entries from the list cache.
 	 *
 	 * @private
 	 * @name clear
 	 * @memberOf ListCache
@@ -5836,20 +6127,20 @@ return /******/ (function(modules) { // 
 	  this.__data__ = [];
 	  this.size = 0;
 	}
 
 	module.exports = listCacheClear;
 
 
 /***/ },
-/* 86 */
+/* 87 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var assocIndexOf = __webpack_require__(87);
+	var assocIndexOf = __webpack_require__(88);
 
 	/** Used for built-in method references. */
 	var arrayProto = Array.prototype;
 
 	/** Built-in value references. */
 	var splice = arrayProto.splice;
 
 	/**
@@ -5877,20 +6168,20 @@ return /******/ (function(modules) { // 
 	  --this.size;
 	  return true;
 	}
 
 	module.exports = listCacheDelete;
 
 
 /***/ },
-/* 87 */
+/* 88 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var eq = __webpack_require__(88);
+	var eq = __webpack_require__(89);
 
 	/**
 	 * Gets the index at which the `key` is found in `array` of key-value pairs.
 	 *
 	 * @private
 	 * @param {Array} array The array to inspect.
 	 * @param {*} key The key to search for.
 	 * @returns {number} Returns the index of the matched value, else `-1`.
@@ -5904,17 +6195,17 @@ return /******/ (function(modules) { // 
 	  }
 	  return -1;
 	}
 
 	module.exports = assocIndexOf;
 
 
 /***/ },
-/* 88 */
+/* 89 */
 /***/ function(module, exports) {
 
 	/**
 	 * Performs a
 	 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 	 * comparison between two values to determine if they are equivalent.
 	 *
 	 * @static
@@ -5947,20 +6238,20 @@ return /******/ (function(modules) { // 
 	function eq(value, other) {
 	  return value === other || (value !== value && other !== other);
 	}
 
 	module.exports = eq;
 
 
 /***/ },
-/* 89 */
+/* 90 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var assocIndexOf = __webpack_require__(87);
+	var assocIndexOf = __webpack_require__(88);
 
 	/**
 	 * Gets the list cache value for `key`.
 	 *
 	 * @private
 	 * @name get
 	 * @memberOf ListCache
 	 * @param {string} key The key of the value to get.
@@ -5972,20 +6263,20 @@ return /******/ (function(modules) { // 
 
 	  return index < 0 ? undefined : data[index][1];
 	}
 
 	module.exports = listCacheGet;
 
 
 /***/ },
-/* 90 */
+/* 91 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var assocIndexOf = __webpack_require__(87);
+	var assocIndexOf = __webpack_require__(88);
 
 	/**
 	 * Checks if a list cache value for `key` exists.
 	 *
 	 * @private
 	 * @name has
 	 * @memberOf ListCache
 	 * @param {string} key The key of the entry to check.
@@ -5994,20 +6285,20 @@ return /******/ (function(modules) { // 
 	function listCacheHas(key) {
 	  return assocIndexOf(this.__data__, key) > -1;
 	}
 
 	module.exports = listCacheHas;
 
 
 /***/ },
-/* 91 */
+/* 92 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var assocIndexOf = __webpack_require__(87);
+	var assocIndexOf = __webpack_require__(88);
 
 	/**
 	 * Sets the list cache `key` to `value`.
 	 *
 	 * @private
 	 * @name set
 	 * @memberOf ListCache
 	 * @param {string} key The key of the value to set.
@@ -6026,33 +6317,33 @@ return /******/ (function(modules) { // 
 	  }
 	  return this;
 	}
 
 	module.exports = listCacheSet;
 
 
 /***/ },
-/* 92 */
+/* 93 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getNative = __webpack_require__(72),
-	    root = __webpack_require__(59);
+	var getNative = __webpack_require__(73),
+	    root = __webpack_require__(60);
 
 	/* Built-in method references that are verified to be native. */
 	var Map = getNative(root, 'Map');
 
 	module.exports = Map;
 
 
 /***/ },
-/* 93 */
+/* 94 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getMapData = __webpack_require__(94);
+	var getMapData = __webpack_require__(95);
 
 	/**
 	 * Removes `key` and its value from the map.
 	 *
 	 * @private
 	 * @name delete
 	 * @memberOf MapCache
 	 * @param {string} key The key of the value to remove.
@@ -6063,20 +6354,20 @@ return /******/ (function(modules) { // 
 	  this.size -= result ? 1 : 0;
 	  return result;
 	}
 
 	module.exports = mapCacheDelete;
 
 
 /***/ },
-/* 94 */
+/* 95 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isKeyable = __webpack_require__(95);
+	var isKeyable = __webpack_require__(96);
 
 	/**
 	 * Gets the data for `map`.
 	 *
 	 * @private
 	 * @param {Object} map The map to query.
 	 * @param {string} key The reference key.
 	 * @returns {*} Returns the map data.
@@ -6087,17 +6378,17 @@ return /******/ (function(modules) { // 
 	    ? data[typeof key == 'string' ? 'string' : 'hash']
 	    : data.map;
 	}
 
 	module.exports = getMapData;
 
 
 /***/ },
-/* 95 */
+/* 96 */
 /***/ function(module, exports) {
 
 	/**
 	 * Checks if `value` is suitable for use as unique object key.
 	 *
 	 * @private
 	 * @param {*} value The value to check.
 	 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
@@ -6108,20 +6399,20 @@ return /******/ (function(modules) { // 
 	    ? (value !== '__proto__')
 	    : (value === null);
 	}
 
 	module.exports = isKeyable;
 
 
 /***/ },
-/* 96 */
+/* 97 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getMapData = __webpack_require__(94);
+	var getMapData = __webpack_require__(95);
 
 	/**
 	 * Gets the map value for `key`.
 	 *
 	 * @private
 	 * @name get
 	 * @memberOf MapCache
 	 * @param {string} key The key of the value to get.
@@ -6130,20 +6421,20 @@ return /******/ (function(modules) { // 
 	function mapCacheGet(key) {
 	  return getMapData(this, key).get(key);
 	}
 
 	module.exports = mapCacheGet;
 
 
 /***/ },
-/* 97 */
+/* 98 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getMapData = __webpack_require__(94);
+	var getMapData = __webpack_require__(95);
 
 	/**
 	 * Checks if a map value for `key` exists.
 	 *
 	 * @private
 	 * @name has
 	 * @memberOf MapCache
 	 * @param {string} key The key of the entry to check.
@@ -6152,20 +6443,20 @@ return /******/ (function(modules) { // 
 	function mapCacheHas(key) {
 	  return getMapData(this, key).has(key);
 	}
 
 	module.exports = mapCacheHas;
 
 
 /***/ },
-/* 98 */
+/* 99 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var getMapData = __webpack_require__(94);
+	var getMapData = __webpack_require__(95);
 
 	/**
 	 * Sets the map `key` to `value`.
 	 *
 	 * @private
 	 * @name set
 	 * @memberOf MapCache
 	 * @param {string} key The key of the value to set.
@@ -6180,20 +6471,20 @@ return /******/ (function(modules) { // 
 	  this.size += data.size == size ? 0 : 1;
 	  return this;
 	}
 
 	module.exports = mapCacheSet;
 
 
 /***/ },
-/* 99 */
+/* 100 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseToString = __webpack_require__(100);
+	var baseToString = __webpack_require__(101);
 
 	/**
 	 * Converts `value` to a string. An empty string is returned for `null`
 	 * and `undefined` values. The sign of `-0` is preserved.
 	 *
 	 * @static
 	 * @memberOf _
 	 * @since 4.0.0
@@ -6214,23 +6505,23 @@ return /******/ (function(modules) { // 
 	function toString(value) {
 	  return value == null ? '' : baseToString(value);
 	}
 
 	module.exports = toString;
 
 
 /***/ },
-/* 100 */
+/* 101 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var Symbol = __webpack_require__(58),
-	    arrayMap = __webpack_require__(101),
-	    isArray = __webpack_require__(54),
-	    isSymbol = __webpack_require__(56);
+	var Symbol = __webpack_require__(59),
+	    arrayMap = __webpack_require__(102),
+	    isArray = __webpack_require__(55),
+	    isSymbol = __webpack_require__(57);
 
 	/** Used as references for various `Number` constants. */
 	var INFINITY = 1 / 0;
 
 	/** Used to convert symbols to primitives and strings. */
 	var symbolProto = Symbol ? Symbol.prototype : undefined,
 	    symbolToString = symbolProto ? symbolProto.toString : undefined;
 
@@ -6257,17 +6548,17 @@ return /******/ (function(modules) { // 
 	  var result = (value + '');
 	  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
 	}
 
 	module.exports = baseToString;
 
 
 /***/ },
-/* 101 */
+/* 102 */
 /***/ function(module, exports) {
 
 	/**
 	 * A specialized version of `_.map` for arrays without support for iteratee
 	 * shorthands.
 	 *
 	 * @private
 	 * @param {Array} [array] The array to iterate over.
@@ -6284,20 +6575,20 @@ return /******/ (function(modules) { // 
 	  }
 	  return result;
 	}
 
 	module.exports = arrayMap;
 
 
 /***/ },
-/* 102 */
+/* 103 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isSymbol = __webpack_require__(56);
+	var isSymbol = __webpack_require__(57);
 
 	/** Used as references for various `Number` constants. */
 	var INFINITY = 1 / 0;
 
 	/**
 	 * Converts `value` to a string key if it's not a string or symbol.
 	 *
 	 * @private
@@ -6311,21 +6602,21 @@ return /******/ (function(modules) { // 
 	  var result = (value + '');
 	  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
 	}
 
 	module.exports = toKey;
 
 
 /***/ },
-/* 103 */
+/* 104 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseHas = __webpack_require__(104),
-	    hasPath = __webpack_require__(105);
+	var baseHas = __webpack_require__(105),
+	    hasPath = __webpack_require__(106);
 
 	/**
 	 * Checks if `path` is a direct property of `object`.
 	 *
 	 * @static
 	 * @since 0.1.0
 	 * @memberOf _
 	 * @category Object
@@ -6352,17 +6643,17 @@ return /******/ (function(modules) { // 
 	function has(object, path) {
 	  return object != null && hasPath(object, path, baseHas);
 	}
 
 	module.exports = has;
 
 
 /***/ },
-/* 104 */
+/* 105 */
 /***/ function(module, exports) {
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/** Used to check objects for own properties. */
 	var hasOwnProperty = objectProto.hasOwnProperty;
 
@@ -6377,25 +6668,25 @@ return /******/ (function(modules) { // 
 	function baseHas(object, key) {
 	  return object != null && hasOwnProperty.call(object, key);
 	}
 
 	module.exports = baseHas;
 
 
 /***/ },
-/* 105 */
+/* 106 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var castPath = __webpack_require__(53),
-	    isArguments = __webpack_require__(106),
-	    isArray = __webpack_require__(54),
-	    isIndex = __webpack_require__(108),
-	    isLength = __webpack_require__(109),
-	    toKey = __webpack_require__(102);
+	var castPath = __webpack_require__(54),
+	    isArguments = __webpack_require__(107),
+	    isArray = __webpack_require__(55),
+	    isIndex = __webpack_require__(109),
+	    isLength = __webpack_require__(110),
+	    toKey = __webpack_require__(103);
 
 	/**
 	 * 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.
@@ -6422,21 +6713,21 @@ return /******/ (function(modules) { // 
 	  return !!length && isLength(length) && isIndex(key, length) &&
 	    (isArray(object) || isArguments(object));
 	}
 
 	module.exports = hasPath;
 
 
 /***/ },
-/* 106 */
+/* 107 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseIsArguments = __webpack_require__(107),
-	    isObjectLike = __webpack_require__(63);
+	var baseIsArguments = __webpack_require__(108),
+	    isObjectLike = __webpack_require__(64);
 
 	/** Used for built-in method references. */
 	var objectProto = Object.prototype;
 
 	/** Used to check objects for own properties. */
 	var hasOwnProperty = objectProto.hasOwnProperty;
 
 	/** Built-in value references. */
@@ -6464,21 +6755,21 @@ return /******/ (function(modules) { // 
 	  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
 	    !propertyIsEnumerable.call(value, 'callee');
 	};
 
 	module.exports = isArguments;
 
 
 /***/ },
-/* 107 */
+/* 108 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var baseGetTag = __webpack_require__(57),
-	    isObjectLike = __webpack_require__(63);
+	var baseGetTag = __webpack_require__(58),
+	    isObjectLike = __webpack_require__(64);
 
 	/** `Object#toString` result references. */
 	var argsTag = '[object Arguments]';
 
 	/**
 	 * The base implementation of `_.isArguments`.
 	 *
 	 * @private
@@ -6488,17 +6779,17 @@ return /******/ (function(modules) { // 
 	function baseIsArguments(value) {
 	  return isObjectLike(value) && baseGetTag(value) == argsTag;
 	}
 
 	module.exports = baseIsArguments;
 
 
 /***/ },
-/* 108 */
+/* 109 */
 /***/ function(module, exports) {
 
 	/** Used as references for various `Number` constants. */
 	var MAX_SAFE_INTEGER = 9007199254740991;
 
 	/** Used to detect unsigned integer values. */
 	var reIsUint = /^(?:0|[1-9]\d*)$/;
 
@@ -6516,17 +6807,17 @@ return /******/ (function(modules) { // 
 	    (typeof value == 'number' || reIsUint.test(value)) &&
 	    (value > -1 && value % 1 == 0 && value < length);
 	}
 
 	module.exports = isIndex;
 
 
 /***/ },
-/* 109 */
+/* 110 */
 /***/ function(module, exports) {
 
 	/** Used as references for various `Number` constants. */
 	var MAX_SAFE_INTEGER = 9007199254740991;
 
 	/**
 	 * Checks if `value` is a valid array-like length.
 	 *