time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

core.js (115957B)


      1 /**
      2  * @license
      3  * Lodash (Custom Build) <https://lodash.com/>
      4  * Build: `lodash core -o ./dist/lodash.core.js`
      5  * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
      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.21';
     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    */
    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     // Check that cyclic values are equal.
   1187     var arrStacked = stack.get(array);
   1188     var othStacked = stack.get(other);
   1189     if (arrStacked && othStacked) {
   1190       return arrStacked == other && othStacked == array;
   1191     }
   1192     var index = -1,
   1193         result = true,
   1194         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
   1195 
   1196     // Ignore non-index properties.
   1197     while (++index < arrLength) {
   1198       var arrValue = array[index],
   1199           othValue = other[index];
   1200 
   1201       var compared;
   1202       if (compared !== undefined) {
   1203         if (compared) {
   1204           continue;
   1205         }
   1206         result = false;
   1207         break;
   1208       }
   1209       // Recursively compare arrays (susceptible to call stack limits).
   1210       if (seen) {
   1211         if (!baseSome(other, function(othValue, othIndex) {
   1212               if (!indexOf(seen, othIndex) &&
   1213                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
   1214                 return seen.push(othIndex);
   1215               }
   1216             })) {
   1217           result = false;
   1218           break;
   1219         }
   1220       } else if (!(
   1221             arrValue === othValue ||
   1222               equalFunc(arrValue, othValue, bitmask, customizer, stack)
   1223           )) {
   1224         result = false;
   1225         break;
   1226       }
   1227     }
   1228     return result;
   1229   }
   1230 
   1231   /**
   1232    * A specialized version of `baseIsEqualDeep` for comparing objects of
   1233    * the same `toStringTag`.
   1234    *
   1235    * **Note:** This function only supports comparing values with tags of
   1236    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
   1237    *
   1238    * @private
   1239    * @param {Object} object The object to compare.
   1240    * @param {Object} other The other object to compare.
   1241    * @param {string} tag The `toStringTag` of the objects to compare.
   1242    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   1243    * @param {Function} customizer The function to customize comparisons.
   1244    * @param {Function} equalFunc The function to determine equivalents of values.
   1245    * @param {Object} stack Tracks traversed `object` and `other` objects.
   1246    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   1247    */
   1248   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
   1249     switch (tag) {
   1250 
   1251       case boolTag:
   1252       case dateTag:
   1253       case numberTag:
   1254         // Coerce booleans to `1` or `0` and dates to milliseconds.
   1255         // Invalid dates are coerced to `NaN`.
   1256         return eq(+object, +other);
   1257 
   1258       case errorTag:
   1259         return object.name == other.name && object.message == other.message;
   1260 
   1261       case regexpTag:
   1262       case stringTag:
   1263         // Coerce regexes to strings and treat strings, primitives and objects,
   1264         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
   1265         // for more details.
   1266         return object == (other + '');
   1267 
   1268     }
   1269     return false;
   1270   }
   1271 
   1272   /**
   1273    * A specialized version of `baseIsEqualDeep` for objects with support for
   1274    * partial deep comparisons.
   1275    *
   1276    * @private
   1277    * @param {Object} object The object to compare.
   1278    * @param {Object} other The other object to compare.
   1279    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   1280    * @param {Function} customizer The function to customize comparisons.
   1281    * @param {Function} equalFunc The function to determine equivalents of values.
   1282    * @param {Object} stack Tracks traversed `object` and `other` objects.
   1283    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   1284    */
   1285   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
   1286     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
   1287         objProps = keys(object),
   1288         objLength = objProps.length,
   1289         othProps = keys(other),
   1290         othLength = othProps.length;
   1291 
   1292     if (objLength != othLength && !isPartial) {
   1293       return false;
   1294     }
   1295     var index = objLength;
   1296     while (index--) {
   1297       var key = objProps[index];
   1298       if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
   1299         return false;
   1300       }
   1301     }
   1302     // Check that cyclic values are equal.
   1303     var objStacked = stack.get(object);
   1304     var othStacked = stack.get(other);
   1305     if (objStacked && othStacked) {
   1306       return objStacked == other && othStacked == object;
   1307     }
   1308     var result = true;
   1309 
   1310     var skipCtor = isPartial;
   1311     while (++index < objLength) {
   1312       key = objProps[index];
   1313       var objValue = object[key],
   1314           othValue = other[key];
   1315 
   1316       var compared;
   1317       // Recursively compare objects (susceptible to call stack limits).
   1318       if (!(compared === undefined
   1319             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
   1320             : compared
   1321           )) {
   1322         result = false;
   1323         break;
   1324       }
   1325       skipCtor || (skipCtor = key == 'constructor');
   1326     }
   1327     if (result && !skipCtor) {
   1328       var objCtor = object.constructor,
   1329           othCtor = other.constructor;
   1330 
   1331       // Non `Object` object instances with different constructors are not equal.
   1332       if (objCtor != othCtor &&
   1333           ('constructor' in object && 'constructor' in other) &&
   1334           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
   1335             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
   1336         result = false;
   1337       }
   1338     }
   1339     return result;
   1340   }
   1341 
   1342   /**
   1343    * A specialized version of `baseRest` which flattens the rest array.
   1344    *
   1345    * @private
   1346    * @param {Function} func The function to apply a rest parameter to.
   1347    * @returns {Function} Returns the new function.
   1348    */
   1349   function flatRest(func) {
   1350     return setToString(overRest(func, undefined, flatten), func + '');
   1351   }
   1352 
   1353   /**
   1354    * Checks if `value` is a flattenable `arguments` object or array.
   1355    *
   1356    * @private
   1357    * @param {*} value The value to check.
   1358    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
   1359    */
   1360   function isFlattenable(value) {
   1361     return isArray(value) || isArguments(value);
   1362   }
   1363 
   1364   /**
   1365    * Checks if `value` is a valid array-like index.
   1366    *
   1367    * @private
   1368    * @param {*} value The value to check.
   1369    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
   1370    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
   1371    */
   1372   function isIndex(value, length) {
   1373     var type = typeof value;
   1374     length = length == null ? MAX_SAFE_INTEGER : length;
   1375 
   1376     return !!length &&
   1377       (type == 'number' ||
   1378         (type != 'symbol' && reIsUint.test(value))) &&
   1379           (value > -1 && value % 1 == 0 && value < length);
   1380   }
   1381 
   1382   /**
   1383    * Checks if the given arguments are from an iteratee call.
   1384    *
   1385    * @private
   1386    * @param {*} value The potential iteratee value argument.
   1387    * @param {*} index The potential iteratee index or key argument.
   1388    * @param {*} object The potential iteratee object argument.
   1389    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
   1390    *  else `false`.
   1391    */
   1392   function isIterateeCall(value, index, object) {
   1393     if (!isObject(object)) {
   1394       return false;
   1395     }
   1396     var type = typeof index;
   1397     if (type == 'number'
   1398           ? (isArrayLike(object) && isIndex(index, object.length))
   1399           : (type == 'string' && index in object)
   1400         ) {
   1401       return eq(object[index], value);
   1402     }
   1403     return false;
   1404   }
   1405 
   1406   /**
   1407    * This function is like
   1408    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
   1409    * except that it includes inherited enumerable properties.
   1410    *
   1411    * @private
   1412    * @param {Object} object The object to query.
   1413    * @returns {Array} Returns the array of property names.
   1414    */
   1415   function nativeKeysIn(object) {
   1416     var result = [];
   1417     if (object != null) {
   1418       for (var key in Object(object)) {
   1419         result.push(key);
   1420       }
   1421     }
   1422     return result;
   1423   }
   1424 
   1425   /**
   1426    * Converts `value` to a string using `Object.prototype.toString`.
   1427    *
   1428    * @private
   1429    * @param {*} value The value to convert.
   1430    * @returns {string} Returns the converted string.
   1431    */
   1432   function objectToString(value) {
   1433     return nativeObjectToString.call(value);
   1434   }
   1435 
   1436   /**
   1437    * A specialized version of `baseRest` which transforms the rest array.
   1438    *
   1439    * @private
   1440    * @param {Function} func The function to apply a rest parameter to.
   1441    * @param {number} [start=func.length-1] The start position of the rest parameter.
   1442    * @param {Function} transform The rest array transform.
   1443    * @returns {Function} Returns the new function.
   1444    */
   1445   function overRest(func, start, transform) {
   1446     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
   1447     return function() {
   1448       var args = arguments,
   1449           index = -1,
   1450           length = nativeMax(args.length - start, 0),
   1451           array = Array(length);
   1452 
   1453       while (++index < length) {
   1454         array[index] = args[start + index];
   1455       }
   1456       index = -1;
   1457       var otherArgs = Array(start + 1);
   1458       while (++index < start) {
   1459         otherArgs[index] = args[index];
   1460       }
   1461       otherArgs[start] = transform(array);
   1462       return func.apply(this, otherArgs);
   1463     };
   1464   }
   1465 
   1466   /**
   1467    * Sets the `toString` method of `func` to return `string`.
   1468    *
   1469    * @private
   1470    * @param {Function} func The function to modify.
   1471    * @param {Function} string The `toString` result.
   1472    * @returns {Function} Returns `func`.
   1473    */
   1474   var setToString = identity;
   1475 
   1476   /*------------------------------------------------------------------------*/
   1477 
   1478   /**
   1479    * Creates an array with all falsey values removed. The values `false`, `null`,
   1480    * `0`, `""`, `undefined`, and `NaN` are falsey.
   1481    *
   1482    * @static
   1483    * @memberOf _
   1484    * @since 0.1.0
   1485    * @category Array
   1486    * @param {Array} array The array to compact.
   1487    * @returns {Array} Returns the new array of filtered values.
   1488    * @example
   1489    *
   1490    * _.compact([0, 1, false, 2, '', 3]);
   1491    * // => [1, 2, 3]
   1492    */
   1493   function compact(array) {
   1494     return baseFilter(array, Boolean);
   1495   }
   1496 
   1497   /**
   1498    * Creates a new array concatenating `array` with any additional arrays
   1499    * and/or values.
   1500    *
   1501    * @static
   1502    * @memberOf _
   1503    * @since 4.0.0
   1504    * @category Array
   1505    * @param {Array} array The array to concatenate.
   1506    * @param {...*} [values] The values to concatenate.
   1507    * @returns {Array} Returns the new concatenated array.
   1508    * @example
   1509    *
   1510    * var array = [1];
   1511    * var other = _.concat(array, 2, [3], [[4]]);
   1512    *
   1513    * console.log(other);
   1514    * // => [1, 2, 3, [4]]
   1515    *
   1516    * console.log(array);
   1517    * // => [1]
   1518    */
   1519   function concat() {
   1520     var length = arguments.length;
   1521     if (!length) {
   1522       return [];
   1523     }
   1524     var args = Array(length - 1),
   1525         array = arguments[0],
   1526         index = length;
   1527 
   1528     while (index--) {
   1529       args[index - 1] = arguments[index];
   1530     }
   1531     return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
   1532   }
   1533 
   1534   /**
   1535    * This method is like `_.find` except that it returns the index of the first
   1536    * element `predicate` returns truthy for instead of the element itself.
   1537    *
   1538    * @static
   1539    * @memberOf _
   1540    * @since 1.1.0
   1541    * @category Array
   1542    * @param {Array} array The array to inspect.
   1543    * @param {Function} [predicate=_.identity] The function invoked per iteration.
   1544    * @param {number} [fromIndex=0] The index to search from.
   1545    * @returns {number} Returns the index of the found element, else `-1`.
   1546    * @example
   1547    *
   1548    * var users = [
   1549    *   { 'user': 'barney',  'active': false },
   1550    *   { 'user': 'fred',    'active': false },
   1551    *   { 'user': 'pebbles', 'active': true }
   1552    * ];
   1553    *
   1554    * _.findIndex(users, function(o) { return o.user == 'barney'; });
   1555    * // => 0
   1556    *
   1557    * // The `_.matches` iteratee shorthand.
   1558    * _.findIndex(users, { 'user': 'fred', 'active': false });
   1559    * // => 1
   1560    *
   1561    * // The `_.matchesProperty` iteratee shorthand.
   1562    * _.findIndex(users, ['active', false]);
   1563    * // => 0
   1564    *
   1565    * // The `_.property` iteratee shorthand.
   1566    * _.findIndex(users, 'active');
   1567    * // => 2
   1568    */
   1569   function findIndex(array, predicate, fromIndex) {
   1570     var length = array == null ? 0 : array.length;
   1571     if (!length) {
   1572       return -1;
   1573     }
   1574     var index = fromIndex == null ? 0 : toInteger(fromIndex);
   1575     if (index < 0) {
   1576       index = nativeMax(length + index, 0);
   1577     }
   1578     return baseFindIndex(array, baseIteratee(predicate, 3), index);
   1579   }
   1580 
   1581   /**
   1582    * Flattens `array` a single level deep.
   1583    *
   1584    * @static
   1585    * @memberOf _
   1586    * @since 0.1.0
   1587    * @category Array
   1588    * @param {Array} array The array to flatten.
   1589    * @returns {Array} Returns the new flattened array.
   1590    * @example
   1591    *
   1592    * _.flatten([1, [2, [3, [4]], 5]]);
   1593    * // => [1, 2, [3, [4]], 5]
   1594    */
   1595   function flatten(array) {
   1596     var length = array == null ? 0 : array.length;
   1597     return length ? baseFlatten(array, 1) : [];
   1598   }
   1599 
   1600   /**
   1601    * Recursively flattens `array`.
   1602    *
   1603    * @static
   1604    * @memberOf _
   1605    * @since 3.0.0
   1606    * @category Array
   1607    * @param {Array} array The array to flatten.
   1608    * @returns {Array} Returns the new flattened array.
   1609    * @example
   1610    *
   1611    * _.flattenDeep([1, [2, [3, [4]], 5]]);
   1612    * // => [1, 2, 3, 4, 5]
   1613    */
   1614   function flattenDeep(array) {
   1615     var length = array == null ? 0 : array.length;
   1616     return length ? baseFlatten(array, INFINITY) : [];
   1617   }
   1618 
   1619   /**
   1620    * Gets the first element of `array`.
   1621    *
   1622    * @static
   1623    * @memberOf _
   1624    * @since 0.1.0
   1625    * @alias first
   1626    * @category Array
   1627    * @param {Array} array The array to query.
   1628    * @returns {*} Returns the first element of `array`.
   1629    * @example
   1630    *
   1631    * _.head([1, 2, 3]);
   1632    * // => 1
   1633    *
   1634    * _.head([]);
   1635    * // => undefined
   1636    */
   1637   function head(array) {
   1638     return (array && array.length) ? array[0] : undefined;
   1639   }
   1640 
   1641   /**
   1642    * Gets the index at which the first occurrence of `value` is found in `array`
   1643    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   1644    * for equality comparisons. If `fromIndex` is negative, it's used as the
   1645    * offset from the end of `array`.
   1646    *
   1647    * @static
   1648    * @memberOf _
   1649    * @since 0.1.0
   1650    * @category Array
   1651    * @param {Array} array The array to inspect.
   1652    * @param {*} value The value to search for.
   1653    * @param {number} [fromIndex=0] The index to search from.
   1654    * @returns {number} Returns the index of the matched value, else `-1`.
   1655    * @example
   1656    *
   1657    * _.indexOf([1, 2, 1, 2], 2);
   1658    * // => 1
   1659    *
   1660    * // Search from the `fromIndex`.
   1661    * _.indexOf([1, 2, 1, 2], 2, 2);
   1662    * // => 3
   1663    */
   1664   function indexOf(array, value, fromIndex) {
   1665     var length = array == null ? 0 : array.length;
   1666     if (typeof fromIndex == 'number') {
   1667       fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
   1668     } else {
   1669       fromIndex = 0;
   1670     }
   1671     var index = (fromIndex || 0) - 1,
   1672         isReflexive = value === value;
   1673 
   1674     while (++index < length) {
   1675       var other = array[index];
   1676       if ((isReflexive ? other === value : other !== other)) {
   1677         return index;
   1678       }
   1679     }
   1680     return -1;
   1681   }
   1682 
   1683   /**
   1684    * Gets the last element of `array`.
   1685    *
   1686    * @static
   1687    * @memberOf _
   1688    * @since 0.1.0
   1689    * @category Array
   1690    * @param {Array} array The array to query.
   1691    * @returns {*} Returns the last element of `array`.
   1692    * @example
   1693    *
   1694    * _.last([1, 2, 3]);
   1695    * // => 3
   1696    */
   1697   function last(array) {
   1698     var length = array == null ? 0 : array.length;
   1699     return length ? array[length - 1] : undefined;
   1700   }
   1701 
   1702   /**
   1703    * Creates a slice of `array` from `start` up to, but not including, `end`.
   1704    *
   1705    * **Note:** This method is used instead of
   1706    * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
   1707    * returned.
   1708    *
   1709    * @static
   1710    * @memberOf _
   1711    * @since 3.0.0
   1712    * @category Array
   1713    * @param {Array} array The array to slice.
   1714    * @param {number} [start=0] The start position.
   1715    * @param {number} [end=array.length] The end position.
   1716    * @returns {Array} Returns the slice of `array`.
   1717    */
   1718   function slice(array, start, end) {
   1719     var length = array == null ? 0 : array.length;
   1720     start = start == null ? 0 : +start;
   1721     end = end === undefined ? length : +end;
   1722     return length ? baseSlice(array, start, end) : [];
   1723   }
   1724 
   1725   /*------------------------------------------------------------------------*/
   1726 
   1727   /**
   1728    * Creates a `lodash` wrapper instance that wraps `value` with explicit method
   1729    * chain sequences enabled. The result of such sequences must be unwrapped
   1730    * with `_#value`.
   1731    *
   1732    * @static
   1733    * @memberOf _
   1734    * @since 1.3.0
   1735    * @category Seq
   1736    * @param {*} value The value to wrap.
   1737    * @returns {Object} Returns the new `lodash` wrapper instance.
   1738    * @example
   1739    *
   1740    * var users = [
   1741    *   { 'user': 'barney',  'age': 36 },
   1742    *   { 'user': 'fred',    'age': 40 },
   1743    *   { 'user': 'pebbles', 'age': 1 }
   1744    * ];
   1745    *
   1746    * var youngest = _
   1747    *   .chain(users)
   1748    *   .sortBy('age')
   1749    *   .map(function(o) {
   1750    *     return o.user + ' is ' + o.age;
   1751    *   })
   1752    *   .head()
   1753    *   .value();
   1754    * // => 'pebbles is 1'
   1755    */
   1756   function chain(value) {
   1757     var result = lodash(value);
   1758     result.__chain__ = true;
   1759     return result;
   1760   }
   1761 
   1762   /**
   1763    * This method invokes `interceptor` and returns `value`. The interceptor
   1764    * is invoked with one argument; (value). The purpose of this method is to
   1765    * "tap into" a method chain sequence in order to modify intermediate results.
   1766    *
   1767    * @static
   1768    * @memberOf _
   1769    * @since 0.1.0
   1770    * @category Seq
   1771    * @param {*} value The value to provide to `interceptor`.
   1772    * @param {Function} interceptor The function to invoke.
   1773    * @returns {*} Returns `value`.
   1774    * @example
   1775    *
   1776    * _([1, 2, 3])
   1777    *  .tap(function(array) {
   1778    *    // Mutate input array.
   1779    *    array.pop();
   1780    *  })
   1781    *  .reverse()
   1782    *  .value();
   1783    * // => [2, 1]
   1784    */
   1785   function tap(value, interceptor) {
   1786     interceptor(value);
   1787     return value;
   1788   }
   1789 
   1790   /**
   1791    * This method is like `_.tap` except that it returns the result of `interceptor`.
   1792    * The purpose of this method is to "pass thru" values replacing intermediate
   1793    * results in a method chain sequence.
   1794    *
   1795    * @static
   1796    * @memberOf _
   1797    * @since 3.0.0
   1798    * @category Seq
   1799    * @param {*} value The value to provide to `interceptor`.
   1800    * @param {Function} interceptor The function to invoke.
   1801    * @returns {*} Returns the result of `interceptor`.
   1802    * @example
   1803    *
   1804    * _('  abc  ')
   1805    *  .chain()
   1806    *  .trim()
   1807    *  .thru(function(value) {
   1808    *    return [value];
   1809    *  })
   1810    *  .value();
   1811    * // => ['abc']
   1812    */
   1813   function thru(value, interceptor) {
   1814     return interceptor(value);
   1815   }
   1816 
   1817   /**
   1818    * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
   1819    *
   1820    * @name chain
   1821    * @memberOf _
   1822    * @since 0.1.0
   1823    * @category Seq
   1824    * @returns {Object} Returns the new `lodash` wrapper instance.
   1825    * @example
   1826    *
   1827    * var users = [
   1828    *   { 'user': 'barney', 'age': 36 },
   1829    *   { 'user': 'fred',   'age': 40 }
   1830    * ];
   1831    *
   1832    * // A sequence without explicit chaining.
   1833    * _(users).head();
   1834    * // => { 'user': 'barney', 'age': 36 }
   1835    *
   1836    * // A sequence with explicit chaining.
   1837    * _(users)
   1838    *   .chain()
   1839    *   .head()
   1840    *   .pick('user')
   1841    *   .value();
   1842    * // => { 'user': 'barney' }
   1843    */
   1844   function wrapperChain() {
   1845     return chain(this);
   1846   }
   1847 
   1848   /**
   1849    * Executes the chain sequence to resolve the unwrapped value.
   1850    *
   1851    * @name value
   1852    * @memberOf _
   1853    * @since 0.1.0
   1854    * @alias toJSON, valueOf
   1855    * @category Seq
   1856    * @returns {*} Returns the resolved unwrapped value.
   1857    * @example
   1858    *
   1859    * _([1, 2, 3]).value();
   1860    * // => [1, 2, 3]
   1861    */
   1862   function wrapperValue() {
   1863     return baseWrapperValue(this.__wrapped__, this.__actions__);
   1864   }
   1865 
   1866   /*------------------------------------------------------------------------*/
   1867 
   1868   /**
   1869    * Checks if `predicate` returns truthy for **all** elements of `collection`.
   1870    * Iteration is stopped once `predicate` returns falsey. The predicate is
   1871    * invoked with three arguments: (value, index|key, collection).
   1872    *
   1873    * **Note:** This method returns `true` for
   1874    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
   1875    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
   1876    * elements of empty collections.
   1877    *
   1878    * @static
   1879    * @memberOf _
   1880    * @since 0.1.0
   1881    * @category Collection
   1882    * @param {Array|Object} collection The collection to iterate over.
   1883    * @param {Function} [predicate=_.identity] The function invoked per iteration.
   1884    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
   1885    * @returns {boolean} Returns `true` if all elements pass the predicate check,
   1886    *  else `false`.
   1887    * @example
   1888    *
   1889    * _.every([true, 1, null, 'yes'], Boolean);
   1890    * // => false
   1891    *
   1892    * var users = [
   1893    *   { 'user': 'barney', 'age': 36, 'active': false },
   1894    *   { 'user': 'fred',   'age': 40, 'active': false }
   1895    * ];
   1896    *
   1897    * // The `_.matches` iteratee shorthand.
   1898    * _.every(users, { 'user': 'barney', 'active': false });
   1899    * // => false
   1900    *
   1901    * // The `_.matchesProperty` iteratee shorthand.
   1902    * _.every(users, ['active', false]);
   1903    * // => true
   1904    *
   1905    * // The `_.property` iteratee shorthand.
   1906    * _.every(users, 'active');
   1907    * // => false
   1908    */
   1909   function every(collection, predicate, guard) {
   1910     predicate = guard ? undefined : predicate;
   1911     return baseEvery(collection, baseIteratee(predicate));
   1912   }
   1913 
   1914   /**
   1915    * Iterates over elements of `collection`, returning an array of all elements
   1916    * `predicate` returns truthy for. The predicate is invoked with three
   1917    * arguments: (value, index|key, collection).
   1918    *
   1919    * **Note:** Unlike `_.remove`, this method returns a new array.
   1920    *
   1921    * @static
   1922    * @memberOf _
   1923    * @since 0.1.0
   1924    * @category Collection
   1925    * @param {Array|Object} collection The collection to iterate over.
   1926    * @param {Function} [predicate=_.identity] The function invoked per iteration.
   1927    * @returns {Array} Returns the new filtered array.
   1928    * @see _.reject
   1929    * @example
   1930    *
   1931    * var users = [
   1932    *   { 'user': 'barney', 'age': 36, 'active': true },
   1933    *   { 'user': 'fred',   'age': 40, 'active': false }
   1934    * ];
   1935    *
   1936    * _.filter(users, function(o) { return !o.active; });
   1937    * // => objects for ['fred']
   1938    *
   1939    * // The `_.matches` iteratee shorthand.
   1940    * _.filter(users, { 'age': 36, 'active': true });
   1941    * // => objects for ['barney']
   1942    *
   1943    * // The `_.matchesProperty` iteratee shorthand.
   1944    * _.filter(users, ['active', false]);
   1945    * // => objects for ['fred']
   1946    *
   1947    * // The `_.property` iteratee shorthand.
   1948    * _.filter(users, 'active');
   1949    * // => objects for ['barney']
   1950    *
   1951    * // Combining several predicates using `_.overEvery` or `_.overSome`.
   1952    * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
   1953    * // => objects for ['fred', 'barney']
   1954    */
   1955   function filter(collection, predicate) {
   1956     return baseFilter(collection, baseIteratee(predicate));
   1957   }
   1958 
   1959   /**
   1960    * Iterates over elements of `collection`, returning the first element
   1961    * `predicate` returns truthy for. The predicate is invoked with three
   1962    * arguments: (value, index|key, collection).
   1963    *
   1964    * @static
   1965    * @memberOf _
   1966    * @since 0.1.0
   1967    * @category Collection
   1968    * @param {Array|Object} collection The collection to inspect.
   1969    * @param {Function} [predicate=_.identity] The function invoked per iteration.
   1970    * @param {number} [fromIndex=0] The index to search from.
   1971    * @returns {*} Returns the matched element, else `undefined`.
   1972    * @example
   1973    *
   1974    * var users = [
   1975    *   { 'user': 'barney',  'age': 36, 'active': true },
   1976    *   { 'user': 'fred',    'age': 40, 'active': false },
   1977    *   { 'user': 'pebbles', 'age': 1,  'active': true }
   1978    * ];
   1979    *
   1980    * _.find(users, function(o) { return o.age < 40; });
   1981    * // => object for 'barney'
   1982    *
   1983    * // The `_.matches` iteratee shorthand.
   1984    * _.find(users, { 'age': 1, 'active': true });
   1985    * // => object for 'pebbles'
   1986    *
   1987    * // The `_.matchesProperty` iteratee shorthand.
   1988    * _.find(users, ['active', false]);
   1989    * // => object for 'fred'
   1990    *
   1991    * // The `_.property` iteratee shorthand.
   1992    * _.find(users, 'active');
   1993    * // => object for 'barney'
   1994    */
   1995   var find = createFind(findIndex);
   1996 
   1997   /**
   1998    * Iterates over elements of `collection` and invokes `iteratee` for each element.
   1999    * The iteratee is invoked with three arguments: (value, index|key, collection).
   2000    * Iteratee functions may exit iteration early by explicitly returning `false`.
   2001    *
   2002    * **Note:** As with other "Collections" methods, objects with a "length"
   2003    * property are iterated like arrays. To avoid this behavior use `_.forIn`
   2004    * or `_.forOwn` for object iteration.
   2005    *
   2006    * @static
   2007    * @memberOf _
   2008    * @since 0.1.0
   2009    * @alias each
   2010    * @category Collection
   2011    * @param {Array|Object} collection The collection to iterate over.
   2012    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   2013    * @returns {Array|Object} Returns `collection`.
   2014    * @see _.forEachRight
   2015    * @example
   2016    *
   2017    * _.forEach([1, 2], function(value) {
   2018    *   console.log(value);
   2019    * });
   2020    * // => Logs `1` then `2`.
   2021    *
   2022    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
   2023    *   console.log(key);
   2024    * });
   2025    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
   2026    */
   2027   function forEach(collection, iteratee) {
   2028     return baseEach(collection, baseIteratee(iteratee));
   2029   }
   2030 
   2031   /**
   2032    * Creates an array of values by running each element in `collection` thru
   2033    * `iteratee`. The iteratee is invoked with three arguments:
   2034    * (value, index|key, collection).
   2035    *
   2036    * Many lodash methods are guarded to work as iteratees for methods like
   2037    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
   2038    *
   2039    * The guarded methods are:
   2040    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
   2041    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
   2042    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
   2043    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
   2044    *
   2045    * @static
   2046    * @memberOf _
   2047    * @since 0.1.0
   2048    * @category Collection
   2049    * @param {Array|Object} collection The collection to iterate over.
   2050    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   2051    * @returns {Array} Returns the new mapped array.
   2052    * @example
   2053    *
   2054    * function square(n) {
   2055    *   return n * n;
   2056    * }
   2057    *
   2058    * _.map([4, 8], square);
   2059    * // => [16, 64]
   2060    *
   2061    * _.map({ 'a': 4, 'b': 8 }, square);
   2062    * // => [16, 64] (iteration order is not guaranteed)
   2063    *
   2064    * var users = [
   2065    *   { 'user': 'barney' },
   2066    *   { 'user': 'fred' }
   2067    * ];
   2068    *
   2069    * // The `_.property` iteratee shorthand.
   2070    * _.map(users, 'user');
   2071    * // => ['barney', 'fred']
   2072    */
   2073   function map(collection, iteratee) {
   2074     return baseMap(collection, baseIteratee(iteratee));
   2075   }
   2076 
   2077   /**
   2078    * Reduces `collection` to a value which is the accumulated result of running
   2079    * each element in `collection` thru `iteratee`, where each successive
   2080    * invocation is supplied the return value of the previous. If `accumulator`
   2081    * is not given, the first element of `collection` is used as the initial
   2082    * value. The iteratee is invoked with four arguments:
   2083    * (accumulator, value, index|key, collection).
   2084    *
   2085    * Many lodash methods are guarded to work as iteratees for methods like
   2086    * `_.reduce`, `_.reduceRight`, and `_.transform`.
   2087    *
   2088    * The guarded methods are:
   2089    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
   2090    * and `sortBy`
   2091    *
   2092    * @static
   2093    * @memberOf _
   2094    * @since 0.1.0
   2095    * @category Collection
   2096    * @param {Array|Object} collection The collection to iterate over.
   2097    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   2098    * @param {*} [accumulator] The initial value.
   2099    * @returns {*} Returns the accumulated value.
   2100    * @see _.reduceRight
   2101    * @example
   2102    *
   2103    * _.reduce([1, 2], function(sum, n) {
   2104    *   return sum + n;
   2105    * }, 0);
   2106    * // => 3
   2107    *
   2108    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
   2109    *   (result[value] || (result[value] = [])).push(key);
   2110    *   return result;
   2111    * }, {});
   2112    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
   2113    */
   2114   function reduce(collection, iteratee, accumulator) {
   2115     return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
   2116   }
   2117 
   2118   /**
   2119    * Gets the size of `collection` by returning its length for array-like
   2120    * values or the number of own enumerable string keyed properties for objects.
   2121    *
   2122    * @static
   2123    * @memberOf _
   2124    * @since 0.1.0
   2125    * @category Collection
   2126    * @param {Array|Object|string} collection The collection to inspect.
   2127    * @returns {number} Returns the collection size.
   2128    * @example
   2129    *
   2130    * _.size([1, 2, 3]);
   2131    * // => 3
   2132    *
   2133    * _.size({ 'a': 1, 'b': 2 });
   2134    * // => 2
   2135    *
   2136    * _.size('pebbles');
   2137    * // => 7
   2138    */
   2139   function size(collection) {
   2140     if (collection == null) {
   2141       return 0;
   2142     }
   2143     collection = isArrayLike(collection) ? collection : nativeKeys(collection);
   2144     return collection.length;
   2145   }
   2146 
   2147   /**
   2148    * Checks if `predicate` returns truthy for **any** element of `collection`.
   2149    * Iteration is stopped once `predicate` returns truthy. The predicate is
   2150    * invoked with three arguments: (value, index|key, collection).
   2151    *
   2152    * @static
   2153    * @memberOf _
   2154    * @since 0.1.0
   2155    * @category Collection
   2156    * @param {Array|Object} collection The collection to iterate over.
   2157    * @param {Function} [predicate=_.identity] The function invoked per iteration.
   2158    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
   2159    * @returns {boolean} Returns `true` if any element passes the predicate check,
   2160    *  else `false`.
   2161    * @example
   2162    *
   2163    * _.some([null, 0, 'yes', false], Boolean);
   2164    * // => true
   2165    *
   2166    * var users = [
   2167    *   { 'user': 'barney', 'active': true },
   2168    *   { 'user': 'fred',   'active': false }
   2169    * ];
   2170    *
   2171    * // The `_.matches` iteratee shorthand.
   2172    * _.some(users, { 'user': 'barney', 'active': false });
   2173    * // => false
   2174    *
   2175    * // The `_.matchesProperty` iteratee shorthand.
   2176    * _.some(users, ['active', false]);
   2177    * // => true
   2178    *
   2179    * // The `_.property` iteratee shorthand.
   2180    * _.some(users, 'active');
   2181    * // => true
   2182    */
   2183   function some(collection, predicate, guard) {
   2184     predicate = guard ? undefined : predicate;
   2185     return baseSome(collection, baseIteratee(predicate));
   2186   }
   2187 
   2188   /**
   2189    * Creates an array of elements, sorted in ascending order by the results of
   2190    * running each element in a collection thru each iteratee. This method
   2191    * performs a stable sort, that is, it preserves the original sort order of
   2192    * equal elements. The iteratees are invoked with one argument: (value).
   2193    *
   2194    * @static
   2195    * @memberOf _
   2196    * @since 0.1.0
   2197    * @category Collection
   2198    * @param {Array|Object} collection The collection to iterate over.
   2199    * @param {...(Function|Function[])} [iteratees=[_.identity]]
   2200    *  The iteratees to sort by.
   2201    * @returns {Array} Returns the new sorted array.
   2202    * @example
   2203    *
   2204    * var users = [
   2205    *   { 'user': 'fred',   'age': 48 },
   2206    *   { 'user': 'barney', 'age': 36 },
   2207    *   { 'user': 'fred',   'age': 30 },
   2208    *   { 'user': 'barney', 'age': 34 }
   2209    * ];
   2210    *
   2211    * _.sortBy(users, [function(o) { return o.user; }]);
   2212    * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
   2213    *
   2214    * _.sortBy(users, ['user', 'age']);
   2215    * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
   2216    */
   2217   function sortBy(collection, iteratee) {
   2218     var index = 0;
   2219     iteratee = baseIteratee(iteratee);
   2220 
   2221     return baseMap(baseMap(collection, function(value, key, collection) {
   2222       return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
   2223     }).sort(function(object, other) {
   2224       return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
   2225     }), baseProperty('value'));
   2226   }
   2227 
   2228   /*------------------------------------------------------------------------*/
   2229 
   2230   /**
   2231    * Creates a function that invokes `func`, with the `this` binding and arguments
   2232    * of the created function, while it's called less than `n` times. Subsequent
   2233    * calls to the created function return the result of the last `func` invocation.
   2234    *
   2235    * @static
   2236    * @memberOf _
   2237    * @since 3.0.0
   2238    * @category Function
   2239    * @param {number} n The number of calls at which `func` is no longer invoked.
   2240    * @param {Function} func The function to restrict.
   2241    * @returns {Function} Returns the new restricted function.
   2242    * @example
   2243    *
   2244    * jQuery(element).on('click', _.before(5, addContactToList));
   2245    * // => Allows adding up to 4 contacts to the list.
   2246    */
   2247   function before(n, func) {
   2248     var result;
   2249     if (typeof func != 'function') {
   2250       throw new TypeError(FUNC_ERROR_TEXT);
   2251     }
   2252     n = toInteger(n);
   2253     return function() {
   2254       if (--n > 0) {
   2255         result = func.apply(this, arguments);
   2256       }
   2257       if (n <= 1) {
   2258         func = undefined;
   2259       }
   2260       return result;
   2261     };
   2262   }
   2263 
   2264   /**
   2265    * Creates a function that invokes `func` with the `this` binding of `thisArg`
   2266    * and `partials` prepended to the arguments it receives.
   2267    *
   2268    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
   2269    * may be used as a placeholder for partially applied arguments.
   2270    *
   2271    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
   2272    * property of bound functions.
   2273    *
   2274    * @static
   2275    * @memberOf _
   2276    * @since 0.1.0
   2277    * @category Function
   2278    * @param {Function} func The function to bind.
   2279    * @param {*} thisArg The `this` binding of `func`.
   2280    * @param {...*} [partials] The arguments to be partially applied.
   2281    * @returns {Function} Returns the new bound function.
   2282    * @example
   2283    *
   2284    * function greet(greeting, punctuation) {
   2285    *   return greeting + ' ' + this.user + punctuation;
   2286    * }
   2287    *
   2288    * var object = { 'user': 'fred' };
   2289    *
   2290    * var bound = _.bind(greet, object, 'hi');
   2291    * bound('!');
   2292    * // => 'hi fred!'
   2293    *
   2294    * // Bound with placeholders.
   2295    * var bound = _.bind(greet, object, _, '!');
   2296    * bound('hi');
   2297    * // => 'hi fred!'
   2298    */
   2299   var bind = baseRest(function(func, thisArg, partials) {
   2300     return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
   2301   });
   2302 
   2303   /**
   2304    * Defers invoking the `func` until the current call stack has cleared. Any
   2305    * additional arguments are provided to `func` when it's invoked.
   2306    *
   2307    * @static
   2308    * @memberOf _
   2309    * @since 0.1.0
   2310    * @category Function
   2311    * @param {Function} func The function to defer.
   2312    * @param {...*} [args] The arguments to invoke `func` with.
   2313    * @returns {number} Returns the timer id.
   2314    * @example
   2315    *
   2316    * _.defer(function(text) {
   2317    *   console.log(text);
   2318    * }, 'deferred');
   2319    * // => Logs 'deferred' after one millisecond.
   2320    */
   2321   var defer = baseRest(function(func, args) {
   2322     return baseDelay(func, 1, args);
   2323   });
   2324 
   2325   /**
   2326    * Invokes `func` after `wait` milliseconds. Any additional arguments are
   2327    * provided to `func` when it's invoked.
   2328    *
   2329    * @static
   2330    * @memberOf _
   2331    * @since 0.1.0
   2332    * @category Function
   2333    * @param {Function} func The function to delay.
   2334    * @param {number} wait The number of milliseconds to delay invocation.
   2335    * @param {...*} [args] The arguments to invoke `func` with.
   2336    * @returns {number} Returns the timer id.
   2337    * @example
   2338    *
   2339    * _.delay(function(text) {
   2340    *   console.log(text);
   2341    * }, 1000, 'later');
   2342    * // => Logs 'later' after one second.
   2343    */
   2344   var delay = baseRest(function(func, wait, args) {
   2345     return baseDelay(func, toNumber(wait) || 0, args);
   2346   });
   2347 
   2348   /**
   2349    * Creates a function that negates the result of the predicate `func`. The
   2350    * `func` predicate is invoked with the `this` binding and arguments of the
   2351    * created function.
   2352    *
   2353    * @static
   2354    * @memberOf _
   2355    * @since 3.0.0
   2356    * @category Function
   2357    * @param {Function} predicate The predicate to negate.
   2358    * @returns {Function} Returns the new negated function.
   2359    * @example
   2360    *
   2361    * function isEven(n) {
   2362    *   return n % 2 == 0;
   2363    * }
   2364    *
   2365    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
   2366    * // => [1, 3, 5]
   2367    */
   2368   function negate(predicate) {
   2369     if (typeof predicate != 'function') {
   2370       throw new TypeError(FUNC_ERROR_TEXT);
   2371     }
   2372     return function() {
   2373       var args = arguments;
   2374       return !predicate.apply(this, args);
   2375     };
   2376   }
   2377 
   2378   /**
   2379    * Creates a function that is restricted to invoking `func` once. Repeat calls
   2380    * to the function return the value of the first invocation. The `func` is
   2381    * invoked with the `this` binding and arguments of the created function.
   2382    *
   2383    * @static
   2384    * @memberOf _
   2385    * @since 0.1.0
   2386    * @category Function
   2387    * @param {Function} func The function to restrict.
   2388    * @returns {Function} Returns the new restricted function.
   2389    * @example
   2390    *
   2391    * var initialize = _.once(createApplication);
   2392    * initialize();
   2393    * initialize();
   2394    * // => `createApplication` is invoked once
   2395    */
   2396   function once(func) {
   2397     return before(2, func);
   2398   }
   2399 
   2400   /*------------------------------------------------------------------------*/
   2401 
   2402   /**
   2403    * Creates a shallow clone of `value`.
   2404    *
   2405    * **Note:** This method is loosely based on the
   2406    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
   2407    * and supports cloning arrays, array buffers, booleans, date objects, maps,
   2408    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
   2409    * arrays. The own enumerable properties of `arguments` objects are cloned
   2410    * as plain objects. An empty object is returned for uncloneable values such
   2411    * as error objects, functions, DOM nodes, and WeakMaps.
   2412    *
   2413    * @static
   2414    * @memberOf _
   2415    * @since 0.1.0
   2416    * @category Lang
   2417    * @param {*} value The value to clone.
   2418    * @returns {*} Returns the cloned value.
   2419    * @see _.cloneDeep
   2420    * @example
   2421    *
   2422    * var objects = [{ 'a': 1 }, { 'b': 2 }];
   2423    *
   2424    * var shallow = _.clone(objects);
   2425    * console.log(shallow[0] === objects[0]);
   2426    * // => true
   2427    */
   2428   function clone(value) {
   2429     if (!isObject(value)) {
   2430       return value;
   2431     }
   2432     return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
   2433   }
   2434 
   2435   /**
   2436    * Performs a
   2437    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   2438    * comparison between two values to determine if they are equivalent.
   2439    *
   2440    * @static
   2441    * @memberOf _
   2442    * @since 4.0.0
   2443    * @category Lang
   2444    * @param {*} value The value to compare.
   2445    * @param {*} other The other value to compare.
   2446    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   2447    * @example
   2448    *
   2449    * var object = { 'a': 1 };
   2450    * var other = { 'a': 1 };
   2451    *
   2452    * _.eq(object, object);
   2453    * // => true
   2454    *
   2455    * _.eq(object, other);
   2456    * // => false
   2457    *
   2458    * _.eq('a', 'a');
   2459    * // => true
   2460    *
   2461    * _.eq('a', Object('a'));
   2462    * // => false
   2463    *
   2464    * _.eq(NaN, NaN);
   2465    * // => true
   2466    */
   2467   function eq(value, other) {
   2468     return value === other || (value !== value && other !== other);
   2469   }
   2470 
   2471   /**
   2472    * Checks if `value` is likely an `arguments` object.
   2473    *
   2474    * @static
   2475    * @memberOf _
   2476    * @since 0.1.0
   2477    * @category Lang
   2478    * @param {*} value The value to check.
   2479    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
   2480    *  else `false`.
   2481    * @example
   2482    *
   2483    * _.isArguments(function() { return arguments; }());
   2484    * // => true
   2485    *
   2486    * _.isArguments([1, 2, 3]);
   2487    * // => false
   2488    */
   2489   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
   2490     return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
   2491       !propertyIsEnumerable.call(value, 'callee');
   2492   };
   2493 
   2494   /**
   2495    * Checks if `value` is classified as an `Array` object.
   2496    *
   2497    * @static
   2498    * @memberOf _
   2499    * @since 0.1.0
   2500    * @category Lang
   2501    * @param {*} value The value to check.
   2502    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
   2503    * @example
   2504    *
   2505    * _.isArray([1, 2, 3]);
   2506    * // => true
   2507    *
   2508    * _.isArray(document.body.children);
   2509    * // => false
   2510    *
   2511    * _.isArray('abc');
   2512    * // => false
   2513    *
   2514    * _.isArray(_.noop);
   2515    * // => false
   2516    */
   2517   var isArray = Array.isArray;
   2518 
   2519   /**
   2520    * Checks if `value` is array-like. A value is considered array-like if it's
   2521    * not a function and has a `value.length` that's an integer greater than or
   2522    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
   2523    *
   2524    * @static
   2525    * @memberOf _
   2526    * @since 4.0.0
   2527    * @category Lang
   2528    * @param {*} value The value to check.
   2529    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
   2530    * @example
   2531    *
   2532    * _.isArrayLike([1, 2, 3]);
   2533    * // => true
   2534    *
   2535    * _.isArrayLike(document.body.children);
   2536    * // => true
   2537    *
   2538    * _.isArrayLike('abc');
   2539    * // => true
   2540    *
   2541    * _.isArrayLike(_.noop);
   2542    * // => false
   2543    */
   2544   function isArrayLike(value) {
   2545     return value != null && isLength(value.length) && !isFunction(value);
   2546   }
   2547 
   2548   /**
   2549    * Checks if `value` is classified as a boolean primitive or object.
   2550    *
   2551    * @static
   2552    * @memberOf _
   2553    * @since 0.1.0
   2554    * @category Lang
   2555    * @param {*} value The value to check.
   2556    * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
   2557    * @example
   2558    *
   2559    * _.isBoolean(false);
   2560    * // => true
   2561    *
   2562    * _.isBoolean(null);
   2563    * // => false
   2564    */
   2565   function isBoolean(value) {
   2566     return value === true || value === false ||
   2567       (isObjectLike(value) && baseGetTag(value) == boolTag);
   2568   }
   2569 
   2570   /**
   2571    * Checks if `value` is classified as a `Date` object.
   2572    *
   2573    * @static
   2574    * @memberOf _
   2575    * @since 0.1.0
   2576    * @category Lang
   2577    * @param {*} value The value to check.
   2578    * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
   2579    * @example
   2580    *
   2581    * _.isDate(new Date);
   2582    * // => true
   2583    *
   2584    * _.isDate('Mon April 23 2012');
   2585    * // => false
   2586    */
   2587   var isDate = baseIsDate;
   2588 
   2589   /**
   2590    * Checks if `value` is an empty object, collection, map, or set.
   2591    *
   2592    * Objects are considered empty if they have no own enumerable string keyed
   2593    * properties.
   2594    *
   2595    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
   2596    * jQuery-like collections are considered empty if they have a `length` of `0`.
   2597    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
   2598    *
   2599    * @static
   2600    * @memberOf _
   2601    * @since 0.1.0
   2602    * @category Lang
   2603    * @param {*} value The value to check.
   2604    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
   2605    * @example
   2606    *
   2607    * _.isEmpty(null);
   2608    * // => true
   2609    *
   2610    * _.isEmpty(true);
   2611    * // => true
   2612    *
   2613    * _.isEmpty(1);
   2614    * // => true
   2615    *
   2616    * _.isEmpty([1, 2, 3]);
   2617    * // => false
   2618    *
   2619    * _.isEmpty({ 'a': 1 });
   2620    * // => false
   2621    */
   2622   function isEmpty(value) {
   2623     if (isArrayLike(value) &&
   2624         (isArray(value) || isString(value) ||
   2625           isFunction(value.splice) || isArguments(value))) {
   2626       return !value.length;
   2627     }
   2628     return !nativeKeys(value).length;
   2629   }
   2630 
   2631   /**
   2632    * Performs a deep comparison between two values to determine if they are
   2633    * equivalent.
   2634    *
   2635    * **Note:** This method supports comparing arrays, array buffers, booleans,
   2636    * date objects, error objects, maps, numbers, `Object` objects, regexes,
   2637    * sets, strings, symbols, and typed arrays. `Object` objects are compared
   2638    * by their own, not inherited, enumerable properties. Functions and DOM
   2639    * nodes are compared by strict equality, i.e. `===`.
   2640    *
   2641    * @static
   2642    * @memberOf _
   2643    * @since 0.1.0
   2644    * @category Lang
   2645    * @param {*} value The value to compare.
   2646    * @param {*} other The other value to compare.
   2647    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   2648    * @example
   2649    *
   2650    * var object = { 'a': 1 };
   2651    * var other = { 'a': 1 };
   2652    *
   2653    * _.isEqual(object, other);
   2654    * // => true
   2655    *
   2656    * object === other;
   2657    * // => false
   2658    */
   2659   function isEqual(value, other) {
   2660     return baseIsEqual(value, other);
   2661   }
   2662 
   2663   /**
   2664    * Checks if `value` is a finite primitive number.
   2665    *
   2666    * **Note:** This method is based on
   2667    * [`Number.isFinite`](https://mdn.io/Number/isFinite).
   2668    *
   2669    * @static
   2670    * @memberOf _
   2671    * @since 0.1.0
   2672    * @category Lang
   2673    * @param {*} value The value to check.
   2674    * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
   2675    * @example
   2676    *
   2677    * _.isFinite(3);
   2678    * // => true
   2679    *
   2680    * _.isFinite(Number.MIN_VALUE);
   2681    * // => true
   2682    *
   2683    * _.isFinite(Infinity);
   2684    * // => false
   2685    *
   2686    * _.isFinite('3');
   2687    * // => false
   2688    */
   2689   function isFinite(value) {
   2690     return typeof value == 'number' && nativeIsFinite(value);
   2691   }
   2692 
   2693   /**
   2694    * Checks if `value` is classified as a `Function` object.
   2695    *
   2696    * @static
   2697    * @memberOf _
   2698    * @since 0.1.0
   2699    * @category Lang
   2700    * @param {*} value The value to check.
   2701    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
   2702    * @example
   2703    *
   2704    * _.isFunction(_);
   2705    * // => true
   2706    *
   2707    * _.isFunction(/abc/);
   2708    * // => false
   2709    */
   2710   function isFunction(value) {
   2711     if (!isObject(value)) {
   2712       return false;
   2713     }
   2714     // The use of `Object#toString` avoids issues with the `typeof` operator
   2715     // in Safari 9 which returns 'object' for typed arrays and other constructors.
   2716     var tag = baseGetTag(value);
   2717     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
   2718   }
   2719 
   2720   /**
   2721    * Checks if `value` is a valid array-like length.
   2722    *
   2723    * **Note:** This method is loosely based on
   2724    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
   2725    *
   2726    * @static
   2727    * @memberOf _
   2728    * @since 4.0.0
   2729    * @category Lang
   2730    * @param {*} value The value to check.
   2731    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
   2732    * @example
   2733    *
   2734    * _.isLength(3);
   2735    * // => true
   2736    *
   2737    * _.isLength(Number.MIN_VALUE);
   2738    * // => false
   2739    *
   2740    * _.isLength(Infinity);
   2741    * // => false
   2742    *
   2743    * _.isLength('3');
   2744    * // => false
   2745    */
   2746   function isLength(value) {
   2747     return typeof value == 'number' &&
   2748       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
   2749   }
   2750 
   2751   /**
   2752    * Checks if `value` is the
   2753    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
   2754    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
   2755    *
   2756    * @static
   2757    * @memberOf _
   2758    * @since 0.1.0
   2759    * @category Lang
   2760    * @param {*} value The value to check.
   2761    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
   2762    * @example
   2763    *
   2764    * _.isObject({});
   2765    * // => true
   2766    *
   2767    * _.isObject([1, 2, 3]);
   2768    * // => true
   2769    *
   2770    * _.isObject(_.noop);
   2771    * // => true
   2772    *
   2773    * _.isObject(null);
   2774    * // => false
   2775    */
   2776   function isObject(value) {
   2777     var type = typeof value;
   2778     return value != null && (type == 'object' || type == 'function');
   2779   }
   2780 
   2781   /**
   2782    * Checks if `value` is object-like. A value is object-like if it's not `null`
   2783    * and has a `typeof` result of "object".
   2784    *
   2785    * @static
   2786    * @memberOf _
   2787    * @since 4.0.0
   2788    * @category Lang
   2789    * @param {*} value The value to check.
   2790    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
   2791    * @example
   2792    *
   2793    * _.isObjectLike({});
   2794    * // => true
   2795    *
   2796    * _.isObjectLike([1, 2, 3]);
   2797    * // => true
   2798    *
   2799    * _.isObjectLike(_.noop);
   2800    * // => false
   2801    *
   2802    * _.isObjectLike(null);
   2803    * // => false
   2804    */
   2805   function isObjectLike(value) {
   2806     return value != null && typeof value == 'object';
   2807   }
   2808 
   2809   /**
   2810    * Checks if `value` is `NaN`.
   2811    *
   2812    * **Note:** This method is based on
   2813    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
   2814    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
   2815    * `undefined` and other non-number values.
   2816    *
   2817    * @static
   2818    * @memberOf _
   2819    * @since 0.1.0
   2820    * @category Lang
   2821    * @param {*} value The value to check.
   2822    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
   2823    * @example
   2824    *
   2825    * _.isNaN(NaN);
   2826    * // => true
   2827    *
   2828    * _.isNaN(new Number(NaN));
   2829    * // => true
   2830    *
   2831    * isNaN(undefined);
   2832    * // => true
   2833    *
   2834    * _.isNaN(undefined);
   2835    * // => false
   2836    */
   2837   function isNaN(value) {
   2838     // An `NaN` primitive is the only value that is not equal to itself.
   2839     // Perform the `toStringTag` check first to avoid errors with some
   2840     // ActiveX objects in IE.
   2841     return isNumber(value) && value != +value;
   2842   }
   2843 
   2844   /**
   2845    * Checks if `value` is `null`.
   2846    *
   2847    * @static
   2848    * @memberOf _
   2849    * @since 0.1.0
   2850    * @category Lang
   2851    * @param {*} value The value to check.
   2852    * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
   2853    * @example
   2854    *
   2855    * _.isNull(null);
   2856    * // => true
   2857    *
   2858    * _.isNull(void 0);
   2859    * // => false
   2860    */
   2861   function isNull(value) {
   2862     return value === null;
   2863   }
   2864 
   2865   /**
   2866    * Checks if `value` is classified as a `Number` primitive or object.
   2867    *
   2868    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
   2869    * classified as numbers, use the `_.isFinite` method.
   2870    *
   2871    * @static
   2872    * @memberOf _
   2873    * @since 0.1.0
   2874    * @category Lang
   2875    * @param {*} value The value to check.
   2876    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
   2877    * @example
   2878    *
   2879    * _.isNumber(3);
   2880    * // => true
   2881    *
   2882    * _.isNumber(Number.MIN_VALUE);
   2883    * // => true
   2884    *
   2885    * _.isNumber(Infinity);
   2886    * // => true
   2887    *
   2888    * _.isNumber('3');
   2889    * // => false
   2890    */
   2891   function isNumber(value) {
   2892     return typeof value == 'number' ||
   2893       (isObjectLike(value) && baseGetTag(value) == numberTag);
   2894   }
   2895 
   2896   /**
   2897    * Checks if `value` is classified as a `RegExp` object.
   2898    *
   2899    * @static
   2900    * @memberOf _
   2901    * @since 0.1.0
   2902    * @category Lang
   2903    * @param {*} value The value to check.
   2904    * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
   2905    * @example
   2906    *
   2907    * _.isRegExp(/abc/);
   2908    * // => true
   2909    *
   2910    * _.isRegExp('/abc/');
   2911    * // => false
   2912    */
   2913   var isRegExp = baseIsRegExp;
   2914 
   2915   /**
   2916    * Checks if `value` is classified as a `String` primitive or object.
   2917    *
   2918    * @static
   2919    * @since 0.1.0
   2920    * @memberOf _
   2921    * @category Lang
   2922    * @param {*} value The value to check.
   2923    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
   2924    * @example
   2925    *
   2926    * _.isString('abc');
   2927    * // => true
   2928    *
   2929    * _.isString(1);
   2930    * // => false
   2931    */
   2932   function isString(value) {
   2933     return typeof value == 'string' ||
   2934       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
   2935   }
   2936 
   2937   /**
   2938    * Checks if `value` is `undefined`.
   2939    *
   2940    * @static
   2941    * @since 0.1.0
   2942    * @memberOf _
   2943    * @category Lang
   2944    * @param {*} value The value to check.
   2945    * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
   2946    * @example
   2947    *
   2948    * _.isUndefined(void 0);
   2949    * // => true
   2950    *
   2951    * _.isUndefined(null);
   2952    * // => false
   2953    */
   2954   function isUndefined(value) {
   2955     return value === undefined;
   2956   }
   2957 
   2958   /**
   2959    * Converts `value` to an array.
   2960    *
   2961    * @static
   2962    * @since 0.1.0
   2963    * @memberOf _
   2964    * @category Lang
   2965    * @param {*} value The value to convert.
   2966    * @returns {Array} Returns the converted array.
   2967    * @example
   2968    *
   2969    * _.toArray({ 'a': 1, 'b': 2 });
   2970    * // => [1, 2]
   2971    *
   2972    * _.toArray('abc');
   2973    * // => ['a', 'b', 'c']
   2974    *
   2975    * _.toArray(1);
   2976    * // => []
   2977    *
   2978    * _.toArray(null);
   2979    * // => []
   2980    */
   2981   function toArray(value) {
   2982     if (!isArrayLike(value)) {
   2983       return values(value);
   2984     }
   2985     return value.length ? copyArray(value) : [];
   2986   }
   2987 
   2988   /**
   2989    * Converts `value` to an integer.
   2990    *
   2991    * **Note:** This method is loosely based on
   2992    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
   2993    *
   2994    * @static
   2995    * @memberOf _
   2996    * @since 4.0.0
   2997    * @category Lang
   2998    * @param {*} value The value to convert.
   2999    * @returns {number} Returns the converted integer.
   3000    * @example
   3001    *
   3002    * _.toInteger(3.2);
   3003    * // => 3
   3004    *
   3005    * _.toInteger(Number.MIN_VALUE);
   3006    * // => 0
   3007    *
   3008    * _.toInteger(Infinity);
   3009    * // => 1.7976931348623157e+308
   3010    *
   3011    * _.toInteger('3.2');
   3012    * // => 3
   3013    */
   3014   var toInteger = Number;
   3015 
   3016   /**
   3017    * Converts `value` to a number.
   3018    *
   3019    * @static
   3020    * @memberOf _
   3021    * @since 4.0.0
   3022    * @category Lang
   3023    * @param {*} value The value to process.
   3024    * @returns {number} Returns the number.
   3025    * @example
   3026    *
   3027    * _.toNumber(3.2);
   3028    * // => 3.2
   3029    *
   3030    * _.toNumber(Number.MIN_VALUE);
   3031    * // => 5e-324
   3032    *
   3033    * _.toNumber(Infinity);
   3034    * // => Infinity
   3035    *
   3036    * _.toNumber('3.2');
   3037    * // => 3.2
   3038    */
   3039   var toNumber = Number;
   3040 
   3041   /**
   3042    * Converts `value` to a string. An empty string is returned for `null`
   3043    * and `undefined` values. The sign of `-0` is preserved.
   3044    *
   3045    * @static
   3046    * @memberOf _
   3047    * @since 4.0.0
   3048    * @category Lang
   3049    * @param {*} value The value to convert.
   3050    * @returns {string} Returns the converted string.
   3051    * @example
   3052    *
   3053    * _.toString(null);
   3054    * // => ''
   3055    *
   3056    * _.toString(-0);
   3057    * // => '-0'
   3058    *
   3059    * _.toString([1, 2, 3]);
   3060    * // => '1,2,3'
   3061    */
   3062   function toString(value) {
   3063     if (typeof value == 'string') {
   3064       return value;
   3065     }
   3066     return value == null ? '' : (value + '');
   3067   }
   3068 
   3069   /*------------------------------------------------------------------------*/
   3070 
   3071   /**
   3072    * Assigns own enumerable string keyed properties of source objects to the
   3073    * destination object. Source objects are applied from left to right.
   3074    * Subsequent sources overwrite property assignments of previous sources.
   3075    *
   3076    * **Note:** This method mutates `object` and is loosely based on
   3077    * [`Object.assign`](https://mdn.io/Object/assign).
   3078    *
   3079    * @static
   3080    * @memberOf _
   3081    * @since 0.10.0
   3082    * @category Object
   3083    * @param {Object} object The destination object.
   3084    * @param {...Object} [sources] The source objects.
   3085    * @returns {Object} Returns `object`.
   3086    * @see _.assignIn
   3087    * @example
   3088    *
   3089    * function Foo() {
   3090    *   this.a = 1;
   3091    * }
   3092    *
   3093    * function Bar() {
   3094    *   this.c = 3;
   3095    * }
   3096    *
   3097    * Foo.prototype.b = 2;
   3098    * Bar.prototype.d = 4;
   3099    *
   3100    * _.assign({ 'a': 0 }, new Foo, new Bar);
   3101    * // => { 'a': 1, 'c': 3 }
   3102    */
   3103   var assign = createAssigner(function(object, source) {
   3104     copyObject(source, nativeKeys(source), object);
   3105   });
   3106 
   3107   /**
   3108    * This method is like `_.assign` except that it iterates over own and
   3109    * inherited source properties.
   3110    *
   3111    * **Note:** This method mutates `object`.
   3112    *
   3113    * @static
   3114    * @memberOf _
   3115    * @since 4.0.0
   3116    * @alias extend
   3117    * @category Object
   3118    * @param {Object} object The destination object.
   3119    * @param {...Object} [sources] The source objects.
   3120    * @returns {Object} Returns `object`.
   3121    * @see _.assign
   3122    * @example
   3123    *
   3124    * function Foo() {
   3125    *   this.a = 1;
   3126    * }
   3127    *
   3128    * function Bar() {
   3129    *   this.c = 3;
   3130    * }
   3131    *
   3132    * Foo.prototype.b = 2;
   3133    * Bar.prototype.d = 4;
   3134    *
   3135    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
   3136    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
   3137    */
   3138   var assignIn = createAssigner(function(object, source) {
   3139     copyObject(source, nativeKeysIn(source), object);
   3140   });
   3141 
   3142   /**
   3143    * Creates an object that inherits from the `prototype` object. If a
   3144    * `properties` object is given, its own enumerable string keyed properties
   3145    * are assigned to the created object.
   3146    *
   3147    * @static
   3148    * @memberOf _
   3149    * @since 2.3.0
   3150    * @category Object
   3151    * @param {Object} prototype The object to inherit from.
   3152    * @param {Object} [properties] The properties to assign to the object.
   3153    * @returns {Object} Returns the new object.
   3154    * @example
   3155    *
   3156    * function Shape() {
   3157    *   this.x = 0;
   3158    *   this.y = 0;
   3159    * }
   3160    *
   3161    * function Circle() {
   3162    *   Shape.call(this);
   3163    * }
   3164    *
   3165    * Circle.prototype = _.create(Shape.prototype, {
   3166    *   'constructor': Circle
   3167    * });
   3168    *
   3169    * var circle = new Circle;
   3170    * circle instanceof Circle;
   3171    * // => true
   3172    *
   3173    * circle instanceof Shape;
   3174    * // => true
   3175    */
   3176   function create(prototype, properties) {
   3177     var result = baseCreate(prototype);
   3178     return properties == null ? result : assign(result, properties);
   3179   }
   3180 
   3181   /**
   3182    * Assigns own and inherited enumerable string keyed properties of source
   3183    * objects to the destination object for all destination properties that
   3184    * resolve to `undefined`. Source objects are applied from left to right.
   3185    * Once a property is set, additional values of the same property are ignored.
   3186    *
   3187    * **Note:** This method mutates `object`.
   3188    *
   3189    * @static
   3190    * @since 0.1.0
   3191    * @memberOf _
   3192    * @category Object
   3193    * @param {Object} object The destination object.
   3194    * @param {...Object} [sources] The source objects.
   3195    * @returns {Object} Returns `object`.
   3196    * @see _.defaultsDeep
   3197    * @example
   3198    *
   3199    * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
   3200    * // => { 'a': 1, 'b': 2 }
   3201    */
   3202   var defaults = baseRest(function(object, sources) {
   3203     object = Object(object);
   3204 
   3205     var index = -1;
   3206     var length = sources.length;
   3207     var guard = length > 2 ? sources[2] : undefined;
   3208 
   3209     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
   3210       length = 1;
   3211     }
   3212 
   3213     while (++index < length) {
   3214       var source = sources[index];
   3215       var props = keysIn(source);
   3216       var propsIndex = -1;
   3217       var propsLength = props.length;
   3218 
   3219       while (++propsIndex < propsLength) {
   3220         var key = props[propsIndex];
   3221         var value = object[key];
   3222 
   3223         if (value === undefined ||
   3224             (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
   3225           object[key] = source[key];
   3226         }
   3227       }
   3228     }
   3229 
   3230     return object;
   3231   });
   3232 
   3233   /**
   3234    * Checks if `path` is a direct property of `object`.
   3235    *
   3236    * @static
   3237    * @since 0.1.0
   3238    * @memberOf _
   3239    * @category Object
   3240    * @param {Object} object The object to query.
   3241    * @param {Array|string} path The path to check.
   3242    * @returns {boolean} Returns `true` if `path` exists, else `false`.
   3243    * @example
   3244    *
   3245    * var object = { 'a': { 'b': 2 } };
   3246    * var other = _.create({ 'a': _.create({ 'b': 2 }) });
   3247    *
   3248    * _.has(object, 'a');
   3249    * // => true
   3250    *
   3251    * _.has(object, 'a.b');
   3252    * // => true
   3253    *
   3254    * _.has(object, ['a', 'b']);
   3255    * // => true
   3256    *
   3257    * _.has(other, 'a');
   3258    * // => false
   3259    */
   3260   function has(object, path) {
   3261     return object != null && hasOwnProperty.call(object, path);
   3262   }
   3263 
   3264   /**
   3265    * Creates an array of the own enumerable property names of `object`.
   3266    *
   3267    * **Note:** Non-object values are coerced to objects. See the
   3268    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
   3269    * for more details.
   3270    *
   3271    * @static
   3272    * @since 0.1.0
   3273    * @memberOf _
   3274    * @category Object
   3275    * @param {Object} object The object to query.
   3276    * @returns {Array} Returns the array of property names.
   3277    * @example
   3278    *
   3279    * function Foo() {
   3280    *   this.a = 1;
   3281    *   this.b = 2;
   3282    * }
   3283    *
   3284    * Foo.prototype.c = 3;
   3285    *
   3286    * _.keys(new Foo);
   3287    * // => ['a', 'b'] (iteration order is not guaranteed)
   3288    *
   3289    * _.keys('hi');
   3290    * // => ['0', '1']
   3291    */
   3292   var keys = nativeKeys;
   3293 
   3294   /**
   3295    * Creates an array of the own and inherited enumerable property names of `object`.
   3296    *
   3297    * **Note:** Non-object values are coerced to objects.
   3298    *
   3299    * @static
   3300    * @memberOf _
   3301    * @since 3.0.0
   3302    * @category Object
   3303    * @param {Object} object The object to query.
   3304    * @returns {Array} Returns the array of property names.
   3305    * @example
   3306    *
   3307    * function Foo() {
   3308    *   this.a = 1;
   3309    *   this.b = 2;
   3310    * }
   3311    *
   3312    * Foo.prototype.c = 3;
   3313    *
   3314    * _.keysIn(new Foo);
   3315    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
   3316    */
   3317   var keysIn = nativeKeysIn;
   3318 
   3319   /**
   3320    * Creates an object composed of the picked `object` properties.
   3321    *
   3322    * @static
   3323    * @since 0.1.0
   3324    * @memberOf _
   3325    * @category Object
   3326    * @param {Object} object The source object.
   3327    * @param {...(string|string[])} [paths] The property paths to pick.
   3328    * @returns {Object} Returns the new object.
   3329    * @example
   3330    *
   3331    * var object = { 'a': 1, 'b': '2', 'c': 3 };
   3332    *
   3333    * _.pick(object, ['a', 'c']);
   3334    * // => { 'a': 1, 'c': 3 }
   3335    */
   3336   var pick = flatRest(function(object, paths) {
   3337     return object == null ? {} : basePick(object, paths);
   3338   });
   3339 
   3340   /**
   3341    * This method is like `_.get` except that if the resolved value is a
   3342    * function it's invoked with the `this` binding of its parent object and
   3343    * its result is returned.
   3344    *
   3345    * @static
   3346    * @since 0.1.0
   3347    * @memberOf _
   3348    * @category Object
   3349    * @param {Object} object The object to query.
   3350    * @param {Array|string} path The path of the property to resolve.
   3351    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
   3352    * @returns {*} Returns the resolved value.
   3353    * @example
   3354    *
   3355    * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
   3356    *
   3357    * _.result(object, 'a[0].b.c1');
   3358    * // => 3
   3359    *
   3360    * _.result(object, 'a[0].b.c2');
   3361    * // => 4
   3362    *
   3363    * _.result(object, 'a[0].b.c3', 'default');
   3364    * // => 'default'
   3365    *
   3366    * _.result(object, 'a[0].b.c3', _.constant('default'));
   3367    * // => 'default'
   3368    */
   3369   function result(object, path, defaultValue) {
   3370     var value = object == null ? undefined : object[path];
   3371     if (value === undefined) {
   3372       value = defaultValue;
   3373     }
   3374     return isFunction(value) ? value.call(object) : value;
   3375   }
   3376 
   3377   /**
   3378    * Creates an array of the own enumerable string keyed property values of `object`.
   3379    *
   3380    * **Note:** Non-object values are coerced to objects.
   3381    *
   3382    * @static
   3383    * @since 0.1.0
   3384    * @memberOf _
   3385    * @category Object
   3386    * @param {Object} object The object to query.
   3387    * @returns {Array} Returns the array of property values.
   3388    * @example
   3389    *
   3390    * function Foo() {
   3391    *   this.a = 1;
   3392    *   this.b = 2;
   3393    * }
   3394    *
   3395    * Foo.prototype.c = 3;
   3396    *
   3397    * _.values(new Foo);
   3398    * // => [1, 2] (iteration order is not guaranteed)
   3399    *
   3400    * _.values('hi');
   3401    * // => ['h', 'i']
   3402    */
   3403   function values(object) {
   3404     return object == null ? [] : baseValues(object, keys(object));
   3405   }
   3406 
   3407   /*------------------------------------------------------------------------*/
   3408 
   3409   /**
   3410    * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
   3411    * corresponding HTML entities.
   3412    *
   3413    * **Note:** No other characters are escaped. To escape additional
   3414    * characters use a third-party library like [_he_](https://mths.be/he).
   3415    *
   3416    * Though the ">" character is escaped for symmetry, characters like
   3417    * ">" and "/" don't need escaping in HTML and have no special meaning
   3418    * unless they're part of a tag or unquoted attribute value. See
   3419    * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
   3420    * (under "semi-related fun fact") for more details.
   3421    *
   3422    * When working with HTML you should always
   3423    * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
   3424    * XSS vectors.
   3425    *
   3426    * @static
   3427    * @since 0.1.0
   3428    * @memberOf _
   3429    * @category String
   3430    * @param {string} [string=''] The string to escape.
   3431    * @returns {string} Returns the escaped string.
   3432    * @example
   3433    *
   3434    * _.escape('fred, barney, & pebbles');
   3435    * // => 'fred, barney, &amp; pebbles'
   3436    */
   3437   function escape(string) {
   3438     string = toString(string);
   3439     return (string && reHasUnescapedHtml.test(string))
   3440       ? string.replace(reUnescapedHtml, escapeHtmlChar)
   3441       : string;
   3442   }
   3443 
   3444   /*------------------------------------------------------------------------*/
   3445 
   3446   /**
   3447    * This method returns the first argument it receives.
   3448    *
   3449    * @static
   3450    * @since 0.1.0
   3451    * @memberOf _
   3452    * @category Util
   3453    * @param {*} value Any value.
   3454    * @returns {*} Returns `value`.
   3455    * @example
   3456    *
   3457    * var object = { 'a': 1 };
   3458    *
   3459    * console.log(_.identity(object) === object);
   3460    * // => true
   3461    */
   3462   function identity(value) {
   3463     return value;
   3464   }
   3465 
   3466   /**
   3467    * Creates a function that invokes `func` with the arguments of the created
   3468    * function. If `func` is a property name, the created function returns the
   3469    * property value for a given element. If `func` is an array or object, the
   3470    * created function returns `true` for elements that contain the equivalent
   3471    * source properties, otherwise it returns `false`.
   3472    *
   3473    * @static
   3474    * @since 4.0.0
   3475    * @memberOf _
   3476    * @category Util
   3477    * @param {*} [func=_.identity] The value to convert to a callback.
   3478    * @returns {Function} Returns the callback.
   3479    * @example
   3480    *
   3481    * var users = [
   3482    *   { 'user': 'barney', 'age': 36, 'active': true },
   3483    *   { 'user': 'fred',   'age': 40, 'active': false }
   3484    * ];
   3485    *
   3486    * // The `_.matches` iteratee shorthand.
   3487    * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
   3488    * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
   3489    *
   3490    * // The `_.matchesProperty` iteratee shorthand.
   3491    * _.filter(users, _.iteratee(['user', 'fred']));
   3492    * // => [{ 'user': 'fred', 'age': 40 }]
   3493    *
   3494    * // The `_.property` iteratee shorthand.
   3495    * _.map(users, _.iteratee('user'));
   3496    * // => ['barney', 'fred']
   3497    *
   3498    * // Create custom iteratee shorthands.
   3499    * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
   3500    *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
   3501    *     return func.test(string);
   3502    *   };
   3503    * });
   3504    *
   3505    * _.filter(['abc', 'def'], /ef/);
   3506    * // => ['def']
   3507    */
   3508   var iteratee = baseIteratee;
   3509 
   3510   /**
   3511    * Creates a function that performs a partial deep comparison between a given
   3512    * object and `source`, returning `true` if the given object has equivalent
   3513    * property values, else `false`.
   3514    *
   3515    * **Note:** The created function is equivalent to `_.isMatch` with `source`
   3516    * partially applied.
   3517    *
   3518    * Partial comparisons will match empty array and empty object `source`
   3519    * values against any array or object value, respectively. See `_.isEqual`
   3520    * for a list of supported value comparisons.
   3521    *
   3522    * **Note:** Multiple values can be checked by combining several matchers
   3523    * using `_.overSome`
   3524    *
   3525    * @static
   3526    * @memberOf _
   3527    * @since 3.0.0
   3528    * @category Util
   3529    * @param {Object} source The object of property values to match.
   3530    * @returns {Function} Returns the new spec function.
   3531    * @example
   3532    *
   3533    * var objects = [
   3534    *   { 'a': 1, 'b': 2, 'c': 3 },
   3535    *   { 'a': 4, 'b': 5, 'c': 6 }
   3536    * ];
   3537    *
   3538    * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
   3539    * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
   3540    *
   3541    * // Checking for several possible values
   3542    * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
   3543    * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
   3544    */
   3545   function matches(source) {
   3546     return baseMatches(assign({}, source));
   3547   }
   3548 
   3549   /**
   3550    * Adds all own enumerable string keyed function properties of a source
   3551    * object to the destination object. If `object` is a function, then methods
   3552    * are added to its prototype as well.
   3553    *
   3554    * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
   3555    * avoid conflicts caused by modifying the original.
   3556    *
   3557    * @static
   3558    * @since 0.1.0
   3559    * @memberOf _
   3560    * @category Util
   3561    * @param {Function|Object} [object=lodash] The destination object.
   3562    * @param {Object} source The object of functions to add.
   3563    * @param {Object} [options={}] The options object.
   3564    * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
   3565    * @returns {Function|Object} Returns `object`.
   3566    * @example
   3567    *
   3568    * function vowels(string) {
   3569    *   return _.filter(string, function(v) {
   3570    *     return /[aeiou]/i.test(v);
   3571    *   });
   3572    * }
   3573    *
   3574    * _.mixin({ 'vowels': vowels });
   3575    * _.vowels('fred');
   3576    * // => ['e']
   3577    *
   3578    * _('fred').vowels().value();
   3579    * // => ['e']
   3580    *
   3581    * _.mixin({ 'vowels': vowels }, { 'chain': false });
   3582    * _('fred').vowels();
   3583    * // => ['e']
   3584    */
   3585   function mixin(object, source, options) {
   3586     var props = keys(source),
   3587         methodNames = baseFunctions(source, props);
   3588 
   3589     if (options == null &&
   3590         !(isObject(source) && (methodNames.length || !props.length))) {
   3591       options = source;
   3592       source = object;
   3593       object = this;
   3594       methodNames = baseFunctions(source, keys(source));
   3595     }
   3596     var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
   3597         isFunc = isFunction(object);
   3598 
   3599     baseEach(methodNames, function(methodName) {
   3600       var func = source[methodName];
   3601       object[methodName] = func;
   3602       if (isFunc) {
   3603         object.prototype[methodName] = function() {
   3604           var chainAll = this.__chain__;
   3605           if (chain || chainAll) {
   3606             var result = object(this.__wrapped__),
   3607                 actions = result.__actions__ = copyArray(this.__actions__);
   3608 
   3609             actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
   3610             result.__chain__ = chainAll;
   3611             return result;
   3612           }
   3613           return func.apply(object, arrayPush([this.value()], arguments));
   3614         };
   3615       }
   3616     });
   3617 
   3618     return object;
   3619   }
   3620 
   3621   /**
   3622    * Reverts the `_` variable to its previous value and returns a reference to
   3623    * the `lodash` function.
   3624    *
   3625    * @static
   3626    * @since 0.1.0
   3627    * @memberOf _
   3628    * @category Util
   3629    * @returns {Function} Returns the `lodash` function.
   3630    * @example
   3631    *
   3632    * var lodash = _.noConflict();
   3633    */
   3634   function noConflict() {
   3635     if (root._ === this) {
   3636       root._ = oldDash;
   3637     }
   3638     return this;
   3639   }
   3640 
   3641   /**
   3642    * This method returns `undefined`.
   3643    *
   3644    * @static
   3645    * @memberOf _
   3646    * @since 2.3.0
   3647    * @category Util
   3648    * @example
   3649    *
   3650    * _.times(2, _.noop);
   3651    * // => [undefined, undefined]
   3652    */
   3653   function noop() {
   3654     // No operation performed.
   3655   }
   3656 
   3657   /**
   3658    * Generates a unique ID. If `prefix` is given, the ID is appended to it.
   3659    *
   3660    * @static
   3661    * @since 0.1.0
   3662    * @memberOf _
   3663    * @category Util
   3664    * @param {string} [prefix=''] The value to prefix the ID with.
   3665    * @returns {string} Returns the unique ID.
   3666    * @example
   3667    *
   3668    * _.uniqueId('contact_');
   3669    * // => 'contact_104'
   3670    *
   3671    * _.uniqueId();
   3672    * // => '105'
   3673    */
   3674   function uniqueId(prefix) {
   3675     var id = ++idCounter;
   3676     return toString(prefix) + id;
   3677   }
   3678 
   3679   /*------------------------------------------------------------------------*/
   3680 
   3681   /**
   3682    * Computes the maximum value of `array`. If `array` is empty or falsey,
   3683    * `undefined` is returned.
   3684    *
   3685    * @static
   3686    * @since 0.1.0
   3687    * @memberOf _
   3688    * @category Math
   3689    * @param {Array} array The array to iterate over.
   3690    * @returns {*} Returns the maximum value.
   3691    * @example
   3692    *
   3693    * _.max([4, 2, 8, 6]);
   3694    * // => 8
   3695    *
   3696    * _.max([]);
   3697    * // => undefined
   3698    */
   3699   function max(array) {
   3700     return (array && array.length)
   3701       ? baseExtremum(array, identity, baseGt)
   3702       : undefined;
   3703   }
   3704 
   3705   /**
   3706    * Computes the minimum value of `array`. If `array` is empty or falsey,
   3707    * `undefined` is returned.
   3708    *
   3709    * @static
   3710    * @since 0.1.0
   3711    * @memberOf _
   3712    * @category Math
   3713    * @param {Array} array The array to iterate over.
   3714    * @returns {*} Returns the minimum value.
   3715    * @example
   3716    *
   3717    * _.min([4, 2, 8, 6]);
   3718    * // => 2
   3719    *
   3720    * _.min([]);
   3721    * // => undefined
   3722    */
   3723   function min(array) {
   3724     return (array && array.length)
   3725       ? baseExtremum(array, identity, baseLt)
   3726       : undefined;
   3727   }
   3728 
   3729   /*------------------------------------------------------------------------*/
   3730 
   3731   // Add methods that return wrapped values in chain sequences.
   3732   lodash.assignIn = assignIn;
   3733   lodash.before = before;
   3734   lodash.bind = bind;
   3735   lodash.chain = chain;
   3736   lodash.compact = compact;
   3737   lodash.concat = concat;
   3738   lodash.create = create;
   3739   lodash.defaults = defaults;
   3740   lodash.defer = defer;
   3741   lodash.delay = delay;
   3742   lodash.filter = filter;
   3743   lodash.flatten = flatten;
   3744   lodash.flattenDeep = flattenDeep;
   3745   lodash.iteratee = iteratee;
   3746   lodash.keys = keys;
   3747   lodash.map = map;
   3748   lodash.matches = matches;
   3749   lodash.mixin = mixin;
   3750   lodash.negate = negate;
   3751   lodash.once = once;
   3752   lodash.pick = pick;
   3753   lodash.slice = slice;
   3754   lodash.sortBy = sortBy;
   3755   lodash.tap = tap;
   3756   lodash.thru = thru;
   3757   lodash.toArray = toArray;
   3758   lodash.values = values;
   3759 
   3760   // Add aliases.
   3761   lodash.extend = assignIn;
   3762 
   3763   // Add methods to `lodash.prototype`.
   3764   mixin(lodash, lodash);
   3765 
   3766   /*------------------------------------------------------------------------*/
   3767 
   3768   // Add methods that return unwrapped values in chain sequences.
   3769   lodash.clone = clone;
   3770   lodash.escape = escape;
   3771   lodash.every = every;
   3772   lodash.find = find;
   3773   lodash.forEach = forEach;
   3774   lodash.has = has;
   3775   lodash.head = head;
   3776   lodash.identity = identity;
   3777   lodash.indexOf = indexOf;
   3778   lodash.isArguments = isArguments;
   3779   lodash.isArray = isArray;
   3780   lodash.isBoolean = isBoolean;
   3781   lodash.isDate = isDate;
   3782   lodash.isEmpty = isEmpty;
   3783   lodash.isEqual = isEqual;
   3784   lodash.isFinite = isFinite;
   3785   lodash.isFunction = isFunction;
   3786   lodash.isNaN = isNaN;
   3787   lodash.isNull = isNull;
   3788   lodash.isNumber = isNumber;
   3789   lodash.isObject = isObject;
   3790   lodash.isRegExp = isRegExp;
   3791   lodash.isString = isString;
   3792   lodash.isUndefined = isUndefined;
   3793   lodash.last = last;
   3794   lodash.max = max;
   3795   lodash.min = min;
   3796   lodash.noConflict = noConflict;
   3797   lodash.noop = noop;
   3798   lodash.reduce = reduce;
   3799   lodash.result = result;
   3800   lodash.size = size;
   3801   lodash.some = some;
   3802   lodash.uniqueId = uniqueId;
   3803 
   3804   // Add aliases.
   3805   lodash.each = forEach;
   3806   lodash.first = head;
   3807 
   3808   mixin(lodash, (function() {
   3809     var source = {};
   3810     baseForOwn(lodash, function(func, methodName) {
   3811       if (!hasOwnProperty.call(lodash.prototype, methodName)) {
   3812         source[methodName] = func;
   3813       }
   3814     });
   3815     return source;
   3816   }()), { 'chain': false });
   3817 
   3818   /*------------------------------------------------------------------------*/
   3819 
   3820   /**
   3821    * The semantic version number.
   3822    *
   3823    * @static
   3824    * @memberOf _
   3825    * @type {string}
   3826    */
   3827   lodash.VERSION = VERSION;
   3828 
   3829   // Add `Array` methods to `lodash.prototype`.
   3830   baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
   3831     var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
   3832         chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
   3833         retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
   3834 
   3835     lodash.prototype[methodName] = function() {
   3836       var args = arguments;
   3837       if (retUnwrapped && !this.__chain__) {
   3838         var value = this.value();
   3839         return func.apply(isArray(value) ? value : [], args);
   3840       }
   3841       return this[chainName](function(value) {
   3842         return func.apply(isArray(value) ? value : [], args);
   3843       });
   3844     };
   3845   });
   3846 
   3847   // Add chain sequence methods to the `lodash` wrapper.
   3848   lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
   3849 
   3850   /*--------------------------------------------------------------------------*/
   3851 
   3852   // Some AMD build optimizers, like r.js, check for condition patterns like:
   3853   if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
   3854     // Expose Lodash on the global object to prevent errors when Lodash is
   3855     // loaded by a script tag in the presence of an AMD loader.
   3856     // See http://requirejs.org/docs/errors.html#mismatch for more details.
   3857     // Use `_.noConflict` to remove Lodash from the global object.
   3858     root._ = lodash;
   3859 
   3860     // Define as an anonymous module so, through path mapping, it can be
   3861     // referenced as the "underscore" module.
   3862     define(function() {
   3863       return lodash;
   3864     });
   3865   }
   3866   // Check for `exports` after `define` in case a build optimizer adds it.
   3867   else if (freeModule) {
   3868     // Export for Node.js.
   3869     (freeModule.exports = lodash)._ = lodash;
   3870     // Export for CommonJS support.
   3871     freeExports._ = lodash;
   3872   }
   3873   else {
   3874     // Export to the global object.
   3875     root._ = lodash;
   3876   }
   3877 }.call(this));