PageSourceSearch

https://www.bruschet.fr/modules/ads_algolia_front/views/js/lib/lodash/4.17.11-npm/core.js

js bruschet.fr collected 2026-10-09 18:07:41 UTC 124,790 bytes, 3,854 lines download raw bytes

vendor: 5,774 bytes, lines 1-165
1/**
2 * @license
3 * Lodash (Custom Build) <https://lodash.com/>
4 * Build: `lodash core -o ./dist/lodash.core.js`
5 * Copyright JS Foundation and other contributors <https://js.foundation/>
6 * Released under MIT license <https://lodash.com/license>
7 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
8 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
9 */
10;(function() {
11
12    /** Used as a safe reference for `undefined` in pre-ES5 environments. */
13    var undefined;
14
15    /** Used as the semantic version number. */
16    var VERSION = '4.17.11';
17
18    /** Error message constants. */
19    var FUNC_ERROR_TEXT = 'Expected a function';
20
21    /** Used to compose bitmasks for value comparisons. */
22    var COMPARE_PARTIAL_FLAG = 1,
23        COMPARE_UNORDERED_FLAG = 2;
24
25    /** Used to compose bitmasks for function metadata. */
26    var WRAP_BIND_FLAG = 1,
27        WRAP_PARTIAL_FLAG = 32;
28
29    /** Used as references for various `Number` constants. */
30    var INFINITY = 1 / 0,
31        MAX_SAFE_INTEGER = 9007199254740991;
32
33    /** `Object#toString` result references. */
34    var argsTag = '[object Arguments]',
35        arrayTag = '[object Array]',
36        asyncTag = '[object AsyncFunction]',
37        boolTag = '[object Boolean]',
38        dateTag = '[object Date]',
39        errorTag = '[object Error]',
40        funcTag = '[object Function]',
41        genTag = '[object GeneratorFunction]',
42        numberTag = '[object Number]',
43        objectTag = '[object Object]',
44        proxyTag = '[object Proxy]',
45        regexpTag = '[object RegExp]',
46        stringTag = '[object String]';
47
48    /** Used to match HTML entities and HTML characters. */
49    var reUnescapedHtml = /[&<>"']/g,
50        reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
51
52    /** Used to detect unsigned integer values. */
53    var reIsUint = /^(?:0|[1-9]\d*)$/;
54
55    /** Used to map characters to HTML entities. */
56    var htmlEscapes = {
57        '&': '&amp;',
58        '<': '&lt;',
59        '>': '&gt;',
60        '"': '&quot;',
61        "'": '&#39;'
62    };
63
64    /** Detect free variable `global` from Node.js. */
65    var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
66
67    /** Detect free variable `self`. */
68    var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
69
70    /** Used as a reference to the global object. */
71    var root = freeGlobal || freeSelf || Function('return this')();
72
73    /** Detect free variable `exports`. */
74    var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
75
76    /** Detect free variable `module`. */
77    var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
78
79    /*--------------------------------------------------------------------------*/
80
81    /**
82     * Appends the elements of `values` to `array`.
83     *
84     * @private
85     * @param {Array} array The array to modify.
86     * @param {Array} values The values to append.
87     * @returns {Array} Returns `array`.
88     */
89    function arrayPush(array, values) {
90        array.push.apply(array, values);
91        return array;
92    }
93
94    /**
95     * The base implementation of `_.findIndex` and `_.findLastIndex` without
96     * support for iteratee shorthands.
97     *
98     * @private
99     * @param {Array} array The array to inspect.
100     * @param {Function} predicate The function invoked per iteration.
101     * @param {number} fromIndex The index to search from.
102     * @param {boolean} [fromRight] Specify iterating from right to left.
103     * @returns {number} Returns the index of the matched value, else `-1`.
104     */
105    function baseFindIndex(array, predicate, fromIndex, fromRight) {
106        var length = array.length,
107            index = fromIndex + (fromRight ? 1 : -1);
108
109        while ((fromRight ? index-- : ++index < length)) {
110            if (predicate(array[index], index, array)) {
111                return index;
112            }
113        }
114        return -1;
115    }
116
117    /**
118     * The base implementation of `_.property` without support for deep paths.
119     *
120     * @private
121     * @param {string} key The key of the property to get.
122     * @returns {Function} Returns the new accessor function.
123     */
124    function baseProperty(key) {
125        return function(object) {
126            return object == null ? undefined : object[key];
127        };
128    }
129
130    /**
131     * The base implementation of `_.propertyOf` without support for deep paths.
132     *
133     * @private
134     * @param {Object} object The object to query.
135     * @returns {Function} Returns the new accessor function.
136     */
137    function basePropertyOf(object) {
138        return function(key) {
139            return object == null ? undefined : object[key];
140        };
141    }
142
143    /**
144     * The base implementation of `_.reduce` and `_.reduceRight`, without support
145     * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
146     *
147     * @private
148     * @param {Array|Object} collection The collection to iterate over.
149     * @param {Function} iteratee The function invoked per iteration.
150     * @param {*} accumulator The initial value.
151     * @param {boolean} initAccum Specify using the first or last element of
152     *  `collection` as the initial value.
153     * @param {Function} eachFunc The function to iterate over `collection`.
154     * @returns {*} Returns the accumulated value.
155     */
156    function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
157        eachFunc(collection, function(value, index, collection) {
158            accumulator = initAccum
159                ? (initAccum = false, value)
160                : iteratee(accumulator, value, index, collection);
161        });
162        return accumulator;
163    }
164
165    /**
166     * The base implementation of `_.values` and `_.valuesIn` which creates an
167     * array of `object` property values corresponding to the property names
168     * of `props`.
169     *
170     * @private
171     * @param {Object} object The object to query.
172     * @param {Array} props The property names to get values for.
173     * @returns {Object} Returns the array of property values.
174     */
175    function baseValues(object, props) {
176        return baseMap(props, function(key) {
177            return object[key];
178        });
179    }
180
181    /**
182     * Used by `_.escape` to convert characters to HTML entities.
183     *
184     * @private
185     * @param {string} chr The matched character to escape.
186     * @returns {string} Returns the escaped character.
187     */
188    var escapeHtmlChar = basePropertyOf(htmlEscapes);
189
190    /**
191     * Creates a unary function that invokes `func` with its argument transformed.
192     *
193     * @private
194     * @param {Function} func The function to wrap.
195     * @param {Function} transform The argument transform.
196     * @returns {Function} Returns the new function.
197     */
198    function overArg(func, transform) {
199        return function(arg) {
200            return func(transform(arg));
201        };
202    }
203
204    /*--------------------------------------------------------------------------*/
205
206    /** Used for built-in method references. */
207    var arrayProto = Array.prototype,
208        objectProto = Object.prototype;
209
210    /** Used to check objects for own properties. */
211    var hasOwnProperty = objectProto.hasOwnProperty;
212
213    /** Used to generate unique IDs. */
214    var idCounter = 0;
215
216    /**
217     * Used to resolve the
218     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
219     * of values.
220     */
221    var nativeObjectToString = objectProto.toString;
222
223    /** Used to restore the original `_` reference in `_.noConflict`. */
224    var oldDash = root._;
225
226    /** Built-in value references. */
227    var objectCreate = Object.create,
228        propertyIsEnumerable = objectProto.propertyIsEnumerable;
229
230    /* Built-in method references for those with the same name as other `lodash` methods. */
231    var nativeIsFinite = root.isFinite,
232        nativeKeys = overArg(Object.keys, Object),
233        nativeMax = Math.max;
234
235    /*------------------------------------------------------------------------*/
236
237    /**
238     * Creates a `lodash` object which wraps `value` to enable implicit method
239     * chain sequences. Methods that operate on and return arrays, collections,
240     * and functions can be chained together. Methods that retrieve a single value
241     * or may return a primitive value will automatically end the chain sequence
242     * and return the unwrapped value. Otherwise, the value must be unwrapped
243     * with `_#value`.
244     *
245     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
246     * enabled using `_.chain`.
247     *
248     * The execution of chained methods is lazy, that is, it's deferred until
249     * `_#value` is implicitly or explicitly called.
250     *
251     * Lazy evaluation allows several methods to support shortcut fusion.
252     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
253     * the creation of intermediate arrays and can greatly reduce the number of
254     * iteratee executions. Sections of a chain sequence qualify for shortcut
255     * fusion if the section is applied to an array and iteratees accept only
256     * one argument. The heuristic for whether a section qualifies for shortcut
257     * fusion is subject to change.
258     *
259     * Chaining is supported in custom builds as long as the `_#value` method is
260     * directly or indirectly included in the build.
261     *
262     * In addition to lodash methods, wrappers have `Array` and `String` methods.
263     *
264     * The wrapper `Array` methods are:
265     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
266     *
267     * The wrapper `String` methods are:
268     * `replace` and `split`
269     *
270     * The wrapper methods that support shortcut fusion are:
271     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
272     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
273     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
274     *
275     * The chainable wrapper methods are:
276     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
277     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
278     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
279     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
280     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
281     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
282     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
283     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
284     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
285     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
286     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
287     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
288     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
289     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
290     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
291     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
292     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
293     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
294     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
295     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
296     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
297     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
298     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
299     * `zipObject`, `zipObjectDeep`, and `zipWith`
300     *
301     * The wrapper methods that are **not** chainable by default are:
302     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
303     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
304     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
305     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
306     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
307     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
308     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
309     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
310     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
311     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
312     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
313     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
314     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
315     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
316     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
317     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
318     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
319     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
320     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
321     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
322     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
323     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
324     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
325     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
326     * `upperFirst`, `value`, and `words`
327     *
328     * @name _
329     * @constructor
330     * @category Seq
331     * @param {*} value The value to wrap in a `lodash` instance.
332     * @returns {Object} Returns the new `lodash` wrapper instance.
333     * @example
334     *
335     * function square(n) {
336     *   return n * n;
337     * }
338     *
339     * var wrapped = _([1, 2, 3]);
340     *
341     * // Returns an unwrapped value.
342     * wrapped.reduce(_.add);
343     * // => 6
344     *
345     * // Returns a wrapped value.
346     * var squares = wrapped.map(square);
347     *
348     * _.isArray(squares);
349     * // => false
350     *
351     * _.isArray(squares.value());
352     * // => true
353     */
354    function lodash(value) {
355        return value instanceof LodashWrapper
356            ? value
357            : new LodashWrapper(value);
358    }
359
360    /**
361     * The base implementation of `_.create` without support for assigning
362     * properties to the created object.
363     *
364     * @private
365     * @param {Object} proto The object to inherit from.
366     * @returns {Object} Returns the new object.
367     */
368    var baseCreate = (function() {
369        function object() {}
370        return function(proto) {
371            if (!isObject(proto)) {
372                return {};
373            }
374            if (objectCreate) {
375                return objectCreate(proto);
376            }
377            object.prototype = proto;
378            var result = new object;
379            object.prototype = undefined;
380            return result;
381        };
382    }());
383
384    /**
385     * The base constructor for creating `lodash` wrapper objects.
386     *
387     * @private
388     * @param {*} value The value to wrap.
389     * @param {boolean} [chainAll] Enable explicit method chain sequences.
390     */
391    function LodashWrapper(value, chainAll) {
392        this.__wrapped__ = value;
393        this.__actions__ = [];
394        this.__chain__ = !!chainAll;
395    }
396
397    LodashWrapper.prototype = baseCreate(lodash.prototype);
398    LodashWrapper.prototype.constructor = LodashWrapper;
399
400    /*------------------------------------------------------------------------*/
401
402    /**
403     * Assigns `value` to `key` of `object` if the existing value is not equivalent
404     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
405     * for equality comparisons.
406     *
407     * @private
408     * @param {Object} object The object to modify.
409     * @param {string} key The key of the property to assign.
410     * @param {*} value The value to assign.
411     */
412    function assignValue(object, key, value) {
413        var objValue = object[key];
414        if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
415            (value === undefined && !(key in object))) {
416            baseAssignValue(object, key, value);
417        }
418    }
419
420    /**
421     * The base implementation of `assignValue` and `assignMergeValue` without
422     * value checks.
423     *
424     * @private
425     * @param {Object} object The object to modify.
426     * @param {string} key The key of the property to assign.
427     * @param {*} value The value to assign.
428     */
429    function baseAssignValue(object, key, value) {
430        object[key] = value;
431    }
432
433    /**
434     * The base implementation of `_.delay` and `_.defer` which accepts `args`
435     * to provide to `func`.
436     *
437     * @private
438     * @param {Function} func The function to delay.
439     * @param {number} wait The number of milliseconds to delay invocation.
440     * @param {Array} args The arguments to provide to `func`.
441     * @returns {number|Object} Returns the timer id or timeout object.
442     */
vendor: 47,149 bytes, lines 443-1846
443    function baseDelay(func, wait, args) {
444        if (typeof func != 'function') {
445            throw new TypeError(FUNC_ERROR_TEXT);
446        }
447        return setTimeout(function() { func.apply(undefined, args); }, wait);
448    }
449
450    /**
451     * The base implementation of `_.forEach` without support for iteratee shorthands.
452     *
453     * @private
454     * @param {Array|Object} collection The collection to iterate over.
455     * @param {Function} iteratee The function invoked per iteration.
456     * @returns {Array|Object} Returns `collection`.
457     */
458    var baseEach = createBaseEach(baseForOwn);
459
460    /**
461     * The base implementation of `_.every` without support for iteratee shorthands.
462     *
463     * @private
464     * @param {Array|Object} collection The collection to iterate over.
465     * @param {Function} predicate The function invoked per iteration.
466     * @returns {boolean} Returns `true` if all elements pass the predicate check,
467     *  else `false`
468     */
469    function baseEvery(collection, predicate) {
470        var result = true;
471        baseEach(collection, function(value, index, collection) {
472            result = !!predicate(value, index, collection);
473            return result;
474        });
475        return result;
476    }
477
478    /**
479     * The base implementation of methods like `_.max` and `_.min` which accepts a
480     * `comparator` to determine the extremum value.
481     *
482     * @private
483     * @param {Array} array The array to iterate over.
484     * @param {Function} iteratee The iteratee invoked per iteration.
485     * @param {Function} comparator The comparator used to compare values.
486     * @returns {*} Returns the extremum value.
487     */
488    function baseExtremum(array, iteratee, comparator) {
489        var index = -1,
490            length = array.length;
491
492        while (++index < length) {
493            var value = array[index],
494                current = iteratee(value);
495
496            if (current != null && (computed === undefined
497                    ? (current === current && !false)
498                    : comparator(current, computed)
499            )) {
500                var computed = current,
501                    result = value;
502            }
503        }
504        return result;
505    }
506
507    /**
508     * The base implementation of `_.filter` without support for iteratee shorthands.
509     *
510     * @private
511     * @param {Array|Object} collection The collection to iterate over.
512     * @param {Function} predicate The function invoked per iteration.
513     * @returns {Array} Returns the new filtered array.
514     */
515    function baseFilter(collection, predicate) {
516        var result = [];
517        baseEach(collection, function(value, index, collection) {
518            if (predicate(value, index, collection)) {
519                result.push(value);
520            }
521        });
522        return result;
523    }
524
525    /**
526     * The base implementation of `_.flatten` with support for restricting flattening.
527     *
528     * @private
529     * @param {Array} array The array to flatten.
530     * @param {number} depth The maximum recursion depth.
531     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
532     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
533     * @param {Array} [result=[]] The initial result value.
534     * @returns {Array} Returns the new flattened array.
535     */
536    function baseFlatten(array, depth, predicate, isStrict, result) {
537        var index = -1,
538            length = array.length;
539
540        predicate || (predicate = isFlattenable);
541        result || (result = []);
542
543        while (++index < length) {
544            var value = array[index];
545            if (depth > 0 && predicate(value)) {
546                if (depth > 1) {
547                    // Recursively flatten arrays (susceptible to call stack limits).
548                    baseFlatten(value, depth - 1, predicate, isStrict, result);
549                } else {
550                    arrayPush(result, value);
551                }
552            } else if (!isStrict) {
553                result[result.length] = value;
554            }
555        }
556        return result;
557    }
558
559    /**
560     * The base implementation of `baseForOwn` which iterates over `object`
561     * properties returned by `keysFunc` and invokes `iteratee` for each property.
562     * Iteratee functions may exit iteration early by explicitly returning `false`.
563     *
564     * @private
565     * @param {Object} object The object to iterate over.
566     * @param {Function} iteratee The function invoked per iteration.
567     * @param {Function} keysFunc The function to get the keys of `object`.
568     * @returns {Object} Returns `object`.
569     */
570    var baseFor = createBaseFor();
571
572    /**
573     * The base implementation of `_.forOwn` without support for iteratee shorthands.
574     *
575     * @private
576     * @param {Object} object The object to iterate over.
577     * @param {Function} iteratee The function invoked per iteration.
578     * @returns {Object} Returns `object`.
579     */
580    function baseForOwn(object, iteratee) {
581        return object && baseFor(object, iteratee, keys);
582    }
583
584    /**
585     * The base implementation of `_.functions` which creates an array of
586     * `object` function property names filtered from `props`.
587     *
588     * @private
589     * @param {Object} object The object to inspect.
590     * @param {Array} props The property names to filter.
591     * @returns {Array} Returns the function names.
592     */
593    function baseFunctions(object, props) {
594        return baseFilter(props, function(key) {
595            return isFunction(object[key]);
596        });
597    }
598
599    /**
600     * The base implementation of `getTag` without fallbacks for buggy environments.
601     *
602     * @private
603     * @param {*} value The value to query.
604     * @returns {string} Returns the `toStringTag`.
605     */
606    function baseGetTag(value) {
607        return objectToString(value);
608    }
609
610    /**
611     * The base implementation of `_.gt` which doesn't coerce arguments.
612     *
613     * @private
614     * @param {*} value The value to compare.
615     * @param {*} other The other value to compare.
616     * @returns {boolean} Returns `true` if `value` is greater than `other`,
617     *  else `false`.
618     */
619    function baseGt(value, other) {
620        return value > other;
621    }
622
623    /**
624     * The base implementation of `_.isArguments`.
625     *
626     * @private
627     * @param {*} value The value to check.
628     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
629     */
630    var baseIsArguments = noop;
631
632    /**
633     * The base implementation of `_.isDate` without Node.js optimizations.
634     *
635     * @private
636     * @param {*} value The value to check.
637     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
638     */
639    function baseIsDate(value) {
640        return isObjectLike(value) && baseGetTag(value) == dateTag;
641    }
642
643    /**
644     * The base implementation of `_.isEqual` which supports partial comparisons
645     * and tracks traversed objects.
646     *
647     * @private
648     * @param {*} value The value to compare.
649     * @param {*} other The other value to compare.
650     * @param {boolean} bitmask The bitmask flags.
651     *  1 - Unordered comparison
652     *  2 - Partial comparison
653     * @param {Function} [customizer] The function to customize comparisons.
654     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
655     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
656     */
657    function baseIsEqual(value, other, bitmask, customizer, stack) {
658        if (value === other) {
659            return true;
660        }
661        if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
662            return value !== value && other !== other;
663        }
664        return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
665    }
666
667    /**
668     * A specialized version of `baseIsEqual` for arrays and objects which performs
669     * deep comparisons and tracks traversed objects enabling objects with circular
670     * references to be compared.
671     *
672     * @private
673     * @param {Object} object The object to compare.
674     * @param {Object} other The other object to compare.
675     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
676     * @param {Function} customizer The function to customize comparisons.
677     * @param {Function} equalFunc The function to determine equivalents of values.
678     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
679     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
680     */
681    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
682        var objIsArr = isArray(object),
683            othIsArr = isArray(other),
684            objTag = objIsArr ? arrayTag : baseGetTag(object),
685            othTag = othIsArr ? arrayTag : baseGetTag(other);
686
687        objTag = objTag == argsTag ? objectTag : objTag;
688        othTag = othTag == argsTag ? objectTag : othTag;
689
690        var objIsObj = objTag == objectTag,
691            othIsObj = othTag == objectTag,
692            isSameTag = objTag == othTag;
693
694        stack || (stack = []);
695        var objStack = find(stack, function(entry) {
696            return entry[0] == object;
697        });
698        var othStack = find(stack, function(entry) {
699            return entry[0] == other;
700        });
701        if (objStack && othStack) {
702            return objStack[1] == other;
703        }
704        stack.push([object, other]);
705        stack.push([other, object]);
706        if (isSameTag && !objIsObj) {
707            var result = (objIsArr)
708                ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
709                : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
710            stack.pop();
711            return result;
712        }
713        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
714            var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
715                othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
716
717            if (objIsWrapped || othIsWrapped) {
718                var objUnwrapped = objIsWrapped ? object.value() : object,
719                    othUnwrapped = othIsWrapped ? other.value() : other;
720
721                var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
722                stack.pop();
723                return result;
724            }
725        }
726        if (!isSameTag) {
727            return false;
728        }
729        var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
730        stack.pop();
731        return result;
732    }
733
734    /**
735     * The base implementation of `_.isRegExp` without Node.js optimizations.
736     *
737     * @private
738     * @param {*} value The value to check.
739     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
740     */
741    function baseIsRegExp(value) {
742        return isObjectLike(value) && baseGetTag(value) == regexpTag;
743    }
744
745    /**
746     * The base implementation of `_.iteratee`.
747     *
748     * @private
749     * @param {*} [value=_.identity] The value to convert to an iteratee.
750     * @returns {Function} Returns the iteratee.
751     */
752    function baseIteratee(func) {
753        if (typeof func == 'function') {
754            return func;
755        }
756        if (func == null) {
757            return identity;
758        }
759        return (typeof func == 'object' ? baseMatches : baseProperty)(func);
760    }
761
762    /**
763     * The base implementation of `_.lt` which doesn't coerce arguments.
764     *
765     * @private
766     * @param {*} value The value to compare.
767     * @param {*} other The other value to compare.
768     * @returns {boolean} Returns `true` if `value` is less than `other`,
769     *  else `false`.
770     */
771    function baseLt(value, other) {
772        return value < other;
773    }
774
775    /**
776     * The base implementation of `_.map` without support for iteratee shorthands.
777     *
778     * @private
779     * @param {Array|Object} collection The collection to iterate over.
780     * @param {Function} iteratee The function invoked per iteration.
781     * @returns {Array} Returns the new mapped array.
782     */
783    function baseMap(collection, iteratee) {
784        var index = -1,
785            result = isArrayLike(collection) ? Array(collection.length) : [];
786
787        baseEach(collection, function(value, key, collection) {
788            result[++index] = iteratee(value, key, collection);
789        });
790        return result;
791    }
792
793    /**
794     * The base implementation of `_.matches` which doesn't clone `source`.
795     *
796     * @private
797     * @param {Object} source The object of property values to match.
798     * @returns {Function} Returns the new spec function.
799     */
800    function baseMatches(source) {
801        var props = nativeKeys(source);
802        return function(object) {
803            var length = props.length;
804            if (object == null) {
805                return !length;
806            }
807            object = Object(object);
808            while (length--) {
809                var key = props[length];
810                if (!(key in object &&
811                    baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
812                )) {
813                    return false;
814                }
815            }
816            return true;
817        };
818    }
819
820    /**
821     * The base implementation of `_.pick` without support for individual
822     * property identifiers.
823     *
824     * @private
825     * @param {Object} object The source object.
826     * @param {string[]} paths The property paths to pick.
827     * @returns {Object} Returns the new object.
828     */
829    function basePick(object, props) {
830        object = Object(object);
831        return reduce(props, function(result, key) {
832            if (key in object) {
833                result[key] = object[key];
834            }
835            return result;
836        }, {});
837    }
838
839    /**
840     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
841     *
842     * @private
843     * @param {Function} func The function to apply a rest parameter to.
844     * @param {number} [start=func.length-1] The start position of the rest parameter.
845     * @returns {Function} Returns the new function.
846     */
847    function baseRest(func, start) {
848        return setToString(overRest(func, start, identity), func + '');
849    }
850
851    /**
852     * The base implementation of `_.slice` without an iteratee call guard.
853     *
854     * @private
855     * @param {Array} array The array to slice.
856     * @param {number} [start=0] The start position.
857     * @param {number} [end=array.length] The end position.
858     * @returns {Array} Returns the slice of `array`.
859     */
860    function baseSlice(array, start, end) {
861        var index = -1,
862            length = array.length;
863
864        if (start < 0) {
865            start = -start > length ? 0 : (length + start);
866        }
867        end = end > length ? length : end;
868        if (end < 0) {
869            end += length;
870        }
871        length = start > end ? 0 : ((end - start) >>> 0);
872        start >>>= 0;
873
874        var result = Array(length);
875        while (++index < length) {
876            result[index] = array[index + start];
877        }
878        return result;
879    }
880
881    /**
882     * Copies the values of `source` to `array`.
883     *
884     * @private
885     * @param {Array} source The array to copy values from.
886     * @param {Array} [array=[]] The array to copy values to.
887     * @returns {Array} Returns `array`.
888     */
889    function copyArray(source) {
890        return baseSlice(source, 0, source.length);
891    }
892
893    /**
894     * The base implementation of `_.some` without support for iteratee shorthands.
895     *
896     * @private
897     * @param {Array|Object} collection The collection to iterate over.
898     * @param {Function} predicate The function invoked per iteration.
899     * @returns {boolean} Returns `true` if any element passes the predicate check,
900     *  else `false`.
901     */
902    function baseSome(collection, predicate) {
903        var result;
904
905        baseEach(collection, function(value, index, collection) {
906            result = predicate(value, index, collection);
907            return !result;
908        });
909        return !!result;
910    }
911
912    /**
913     * The base implementation of `wrapperValue` which returns the result of
914     * performing a sequence of actions on the unwrapped `value`, where each
915     * successive action is supplied the return value of the previous.
916     *
917     * @private
918     * @param {*} value The unwrapped value.
919     * @param {Array} actions Actions to perform to resolve the unwrapped value.
920     * @returns {*} Returns the resolved value.
921     */
922    function baseWrapperValue(value, actions) {
923        var result = value;
924        return reduce(actions, function(result, action) {
925            return action.func.apply(action.thisArg, arrayPush([result], action.args));
926        }, result);
927    }
928
929    /**
930     * Compares values to sort them in ascending order.
931     *
932     * @private
933     * @param {*} value The value to compare.
934     * @param {*} other The other value to compare.
935     * @returns {number} Returns the sort order indicator for `value`.
936     */
937    function compareAscending(value, other) {
938        if (value !== other) {
939            var valIsDefined = value !== undefined,
940                valIsNull = value === null,
941                valIsReflexive = value === value,
942                valIsSymbol = false;
943
944            var othIsDefined = other !== undefined,
945                othIsNull = other === null,
946                othIsReflexive = other === other,
947                othIsSymbol = false;
948
949            if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
950                (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
951                (valIsNull && othIsDefined && othIsReflexive) ||
952                (!valIsDefined && othIsReflexive) ||
953                !valIsReflexive) {
954                return 1;
955            }
956            if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
957                (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
958                (othIsNull && valIsDefined && valIsReflexive) ||
959                (!othIsDefined && valIsReflexive) ||
960                !othIsReflexive) {
961                return -1;
962            }
963        }
964        return 0;
965    }
966
967    /**
968     * Copies properties of `source` to `object`.
969     *
970     * @private
971     * @param {Object} source The object to copy properties from.
972     * @param {Array} props The property identifiers to copy.
973     * @param {Object} [object={}] The object to copy properties to.
974     * @param {Function} [customizer] The function to customize copied values.
975     * @returns {Object} Returns `object`.
976     */
977    function copyObject(source, props, object, customizer) {
978        var isNew = !object;
979        object || (object = {});
980
981        var index = -1,
982            length = props.length;
983
984        while (++index < length) {
985            var key = props[index];
986
987            var newValue = customizer
988                ? customizer(object[key], source[key], key, object, source)
989                : undefined;
990
991            if (newValue === undefined) {
992                newValue = source[key];
993            }
994            if (isNew) {
995                baseAssignValue(object, key, newValue);
996            } else {
997                assignValue(object, key, newValue);
998            }
999        }
1000        return object;
1001    }
1002
1003    /**
1004     * Creates a function like `_.assign`.
1005     *
1006     * @private
1007     * @param {Function} assigner The function to assign values.
1008     * @returns {Function} Returns the new assigner function.
1009     */
1010    function createAssigner(assigner) {
1011        return baseRest(function(object, sources) {
1012            var index = -1,
1013                length = sources.length,
1014                customizer = length > 1 ? sources[length - 1] : undefined;
1015
1016            customizer = (assigner.length > 3 && typeof customizer == 'function')
1017                ? (length--, customizer)
1018                : undefined;
1019
1020            object = Object(object);
1021            while (++index < length) {
1022                var source = sources[index];
1023                if (source) {
1024                    assigner(object, source, index, customizer);
1025                }
1026            }
1027            return object;
1028        });
1029    }
1030
1031    /**
1032     * Creates a `baseEach` or `baseEachRight` function.
1033     *
1034     * @private
1035     * @param {Function} eachFunc The function to iterate over a collection.
1036     * @param {boolean} [fromRight] Specify iterating from right to left.
1037     * @returns {Function} Returns the new base function.
1038     */
1039    function createBaseEach(eachFunc, fromRight) {
1040        return function(collection, iteratee) {
1041            if (collection == null) {
1042                return collection;
1043            }
1044            if (!isArrayLike(collection)) {
1045                return eachFunc(collection, iteratee);
1046            }
1047            var length = collection.length,
1048                index = fromRight ? length : -1,
1049                iterable = Object(collection);
1050
1051            while ((fromRight ? index-- : ++index < length)) {
1052                if (iteratee(iterable[index], index, iterable) === false) {
1053                    break;
1054                }
1055            }
1056            return collection;
1057        };
1058    }
1059
1060    /**
1061     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
1062     *
1063     * @private
1064     * @param {boolean} [fromRight] Specify iterating from right to left.
1065     * @returns {Function} Returns the new base function.
1066     */
1067    function createBaseFor(fromRight) {
1068        return function(object, iteratee, keysFunc) {
1069            var index = -1,
1070                iterable = Object(object),
1071                props = keysFunc(object),
1072                length = props.length;
1073
1074            while (length--) {
1075                var key = props[fromRight ? length : ++index];
1076                if (iteratee(iterable[key], key, iterable) === false) {
1077                    break;
1078                }
1079            }
1080            return object;
1081        };
1082    }
1083
1084    /**
1085     * Creates a function that produces an instance of `Ctor` regardless of
1086     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
1087     *
1088     * @private
1089     * @param {Function} Ctor The constructor to wrap.
1090     * @returns {Function} Returns the new wrapped function.
1091     */
1092    function createCtor(Ctor) {
1093        return function() {
1094            // Use a `switch` statement to work with class constructors. See
1095            // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
1096            // for more details.
1097            var args = arguments;
1098            var thisBinding = baseCreate(Ctor.prototype),
1099                result = Ctor.apply(thisBinding, args);
1100
1101            // Mimic the constructor's `return` behavior.
1102            // See https://es5.github.io/#x13.2.2 for more details.
1103            return isObject(result) ? result : thisBinding;
1104        };
1105    }
1106
1107    /**
1108     * Creates a `_.find` or `_.findLast` function.
1109     *
1110     * @private
1111     * @param {Function} findIndexFunc The function to find the collection index.
1112     * @returns {Function} Returns the new find function.
1113     */
1114    function createFind(findIndexFunc) {
1115        return function(collection, predicate, fromIndex) {
1116            var iterable = Object(collection);
1117            if (!isArrayLike(collection)) {
1118                var iteratee = baseIteratee(predicate, 3);
1119                collection = keys(collection);
1120                predicate = function(key) { return iteratee(iterable[key], key, iterable); };
1121            }
1122            var index = findIndexFunc(collection, predicate, fromIndex);
1123            return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
1124        };
1125    }
1126
1127    /**
1128     * Creates a function that wraps `func` to invoke it with the `this` binding
1129     * of `thisArg` and `partials` prepended to the arguments it receives.
1130     *
1131     * @private
1132     * @param {Function} func The function to wrap.
1133     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
1134     * @param {*} thisArg The `this` binding of `func`.
1135     * @param {Array} partials The arguments to prepend to those provided to
1136     *  the new function.
1137     * @returns {Function} Returns the new wrapped function.
1138     */
1139    function createPartial(func, bitmask, thisArg, partials) {
1140        if (typeof func != 'function') {
1141            throw new TypeError(FUNC_ERROR_TEXT);
1142        }
1143        var isBind = bitmask & WRAP_BIND_FLAG,
1144            Ctor = createCtor(func);
1145
1146        function wrapper() {
1147            var argsIndex = -1,
1148                argsLength = arguments.length,
1149                leftIndex = -1,
1150                leftLength = partials.length,
1151                args = Array(leftLength + argsLength),
1152                fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
1153
1154            while (++leftIndex < leftLength) {
1155                args[leftIndex] = partials[leftIndex];
1156            }
1157            while (argsLength--) {
1158                args[leftIndex++] = arguments[++argsIndex];
1159            }
1160            return fn.apply(isBind ? thisArg : this, args);
1161        }
1162        return wrapper;
1163    }
1164
1165    /**
1166     * A specialized version of `baseIsEqualDeep` for arrays with support for
1167     * partial deep comparisons.
1168     *
1169     * @private
1170     * @param {Array} array The array to compare.
1171     * @param {Array} other The other array to compare.
1172     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1173     * @param {Function} customizer The function to customize comparisons.
1174     * @param {Function} equalFunc The function to determine equivalents of values.
1175     * @param {Object} stack Tracks traversed `array` and `other` objects.
1176     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
1177     */
1178    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
1179        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1180            arrLength = array.length,
1181            othLength = other.length;
1182
1183        if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
1184            return false;
1185        }
1186        var index = -1,
1187            result = true,
1188            seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
1189
1190        // Ignore non-index properties.
1191        while (++index < arrLength) {
1192            var arrValue = array[index],
1193                othValue = other[index];
1194
1195            var compared;
1196            if (compared !== undefined) {
1197                if (compared) {
1198                    continue;
1199                }
1200                result = false;
1201                break;
1202            }
1203            // Recursively compare arrays (susceptible to call stack limits).
1204            if (seen) {
1205                if (!baseSome(other, function(othValue, othIndex) {
1206                    if (!indexOf(seen, othIndex) &&
1207                        (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
1208                        return seen.push(othIndex);
1209                    }
1210                })) {
1211                    result = false;
1212                    break;
1213                }
1214            } else if (!(
1215                arrValue === othValue ||
1216                equalFunc(arrValue, othValue, bitmask, customizer, stack)
1217            )) {
1218                result = false;
1219                break;
1220            }
1221        }
1222        return result;
1223    }
1224
1225    /**
1226     * A specialized version of `baseIsEqualDeep` for comparing objects of
1227     * the same `toStringTag`.
1228     *
1229     * **Note:** This function only supports comparing values with tags of
1230     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
1231     *
1232     * @private
1233     * @param {Object} object The object to compare.
1234     * @param {Object} other The other object to compare.
1235     * @param {string} tag The `toStringTag` of the objects to compare.
1236     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1237     * @param {Function} customizer The function to customize comparisons.
1238     * @param {Function} equalFunc The function to determine equivalents of values.
1239     * @param {Object} stack Tracks traversed `object` and `other` objects.
1240     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1241     */
1242    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1243        switch (tag) {
1244
1245            case boolTag:
1246            case dateTag:
1247            case numberTag:
1248                // Coerce booleans to `1` or `0` and dates to milliseconds.
1249                // Invalid dates are coerced to `NaN`.
1250                return eq(+object, +other);
1251
1252            case errorTag:
1253                return object.name == other.name && object.message == other.message;
1254
1255            case regexpTag:
1256            case stringTag:
1257                // Coerce regexes to strings and treat strings, primitives and objects,
1258                // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
1259                // for more details.
1260                return object == (other + '');
1261
1262        }
1263        return false;
1264    }
1265
1266    /**
1267     * A specialized version of `baseIsEqualDeep` for objects with support for
1268     * partial deep comparisons.
1269     *
1270     * @private
1271     * @param {Object} object The object to compare.
1272     * @param {Object} other The other object to compare.
1273     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1274     * @param {Function} customizer The function to customize comparisons.
1275     * @param {Function} equalFunc The function to determine equivalents of values.
1276     * @param {Object} stack Tracks traversed `object` and `other` objects.
1277     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1278     */
1279    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
1280        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1281            objProps = keys(object),
1282            objLength = objProps.length,
1283            othProps = keys(other),
1284            othLength = othProps.length;
1285
1286        if (objLength != othLength && !isPartial) {
1287            return false;
1288        }
1289        var index = objLength;
1290        while (index--) {
1291            var key = objProps[index];
1292            if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
1293                return false;
1294            }
1295        }
1296        var result = true;
1297
1298        var skipCtor = isPartial;
1299        while (++index < objLength) {
1300            key = objProps[index];
1301            var objValue = object[key],
1302                othValue = other[key];
1303
1304            var compared;
1305            // Recursively compare objects (susceptible to call stack limits).
1306            if (!(compared === undefined
1307                    ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
1308                    : compared
1309            )) {
1310                result = false;
1311                break;
1312            }
1313            skipCtor || (skipCtor = key == 'constructor');
1314        }
1315        if (result && !skipCtor) {
1316            var objCtor = object.constructor,
1317                othCtor = other.constructor;
1318
1319            // Non `Object` object instances with different constructors are not equal.
1320            if (objCtor != othCtor &&
1321                ('constructor' in object && 'constructor' in other) &&
1322                !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
1323                    typeof othCtor == 'function' && othCtor instanceof othCtor)) {
1324                result = false;
1325            }
1326        }
1327        return result;
1328    }
1329
1330    /**
1331     * A specialized version of `baseRest` which flattens the rest array.
1332     *
1333     * @private
1334     * @param {Function} func The function to apply a rest parameter to.
1335     * @returns {Function} Returns the new function.
1336     */
1337    function flatRest(func) {
1338        return setToString(overRest(func, undefined, flatten), func + '');
1339    }
1340
1341    /**
1342     * Checks if `value` is a flattenable `arguments` object or array.
1343     *
1344     * @private
1345     * @param {*} value The value to check.
1346     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
1347     */
1348    function isFlattenable(value) {
1349        return isArray(value) || isArguments(value);
1350    }
1351
1352    /**
1353     * Checks if `value` is a valid array-like index.
1354     *
1355     * @private
1356     * @param {*} value The value to check.
1357     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
1358     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
1359     */
1360    function isIndex(value, length) {
1361        var type = typeof value;
1362        length = length == null ? MAX_SAFE_INTEGER : length;
1363
1364        return !!length &&
1365            (type == 'number' ||
1366                (type != 'symbol' && reIsUint.test(value))) &&
1367            (value > -1 && value % 1 == 0 && value < length);
1368    }
1369
1370    /**
1371     * Checks if the given arguments are from an iteratee call.
1372     *
1373     * @private
1374     * @param {*} value The potential iteratee value argument.
1375     * @param {*} index The potential iteratee index or key argument.
1376     * @param {*} object The potential iteratee object argument.
1377     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
1378     *  else `false`.
1379     */
1380    function isIterateeCall(value, index, object) {
1381        if (!isObject(object)) {
1382            return false;
1383        }
1384        var type = typeof index;
1385        if (type == 'number'
1386            ? (isArrayLike(object) && isIndex(index, object.length))
1387            : (type == 'string' && index in object)
1388        ) {
1389            return eq(object[index], value);
1390        }
1391        return false;
1392    }
1393
1394    /**
1395     * This function is like
1396     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1397     * except that it includes inherited enumerable properties.
1398     *
1399     * @private
1400     * @param {Object} object The object to query.
1401     * @returns {Array} Returns the array of property names.
1402     */
1403    function nativeKeysIn(object) {
1404        var result = [];
1405        if (object != null) {
1406            for (var key in Object(object)) {
1407                result.push(key);
1408            }
1409        }
1410        return result;
1411    }
1412
1413    /**
1414     * Converts `value` to a string using `Object.prototype.toString`.
1415     *
1416     * @private
1417     * @param {*} value The value to convert.
1418     * @returns {string} Returns the converted string.
1419     */
1420    function objectToString(value) {
1421        return nativeObjectToString.call(value);
1422    }
1423
1424    /**
1425     * A specialized version of `baseRest` which transforms the rest array.
1426     *
1427     * @private
1428     * @param {Function} func The function to apply a rest parameter to.
1429     * @param {number} [start=func.length-1] The start position of the rest parameter.
1430     * @param {Function} transform The rest array transform.
1431     * @returns {Function} Returns the new function.
1432     */
1433    function overRest(func, start, transform) {
1434        start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1435        return function() {
1436            var args = arguments,
1437                index = -1,
1438                length = nativeMax(args.length - start, 0),
1439                array = Array(length);
1440
1441            while (++index < length) {
1442                array[index] = args[start + index];
1443            }
1444            index = -1;
1445            var otherArgs = Array(start + 1);
1446            while (++index < start) {
1447                otherArgs[index] = args[index];
1448            }
1449            otherArgs[start] = transform(array);
1450            return func.apply(this, otherArgs);
1451        };
1452    }
1453
1454    /**
1455     * Sets the `toString` method of `func` to return `string`.
1456     *
1457     * @private
1458     * @param {Function} func The function to modify.
1459     * @param {Function} string The `toString` result.
1460     * @returns {Function} Returns `func`.
1461     */
1462    var setToString = identity;
1463
1464    /*------------------------------------------------------------------------*/
1465
1466    /**
1467     * Creates an array with all falsey values removed. The values `false`, `null`,
1468     * `0`, `""`, `undefined`, and `NaN` are falsey.
1469     *
1470     * @static
1471     * @memberOf _
1472     * @since 0.1.0
1473     * @category Array
1474     * @param {Array} array The array to compact.
1475     * @returns {Array} Returns the new array of filtered values.
1476     * @example
1477     *
1478     * _.compact([0, 1, false, 2, '', 3]);
1479     * // => [1, 2, 3]
1480     */
1481    function compact(array) {
1482        return baseFilter(array, Boolean);
1483    }
1484
1485    /**
1486     * Creates a new array concatenating `array` with any additional arrays
1487     * and/or values.
1488     *
1489     * @static
1490     * @memberOf _
1491     * @since 4.0.0
1492     * @category Array
1493     * @param {Array} array The array to concatenate.
1494     * @param {...*} [values] The values to concatenate.
1495     * @returns {Array} Returns the new concatenated array.
1496     * @example
1497     *
1498     * var array = [1];
1499     * var other = _.concat(array, 2, [3], [[4]]);
1500     *
1501     * console.log(other);
1502     * // => [1, 2, 3, [4]]
1503     *
1504     * console.log(array);
1505     * // => [1]
1506     */
1507    function concat() {
1508        var length = arguments.length;
1509        if (!length) {
1510            return [];
1511        }
1512        var args = Array(length - 1),
1513            array = arguments[0],
1514            index = length;
1515
1516        while (index--) {
1517            args[index - 1] = arguments[index];
1518        }
1519        return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
1520    }
1521
1522    /**
1523     * This method is like `_.find` except that it returns the index of the first
1524     * element `predicate` returns truthy for instead of the element itself.
1525     *
1526     * @static
1527     * @memberOf _
1528     * @since 1.1.0
1529     * @category Array
1530     * @param {Array} array The array to inspect.
1531     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1532     * @param {number} [fromIndex=0] The index to search from.
1533     * @returns {number} Returns the index of the found element, else `-1`.
1534     * @example
1535     *
1536     * var users = [
1537     *   { 'user': 'barney',  'active': false },
1538     *   { 'user': 'fred',    'active': false },
1539     *   { 'user': 'pebbles', 'active': true }
1540     * ];
1541     *
1542     * _.findIndex(users, function(o) { return o.user == 'barney'; });
1543     * // => 0
1544     *
1545     * // The `_.matches` iteratee shorthand.
1546     * _.findIndex(users, { 'user': 'fred', 'active': false });
1547     * // => 1
1548     *
1549     * // The `_.matchesProperty` iteratee shorthand.
1550     * _.findIndex(users, ['active', false]);
1551     * // => 0
1552     *
1553     * // The `_.property` iteratee shorthand.
1554     * _.findIndex(users, 'active');
1555     * // => 2
1556     */
1557    function findIndex(array, predicate, fromIndex) {
1558        var length = array == null ? 0 : array.length;
1559        if (!length) {
1560            return -1;
1561        }
1562        var index = fromIndex == null ? 0 : toInteger(fromIndex);
1563        if (index < 0) {
1564            index = nativeMax(length + index, 0);
1565        }
1566        return baseFindIndex(array, baseIteratee(predicate, 3), index);
1567    }
1568
1569    /**
1570     * Flattens `array` a single level deep.
1571     *
1572     * @static
1573     * @memberOf _
1574     * @since 0.1.0
1575     * @category Array
1576     * @param {Array} array The array to flatten.
1577     * @returns {Array} Returns the new flattened array.
1578     * @example
1579     *
1580     * _.flatten([1, [2, [3, [4]], 5]]);
1581     * // => [1, 2, [3, [4]], 5]
1582     */
1583    function flatten(array) {
1584        var length = array == null ? 0 : array.length;
1585        return length ? baseFlatten(array, 1) : [];
1586    }
1587
1588    /**
1589     * Recursively flattens `array`.
1590     *
1591     * @static
1592     * @memberOf _
1593     * @since 3.0.0
1594     * @category Array
1595     * @param {Array} array The array to flatten.
1596     * @returns {Array} Returns the new flattened array.
1597     * @example
1598     *
1599     * _.flattenDeep([1, [2, [3, [4]], 5]]);
1600     * // => [1, 2, 3, 4, 5]
1601     */
1602    function flattenDeep(array) {
1603        var length = array == null ? 0 : array.length;
1604        return length ? baseFlatten(array, INFINITY) : [];
1605    }
1606
1607    /**
1608     * Gets the first element of `array`.
1609     *
1610     * @static
1611     * @memberOf _
1612     * @since 0.1.0
1613     * @alias first
1614     * @category Array
1615     * @param {Array} array The array to query.
1616     * @returns {*} Returns the first element of `array`.
1617     * @example
1618     *
1619     * _.head([1, 2, 3]);
1620     * // => 1
1621     *
1622     * _.head([]);
1623     * // => undefined
1624     */
1625    function head(array) {
1626        return (array && array.length) ? array[0] : undefined;
1627    }
1628
1629    /**
1630     * Gets the index at which the first occurrence of `value` is found in `array`
1631     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1632     * for equality comparisons. If `fromIndex` is negative, it's used as the
1633     * offset from the end of `array`.
1634     *
1635     * @static
1636     * @memberOf _
1637     * @since 0.1.0
1638     * @category Array
1639     * @param {Array} array The array to inspect.
1640     * @param {*} value The value to search for.
1641     * @param {number} [fromIndex=0] The index to search from.
1642     * @returns {number} Returns the index of the matched value, else `-1`.
1643     * @example
1644     *
1645     * _.indexOf([1, 2, 1, 2], 2);
1646     * // => 1
1647     *
1648     * // Search from the `fromIndex`.
1649     * _.indexOf([1, 2, 1, 2], 2, 2);
1650     * // => 3
1651     */
1652    function indexOf(array, value, fromIndex) {
1653        var length = array == null ? 0 : array.length;
1654        if (typeof fromIndex == 'number') {
1655            fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
1656        } else {
1657            fromIndex = 0;
1658        }
1659        var index = (fromIndex || 0) - 1,
1660            isReflexive = value === value;
1661
1662        while (++index < length) {
1663            var other = array[index];
1664            if ((isReflexive ? other === value : other !== other)) {
1665                return index;
1666            }
1667        }
1668        return -1;
1669    }
1670
1671    /**
1672     * Gets the last element of `array`.
1673     *
1674     * @static
1675     * @memberOf _
1676     * @since 0.1.0
1677     * @category Array
1678     * @param {Array} array The array to query.
1679     * @returns {*} Returns the last element of `array`.
1680     * @example
1681     *
1682     * _.last([1, 2, 3]);
1683     * // => 3
1684     */
1685    function last(array) {
1686        var length = array == null ? 0 : array.length;
1687        return length ? array[length - 1] : undefined;
1688    }
1689
1690    /**
1691     * Creates a slice of `array` from `start` up to, but not including, `end`.
1692     *
1693     * **Note:** This method is used instead of
1694     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
1695     * returned.
1696     *
1697     * @static
1698     * @memberOf _
1699     * @since 3.0.0
1700     * @category Array
1701     * @param {Array} array The array to slice.
1702     * @param {number} [start=0] The start position.
1703     * @param {number} [end=array.length] The end position.
1704     * @returns {Array} Returns the slice of `array`.
1705     */
1706    function slice(array, start, end) {
1707        var length = array == null ? 0 : array.length;
1708        start = start == null ? 0 : +start;
1709        end = end === undefined ? length : +end;
1710        return length ? baseSlice(array, start, end) : [];
1711    }
1712
1713    /*------------------------------------------------------------------------*/
1714
1715    /**
1716     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
1717     * chain sequences enabled. The result of such sequences must be unwrapped
1718     * with `_#value`.
1719     *
1720     * @static
1721     * @memberOf _
1722     * @since 1.3.0
1723     * @category Seq
1724     * @param {*} value The value to wrap.
1725     * @returns {Object} Returns the new `lodash` wrapper instance.
1726     * @example
1727     *
1728     * var users = [
1729     *   { 'user': 'barney',  'age': 36 },
1730     *   { 'user': 'fred',    'age': 40 },
1731     *   { 'user': 'pebbles', 'age': 1 }
1732     * ];
1733     *
1734     * var youngest = _
1735     *   .chain(users)
1736     *   .sortBy('age')
1737     *   .map(function(o) {
1738     *     return o.user + ' is ' + o.age;
1739     *   })
1740     *   .head()
1741     *   .value();
1742     * // => 'pebbles is 1'
1743     */
1744    function chain(value) {
1745        var result = lodash(value);
1746        result.__chain__ = true;
1747        return result;
1748    }
1749
1750    /**
1751     * This method invokes `interceptor` and returns `value`. The interceptor
1752     * is invoked with one argument; (value). The purpose of this method is to
1753     * "tap into" a method chain sequence in order to modify intermediate results.
1754     *
1755     * @static
1756     * @memberOf _
1757     * @since 0.1.0
1758     * @category Seq
1759     * @param {*} value The value to provide to `interceptor`.
1760     * @param {Function} interceptor The function to invoke.
1761     * @returns {*} Returns `value`.
1762     * @example
1763     *
1764     * _([1, 2, 3])
1765     *  .tap(function(array) {
1766     *    // Mutate input array.
1767     *    array.pop();
1768     *  })
1769     *  .reverse()
1770     *  .value();
1771     * // => [2, 1]
1772     */
1773    function tap(value, interceptor) {
1774        interceptor(value);
1775        return value;
1776    }
1777
1778    /**
1779     * This method is like `_.tap` except that it returns the result of `interceptor`.
1780     * The purpose of this method is to "pass thru" values replacing intermediate
1781     * results in a method chain sequence.
1782     *
1783     * @static
1784     * @memberOf _
1785     * @since 3.0.0
1786     * @category Seq
1787     * @param {*} value The value to provide to `interceptor`.
1788     * @param {Function} interceptor The function to invoke.
1789     * @returns {*} Returns the result of `interceptor`.
1790     * @example
1791     *
1792     * _('  abc  ')
1793     *  .chain()
1794     *  .trim()
1795     *  .thru(function(value) {
1796     *    return [value];
1797     *  })
1798     *  .value();
1799     * // => ['abc']
1800     */
1801    function thru(value, interceptor) {
1802        return interceptor(value);
1803    }
1804
1805    /**
1806     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
1807     *
1808     * @name chain
1809     * @memberOf _
1810     * @since 0.1.0
1811     * @category Seq
1812     * @returns {Object} Returns the new `lodash` wrapper instance.
1813     * @example
1814     *
1815     * var users = [
1816     *   { 'user': 'barney', 'age': 36 },
1817     *   { 'user': 'fred',   'age': 40 }
1818     * ];
1819     *
1820     * // A sequence without explicit chaining.
1821     * _(users).head();
1822     * // => { 'user': 'barney', 'age': 36 }
1823     *
1824     * // A sequence with explicit chaining.
1825     * _(users)
1826     *   .chain()
1827     *   .head()
1828     *   .pick('user')
1829     *   .value();
1830     * // => { 'user': 'barney' }
1831     */
1832    function wrapperChain() {
1833        return chain(this);
1834    }
1835
1836    /**
1837     * Executes the chain sequence to resolve the unwrapped value.
1838     *
1839     * @name value
1840     * @memberOf _
1841     * @since 0.1.0
1842     * @alias toJSON, valueOf
1843     * @category Seq
1844     * @returns {*} Returns the resolved unwrapped value.
1845     * @example
1846     *
1847     * _([1, 2, 3]).value();
1848     * // => [1, 2, 3]
1849     */
1850    function wrapperValue() {
1851        return baseWrapperValue(this.__wrapped__, this.__actions__);
1852    }
1853
1854    /*------------------------------------------------------------------------*/
1855
1856    /**
1857     * Checks if `predicate` returns truthy for **all** elements of `collection`.
1858     * Iteration is stopped once `predicate` returns falsey. The predicate is
1859     * invoked with three arguments: (value, index|key, collection).
1860     *
1861     * **Note:** This method returns `true` for
1862     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
1863     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
1864     * elements of empty collections.
1865     *
1866     * @static
1867     * @memberOf _
1868     * @since 0.1.0
1869     * @category Collection
1870     * @param {Array|Object} collection The collection to iterate over.
1871     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1872     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
1873     * @returns {boolean} Returns `true` if all elements pass the predicate check,
1874     *  else `false`.
1875     * @example
1876     *
1877     * _.every([true, 1, null, 'yes'], Boolean);
1878     * // => false
1879     *
1880     * var users = [
1881     *   { 'user': 'barney', 'age': 36, 'active': false },
1882     *   { 'user': 'fred',   'age': 40, 'active': false }
1883     * ];
1884     *
1885     * // The `_.matches` iteratee shorthand.
1886     * _.every(users, { 'user': 'barney', 'active': false });
1887     * // => false
1888     *
1889     * // The `_.matchesProperty` iteratee shorthand.
1890     * _.every(users, ['active', false]);
1891     * // => true
1892     *
1893     * // The `_.property` iteratee shorthand.
1894     * _.every(users, 'active');
1895     * // => false
1896     */
1897    function every(collection, predicate, guard) {
1898        predicate = guard ? undefined : predicate;
1899        return baseEvery(collection, baseIteratee(predicate));
1900    }
1901
1902    /**
1903     * Iterates over elements of `collection`, returning an array of all elements
1904     * `predicate` returns truthy for. The predicate is invoked with three
1905     * arguments: (value, index|key, collection).
1906     *
1907     * **Note:** Unlike `_.remove`, this method returns a new array.
1908     *
1909     * @static
1910     * @memberOf _
1911     * @since 0.1.0
1912     * @category Collection
1913     * @param {Array|Object} collection The collection to iterate over.
1914     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1915     * @returns {Array} Returns the new filtered array.
1916     * @see _.reject
1917     * @example
1918     *
1919     * var users = [
1920     *   { 'user': 'barney', 'age': 36, 'active': true },
1921     *   { 'user': 'fred',   'age': 40, 'active': false }
1922     * ];
1923     *
1924     * _.filter(users, function(o) { return !o.active; });
1925     * // => objects for ['fred']
1926     *
1927     * // The `_.matches` iteratee shorthand.
1928     * _.filter(users, { 'age': 36, 'active': true });
1929     * // => objects for ['barney']
1930     *
1931     * // The `_.matchesProperty` iteratee shorthand.
1932     * _.filter(users, ['active', false]);
1933     * // => objects for ['fred']
1934     *
1935     * // The `_.property` iteratee shorthand.
1936     * _.filter(users, 'active');
1937     * // => objects for ['barney']
1938     */
1939    function filter(collection, predicate) {
1940        return baseFilter(collection, baseIteratee(predicate));
1941    }
1942
1943    /**
1944     * Iterates over elements of `collection`, returning the first element
1945     * `predicate` returns truthy for. The predicate is invoked with three
1946     * arguments: (value, index|key, collection).
1947     *
1948     * @static
1949     * @memberOf _
1950     * @since 0.1.0
1951     * @category Collection
1952     * @param {Array|Object} collection The collection to inspect.
1953     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1954     * @param {number} [fromIndex=0] The index to search from.
1955     * @returns {*} Returns the matched element, else `undefined`.
1956     * @example
1957     *
1958     * var users = [
1959     *   { 'user': 'barney',  'age': 36, 'active': true },
1960     *   { 'user': 'fred',    'age': 40, 'active': false },
1961     *   { 'user': 'pebbles', 'age': 1,  'active': true }
1962     * ];
1963     *
1964     * _.find(users, function(o) { return o.age < 40; });
1965     * // => object for 'barney'
1966     *
1967     * // The `_.matches` iteratee shorthand.
1968     * _.find(users, { 'age': 1, 'active': true });
1969     * // => object for 'pebbles'
1970     *
1971     * // The `_.matchesProperty` iteratee shorthand.
1972     * _.find(users, ['active', false]);
1973     * // => object for 'fred'
1974     *
1975     * // The `_.property` iteratee shorthand.
1976     * _.find(users, 'active');
1977     * // => object for 'barney'
1978     */
1979    var find = createFind(findIndex);
1980
1981    /**
1982     * Iterates over elements of `collection` and invokes `iteratee` for each element.
1983     * The iteratee is invoked with three arguments: (value, index|key, collection).
1984     * Iteratee functions may exit iteration early by explicitly returning `false`.
1985     *
1986     * **Note:** As with other "Collections" methods, objects with a "length"
1987     * property are iterated like arrays. To avoid this behavior use `_.forIn`
1988     * or `_.forOwn` for object iteration.
1989     *
1990     * @static
1991     * @memberOf _
1992     * @since 0.1.0
1993     * @alias each
1994     * @category Collection
1995     * @param {Array|Object} collection The collection to iterate over.
1996     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
1997     * @returns {Array|Object} Returns `collection`.
1998     * @see _.forEachRight
1999     * @example
2000     *
2001     * _.forEach([1, 2], function(value) {
2002     *   console.log(value);
2003     * });
2004     * // => Logs `1` then `2`.
2005     *
2006     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
2007     *   console.log(key);
2008     * });
2009     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
2010     */
2011    function forEach(collection, iteratee) {
2012        return baseEach(collection, baseIteratee(iteratee));
2013    }
2014
2015    /**
2016     * Creates an array of values by running each element in `collection` thru
2017     * `iteratee`. The iteratee is invoked with three arguments:
2018     * (value, index|key, collection).
2019     *
2020     * Many lodash methods are guarded to work as iteratees for methods like
2021     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
2022     *
2023     * The guarded methods are:
2024     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
2025     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
2026     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
2027     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
2028     *
2029     * @static
2030     * @memberOf _
2031     * @since 0.1.0
2032     * @category Collection
2033     * @param {Array|Object} collection The collection to iterate over.
2034     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2035     * @returns {Array} Returns the new mapped array.
2036     * @example
2037     *
2038     * function square(n) {
2039     *   return n * n;
2040     * }
2041     *
2042     * _.map([4, 8], square);
2043     * // => [16, 64]
2044     *
2045     * _.map({ 'a': 4, 'b': 8 }, square);
2046     * // => [16, 64] (iteration order is not guaranteed)
2047     *
2048     * var users = [
2049     *   { 'user': 'barney' },
2050     *   { 'user': 'fred' }
2051     * ];
2052     *
2053     * // The `_.property` iteratee shorthand.
2054     * _.map(users, 'user');
2055     * // => ['barney', 'fred']
2056     */
2057    function map(collection, iteratee) {
2058        return baseMap(collection, baseIteratee(iteratee));
2059    }
2060
2061    /**
2062     * Reduces `collection` to a value which is the accumulated result of running
2063     * each element in `collection` thru `iteratee`, where each successive
2064     * invocation is supplied the return value of the previous. If `accumulator`
2065     * is not given, the first element of `collection` is used as the initial
2066     * value. The iteratee is invoked with four arguments:
2067     * (accumulator, value, index|key, collection).
2068     *
2069     * Many lodash methods are guarded to work as iteratees for methods like
2070     * `_.reduce`, `_.reduceRight`, and `_.transform`.
2071     *
2072     * The guarded methods are:
2073     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
2074     * and `sortBy`
2075     *
2076     * @static
2077     * @memberOf _
2078     * @since 0.1.0
2079     * @category Collection
2080     * @param {Array|Object} collection The collection to iterate over.
2081     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2082     * @param {*} [accumulator] The initial value.
2083     * @returns {*} Returns the accumulated value.
2084     * @see _.reduceRight
2085     * @example
2086     *
2087     * _.reduce([1, 2], function(sum, n) {
2088     *   return sum + n;
2089     * }, 0);
2090     * // => 3
2091     *
2092     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
2093     *   (result[value] || (result[value] = [])).push(key);
2094     *   return result;
2095     * }, {});
2096     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
2097     */
2098    function reduce(collection, iteratee, accumulator) {
2099        return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
2100    }
2101
2102    /**
2103     * Gets the size of `collection` by returning its length for array-like
2104     * values or the number of own enumerable string keyed properties for objects.
2105     *
2106     * @static
2107     * @memberOf _
2108     * @since 0.1.0
2109     * @category Collection
2110     * @param {Array|Object|string} collection The collection to inspect.
2111     * @returns {number} Returns the collection size.
2112     * @example
2113     *
2114     * _.size([1, 2, 3]);
2115     * // => 3
2116     *
2117     * _.size({ 'a': 1, 'b': 2 });
2118     * // => 2
2119     *
2120     * _.size('pebbles');
2121     * // => 7
2122     */
2123    function size(collection) {
2124        if (collection == null) {
2125            return 0;
2126        }
2127        collection = isArrayLike(collection) ? collection : nativeKeys(collection);
2128        return collection.length;
2129    }
2130
2131    /**
2132     * Checks if `predicate` returns truthy for **any** element of `collection`.
2133     * Iteration is stopped once `predicate` returns truthy. The predicate is
2134     * invoked with three arguments: (value, index|key, collection).
2135     *
2136     * @static
2137     * @memberOf _
2138     * @since 0.1.0
2139     * @category Collection
2140     * @param {Array|Object} collection The collection to iterate over.
2141     * @param {Function} [predicate=_.identity] The function invoked per iteration.
2142     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
2143     * @returns {boolean} Returns `true` if any element passes the predicate check,
2144     *  else `false`.
2145     * @example
2146     *
2147     * _.some([null, 0, 'yes', false], Boolean);
2148     * // => true
2149     *
2150     * var users = [
2151     *   { 'user': 'barney', 'active': true },
2152     *   { 'user': 'fred',   'active': false }
2153     * ];
2154     *
2155     * // The `_.matches` iteratee shorthand.
2156     * _.some(users, { 'user': 'barney', 'active': false });
2157     * // => false
2158     *
2159     * // The `_.matchesProperty` iteratee shorthand.
2160     * _.some(users, ['active', false]);
2161     * // => true
2162     *
2163     * // The `_.property` iteratee shorthand.
2164     * _.some(users, 'active');
2165     * // => true
2166     */
2167    function some(collection, predicate, guard) {
2168        predicate = guard ? undefined : predicate;
2169        return baseSome(collection, baseIteratee(predicate));
2170    }
2171
2172    /**
2173     * Creates an array of elements, sorted in ascending order by the results of
2174     * running each element in a collection thru each iteratee. This method
2175     * performs a stable sort, that is, it preserves the original sort order of
2176     * equal elements. The iteratees are invoked with one argument: (value).
2177     *
2178     * @static
2179     * @memberOf _
2180     * @since 0.1.0
2181     * @category Collection
2182     * @param {Array|Object} collection The collection to iterate over.
2183     * @param {...(Function|Function[])} [iteratees=[_.identity]]
2184     *  The iteratees to sort by.
2185     * @returns {Array} Returns the new sorted array.
2186     * @example
2187     *
2188     * var users = [
2189     *   { 'user': 'fred',   'age': 48 },
2190     *   { 'user': 'barney', 'age': 36 },
2191     *   { 'user': 'fred',   'age': 40 },
2192     *   { 'user': 'barney', 'age': 34 }
2193     * ];
2194     *
2195     * _.sortBy(users, [function(o) { return o.user; }]);
2196     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
2197     *
2198     * _.sortBy(users, ['user', 'age']);
2199     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
2200     */
2201    function sortBy(collection, iteratee) {
2202        var index = 0;
2203        iteratee = baseIteratee(iteratee);
2204
2205        return baseMap(baseMap(collection, function(value, key, collection) {
2206            return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
2207        }).sort(function(object, other) {
2208            return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
2209        }), baseProperty('value'));
2210    }
2211
2212    /*------------------------------------------------------------------------*/
2213
2214    /**
2215     * Creates a function that invokes `func`, with the `this` binding and arguments
2216     * of the created function, while it's called less than `n` times. Subsequent
2217     * calls to the created function return the result of the last `func` invocation.
2218     *
2219     * @static
2220     * @memberOf _
2221     * @since 3.0.0
2222     * @category Function
2223     * @param {number} n The number of calls at which `func` is no longer invoked.
2224     * @param {Function} func The function to restrict.
2225     * @returns {Function} Returns the new restricted function.
2226     * @example
2227     *
2228     * jQuery(element).on('click', _.before(5, addContactToList));
2229     * // => Allows adding up to 4 contacts to the list.
2230     */
2231    function before(n, func) {
2232        var result;
2233        if (typeof func != 'function') {
2234            throw new TypeError(FUNC_ERROR_TEXT);
2235        }
2236        n = toInteger(n);
2237        return function() {
2238            if (--n > 0) {
2239                result = func.apply(this, arguments);
2240            }
2241            if (n <= 1) {
2242                func = undefined;
2243            }
2244            return result;
2245        };
2246    }
2247
2248    /**
2249     * Creates a function that invokes `func` with the `this` binding of `thisArg`
2250     * and `partials` prepended to the arguments it receives.
2251     *
2252     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
2253     * may be used as a placeholder for partially applied arguments.
2254     *
2255     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
2256     * property of bound functions.
2257     *
2258     * @static
2259     * @memberOf _
2260     * @since 0.1.0
2261     * @category Function
2262     * @param {Function} func The function to bind.
2263     * @param {*} thisArg The `this` binding of `func`.
2264     * @param {...*} [partials] The arguments to be partially applied.
2265     * @returns {Function} Returns the new bound function.
2266     * @example
2267     *
2268     * function greet(greeting, punctuation) {
2269     *   return greeting + ' ' + this.user + punctuation;
2270     * }
2271     *
2272     * var object = { 'user': 'fred' };
2273     *
2274     * var bound = _.bind(greet, object, 'hi');
2275     * bound('!');
2276     * // => 'hi fred!'
2277     *
2278     * // Bound with placeholders.
2279     * var bound = _.bind(greet, object, _, '!');
2280     * bound('hi');
2281     * // => 'hi fred!'
2282     */
2283    var bind = baseRest(function(func, thisArg, partials) {
2284        return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
2285    });
2286
2287    /**
2288     * Defers invoking the `func` until the current call stack has cleared. Any
2289     * additional arguments are provided to `func` when it's invoked.
2290     *
2291     * @static
2292     * @memberOf _
2293     * @since 0.1.0
2294     * @category Function
2295     * @param {Function} func The function to defer.
2296     * @param {...*} [args] The arguments to invoke `func` with.
2297     * @returns {number} Returns the timer id.
2298     * @example
2299     *
2300     * _.defer(function(text) {
2301     *   console.log(text);
2302     * }, 'deferred');
2303     * // => Logs 'deferred' after one millisecond.
2304     */
2305    var defer = baseRest(function(func, args) {
2306        return baseDelay(func, 1, args);
2307    });
2308
2309    /**
2310     * Invokes `func` after `wait` milliseconds. Any additional arguments are
2311     * provided to `func` when it's invoked.
2312     *
2313     * @static
2314     * @memberOf _
2315     * @since 0.1.0
2316     * @category Function
2317     * @param {Function} func The function to delay.
2318     * @param {number} wait The number of milliseconds to delay invocation.
2319     * @param {...*} [args] The arguments to invoke `func` with.
2320     * @returns {number} Returns the timer id.
2321     * @example
2322     *
2323     * _.delay(function(text) {
2324     *   console.log(text);
2325     * }, 1000, 'later');
2326     * // => Logs 'later' after one second.
2327     */
vendor: 7,095 bytes, lines 2328-2576
2328    var delay = baseRest(function(func, wait, args) {
2329        return baseDelay(func, toNumber(wait) || 0, args);
2330    });
2331
2332    /**
2333     * Creates a function that negates the result of the predicate `func`. The
2334     * `func` predicate is invoked with the `this` binding and arguments of the
2335     * created function.
2336     *
2337     * @static
2338     * @memberOf _
2339     * @since 3.0.0
2340     * @category Function
2341     * @param {Function} predicate The predicate to negate.
2342     * @returns {Function} Returns the new negated function.
2343     * @example
2344     *
2345     * function isEven(n) {
2346     *   return n % 2 == 0;
2347     * }
2348     *
2349     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
2350     * // => [1, 3, 5]
2351     */
2352    function negate(predicate) {
2353        if (typeof predicate != 'function') {
2354            throw new TypeError(FUNC_ERROR_TEXT);
2355        }
2356        return function() {
2357            var args = arguments;
2358            return !predicate.apply(this, args);
2359        };
2360    }
2361
2362    /**
2363     * Creates a function that is restricted to invoking `func` once. Repeat calls
2364     * to the function return the value of the first invocation. The `func` is
2365     * invoked with the `this` binding and arguments of the created function.
2366     *
2367     * @static
2368     * @memberOf _
2369     * @since 0.1.0
2370     * @category Function
2371     * @param {Function} func The function to restrict.
2372     * @returns {Function} Returns the new restricted function.
2373     * @example
2374     *
2375     * var initialize = _.once(createApplication);
2376     * initialize();
2377     * initialize();
2378     * // => `createApplication` is invoked once
2379     */
2380    function once(func) {
2381        return before(2, func);
2382    }
2383
2384    /*------------------------------------------------------------------------*/
2385
2386    /**
2387     * Creates a shallow clone of `value`.
2388     *
2389     * **Note:** This method is loosely based on the
2390     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
2391     * and supports cloning arrays, array buffers, booleans, date objects, maps,
2392     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
2393     * arrays. The own enumerable properties of `arguments` objects are cloned
2394     * as plain objects. An empty object is returned for uncloneable values such
2395     * as error objects, functions, DOM nodes, and WeakMaps.
2396     *
2397     * @static
2398     * @memberOf _
2399     * @since 0.1.0
2400     * @category Lang
2401     * @param {*} value The value to clone.
2402     * @returns {*} Returns the cloned value.
2403     * @see _.cloneDeep
2404     * @example
2405     *
2406     * var objects = [{ 'a': 1 }, { 'b': 2 }];
2407     *
2408     * var shallow = _.clone(objects);
2409     * console.log(shallow[0] === objects[0]);
2410     * // => true
2411     */
2412    function clone(value) {
2413        if (!isObject(value)) {
2414            return value;
2415        }
2416        return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
2417    }
2418
2419    /**
2420     * Performs a
2421     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2422     * comparison between two values to determine if they are equivalent.
2423     *
2424     * @static
2425     * @memberOf _
2426     * @since 4.0.0
2427     * @category Lang
2428     * @param {*} value The value to compare.
2429     * @param {*} other The other value to compare.
2430     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2431     * @example
2432     *
2433     * var object = { 'a': 1 };
2434     * var other = { 'a': 1 };
2435     *
2436     * _.eq(object, object);
2437     * // => true
2438     *
2439     * _.eq(object, other);
2440     * // => false
2441     *
2442     * _.eq('a', 'a');
2443     * // => true
2444     *
2445     * _.eq('a', Object('a'));
2446     * // => false
2447     *
2448     * _.eq(NaN, NaN);
2449     * // => true
2450     */
2451    function eq(value, other) {
2452        return value === other || (value !== value && other !== other);
2453    }
2454
2455    /**
2456     * Checks if `value` is likely an `arguments` object.
2457     *
2458     * @static
2459     * @memberOf _
2460     * @since 0.1.0
2461     * @category Lang
2462     * @param {*} value The value to check.
2463     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2464     *  else `false`.
2465     * @example
2466     *
2467     * _.isArguments(function() { return arguments; }());
2468     * // => true
2469     *
2470     * _.isArguments([1, 2, 3]);
2471     * // => false
2472     */
2473    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2474        return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2475            !propertyIsEnumerable.call(value, 'callee');
2476    };
2477
2478    /**
2479     * Checks if `value` is classified as an `Array` object.
2480     *
2481     * @static
2482     * @memberOf _
2483     * @since 0.1.0
2484     * @category Lang
2485     * @param {*} value The value to check.
2486     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
2487     * @example
2488     *
2489     * _.isArray([1, 2, 3]);
2490     * // => true
2491     *
2492     * _.isArray(document.body.children);
2493     * // => false
2494     *
2495     * _.isArray('abc');
2496     * // => false
2497     *
2498     * _.isArray(_.noop);
2499     * // => false
2500     */
2501    var isArray = Array.isArray;
2502
2503    /**
2504     * Checks if `value` is array-like. A value is considered array-like if it's
2505     * not a function and has a `value.length` that's an integer greater than or
2506     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2507     *
2508     * @static
2509     * @memberOf _
2510     * @since 4.0.0
2511     * @category Lang
2512     * @param {*} value The value to check.
2513     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2514     * @example
2515     *
2516     * _.isArrayLike([1, 2, 3]);
2517     * // => true
2518     *
2519     * _.isArrayLike(document.body.children);
2520     * // => true
2521     *
2522     * _.isArrayLike('abc');
2523     * // => true
2524     *
2525     * _.isArrayLike(_.noop);
2526     * // => false
2527     */
2528    function isArrayLike(value) {
2529        return value != null && isLength(value.length) && !isFunction(value);
2530    }
2531
2532    /**
2533     * Checks if `value` is classified as a boolean primitive or object.
2534     *
2535     * @static
2536     * @memberOf _
2537     * @since 0.1.0
2538     * @category Lang
2539     * @param {*} value The value to check.
2540     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
2541     * @example
2542     *
2543     * _.isBoolean(false);
2544     * // => true
2545     *
2546     * _.isBoolean(null);
2547     * // => false
2548     */
2549    function isBoolean(value) {
2550        return value === true || value === false ||
2551            (isObjectLike(value) && baseGetTag(value) == boolTag);
2552    }
2553
2554    /**
2555     * Checks if `value` is classified as a `Date` object.
2556     *
2557     * @static
2558     * @memberOf _
2559     * @since 0.1.0
2560     * @category Lang
2561     * @param {*} value The value to check.
2562     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
2563     * @example
2564     *
2565     * _.isDate(new Date);
2566     * // => true
2567     *
2568     * _.isDate('Mon April 23 2012');
2569     * // => false
2570     */
2571    var isDate = baseIsDate;
2572
2573    /**
2574     * Checks if `value` is an empty object, collection, map, or set.
2575     *
2576     * Objects are considered empty if they have no own enumerable str
2576ing keyed
2577     * properties.
2578     *
2579     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
2580     * jQuery-like collections are considered empty if they have a `length` of `0`.
2581     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
2582     *
2583     * @static
2584     * @memberOf _
2585     * @since 0.1.0
2586     * @category Lang
2587     * @param {*} value The value to check.
2588     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
2589     * @example
2590     *
2591     * _.isEmpty(null);
2592     * // => true
2593     *
2594     * _.isEmpty(true);
2595     * // => true
2596     *
2597     * _.isEmpty(1);
2598     * // => true
2599     *
2600     * _.isEmpty([1, 2, 3]);
2601     * // => false
2602     *
2603     * _.isEmpty({ 'a': 1 });
2604     * // => false
2605     */
2606    function isEmpty(value) {
2607        if (isArrayLike(value) &&
2608            (isArray(value) || isString(value) ||
2609                isFunction(value.splice) || isArguments(value))) {
2610            return !value.length;
2611        }
2612        return !nativeKeys(value).length;
2613    }
2614
2615    /**
2616     * Performs a deep comparison between two values to determine if they are
2617     * equivalent.
2618     *
2619     * **Note:** This method supports comparing arrays, array buffers, booleans,
2620     * date objects, error objects, maps, numbers, `Object` objects, regexes,
2621     * sets, strings, symbols, and typed arrays. `Object` objects are compared
2622     * by their own, not inherited, enumerable properties. Functions and DOM
2623     * nodes are compared by strict equality, i.e. `===`.
2624     *
2625     * @static
2626     * @memberOf _
2627     * @since 0.1.0
2628     * @category Lang
2629     * @param {*} value The value to compare.
2630     * @param {*} other The other value to compare.
2631     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2632     * @example
2633     *
2634     * var object = { 'a': 1 };
2635     * var other = { 'a': 1 };
2636     *
2637     * _.isEqual(object, other);
2638     * // => true
2639     *
2640     * object === other;
2641     * // => false
2642     */
2643    function isEqual(value, other) {
2644        return baseIsEqual(value, other);
2645    }
2646
2647    /**
2648     * Checks if `value` is a finite primitive number.
2649     *
2650     * **Note:** This method is based on
2651     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
2652     *
2653     * @static
2654     * @memberOf _
2655     * @since 0.1.0
2656     * @category Lang
2657     * @param {*} value The value to check.
2658     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
2659     * @example
2660     *
2661     * _.isFinite(3);
2662     * // => true
2663     *
2664     * _.isFinite(Number.MIN_VALUE);
2665     * // => true
2666     *
2667     * _.isFinite(Infinity);
2668     * // => false
2669     *
2670     * _.isFinite('3');
2671     * // => false
2672     */
2673    function isFinite(value) {
2674        return typeof value == 'number' && nativeIsFinite(value);
2675    }
2676
2677    /**
2678     * Checks if `value` is classified as a `Function` object.
2679     *
2680     * @static
2681     * @memberOf _
2682     * @since 0.1.0
2683     * @category Lang
2684     * @param {*} value The value to check.
2685     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
2686     * @example
2687     *
2688     * _.isFunction(_);
2689     * // => true
2690     *
2691     * _.isFunction(/abc/);
2692     * // => false
2693     */
2694    function isFunction(value) {
2695        if (!isObject(value)) {
2696            return false;
2697        }
2698        // The use of `Object#toString` avoids issues with the `typeof` operator
2699        // in Safari 9 which returns 'object' for typed arrays and other constructors.
2700        var tag = baseGetTag(value);
2701        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
2702    }
2703
2704    /**
2705     * Checks if `value` is a valid array-like length.
2706     *
2707     * **Note:** This method is loosely based on
2708     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
2709     *
2710     * @static
2711     * @memberOf _
2712     * @since 4.0.0
2713     * @category Lang
2714     * @param {*} value The value to check.
2715     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
2716     * @example
2717     *
2718     * _.isLength(3);
2719     * // => true
2720     *
2721     * _.isLength(Number.MIN_VALUE);
2722     * // => false
2723     *
2724     * _.isLength(Infinity);
2725     * // => false
2726     *
2727     * _.isLength('3');
2728     * // => false
2729     */
2730    function isLength(value) {
2731        return typeof value == 'number' &&
2732            value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
2733    }
2734
2735    /**
2736     * Checks if `value` is the
2737     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
2738     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
2739     *
2740     * @static
2741     * @memberOf _
2742     * @since 0.1.0
2743     * @category Lang
2744     * @param {*} value The value to check.
2745     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
2746     * @example
2747     *
2748     * _.isObject({});
2749     * // => true
2750     *
2751     * _.isObject([1, 2, 3]);
2752     * // => true
2753     *
2754     * _.isObject(_.noop);
2755     * // => true
2756     *
2757     * _.isObject(null);
2758     * // => false
2759     */
2760    function isObject(value) {
2761        var type = typeof value;
2762        return value != null && (type == 'object' || type == 'function');
2763    }
2764
2765    /**
2766     * Checks if `value` is object-like. A value is object-like if it's not `null`
2767     * and has a `typeof` result of "object".
2768     *
2769     * @static
2770     * @memberOf _
2771     * @since 4.0.0
2772     * @category Lang
2773     * @param {*} value The value to check.
2774     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2775     * @example
2776     *
2777     * _.isObjectLike({});
2778     * // => true
2779     *
2780     * _.isObjectLike([1, 2, 3]);
2781     * // => true
2782     *
2783     * _.isObjectLike(_.noop);
2784     * // => false
2785     *
2786     * _.isObjectLike(null);
2787     * // => false
2788     */
2789    function isObjectLike(value) {
2790        return value != null && typeof value == 'object';
2791    }
2792
2793    /**
2794     * Checks if `value` is `NaN`.
2795     *
2796     * **Note:** This method is based on
2797     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
2798     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
2799     * `undefined` and other non-number values.
2800     *
2801     * @static
2802     * @memberOf _
2803     * @since 0.1.0
2804     * @category Lang
2805     * @param {*} value The value to check.
2806     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2807     * @example
2808     *
2809     * _.isNaN(NaN);
2810     * // => true
2811     *
2812     * _.isNaN(new Number(NaN));
2813     * // => true
2814     *
2815     * isNaN(undefined);
2816     * // => true
2817     *
2818     * _.isNaN(undefined);
2819     * // => false
2820     */
2821    function isNaN(value) {
2822        // An `NaN` primitive is the only value that is not equal to itself.
2823        // Perform the `toStringTag` check first to avoid errors with some
2824        // ActiveX objects in IE.
2825        return isNumber(value) && value != +value;
2826    }
2827
2828    /**
2829     * Checks if `value` is `null`.
2830     *
2831     * @static
2832     * @memberOf _
2833     * @since 0.1.0
2834     * @category Lang
2835     * @param {*} value The value to check.
2836     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
2837     * @example
2838     *
2839     * _.isNull(null);
2840     * // => true
2841     *
2842     * _.isNull(void 0);
2843     * // => false
2844     */
2845    function isNull(value) {
2846        return value === null;
2847    }
2848
2849    /**
2850     * Checks if `value` is classified as a `Number` primitive or object.
2851     *
2852     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
2853     * classified as numbers, use the `_.isFinite` method.
2854     *
2855     * @static
2856     * @memberOf _
2857     * @since 0.1.0
2858     * @category Lang
2859     * @param {*} value The value to check.
2860     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
2861     * @example
2862     *
2863     * _.isNumber(3);
2864     * // => true
2865     *
2866     * _.isNumber(Number.MIN_VALUE);
2867     * // => true
2868     *
2869     * _.isNumber(Infinity);
2870     * // => true
2871     *
2872     * _.isNumber('3');
2873     * // => false
2874     */
2875    function isNumber(value) {
2876        return typeof value == 'number' ||
2877            (isObjectLike(value) && baseGetTag(value) == numberTag);
2878    }
2879
2880    /**
2881     * Checks if `value` is classified as a `RegExp` object.
2882     *
2883     * @static
2884     * @memberOf _
2885     * @since 0.1.0
2886     * @category Lang
2887     * @param {*} value The value to check.
2888     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
2889     * @example
2890     *
2891     * _.isRegExp(/abc/);
2892     * // => true
2893     *
2894     * _.isRegExp('/abc/');
2895     * // => false
2896     */
2897    var isRegExp = baseIsRegExp;
2898
2899    /**
2900     * Checks if `value` is classified as a `String` primitive or object.
2901     *
2902     * @static
2903     * @since 0.1.0
2904     * @memberOf _
2905     * @category Lang
2906     * @param {*} value The value to check.
2907     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
2908     * @example
2909     *
2910     * _.isString('abc');
2911     * // => true
2912     *
2913     * _.isString(1);
2914     * // => false
2915     */
2916    function isString(value) {
2917        return typeof value == 'string' ||
2918            (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
2919    }
2920
2921    /**
2922     * Checks if `value` is `undefined`.
2923     *
2924     * @static
2925     * @since 0.1.0
2926     * @memberOf _
2927     * @category Lang
2928     * @param {*} value The value to check.
2929     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
2930     * @example
2931     *
2932     * _.isUndefined(void 0);
2933     * // => true
2934     *
2935     * _.isUndefined(null);
2936     * // => false
2937     */
2938    function isUndefined(value) {
2939        return value === undefined;
2940    }
2941
2942    /**
2943     * Converts `value` to an array.
2944     *
2945     * @static
2946     * @since 0.1.0
2947     * @memberOf _
2948     * @category Lang
2949     * @param {*} value The value to convert.
2950     * @returns {Array} Returns the converted array.
2951     * @example
2952     *
2953     * _.toArray({ 'a': 1, 'b': 2 });
2954     * // => [1, 2]
2955     *
2956     * _.toArray('abc');
2957     * // => ['a', 'b', 'c']
2958     *
2959     * _.toArray(1);
2960     * // => []
2961     *
2962     * _.toArray(null);
2963     * // => []
2964     */
2965    function toArray(value) {
2966        if (!isArrayLike(value)) {
2967            return values(value);
2968        }
2969        return value.length ? copyArray(value) : [];
2970    }
2971
2972    /**
2973     * Converts `value` to an integer.
2974     *
2975     * **Note:** This method is loosely based on
2976     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
2977     *
2978     * @static
2979     * @memberOf _
2980     * @since 4.0.0
2981     * @category Lang
2982     * @param {*} value The value to convert.
2983     * @returns {number} Returns the converted integer.
2984     * @example
2985     *
2986     * _.toInteger(3.2);
2987     * // => 3
2988     *
2989     * _.toInteger(Number.MIN_VALUE);
2990     * // => 0
2991     *
2992     * _.toInteger(Infinity);
2993     * // => 1.7976931348623157e+308
2994     *
2995     * _.toInteger('3.2');
2996     * // => 3
2997     */
2998    var toInteger = Number;
2999
3000    /**
3001     * Converts `value` to a number.
3002     *
3003     * @static
3004     * @memberOf _
3005     * @since 4.0.0
3006     * @category Lang
3007     * @param {*} value The value to process.
3008     * @returns {number} Returns the number.
3009     * @example
3010     *
3011     * _.toNumber(3.2);
3012     * // => 3.2
3013     *
3014     * _.toNumber(Number.MIN_VALUE);
3015     * // => 5e-324
3016     *
3017     * _.toNumber(Infinity);
3018     * // => Infinity
3019     *
3020     * _.toNumber('3.2');
3021     * // => 3.2
3022     */
3023    var toNumber = Number;
3024
3025    /**
3026     * Converts `value` to a string. An empty string is returned for `null`
3027     * and `undefined` values. The sign of `-0` is preserved.
3028     *
3029     * @static
3030     * @memberOf _
3031     * @since 4.0.0
3032     * @category Lang
3033     * @param {*} value The value to convert.
3034     * @returns {string} Returns the converted string.
3035     * @example
3036     *
3037     * _.toString(null);
3038     * // => ''
3039     *
3040     * _.toString(-0);
3041     * // => '-0'
3042     *
3043     * _.toString([1, 2, 3]);
3044     * // => '1,2,3'
3045     */
3046    function toString(value) {
3047        if (typeof value == 'string') {
3048            return value;
3049        }
3050        return value == null ? '' : (value + '');
3051    }
3052
3053    /*------------------------------------------------------------------------*/
3054
3055    /**
3056     * Assigns own enumerable string keyed properties of source objects to the
3057     * destination object. Source objects are applied from left to right.
3058     * Subsequent sources overwrite property assignments of previous sources.
3059     *
3060     * **Note:** This method mutates `object` and is loosely based on
3061     * [`Object.assign`](https://mdn.io/Object/assign).
3062     *
3063     * @static
3064     * @memberOf _
3065     * @since 0.10.0
3066     * @category Object
3067     * @param {Object} object The destination object.
3068     * @param {...Object} [sources] The source objects.
3069     * @returns {Object} Returns `object`.
3070     * @see _.assignIn
3071     * @example
3072     *
3073     * function Foo() {
3074     *   this.a = 1;
3075     * }
3076     *
3077     * function Bar() {
3078     *   this.c = 3;
3079     * }
3080     *
3081     * Foo.prototype.b = 2;
3082     * Bar.prototype.d = 4;
3083     *
3084     * _.assign({ 'a': 0 }, new Foo, new Bar);
3085     * // => { 'a': 1, 'c': 3 }
3086     */
3087    var assign = createAssigner(function(object, source) {
3088        copyObject(source, nativeKeys(source), object);
3089    });
3090
3091    /**
3092     * This method is like `_.assign` except that it iterates over own and
3093     * inherited source properties.
3094     *
3095     * **Note:** This method mutates `object`.
3096     *
3097     * @static
3098     * @memberOf _
3099     * @since 4.0.0
3100     * @alias extend
3101     * @category Object
3102     * @param {Object} object The destination object.
3103     * @param {...Object} [sources] The source objects.
3104     * @returns {Object} Returns `object`.
3105     * @see _.assign
3106     * @example
3107     *
3108     * function Foo() {
3109     *   this.a = 1;
3110     * }
3111     *
3112     * function Bar() {
3113     *   this.c = 3;
3114     * }
3115     *
3116     * Foo.prototype.b = 2;
3117     * Bar.prototype.d = 4;
3118     *
3119     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
3120     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
3121     */
3122    var assignIn = createAssigner(function(object, source) {
3123        copyObject(source, nativeKeysIn(source), object);
3124    });
3125
3126    /**
3127     * Creates an object that inherits from the `prototype` object. If a
3128     * `properties` object is given, its own enumerable string keyed properties
3129     * are assigned to the created object.
3130     *
3131     * @static
3132     * @memberOf _
3133     * @since 2.3.0
3134     * @category Object
3135     * @param {Object} prototype The object to inherit from.
3136     * @param {Object} [properties] The properties to assign to the object.
3137     * @returns {Object} Returns the new object.
3138     * @example
3139     *
3140     * function Shape() {
3141     *   this.x = 0;
3142     *   this.y = 0;
3143     * }
3144     *
3145     * function Circle() {
3146     *   Shape.call(this);
3147     * }
3148     *
3149     * Circle.prototype = _.create(Shape.prototype, {
3150     *   'constructor': Circle
3151     * });
3152     *
3153     * var circle = new Circle;
3154     * circle instanceof Circle;
3155     * // => true
3156     *
3157     * circle instanceof Shape;
3158     * // => true
3159     */
3160    function create(prototype, properties) {
3161        var result = baseCreate(prototype);
3162        return properties == null ? result : assign(result, properties);
3163    }
3164
3165    /**
3166     * Assigns own and inherited enumerable string keyed properties of source
3167     * objects to the destination object for all destination properties that
3168     * resolve to `undefined`. Source objects are applied from left to right.
3169     * Once a property is set, additional values of the same property are ignored.
3170     *
3171     * **Note:** This method mutates `object`.
3172     *
3173     * @static
3174     * @since 0.1.0
3175     * @memberOf _
3176     * @category Object
3177     * @param {Object} object The destination object.
3178     * @param {...Object} [sources] The source objects.
3179     * @returns {Object} Returns `object`.
3180     * @see _.defaultsDeep
3181     * @example
3182     *
3183     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
3184     * // => { 'a': 1, 'b': 2 }
3185     */
3186    var defaults = baseRest(function(object, sources) {
3187        object = Object(object);
3188
3189        var index = -1;
3190        var length = sources.length;
3191        var guard = length > 2 ? sources[2] : undefined;
3192
3193        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3194            length = 1;
3195        }
3196
3197        while (++index < length) {
3198            var source = sources[index];
3199            var props = keysIn(source);
3200            var propsIndex = -1;
3201            var propsLength = props.length;
3202
3203            while (++propsIndex < propsLength) {
3204                var key = props[propsIndex];
3205                var value = object[key];
3206
3207                if (value === undefined ||
3208                    (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
3209                    object[key] = source[key];
3210                }
3211            }
3212        }
3213
3214        return object;
3215    });
3216
3217    /**
3218     * Checks if `path` is a direct property of `object`.
3219     *
3220     * @static
3221     * @since 0.1.0
3222     * @memberOf _
3223     * @category Object
3224     * @param {Object} object The object to query.
3225     * @param {Array|string} path The path to check.
3226     * @returns {boolean} Returns `true` if `path` exists, else `false`.
3227     * @example
3228     *
3229     * var object = { 'a': { 'b': 2 } };
3230     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
3231     *
3232     * _.has(object, 'a');
3233     * // => true
3234     *
3235     * _.has(object, 'a.b');
3236     * // => true
3237     *
3238     * _.has(object, ['a', 'b']);
3239     * // => true
3240     *
3241     * _.has(other, 'a');
3242     * // => false
3243     */
3244    function has(object, path) {
3245        return object != null && hasOwnProperty.call(object, path);
3246    }
3247
3248    /**
3249     * Creates an array of the own enumerable property names of `object`.
3250     *
3251     * **Note:** Non-object values are coerced to objects. See the
3252     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
3253     * for more details.
3254     *
3255     * @static
3256     * @since 0.1.0
3257     * @memberOf _
3258     * @category Object
3259     * @param {Object} object The object to query.
3260     * @returns {Array} Returns the array of property names.
3261     * @example
3262     *
3263     * function Foo() {
3264     *   this.a = 1;
3265     *   this.b = 2;
3266     * }
3267     *
3268     * Foo.prototype.c = 3;
3269     *
3270     * _.keys(new Foo);
3271     * // => ['a', 'b'] (iteration order is not guaranteed)
3272     *
3273     * _.keys('hi');
3274     * // => ['0', '1']
3275     */
3276    var keys = nativeKeys;
3277
3278    /**
3279     * Creates an array of the own and inherited enumerable property names of `object`.
3280     *
3281     * **Note:** Non-object values are coerced to objects.
3282     *
3283     * @static
3284     * @memberOf _
3285     * @since 3.0.0
3286     * @category Object
3287     * @param {Object} object The object to query.
3288     * @returns {Array} Returns the array of property names.
3289     * @example
3290     *
3291     * function Foo() {
3292     *   this.a = 1;
3293     *   this.b = 2;
3294     * }
3295     *
3296     * Foo.prototype.c = 3;
3297     *
3298     * _.keysIn(new Foo);
3299     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
3300     */
3301    var keysIn = nativeKeysIn;
3302
3303    /**
3304     * Creates an object composed of the picked `object` properties.
3305     *
3306     * @static
3307     * @since 0.1.0
3308     * @memberOf _
3309     * @category Object
3310     * @param {Object} object The source object.
3311     * @param {...(string|string[])} [paths] The property paths to pick.
3312     * @returns {Object} Returns the new object.
3313     * @example
3314     *
3315     * var object = { 'a': 1, 'b': '2', 'c': 3 };
3316     *
3317     * _.pick(object, ['a', 'c']);
3318     * // => { 'a': 1, 'c': 3 }
3319     */
3320    var pick = flatRest(function(object, paths) {
3321        return object == null ? {} : basePick(object, paths);
3322    });
3323
3324    /**
3325     * This method is like `_.get` except that if the resolved value is a
3326     * function it's invoked with the `this` binding of its parent object and
3327     * its result is returned.
3328     *
3329     * @static
3330     * @since 0.1.0
3331     * @memberOf _
3332     * @category Object
3333     * @param {Object} object The object to query.
3334     * @param {Array|string} path The path of the property to resolve.
3335     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
3336     * @returns {*} Returns the resolved value.
3337     * @example
3338     *
3339     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
3340     *
3341     * _.result(object, 'a[0].b.c1');
3342     * // => 3
3343     *
3344     * _.result(object, 'a[0].b.c2');
3345     * // => 4
3346     *
3347     * _.result(object, 'a[0].b.c3', 'default');
3348     * // => 'default'
3349     *
3350     * _.result(object, 'a[0].b.c3', _.constant('default'));
3351     * // => 'default'
3352     */
3353    function result(object, path, defaultValue) {
3354        var value = object == null ? undefined : object[path];
3355        if (value === undefined) {
3356            value = defaultValue;
3357        }
3358        return isFunction(value) ? value.call(object) : value;
3359    }
3360
3361    /**
3362     * Creates an array of the own enumerable string keyed property values of `object`.
3363     *
3364     * **Note:** Non-object values are coerced to objects.
3365     *
3366     * @static
3367     * @since 0.1.0
3368     * @memberOf _
3369     * @category Object
3370     * @param {Object} object The object to query.
3371     * @returns {Array} Returns the array of property values.
3372     * @example
3373     *
3374     * function Foo() {
3375     *   this.a = 1;
3376     *   this.b = 2;
3377     * }
3378     *
3379     * Foo.prototype.c = 3;
3380     *
3381     * _.values(new Foo);
3382     * // => [1, 2] (iteration order is not guaranteed)
3383     *
3384     * _.values('hi');
3385     * // => ['h', 'i']
3386     */
3387    function values(object) {
3388        return object == null ? [] : baseValues(object, keys(object));
3389    }
3390
3391    /*------------------------------------------------------------------------*/
3392
3393    /**
3394     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
3395     * corresponding HTML entities.
3396     *
3397     * **Note:** No other characters are escaped. To escape additional
3398     * characters use a third-party library like [_he_](https://mths.be/he).
3399     *
3400     * Though the ">" character is escaped for symmetry, characters like
3401     * ">" and "/" don't need escaping in HTML and have no special meaning
3402     * unless they're part of a tag or unquoted attribute value. See
3403     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
3404     * (under "semi-related fun fact") for more details.
3405     *
3406     * When working with HTML you should always
3407     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
3408     * XSS vectors.
3409     *
3410     * @static
3411     * @since 0.1.0
3412     * @memberOf _
3413     * @category String
3414     * @param {string} [string=''] The string to escape.
3415     * @returns {string} Returns the escaped string.
3416     * @example
3417     *
3418     * _.escape('fred, barney, & pebbles');
3419     * // => 'fred, barney, &amp; pebbles'
3420     */
3421    function escape(string) {
3422        string = toString(string);
3423        return (string && reHasUnescapedHtml.test(string))
3424            ? string.replace(reUnescapedHtml, escapeHtmlChar)
3425            : string;
3426    }
3427
3428    /*------------------------------------------------------------------------*/
3429
3430    /**
3431     * This method returns the first argument it receives.
3432     *
3433     * @static
3434     * @since 0.1.0
3435     * @memberOf _
3436     * @category Util
3437     * @param {*} value Any value.
3438     * @returns {*} Returns `value`.
3439     * @example
3440     *
3441     * var object = { 'a': 1 };
3442     *
3443     * console.log(_.identity(object) === object);
3444     * // => true
3445     */
3446    function identity(value) {
3447        return value;
3448    }
3449
3450    /**
3451     * Creates a function that invokes `func` with the arguments of the created
3452     * function. If `func` is a property name, the created function returns the
3453     * property value for a given element. If `func` is an array or object, the
3454     * created function returns `true` for elements that contain the equivalent
3455     * source properties, otherwise it returns `false`.
3456     *
3457     * @static
3458     * @since 4.0.0
3459     * @memberOf _
3460     * @category Util
3461     * @param {*} [func=_.identity] The value to convert to a callback.
3462     * @returns {Function} Returns the callback.
3463     * @example
3464     *
3465     * var users = [
3466     *   { 'user': 'barney', 'age': 36, 'active': true },
3467     *   { 'user': 'fred',   'age': 40, 'active': false }
3468     * ];
3469     *
3470     * // The `_.matches` iteratee shorthand.
3471     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
3472     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
3473     *
3474     * // The `_.matchesProperty` iteratee shorthand.
3475     * _.filter(users, _.iteratee(['user', 'fred']));
3476     * // => [{ 'user': 'fred', 'age': 40 }]
3477     *
3478     * // The `_.property` iteratee shorthand.
3479     * _.map(users, _.iteratee('user'));
3480     * // => ['barney', 'fred']
3481     *
3482     * // Create custom iteratee shorthands.
3483     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
3484     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
3485     *     return func.test(string);
3486     *   };
3487     * });
3488     *
3489     * _.filter(['abc', 'def'], /ef/);
3490     * // => ['def']
3491     */
3492    var iteratee = baseIteratee;
3493
3494    /**
3495     * Creates a function that performs a partial deep comparison between a given
3496     * object and `source`, returning `true` if the given object has equivalent
3497     * property values, else `false`.
3498     *
3499     * **Note:** The created function is equivalent to `_.isMatch` with `source`
3500     * partially applied.
3501     *
3502     * Partial comparisons will match empty array and empty object `source`
3503     * values against any array or object value, respectively. See `_.isEqual`
3504     * for a list of supported value comparisons.
3505     *
3506     * @static
3507     * @memberOf _
3508     * @since 3.0.0
3509     * @category Util
3510     * @param {Object} source The object of property values to match.
3511     * @returns {Function} Returns the new spec function.
3512     * @example
3513     *
3514     * var objects = [
3515     *   { 'a': 1, 'b': 2, 'c': 3 },
3516     *   { 'a': 4, 'b': 5, 'c': 6 }
3517     * ];
3518     *
3519     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
3520     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
3521     */
3522    function matches(source) {
3523        return baseMatches(assign({}, source));
3524    }
3525
3526    /**
3527     * Adds all own enumerable string keyed function properties of a source
3528     * object to the destination object. If `object` is a function, then methods
3529     * are added to its prototype as well.
3530     *
3531     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
3532     * avoid conflicts caused by modifying the original.
3533     *
3534     * @static
3535     * @since 0.1.0
3536     * @memberOf _
3537     * @category Util
3538     * @param {Function|Object} [object=lodash] The destination object.
3539     * @param {Object} source The object of functions to add.
3540     * @param {Object} [options={}] The options object.
3541     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
3542     * @returns {Function|Object} Returns `object`.
3543     * @example
3544     *
3545     * function vowels(string) {
3546     *   return _.filter(string, function(v) {
3547     *     return /[aeiou]/i.test(v);
3548     *   });
3549     * }
3550     *
3551     * _.mixin({ 'vowels': vowels });
3552     * _.vowels('fred');
3553     * // => ['e']
3554     *
3555     * _('fred').vowels().value();
3556     * // => ['e']
3557     *
3558     * _.mixin({ 'vowels': vowels }, { 'chain': false });
3559     * _('fred').vowels();
3560     * // => ['e']
3561     */
3562    function mixin(object, source, options) {
3563        var props = keys(source),
3564            methodNames = baseFunctions(source, props);
3565
3566        if (options == null &&
3567            !(isObject(source) && (methodNames.length || !props.length))) {
3568            options = source;
3569            source = object;
3570            object = this;
3571            methodNames = baseFunctions(source, keys(source));
3572        }
3573        var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
3574            isFunc = isFunction(object);
3575
3576        baseEach(methodNames, function(methodName) {
3577            var func = source[methodName];
3578            object[methodName] = func;
3579            if (isFunc) {
3580                object.prototype[methodName] = function() {
3581                    var chainAll = this.__chain__;
3582                    if (chain || chainAll) {
3583                        var result = object(this.__wrapped__),
3584                            actions = result.__actions__ = copyArray(this.__actions__);
3585
3586                        actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
3587                        result.__chain__ = chainAll;
3588                        return result;
3589                    }
3590                    return func.apply(object, arrayPush([this.value()], arguments));
3591                };
3592            }
3593        });
3594
3595        return object;
3596    }
3597
3598    /**
3599     * Reverts the `_` variable to its previous value and returns a reference to
3600     * the `lodash` function.
3601     *
3602     * @static
3603     * @since 0.1.0
3604     * @memberOf _
3605     * @category Util
3606     * @returns {Function} Returns the `lodash` function.
3607     * @example
3608     *
3609     * var lodash = _.noConflict();
3610     */
3611    function noConflict() {
3612        if (root._ === this) {
3613            root._ = oldDash;
3614        }
3615        return this;
3616    }
3617
3618    /**
3619     * This method returns `undefined`.
3620     *
3621     * @static
3622     * @memberOf _
3623     * @since 2.3.0
3624     * @category Util
3625     * @example
3626     *
3627     * _.times(2, _.noop);
3628     * // => [undefined, undefined]
3629     */
3630    function noop() {
3631        // No operation performed.
3632    }
3633
3634    /**
3635     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
3636     *
3637     * @static
3638     * @since 0.1.0
3639     * @memberOf _
3640     * @category Util
3641     * @param {string} [prefix=''] The value to prefix the ID with.
3642     * @returns {string} Returns the unique ID.
3643     * @example
3644     *
3645     * _.uniqueId('contact_');
3646     * // => 'contact_104'
3647     *
3648     * _.uniqueId();
3649     * // => '105'
3650     */
3651    function uniqueId(prefix) {
3652        var id = ++idCounter;
3653        return toString(prefix) + id;
3654    }
3655
3656    /*------------------------------------------------------------------------*/
3657
3658    /**
3659     * Computes the maximum value of `array`. If `array` is empty or falsey,
3660     * `undefined` is returned.
3661     *
3662     * @static
3663     * @since 0.1.0
3664     * @memberOf _
3665     * @category Math
3666     * @param {Array} array The array to iterate over.
3667     * @returns {*} Returns the maximum value.
3668     * @example
3669     *
3670     * _.max([4, 2, 8, 6]);
3671     * // => 8
3672     *
3673     * _.max([]);
3674     * // => undefined
3675     */
3676    function max(array) {
3677        return (array && array.length)
3678            ? baseExtremum(array, identity, baseGt)
3679            : undefined;
3680    }
3681
3682    /**
3683     * Computes the minimum value of `array`. If `array` is empty or falsey,
3684     * `undefined` is returned.
3685     *
3686     * @static
3687     * @since 0.1.0
3688     * @memberOf _
3689     * @category Math
3690     * @param {Array} array The array to iterate over.
3691     * @returns {*} Returns the minimum value.
3692     * @example
3693     *
3694     * _.min([4, 2, 8, 6]);
3695     * // => 2
3696     *
3697     * _.min([]);
3698     * // => undefined
3699     */
3700    function min(array) {
3701        return (array && array.length)
3702            ? baseExtremum(array, identity, baseLt)
3703            : undefined;
3704    }
3705
3706    /*------------------------------------------------------------------------*/
3707
3708    // Add methods that return wrapped values in chain sequences.
3709    lodash.assignIn = assignIn;
3710    lodash.before = before;
3711    lodash.bind = bind;
3712    lodash.chain = chain;
3713    lodash.compact = compact;
3714    lodash.concat = concat;
3715    lodash.create = create;
3716    lodash.defaults = defaults;
3717    lodash.defer = defer;
vendor: 4,513 bytes, lines 3718-3854
3718    lodash.delay = delay;
3719    lodash.filter = filter;
3720    lodash.flatten = flatten;
3721    lodash.flattenDeep = flattenDeep;
3722    lodash.iteratee = iteratee;
3723    lodash.keys = keys;
3724    lodash.map = map;
3725    lodash.matches = matches;
3726    lodash.mixin = mixin;
3727    lodash.negate = negate;
3728    lodash.once = once;
3729    lodash.pick = pick;
3730    lodash.slice = slice;
3731    lodash.sortBy = sortBy;
3732    lodash.tap = tap;
3733    lodash.thru = thru;
3734    lodash.toArray = toArray;
3735    lodash.values = values;
3736
3737    // Add aliases.
3738    lodash.extend = assignIn;
3739
3740    // Add methods to `lodash.prototype`.
3741    mixin(lodash, lodash);
3742
3743    /*------------------------------------------------------------------------*/
3744
3745    // Add methods that return unwrapped values in chain sequences.
3746    lodash.clone = clone;
3747    lodash.escape = escape;
3748    lodash.every = every;
3749    lodash.find = find;
3750    lodash.forEach = forEach;
3751    lodash.has = has;
3752    lodash.head = head;
3753    lodash.identity = identity;
3754    lodash.indexOf = indexOf;
3755    lodash.isArguments = isArguments;
3756    lodash.isArray = isArray;
3757    lodash.isBoolean = isBoolean;
3758    lodash.isDate = isDate;
3759    lodash.isEmpty = isEmpty;
3760    lodash.isEqual = isEqual;
3761    lodash.isFinite = isFinite;
3762    lodash.isFunction = isFunction;
3763    lodash.isNaN = isNaN;
3764    lodash.isNull = isNull;
3765    lodash.isNumber = isNumber;
3766    lodash.isObject = isObject;
3767    lodash.isRegExp = isRegExp;
3768    lodash.isString = isString;
3769    lodash.isUndefined = isUndefined;
3770    lodash.last = last;
3771    lodash.max = max;
3772    lodash.min = min;
3773    lodash.noConflict = noConflict;
3774    lodash.noop = noop;
3775    lodash.reduce = reduce;
3776    lodash.result = result;
3777    lodash.size = size;
3778    lodash.some = some;
3779    lodash.uniqueId = uniqueId;
3780
3781    // Add aliases.
3782    lodash.each = forEach;
3783    lodash.first = head;
3784
3785    mixin(lodash, (function() {
3786        var source = {};
3787        baseForOwn(lodash, function(func, methodName) {
3788            if (!hasOwnProperty.call(lodash.prototype, methodName)) {
3789                source[methodName] = func;
3790            }
3791        });
3792        return source;
3793    }()), { 'chain': false });
3794
3795    /*------------------------------------------------------------------------*/
3796
3797    /**
3798     * The semantic version number.
3799     *
3800     * @static
3801     * @memberOf _
3802     * @type {string}
3803     */
3804    lodash.VERSION = VERSION;
3805
3806    // Add `Array` methods to `lodash.prototype`.
3807    baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
3808        var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
3809            chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
3810            retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
3811
3812        lodash.prototype[methodName] = function() {
3813            var args = arguments;
3814            if (retUnwrapped && !this.__chain__) {
3815                var value = this.value();
3816                return func.apply(isArray(value) ? value : [], args);
3817            }
3818            return this[chainName](function(value) {
3819                return func.apply(isArray(value) ? value : [], args);
3820            });
3821        };
3822    });
3823
3824    // Add chain sequence methods to the `lodash` wrapper.
3825    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
3826
3827    /*--------------------------------------------------------------------------*/
3828
3829    // Some AMD build optimizers, like r.js, check for condition patterns like:
3830    if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
3831        // Expose Lodash on the global object to prevent errors when Lodash is
3832        // loaded by a script tag in the presence of an AMD loader.
3833        // See http://requirejs.org/docs/errors.html#mismatch for more details.
3834        // Use `_.noConflict` to remove Lodash from the global object.
3835        root._ = lodash;
3836
3837        // Define as an anonymous module so, through path mapping, it can be
3838        // referenced as the "underscore" module.
3839        define(function() {
3840            return lodash;
3841        });
3842    }
3843    // Check for `exports` after `define` in case a build optimizer adds it.
3844    else if (freeModule) {
3845        // Export for Node.js.
3846        (freeModule.exports = lodash)._ = lodash;
3847        // Export for CommonJS support.
3848        freeExports._ = lodash;
3849    }
3850    else {
3851        // Export to the global object.
3852        root._ = lodash;
3853    }
3854}.call(this));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.