lodash-rails 3.7.0 → 3.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acbbe1f3b24a2ea334617126bb2d94a6e7d3bb05
4
- data.tar.gz: 8a613b8d22d1384e9e22669773e7684af4579e86
3
+ metadata.gz: e68b7bc295668dde308b82203de11d70bbc4fb0d
4
+ data.tar.gz: 5dff5e2a2e145a06baa3d6121ddbd67b79f4a6ae
5
5
  SHA512:
6
- metadata.gz: e57eca4fd02abf4bd954a2f38eea63db6fd9a7f83f197160feb7548418fb06ab236655128a4b64aa2546748398445f7e215dfa08fb4b5b2e507ce4f55b91c713
7
- data.tar.gz: 213b0f0b9492e9aa9baad0b9f1b2647a081a2ceecfc8e048f5440cf6a862988959b94b2c6f4952a12a13697e1a6acdd502bac3de6ead52edfa02fb6e0fce0881
6
+ metadata.gz: 1b8de3edf3042d0cdbb444dd05249f9fb5f86ac3a8df87aeb3f62bd83daf3ca4573b47a2a3c69bcb67404d21c661fa837e772086056dd389c54ad2541d9e9423
7
+ data.tar.gz: ab96f3c348ebb4c5e97aad3c002144cfdb0b4481ece3d62df7a23e6ebef1e8a533a2d5b989587d11ae2edce63dbb99f4b41c8439c2cf861b434c24ea3e8a56ab
data/README.md CHANGED
@@ -18,7 +18,7 @@ Add the necessary library to `app/assets/javascripts/application.js`:
18
18
 
19
19
  ## What's included?
20
20
 
21
- lodash 3.7.0:
21
+ lodash 3.9.3:
22
22
 
23
23
  * lodash.js
24
24
  * lodash.min.js
@@ -1,5 +1,5 @@
1
1
  module LoDash
2
2
  module Rails
3
- VERSION = "3.7.0"
3
+ VERSION = "3.9.3"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * lodash 3.7.0 (Custom Build) <https://lodash.com/>
3
+ * lodash 3.9.3 (Custom Build) <https://lodash.com/>
4
4
  * Build: `lodash compat -o ./lodash.js`
5
5
  * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
6
6
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -13,7 +13,7 @@
13
13
  var undefined;
14
14
 
15
15
  /** Used as the semantic version number. */
16
- var VERSION = '3.7.0';
16
+ var VERSION = '3.9.3';
17
17
 
18
18
  /** Used to compose bitmasks for wrapper metadata. */
19
19
  var BIND_FLAG = 1,
@@ -88,7 +88,7 @@
88
88
  reInterpolate = /<%=([\s\S]+?)%>/g;
89
89
 
90
90
  /** Used to match property names within property paths. */
91
- var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,
91
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
92
92
  reIsPlainProp = /^\w*$/,
93
93
  rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
94
94
 
@@ -118,6 +118,9 @@
118
118
  /** Used to detect host constructors (Safari > 5). */
119
119
  var reIsHostCtor = /^\[object .+?Constructor\]$/;
120
120
 
121
+ /** Used to detect unsigned integer values. */
122
+ var reIsUint = /^\d+$/;
123
+
121
124
  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
122
125
  var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
123
126
 
@@ -152,9 +155,8 @@
152
155
  'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
153
156
  'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
154
157
  'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',
155
- 'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
156
- 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
157
- 'window'
158
+ 'isFinite', 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
159
+ 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', 'window'
158
160
  ];
159
161
 
160
162
  /** Used to fix the JScript `[[DontEnum]]` bug. */
@@ -281,7 +283,7 @@
281
283
  /**
282
284
  * Used as a reference to the global object.
283
285
  *
284
- * The `this` value is used if it is the global object to avoid Greasemonkey's
286
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
285
287
  * restricted `window` object, otherwise the `window` object is used.
286
288
  */
287
289
  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
@@ -293,19 +295,28 @@
293
295
  * sorts them in ascending order without guaranteeing a stable sort.
294
296
  *
295
297
  * @private
296
- * @param {*} value The value to compare to `other`.
297
- * @param {*} other The value to compare to `value`.
298
+ * @param {*} value The value to compare.
299
+ * @param {*} other The other value to compare.
298
300
  * @returns {number} Returns the sort order indicator for `value`.
299
301
  */
300
302
  function baseCompareAscending(value, other) {
301
303
  if (value !== other) {
302
- var valIsReflexive = value === value,
304
+ var valIsNull = value === null,
305
+ valIsUndef = value === undefined,
306
+ valIsReflexive = value === value;
307
+
308
+ var othIsNull = other === null,
309
+ othIsUndef = other === undefined,
303
310
  othIsReflexive = other === other;
304
311
 
305
- if (value > other || !valIsReflexive || (value === undefined && othIsReflexive)) {
312
+ if ((value > other && !othIsNull) || !valIsReflexive ||
313
+ (valIsNull && !othIsUndef && othIsReflexive) ||
314
+ (valIsUndef && othIsReflexive)) {
306
315
  return 1;
307
316
  }
308
- if (value < other || !othIsReflexive || (other === undefined && valIsReflexive)) {
317
+ if ((value < other && !valIsNull) || !othIsReflexive ||
318
+ (othIsNull && !valIsUndef && valIsReflexive) ||
319
+ (othIsUndef && valIsReflexive)) {
309
320
  return -1;
310
321
  }
311
322
  }
@@ -373,7 +384,7 @@
373
384
  }
374
385
 
375
386
  /**
376
- * Converts `value` to a string if it is not one. An empty string is returned
387
+ * Converts `value` to a string if it's not one. An empty string is returned
377
388
  * for `null` or `undefined` values.
378
389
  *
379
390
  * @private
@@ -387,17 +398,6 @@
387
398
  return value == null ? '' : (value + '');
388
399
  }
389
400
 
390
- /**
391
- * Used by `_.max` and `_.min` as the default callback for string values.
392
- *
393
- * @private
394
- * @param {string} string The string to inspect.
395
- * @returns {number} Returns the code unit of the first character of the string.
396
- */
397
- function charAtCallback(string) {
398
- return string.charCodeAt(0);
399
- }
400
-
401
401
  /**
402
402
  * Used by `_.trim` and `_.trimLeft` to get the index of the first character
403
403
  * of `string` that is not found in `chars`.
@@ -741,7 +741,7 @@
741
741
  stringProto = String.prototype;
742
742
 
743
743
  /** Used to detect DOM support. */
744
- var document = (document = context.window) && document.document;
744
+ var document = (document = context.window) ? document.document : null;
745
745
 
746
746
  /** Used to resolve the decompiled source of functions. */
747
747
  var fnToString = Function.prototype.toString;
@@ -763,26 +763,25 @@
763
763
 
764
764
  /** Used to detect if a method is native. */
765
765
  var reIsNative = RegExp('^' +
766
- escapeRegExp(objToString)
767
- .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
766
+ escapeRegExp(fnToString.call(hasOwnProperty))
767
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
768
768
  );
769
769
 
770
770
  /** Native method references. */
771
- var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer,
772
- bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,
771
+ var ArrayBuffer = getNative(context, 'ArrayBuffer'),
772
+ bufferSlice = getNative(ArrayBuffer && new ArrayBuffer(0), 'slice'),
773
773
  ceil = Math.ceil,
774
774
  clearTimeout = context.clearTimeout,
775
775
  floor = Math.floor,
776
- getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols,
777
- getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
776
+ getPrototypeOf = getNative(Object, 'getPrototypeOf'),
777
+ parseFloat = context.parseFloat,
778
778
  push = arrayProto.push,
779
- preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions,
780
779
  propertyIsEnumerable = objectProto.propertyIsEnumerable,
781
- Set = isNative(Set = context.Set) && Set,
780
+ Set = getNative(context, 'Set'),
782
781
  setTimeout = context.setTimeout,
783
782
  splice = arrayProto.splice,
784
- Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array,
785
- WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;
783
+ Uint8Array = getNative(context, 'Uint8Array'),
784
+ WeakMap = getNative(context, 'WeakMap');
786
785
 
787
786
  /** Used to clone array buffers. */
788
787
  var Float64Array = (function() {
@@ -790,37 +789,21 @@
790
789
  // where the array buffer's `byteLength` is not a multiple of the typed
791
790
  // array's `BYTES_PER_ELEMENT`.
792
791
  try {
793
- var func = isNative(func = context.Float64Array) && func,
792
+ var func = getNative(context, 'Float64Array'),
794
793
  result = new func(new ArrayBuffer(10), 0, 1) && func;
795
794
  } catch(e) {}
796
- return result;
797
- }());
798
-
799
- /** Used as `baseAssign`. */
800
- var nativeAssign = (function() {
801
- // Avoid `Object.assign` in Firefox 34-37 which have an early implementation
802
- // with a now defunct try/catch behavior. See https://bugzilla.mozilla.org/show_bug.cgi?id=1103344
803
- // for more details.
804
- //
805
- // Use `Object.preventExtensions` on a plain object instead of simply using
806
- // `Object('x')` because Chrome and IE fail to throw an error when attempting
807
- // to assign values to readonly indexes of strings in strict mode.
808
- var object = { '1': 0 },
809
- func = preventExtensions && isNative(func = Object.assign) && func;
810
-
811
- try { func(preventExtensions(object), 'xo'); } catch(e) {}
812
- return !object[1] && func;
795
+ return result || null;
813
796
  }());
814
797
 
815
798
  /* Native method references for those with the same name as other `lodash` methods. */
816
- var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
817
- nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
799
+ var nativeCreate = getNative(Object, 'create'),
800
+ nativeIsArray = getNative(Array, 'isArray'),
818
801
  nativeIsFinite = context.isFinite,
819
- nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
802
+ nativeKeys = getNative(Object, 'keys'),
820
803
  nativeMax = Math.max,
821
804
  nativeMin = Math.min,
822
- nativeNow = isNative(nativeNow = Date.now) && nativeNow,
823
- nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite,
805
+ nativeNow = getNative(Date, 'now'),
806
+ nativeNumIsFinite = getNative(Number, 'isFinite'),
824
807
  nativeParseInt = context.parseInt,
825
808
  nativeRandom = Math.random;
826
809
 
@@ -829,8 +812,8 @@
829
812
  POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
830
813
 
831
814
  /** Used as references for the maximum length and index of an array. */
832
- var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,
833
- MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
815
+ var MAX_ARRAY_LENGTH = 4294967295,
816
+ MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
834
817
  HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
835
818
 
836
819
  /** Used as the size, in bytes, of each `Float64Array` element. */
@@ -840,7 +823,7 @@
840
823
  * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
841
824
  * of an array-like value.
842
825
  */
843
- var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
826
+ var MAX_SAFE_INTEGER = 9007199254740991;
844
827
 
845
828
  /** Used to store function metadata. */
846
829
  var metaMap = WeakMap && new WeakMap;
@@ -917,30 +900,31 @@
917
900
  * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,
918
901
  * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,
919
902
  * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,
920
- * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`,
921
- * `merge`, `mixin`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
922
- * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
923
- * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,
924
- * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,
925
- * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,
926
- * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,
927
- * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,
928
- * `without`, `wrap`, `xor`, `zip`, and `zipObject`
903
+ * `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
904
+ * `memoize`, `merge`, `method`, `methodOf`, `mixin`, `negate`, `omit`, `once`,
905
+ * `pairs`, `partial`, `partialRight`, `partition`, `pick`, `plant`, `pluck`,
906
+ * `property`, `propertyOf`, `pull`, `pullAt`, `push`, `range`, `rearg`,
907
+ * `reject`, `remove`, `rest`, `restParam`, `reverse`, `set`, `shuffle`,
908
+ * `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`, `spread`,
909
+ * `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`,
910
+ * `thru`, `times`, `toArray`, `toPlainObject`, `transform`, `union`, `uniq`,
911
+ * `unshift`, `unzip`, `unzipWith`, `values`, `valuesIn`, `where`, `without`,
912
+ * `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
929
913
  *
930
914
  * The wrapper methods that are **not** chainable by default are:
931
915
  * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,
932
916
  * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
933
- * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,
934
- * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,
935
- * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`
936
- * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`,
937
- * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `isTypedArray`,
938
- * `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, `noConflict`,
939
- * `noop`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`,
940
- * `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, `shift`, `size`,
941
- * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, `startsWith`,
942
- * `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, `unescape`,
943
- * `uniqueId`, `value`, and `words`
917
+ * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `get`,
918
+ * `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, `inRange`, `isArguments`,
919
+ * `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,
920
+ * `isFinite` `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,
921
+ * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,
922
+ * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `lt`, `lte`,
923
+ * `max`, `min`, `noConflict`, `noop`, `now`, `pad`, `padLeft`, `padRight`,
924
+ * `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`,
925
+ * `runInContext`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`,
926
+ * `sortedLastIndex`, `startCase`, `startsWith`, `sum`, `template`, `trim`,
927
+ * `trimLeft`, `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`
944
928
  *
945
929
  * The wrapper method `sample` will return a wrapped value when `n` is provided,
946
930
  * otherwise an unwrapped value is returned.
@@ -1055,24 +1039,6 @@
1055
1039
  */
1056
1040
  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
1057
1041
 
1058
- /**
1059
- * Detect if functions can be decompiled by `Function#toString`
1060
- * (all but Firefox OS certified apps, older Opera mobile browsers, and
1061
- * the PlayStation 3; forced `false` for Windows 8 apps).
1062
- *
1063
- * @memberOf _.support
1064
- * @type boolean
1065
- */
1066
- support.funcDecomp = /\bthis\b/.test(function() { return this; });
1067
-
1068
- /**
1069
- * Detect if `Function#name` is supported (all but IE).
1070
- *
1071
- * @memberOf _.support
1072
- * @type boolean
1073
- */
1074
- support.funcNames = typeof Function.name == 'string';
1075
-
1076
1042
  /**
1077
1043
  * Detect if the `toStringTag` of DOM nodes is resolvable (all but IE < 9).
1078
1044
  *
@@ -1081,14 +1047,6 @@
1081
1047
  */
1082
1048
  support.nodeTag = objToString.call(document) != objectTag;
1083
1049
 
1084
- /**
1085
- * Detect if string indexes are non-enumerable (IE < 9, RingoJS, Rhino, Narwhal).
1086
- *
1087
- * @memberOf _.support
1088
- * @type boolean
1089
- */
1090
- support.nonEnumStrings = !propertyIsEnumerable.call('x', 0);
1091
-
1092
1050
  /**
1093
1051
  * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
1094
1052
  *
@@ -1145,24 +1103,6 @@
1145
1103
  } catch(e) {
1146
1104
  support.dom = false;
1147
1105
  }
1148
-
1149
- /**
1150
- * Detect if `arguments` object indexes are non-enumerable.
1151
- *
1152
- * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object
1153
- * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat
1154
- * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`
1155
- * checks for indexes that exceed the number of function parameters and
1156
- * whose associated argument values are `0`.
1157
- *
1158
- * @memberOf _.support
1159
- * @type boolean
1160
- */
1161
- try {
1162
- support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);
1163
- } catch(e) {
1164
- support.nonEnumArgs = true;
1165
- }
1166
1106
  }(1, 0));
1167
1107
 
1168
1108
  /**
@@ -1561,6 +1501,35 @@
1561
1501
  return true;
1562
1502
  }
1563
1503
 
1504
+ /**
1505
+ * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
1506
+ * with one argument: (value).
1507
+ *
1508
+ * @private
1509
+ * @param {Array} array The array to iterate over.
1510
+ * @param {Function} iteratee The function invoked per iteration.
1511
+ * @param {Function} comparator The function used to compare values.
1512
+ * @param {*} exValue The initial extremum value.
1513
+ * @returns {*} Returns the extremum value.
1514
+ */
1515
+ function arrayExtremum(array, iteratee, comparator, exValue) {
1516
+ var index = -1,
1517
+ length = array.length,
1518
+ computed = exValue,
1519
+ result = computed;
1520
+
1521
+ while (++index < length) {
1522
+ var value = array[index],
1523
+ current = +iteratee(value);
1524
+
1525
+ if (comparator(current, computed)) {
1526
+ computed = current;
1527
+ result = value;
1528
+ }
1529
+ }
1530
+ return result;
1531
+ }
1532
+
1564
1533
  /**
1565
1534
  * A specialized version of `_.filter` for arrays without support for callback
1566
1535
  * shorthands and `this` binding.
@@ -1605,48 +1574,6 @@
1605
1574
  return result;
1606
1575
  }
1607
1576
 
1608
- /**
1609
- * A specialized version of `_.max` for arrays without support for iteratees.
1610
- *
1611
- * @private
1612
- * @param {Array} array The array to iterate over.
1613
- * @returns {*} Returns the maximum value.
1614
- */
1615
- function arrayMax(array) {
1616
- var index = -1,
1617
- length = array.length,
1618
- result = NEGATIVE_INFINITY;
1619
-
1620
- while (++index < length) {
1621
- var value = array[index];
1622
- if (value > result) {
1623
- result = value;
1624
- }
1625
- }
1626
- return result;
1627
- }
1628
-
1629
- /**
1630
- * A specialized version of `_.min` for arrays without support for iteratees.
1631
- *
1632
- * @private
1633
- * @param {Array} array The array to iterate over.
1634
- * @returns {*} Returns the minimum value.
1635
- */
1636
- function arrayMin(array) {
1637
- var index = -1,
1638
- length = array.length,
1639
- result = POSITIVE_INFINITY;
1640
-
1641
- while (++index < length) {
1642
- var value = array[index];
1643
- if (value < result) {
1644
- result = value;
1645
- }
1646
- }
1647
- return result;
1648
- }
1649
-
1650
1577
  /**
1651
1578
  * A specialized version of `_.reduce` for arrays without support for callback
1652
1579
  * shorthands and `this` binding.
@@ -1777,10 +1704,8 @@
1777
1704
  * @returns {Object} Returns `object`.
1778
1705
  */
1779
1706
  function assignWith(object, source, customizer) {
1780
- var props = keys(source);
1781
- push.apply(props, getSymbols(source));
1782
-
1783
1707
  var index = -1,
1708
+ props = keys(source),
1784
1709
  length = props.length;
1785
1710
 
1786
1711
  while (++index < length) {
@@ -1805,11 +1730,11 @@
1805
1730
  * @param {Object} source The source object.
1806
1731
  * @returns {Object} Returns `object`.
1807
1732
  */
1808
- var baseAssign = nativeAssign || function(object, source) {
1733
+ function baseAssign(object, source) {
1809
1734
  return source == null
1810
1735
  ? object
1811
- : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object));
1812
- };
1736
+ : baseCopy(source, keys(source), object);
1737
+ }
1813
1738
 
1814
1739
  /**
1815
1740
  * The base implementation of `_.at` without support for string collections
@@ -1822,8 +1747,9 @@
1822
1747
  */
1823
1748
  function baseAt(collection, props) {
1824
1749
  var index = -1,
1825
- length = collection.length,
1826
- isArr = isLength(length),
1750
+ isNil = collection == null,
1751
+ isArr = !isNil && isArrayLike(collection),
1752
+ length = isArr ? collection.length : 0,
1827
1753
  propsLength = props.length,
1828
1754
  result = Array(propsLength);
1829
1755
 
@@ -1832,7 +1758,7 @@
1832
1758
  if (isArr) {
1833
1759
  result[index] = isIndex(key, length) ? collection[key] : undefined;
1834
1760
  } else {
1835
- result[index] = collection[key];
1761
+ result[index] = isNil ? undefined : collection[key];
1836
1762
  }
1837
1763
  }
1838
1764
  return result;
@@ -1967,14 +1893,14 @@
1967
1893
  * @returns {Object} Returns the new object.
1968
1894
  */
1969
1895
  var baseCreate = (function() {
1970
- function Object() {}
1896
+ function object() {}
1971
1897
  return function(prototype) {
1972
1898
  if (isObject(prototype)) {
1973
- Object.prototype = prototype;
1974
- var result = new Object;
1975
- Object.prototype = null;
1899
+ object.prototype = prototype;
1900
+ var result = new object;
1901
+ object.prototype = null;
1976
1902
  }
1977
- return result || context.Object();
1903
+ return result || {};
1978
1904
  };
1979
1905
  }());
1980
1906
 
@@ -2083,6 +2009,32 @@
2083
2009
  return result;
2084
2010
  }
2085
2011
 
2012
+ /**
2013
+ * Gets the extremum value of `collection` invoking `iteratee` for each value
2014
+ * in `collection` to generate the criterion by which the value is ranked.
2015
+ * The `iteratee` is invoked with three arguments: (value, index|key, collection).
2016
+ *
2017
+ * @private
2018
+ * @param {Array|Object|string} collection The collection to iterate over.
2019
+ * @param {Function} iteratee The function invoked per iteration.
2020
+ * @param {Function} comparator The function used to compare values.
2021
+ * @param {*} exValue The initial extremum value.
2022
+ * @returns {*} Returns the extremum value.
2023
+ */
2024
+ function baseExtremum(collection, iteratee, comparator, exValue) {
2025
+ var computed = exValue,
2026
+ result = computed;
2027
+
2028
+ baseEach(collection, function(value, index, collection) {
2029
+ var current = +iteratee(value, index, collection);
2030
+ if (comparator(current, computed) || (current === exValue && current === result)) {
2031
+ computed = current;
2032
+ result = value;
2033
+ }
2034
+ });
2035
+ return result;
2036
+ }
2037
+
2086
2038
  /**
2087
2039
  * The base implementation of `_.fill` without an iteratee call guard.
2088
2040
  *
@@ -2162,8 +2114,8 @@
2162
2114
  *
2163
2115
  * @private
2164
2116
  * @param {Array} array The array to flatten.
2165
- * @param {boolean} isDeep Specify a deep flatten.
2166
- * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
2117
+ * @param {boolean} [isDeep] Specify a deep flatten.
2118
+ * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
2167
2119
  * @returns {Array} Returns the new flattened array.
2168
2120
  */
2169
2121
  function baseFlatten(array, isDeep, isStrict) {
@@ -2174,8 +2126,8 @@
2174
2126
 
2175
2127
  while (++index < length) {
2176
2128
  var value = array[index];
2177
-
2178
- if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
2129
+ if (isObjectLike(value) && isArrayLike(value) &&
2130
+ (isStrict || isArray(value) || isArguments(value))) {
2179
2131
  if (isDeep) {
2180
2132
  // Recursively flatten arrays (susceptible to call stack limits).
2181
2133
  value = baseFlatten(value, isDeep, isStrict);
@@ -2183,7 +2135,6 @@
2183
2135
  var valIndex = -1,
2184
2136
  valLength = value.length;
2185
2137
 
2186
- result.length += valLength;
2187
2138
  while (++valIndex < valLength) {
2188
2139
  result[++resIndex] = value[valIndex];
2189
2140
  }
@@ -2301,13 +2252,13 @@
2301
2252
  if (pathKey !== undefined && pathKey in object) {
2302
2253
  path = [pathKey];
2303
2254
  }
2304
- var index = -1,
2255
+ var index = 0,
2305
2256
  length = path.length;
2306
2257
 
2307
- while (object != null && ++index < length) {
2308
- var result = object = toObject(object)[path[index]];
2258
+ while (object != null && index < length) {
2259
+ object = toObject(object)[path[index++]];
2309
2260
  }
2310
- return result;
2261
+ return (index && index == length) ? object : undefined;
2311
2262
  }
2312
2263
 
2313
2264
  /**
@@ -2324,18 +2275,10 @@
2324
2275
  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2325
2276
  */
2326
2277
  function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
2327
- // Exit early for identical values.
2328
2278
  if (value === other) {
2329
- // Treat `+0` vs. `-0` as not equal.
2330
- return value !== 0 || (1 / value == 1 / other);
2279
+ return true;
2331
2280
  }
2332
- var valType = typeof value,
2333
- othType = typeof other;
2334
-
2335
- // Exit early for unlike primitive values.
2336
- if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||
2337
- value == null || other == null) {
2338
- // Return `false` unless both values are `NaN`.
2281
+ if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
2339
2282
  return value !== value && other !== other;
2340
2283
  }
2341
2284
  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
@@ -2386,11 +2329,11 @@
2386
2329
  return equalByTag(object, other, objTag);
2387
2330
  }
2388
2331
  if (!isLoose) {
2389
- var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
2390
- othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2332
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
2333
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2391
2334
 
2392
- if (valWrapped || othWrapped) {
2393
- return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
2335
+ if (objIsWrapped || othIsWrapped) {
2336
+ return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
2394
2337
  }
2395
2338
  }
2396
2339
  if (!isSameTag) {
@@ -2425,42 +2368,44 @@
2425
2368
  *
2426
2369
  * @private
2427
2370
  * @param {Object} object The object to inspect.
2428
- * @param {Array} props The source property names to match.
2429
- * @param {Array} values The source values to match.
2430
- * @param {Array} strictCompareFlags Strict comparison flags for source values.
2371
+ * @param {Array} matchData The propery names, values, and compare flags to match.
2431
2372
  * @param {Function} [customizer] The function to customize comparing objects.
2432
2373
  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
2433
2374
  */
2434
- function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
2435
- var index = -1,
2436
- length = props.length,
2375
+ function baseIsMatch(object, matchData, customizer) {
2376
+ var index = matchData.length,
2377
+ length = index,
2437
2378
  noCustomizer = !customizer;
2438
2379
 
2439
- while (++index < length) {
2440
- if ((noCustomizer && strictCompareFlags[index])
2441
- ? values[index] !== object[props[index]]
2442
- : !(props[index] in object)
2380
+ if (object == null) {
2381
+ return !length;
2382
+ }
2383
+ object = toObject(object);
2384
+ while (index--) {
2385
+ var data = matchData[index];
2386
+ if ((noCustomizer && data[2])
2387
+ ? data[1] !== object[data[0]]
2388
+ : !(data[0] in object)
2443
2389
  ) {
2444
2390
  return false;
2445
2391
  }
2446
2392
  }
2447
- index = -1;
2448
2393
  while (++index < length) {
2449
- var key = props[index],
2394
+ data = matchData[index];
2395
+ var key = data[0],
2450
2396
  objValue = object[key],
2451
- srcValue = values[index];
2397
+ srcValue = data[1];
2452
2398
 
2453
- if (noCustomizer && strictCompareFlags[index]) {
2454
- var result = objValue !== undefined || (key in object);
2399
+ if (noCustomizer && data[2]) {
2400
+ if (objValue === undefined && !(key in object)) {
2401
+ return false;
2402
+ }
2455
2403
  } else {
2456
- result = customizer ? customizer(objValue, srcValue, key) : undefined;
2457
- if (result === undefined) {
2458
- result = baseIsEqual(srcValue, objValue, customizer, true);
2404
+ var result = customizer ? customizer(objValue, srcValue, key) : undefined;
2405
+ if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
2406
+ return false;
2459
2407
  }
2460
2408
  }
2461
- if (!result) {
2462
- return false;
2463
- }
2464
2409
  }
2465
2410
  return true;
2466
2411
  }
@@ -2476,8 +2421,7 @@
2476
2421
  */
2477
2422
  function baseMap(collection, iteratee) {
2478
2423
  var index = -1,
2479
- length = getLength(collection),
2480
- result = isLength(length) ? Array(length) : [];
2424
+ result = isArrayLike(collection) ? Array(collection.length) : [];
2481
2425
 
2482
2426
  baseEach(collection, function(value, key, collection) {
2483
2427
  result[++index] = iteratee(value, key, collection);
@@ -2493,51 +2437,35 @@
2493
2437
  * @returns {Function} Returns the new function.
2494
2438
  */
2495
2439
  function baseMatches(source) {
2496
- var props = keys(source),
2497
- length = props.length;
2498
-
2499
- if (!length) {
2500
- return constant(true);
2501
- }
2502
- if (length == 1) {
2503
- var key = props[0],
2504
- value = source[key];
2440
+ var matchData = getMatchData(source);
2441
+ if (matchData.length == 1 && matchData[0][2]) {
2442
+ var key = matchData[0][0],
2443
+ value = matchData[0][1];
2505
2444
 
2506
- if (isStrictComparable(value)) {
2507
- return function(object) {
2508
- if (object == null) {
2509
- return false;
2510
- }
2511
- object = toObject(object);
2512
- return object[key] === value && (value !== undefined || (key in object));
2513
- };
2514
- }
2515
- }
2516
- var values = Array(length),
2517
- strictCompareFlags = Array(length);
2518
-
2519
- while (length--) {
2520
- value = source[props[length]];
2521
- values[length] = value;
2522
- strictCompareFlags[length] = isStrictComparable(value);
2445
+ return function(object) {
2446
+ if (object == null) {
2447
+ return false;
2448
+ }
2449
+ object = toObject(object);
2450
+ return object[key] === value && (value !== undefined || (key in object));
2451
+ };
2523
2452
  }
2524
2453
  return function(object) {
2525
- return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);
2454
+ return baseIsMatch(object, matchData);
2526
2455
  };
2527
2456
  }
2528
2457
 
2529
2458
  /**
2530
- * The base implementation of `_.matchesProperty` which does not which does
2531
- * not clone `value`.
2459
+ * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
2532
2460
  *
2533
2461
  * @private
2534
2462
  * @param {string} path The path of the property to get.
2535
- * @param {*} value The value to compare.
2463
+ * @param {*} srcValue The value to compare.
2536
2464
  * @returns {Function} Returns the new function.
2537
2465
  */
2538
- function baseMatchesProperty(path, value) {
2466
+ function baseMatchesProperty(path, srcValue) {
2539
2467
  var isArr = isArray(path),
2540
- isCommon = isKey(path) && isStrictComparable(value),
2468
+ isCommon = isKey(path) && isStrictComparable(srcValue),
2541
2469
  pathKey = (path + '');
2542
2470
 
2543
2471
  path = toPath(path);
@@ -2555,9 +2483,9 @@
2555
2483
  key = last(path);
2556
2484
  object = toObject(object);
2557
2485
  }
2558
- return object[key] === value
2559
- ? (value !== undefined || (key in object))
2560
- : baseIsEqual(value, object[key], null, true);
2486
+ return object[key] === srcValue
2487
+ ? (srcValue !== undefined || (key in object))
2488
+ : baseIsEqual(srcValue, object[key], undefined, true);
2561
2489
  };
2562
2490
  }
2563
2491
 
@@ -2577,11 +2505,9 @@
2577
2505
  if (!isObject(object)) {
2578
2506
  return object;
2579
2507
  }
2580
- var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
2581
- if (!isSrcArr) {
2582
- var props = keys(source);
2583
- push.apply(props, getSymbols(source));
2584
- }
2508
+ var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
2509
+ props = isSrcArr ? null : keys(source);
2510
+
2585
2511
  arrayEach(props || source, function(srcValue, key) {
2586
2512
  if (props) {
2587
2513
  key = srcValue;
@@ -2600,7 +2526,7 @@
2600
2526
  if (isCommon) {
2601
2527
  result = srcValue;
2602
2528
  }
2603
- if ((isSrcArr || result !== undefined) &&
2529
+ if ((result !== undefined || (isSrcArr && !(key in object))) &&
2604
2530
  (isCommon || (result === result ? (result !== value) : (value === value)))) {
2605
2531
  object[key] = result;
2606
2532
  }
@@ -2640,10 +2566,10 @@
2640
2566
 
2641
2567
  if (isCommon) {
2642
2568
  result = srcValue;
2643
- if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
2569
+ if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
2644
2570
  result = isArray(value)
2645
2571
  ? value
2646
- : (getLength(value) ? arrayCopy(value) : []);
2572
+ : (isArrayLike(value) ? arrayCopy(value) : []);
2647
2573
  }
2648
2574
  else if (isPlainObject(srcValue) || isArguments(srcValue)) {
2649
2575
  result = isArguments(value)
@@ -2705,9 +2631,9 @@
2705
2631
  * @returns {Array} Returns `array`.
2706
2632
  */
2707
2633
  function basePullAt(array, indexes) {
2708
- var length = indexes.length;
2634
+ var length = array ? indexes.length : 0;
2709
2635
  while (length--) {
2710
- var index = parseFloat(indexes[length]);
2636
+ var index = indexes[length];
2711
2637
  if (index != previous && isIndex(index)) {
2712
2638
  var previous = index;
2713
2639
  splice.call(array, index, 1);
@@ -3020,7 +2946,7 @@
3020
2946
  var mid = (low + high) >>> 1,
3021
2947
  computed = array[mid];
3022
2948
 
3023
- if (retHighest ? (computed <= value) : (computed < value)) {
2949
+ if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
3024
2950
  low = mid + 1;
3025
2951
  } else {
3026
2952
  high = mid;
@@ -3050,17 +2976,23 @@
3050
2976
  var low = 0,
3051
2977
  high = array ? array.length : 0,
3052
2978
  valIsNaN = value !== value,
2979
+ valIsNull = value === null,
3053
2980
  valIsUndef = value === undefined;
3054
2981
 
3055
2982
  while (low < high) {
3056
2983
  var mid = floor((low + high) / 2),
3057
2984
  computed = iteratee(array[mid]),
2985
+ isDef = computed !== undefined,
3058
2986
  isReflexive = computed === computed;
3059
2987
 
3060
2988
  if (valIsNaN) {
3061
2989
  var setLow = isReflexive || retHighest;
2990
+ } else if (valIsNull) {
2991
+ setLow = isReflexive && isDef && (retHighest || computed != null);
3062
2992
  } else if (valIsUndef) {
3063
- setLow = isReflexive && (retHighest || computed !== undefined);
2993
+ setLow = isReflexive && (retHighest || isDef);
2994
+ } else if (computed == null) {
2995
+ setLow = false;
3064
2996
  } else {
3065
2997
  setLow = retHighest ? (computed <= value) : (computed < value);
3066
2998
  }
@@ -3191,12 +3123,12 @@
3191
3123
  while (++argsIndex < argsLength) {
3192
3124
  result[argsIndex] = args[argsIndex];
3193
3125
  }
3194
- var pad = argsIndex;
3126
+ var offset = argsIndex;
3195
3127
  while (++rightIndex < rightLength) {
3196
- result[pad + rightIndex] = partials[rightIndex];
3128
+ result[offset + rightIndex] = partials[rightIndex];
3197
3129
  }
3198
3130
  while (++holdersIndex < holdersLength) {
3199
- result[pad + holders[holdersIndex]] = args[argsIndex++];
3131
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
3200
3132
  }
3201
3133
  return result;
3202
3134
  }
@@ -3250,19 +3182,19 @@
3250
3182
  return restParam(function(object, sources) {
3251
3183
  var index = -1,
3252
3184
  length = object == null ? 0 : sources.length,
3253
- customizer = length > 2 && sources[length - 2],
3254
- guard = length > 2 && sources[2],
3255
- thisArg = length > 1 && sources[length - 1];
3185
+ customizer = length > 2 ? sources[length - 2] : undefined,
3186
+ guard = length > 2 ? sources[2] : undefined,
3187
+ thisArg = length > 1 ? sources[length - 1] : undefined;
3256
3188
 
3257
3189
  if (typeof customizer == 'function') {
3258
3190
  customizer = bindCallback(customizer, thisArg, 5);
3259
3191
  length -= 2;
3260
3192
  } else {
3261
- customizer = typeof thisArg == 'function' ? thisArg : null;
3193
+ customizer = typeof thisArg == 'function' ? thisArg : undefined;
3262
3194
  length -= (customizer ? 1 : 0);
3263
3195
  }
3264
3196
  if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3265
- customizer = length < 3 ? null : customizer;
3197
+ customizer = length < 3 ? undefined : customizer;
3266
3198
  length = 1;
3267
3199
  }
3268
3200
  while (++index < length) {
@@ -3387,8 +3319,20 @@
3387
3319
  */
3388
3320
  function createCtorWrapper(Ctor) {
3389
3321
  return function() {
3322
+ // Use a `switch` statement to work with class constructors.
3323
+ // See https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-function-objects-call-thisargument-argumentslist
3324
+ // for more details.
3325
+ var args = arguments;
3326
+ switch (args.length) {
3327
+ case 0: return new Ctor;
3328
+ case 1: return new Ctor(args[0]);
3329
+ case 2: return new Ctor(args[0], args[1]);
3330
+ case 3: return new Ctor(args[0], args[1], args[2]);
3331
+ case 4: return new Ctor(args[0], args[1], args[2], args[3]);
3332
+ case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
3333
+ }
3390
3334
  var thisBinding = baseCreate(Ctor.prototype),
3391
- result = Ctor.apply(thisBinding, arguments);
3335
+ result = Ctor.apply(thisBinding, args);
3392
3336
 
3393
3337
  // Mimic the constructor's `return` behavior.
3394
3338
  // See https://es5.github.io/#x13.2.2 for more details.
@@ -3419,32 +3363,24 @@
3419
3363
  * Creates a `_.max` or `_.min` function.
3420
3364
  *
3421
3365
  * @private
3422
- * @param {Function} arrayFunc The function to get the extremum value from an array.
3423
- * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,
3424
- * extremum value.
3366
+ * @param {Function} comparator The function used to compare values.
3367
+ * @param {*} exValue The initial extremum value.
3425
3368
  * @returns {Function} Returns the new extremum function.
3426
3369
  */
3427
- function createExtremum(arrayFunc, isMin) {
3370
+ function createExtremum(comparator, exValue) {
3428
3371
  return function(collection, iteratee, thisArg) {
3429
3372
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
3430
3373
  iteratee = null;
3431
3374
  }
3432
- var func = getCallback(),
3433
- noIteratee = iteratee == null;
3434
-
3435
- if (!(func === baseCallback && noIteratee)) {
3436
- noIteratee = false;
3437
- iteratee = func(iteratee, thisArg, 3);
3438
- }
3439
- if (noIteratee) {
3440
- var isArr = isArray(collection);
3441
- if (!isArr && isString(collection)) {
3442
- iteratee = charAtCallback;
3443
- } else {
3444
- return arrayFunc(isArr ? collection : toIterable(collection));
3375
+ iteratee = getCallback(iteratee, thisArg, 3);
3376
+ if (iteratee.length == 1) {
3377
+ collection = toIterable(collection);
3378
+ var result = arrayExtremum(collection, iteratee, comparator, exValue);
3379
+ if (!(collection.length && result === exValue)) {
3380
+ return result;
3445
3381
  }
3446
3382
  }
3447
- return extremumBy(collection, iteratee, isMin);
3383
+ return baseExtremum(collection, iteratee, comparator, exValue);
3448
3384
  };
3449
3385
  }
3450
3386
 
@@ -3464,7 +3400,7 @@
3464
3400
  return index > -1 ? collection[index] : undefined;
3465
3401
  }
3466
3402
  return baseFind(collection, predicate, eachFunc);
3467
- }
3403
+ };
3468
3404
  }
3469
3405
 
3470
3406
  /**
@@ -3507,11 +3443,8 @@
3507
3443
  */
3508
3444
  function createFlow(fromRight) {
3509
3445
  return function() {
3510
- var length = arguments.length;
3511
- if (!length) {
3512
- return function() { return arguments[0]; };
3513
- }
3514
3446
  var wrapper,
3447
+ length = arguments.length,
3515
3448
  index = fromRight ? length : -1,
3516
3449
  leftIndex = 0,
3517
3450
  funcs = Array(length);
@@ -3521,16 +3454,18 @@
3521
3454
  if (typeof func != 'function') {
3522
3455
  throw new TypeError(FUNC_ERROR_TEXT);
3523
3456
  }
3524
- var funcName = wrapper ? '' : getFuncName(func);
3525
- wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;
3457
+ if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
3458
+ wrapper = new LodashWrapper([]);
3459
+ }
3526
3460
  }
3527
3461
  index = wrapper ? -1 : length;
3528
3462
  while (++index < length) {
3529
3463
  func = funcs[index];
3530
- funcName = getFuncName(func);
3531
3464
 
3532
- var data = funcName == 'wrapper' ? getData(func) : null;
3533
- if (data && isLaziable(data[0])) {
3465
+ var funcName = getFuncName(func),
3466
+ data = funcName == 'wrapper' ? getData(func) : null;
3467
+
3468
+ if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
3534
3469
  wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
3535
3470
  } else {
3536
3471
  wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
@@ -3542,7 +3477,7 @@
3542
3477
  return wrapper.plant(args[0]).value();
3543
3478
  }
3544
3479
  var index = 0,
3545
- result = funcs[index].apply(this, args);
3480
+ result = length ? funcs[index].apply(this, args) : args[0];
3546
3481
 
3547
3482
  while (++index < length) {
3548
3483
  result = funcs[index].call(this, result);
@@ -3600,6 +3535,28 @@
3600
3535
  };
3601
3536
  }
3602
3537
 
3538
+ /**
3539
+ * Creates a function for `_.mapKeys` or `_.mapValues`.
3540
+ *
3541
+ * @private
3542
+ * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
3543
+ * @returns {Function} Returns the new map function.
3544
+ */
3545
+ function createObjectMapper(isMapKeys) {
3546
+ return function(object, iteratee, thisArg) {
3547
+ var result = {};
3548
+ iteratee = getCallback(iteratee, thisArg, 3);
3549
+
3550
+ baseForOwn(object, function(value, key, object) {
3551
+ var mapped = iteratee(value, key, object);
3552
+ key = isMapKeys ? mapped : key;
3553
+ value = isMapKeys ? value : mapped;
3554
+ result[key] = value;
3555
+ });
3556
+ return result;
3557
+ };
3558
+ }
3559
+
3603
3560
  /**
3604
3561
  * Creates a function for `_.padLeft` or `_.padRight`.
3605
3562
  *
@@ -3610,7 +3567,7 @@
3610
3567
  function createPadDir(fromRight) {
3611
3568
  return function(string, length, chars) {
3612
3569
  string = baseToString(string);
3613
- return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));
3570
+ return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
3614
3571
  };
3615
3572
  }
3616
3573
 
@@ -3669,10 +3626,8 @@
3669
3626
  isBindKey = bitmask & BIND_KEY_FLAG,
3670
3627
  isCurry = bitmask & CURRY_FLAG,
3671
3628
  isCurryBound = bitmask & CURRY_BOUND_FLAG,
3672
- isCurryRight = bitmask & CURRY_RIGHT_FLAG;
3673
-
3674
- var Ctor = !isBindKey && createCtorWrapper(func),
3675
- key = func;
3629
+ isCurryRight = bitmask & CURRY_RIGHT_FLAG,
3630
+ Ctor = isBindKey ? null : createCtorWrapper(func);
3676
3631
 
3677
3632
  function wrapper() {
3678
3633
  // Avoid `arguments` object use disqualifying optimizations by
@@ -3719,17 +3674,18 @@
3719
3674
  return result;
3720
3675
  }
3721
3676
  }
3722
- var thisBinding = isBind ? thisArg : this;
3723
- if (isBindKey) {
3724
- func = thisBinding[key];
3725
- }
3677
+ var thisBinding = isBind ? thisArg : this,
3678
+ fn = isBindKey ? thisBinding[func] : func;
3679
+
3726
3680
  if (argPos) {
3727
3681
  args = reorder(args, argPos);
3728
3682
  }
3729
3683
  if (isAry && ary < args.length) {
3730
3684
  args.length = ary;
3731
3685
  }
3732
- var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func;
3686
+ if (this && this !== root && this instanceof wrapper) {
3687
+ fn = Ctor || createCtorWrapper(func);
3688
+ }
3733
3689
  return fn.apply(thisBinding, args);
3734
3690
  }
3735
3691
  return wrapper;
@@ -3803,10 +3759,10 @@
3803
3759
  */
3804
3760
  function createSortedIndex(retHighest) {
3805
3761
  return function(array, value, iteratee, thisArg) {
3806
- var func = getCallback(iteratee);
3807
- return (func === baseCallback && iteratee == null)
3762
+ var callback = getCallback(iteratee);
3763
+ return (iteratee == null && callback === baseCallback)
3808
3764
  ? binaryIndex(array, value, retHighest)
3809
- : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);
3765
+ : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);
3810
3766
  };
3811
3767
  }
3812
3768
 
@@ -3892,40 +3848,35 @@
3892
3848
  function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
3893
3849
  var index = -1,
3894
3850
  arrLength = array.length,
3895
- othLength = other.length,
3896
- result = true;
3851
+ othLength = other.length;
3897
3852
 
3898
3853
  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
3899
3854
  return false;
3900
3855
  }
3901
- // Deep compare the contents, ignoring non-numeric properties.
3902
- while (result && ++index < arrLength) {
3856
+ // Ignore non-index properties.
3857
+ while (++index < arrLength) {
3903
3858
  var arrValue = array[index],
3904
- othValue = other[index];
3905
-
3906
- result = undefined;
3907
- if (customizer) {
3908
- result = isLoose
3909
- ? customizer(othValue, arrValue, index)
3910
- : customizer(arrValue, othValue, index);
3911
- }
3912
- if (result === undefined) {
3913
- // Recursively compare arrays (susceptible to call stack limits).
3914
- if (isLoose) {
3915
- var othIndex = othLength;
3916
- while (othIndex--) {
3917
- othValue = other[othIndex];
3918
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3919
- if (result) {
3920
- break;
3921
- }
3922
- }
3923
- } else {
3924
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3859
+ othValue = other[index],
3860
+ result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
3861
+
3862
+ if (result !== undefined) {
3863
+ if (result) {
3864
+ continue;
3925
3865
  }
3866
+ return false;
3867
+ }
3868
+ // Recursively compare arrays (susceptible to call stack limits).
3869
+ if (isLoose) {
3870
+ if (!arraySome(other, function(othValue) {
3871
+ return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
3872
+ })) {
3873
+ return false;
3874
+ }
3875
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
3876
+ return false;
3926
3877
  }
3927
3878
  }
3928
- return !!result;
3879
+ return true;
3929
3880
  }
3930
3881
 
3931
3882
  /**
@@ -3956,8 +3907,7 @@
3956
3907
  // Treat `NaN` vs. `NaN` as equal.
3957
3908
  return (object != +object)
3958
3909
  ? other != +other
3959
- // But, treat `-0` vs. `+0` as not equal.
3960
- : (object == 0 ? ((1 / object) == (1 / other)) : object == +other);
3910
+ : object == +other;
3961
3911
 
3962
3912
  case regexpTag:
3963
3913
  case stringTag:
@@ -3991,29 +3941,22 @@
3991
3941
  if (objLength != othLength && !isLoose) {
3992
3942
  return false;
3993
3943
  }
3994
- var skipCtor = isLoose,
3995
- index = -1;
3996
-
3944
+ var index = objLength;
3945
+ while (index--) {
3946
+ var key = objProps[index];
3947
+ if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
3948
+ return false;
3949
+ }
3950
+ }
3951
+ var skipCtor = isLoose;
3997
3952
  while (++index < objLength) {
3998
- var key = objProps[index],
3999
- result = isLoose ? key in other : hasOwnProperty.call(other, key);
3953
+ key = objProps[index];
3954
+ var objValue = object[key],
3955
+ othValue = other[key],
3956
+ result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
4000
3957
 
4001
- if (result) {
4002
- var objValue = object[key],
4003
- othValue = other[key];
4004
-
4005
- result = undefined;
4006
- if (customizer) {
4007
- result = isLoose
4008
- ? customizer(othValue, objValue, key)
4009
- : customizer(objValue, othValue, key);
4010
- }
4011
- if (result === undefined) {
4012
- // Recursively compare objects (susceptible to call stack limits).
4013
- result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
4014
- }
4015
- }
4016
- if (!result) {
3958
+ // Recursively compare objects (susceptible to call stack limits).
3959
+ if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
4017
3960
  return false;
4018
3961
  }
4019
3962
  skipCtor || (skipCtor = key == 'constructor');
@@ -4033,34 +3976,6 @@
4033
3976
  return true;
4034
3977
  }
4035
3978
 
4036
- /**
4037
- * Gets the extremum value of `collection` invoking `iteratee` for each value
4038
- * in `collection` to generate the criterion by which the value is ranked.
4039
- * The `iteratee` is invoked with three arguments: (value, index, collection).
4040
- *
4041
- * @private
4042
- * @param {Array|Object|string} collection The collection to iterate over.
4043
- * @param {Function} iteratee The function invoked per iteration.
4044
- * @param {boolean} [isMin] Specify returning the minimum, instead of the
4045
- * maximum, extremum value.
4046
- * @returns {*} Returns the extremum value.
4047
- */
4048
- function extremumBy(collection, iteratee, isMin) {
4049
- var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,
4050
- computed = exValue,
4051
- result = computed;
4052
-
4053
- baseEach(collection, function(value, index, collection) {
4054
- var current = iteratee(value, index, collection);
4055
- if ((isMin ? (current < computed) : (current > computed)) ||
4056
- (current === exValue && current === result)) {
4057
- computed = current;
4058
- result = value;
4059
- }
4060
- });
4061
- return result;
4062
- }
4063
-
4064
3979
  /**
4065
3980
  * Gets the appropriate "callback" function. If the `_.callback` method is
4066
3981
  * customized this function returns the custom method, otherwise it returns
@@ -4094,29 +4009,20 @@
4094
4009
  * @param {Function} func The function to query.
4095
4010
  * @returns {string} Returns the function name.
4096
4011
  */
4097
- var getFuncName = (function() {
4098
- if (!support.funcNames) {
4099
- return constant('');
4100
- }
4101
- if (constant.name == 'constant') {
4102
- return baseProperty('name');
4103
- }
4104
- return function(func) {
4105
- var result = func.name,
4106
- array = realNames[result],
4107
- length = array ? array.length : 0;
4012
+ function getFuncName(func) {
4013
+ var result = func.name,
4014
+ array = realNames[result],
4015
+ length = array ? array.length : 0;
4108
4016
 
4109
- while (length--) {
4110
- var data = array[length],
4111
- otherFunc = data.func;
4112
-
4113
- if (otherFunc == null || otherFunc == func) {
4114
- return data.name;
4115
- }
4017
+ while (length--) {
4018
+ var data = array[length],
4019
+ otherFunc = data.func;
4020
+ if (otherFunc == null || otherFunc == func) {
4021
+ return data.name;
4116
4022
  }
4117
- return result;
4118
- };
4119
- }());
4023
+ }
4024
+ return result;
4025
+ }
4120
4026
 
4121
4027
  /**
4122
4028
  * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
@@ -4137,7 +4043,7 @@
4137
4043
  * Gets the "length" property value of `object`.
4138
4044
  *
4139
4045
  * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
4140
- * in Safari on iOS 8.1 ARM64.
4046
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
4141
4047
  *
4142
4048
  * @private
4143
4049
  * @param {Object} object The object to query.
@@ -4146,15 +4052,34 @@
4146
4052
  var getLength = baseProperty('length');
4147
4053
 
4148
4054
  /**
4149
- * Creates an array of the own symbols of `object`.
4055
+ * Gets the propery names, values, and compare flags of `object`.
4150
4056
  *
4151
4057
  * @private
4152
4058
  * @param {Object} object The object to query.
4153
- * @returns {Array} Returns the array of symbols.
4059
+ * @returns {Array} Returns the match data of `object`.
4154
4060
  */
4155
- var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) {
4156
- return getOwnPropertySymbols(toObject(object));
4157
- };
4061
+ function getMatchData(object) {
4062
+ var result = pairs(object),
4063
+ length = result.length;
4064
+
4065
+ while (length--) {
4066
+ result[length][2] = isStrictComparable(result[length][1]);
4067
+ }
4068
+ return result;
4069
+ }
4070
+
4071
+ /**
4072
+ * Gets the native function at `key` of `object`.
4073
+ *
4074
+ * @private
4075
+ * @param {Object} object The object to query.
4076
+ * @param {string} key The key of the method to get.
4077
+ * @returns {*} Returns the function if it's native, else `undefined`.
4078
+ */
4079
+ function getNative(object, key) {
4080
+ var value = object == null ? undefined : object[key];
4081
+ return isNative(value) ? value : undefined;
4082
+ }
4158
4083
 
4159
4084
  /**
4160
4085
  * Gets the view, applying any `transforms` to the `start` and `end` positions.
@@ -4280,6 +4205,17 @@
4280
4205
  return func == null ? undefined : func.apply(object, args);
4281
4206
  }
4282
4207
 
4208
+ /**
4209
+ * Checks if `value` is array-like.
4210
+ *
4211
+ * @private
4212
+ * @param {*} value The value to check.
4213
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
4214
+ */
4215
+ function isArrayLike(value) {
4216
+ return value != null && isLength(getLength(value));
4217
+ }
4218
+
4283
4219
  /**
4284
4220
  * Checks if `value` is a valid array-like index.
4285
4221
  *
@@ -4289,7 +4225,7 @@
4289
4225
  * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
4290
4226
  */
4291
4227
  function isIndex(value, length) {
4292
- value = +value;
4228
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
4293
4229
  length = length == null ? MAX_SAFE_INTEGER : length;
4294
4230
  return value > -1 && value % 1 == 0 && value < length;
4295
4231
  }
@@ -4308,13 +4244,9 @@
4308
4244
  return false;
4309
4245
  }
4310
4246
  var type = typeof index;
4311
- if (type == 'number') {
4312
- var length = getLength(object),
4313
- prereq = isLength(length) && isIndex(index, length);
4314
- } else {
4315
- prereq = type == 'string' && index in object;
4316
- }
4317
- if (prereq) {
4247
+ if (type == 'number'
4248
+ ? (isArrayLike(object) && isIndex(index, object.length))
4249
+ : (type == 'string' && index in object)) {
4318
4250
  var other = object[index];
4319
4251
  return value === value ? (value === other) : (other !== other);
4320
4252
  }
@@ -4350,7 +4282,15 @@
4350
4282
  */
4351
4283
  function isLaziable(func) {
4352
4284
  var funcName = getFuncName(func);
4353
- return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;
4285
+ if (!(funcName in LazyWrapper.prototype)) {
4286
+ return false;
4287
+ }
4288
+ var other = lodash[funcName];
4289
+ if (func === other) {
4290
+ return true;
4291
+ }
4292
+ var data = getData(other);
4293
+ return !!data && func === data[0];
4354
4294
  }
4355
4295
 
4356
4296
  /**
@@ -4375,7 +4315,7 @@
4375
4315
  * equality comparisons, else `false`.
4376
4316
  */
4377
4317
  function isStrictComparable(value) {
4378
- return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));
4318
+ return value === value && !isObject(value);
4379
4319
  }
4380
4320
 
4381
4321
  /**
@@ -4449,7 +4389,7 @@
4449
4389
  }
4450
4390
 
4451
4391
  /**
4452
- * A specialized version of `_.pick` that picks `object` properties specified
4392
+ * A specialized version of `_.pick` which picks `object` properties specified
4453
4393
  * by `props`.
4454
4394
  *
4455
4395
  * @private
@@ -4474,7 +4414,7 @@
4474
4414
  }
4475
4415
 
4476
4416
  /**
4477
- * A specialized version of `_.pick` that picks `object` properties `predicate`
4417
+ * A specialized version of `_.pick` which picks `object` properties `predicate`
4478
4418
  * returns truthy for.
4479
4419
  *
4480
4420
  * @private
@@ -4598,12 +4538,10 @@
4598
4538
  function shimKeys(object) {
4599
4539
  var props = keysIn(object),
4600
4540
  propsLength = props.length,
4601
- length = propsLength && object.length,
4602
- support = lodash.support;
4541
+ length = propsLength && object.length;
4603
4542
 
4604
- var allowIndexes = length && isLength(length) &&
4605
- (isArray(object) || (support.nonEnumStrings && isString(object)) ||
4606
- (support.nonEnumArgs && isArguments(object)));
4543
+ var allowIndexes = !!length && isLength(length) &&
4544
+ (isArray(object) || isArguments(object) || isString(object));
4607
4545
 
4608
4546
  var index = -1,
4609
4547
  result = [];
@@ -4618,7 +4556,7 @@
4618
4556
  }
4619
4557
 
4620
4558
  /**
4621
- * Converts `value` to an array-like object if it is not one.
4559
+ * Converts `value` to an array-like object if it's not one.
4622
4560
  *
4623
4561
  * @private
4624
4562
  * @param {*} value The value to process.
@@ -4628,7 +4566,7 @@
4628
4566
  if (value == null) {
4629
4567
  return [];
4630
4568
  }
4631
- if (!isLength(getLength(value))) {
4569
+ if (!isArrayLike(value)) {
4632
4570
  return values(value);
4633
4571
  }
4634
4572
  if (lodash.support.unindexedChars && isString(value)) {
@@ -4638,7 +4576,7 @@
4638
4576
  }
4639
4577
 
4640
4578
  /**
4641
- * Converts `value` to an object if it is not one.
4579
+ * Converts `value` to an object if it's not one.
4642
4580
  *
4643
4581
  * @private
4644
4582
  * @param {*} value The value to process.
@@ -4659,7 +4597,7 @@
4659
4597
  }
4660
4598
 
4661
4599
  /**
4662
- * Converts `value` to property path array if it is not one.
4600
+ * Converts `value` to property path array if it's not one.
4663
4601
  *
4664
4602
  * @private
4665
4603
  * @param {*} value The value to process.
@@ -4758,12 +4696,9 @@
4758
4696
  }
4759
4697
 
4760
4698
  /**
4761
- * Creates an array excluding all values of the provided arrays using
4762
- * `SameValueZero` for equality comparisons.
4763
- *
4764
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
4765
- * comparisons are like strict equality comparisons, e.g. `===`, except that
4766
- * `NaN` matches `NaN`.
4699
+ * Creates an array of unique `array` values not included in the other
4700
+ * provided arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
4701
+ * for equality comparisons.
4767
4702
  *
4768
4703
  * @static
4769
4704
  * @memberOf _
@@ -4777,7 +4712,7 @@
4777
4712
  * // => [1, 3]
4778
4713
  */
4779
4714
  var difference = restParam(function(array, values) {
4780
- return (isArray(array) || isArguments(array))
4715
+ return isArrayLike(array)
4781
4716
  ? baseDifference(array, baseFlatten(values, false, true))
4782
4717
  : [];
4783
4718
  });
@@ -5172,13 +5107,10 @@
5172
5107
 
5173
5108
  /**
5174
5109
  * Gets the index at which the first occurrence of `value` is found in `array`
5175
- * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,
5176
- * it is used as the offset from the end of `array`. If `array` is sorted
5177
- * providing `true` for `fromIndex` performs a faster binary search.
5178
- *
5179
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5180
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5181
- * `NaN` matches `NaN`.
5110
+ * using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5111
+ * for equality comparisons. If `fromIndex` is negative, it is used as the offset
5112
+ * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
5113
+ * performs a faster binary search.
5182
5114
  *
5183
5115
  * @static
5184
5116
  * @memberOf _
@@ -5238,13 +5170,10 @@
5238
5170
  }
5239
5171
 
5240
5172
  /**
5241
- * Creates an array of unique values in all provided arrays using `SameValueZero`
5173
+ * Creates an array of unique values that are included in all of the provided
5174
+ * arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5242
5175
  * for equality comparisons.
5243
5176
  *
5244
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5245
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5246
- * `NaN` matches `NaN`.
5247
- *
5248
5177
  * @static
5249
5178
  * @memberOf _
5250
5179
  * @category Array
@@ -5254,27 +5183,19 @@
5254
5183
  * _.intersection([1, 2], [4, 2], [2, 1]);
5255
5184
  * // => [2]
5256
5185
  */
5257
- function intersection() {
5258
- var args = [],
5259
- argsIndex = -1,
5260
- argsLength = arguments.length,
5261
- caches = [],
5186
+ var intersection = restParam(function(arrays) {
5187
+ var othLength = arrays.length,
5188
+ othIndex = othLength,
5189
+ caches = Array(length),
5262
5190
  indexOf = getIndexOf(),
5263
5191
  isCommon = indexOf == baseIndexOf,
5264
5192
  result = [];
5265
5193
 
5266
- while (++argsIndex < argsLength) {
5267
- var value = arguments[argsIndex];
5268
- if (isArray(value) || isArguments(value)) {
5269
- args.push(value);
5270
- caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null);
5271
- }
5272
- }
5273
- argsLength = args.length;
5274
- if (argsLength < 2) {
5275
- return result;
5194
+ while (othIndex--) {
5195
+ var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
5196
+ caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
5276
5197
  }
5277
- var array = args[0],
5198
+ var array = arrays[0],
5278
5199
  index = -1,
5279
5200
  length = array ? array.length : 0,
5280
5201
  seen = caches[0];
@@ -5283,10 +5204,10 @@
5283
5204
  while (++index < length) {
5284
5205
  value = array[index];
5285
5206
  if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
5286
- argsIndex = argsLength;
5287
- while (--argsIndex) {
5288
- var cache = caches[argsIndex];
5289
- if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {
5207
+ var othIndex = othLength;
5208
+ while (--othIndex) {
5209
+ var cache = caches[othIndex];
5210
+ if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
5290
5211
  continue outer;
5291
5212
  }
5292
5213
  }
@@ -5297,7 +5218,7 @@
5297
5218
  }
5298
5219
  }
5299
5220
  return result;
5300
- }
5221
+ });
5301
5222
 
5302
5223
  /**
5303
5224
  * Gets the last element of `array`.
@@ -5370,14 +5291,11 @@
5370
5291
  }
5371
5292
 
5372
5293
  /**
5373
- * Removes all provided values from `array` using `SameValueZero` for equality
5374
- * comparisons.
5294
+ * Removes all provided values from `array` using
5295
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5296
+ * for equality comparisons.
5375
5297
  *
5376
- * **Notes:**
5377
- * - Unlike `_.without`, this method mutates `array`
5378
- * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5379
- * comparisons are like strict equality comparisons, e.g. `===`, except
5380
- * that `NaN` matches `NaN`
5298
+ * **Note:** Unlike `_.without`, this method mutates `array`.
5381
5299
  *
5382
5300
  * @static
5383
5301
  * @memberOf _
@@ -5441,7 +5359,6 @@
5441
5359
  * // => [10, 20]
5442
5360
  */
5443
5361
  var pullAt = restParam(function(array, indexes) {
5444
- array || (array = []);
5445
5362
  indexes = baseFlatten(indexes);
5446
5363
 
5447
5364
  var result = baseAt(array, indexes);
@@ -5807,12 +5724,9 @@
5807
5724
  }
5808
5725
 
5809
5726
  /**
5810
- * Creates an array of unique values, in order, of the provided arrays using
5811
- * `SameValueZero` for equality comparisons.
5812
- *
5813
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5814
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5815
- * `NaN` matches `NaN`.
5727
+ * Creates an array of unique values, in order, from all of the provided arrays
5728
+ * using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5729
+ * for equality comparisons.
5816
5730
  *
5817
5731
  * @static
5818
5732
  * @memberOf _
@@ -5829,8 +5743,9 @@
5829
5743
  });
5830
5744
 
5831
5745
  /**
5832
- * Creates a duplicate-free version of an array, using `SameValueZero` for
5833
- * equality comparisons, in which only the first occurence of each element
5746
+ * Creates a duplicate-free version of an array, using
5747
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5748
+ * for equality comparisons, in which only the first occurence of each element
5834
5749
  * is kept. Providing `true` for `isSorted` performs a faster search algorithm
5835
5750
  * for sorted arrays. If an iteratee function is provided it is invoked for
5836
5751
  * each element in the array to generate the criterion by which uniqueness
@@ -5848,10 +5763,6 @@
5848
5763
  * callback returns `true` for elements that have the properties of the given
5849
5764
  * object, else `false`.
5850
5765
  *
5851
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5852
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5853
- * `NaN` matches `NaN`.
5854
- *
5855
5766
  * @static
5856
5767
  * @memberOf _
5857
5768
  * @alias unique
@@ -5890,9 +5801,9 @@
5890
5801
  iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;
5891
5802
  isSorted = false;
5892
5803
  }
5893
- var func = getCallback();
5894
- if (!(func === baseCallback && iteratee == null)) {
5895
- iteratee = func(iteratee, thisArg, 3);
5804
+ var callback = getCallback();
5805
+ if (!(iteratee == null && callback === baseCallback)) {
5806
+ iteratee = callback(iteratee, thisArg, 3);
5896
5807
  }
5897
5808
  return (isSorted && getIndexOf() == baseIndexOf)
5898
5809
  ? sortedUniq(array, iteratee)
@@ -5901,7 +5812,7 @@
5901
5812
 
5902
5813
  /**
5903
5814
  * This method is like `_.zip` except that it accepts an array of grouped
5904
- * elements and creates an array regrouping the elements to their pre-`_.zip`
5815
+ * elements and creates an array regrouping the elements to their pre-zip
5905
5816
  * configuration.
5906
5817
  *
5907
5818
  * @static
@@ -5918,10 +5829,19 @@
5918
5829
  * // => [['fred', 'barney'], [30, 40], [true, false]]
5919
5830
  */
5920
5831
  function unzip(array) {
5832
+ if (!(array && array.length)) {
5833
+ return [];
5834
+ }
5921
5835
  var index = -1,
5922
- length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0,
5923
- result = Array(length);
5836
+ length = 0;
5924
5837
 
5838
+ array = arrayFilter(array, function(group) {
5839
+ if (isArrayLike(group)) {
5840
+ length = nativeMax(group.length, length);
5841
+ return true;
5842
+ }
5843
+ });
5844
+ var result = Array(length);
5925
5845
  while (++index < length) {
5926
5846
  result[index] = arrayMap(array, baseProperty(index));
5927
5847
  }
@@ -5929,12 +5849,44 @@
5929
5849
  }
5930
5850
 
5931
5851
  /**
5932
- * Creates an array excluding all provided values using `SameValueZero` for
5933
- * equality comparisons.
5852
+ * This method is like `_.unzip` except that it accepts an iteratee to specify
5853
+ * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
5854
+ * and invoked with four arguments: (accumulator, value, index, group).
5934
5855
  *
5935
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5936
- * comparisons are like strict equality comparisons, e.g. `===`, except that
5937
- * `NaN` matches `NaN`.
5856
+ * @static
5857
+ * @memberOf _
5858
+ * @category Array
5859
+ * @param {Array} array The array of grouped elements to process.
5860
+ * @param {Function} [iteratee] The function to combine regrouped values.
5861
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
5862
+ * @returns {Array} Returns the new array of regrouped elements.
5863
+ * @example
5864
+ *
5865
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
5866
+ * // => [[1, 10, 100], [2, 20, 200]]
5867
+ *
5868
+ * _.unzipWith(zipped, _.add);
5869
+ * // => [3, 30, 300]
5870
+ */
5871
+ function unzipWith(array, iteratee, thisArg) {
5872
+ var length = array ? array.length : 0;
5873
+ if (!length) {
5874
+ return [];
5875
+ }
5876
+ var result = unzip(array);
5877
+ if (iteratee == null) {
5878
+ return result;
5879
+ }
5880
+ iteratee = bindCallback(iteratee, thisArg, 4);
5881
+ return arrayMap(result, function(group) {
5882
+ return arrayReduce(group, iteratee, undefined, true);
5883
+ });
5884
+ }
5885
+
5886
+ /**
5887
+ * Creates an array excluding all provided values using
5888
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
5889
+ * for equality comparisons.
5938
5890
  *
5939
5891
  * @static
5940
5892
  * @memberOf _
@@ -5948,13 +5900,13 @@
5948
5900
  * // => [3]
5949
5901
  */
5950
5902
  var without = restParam(function(array, values) {
5951
- return (isArray(array) || isArguments(array))
5903
+ return isArrayLike(array)
5952
5904
  ? baseDifference(array, values)
5953
5905
  : [];
5954
5906
  });
5955
5907
 
5956
5908
  /**
5957
- * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
5909
+ * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
5958
5910
  * of the provided arrays.
5959
5911
  *
5960
5912
  * @static
@@ -5973,7 +5925,7 @@
5973
5925
 
5974
5926
  while (++index < length) {
5975
5927
  var array = arguments[index];
5976
- if (isArray(array) || isArguments(array)) {
5928
+ if (isArrayLike(array)) {
5977
5929
  var result = result
5978
5930
  ? baseDifference(result, array).concat(baseDifference(array, result))
5979
5931
  : array;
@@ -6039,6 +5991,38 @@
6039
5991
  return result;
6040
5992
  }
6041
5993
 
5994
+ /**
5995
+ * This method is like `_.zip` except that it accepts an iteratee to specify
5996
+ * how grouped values should be combined. The `iteratee` is bound to `thisArg`
5997
+ * and invoked with four arguments: (accumulator, value, index, group).
5998
+ *
5999
+ * @static
6000
+ * @memberOf _
6001
+ * @category Array
6002
+ * @param {...Array} [arrays] The arrays to process.
6003
+ * @param {Function} [iteratee] The function to combine grouped values.
6004
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
6005
+ * @returns {Array} Returns the new array of grouped elements.
6006
+ * @example
6007
+ *
6008
+ * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
6009
+ * // => [111, 222]
6010
+ */
6011
+ var zipWith = restParam(function(arrays) {
6012
+ var length = arrays.length,
6013
+ iteratee = length > 2 ? arrays[length - 2] : undefined,
6014
+ thisArg = length > 1 ? arrays[length - 1] : undefined;
6015
+
6016
+ if (length > 2 && typeof iteratee == 'function') {
6017
+ length -= 2;
6018
+ } else {
6019
+ iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
6020
+ thisArg = undefined;
6021
+ }
6022
+ arrays.length = length;
6023
+ return unzipWith(arrays, iteratee, thisArg);
6024
+ });
6025
+
6042
6026
  /*------------------------------------------------------------------------*/
6043
6027
 
6044
6028
  /**
@@ -6314,8 +6298,7 @@
6314
6298
  * // => ['barney', 'pebbles']
6315
6299
  */
6316
6300
  var at = restParam(function(collection, props) {
6317
- var length = collection ? getLength(collection) : 0;
6318
- if (isLength(length)) {
6301
+ if (isArrayLike(collection)) {
6319
6302
  collection = toIterable(collection);
6320
6303
  }
6321
6304
  return baseAt(collection, baseFlatten(props));
@@ -6690,13 +6673,10 @@
6690
6673
  });
6691
6674
 
6692
6675
  /**
6693
- * Checks if `value` is in `collection` using `SameValueZero` for equality
6694
- * comparisons. If `fromIndex` is negative, it is used as the offset from
6695
- * the end of `collection`.
6696
- *
6697
- * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6698
- * comparisons are like strict equality comparisons, e.g. `===`, except that
6699
- * `NaN` matches `NaN`.
6676
+ * Checks if `value` is in `collection` using
6677
+ * [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6678
+ * for equality comparisons. If `fromIndex` is negative, it is used as the offset
6679
+ * from the end of `collection`.
6700
6680
  *
6701
6681
  * @static
6702
6682
  * @memberOf _
@@ -6791,7 +6771,7 @@
6791
6771
  });
6792
6772
 
6793
6773
  /**
6794
- * Invokes the method at `path` on each element in `collection`, returning
6774
+ * Invokes the method at `path` of each element in `collection`, returning
6795
6775
  * an array of the results of each invoked method. Any additional arguments
6796
6776
  * are provided to each invoked method. If `methodName` is a function it is
6797
6777
  * invoked for, and `this` bound to, each element in `collection`.
@@ -6816,11 +6796,10 @@
6816
6796
  var index = -1,
6817
6797
  isFunc = typeof path == 'function',
6818
6798
  isProp = isKey(path),
6819
- length = getLength(collection),
6820
- result = isLength(length) ? Array(length) : [];
6799
+ result = isArrayLike(collection) ? Array(collection.length) : [];
6821
6800
 
6822
6801
  baseEach(collection, function(value) {
6823
- var func = isFunc ? path : (isProp && value != null && value[path]);
6802
+ var func = isFunc ? path : ((isProp && value != null) ? value[path] : null);
6824
6803
  result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
6825
6804
  });
6826
6805
  return result;
@@ -6842,14 +6821,15 @@
6842
6821
  * callback returns `true` for elements that have the properties of the given
6843
6822
  * object, else `false`.
6844
6823
  *
6845
- * Many lodash methods are guarded to work as interatees for methods like
6824
+ * Many lodash methods are guarded to work as iteratees for methods like
6846
6825
  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
6847
6826
  *
6848
6827
  * The guarded methods are:
6849
- * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,
6850
- * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,
6851
- * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,
6852
- * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`
6828
+ * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
6829
+ * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
6830
+ * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
6831
+ * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
6832
+ * `sum`, `uniq`, and `words`
6853
6833
  *
6854
6834
  * @static
6855
6835
  * @memberOf _
@@ -6985,7 +6965,7 @@
6985
6965
  * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
6986
6966
  * (accumulator, value, index|key, collection).
6987
6967
  *
6988
- * Many lodash methods are guarded to work as interatees for methods like
6968
+ * Many lodash methods are guarded to work as iteratees for methods like
6989
6969
  * `_.reduce`, `_.reduceRight`, and `_.transform`.
6990
6970
  *
6991
6971
  * The guarded methods are:
@@ -7037,23 +7017,12 @@
7037
7017
  * }, []);
7038
7018
  * // => [4, 5, 2, 3, 0, 1]
7039
7019
  */
7040
- var reduceRight = createReduce(arrayReduceRight, baseEachRight);
7020
+ var reduceRight = createReduce(arrayReduceRight, baseEachRight);
7041
7021
 
7042
7022
  /**
7043
7023
  * The opposite of `_.filter`; this method returns the elements of `collection`
7044
7024
  * that `predicate` does **not** return truthy for.
7045
7025
  *
7046
- * If a property name is provided for `predicate` the created `_.property`
7047
- * style callback returns the property value of the given element.
7048
- *
7049
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
7050
- * style callback returns `true` for elements that have a matching property
7051
- * value, else `false`.
7052
- *
7053
- * If an object is provided for `predicate` the created `_.matches` style
7054
- * callback returns `true` for elements that have the properties of the given
7055
- * object, else `false`.
7056
- *
7057
7026
  * @static
7058
7027
  * @memberOf _
7059
7028
  * @category Collection
@@ -7118,8 +7087,20 @@
7118
7087
  var length = collection.length;
7119
7088
  return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
7120
7089
  }
7121
- var result = shuffle(collection);
7122
- result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length);
7090
+ var index = -1,
7091
+ result = toArray(collection),
7092
+ length = result.length,
7093
+ lastIndex = length - 1;
7094
+
7095
+ n = nativeMin(n < 0 ? 0 : (+n || 0), length);
7096
+ while (++index < n) {
7097
+ var rand = baseRandom(index, lastIndex),
7098
+ value = result[rand];
7099
+
7100
+ result[rand] = result[index];
7101
+ result[index] = value;
7102
+ }
7103
+ result.length = n;
7123
7104
  return result;
7124
7105
  }
7125
7106
 
@@ -7138,20 +7119,7 @@
7138
7119
  * // => [4, 1, 3, 2]
7139
7120
  */
7140
7121
  function shuffle(collection) {
7141
- collection = toIterable(collection);
7142
-
7143
- var index = -1,
7144
- length = collection.length,
7145
- result = Array(length);
7146
-
7147
- while (++index < length) {
7148
- var rand = baseRandom(0, index);
7149
- if (index != rand) {
7150
- result[index] = result[rand];
7151
- }
7152
- result[rand] = collection[index];
7153
- }
7154
- return result;
7122
+ return sample(collection, POSITIVE_INFINITY);
7155
7123
  }
7156
7124
 
7157
7125
  /**
@@ -7777,12 +7745,13 @@
7777
7745
  var curryRight = createCurry(CURRY_RIGHT_FLAG);
7778
7746
 
7779
7747
  /**
7780
- * Creates a function that delays invoking `func` until after `wait` milliseconds
7781
- * have elapsed since the last time it was invoked. The created function comes
7782
- * with a `cancel` method to cancel delayed invocations. Provide an options
7783
- * object to indicate that `func` should be invoked on the leading and/or
7784
- * trailing edge of the `wait` timeout. Subsequent calls to the debounced
7785
- * function return the result of the last `func` invocation.
7748
+ * Creates a debounced function that delays invoking `func` until after `wait`
7749
+ * milliseconds have elapsed since the last time the debounced function was
7750
+ * invoked. The debounced function comes with a `cancel` method to cancel
7751
+ * delayed invocations. Provide an options object to indicate that `func`
7752
+ * should be invoked on the leading and/or trailing edge of the `wait` timeout.
7753
+ * Subsequent calls to the debounced function return the result of the last
7754
+ * `func` invocation.
7786
7755
  *
7787
7756
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
7788
7757
  * on the trailing edge of the timeout only if the the debounced function is
@@ -8096,14 +8065,14 @@
8096
8065
  }
8097
8066
  var memoized = function() {
8098
8067
  var args = arguments,
8099
- cache = memoized.cache,
8100
- key = resolver ? resolver.apply(this, args) : args[0];
8068
+ key = resolver ? resolver.apply(this, args) : args[0],
8069
+ cache = memoized.cache;
8101
8070
 
8102
8071
  if (cache.has(key)) {
8103
8072
  return cache.get(key);
8104
8073
  }
8105
8074
  var result = func.apply(this, args);
8106
- cache.set(key, result);
8075
+ memoized.cache = cache.set(key, result);
8107
8076
  return result;
8108
8077
  };
8109
8078
  memoized.cache = new memoize.Cache;
@@ -8350,12 +8319,12 @@
8350
8319
  }
8351
8320
 
8352
8321
  /**
8353
- * Creates a function that only invokes `func` at most once per every `wait`
8354
- * milliseconds. The created function comes with a `cancel` method to cancel
8355
- * delayed invocations. Provide an options object to indicate that `func`
8356
- * should be invoked on the leading and/or trailing edge of the `wait` timeout.
8357
- * Subsequent calls to the throttled function return the result of the last
8358
- * `func` call.
8322
+ * Creates a throttled function that only invokes `func` at most once per
8323
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
8324
+ * method to cancel delayed invocations. Provide an options object to indicate
8325
+ * that `func` should be invoked on the leading and/or trailing edge of the
8326
+ * `wait` timeout. Subsequent calls to the throttled function return the
8327
+ * result of the last `func` call.
8359
8328
  *
8360
8329
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
8361
8330
  * on the trailing edge of the timeout only if the the throttled function is
@@ -8495,8 +8464,9 @@
8495
8464
  customizer = isDeep;
8496
8465
  isDeep = false;
8497
8466
  }
8498
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
8499
- return baseClone(value, isDeep, customizer);
8467
+ return typeof customizer == 'function'
8468
+ ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))
8469
+ : baseClone(value, isDeep);
8500
8470
  }
8501
8471
 
8502
8472
  /**
@@ -8545,8 +8515,57 @@
8545
8515
  * // => 20
8546
8516
  */
8547
8517
  function cloneDeep(value, customizer, thisArg) {
8548
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
8549
- return baseClone(value, true, customizer);
8518
+ return typeof customizer == 'function'
8519
+ ? baseClone(value, true, bindCallback(customizer, thisArg, 1))
8520
+ : baseClone(value, true);
8521
+ }
8522
+
8523
+ /**
8524
+ * Checks if `value` is greater than `other`.
8525
+ *
8526
+ * @static
8527
+ * @memberOf _
8528
+ * @category Lang
8529
+ * @param {*} value The value to compare.
8530
+ * @param {*} other The other value to compare.
8531
+ * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
8532
+ * @example
8533
+ *
8534
+ * _.gt(3, 1);
8535
+ * // => true
8536
+ *
8537
+ * _.gt(3, 3);
8538
+ * // => false
8539
+ *
8540
+ * _.gt(1, 3);
8541
+ * // => false
8542
+ */
8543
+ function gt(value, other) {
8544
+ return value > other;
8545
+ }
8546
+
8547
+ /**
8548
+ * Checks if `value` is greater than or equal to `other`.
8549
+ *
8550
+ * @static
8551
+ * @memberOf _
8552
+ * @category Lang
8553
+ * @param {*} value The value to compare.
8554
+ * @param {*} other The other value to compare.
8555
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
8556
+ * @example
8557
+ *
8558
+ * _.gte(3, 1);
8559
+ * // => true
8560
+ *
8561
+ * _.gte(3, 3);
8562
+ * // => true
8563
+ *
8564
+ * _.gte(1, 3);
8565
+ * // => false
8566
+ */
8567
+ function gte(value, other) {
8568
+ return value >= other;
8550
8569
  }
8551
8570
 
8552
8571
  /**
@@ -8566,15 +8585,13 @@
8566
8585
  * // => false
8567
8586
  */
8568
8587
  function isArguments(value) {
8569
- var length = isObjectLike(value) ? value.length : undefined;
8570
- return isLength(length) && objToString.call(value) == argsTag;
8588
+ return isObjectLike(value) && isArrayLike(value) && objToString.call(value) == argsTag;
8571
8589
  }
8572
8590
  // Fallback for environments without a `toStringTag` for `arguments` objects.
8573
8591
  if (!support.argsTag) {
8574
8592
  isArguments = function(value) {
8575
- var length = isObjectLike(value) ? value.length : undefined;
8576
- return isLength(length) && hasOwnProperty.call(value, 'callee') &&
8577
- !propertyIsEnumerable.call(value, 'callee');
8593
+ return isObjectLike(value) && isArrayLike(value) &&
8594
+ hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
8578
8595
  };
8579
8596
  }
8580
8597
 
@@ -8696,10 +8713,9 @@
8696
8713
  if (value == null) {
8697
8714
  return true;
8698
8715
  }
8699
- var length = getLength(value);
8700
- if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
8716
+ if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
8701
8717
  (isObjectLike(value) && isFunction(value.splice)))) {
8702
- return !length;
8718
+ return !value.length;
8703
8719
  }
8704
8720
  return !keys(value).length;
8705
8721
  }
@@ -8719,6 +8735,7 @@
8719
8735
  *
8720
8736
  * @static
8721
8737
  * @memberOf _
8738
+ * @alias eq
8722
8739
  * @category Lang
8723
8740
  * @param {*} value The value to compare.
8724
8741
  * @param {*} other The other value to compare.
@@ -8748,12 +8765,9 @@
8748
8765
  * // => true
8749
8766
  */
8750
8767
  function isEqual(value, other, customizer, thisArg) {
8751
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
8752
- if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {
8753
- return value === other;
8754
- }
8768
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
8755
8769
  var result = customizer ? customizer(value, other) : undefined;
8756
- return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
8770
+ return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
8757
8771
  }
8758
8772
 
8759
8773
  /**
@@ -8855,7 +8869,7 @@
8855
8869
  // Avoid a V8 JIT bug in Chrome 19-20.
8856
8870
  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
8857
8871
  var type = typeof value;
8858
- return type == 'function' || (!!value && type == 'object');
8872
+ return !!value && (type == 'object' || type == 'function');
8859
8873
  }
8860
8874
 
8861
8875
  /**
@@ -8898,33 +8912,8 @@
8898
8912
  * // => true
8899
8913
  */
8900
8914
  function isMatch(object, source, customizer, thisArg) {
8901
- var props = keys(source),
8902
- length = props.length;
8903
-
8904
- if (!length) {
8905
- return true;
8906
- }
8907
- if (object == null) {
8908
- return false;
8909
- }
8910
- customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
8911
- object = toObject(object);
8912
- if (!customizer && length == 1) {
8913
- var key = props[0],
8914
- value = source[key];
8915
-
8916
- if (isStrictComparable(value)) {
8917
- return value === object[key] && (value !== undefined || (key in object));
8918
- }
8919
- }
8920
- var values = Array(length),
8921
- strictCompareFlags = Array(length);
8922
-
8923
- while (length--) {
8924
- value = values[length] = source[props[length]];
8925
- strictCompareFlags[length] = isStrictComparable(value);
8926
- }
8927
- return baseIsMatch(object, props, values, strictCompareFlags, customizer);
8915
+ customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
8916
+ return baseIsMatch(object, getMatchData(source), customizer);
8928
8917
  }
8929
8918
 
8930
8919
  /**
@@ -9064,8 +9053,8 @@
9064
9053
  if (!(value && objToString.call(value) == objectTag) || (!lodash.support.argsTag && isArguments(value))) {
9065
9054
  return false;
9066
9055
  }
9067
- var valueOf = value.valueOf,
9068
- objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
9056
+ var valueOf = getNative(value, 'valueOf'),
9057
+ objProto = valueOf && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
9069
9058
 
9070
9059
  return objProto
9071
9060
  ? (value == objProto || getPrototypeOf(value) == objProto)
@@ -9152,6 +9141,54 @@
9152
9141
  return value === undefined;
9153
9142
  }
9154
9143
 
9144
+ /**
9145
+ * Checks if `value` is less than `other`.
9146
+ *
9147
+ * @static
9148
+ * @memberOf _
9149
+ * @category Lang
9150
+ * @param {*} value The value to compare.
9151
+ * @param {*} other The other value to compare.
9152
+ * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
9153
+ * @example
9154
+ *
9155
+ * _.lt(1, 3);
9156
+ * // => true
9157
+ *
9158
+ * _.lt(3, 3);
9159
+ * // => false
9160
+ *
9161
+ * _.lt(3, 1);
9162
+ * // => false
9163
+ */
9164
+ function lt(value, other) {
9165
+ return value < other;
9166
+ }
9167
+
9168
+ /**
9169
+ * Checks if `value` is less than or equal to `other`.
9170
+ *
9171
+ * @static
9172
+ * @memberOf _
9173
+ * @category Lang
9174
+ * @param {*} value The value to compare.
9175
+ * @param {*} other The other value to compare.
9176
+ * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
9177
+ * @example
9178
+ *
9179
+ * _.lte(1, 3);
9180
+ * // => true
9181
+ *
9182
+ * _.lte(3, 3);
9183
+ * // => true
9184
+ *
9185
+ * _.lte(3, 1);
9186
+ * // => false
9187
+ */
9188
+ function lte(value, other) {
9189
+ return value <= other;
9190
+ }
9191
+
9155
9192
  /**
9156
9193
  * Converts `value` to an array.
9157
9194
  *
@@ -9219,7 +9256,6 @@
9219
9256
  * **Note:** This method mutates `object` and is based on
9220
9257
  * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).
9221
9258
  *
9222
- *
9223
9259
  * @static
9224
9260
  * @memberOf _
9225
9261
  * @alias extend
@@ -9549,7 +9585,7 @@
9549
9585
  }
9550
9586
 
9551
9587
  /**
9552
- * Gets the property value of `path` on `object`. If the resolved value is
9588
+ * Gets the property value at `path` of `object`. If the resolved value is
9553
9589
  * `undefined` the `defaultValue` is used in its place.
9554
9590
  *
9555
9591
  * @static
@@ -9607,10 +9643,14 @@
9607
9643
  if (!result && !isKey(path)) {
9608
9644
  path = toPath(path);
9609
9645
  object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
9646
+ if (object == null) {
9647
+ return false;
9648
+ }
9610
9649
  path = last(path);
9611
- result = object != null && hasOwnProperty.call(object, path);
9650
+ result = hasOwnProperty.call(object, path);
9612
9651
  }
9613
- return result || (lodash.support.nonEnumStrings && isString(object) && isIndex(path, object.length));
9652
+ return result || (isLength(object.length) && isIndex(path, object.length) &&
9653
+ (isArray(object) || isArguments(object) || isString(object)));
9614
9654
  }
9615
9655
 
9616
9656
  /**
@@ -9691,12 +9731,9 @@
9691
9731
  * // => ['0', '1']
9692
9732
  */
9693
9733
  var keys = !nativeKeys ? shimKeys : function(object) {
9694
- if (object) {
9695
- var Ctor = object.constructor,
9696
- length = object.length;
9697
- }
9734
+ var Ctor = object == null ? null : object.constructor;
9698
9735
  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
9699
- (typeof object == 'function' ? lodash.support.enumPrototypes : isLength(length))) {
9736
+ (typeof object == 'function' ? lodash.support.enumPrototypes : isArrayLike(object))) {
9700
9737
  return shimKeys(object);
9701
9738
  }
9702
9739
  return isObject(object) ? nativeKeys(object) : [];
@@ -9735,8 +9772,7 @@
9735
9772
  support = lodash.support;
9736
9773
 
9737
9774
  length = (length && isLength(length) &&
9738
- (isArray(object) || (support.nonEnumStrings && isString(object)) ||
9739
- (support.nonEnumArgs && isArguments(object))) && length) || 0;
9775
+ (isArray(object) || isArguments(object) || isString(object)) && length) || 0;
9740
9776
 
9741
9777
  var Ctor = object.constructor,
9742
9778
  index = -1,
@@ -9782,6 +9818,28 @@
9782
9818
  return result;
9783
9819
  }
9784
9820
 
9821
+ /**
9822
+ * The opposite of `_.mapValues`; this method creates an object with the
9823
+ * same values as `object` and keys generated by running each own enumerable
9824
+ * property of `object` through `iteratee`.
9825
+ *
9826
+ * @static
9827
+ * @memberOf _
9828
+ * @category Object
9829
+ * @param {Object} object The object to iterate over.
9830
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
9831
+ * per iteration.
9832
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
9833
+ * @returns {Object} Returns the new mapped object.
9834
+ * @example
9835
+ *
9836
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
9837
+ * return key + value;
9838
+ * });
9839
+ * // => { 'a1': 1, 'b2': 2 }
9840
+ */
9841
+ var mapKeys = createObjectMapper(true);
9842
+
9785
9843
  /**
9786
9844
  * Creates an object with the same keys as `object` and values generated by
9787
9845
  * running each own enumerable property of `object` through `iteratee`. The
@@ -9823,15 +9881,7 @@
9823
9881
  * _.mapValues(users, 'age');
9824
9882
  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
9825
9883
  */
9826
- function mapValues(object, iteratee, thisArg) {
9827
- var result = {};
9828
- iteratee = getCallback(iteratee, thisArg, 3);
9829
-
9830
- baseForOwn(object, function(value, key, object) {
9831
- result[key] = iteratee(value, key, object);
9832
- });
9833
- return result;
9834
- }
9884
+ var mapValues = createObjectMapper();
9835
9885
 
9836
9886
  /**
9837
9887
  * Recursively merges own enumerable properties of the source object(s), that
@@ -9886,11 +9936,6 @@
9886
9936
  /**
9887
9937
  * The opposite of `_.pick`; this method creates an object composed of the
9888
9938
  * own and inherited enumerable properties of `object` that are not omitted.
9889
- * Property names may be specified as individual arguments or as arrays of
9890
- * property names. If `predicate` is provided it is invoked for each property
9891
- * of `object` omitting the properties `predicate` returns truthy for. The
9892
- * predicate is bound to `thisArg` and invoked with three arguments:
9893
- * (value, key, object).
9894
9939
  *
9895
9940
  * @static
9896
9941
  * @memberOf _
@@ -9940,6 +9985,8 @@
9940
9985
  * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
9941
9986
  */
9942
9987
  function pairs(object) {
9988
+ object = toObject(object);
9989
+
9943
9990
  var index = -1,
9944
9991
  props = keys(object),
9945
9992
  length = props.length,
@@ -10060,13 +10107,13 @@
10060
10107
 
10061
10108
  var index = -1,
10062
10109
  length = path.length,
10063
- endIndex = length - 1,
10110
+ lastIndex = length - 1,
10064
10111
  nested = object;
10065
10112
 
10066
10113
  while (nested != null && ++index < length) {
10067
10114
  var key = path[index];
10068
10115
  if (isObject(nested)) {
10069
- if (index == endIndex) {
10116
+ if (index == lastIndex) {
10070
10117
  nested[key] = value;
10071
10118
  } else if (nested[key] == null) {
10072
10119
  nested[key] = isIndex(path[index + 1]) ? [] : {};
@@ -10116,7 +10163,7 @@
10116
10163
  if (isArr) {
10117
10164
  accumulator = isArray(object) ? new Ctor : [];
10118
10165
  } else {
10119
- accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype);
10166
+ accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : null);
10120
10167
  }
10121
10168
  } else {
10122
10169
  accumulator = {};
@@ -10395,7 +10442,7 @@
10395
10442
  * use a third-party library like [_he_](https://mths.be/he).
10396
10443
  *
10397
10444
  * Though the ">" character is escaped for symmetry, characters like
10398
- * ">" and "/" don't require escaping in HTML and have no special meaning
10445
+ * ">" and "/" don't need escaping in HTML and have no special meaning
10399
10446
  * unless they're part of a tag or unquoted attribute value.
10400
10447
  * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
10401
10448
  * (under "semi-related fun fact") for more details.
@@ -10472,7 +10519,7 @@
10472
10519
  });
10473
10520
 
10474
10521
  /**
10475
- * Pads `string` on the left and right sides if it is shorter than `length`.
10522
+ * Pads `string` on the left and right sides if it's shorter than `length`.
10476
10523
  * Padding characters are truncated if they can't be evenly divided by `length`.
10477
10524
  *
10478
10525
  * @static
@@ -10510,7 +10557,7 @@
10510
10557
  }
10511
10558
 
10512
10559
  /**
10513
- * Pads `string` on the left side if it is shorter than `length`. Padding
10560
+ * Pads `string` on the left side if it's shorter than `length`. Padding
10514
10561
  * characters are truncated if they exceed `length`.
10515
10562
  *
10516
10563
  * @static
@@ -10534,7 +10581,7 @@
10534
10581
  var padLeft = createPadDir();
10535
10582
 
10536
10583
  /**
10537
- * Pads `string` on the right side if it is shorter than `length`. Padding
10584
+ * Pads `string` on the right side if it's shorter than `length`. Padding
10538
10585
  * characters are truncated if they exceed `length`.
10539
10586
  *
10540
10587
  * @static
@@ -11015,7 +11062,7 @@
11015
11062
  }
11016
11063
 
11017
11064
  /**
11018
- * Truncates `string` if it is longer than the given maximum string length.
11065
+ * Truncates `string` if it's longer than the given maximum string length.
11019
11066
  * The last characters of the truncated string are replaced with the omission
11020
11067
  * string which defaults to "...".
11021
11068
  *
@@ -11229,7 +11276,9 @@
11229
11276
  if (guard && isIterateeCall(func, thisArg, guard)) {
11230
11277
  thisArg = null;
11231
11278
  }
11232
- return baseCallback(func, thisArg);
11279
+ return isObjectLike(func)
11280
+ ? matches(func)
11281
+ : baseCallback(func, thisArg);
11233
11282
  }
11234
11283
 
11235
11284
  /**
@@ -11274,7 +11323,7 @@
11274
11323
  }
11275
11324
 
11276
11325
  /**
11277
- * Creates a function which performs a deep comparison between a given object
11326
+ * Creates a function that performs a deep comparison between a given object
11278
11327
  * and `source`, returning `true` if the given object has equivalent property
11279
11328
  * values, else `false`.
11280
11329
  *
@@ -11303,7 +11352,7 @@
11303
11352
  }
11304
11353
 
11305
11354
  /**
11306
- * Creates a function which compares the property value of `path` on a given
11355
+ * Creates a function that compares the property value of `path` on a given
11307
11356
  * object to `value`.
11308
11357
  *
11309
11358
  * **Note:** This method supports comparing arrays, booleans, `Date` objects,
@@ -11314,7 +11363,7 @@
11314
11363
  * @memberOf _
11315
11364
  * @category Utility
11316
11365
  * @param {Array|string} path The path of the property to get.
11317
- * @param {*} value The value to compare.
11366
+ * @param {*} srcValue The value to match.
11318
11367
  * @returns {Function} Returns the new function.
11319
11368
  * @example
11320
11369
  *
@@ -11326,17 +11375,19 @@
11326
11375
  * _.find(users, _.matchesProperty('user', 'fred'));
11327
11376
  * // => { 'user': 'fred' }
11328
11377
  */
11329
- function matchesProperty(path, value) {
11330
- return baseMatchesProperty(path, baseClone(value, true));
11378
+ function matchesProperty(path, srcValue) {
11379
+ return baseMatchesProperty(path, baseClone(srcValue, true));
11331
11380
  }
11332
11381
 
11333
11382
  /**
11334
- * Creates a function which invokes the method at `path` on a given object.
11383
+ * Creates a function that invokes the method at `path` on a given object.
11384
+ * Any additional arguments are provided to the invoked method.
11335
11385
  *
11336
11386
  * @static
11337
11387
  * @memberOf _
11338
11388
  * @category Utility
11339
11389
  * @param {Array|string} path The path of the method to invoke.
11390
+ * @param {...*} [args] The arguments to invoke the method with.
11340
11391
  * @returns {Function} Returns the new function.
11341
11392
  * @example
11342
11393
  *
@@ -11354,17 +11405,19 @@
11354
11405
  var method = restParam(function(path, args) {
11355
11406
  return function(object) {
11356
11407
  return invokePath(object, path, args);
11357
- }
11408
+ };
11358
11409
  });
11359
11410
 
11360
11411
  /**
11361
- * The opposite of `_.method`; this method creates a function which invokes
11362
- * the method at a given path on `object`.
11412
+ * The opposite of `_.method`; this method creates a function that invokes
11413
+ * the method at a given path on `object`. Any additional arguments are
11414
+ * provided to the invoked method.
11363
11415
  *
11364
11416
  * @static
11365
11417
  * @memberOf _
11366
11418
  * @category Utility
11367
11419
  * @param {Object} object The object to query.
11420
+ * @param {...*} [args] The arguments to invoke the method with.
11368
11421
  * @returns {Function} Returns the new function.
11369
11422
  * @example
11370
11423
  *
@@ -11408,9 +11461,6 @@
11408
11461
  * });
11409
11462
  * }
11410
11463
  *
11411
- * // use `_.runInContext` to avoid conflicts (esp. in Node.js)
11412
- * var _ = require('lodash').runInContext();
11413
- *
11414
11464
  * _.mixin({ 'vowels': vowels });
11415
11465
  * _.vowels('fred');
11416
11466
  * // => ['e']
@@ -11425,8 +11475,8 @@
11425
11475
  function mixin(object, source, options) {
11426
11476
  if (options == null) {
11427
11477
  var isObj = isObject(source),
11428
- props = isObj && keys(source),
11429
- methodNames = props && props.length && baseFunctions(source, props);
11478
+ props = isObj ? keys(source) : null,
11479
+ methodNames = (props && props.length) ? baseFunctions(source, props) : null;
11430
11480
 
11431
11481
  if (!(methodNames ? methodNames.length : isObj)) {
11432
11482
  methodNames = false;
@@ -11493,7 +11543,7 @@
11493
11543
  }
11494
11544
 
11495
11545
  /**
11496
- * A no-operation function which returns `undefined` regardless of the
11546
+ * A no-operation function that returns `undefined` regardless of the
11497
11547
  * arguments it receives.
11498
11548
  *
11499
11549
  * @static
@@ -11511,7 +11561,7 @@
11511
11561
  }
11512
11562
 
11513
11563
  /**
11514
- * Creates a function which returns the property value at `path` on a
11564
+ * Creates a function that returns the property value at `path` on a
11515
11565
  * given object.
11516
11566
  *
11517
11567
  * @static
@@ -11537,7 +11587,7 @@
11537
11587
  }
11538
11588
 
11539
11589
  /**
11540
- * The opposite of `_.property`; this method creates a function which returns
11590
+ * The opposite of `_.property`; this method creates a function that returns
11541
11591
  * the property value at a given path on `object`.
11542
11592
  *
11543
11593
  * @static
@@ -11758,7 +11808,7 @@
11758
11808
  * _.max(users, 'age');
11759
11809
  * // => { 'user': 'fred', 'age': 40 }
11760
11810
  */
11761
- var max = createExtremum(arrayMax);
11811
+ var max = createExtremum(gt, NEGATIVE_INFINITY);
11762
11812
 
11763
11813
  /**
11764
11814
  * Gets the minimum value of `collection`. If `collection` is empty or falsey
@@ -11807,7 +11857,7 @@
11807
11857
  * _.min(users, 'age');
11808
11858
  * // => { 'user': 'barney', 'age': 36 }
11809
11859
  */
11810
- var min = createExtremum(arrayMin, true);
11860
+ var min = createExtremum(lt, POSITIVE_INFINITY);
11811
11861
 
11812
11862
  /**
11813
11863
  * Gets the sum of the values in `collection`.
@@ -11845,12 +11895,12 @@
11845
11895
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
11846
11896
  iteratee = null;
11847
11897
  }
11848
- var func = getCallback(),
11898
+ var callback = getCallback(),
11849
11899
  noIteratee = iteratee == null;
11850
11900
 
11851
- if (!(func === baseCallback && noIteratee)) {
11901
+ if (!(noIteratee && callback === baseCallback)) {
11852
11902
  noIteratee = false;
11853
- iteratee = func(iteratee, thisArg, 3);
11903
+ iteratee = callback(iteratee, thisArg, 3);
11854
11904
  }
11855
11905
  return noIteratee
11856
11906
  ? arraySum(isArray(collection) ? collection : toIterable(collection))
@@ -11929,6 +11979,7 @@
11929
11979
  lodash.keys = keys;
11930
11980
  lodash.keysIn = keysIn;
11931
11981
  lodash.map = map;
11982
+ lodash.mapKeys = mapKeys;
11932
11983
  lodash.mapValues = mapValues;
11933
11984
  lodash.matches = matches;
11934
11985
  lodash.matchesProperty = matchesProperty;
@@ -11977,6 +12028,7 @@
11977
12028
  lodash.union = union;
11978
12029
  lodash.uniq = uniq;
11979
12030
  lodash.unzip = unzip;
12031
+ lodash.unzipWith = unzipWith;
11980
12032
  lodash.values = values;
11981
12033
  lodash.valuesIn = valuesIn;
11982
12034
  lodash.where = where;
@@ -11985,6 +12037,7 @@
11985
12037
  lodash.xor = xor;
11986
12038
  lodash.zip = zip;
11987
12039
  lodash.zipObject = zipObject;
12040
+ lodash.zipWith = zipWith;
11988
12041
 
11989
12042
  // Add aliases.
11990
12043
  lodash.backflow = flowRight;
@@ -12026,6 +12079,8 @@
12026
12079
  lodash.findWhere = findWhere;
12027
12080
  lodash.first = first;
12028
12081
  lodash.get = get;
12082
+ lodash.gt = gt;
12083
+ lodash.gte = gte;
12029
12084
  lodash.has = has;
12030
12085
  lodash.identity = identity;
12031
12086
  lodash.includes = includes;
@@ -12055,6 +12110,8 @@
12055
12110
  lodash.kebabCase = kebabCase;
12056
12111
  lodash.last = last;
12057
12112
  lodash.lastIndexOf = lastIndexOf;
12113
+ lodash.lt = lt;
12114
+ lodash.lte = lte;
12058
12115
  lodash.max = max;
12059
12116
  lodash.min = min;
12060
12117
  lodash.noConflict = noConflict;
@@ -12091,6 +12148,7 @@
12091
12148
  lodash.all = every;
12092
12149
  lodash.any = some;
12093
12150
  lodash.contains = includes;
12151
+ lodash.eq = isEqual;
12094
12152
  lodash.detect = find;
12095
12153
  lodash.foldl = reduce;
12096
12154
  lodash.foldr = reduceRight;
@@ -12234,8 +12292,13 @@
12234
12292
 
12235
12293
  LazyWrapper.prototype.slice = function(start, end) {
12236
12294
  start = start == null ? 0 : (+start || 0);
12237
- var result = start < 0 ? this.takeRight(-start) : this.drop(start);
12238
12295
 
12296
+ var result = this;
12297
+ if (start < 0) {
12298
+ result = this.takeRight(-start);
12299
+ } else if (start) {
12300
+ result = this.drop(start);
12301
+ }
12239
12302
  if (end !== undefined) {
12240
12303
  end = (+end || 0);
12241
12304
  result = end < 0 ? result.dropRight(-end) : result.take(end - start);
@@ -12258,7 +12321,6 @@
12258
12321
 
12259
12322
  lodash.prototype[methodName] = function() {
12260
12323
  var args = arguments,
12261
- length = args.length,
12262
12324
  chainAll = this.__chain__,
12263
12325
  value = this.__wrapped__,
12264
12326
  isHybrid = !!this.__actions__.length,
@@ -12303,7 +12365,7 @@
12303
12365
  retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
12304
12366
 
12305
12367
  // Avoid array-like object bugs with `Array#shift` and `Array#splice` in
12306
- // IE < 9, Firefox < 10, Narwhal, and RingoJS.
12368
+ // IE < 9, Firefox < 10, and RingoJS.
12307
12369
  var func = !fixObjects ? protoFunc : function() {
12308
12370
  var result = protoFunc.apply(this, arguments);
12309
12371
  if (this.length === 0) {
@@ -12383,7 +12445,7 @@
12383
12445
  if (moduleExports) {
12384
12446
  (freeModule.exports = _)._ = _;
12385
12447
  }
12386
- // Export for Narwhal or Rhino -require.
12448
+ // Export for Rhino with CommonJS support.
12387
12449
  else {
12388
12450
  freeExports._ = _;
12389
12451
  }