[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/js/dist/vendor/ -> lodash.js (source)

   1  /**
   2   * @license
   3   * Lodash <https://lodash.com/>
   4   * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
   5   * Released under MIT license <https://lodash.com/license>
   6   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
   7   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
   8   */
   9  ;(function() {
  10  
  11    /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  12    var undefined;
  13  
  14    /** Used as the semantic version number. */
  15    var VERSION = '4.17.21';
  16  
  17    /** Used as the size to enable large array optimizations. */
  18    var LARGE_ARRAY_SIZE = 200;
  19  
  20    /** Error message constants. */
  21    var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
  22        FUNC_ERROR_TEXT = 'Expected a function',
  23        INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
  24  
  25    /** Used to stand-in for `undefined` hash values. */
  26    var HASH_UNDEFINED = '__lodash_hash_undefined__';
  27  
  28    /** Used as the maximum memoize cache size. */
  29    var MAX_MEMOIZE_SIZE = 500;
  30  
  31    /** Used as the internal argument placeholder. */
  32    var PLACEHOLDER = '__lodash_placeholder__';
  33  
  34    /** Used to compose bitmasks for cloning. */
  35    var CLONE_DEEP_FLAG = 1,
  36        CLONE_FLAT_FLAG = 2,
  37        CLONE_SYMBOLS_FLAG = 4;
  38  
  39    /** Used to compose bitmasks for value comparisons. */
  40    var COMPARE_PARTIAL_FLAG = 1,
  41        COMPARE_UNORDERED_FLAG = 2;
  42  
  43    /** Used to compose bitmasks for function metadata. */
  44    var WRAP_BIND_FLAG = 1,
  45        WRAP_BIND_KEY_FLAG = 2,
  46        WRAP_CURRY_BOUND_FLAG = 4,
  47        WRAP_CURRY_FLAG = 8,
  48        WRAP_CURRY_RIGHT_FLAG = 16,
  49        WRAP_PARTIAL_FLAG = 32,
  50        WRAP_PARTIAL_RIGHT_FLAG = 64,
  51        WRAP_ARY_FLAG = 128,
  52        WRAP_REARG_FLAG = 256,
  53        WRAP_FLIP_FLAG = 512;
  54  
  55    /** Used as default options for `_.truncate`. */
  56    var DEFAULT_TRUNC_LENGTH = 30,
  57        DEFAULT_TRUNC_OMISSION = '...';
  58  
  59    /** Used to detect hot functions by number of calls within a span of milliseconds. */
  60    var HOT_COUNT = 800,
  61        HOT_SPAN = 16;
  62  
  63    /** Used to indicate the type of lazy iteratees. */
  64    var LAZY_FILTER_FLAG = 1,
  65        LAZY_MAP_FLAG = 2,
  66        LAZY_WHILE_FLAG = 3;
  67  
  68    /** Used as references for various `Number` constants. */
  69    var INFINITY = 1 / 0,
  70        MAX_SAFE_INTEGER = 9007199254740991,
  71        MAX_INTEGER = 1.7976931348623157e+308,
  72        NAN = 0 / 0;
  73  
  74    /** Used as references for the maximum length and index of an array. */
  75    var MAX_ARRAY_LENGTH = 4294967295,
  76        MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
  77        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
  78  
  79    /** Used to associate wrap methods with their bit flags. */
  80    var wrapFlags = [
  81      ['ary', WRAP_ARY_FLAG],
  82      ['bind', WRAP_BIND_FLAG],
  83      ['bindKey', WRAP_BIND_KEY_FLAG],
  84      ['curry', WRAP_CURRY_FLAG],
  85      ['curryRight', WRAP_CURRY_RIGHT_FLAG],
  86      ['flip', WRAP_FLIP_FLAG],
  87      ['partial', WRAP_PARTIAL_FLAG],
  88      ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
  89      ['rearg', WRAP_REARG_FLAG]
  90    ];
  91  
  92    /** `Object#toString` result references. */
  93    var argsTag = '[object Arguments]',
  94        arrayTag = '[object Array]',
  95        asyncTag = '[object AsyncFunction]',
  96        boolTag = '[object Boolean]',
  97        dateTag = '[object Date]',
  98        domExcTag = '[object DOMException]',
  99        errorTag = '[object Error]',
 100        funcTag = '[object Function]',
 101        genTag = '[object GeneratorFunction]',
 102        mapTag = '[object Map]',
 103        numberTag = '[object Number]',
 104        nullTag = '[object Null]',
 105        objectTag = '[object Object]',
 106        promiseTag = '[object Promise]',
 107        proxyTag = '[object Proxy]',
 108        regexpTag = '[object RegExp]',
 109        setTag = '[object Set]',
 110        stringTag = '[object String]',
 111        symbolTag = '[object Symbol]',
 112        undefinedTag = '[object Undefined]',
 113        weakMapTag = '[object WeakMap]',
 114        weakSetTag = '[object WeakSet]';
 115  
 116    var arrayBufferTag = '[object ArrayBuffer]',
 117        dataViewTag = '[object DataView]',
 118        float32Tag = '[object Float32Array]',
 119        float64Tag = '[object Float64Array]',
 120        int8Tag = '[object Int8Array]',
 121        int16Tag = '[object Int16Array]',
 122        int32Tag = '[object Int32Array]',
 123        uint8Tag = '[object Uint8Array]',
 124        uint8ClampedTag = '[object Uint8ClampedArray]',
 125        uint16Tag = '[object Uint16Array]',
 126        uint32Tag = '[object Uint32Array]';
 127  
 128    /** Used to match empty string literals in compiled template source. */
 129    var reEmptyStringLeading = /\b__p \+= '';/g,
 130        reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
 131        reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
 132  
 133    /** Used to match HTML entities and HTML characters. */
 134    var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
 135        reUnescapedHtml = /[&<>"']/g,
 136        reHasEscapedHtml = RegExp(reEscapedHtml.source),
 137        reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
 138  
 139    /** Used to match template delimiters. */
 140    var reEscape = /<%-([\s\S]+?)%>/g,
 141        reEvaluate = /<%([\s\S]+?)%>/g,
 142        reInterpolate = /<%=([\s\S]+?)%>/g;
 143  
 144    /** Used to match property names within property paths. */
 145    var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
 146        reIsPlainProp = /^\w*$/,
 147        rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
 148  
 149    /**
 150     * Used to match `RegExp`
 151     * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 152     */
 153    var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
 154        reHasRegExpChar = RegExp(reRegExpChar.source);
 155  
 156    /** Used to match leading whitespace. */
 157    var reTrimStart = /^\s+/;
 158  
 159    /** Used to match a single whitespace character. */
 160    var reWhitespace = /\s/;
 161  
 162    /** Used to match wrap detail comments. */
 163    var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
 164        reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
 165        reSplitDetails = /,? & /;
 166  
 167    /** Used to match words composed of alphanumeric characters. */
 168    var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
 169  
 170    /**
 171     * Used to validate the `validate` option in `_.template` variable.
 172     *
 173     * Forbids characters which could potentially change the meaning of the function argument definition:
 174     * - "()," (modification of function parameters)
 175     * - "=" (default value)
 176     * - "[]{}" (destructuring of function parameters)
 177     * - "/" (beginning of a comment)
 178     * - whitespace
 179     */
 180    var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
 181  
 182    /** Used to match backslashes in property paths. */
 183    var reEscapeChar = /\\(\\)?/g;
 184  
 185    /**
 186     * Used to match
 187     * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
 188     */
 189    var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
 190  
 191    /** Used to match `RegExp` flags from their coerced string values. */
 192    var reFlags = /\w*$/;
 193  
 194    /** Used to detect bad signed hexadecimal string values. */
 195    var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
 196  
 197    /** Used to detect binary string values. */
 198    var reIsBinary = /^0b[01]+$/i;
 199  
 200    /** Used to detect host constructors (Safari). */
 201    var reIsHostCtor = /^\[object .+?Constructor\]$/;
 202  
 203    /** Used to detect octal string values. */
 204    var reIsOctal = /^0o[0-7]+$/i;
 205  
 206    /** Used to detect unsigned integer values. */
 207    var reIsUint = /^(?:0|[1-9]\d*)$/;
 208  
 209    /** Used to match Latin Unicode letters (excluding mathematical operators). */
 210    var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
 211  
 212    /** Used to ensure capturing order of template delimiters. */
 213    var reNoMatch = /($^)/;
 214  
 215    /** Used to match unescaped characters in compiled string literals. */
 216    var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
 217  
 218    /** Used to compose unicode character classes. */
 219    var rsAstralRange = '\\ud800-\\udfff',
 220        rsComboMarksRange = '\\u0300-\\u036f',
 221        reComboHalfMarksRange = '\\ufe20-\\ufe2f',
 222        rsComboSymbolsRange = '\\u20d0-\\u20ff',
 223        rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
 224        rsDingbatRange = '\\u2700-\\u27bf',
 225        rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
 226        rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
 227        rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
 228        rsPunctuationRange = '\\u2000-\\u206f',
 229        rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
 230        rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
 231        rsVarRange = '\\ufe0e\\ufe0f',
 232        rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
 233  
 234    /** Used to compose unicode capture groups. */
 235    var rsApos = "['\u2019]",
 236        rsAstral = '[' + rsAstralRange + ']',
 237        rsBreak = '[' + rsBreakRange + ']',
 238        rsCombo = '[' + rsComboRange + ']',
 239        rsDigits = '\\d+',
 240        rsDingbat = '[' + rsDingbatRange + ']',
 241        rsLower = '[' + rsLowerRange + ']',
 242        rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
 243        rsFitz = '\\ud83c[\\udffb-\\udfff]',
 244        rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
 245        rsNonAstral = '[^' + rsAstralRange + ']',
 246        rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
 247        rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
 248        rsUpper = '[' + rsUpperRange + ']',
 249        rsZWJ = '\\u200d';
 250  
 251    /** Used to compose unicode regexes. */
 252    var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
 253        rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
 254        rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
 255        rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
 256        reOptMod = rsModifier + '?',
 257        rsOptVar = '[' + rsVarRange + ']?',
 258        rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
 259        rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
 260        rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
 261        rsSeq = rsOptVar + reOptMod + rsOptJoin,
 262        rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
 263        rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
 264  
 265    /** Used to match apostrophes. */
 266    var reApos = RegExp(rsApos, 'g');
 267  
 268    /**
 269     * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
 270     * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
 271     */
 272    var reComboMark = RegExp(rsCombo, 'g');
 273  
 274    /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
 275    var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
 276  
 277    /** Used to match complex or compound words. */
 278    var reUnicodeWord = RegExp([
 279      rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
 280      rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
 281      rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
 282      rsUpper + '+' + rsOptContrUpper,
 283      rsOrdUpper,
 284      rsOrdLower,
 285      rsDigits,
 286      rsEmoji
 287    ].join('|'), 'g');
 288  
 289    /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
 290    var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
 291  
 292    /** Used to detect strings that need a more robust regexp to match words. */
 293    var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
 294  
 295    /** Used to assign default `context` object properties. */
 296    var contextProps = [
 297      'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
 298      'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
 299      'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
 300      'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
 301      '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
 302    ];
 303  
 304    /** Used to make template sourceURLs easier to identify. */
 305    var templateCounter = -1;
 306  
 307    /** Used to identify `toStringTag` values of typed arrays. */
 308    var typedArrayTags = {};
 309    typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
 310    typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
 311    typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
 312    typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
 313    typedArrayTags[uint32Tag] = true;
 314    typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
 315    typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
 316    typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
 317    typedArrayTags[errorTag] = typedArrayTags[funcTag] =
 318    typedArrayTags[mapTag] = typedArrayTags[numberTag] =
 319    typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
 320    typedArrayTags[setTag] = typedArrayTags[stringTag] =
 321    typedArrayTags[weakMapTag] = false;
 322  
 323    /** Used to identify `toStringTag` values supported by `_.clone`. */
 324    var cloneableTags = {};
 325    cloneableTags[argsTag] = cloneableTags[arrayTag] =
 326    cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
 327    cloneableTags[boolTag] = cloneableTags[dateTag] =
 328    cloneableTags[float32Tag] = cloneableTags[float64Tag] =
 329    cloneableTags[int8Tag] = cloneableTags[int16Tag] =
 330    cloneableTags[int32Tag] = cloneableTags[mapTag] =
 331    cloneableTags[numberTag] = cloneableTags[objectTag] =
 332    cloneableTags[regexpTag] = cloneableTags[setTag] =
 333    cloneableTags[stringTag] = cloneableTags[symbolTag] =
 334    cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
 335    cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
 336    cloneableTags[errorTag] = cloneableTags[funcTag] =
 337    cloneableTags[weakMapTag] = false;
 338  
 339    /** Used to map Latin Unicode letters to basic Latin letters. */
 340    var deburredLetters = {
 341      // Latin-1 Supplement block.
 342      '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
 343      '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
 344      '\xc7': 'C',  '\xe7': 'c',
 345      '\xd0': 'D',  '\xf0': 'd',
 346      '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
 347      '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
 348      '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
 349      '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
 350      '\xd1': 'N',  '\xf1': 'n',
 351      '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
 352      '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
 353      '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
 354      '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
 355      '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
 356      '\xc6': 'Ae', '\xe6': 'ae',
 357      '\xde': 'Th', '\xfe': 'th',
 358      '\xdf': 'ss',
 359      // Latin Extended-A block.
 360      '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
 361      '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
 362      '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
 363      '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
 364      '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
 365      '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
 366      '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
 367      '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
 368      '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
 369      '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
 370      '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
 371      '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
 372      '\u0134': 'J',  '\u0135': 'j',
 373      '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
 374      '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
 375      '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
 376      '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
 377      '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
 378      '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
 379      '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
 380      '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
 381      '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
 382      '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
 383      '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
 384      '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
 385      '\u0163': 't',  '\u0165': 't', '\u0167': 't',
 386      '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
 387      '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
 388      '\u0174': 'W',  '\u0175': 'w',
 389      '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
 390      '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
 391      '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
 392      '\u0132': 'IJ', '\u0133': 'ij',
 393      '\u0152': 'Oe', '\u0153': 'oe',
 394      '\u0149': "'n", '\u017f': 's'
 395    };
 396  
 397    /** Used to map characters to HTML entities. */
 398    var htmlEscapes = {
 399      '&': '&amp;',
 400      '<': '&lt;',
 401      '>': '&gt;',
 402      '"': '&quot;',
 403      "'": '&#39;'
 404    };
 405  
 406    /** Used to map HTML entities to characters. */
 407    var htmlUnescapes = {
 408      '&amp;': '&',
 409      '&lt;': '<',
 410      '&gt;': '>',
 411      '&quot;': '"',
 412      '&#39;': "'"
 413    };
 414  
 415    /** Used to escape characters for inclusion in compiled string literals. */
 416    var stringEscapes = {
 417      '\\': '\\',
 418      "'": "'",
 419      '\n': 'n',
 420      '\r': 'r',
 421      '\u2028': 'u2028',
 422      '\u2029': 'u2029'
 423    };
 424  
 425    /** Built-in method references without a dependency on `root`. */
 426    var freeParseFloat = parseFloat,
 427        freeParseInt = parseInt;
 428  
 429    /** Detect free variable `global` from Node.js. */
 430    var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
 431  
 432    /** Detect free variable `self`. */
 433    var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
 434  
 435    /** Used as a reference to the global object. */
 436    var root = freeGlobal || freeSelf || Function('return this')();
 437  
 438    /** Detect free variable `exports`. */
 439    var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
 440  
 441    /** Detect free variable `module`. */
 442    var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
 443  
 444    /** Detect the popular CommonJS extension `module.exports`. */
 445    var moduleExports = freeModule && freeModule.exports === freeExports;
 446  
 447    /** Detect free variable `process` from Node.js. */
 448    var freeProcess = moduleExports && freeGlobal.process;
 449  
 450    /** Used to access faster Node.js helpers. */
 451    var nodeUtil = (function() {
 452      try {
 453        // Use `util.types` for Node.js 10+.
 454        var types = freeModule && freeModule.require && freeModule.require('util').types;
 455  
 456        if (types) {
 457          return types;
 458        }
 459  
 460        // Legacy `process.binding('util')` for Node.js < 10.
 461        return freeProcess && freeProcess.binding && freeProcess.binding('util');
 462      } catch (e) {}
 463    }());
 464  
 465    /* Node.js helper references. */
 466    var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
 467        nodeIsDate = nodeUtil && nodeUtil.isDate,
 468        nodeIsMap = nodeUtil && nodeUtil.isMap,
 469        nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
 470        nodeIsSet = nodeUtil && nodeUtil.isSet,
 471        nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
 472  
 473    /*--------------------------------------------------------------------------*/
 474  
 475    /**
 476     * A faster alternative to `Function#apply`, this function invokes `func`
 477     * with the `this` binding of `thisArg` and the arguments of `args`.
 478     *
 479     * @private
 480     * @param {Function} func The function to invoke.
 481     * @param {*} thisArg The `this` binding of `func`.
 482     * @param {Array} args The arguments to invoke `func` with.
 483     * @returns {*} Returns the result of `func`.
 484     */
 485    function apply(func, thisArg, args) {
 486      switch (args.length) {
 487        case 0: return func.call(thisArg);
 488        case 1: return func.call(thisArg, args[0]);
 489        case 2: return func.call(thisArg, args[0], args[1]);
 490        case 3: return func.call(thisArg, args[0], args[1], args[2]);
 491      }
 492      return func.apply(thisArg, args);
 493    }
 494  
 495    /**
 496     * A specialized version of `baseAggregator` for arrays.
 497     *
 498     * @private
 499     * @param {Array} [array] The array to iterate over.
 500     * @param {Function} setter The function to set `accumulator` values.
 501     * @param {Function} iteratee The iteratee to transform keys.
 502     * @param {Object} accumulator The initial aggregated object.
 503     * @returns {Function} Returns `accumulator`.
 504     */
 505    function arrayAggregator(array, setter, iteratee, accumulator) {
 506      var index = -1,
 507          length = array == null ? 0 : array.length;
 508  
 509      while (++index < length) {
 510        var value = array[index];
 511        setter(accumulator, value, iteratee(value), array);
 512      }
 513      return accumulator;
 514    }
 515  
 516    /**
 517     * A specialized version of `_.forEach` for arrays without support for
 518     * iteratee shorthands.
 519     *
 520     * @private
 521     * @param {Array} [array] The array to iterate over.
 522     * @param {Function} iteratee The function invoked per iteration.
 523     * @returns {Array} Returns `array`.
 524     */
 525    function arrayEach(array, iteratee) {
 526      var index = -1,
 527          length = array == null ? 0 : array.length;
 528  
 529      while (++index < length) {
 530        if (iteratee(array[index], index, array) === false) {
 531          break;
 532        }
 533      }
 534      return array;
 535    }
 536  
 537    /**
 538     * A specialized version of `_.forEachRight` for arrays without support for
 539     * iteratee shorthands.
 540     *
 541     * @private
 542     * @param {Array} [array] The array to iterate over.
 543     * @param {Function} iteratee The function invoked per iteration.
 544     * @returns {Array} Returns `array`.
 545     */
 546    function arrayEachRight(array, iteratee) {
 547      var length = array == null ? 0 : array.length;
 548  
 549      while (length--) {
 550        if (iteratee(array[length], length, array) === false) {
 551          break;
 552        }
 553      }
 554      return array;
 555    }
 556  
 557    /**
 558     * A specialized version of `_.every` for arrays without support for
 559     * iteratee shorthands.
 560     *
 561     * @private
 562     * @param {Array} [array] The array to iterate over.
 563     * @param {Function} predicate The function invoked per iteration.
 564     * @returns {boolean} Returns `true` if all elements pass the predicate check,
 565     *  else `false`.
 566     */
 567    function arrayEvery(array, predicate) {
 568      var index = -1,
 569          length = array == null ? 0 : array.length;
 570  
 571      while (++index < length) {
 572        if (!predicate(array[index], index, array)) {
 573          return false;
 574        }
 575      }
 576      return true;
 577    }
 578  
 579    /**
 580     * A specialized version of `_.filter` for arrays without support for
 581     * iteratee shorthands.
 582     *
 583     * @private
 584     * @param {Array} [array] The array to iterate over.
 585     * @param {Function} predicate The function invoked per iteration.
 586     * @returns {Array} Returns the new filtered array.
 587     */
 588    function arrayFilter(array, predicate) {
 589      var index = -1,
 590          length = array == null ? 0 : array.length,
 591          resIndex = 0,
 592          result = [];
 593  
 594      while (++index < length) {
 595        var value = array[index];
 596        if (predicate(value, index, array)) {
 597          result[resIndex++] = value;
 598        }
 599      }
 600      return result;
 601    }
 602  
 603    /**
 604     * A specialized version of `_.includes` for arrays without support for
 605     * specifying an index to search from.
 606     *
 607     * @private
 608     * @param {Array} [array] The array to inspect.
 609     * @param {*} target The value to search for.
 610     * @returns {boolean} Returns `true` if `target` is found, else `false`.
 611     */
 612    function arrayIncludes(array, value) {
 613      var length = array == null ? 0 : array.length;
 614      return !!length && baseIndexOf(array, value, 0) > -1;
 615    }
 616  
 617    /**
 618     * This function is like `arrayIncludes` except that it accepts a comparator.
 619     *
 620     * @private
 621     * @param {Array} [array] The array to inspect.
 622     * @param {*} target The value to search for.
 623     * @param {Function} comparator The comparator invoked per element.
 624     * @returns {boolean} Returns `true` if `target` is found, else `false`.
 625     */
 626    function arrayIncludesWith(array, value, comparator) {
 627      var index = -1,
 628          length = array == null ? 0 : array.length;
 629  
 630      while (++index < length) {
 631        if (comparator(value, array[index])) {
 632          return true;
 633        }
 634      }
 635      return false;
 636    }
 637  
 638    /**
 639     * A specialized version of `_.map` for arrays without support for iteratee
 640     * shorthands.
 641     *
 642     * @private
 643     * @param {Array} [array] The array to iterate over.
 644     * @param {Function} iteratee The function invoked per iteration.
 645     * @returns {Array} Returns the new mapped array.
 646     */
 647    function arrayMap(array, iteratee) {
 648      var index = -1,
 649          length = array == null ? 0 : array.length,
 650          result = Array(length);
 651  
 652      while (++index < length) {
 653        result[index] = iteratee(array[index], index, array);
 654      }
 655      return result;
 656    }
 657  
 658    /**
 659     * Appends the elements of `values` to `array`.
 660     *
 661     * @private
 662     * @param {Array} array The array to modify.
 663     * @param {Array} values The values to append.
 664     * @returns {Array} Returns `array`.
 665     */
 666    function arrayPush(array, values) {
 667      var index = -1,
 668          length = values.length,
 669          offset = array.length;
 670  
 671      while (++index < length) {
 672        array[offset + index] = values[index];
 673      }
 674      return array;
 675    }
 676  
 677    /**
 678     * A specialized version of `_.reduce` for arrays without support for
 679     * iteratee shorthands.
 680     *
 681     * @private
 682     * @param {Array} [array] The array to iterate over.
 683     * @param {Function} iteratee The function invoked per iteration.
 684     * @param {*} [accumulator] The initial value.
 685     * @param {boolean} [initAccum] Specify using the first element of `array` as
 686     *  the initial value.
 687     * @returns {*} Returns the accumulated value.
 688     */
 689    function arrayReduce(array, iteratee, accumulator, initAccum) {
 690      var index = -1,
 691          length = array == null ? 0 : array.length;
 692  
 693      if (initAccum && length) {
 694        accumulator = array[++index];
 695      }
 696      while (++index < length) {
 697        accumulator = iteratee(accumulator, array[index], index, array);
 698      }
 699      return accumulator;
 700    }
 701  
 702    /**
 703     * A specialized version of `_.reduceRight` for arrays without support for
 704     * iteratee shorthands.
 705     *
 706     * @private
 707     * @param {Array} [array] The array to iterate over.
 708     * @param {Function} iteratee The function invoked per iteration.
 709     * @param {*} [accumulator] The initial value.
 710     * @param {boolean} [initAccum] Specify using the last element of `array` as
 711     *  the initial value.
 712     * @returns {*} Returns the accumulated value.
 713     */
 714    function arrayReduceRight(array, iteratee, accumulator, initAccum) {
 715      var length = array == null ? 0 : array.length;
 716      if (initAccum && length) {
 717        accumulator = array[--length];
 718      }
 719      while (length--) {
 720        accumulator = iteratee(accumulator, array[length], length, array);
 721      }
 722      return accumulator;
 723    }
 724  
 725    /**
 726     * A specialized version of `_.some` for arrays without support for iteratee
 727     * shorthands.
 728     *
 729     * @private
 730     * @param {Array} [array] The array to iterate over.
 731     * @param {Function} predicate The function invoked per iteration.
 732     * @returns {boolean} Returns `true` if any element passes the predicate check,
 733     *  else `false`.
 734     */
 735    function arraySome(array, predicate) {
 736      var index = -1,
 737          length = array == null ? 0 : array.length;
 738  
 739      while (++index < length) {
 740        if (predicate(array[index], index, array)) {
 741          return true;
 742        }
 743      }
 744      return false;
 745    }
 746  
 747    /**
 748     * Gets the size of an ASCII `string`.
 749     *
 750     * @private
 751     * @param {string} string The string inspect.
 752     * @returns {number} Returns the string size.
 753     */
 754    var asciiSize = baseProperty('length');
 755  
 756    /**
 757     * Converts an ASCII `string` to an array.
 758     *
 759     * @private
 760     * @param {string} string The string to convert.
 761     * @returns {Array} Returns the converted array.
 762     */
 763    function asciiToArray(string) {
 764      return string.split('');
 765    }
 766  
 767    /**
 768     * Splits an ASCII `string` into an array of its words.
 769     *
 770     * @private
 771     * @param {string} The string to inspect.
 772     * @returns {Array} Returns the words of `string`.
 773     */
 774    function asciiWords(string) {
 775      return string.match(reAsciiWord) || [];
 776    }
 777  
 778    /**
 779     * The base implementation of methods like `_.findKey` and `_.findLastKey`,
 780     * without support for iteratee shorthands, which iterates over `collection`
 781     * using `eachFunc`.
 782     *
 783     * @private
 784     * @param {Array|Object} collection The collection to inspect.
 785     * @param {Function} predicate The function invoked per iteration.
 786     * @param {Function} eachFunc The function to iterate over `collection`.
 787     * @returns {*} Returns the found element or its key, else `undefined`.
 788     */
 789    function baseFindKey(collection, predicate, eachFunc) {
 790      var result;
 791      eachFunc(collection, function(value, key, collection) {
 792        if (predicate(value, key, collection)) {
 793          result = key;
 794          return false;
 795        }
 796      });
 797      return result;
 798    }
 799  
 800    /**
 801     * The base implementation of `_.findIndex` and `_.findLastIndex` without
 802     * support for iteratee shorthands.
 803     *
 804     * @private
 805     * @param {Array} array The array to inspect.
 806     * @param {Function} predicate The function invoked per iteration.
 807     * @param {number} fromIndex The index to search from.
 808     * @param {boolean} [fromRight] Specify iterating from right to left.
 809     * @returns {number} Returns the index of the matched value, else `-1`.
 810     */
 811    function baseFindIndex(array, predicate, fromIndex, fromRight) {
 812      var length = array.length,
 813          index = fromIndex + (fromRight ? 1 : -1);
 814  
 815      while ((fromRight ? index-- : ++index < length)) {
 816        if (predicate(array[index], index, array)) {
 817          return index;
 818        }
 819      }
 820      return -1;
 821    }
 822  
 823    /**
 824     * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
 825     *
 826     * @private
 827     * @param {Array} array The array to inspect.
 828     * @param {*} value The value to search for.
 829     * @param {number} fromIndex The index to search from.
 830     * @returns {number} Returns the index of the matched value, else `-1`.
 831     */
 832    function baseIndexOf(array, value, fromIndex) {
 833      return value === value
 834        ? strictIndexOf(array, value, fromIndex)
 835        : baseFindIndex(array, baseIsNaN, fromIndex);
 836    }
 837  
 838    /**
 839     * This function is like `baseIndexOf` except that it accepts a comparator.
 840     *
 841     * @private
 842     * @param {Array} array The array to inspect.
 843     * @param {*} value The value to search for.
 844     * @param {number} fromIndex The index to search from.
 845     * @param {Function} comparator The comparator invoked per element.
 846     * @returns {number} Returns the index of the matched value, else `-1`.
 847     */
 848    function baseIndexOfWith(array, value, fromIndex, comparator) {
 849      var index = fromIndex - 1,
 850          length = array.length;
 851  
 852      while (++index < length) {
 853        if (comparator(array[index], value)) {
 854          return index;
 855        }
 856      }
 857      return -1;
 858    }
 859  
 860    /**
 861     * The base implementation of `_.isNaN` without support for number objects.
 862     *
 863     * @private
 864     * @param {*} value The value to check.
 865     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 866     */
 867    function baseIsNaN(value) {
 868      return value !== value;
 869    }
 870  
 871    /**
 872     * The base implementation of `_.mean` and `_.meanBy` without support for
 873     * iteratee shorthands.
 874     *
 875     * @private
 876     * @param {Array} array The array to iterate over.
 877     * @param {Function} iteratee The function invoked per iteration.
 878     * @returns {number} Returns the mean.
 879     */
 880    function baseMean(array, iteratee) {
 881      var length = array == null ? 0 : array.length;
 882      return length ? (baseSum(array, iteratee) / length) : NAN;
 883    }
 884  
 885    /**
 886     * The base implementation of `_.property` without support for deep paths.
 887     *
 888     * @private
 889     * @param {string} key The key of the property to get.
 890     * @returns {Function} Returns the new accessor function.
 891     */
 892    function baseProperty(key) {
 893      return function(object) {
 894        return object == null ? undefined : object[key];
 895      };
 896    }
 897  
 898    /**
 899     * The base implementation of `_.propertyOf` without support for deep paths.
 900     *
 901     * @private
 902     * @param {Object} object The object to query.
 903     * @returns {Function} Returns the new accessor function.
 904     */
 905    function basePropertyOf(object) {
 906      return function(key) {
 907        return object == null ? undefined : object[key];
 908      };
 909    }
 910  
 911    /**
 912     * The base implementation of `_.reduce` and `_.reduceRight`, without support
 913     * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
 914     *
 915     * @private
 916     * @param {Array|Object} collection The collection to iterate over.
 917     * @param {Function} iteratee The function invoked per iteration.
 918     * @param {*} accumulator The initial value.
 919     * @param {boolean} initAccum Specify using the first or last element of
 920     *  `collection` as the initial value.
 921     * @param {Function} eachFunc The function to iterate over `collection`.
 922     * @returns {*} Returns the accumulated value.
 923     */
 924    function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
 925      eachFunc(collection, function(value, index, collection) {
 926        accumulator = initAccum
 927          ? (initAccum = false, value)
 928          : iteratee(accumulator, value, index, collection);
 929      });
 930      return accumulator;
 931    }
 932  
 933    /**
 934     * The base implementation of `_.sortBy` which uses `comparer` to define the
 935     * sort order of `array` and replaces criteria objects with their corresponding
 936     * values.
 937     *
 938     * @private
 939     * @param {Array} array The array to sort.
 940     * @param {Function} comparer The function to define sort order.
 941     * @returns {Array} Returns `array`.
 942     */
 943    function baseSortBy(array, comparer) {
 944      var length = array.length;
 945  
 946      array.sort(comparer);
 947      while (length--) {
 948        array[length] = array[length].value;
 949      }
 950      return array;
 951    }
 952  
 953    /**
 954     * The base implementation of `_.sum` and `_.sumBy` without support for
 955     * iteratee shorthands.
 956     *
 957     * @private
 958     * @param {Array} array The array to iterate over.
 959     * @param {Function} iteratee The function invoked per iteration.
 960     * @returns {number} Returns the sum.
 961     */
 962    function baseSum(array, iteratee) {
 963      var result,
 964          index = -1,
 965          length = array.length;
 966  
 967      while (++index < length) {
 968        var current = iteratee(array[index]);
 969        if (current !== undefined) {
 970          result = result === undefined ? current : (result + current);
 971        }
 972      }
 973      return result;
 974    }
 975  
 976    /**
 977     * The base implementation of `_.times` without support for iteratee shorthands
 978     * or max array length checks.
 979     *
 980     * @private
 981     * @param {number} n The number of times to invoke `iteratee`.
 982     * @param {Function} iteratee The function invoked per iteration.
 983     * @returns {Array} Returns the array of results.
 984     */
 985    function baseTimes(n, iteratee) {
 986      var index = -1,
 987          result = Array(n);
 988  
 989      while (++index < n) {
 990        result[index] = iteratee(index);
 991      }
 992      return result;
 993    }
 994  
 995    /**
 996     * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
 997     * of key-value pairs for `object` corresponding to the property names of `props`.
 998     *
 999     * @private
1000     * @param {Object} object The object to query.
1001     * @param {Array} props The property names to get values for.
1002     * @returns {Object} Returns the key-value pairs.
1003     */
1004    function baseToPairs(object, props) {
1005      return arrayMap(props, function(key) {
1006        return [key, object[key]];
1007      });
1008    }
1009  
1010    /**
1011     * The base implementation of `_.trim`.
1012     *
1013     * @private
1014     * @param {string} string The string to trim.
1015     * @returns {string} Returns the trimmed string.
1016     */
1017    function baseTrim(string) {
1018      return string
1019        ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
1020        : string;
1021    }
1022  
1023    /**
1024     * The base implementation of `_.unary` without support for storing metadata.
1025     *
1026     * @private
1027     * @param {Function} func The function to cap arguments for.
1028     * @returns {Function} Returns the new capped function.
1029     */
1030    function baseUnary(func) {
1031      return function(value) {
1032        return func(value);
1033      };
1034    }
1035  
1036    /**
1037     * The base implementation of `_.values` and `_.valuesIn` which creates an
1038     * array of `object` property values corresponding to the property names
1039     * of `props`.
1040     *
1041     * @private
1042     * @param {Object} object The object to query.
1043     * @param {Array} props The property names to get values for.
1044     * @returns {Object} Returns the array of property values.
1045     */
1046    function baseValues(object, props) {
1047      return arrayMap(props, function(key) {
1048        return object[key];
1049      });
1050    }
1051  
1052    /**
1053     * Checks if a `cache` value for `key` exists.
1054     *
1055     * @private
1056     * @param {Object} cache The cache to query.
1057     * @param {string} key The key of the entry to check.
1058     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1059     */
1060    function cacheHas(cache, key) {
1061      return cache.has(key);
1062    }
1063  
1064    /**
1065     * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
1066     * that is not found in the character symbols.
1067     *
1068     * @private
1069     * @param {Array} strSymbols The string symbols to inspect.
1070     * @param {Array} chrSymbols The character symbols to find.
1071     * @returns {number} Returns the index of the first unmatched string symbol.
1072     */
1073    function charsStartIndex(strSymbols, chrSymbols) {
1074      var index = -1,
1075          length = strSymbols.length;
1076  
1077      while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1078      return index;
1079    }
1080  
1081    /**
1082     * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
1083     * that is not found in the character symbols.
1084     *
1085     * @private
1086     * @param {Array} strSymbols The string symbols to inspect.
1087     * @param {Array} chrSymbols The character symbols to find.
1088     * @returns {number} Returns the index of the last unmatched string symbol.
1089     */
1090    function charsEndIndex(strSymbols, chrSymbols) {
1091      var index = strSymbols.length;
1092  
1093      while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1094      return index;
1095    }
1096  
1097    /**
1098     * Gets the number of `placeholder` occurrences in `array`.
1099     *
1100     * @private
1101     * @param {Array} array The array to inspect.
1102     * @param {*} placeholder The placeholder to search for.
1103     * @returns {number} Returns the placeholder count.
1104     */
1105    function countHolders(array, placeholder) {
1106      var length = array.length,
1107          result = 0;
1108  
1109      while (length--) {
1110        if (array[length] === placeholder) {
1111          ++result;
1112        }
1113      }
1114      return result;
1115    }
1116  
1117    /**
1118     * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
1119     * letters to basic Latin letters.
1120     *
1121     * @private
1122     * @param {string} letter The matched letter to deburr.
1123     * @returns {string} Returns the deburred letter.
1124     */
1125    var deburrLetter = basePropertyOf(deburredLetters);
1126  
1127    /**
1128     * Used by `_.escape` to convert characters to HTML entities.
1129     *
1130     * @private
1131     * @param {string} chr The matched character to escape.
1132     * @returns {string} Returns the escaped character.
1133     */
1134    var escapeHtmlChar = basePropertyOf(htmlEscapes);
1135  
1136    /**
1137     * Used by `_.template` to escape characters for inclusion in compiled string literals.
1138     *
1139     * @private
1140     * @param {string} chr The matched character to escape.
1141     * @returns {string} Returns the escaped character.
1142     */
1143    function escapeStringChar(chr) {
1144      return '\\' + stringEscapes[chr];
1145    }
1146  
1147    /**
1148     * Gets the value at `key` of `object`.
1149     *
1150     * @private
1151     * @param {Object} [object] The object to query.
1152     * @param {string} key The key of the property to get.
1153     * @returns {*} Returns the property value.
1154     */
1155    function getValue(object, key) {
1156      return object == null ? undefined : object[key];
1157    }
1158  
1159    /**
1160     * Checks if `string` contains Unicode symbols.
1161     *
1162     * @private
1163     * @param {string} string The string to inspect.
1164     * @returns {boolean} Returns `true` if a symbol is found, else `false`.
1165     */
1166    function hasUnicode(string) {
1167      return reHasUnicode.test(string);
1168    }
1169  
1170    /**
1171     * Checks if `string` contains a word composed of Unicode symbols.
1172     *
1173     * @private
1174     * @param {string} string The string to inspect.
1175     * @returns {boolean} Returns `true` if a word is found, else `false`.
1176     */
1177    function hasUnicodeWord(string) {
1178      return reHasUnicodeWord.test(string);
1179    }
1180  
1181    /**
1182     * Converts `iterator` to an array.
1183     *
1184     * @private
1185     * @param {Object} iterator The iterator to convert.
1186     * @returns {Array} Returns the converted array.
1187     */
1188    function iteratorToArray(iterator) {
1189      var data,
1190          result = [];
1191  
1192      while (!(data = iterator.next()).done) {
1193        result.push(data.value);
1194      }
1195      return result;
1196    }
1197  
1198    /**
1199     * Converts `map` to its key-value pairs.
1200     *
1201     * @private
1202     * @param {Object} map The map to convert.
1203     * @returns {Array} Returns the key-value pairs.
1204     */
1205    function mapToArray(map) {
1206      var index = -1,
1207          result = Array(map.size);
1208  
1209      map.forEach(function(value, key) {
1210        result[++index] = [key, value];
1211      });
1212      return result;
1213    }
1214  
1215    /**
1216     * Creates a unary function that invokes `func` with its argument transformed.
1217     *
1218     * @private
1219     * @param {Function} func The function to wrap.
1220     * @param {Function} transform The argument transform.
1221     * @returns {Function} Returns the new function.
1222     */
1223    function overArg(func, transform) {
1224      return function(arg) {
1225        return func(transform(arg));
1226      };
1227    }
1228  
1229    /**
1230     * Replaces all `placeholder` elements in `array` with an internal placeholder
1231     * and returns an array of their indexes.
1232     *
1233     * @private
1234     * @param {Array} array The array to modify.
1235     * @param {*} placeholder The placeholder to replace.
1236     * @returns {Array} Returns the new array of placeholder indexes.
1237     */
1238    function replaceHolders(array, placeholder) {
1239      var index = -1,
1240          length = array.length,
1241          resIndex = 0,
1242          result = [];
1243  
1244      while (++index < length) {
1245        var value = array[index];
1246        if (value === placeholder || value === PLACEHOLDER) {
1247          array[index] = PLACEHOLDER;
1248          result[resIndex++] = index;
1249        }
1250      }
1251      return result;
1252    }
1253  
1254    /**
1255     * Converts `set` to an array of its values.
1256     *
1257     * @private
1258     * @param {Object} set The set to convert.
1259     * @returns {Array} Returns the values.
1260     */
1261    function setToArray(set) {
1262      var index = -1,
1263          result = Array(set.size);
1264  
1265      set.forEach(function(value) {
1266        result[++index] = value;
1267      });
1268      return result;
1269    }
1270  
1271    /**
1272     * Converts `set` to its value-value pairs.
1273     *
1274     * @private
1275     * @param {Object} set The set to convert.
1276     * @returns {Array} Returns the value-value pairs.
1277     */
1278    function setToPairs(set) {
1279      var index = -1,
1280          result = Array(set.size);
1281  
1282      set.forEach(function(value) {
1283        result[++index] = [value, value];
1284      });
1285      return result;
1286    }
1287  
1288    /**
1289     * A specialized version of `_.indexOf` which performs strict equality
1290     * comparisons of values, i.e. `===`.
1291     *
1292     * @private
1293     * @param {Array} array The array to inspect.
1294     * @param {*} value The value to search for.
1295     * @param {number} fromIndex The index to search from.
1296     * @returns {number} Returns the index of the matched value, else `-1`.
1297     */
1298    function strictIndexOf(array, value, fromIndex) {
1299      var index = fromIndex - 1,
1300          length = array.length;
1301  
1302      while (++index < length) {
1303        if (array[index] === value) {
1304          return index;
1305        }
1306      }
1307      return -1;
1308    }
1309  
1310    /**
1311     * A specialized version of `_.lastIndexOf` which performs strict equality
1312     * comparisons of values, i.e. `===`.
1313     *
1314     * @private
1315     * @param {Array} array The array to inspect.
1316     * @param {*} value The value to search for.
1317     * @param {number} fromIndex The index to search from.
1318     * @returns {number} Returns the index of the matched value, else `-1`.
1319     */
1320    function strictLastIndexOf(array, value, fromIndex) {
1321      var index = fromIndex + 1;
1322      while (index--) {
1323        if (array[index] === value) {
1324          return index;
1325        }
1326      }
1327      return index;
1328    }
1329  
1330    /**
1331     * Gets the number of symbols in `string`.
1332     *
1333     * @private
1334     * @param {string} string The string to inspect.
1335     * @returns {number} Returns the string size.
1336     */
1337    function stringSize(string) {
1338      return hasUnicode(string)
1339        ? unicodeSize(string)
1340        : asciiSize(string);
1341    }
1342  
1343    /**
1344     * Converts `string` to an array.
1345     *
1346     * @private
1347     * @param {string} string The string to convert.
1348     * @returns {Array} Returns the converted array.
1349     */
1350    function stringToArray(string) {
1351      return hasUnicode(string)
1352        ? unicodeToArray(string)
1353        : asciiToArray(string);
1354    }
1355  
1356    /**
1357     * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
1358     * character of `string`.
1359     *
1360     * @private
1361     * @param {string} string The string to inspect.
1362     * @returns {number} Returns the index of the last non-whitespace character.
1363     */
1364    function trimmedEndIndex(string) {
1365      var index = string.length;
1366  
1367      while (index-- && reWhitespace.test(string.charAt(index))) {}
1368      return index;
1369    }
1370  
1371    /**
1372     * Used by `_.unescape` to convert HTML entities to characters.
1373     *
1374     * @private
1375     * @param {string} chr The matched character to unescape.
1376     * @returns {string} Returns the unescaped character.
1377     */
1378    var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
1379  
1380    /**
1381     * Gets the size of a Unicode `string`.
1382     *
1383     * @private
1384     * @param {string} string The string inspect.
1385     * @returns {number} Returns the string size.
1386     */
1387    function unicodeSize(string) {
1388      var result = reUnicode.lastIndex = 0;
1389      while (reUnicode.test(string)) {
1390        ++result;
1391      }
1392      return result;
1393    }
1394  
1395    /**
1396     * Converts a Unicode `string` to an array.
1397     *
1398     * @private
1399     * @param {string} string The string to convert.
1400     * @returns {Array} Returns the converted array.
1401     */
1402    function unicodeToArray(string) {
1403      return string.match(reUnicode) || [];
1404    }
1405  
1406    /**
1407     * Splits a Unicode `string` into an array of its words.
1408     *
1409     * @private
1410     * @param {string} The string to inspect.
1411     * @returns {Array} Returns the words of `string`.
1412     */
1413    function unicodeWords(string) {
1414      return string.match(reUnicodeWord) || [];
1415    }
1416  
1417    /*--------------------------------------------------------------------------*/
1418  
1419    /**
1420     * Create a new pristine `lodash` function using the `context` object.
1421     *
1422     * @static
1423     * @memberOf _
1424     * @since 1.1.0
1425     * @category Util
1426     * @param {Object} [context=root] The context object.
1427     * @returns {Function} Returns a new `lodash` function.
1428     * @example
1429     *
1430     * _.mixin({ 'foo': _.constant('foo') });
1431     *
1432     * var lodash = _.runInContext();
1433     * lodash.mixin({ 'bar': lodash.constant('bar') });
1434     *
1435     * _.isFunction(_.foo);
1436     * // => true
1437     * _.isFunction(_.bar);
1438     * // => false
1439     *
1440     * lodash.isFunction(lodash.foo);
1441     * // => false
1442     * lodash.isFunction(lodash.bar);
1443     * // => true
1444     *
1445     * // Create a suped-up `defer` in Node.js.
1446     * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
1447     */
1448    var runInContext = (function runInContext(context) {
1449      context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
1450  
1451      /** Built-in constructor references. */
1452      var Array = context.Array,
1453          Date = context.Date,
1454          Error = context.Error,
1455          Function = context.Function,
1456          Math = context.Math,
1457          Object = context.Object,
1458          RegExp = context.RegExp,
1459          String = context.String,
1460          TypeError = context.TypeError;
1461  
1462      /** Used for built-in method references. */
1463      var arrayProto = Array.prototype,
1464          funcProto = Function.prototype,
1465          objectProto = Object.prototype;
1466  
1467      /** Used to detect overreaching core-js shims. */
1468      var coreJsData = context['__core-js_shared__'];
1469  
1470      /** Used to resolve the decompiled source of functions. */
1471      var funcToString = funcProto.toString;
1472  
1473      /** Used to check objects for own properties. */
1474      var hasOwnProperty = objectProto.hasOwnProperty;
1475  
1476      /** Used to generate unique IDs. */
1477      var idCounter = 0;
1478  
1479      /** Used to detect methods masquerading as native. */
1480      var maskSrcKey = (function() {
1481        var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
1482        return uid ? ('Symbol(src)_1.' + uid) : '';
1483      }());
1484  
1485      /**
1486       * Used to resolve the
1487       * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
1488       * of values.
1489       */
1490      var nativeObjectToString = objectProto.toString;
1491  
1492      /** Used to infer the `Object` constructor. */
1493      var objectCtorString = funcToString.call(Object);
1494  
1495      /** Used to restore the original `_` reference in `_.noConflict`. */
1496      var oldDash = root._;
1497  
1498      /** Used to detect if a method is native. */
1499      var reIsNative = RegExp('^' +
1500        funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
1501        .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
1502      );
1503  
1504      /** Built-in value references. */
1505      var Buffer = moduleExports ? context.Buffer : undefined,
1506          Symbol = context.Symbol,
1507          Uint8Array = context.Uint8Array,
1508          allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
1509          getPrototype = overArg(Object.getPrototypeOf, Object),
1510          objectCreate = Object.create,
1511          propertyIsEnumerable = objectProto.propertyIsEnumerable,
1512          splice = arrayProto.splice,
1513          spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
1514          symIterator = Symbol ? Symbol.iterator : undefined,
1515          symToStringTag = Symbol ? Symbol.toStringTag : undefined;
1516  
1517      var defineProperty = (function() {
1518        try {
1519          var func = getNative(Object, 'defineProperty');
1520          func({}, '', {});
1521          return func;
1522        } catch (e) {}
1523      }());
1524  
1525      /** Mocked built-ins. */
1526      var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
1527          ctxNow = Date && Date.now !== root.Date.now && Date.now,
1528          ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
1529  
1530      /* Built-in method references for those with the same name as other `lodash` methods. */
1531      var nativeCeil = Math.ceil,
1532          nativeFloor = Math.floor,
1533          nativeGetSymbols = Object.getOwnPropertySymbols,
1534          nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
1535          nativeIsFinite = context.isFinite,
1536          nativeJoin = arrayProto.join,
1537          nativeKeys = overArg(Object.keys, Object),
1538          nativeMax = Math.max,
1539          nativeMin = Math.min,
1540          nativeNow = Date.now,
1541          nativeParseInt = context.parseInt,
1542          nativeRandom = Math.random,
1543          nativeReverse = arrayProto.reverse;
1544  
1545      /* Built-in method references that are verified to be native. */
1546      var DataView = getNative(context, 'DataView'),
1547          Map = getNative(context, 'Map'),
1548          Promise = getNative(context, 'Promise'),
1549          Set = getNative(context, 'Set'),
1550          WeakMap = getNative(context, 'WeakMap'),
1551          nativeCreate = getNative(Object, 'create');
1552  
1553      /** Used to store function metadata. */
1554      var metaMap = WeakMap && new WeakMap;
1555  
1556      /** Used to lookup unminified function names. */
1557      var realNames = {};
1558  
1559      /** Used to detect maps, sets, and weakmaps. */
1560      var dataViewCtorString = toSource(DataView),
1561          mapCtorString = toSource(Map),
1562          promiseCtorString = toSource(Promise),
1563          setCtorString = toSource(Set),
1564          weakMapCtorString = toSource(WeakMap);
1565  
1566      /** Used to convert symbols to primitives and strings. */
1567      var symbolProto = Symbol ? Symbol.prototype : undefined,
1568          symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
1569          symbolToString = symbolProto ? symbolProto.toString : undefined;
1570  
1571      /*------------------------------------------------------------------------*/
1572  
1573      /**
1574       * Creates a `lodash` object which wraps `value` to enable implicit method
1575       * chain sequences. Methods that operate on and return arrays, collections,
1576       * and functions can be chained together. Methods that retrieve a single value
1577       * or may return a primitive value will automatically end the chain sequence
1578       * and return the unwrapped value. Otherwise, the value must be unwrapped
1579       * with `_#value`.
1580       *
1581       * Explicit chain sequences, which must be unwrapped with `_#value`, may be
1582       * enabled using `_.chain`.
1583       *
1584       * The execution of chained methods is lazy, that is, it's deferred until
1585       * `_#value` is implicitly or explicitly called.
1586       *
1587       * Lazy evaluation allows several methods to support shortcut fusion.
1588       * Shortcut fusion is an optimization to merge iteratee calls; this avoids
1589       * the creation of intermediate arrays and can greatly reduce the number of
1590       * iteratee executions. Sections of a chain sequence qualify for shortcut
1591       * fusion if the section is applied to an array and iteratees accept only
1592       * one argument. The heuristic for whether a section qualifies for shortcut
1593       * fusion is subject to change.
1594       *
1595       * Chaining is supported in custom builds as long as the `_#value` method is
1596       * directly or indirectly included in the build.
1597       *
1598       * In addition to lodash methods, wrappers have `Array` and `String` methods.
1599       *
1600       * The wrapper `Array` methods are:
1601       * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
1602       *
1603       * The wrapper `String` methods are:
1604       * `replace` and `split`
1605       *
1606       * The wrapper methods that support shortcut fusion are:
1607       * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
1608       * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
1609       * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
1610       *
1611       * The chainable wrapper methods are:
1612       * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
1613       * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
1614       * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
1615       * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
1616       * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
1617       * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
1618       * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
1619       * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
1620       * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
1621       * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
1622       * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
1623       * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
1624       * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
1625       * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
1626       * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
1627       * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
1628       * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
1629       * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
1630       * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
1631       * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
1632       * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
1633       * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
1634       * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
1635       * `zipObject`, `zipObjectDeep`, and `zipWith`
1636       *
1637       * The wrapper methods that are **not** chainable by default are:
1638       * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
1639       * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
1640       * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
1641       * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
1642       * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
1643       * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
1644       * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
1645       * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
1646       * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
1647       * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
1648       * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
1649       * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
1650       * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
1651       * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
1652       * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
1653       * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
1654       * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
1655       * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
1656       * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
1657       * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
1658       * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
1659       * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
1660       * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
1661       * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
1662       * `upperFirst`, `value`, and `words`
1663       *
1664       * @name _
1665       * @constructor
1666       * @category Seq
1667       * @param {*} value The value to wrap in a `lodash` instance.
1668       * @returns {Object} Returns the new `lodash` wrapper instance.
1669       * @example
1670       *
1671       * function square(n) {
1672       *   return n * n;
1673       * }
1674       *
1675       * var wrapped = _([1, 2, 3]);
1676       *
1677       * // Returns an unwrapped value.
1678       * wrapped.reduce(_.add);
1679       * // => 6
1680       *
1681       * // Returns a wrapped value.
1682       * var squares = wrapped.map(square);
1683       *
1684       * _.isArray(squares);
1685       * // => false
1686       *
1687       * _.isArray(squares.value());
1688       * // => true
1689       */
1690      function lodash(value) {
1691        if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
1692          if (value instanceof LodashWrapper) {
1693            return value;
1694          }
1695          if (hasOwnProperty.call(value, '__wrapped__')) {
1696            return wrapperClone(value);
1697          }
1698        }
1699        return new LodashWrapper(value);
1700      }
1701  
1702      /**
1703       * The base implementation of `_.create` without support for assigning
1704       * properties to the created object.
1705       *
1706       * @private
1707       * @param {Object} proto The object to inherit from.
1708       * @returns {Object} Returns the new object.
1709       */
1710      var baseCreate = (function() {
1711        function object() {}
1712        return function(proto) {
1713          if (!isObject(proto)) {
1714            return {};
1715          }
1716          if (objectCreate) {
1717            return objectCreate(proto);
1718          }
1719          object.prototype = proto;
1720          var result = new object;
1721          object.prototype = undefined;
1722          return result;
1723        };
1724      }());
1725  
1726      /**
1727       * The function whose prototype chain sequence wrappers inherit from.
1728       *
1729       * @private
1730       */
1731      function baseLodash() {
1732        // No operation performed.
1733      }
1734  
1735      /**
1736       * The base constructor for creating `lodash` wrapper objects.
1737       *
1738       * @private
1739       * @param {*} value The value to wrap.
1740       * @param {boolean} [chainAll] Enable explicit method chain sequences.
1741       */
1742      function LodashWrapper(value, chainAll) {
1743        this.__wrapped__ = value;
1744        this.__actions__ = [];
1745        this.__chain__ = !!chainAll;
1746        this.__index__ = 0;
1747        this.__values__ = undefined;
1748      }
1749  
1750      /**
1751       * By default, the template delimiters used by lodash are like those in
1752       * embedded Ruby (ERB) as well as ES2015 template strings. Change the
1753       * following template settings to use alternative delimiters.
1754       *
1755       * @static
1756       * @memberOf _
1757       * @type {Object}
1758       */
1759      lodash.templateSettings = {
1760  
1761        /**
1762         * Used to detect `data` property values to be HTML-escaped.
1763         *
1764         * @memberOf _.templateSettings
1765         * @type {RegExp}
1766         */
1767        'escape': reEscape,
1768  
1769        /**
1770         * Used to detect code to be evaluated.
1771         *
1772         * @memberOf _.templateSettings
1773         * @type {RegExp}
1774         */
1775        'evaluate': reEvaluate,
1776  
1777        /**
1778         * Used to detect `data` property values to inject.
1779         *
1780         * @memberOf _.templateSettings
1781         * @type {RegExp}
1782         */
1783        'interpolate': reInterpolate,
1784  
1785        /**
1786         * Used to reference the data object in the template text.
1787         *
1788         * @memberOf _.templateSettings
1789         * @type {string}
1790         */
1791        'variable': '',
1792  
1793        /**
1794         * Used to import variables into the compiled template.
1795         *
1796         * @memberOf _.templateSettings
1797         * @type {Object}
1798         */
1799        'imports': {
1800  
1801          /**
1802           * A reference to the `lodash` function.
1803           *
1804           * @memberOf _.templateSettings.imports
1805           * @type {Function}
1806           */
1807          '_': lodash
1808        }
1809      };
1810  
1811      // Ensure wrappers are instances of `baseLodash`.
1812      lodash.prototype = baseLodash.prototype;
1813      lodash.prototype.constructor = lodash;
1814  
1815      LodashWrapper.prototype = baseCreate(baseLodash.prototype);
1816      LodashWrapper.prototype.constructor = LodashWrapper;
1817  
1818      /*------------------------------------------------------------------------*/
1819  
1820      /**
1821       * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
1822       *
1823       * @private
1824       * @constructor
1825       * @param {*} value The value to wrap.
1826       */
1827      function LazyWrapper(value) {
1828        this.__wrapped__ = value;
1829        this.__actions__ = [];
1830        this.__dir__ = 1;
1831        this.__filtered__ = false;
1832        this.__iteratees__ = [];
1833        this.__takeCount__ = MAX_ARRAY_LENGTH;
1834        this.__views__ = [];
1835      }
1836  
1837      /**
1838       * Creates a clone of the lazy wrapper object.
1839       *
1840       * @private
1841       * @name clone
1842       * @memberOf LazyWrapper
1843       * @returns {Object} Returns the cloned `LazyWrapper` object.
1844       */
1845      function lazyClone() {
1846        var result = new LazyWrapper(this.__wrapped__);
1847        result.__actions__ = copyArray(this.__actions__);
1848        result.__dir__ = this.__dir__;
1849        result.__filtered__ = this.__filtered__;
1850        result.__iteratees__ = copyArray(this.__iteratees__);
1851        result.__takeCount__ = this.__takeCount__;
1852        result.__views__ = copyArray(this.__views__);
1853        return result;
1854      }
1855  
1856      /**
1857       * Reverses the direction of lazy iteration.
1858       *
1859       * @private
1860       * @name reverse
1861       * @memberOf LazyWrapper
1862       * @returns {Object} Returns the new reversed `LazyWrapper` object.
1863       */
1864      function lazyReverse() {
1865        if (this.__filtered__) {
1866          var result = new LazyWrapper(this);
1867          result.__dir__ = -1;
1868          result.__filtered__ = true;
1869        } else {
1870          result = this.clone();
1871          result.__dir__ *= -1;
1872        }
1873        return result;
1874      }
1875  
1876      /**
1877       * Extracts the unwrapped value from its lazy wrapper.
1878       *
1879       * @private
1880       * @name value
1881       * @memberOf LazyWrapper
1882       * @returns {*} Returns the unwrapped value.
1883       */
1884      function lazyValue() {
1885        var array = this.__wrapped__.value(),
1886            dir = this.__dir__,
1887            isArr = isArray(array),
1888            isRight = dir < 0,
1889            arrLength = isArr ? array.length : 0,
1890            view = getView(0, arrLength, this.__views__),
1891            start = view.start,
1892            end = view.end,
1893            length = end - start,
1894            index = isRight ? end : (start - 1),
1895            iteratees = this.__iteratees__,
1896            iterLength = iteratees.length,
1897            resIndex = 0,
1898            takeCount = nativeMin(length, this.__takeCount__);
1899  
1900        if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
1901          return baseWrapperValue(array, this.__actions__);
1902        }
1903        var result = [];
1904  
1905        outer:
1906        while (length-- && resIndex < takeCount) {
1907          index += dir;
1908  
1909          var iterIndex = -1,
1910              value = array[index];
1911  
1912          while (++iterIndex < iterLength) {
1913            var data = iteratees[iterIndex],
1914                iteratee = data.iteratee,
1915                type = data.type,
1916                computed = iteratee(value);
1917  
1918            if (type == LAZY_MAP_FLAG) {
1919              value = computed;
1920            } else if (!computed) {
1921              if (type == LAZY_FILTER_FLAG) {
1922                continue outer;
1923              } else {
1924                break outer;
1925              }
1926            }
1927          }
1928          result[resIndex++] = value;
1929        }
1930        return result;
1931      }
1932  
1933      // Ensure `LazyWrapper` is an instance of `baseLodash`.
1934      LazyWrapper.prototype = baseCreate(baseLodash.prototype);
1935      LazyWrapper.prototype.constructor = LazyWrapper;
1936  
1937      /*------------------------------------------------------------------------*/
1938  
1939      /**
1940       * Creates a hash object.
1941       *
1942       * @private
1943       * @constructor
1944       * @param {Array} [entries] The key-value pairs to cache.
1945       */
1946      function Hash(entries) {
1947        var index = -1,
1948            length = entries == null ? 0 : entries.length;
1949  
1950        this.clear();
1951        while (++index < length) {
1952          var entry = entries[index];
1953          this.set(entry[0], entry[1]);
1954        }
1955      }
1956  
1957      /**
1958       * Removes all key-value entries from the hash.
1959       *
1960       * @private
1961       * @name clear
1962       * @memberOf Hash
1963       */
1964      function hashClear() {
1965        this.__data__ = nativeCreate ? nativeCreate(null) : {};
1966        this.size = 0;
1967      }
1968  
1969      /**
1970       * Removes `key` and its value from the hash.
1971       *
1972       * @private
1973       * @name delete
1974       * @memberOf Hash
1975       * @param {Object} hash The hash to modify.
1976       * @param {string} key The key of the value to remove.
1977       * @returns {boolean} Returns `true` if the entry was removed, else `false`.
1978       */
1979      function hashDelete(key) {
1980        var result = this.has(key) && delete this.__data__[key];
1981        this.size -= result ? 1 : 0;
1982        return result;
1983      }
1984  
1985      /**
1986       * Gets the hash value for `key`.
1987       *
1988       * @private
1989       * @name get
1990       * @memberOf Hash
1991       * @param {string} key The key of the value to get.
1992       * @returns {*} Returns the entry value.
1993       */
1994      function hashGet(key) {
1995        var data = this.__data__;
1996        if (nativeCreate) {
1997          var result = data[key];
1998          return result === HASH_UNDEFINED ? undefined : result;
1999        }
2000        return hasOwnProperty.call(data, key) ? data[key] : undefined;
2001      }
2002  
2003      /**
2004       * Checks if a hash value for `key` exists.
2005       *
2006       * @private
2007       * @name has
2008       * @memberOf Hash
2009       * @param {string} key The key of the entry to check.
2010       * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2011       */
2012      function hashHas(key) {
2013        var data = this.__data__;
2014        return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
2015      }
2016  
2017      /**
2018       * Sets the hash `key` to `value`.
2019       *
2020       * @private
2021       * @name set
2022       * @memberOf Hash
2023       * @param {string} key The key of the value to set.
2024       * @param {*} value The value to set.
2025       * @returns {Object} Returns the hash instance.
2026       */
2027      function hashSet(key, value) {
2028        var data = this.__data__;
2029        this.size += this.has(key) ? 0 : 1;
2030        data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
2031        return this;
2032      }
2033  
2034      // Add methods to `Hash`.
2035      Hash.prototype.clear = hashClear;
2036      Hash.prototype['delete'] = hashDelete;
2037      Hash.prototype.get = hashGet;
2038      Hash.prototype.has = hashHas;
2039      Hash.prototype.set = hashSet;
2040  
2041      /*------------------------------------------------------------------------*/
2042  
2043      /**
2044       * Creates an list cache object.
2045       *
2046       * @private
2047       * @constructor
2048       * @param {Array} [entries] The key-value pairs to cache.
2049       */
2050      function ListCache(entries) {
2051        var index = -1,
2052            length = entries == null ? 0 : entries.length;
2053  
2054        this.clear();
2055        while (++index < length) {
2056          var entry = entries[index];
2057          this.set(entry[0], entry[1]);
2058        }
2059      }
2060  
2061      /**
2062       * Removes all key-value entries from the list cache.
2063       *
2064       * @private
2065       * @name clear
2066       * @memberOf ListCache
2067       */
2068      function listCacheClear() {
2069        this.__data__ = [];
2070        this.size = 0;
2071      }
2072  
2073      /**
2074       * Removes `key` and its value from the list cache.
2075       *
2076       * @private
2077       * @name delete
2078       * @memberOf ListCache
2079       * @param {string} key The key of the value to remove.
2080       * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2081       */
2082      function listCacheDelete(key) {
2083        var data = this.__data__,
2084            index = assocIndexOf(data, key);
2085  
2086        if (index < 0) {
2087          return false;
2088        }
2089        var lastIndex = data.length - 1;
2090        if (index == lastIndex) {
2091          data.pop();
2092        } else {
2093          splice.call(data, index, 1);
2094        }
2095        --this.size;
2096        return true;
2097      }
2098  
2099      /**
2100       * Gets the list cache value for `key`.
2101       *
2102       * @private
2103       * @name get
2104       * @memberOf ListCache
2105       * @param {string} key The key of the value to get.
2106       * @returns {*} Returns the entry value.
2107       */
2108      function listCacheGet(key) {
2109        var data = this.__data__,
2110            index = assocIndexOf(data, key);
2111  
2112        return index < 0 ? undefined : data[index][1];
2113      }
2114  
2115      /**
2116       * Checks if a list cache value for `key` exists.
2117       *
2118       * @private
2119       * @name has
2120       * @memberOf ListCache
2121       * @param {string} key The key of the entry to check.
2122       * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2123       */
2124      function listCacheHas(key) {
2125        return assocIndexOf(this.__data__, key) > -1;
2126      }
2127  
2128      /**
2129       * Sets the list cache `key` to `value`.
2130       *
2131       * @private
2132       * @name set
2133       * @memberOf ListCache
2134       * @param {string} key The key of the value to set.
2135       * @param {*} value The value to set.
2136       * @returns {Object} Returns the list cache instance.
2137       */
2138      function listCacheSet(key, value) {
2139        var data = this.__data__,
2140            index = assocIndexOf(data, key);
2141  
2142        if (index < 0) {
2143          ++this.size;
2144          data.push([key, value]);
2145        } else {
2146          data[index][1] = value;
2147        }
2148        return this;
2149      }
2150  
2151      // Add methods to `ListCache`.
2152      ListCache.prototype.clear = listCacheClear;
2153      ListCache.prototype['delete'] = listCacheDelete;
2154      ListCache.prototype.get = listCacheGet;
2155      ListCache.prototype.has = listCacheHas;
2156      ListCache.prototype.set = listCacheSet;
2157  
2158      /*------------------------------------------------------------------------*/
2159  
2160      /**
2161       * Creates a map cache object to store key-value pairs.
2162       *
2163       * @private
2164       * @constructor
2165       * @param {Array} [entries] The key-value pairs to cache.
2166       */
2167      function MapCache(entries) {
2168        var index = -1,
2169            length = entries == null ? 0 : entries.length;
2170  
2171        this.clear();
2172        while (++index < length) {
2173          var entry = entries[index];
2174          this.set(entry[0], entry[1]);
2175        }
2176      }
2177  
2178      /**
2179       * Removes all key-value entries from the map.
2180       *
2181       * @private
2182       * @name clear
2183       * @memberOf MapCache
2184       */
2185      function mapCacheClear() {
2186        this.size = 0;
2187        this.__data__ = {
2188          'hash': new Hash,
2189          'map': new (Map || ListCache),
2190          'string': new Hash
2191        };
2192      }
2193  
2194      /**
2195       * Removes `key` and its value from the map.
2196       *
2197       * @private
2198       * @name delete
2199       * @memberOf MapCache
2200       * @param {string} key The key of the value to remove.
2201       * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2202       */
2203      function mapCacheDelete(key) {
2204        var result = getMapData(this, key)['delete'](key);
2205        this.size -= result ? 1 : 0;
2206        return result;
2207      }
2208  
2209      /**
2210       * Gets the map value for `key`.
2211       *
2212       * @private
2213       * @name get
2214       * @memberOf MapCache
2215       * @param {string} key The key of the value to get.
2216       * @returns {*} Returns the entry value.
2217       */
2218      function mapCacheGet(key) {
2219        return getMapData(this, key).get(key);
2220      }
2221  
2222      /**
2223       * Checks if a map value for `key` exists.
2224       *
2225       * @private
2226       * @name has
2227       * @memberOf MapCache
2228       * @param {string} key The key of the entry to check.
2229       * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2230       */
2231      function mapCacheHas(key) {
2232        return getMapData(this, key).has(key);
2233      }
2234  
2235      /**
2236       * Sets the map `key` to `value`.
2237       *
2238       * @private
2239       * @name set
2240       * @memberOf MapCache
2241       * @param {string} key The key of the value to set.
2242       * @param {*} value The value to set.
2243       * @returns {Object} Returns the map cache instance.
2244       */
2245      function mapCacheSet(key, value) {
2246        var data = getMapData(this, key),
2247            size = data.size;
2248  
2249        data.set(key, value);
2250        this.size += data.size == size ? 0 : 1;
2251        return this;
2252      }
2253  
2254      // Add methods to `MapCache`.
2255      MapCache.prototype.clear = mapCacheClear;
2256      MapCache.prototype['delete'] = mapCacheDelete;
2257      MapCache.prototype.get = mapCacheGet;
2258      MapCache.prototype.has = mapCacheHas;
2259      MapCache.prototype.set = mapCacheSet;
2260  
2261      /*------------------------------------------------------------------------*/
2262  
2263      /**
2264       *
2265       * Creates an array cache object to store unique values.
2266       *
2267       * @private
2268       * @constructor
2269       * @param {Array} [values] The values to cache.
2270       */
2271      function SetCache(values) {
2272        var index = -1,
2273            length = values == null ? 0 : values.length;
2274  
2275        this.__data__ = new MapCache;
2276        while (++index < length) {
2277          this.add(values[index]);
2278        }
2279      }
2280  
2281      /**
2282       * Adds `value` to the array cache.
2283       *
2284       * @private
2285       * @name add
2286       * @memberOf SetCache
2287       * @alias push
2288       * @param {*} value The value to cache.
2289       * @returns {Object} Returns the cache instance.
2290       */
2291      function setCacheAdd(value) {
2292        this.__data__.set(value, HASH_UNDEFINED);
2293        return this;
2294      }
2295  
2296      /**
2297       * Checks if `value` is in the array cache.
2298       *
2299       * @private
2300       * @name has
2301       * @memberOf SetCache
2302       * @param {*} value The value to search for.
2303       * @returns {number} Returns `true` if `value` is found, else `false`.
2304       */
2305      function setCacheHas(value) {
2306        return this.__data__.has(value);
2307      }
2308  
2309      // Add methods to `SetCache`.
2310      SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
2311      SetCache.prototype.has = setCacheHas;
2312  
2313      /*------------------------------------------------------------------------*/
2314  
2315      /**
2316       * Creates a stack cache object to store key-value pairs.
2317       *
2318       * @private
2319       * @constructor
2320       * @param {Array} [entries] The key-value pairs to cache.
2321       */
2322      function Stack(entries) {
2323        var data = this.__data__ = new ListCache(entries);
2324        this.size = data.size;
2325      }
2326  
2327      /**
2328       * Removes all key-value entries from the stack.
2329       *
2330       * @private
2331       * @name clear
2332       * @memberOf Stack
2333       */
2334      function stackClear() {
2335        this.__data__ = new ListCache;
2336        this.size = 0;
2337      }
2338  
2339      /**
2340       * Removes `key` and its value from the stack.
2341       *
2342       * @private
2343       * @name delete
2344       * @memberOf Stack
2345       * @param {string} key The key of the value to remove.
2346       * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2347       */
2348      function stackDelete(key) {
2349        var data = this.__data__,
2350            result = data['delete'](key);
2351  
2352        this.size = data.size;
2353        return result;
2354      }
2355  
2356      /**
2357       * Gets the stack value for `key`.
2358       *
2359       * @private
2360       * @name get
2361       * @memberOf Stack
2362       * @param {string} key The key of the value to get.
2363       * @returns {*} Returns the entry value.
2364       */
2365      function stackGet(key) {
2366        return this.__data__.get(key);
2367      }
2368  
2369      /**
2370       * Checks if a stack value for `key` exists.
2371       *
2372       * @private
2373       * @name has
2374       * @memberOf Stack
2375       * @param {string} key The key of the entry to check.
2376       * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2377       */
2378      function stackHas(key) {
2379        return this.__data__.has(key);
2380      }
2381  
2382      /**
2383       * Sets the stack `key` to `value`.
2384       *
2385       * @private
2386       * @name set
2387       * @memberOf Stack
2388       * @param {string} key The key of the value to set.
2389       * @param {*} value The value to set.
2390       * @returns {Object} Returns the stack cache instance.
2391       */
2392      function stackSet(key, value) {
2393        var data = this.__data__;
2394        if (data instanceof ListCache) {
2395          var pairs = data.__data__;
2396          if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
2397            pairs.push([key, value]);
2398            this.size = ++data.size;
2399            return this;
2400          }
2401          data = this.__data__ = new MapCache(pairs);
2402        }
2403        data.set(key, value);
2404        this.size = data.size;
2405        return this;
2406      }
2407  
2408      // Add methods to `Stack`.
2409      Stack.prototype.clear = stackClear;
2410      Stack.prototype['delete'] = stackDelete;
2411      Stack.prototype.get = stackGet;
2412      Stack.prototype.has = stackHas;
2413      Stack.prototype.set = stackSet;
2414  
2415      /*------------------------------------------------------------------------*/
2416  
2417      /**
2418       * Creates an array of the enumerable property names of the array-like `value`.
2419       *
2420       * @private
2421       * @param {*} value The value to query.
2422       * @param {boolean} inherited Specify returning inherited property names.
2423       * @returns {Array} Returns the array of property names.
2424       */
2425      function arrayLikeKeys(value, inherited) {
2426        var isArr = isArray(value),
2427            isArg = !isArr && isArguments(value),
2428            isBuff = !isArr && !isArg && isBuffer(value),
2429            isType = !isArr && !isArg && !isBuff && isTypedArray(value),
2430            skipIndexes = isArr || isArg || isBuff || isType,
2431            result = skipIndexes ? baseTimes(value.length, String) : [],
2432            length = result.length;
2433  
2434        for (var key in value) {
2435          if ((inherited || hasOwnProperty.call(value, key)) &&
2436              !(skipIndexes && (
2437                 // Safari 9 has enumerable `arguments.length` in strict mode.
2438                 key == 'length' ||
2439                 // Node.js 0.10 has enumerable non-index properties on buffers.
2440                 (isBuff && (key == 'offset' || key == 'parent')) ||
2441                 // PhantomJS 2 has enumerable non-index properties on typed arrays.
2442                 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
2443                 // Skip index properties.
2444                 isIndex(key, length)
2445              ))) {
2446            result.push(key);
2447          }
2448        }
2449        return result;
2450      }
2451  
2452      /**
2453       * A specialized version of `_.sample` for arrays.
2454       *
2455       * @private
2456       * @param {Array} array The array to sample.
2457       * @returns {*} Returns the random element.
2458       */
2459      function arraySample(array) {
2460        var length = array.length;
2461        return length ? array[baseRandom(0, length - 1)] : undefined;
2462      }
2463  
2464      /**
2465       * A specialized version of `_.sampleSize` for arrays.
2466       *
2467       * @private
2468       * @param {Array} array The array to sample.
2469       * @param {number} n The number of elements to sample.
2470       * @returns {Array} Returns the random elements.
2471       */
2472      function arraySampleSize(array, n) {
2473        return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
2474      }
2475  
2476      /**
2477       * A specialized version of `_.shuffle` for arrays.
2478       *
2479       * @private
2480       * @param {Array} array The array to shuffle.
2481       * @returns {Array} Returns the new shuffled array.
2482       */
2483      function arrayShuffle(array) {
2484        return shuffleSelf(copyArray(array));
2485      }
2486  
2487      /**
2488       * This function is like `assignValue` except that it doesn't assign
2489       * `undefined` values.
2490       *
2491       * @private
2492       * @param {Object} object The object to modify.
2493       * @param {string} key The key of the property to assign.
2494       * @param {*} value The value to assign.
2495       */
2496      function assignMergeValue(object, key, value) {
2497        if ((value !== undefined && !eq(object[key], value)) ||
2498            (value === undefined && !(key in object))) {
2499          baseAssignValue(object, key, value);
2500        }
2501      }
2502  
2503      /**
2504       * Assigns `value` to `key` of `object` if the existing value is not equivalent
2505       * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2506       * for equality comparisons.
2507       *
2508       * @private
2509       * @param {Object} object The object to modify.
2510       * @param {string} key The key of the property to assign.
2511       * @param {*} value The value to assign.
2512       */
2513      function assignValue(object, key, value) {
2514        var objValue = object[key];
2515        if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
2516            (value === undefined && !(key in object))) {
2517          baseAssignValue(object, key, value);
2518        }
2519      }
2520  
2521      /**
2522       * Gets the index at which the `key` is found in `array` of key-value pairs.
2523       *
2524       * @private
2525       * @param {Array} array The array to inspect.
2526       * @param {*} key The key to search for.
2527       * @returns {number} Returns the index of the matched value, else `-1`.
2528       */
2529      function assocIndexOf(array, key) {
2530        var length = array.length;
2531        while (length--) {
2532          if (eq(array[length][0], key)) {
2533            return length;
2534          }
2535        }
2536        return -1;
2537      }
2538  
2539      /**
2540       * Aggregates elements of `collection` on `accumulator` with keys transformed
2541       * by `iteratee` and values set by `setter`.
2542       *
2543       * @private
2544       * @param {Array|Object} collection The collection to iterate over.
2545       * @param {Function} setter The function to set `accumulator` values.
2546       * @param {Function} iteratee The iteratee to transform keys.
2547       * @param {Object} accumulator The initial aggregated object.
2548       * @returns {Function} Returns `accumulator`.
2549       */
2550      function baseAggregator(collection, setter, iteratee, accumulator) {
2551        baseEach(collection, function(value, key, collection) {
2552          setter(accumulator, value, iteratee(value), collection);
2553        });
2554        return accumulator;
2555      }
2556  
2557      /**
2558       * The base implementation of `_.assign` without support for multiple sources
2559       * or `customizer` functions.
2560       *
2561       * @private
2562       * @param {Object} object The destination object.
2563       * @param {Object} source The source object.
2564       * @returns {Object} Returns `object`.
2565       */
2566      function baseAssign(object, source) {
2567        return object && copyObject(source, keys(source), object);
2568      }
2569  
2570      /**
2571       * The base implementation of `_.assignIn` without support for multiple sources
2572       * or `customizer` functions.
2573       *
2574       * @private
2575       * @param {Object} object The destination object.
2576       * @param {Object} source The source object.
2577       * @returns {Object} Returns `object`.
2578       */
2579      function baseAssignIn(object, source) {
2580        return object && copyObject(source, keysIn(source), object);
2581      }
2582  
2583      /**
2584       * The base implementation of `assignValue` and `assignMergeValue` without
2585       * value checks.
2586       *
2587       * @private
2588       * @param {Object} object The object to modify.
2589       * @param {string} key The key of the property to assign.
2590       * @param {*} value The value to assign.
2591       */
2592      function baseAssignValue(object, key, value) {
2593        if (key == '__proto__' && defineProperty) {
2594          defineProperty(object, key, {
2595            'configurable': true,
2596            'enumerable': true,
2597            'value': value,
2598            'writable': true
2599          });
2600        } else {
2601          object[key] = value;
2602        }
2603      }
2604  
2605      /**
2606       * The base implementation of `_.at` without support for individual paths.
2607       *
2608       * @private
2609       * @param {Object} object The object to iterate over.
2610       * @param {string[]} paths The property paths to pick.
2611       * @returns {Array} Returns the picked elements.
2612       */
2613      function baseAt(object, paths) {
2614        var index = -1,
2615            length = paths.length,
2616            result = Array(length),
2617            skip = object == null;
2618  
2619        while (++index < length) {
2620          result[index] = skip ? undefined : get(object, paths[index]);
2621        }
2622        return result;
2623      }
2624  
2625      /**
2626       * The base implementation of `_.clamp` which doesn't coerce arguments.
2627       *
2628       * @private
2629       * @param {number} number The number to clamp.
2630       * @param {number} [lower] The lower bound.
2631       * @param {number} upper The upper bound.
2632       * @returns {number} Returns the clamped number.
2633       */
2634      function baseClamp(number, lower, upper) {
2635        if (number === number) {
2636          if (upper !== undefined) {
2637            number = number <= upper ? number : upper;
2638          }
2639          if (lower !== undefined) {
2640            number = number >= lower ? number : lower;
2641          }
2642        }
2643        return number;
2644      }
2645  
2646      /**
2647       * The base implementation of `_.clone` and `_.cloneDeep` which tracks
2648       * traversed objects.
2649       *
2650       * @private
2651       * @param {*} value The value to clone.
2652       * @param {boolean} bitmask The bitmask flags.
2653       *  1 - Deep clone
2654       *  2 - Flatten inherited properties
2655       *  4 - Clone symbols
2656       * @param {Function} [customizer] The function to customize cloning.
2657       * @param {string} [key] The key of `value`.
2658       * @param {Object} [object] The parent object of `value`.
2659       * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
2660       * @returns {*} Returns the cloned value.
2661       */
2662      function baseClone(value, bitmask, customizer, key, object, stack) {
2663        var result,
2664            isDeep = bitmask & CLONE_DEEP_FLAG,
2665            isFlat = bitmask & CLONE_FLAT_FLAG,
2666            isFull = bitmask & CLONE_SYMBOLS_FLAG;
2667  
2668        if (customizer) {
2669          result = object ? customizer(value, key, object, stack) : customizer(value);
2670        }
2671        if (result !== undefined) {
2672          return result;
2673        }
2674        if (!isObject(value)) {
2675          return value;
2676        }
2677        var isArr = isArray(value);
2678        if (isArr) {
2679          result = initCloneArray(value);
2680          if (!isDeep) {
2681            return copyArray(value, result);
2682          }
2683        } else {
2684          var tag = getTag(value),
2685              isFunc = tag == funcTag || tag == genTag;
2686  
2687          if (isBuffer(value)) {
2688            return cloneBuffer(value, isDeep);
2689          }
2690          if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
2691            result = (isFlat || isFunc) ? {} : initCloneObject(value);
2692            if (!isDeep) {
2693              return isFlat
2694                ? copySymbolsIn(value, baseAssignIn(result, value))
2695                : copySymbols(value, baseAssign(result, value));
2696            }
2697          } else {
2698            if (!cloneableTags[tag]) {
2699              return object ? value : {};
2700            }
2701            result = initCloneByTag(value, tag, isDeep);
2702          }
2703        }
2704        // Check for circular references and return its corresponding clone.
2705        stack || (stack = new Stack);
2706        var stacked = stack.get(value);
2707        if (stacked) {
2708          return stacked;
2709        }
2710        stack.set(value, result);
2711  
2712        if (isSet(value)) {
2713          value.forEach(function(subValue) {
2714            result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
2715          });
2716        } else if (isMap(value)) {
2717          value.forEach(function(subValue, key) {
2718            result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
2719          });
2720        }
2721  
2722        var keysFunc = isFull
2723          ? (isFlat ? getAllKeysIn : getAllKeys)
2724          : (isFlat ? keysIn : keys);
2725  
2726        var props = isArr ? undefined : keysFunc(value);
2727        arrayEach(props || value, function(subValue, key) {
2728          if (props) {
2729            key = subValue;
2730            subValue = value[key];
2731          }
2732          // Recursively populate clone (susceptible to call stack limits).
2733          assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
2734        });
2735        return result;
2736      }
2737  
2738      /**
2739       * The base implementation of `_.conforms` which doesn't clone `source`.
2740       *
2741       * @private
2742       * @param {Object} source The object of property predicates to conform to.
2743       * @returns {Function} Returns the new spec function.
2744       */
2745      function baseConforms(source) {
2746        var props = keys(source);
2747        return function(object) {
2748          return baseConformsTo(object, source, props);
2749        };
2750      }
2751  
2752      /**
2753       * The base implementation of `_.conformsTo` which accepts `props` to check.
2754       *
2755       * @private
2756       * @param {Object} object The object to inspect.
2757       * @param {Object} source The object of property predicates to conform to.
2758       * @returns {boolean} Returns `true` if `object` conforms, else `false`.
2759       */
2760      function baseConformsTo(object, source, props) {
2761        var length = props.length;
2762        if (object == null) {
2763          return !length;
2764        }
2765        object = Object(object);
2766        while (length--) {
2767          var key = props[length],
2768              predicate = source[key],
2769              value = object[key];
2770  
2771          if ((value === undefined && !(key in object)) || !predicate(value)) {
2772            return false;
2773          }
2774        }
2775        return true;
2776      }
2777  
2778      /**
2779       * The base implementation of `_.delay` and `_.defer` which accepts `args`
2780       * to provide to `func`.
2781       *
2782       * @private
2783       * @param {Function} func The function to delay.
2784       * @param {number} wait The number of milliseconds to delay invocation.
2785       * @param {Array} args The arguments to provide to `func`.
2786       * @returns {number|Object} Returns the timer id or timeout object.
2787       */
2788      function baseDelay(func, wait, args) {
2789        if (typeof func != 'function') {
2790          throw new TypeError(FUNC_ERROR_TEXT);
2791        }
2792        return setTimeout(function() { func.apply(undefined, args); }, wait);
2793      }
2794  
2795      /**
2796       * The base implementation of methods like `_.difference` without support
2797       * for excluding multiple arrays or iteratee shorthands.
2798       *
2799       * @private
2800       * @param {Array} array The array to inspect.
2801       * @param {Array} values The values to exclude.
2802       * @param {Function} [iteratee] The iteratee invoked per element.
2803       * @param {Function} [comparator] The comparator invoked per element.
2804       * @returns {Array} Returns the new array of filtered values.
2805       */
2806      function baseDifference(array, values, iteratee, comparator) {
2807        var index = -1,
2808            includes = arrayIncludes,
2809            isCommon = true,
2810            length = array.length,
2811            result = [],
2812            valuesLength = values.length;
2813  
2814        if (!length) {
2815          return result;
2816        }
2817        if (iteratee) {
2818          values = arrayMap(values, baseUnary(iteratee));
2819        }
2820        if (comparator) {
2821          includes = arrayIncludesWith;
2822          isCommon = false;
2823        }
2824        else if (values.length >= LARGE_ARRAY_SIZE) {
2825          includes = cacheHas;
2826          isCommon = false;
2827          values = new SetCache(values);
2828        }
2829        outer:
2830        while (++index < length) {
2831          var value = array[index],
2832              computed = iteratee == null ? value : iteratee(value);
2833  
2834          value = (comparator || value !== 0) ? value : 0;
2835          if (isCommon && computed === computed) {
2836            var valuesIndex = valuesLength;
2837            while (valuesIndex--) {
2838              if (values[valuesIndex] === computed) {
2839                continue outer;
2840              }
2841            }
2842            result.push(value);
2843          }
2844          else if (!includes(values, computed, comparator)) {
2845            result.push(value);
2846          }
2847        }
2848        return result;
2849      }
2850  
2851      /**
2852       * The base implementation of `_.forEach` without support for iteratee shorthands.
2853       *
2854       * @private
2855       * @param {Array|Object} collection The collection to iterate over.
2856       * @param {Function} iteratee The function invoked per iteration.
2857       * @returns {Array|Object} Returns `collection`.
2858       */
2859      var baseEach = createBaseEach(baseForOwn);
2860  
2861      /**
2862       * The base implementation of `_.forEachRight` without support for iteratee shorthands.
2863       *
2864       * @private
2865       * @param {Array|Object} collection The collection to iterate over.
2866       * @param {Function} iteratee The function invoked per iteration.
2867       * @returns {Array|Object} Returns `collection`.
2868       */
2869      var baseEachRight = createBaseEach(baseForOwnRight, true);
2870  
2871      /**
2872       * The base implementation of `_.every` without support for iteratee shorthands.
2873       *
2874       * @private
2875       * @param {Array|Object} collection The collection to iterate over.
2876       * @param {Function} predicate The function invoked per iteration.
2877       * @returns {boolean} Returns `true` if all elements pass the predicate check,
2878       *  else `false`
2879       */
2880      function baseEvery(collection, predicate) {
2881        var result = true;
2882        baseEach(collection, function(value, index, collection) {
2883          result = !!predicate(value, index, collection);
2884          return result;
2885        });
2886        return result;
2887      }
2888  
2889      /**
2890       * The base implementation of methods like `_.max` and `_.min` which accepts a
2891       * `comparator` to determine the extremum value.
2892       *
2893       * @private
2894       * @param {Array} array The array to iterate over.
2895       * @param {Function} iteratee The iteratee invoked per iteration.
2896       * @param {Function} comparator The comparator used to compare values.
2897       * @returns {*} Returns the extremum value.
2898       */
2899      function baseExtremum(array, iteratee, comparator) {
2900        var index = -1,
2901            length = array.length;
2902  
2903        while (++index < length) {
2904          var value = array[index],
2905              current = iteratee(value);
2906  
2907          if (current != null && (computed === undefined
2908                ? (current === current && !isSymbol(current))
2909                : comparator(current, computed)
2910              )) {
2911            var computed = current,
2912                result = value;
2913          }
2914        }
2915        return result;
2916      }
2917  
2918      /**
2919       * The base implementation of `_.fill` without an iteratee call guard.
2920       *
2921       * @private
2922       * @param {Array} array The array to fill.
2923       * @param {*} value The value to fill `array` with.
2924       * @param {number} [start=0] The start position.
2925       * @param {number} [end=array.length] The end position.
2926       * @returns {Array} Returns `array`.
2927       */
2928      function baseFill(array, value, start, end) {
2929        var length = array.length;
2930  
2931        start = toInteger(start);
2932        if (start < 0) {
2933          start = -start > length ? 0 : (length + start);
2934        }
2935        end = (end === undefined || end > length) ? length : toInteger(end);
2936        if (end < 0) {
2937          end += length;
2938        }
2939        end = start > end ? 0 : toLength(end);
2940        while (start < end) {
2941          array[start++] = value;
2942        }
2943        return array;
2944      }
2945  
2946      /**
2947       * The base implementation of `_.filter` without support for iteratee shorthands.
2948       *
2949       * @private
2950       * @param {Array|Object} collection The collection to iterate over.
2951       * @param {Function} predicate The function invoked per iteration.
2952       * @returns {Array} Returns the new filtered array.
2953       */
2954      function baseFilter(collection, predicate) {
2955        var result = [];
2956        baseEach(collection, function(value, index, collection) {
2957          if (predicate(value, index, collection)) {
2958            result.push(value);
2959          }
2960        });
2961        return result;
2962      }
2963  
2964      /**
2965       * The base implementation of `_.flatten` with support for restricting flattening.
2966       *
2967       * @private
2968       * @param {Array} array The array to flatten.
2969       * @param {number} depth The maximum recursion depth.
2970       * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
2971       * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
2972       * @param {Array} [result=[]] The initial result value.
2973       * @returns {Array} Returns the new flattened array.
2974       */
2975      function baseFlatten(array, depth, predicate, isStrict, result) {
2976        var index = -1,
2977            length = array.length;
2978  
2979        predicate || (predicate = isFlattenable);
2980        result || (result = []);
2981  
2982        while (++index < length) {
2983          var value = array[index];
2984          if (depth > 0 && predicate(value)) {
2985            if (depth > 1) {
2986              // Recursively flatten arrays (susceptible to call stack limits).
2987              baseFlatten(value, depth - 1, predicate, isStrict, result);
2988            } else {
2989              arrayPush(result, value);
2990            }
2991          } else if (!isStrict) {
2992            result[result.length] = value;
2993          }
2994        }
2995        return result;
2996      }
2997  
2998      /**
2999       * The base implementation of `baseForOwn` which iterates over `object`
3000       * properties returned by `keysFunc` and invokes `iteratee` for each property.
3001       * Iteratee functions may exit iteration early by explicitly returning `false`.
3002       *
3003       * @private
3004       * @param {Object} object The object to iterate over.
3005       * @param {Function} iteratee The function invoked per iteration.
3006       * @param {Function} keysFunc The function to get the keys of `object`.
3007       * @returns {Object} Returns `object`.
3008       */
3009      var baseFor = createBaseFor();
3010  
3011      /**
3012       * This function is like `baseFor` except that it iterates over properties
3013       * in the opposite order.
3014       *
3015       * @private
3016       * @param {Object} object The object to iterate over.
3017       * @param {Function} iteratee The function invoked per iteration.
3018       * @param {Function} keysFunc The function to get the keys of `object`.
3019       * @returns {Object} Returns `object`.
3020       */
3021      var baseForRight = createBaseFor(true);
3022  
3023      /**
3024       * The base implementation of `_.forOwn` without support for iteratee shorthands.
3025       *
3026       * @private
3027       * @param {Object} object The object to iterate over.
3028       * @param {Function} iteratee The function invoked per iteration.
3029       * @returns {Object} Returns `object`.
3030       */
3031      function baseForOwn(object, iteratee) {
3032        return object && baseFor(object, iteratee, keys);
3033      }
3034  
3035      /**
3036       * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
3037       *
3038       * @private
3039       * @param {Object} object The object to iterate over.
3040       * @param {Function} iteratee The function invoked per iteration.
3041       * @returns {Object} Returns `object`.
3042       */
3043      function baseForOwnRight(object, iteratee) {
3044        return object && baseForRight(object, iteratee, keys);
3045      }
3046  
3047      /**
3048       * The base implementation of `_.functions` which creates an array of
3049       * `object` function property names filtered from `props`.
3050       *
3051       * @private
3052       * @param {Object} object The object to inspect.
3053       * @param {Array} props The property names to filter.
3054       * @returns {Array} Returns the function names.
3055       */
3056      function baseFunctions(object, props) {
3057        return arrayFilter(props, function(key) {
3058          return isFunction(object[key]);
3059        });
3060      }
3061  
3062      /**
3063       * The base implementation of `_.get` without support for default values.
3064       *
3065       * @private
3066       * @param {Object} object The object to query.
3067       * @param {Array|string} path The path of the property to get.
3068       * @returns {*} Returns the resolved value.
3069       */
3070      function baseGet(object, path) {
3071        path = castPath(path, object);
3072  
3073        var index = 0,
3074            length = path.length;
3075  
3076        while (object != null && index < length) {
3077          object = object[toKey(path[index++])];
3078        }
3079        return (index && index == length) ? object : undefined;
3080      }
3081  
3082      /**
3083       * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
3084       * `keysFunc` and `symbolsFunc` to get the enumerable property names and
3085       * symbols of `object`.
3086       *
3087       * @private
3088       * @param {Object} object The object to query.
3089       * @param {Function} keysFunc The function to get the keys of `object`.
3090       * @param {Function} symbolsFunc The function to get the symbols of `object`.
3091       * @returns {Array} Returns the array of property names and symbols.
3092       */
3093      function baseGetAllKeys(object, keysFunc, symbolsFunc) {
3094        var result = keysFunc(object);
3095        return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
3096      }
3097  
3098      /**
3099       * The base implementation of `getTag` without fallbacks for buggy environments.
3100       *
3101       * @private
3102       * @param {*} value The value to query.
3103       * @returns {string} Returns the `toStringTag`.
3104       */
3105      function baseGetTag(value) {
3106        if (value == null) {
3107          return value === undefined ? undefinedTag : nullTag;
3108        }
3109        return (symToStringTag && symToStringTag in Object(value))
3110          ? getRawTag(value)
3111          : objectToString(value);
3112      }
3113  
3114      /**
3115       * The base implementation of `_.gt` which doesn't coerce arguments.
3116       *
3117       * @private
3118       * @param {*} value The value to compare.
3119       * @param {*} other The other value to compare.
3120       * @returns {boolean} Returns `true` if `value` is greater than `other`,
3121       *  else `false`.
3122       */
3123      function baseGt(value, other) {
3124        return value > other;
3125      }
3126  
3127      /**
3128       * The base implementation of `_.has` without support for deep paths.
3129       *
3130       * @private
3131       * @param {Object} [object] The object to query.
3132       * @param {Array|string} key The key to check.
3133       * @returns {boolean} Returns `true` if `key` exists, else `false`.
3134       */
3135      function baseHas(object, key) {
3136        return object != null && hasOwnProperty.call(object, key);
3137      }
3138  
3139      /**
3140       * The base implementation of `_.hasIn` without support for deep paths.
3141       *
3142       * @private
3143       * @param {Object} [object] The object to query.
3144       * @param {Array|string} key The key to check.
3145       * @returns {boolean} Returns `true` if `key` exists, else `false`.
3146       */
3147      function baseHasIn(object, key) {
3148        return object != null && key in Object(object);
3149      }
3150  
3151      /**
3152       * The base implementation of `_.inRange` which doesn't coerce arguments.
3153       *
3154       * @private
3155       * @param {number} number The number to check.
3156       * @param {number} start The start of the range.
3157       * @param {number} end The end of the range.
3158       * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
3159       */
3160      function baseInRange(number, start, end) {
3161        return number >= nativeMin(start, end) && number < nativeMax(start, end);
3162      }
3163  
3164      /**
3165       * The base implementation of methods like `_.intersection`, without support
3166       * for iteratee shorthands, that accepts an array of arrays to inspect.
3167       *
3168       * @private
3169       * @param {Array} arrays The arrays to inspect.
3170       * @param {Function} [iteratee] The iteratee invoked per element.
3171       * @param {Function} [comparator] The comparator invoked per element.
3172       * @returns {Array} Returns the new array of shared values.
3173       */
3174      function baseIntersection(arrays, iteratee, comparator) {
3175        var includes = comparator ? arrayIncludesWith : arrayIncludes,
3176            length = arrays[0].length,
3177            othLength = arrays.length,
3178            othIndex = othLength,
3179            caches = Array(othLength),
3180            maxLength = Infinity,
3181            result = [];
3182  
3183        while (othIndex--) {
3184          var array = arrays[othIndex];
3185          if (othIndex && iteratee) {
3186            array = arrayMap(array, baseUnary(iteratee));
3187          }
3188          maxLength = nativeMin(array.length, maxLength);
3189          caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
3190            ? new SetCache(othIndex && array)
3191            : undefined;
3192        }
3193        array = arrays[0];
3194  
3195        var index = -1,
3196            seen = caches[0];
3197  
3198        outer:
3199        while (++index < length && result.length < maxLength) {
3200          var value = array[index],
3201              computed = iteratee ? iteratee(value) : value;
3202  
3203          value = (comparator || value !== 0) ? value : 0;
3204          if (!(seen
3205                ? cacheHas(seen, computed)
3206                : includes(result, computed, comparator)
3207              )) {
3208            othIndex = othLength;
3209            while (--othIndex) {
3210              var cache = caches[othIndex];
3211              if (!(cache
3212                    ? cacheHas(cache, computed)
3213                    : includes(arrays[othIndex], computed, comparator))
3214                  ) {
3215                continue outer;
3216              }
3217            }
3218            if (seen) {
3219              seen.push(computed);
3220            }
3221            result.push(value);
3222          }
3223        }
3224        return result;
3225      }
3226  
3227      /**
3228       * The base implementation of `_.invert` and `_.invertBy` which inverts
3229       * `object` with values transformed by `iteratee` and set by `setter`.
3230       *
3231       * @private
3232       * @param {Object} object The object to iterate over.
3233       * @param {Function} setter The function to set `accumulator` values.
3234       * @param {Function} iteratee The iteratee to transform values.
3235       * @param {Object} accumulator The initial inverted object.
3236       * @returns {Function} Returns `accumulator`.
3237       */
3238      function baseInverter(object, setter, iteratee, accumulator) {
3239        baseForOwn(object, function(value, key, object) {
3240          setter(accumulator, iteratee(value), key, object);
3241        });
3242        return accumulator;
3243      }
3244  
3245      /**
3246       * The base implementation of `_.invoke` without support for individual
3247       * method arguments.
3248       *
3249       * @private
3250       * @param {Object} object The object to query.
3251       * @param {Array|string} path The path of the method to invoke.
3252       * @param {Array} args The arguments to invoke the method with.
3253       * @returns {*} Returns the result of the invoked method.
3254       */
3255      function baseInvoke(object, path, args) {
3256        path = castPath(path, object);
3257        object = parent(object, path);
3258        var func = object == null ? object : object[toKey(last(path))];
3259        return func == null ? undefined : apply(func, object, args);
3260      }
3261  
3262      /**
3263       * The base implementation of `_.isArguments`.
3264       *
3265       * @private
3266       * @param {*} value The value to check.
3267       * @returns {boolean} Returns `true` if `value` is an `arguments` object,
3268       */
3269      function baseIsArguments(value) {
3270        return isObjectLike(value) && baseGetTag(value) == argsTag;
3271      }
3272  
3273      /**
3274       * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
3275       *
3276       * @private
3277       * @param {*} value The value to check.
3278       * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
3279       */
3280      function baseIsArrayBuffer(value) {
3281        return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
3282      }
3283  
3284      /**
3285       * The base implementation of `_.isDate` without Node.js optimizations.
3286       *
3287       * @private
3288       * @param {*} value The value to check.
3289       * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
3290       */
3291      function baseIsDate(value) {
3292        return isObjectLike(value) && baseGetTag(value) == dateTag;
3293      }
3294  
3295      /**
3296       * The base implementation of `_.isEqual` which supports partial comparisons
3297       * and tracks traversed objects.
3298       *
3299       * @private
3300       * @param {*} value The value to compare.
3301       * @param {*} other The other value to compare.
3302       * @param {boolean} bitmask The bitmask flags.
3303       *  1 - Unordered comparison
3304       *  2 - Partial comparison
3305       * @param {Function} [customizer] The function to customize comparisons.
3306       * @param {Object} [stack] Tracks traversed `value` and `other` objects.
3307       * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3308       */
3309      function baseIsEqual(value, other, bitmask, customizer, stack) {
3310        if (value === other) {
3311          return true;
3312        }
3313        if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
3314          return value !== value && other !== other;
3315        }
3316        return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
3317      }
3318  
3319      /**
3320       * A specialized version of `baseIsEqual` for arrays and objects which performs
3321       * deep comparisons and tracks traversed objects enabling objects with circular
3322       * references to be compared.
3323       *
3324       * @private
3325       * @param {Object} object The object to compare.
3326       * @param {Object} other The other object to compare.
3327       * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
3328       * @param {Function} customizer The function to customize comparisons.
3329       * @param {Function} equalFunc The function to determine equivalents of values.
3330       * @param {Object} [stack] Tracks traversed `object` and `other` objects.
3331       * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3332       */
3333      function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
3334        var objIsArr = isArray(object),
3335            othIsArr = isArray(other),
3336            objTag = objIsArr ? arrayTag : getTag(object),
3337            othTag = othIsArr ? arrayTag : getTag(other);
3338  
3339        objTag = objTag == argsTag ? objectTag : objTag;
3340        othTag = othTag == argsTag ? objectTag : othTag;
3341  
3342        var objIsObj = objTag == objectTag,
3343            othIsObj = othTag == objectTag,
3344            isSameTag = objTag == othTag;
3345  
3346        if (isSameTag && isBuffer(object)) {
3347          if (!isBuffer(other)) {
3348            return false;
3349          }
3350          objIsArr = true;
3351          objIsObj = false;
3352        }
3353        if (isSameTag && !objIsObj) {
3354          stack || (stack = new Stack);
3355          return (objIsArr || isTypedArray(object))
3356            ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
3357            : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
3358        }
3359        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
3360          var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
3361              othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
3362  
3363          if (objIsWrapped || othIsWrapped) {
3364            var objUnwrapped = objIsWrapped ? object.value() : object,
3365                othUnwrapped = othIsWrapped ? other.value() : other;
3366  
3367            stack || (stack = new Stack);
3368            return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
3369          }
3370        }
3371        if (!isSameTag) {
3372          return false;
3373        }
3374        stack || (stack = new Stack);
3375        return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
3376      }
3377  
3378      /**
3379       * The base implementation of `_.isMap` without Node.js optimizations.
3380       *
3381       * @private
3382       * @param {*} value The value to check.
3383       * @returns {boolean} Returns `true` if `value` is a map, else `false`.
3384       */
3385      function baseIsMap(value) {
3386        return isObjectLike(value) && getTag(value) == mapTag;
3387      }
3388  
3389      /**
3390       * The base implementation of `_.isMatch` without support for iteratee shorthands.
3391       *
3392       * @private
3393       * @param {Object} object The object to inspect.
3394       * @param {Object} source The object of property values to match.
3395       * @param {Array} matchData The property names, values, and compare flags to match.
3396       * @param {Function} [customizer] The function to customize comparisons.
3397       * @returns {boolean} Returns `true` if `object` is a match, else `false`.
3398       */
3399      function baseIsMatch(object, source, matchData, customizer) {
3400        var index = matchData.length,
3401            length = index,
3402            noCustomizer = !customizer;
3403  
3404        if (object == null) {
3405          return !length;
3406        }
3407        object = Object(object);
3408        while (index--) {
3409          var data = matchData[index];
3410          if ((noCustomizer && data[2])
3411                ? data[1] !== object[data[0]]
3412                : !(data[0] in object)
3413              ) {
3414            return false;
3415          }
3416        }
3417        while (++index < length) {
3418          data = matchData[index];
3419          var key = data[0],
3420              objValue = object[key],
3421              srcValue = data[1];
3422  
3423          if (noCustomizer && data[2]) {
3424            if (objValue === undefined && !(key in object)) {
3425              return false;
3426            }
3427          } else {
3428            var stack = new Stack;
3429            if (customizer) {
3430              var result = customizer(objValue, srcValue, key, object, source, stack);
3431            }
3432            if (!(result === undefined
3433                  ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
3434                  : result
3435                )) {
3436              return false;
3437            }
3438          }
3439        }
3440        return true;
3441      }
3442  
3443      /**
3444       * The base implementation of `_.isNative` without bad shim checks.
3445       *
3446       * @private
3447       * @param {*} value The value to check.
3448       * @returns {boolean} Returns `true` if `value` is a native function,
3449       *  else `false`.
3450       */
3451      function baseIsNative(value) {
3452        if (!isObject(value) || isMasked(value)) {
3453          return false;
3454        }
3455        var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
3456        return pattern.test(toSource(value));
3457      }
3458  
3459      /**
3460       * The base implementation of `_.isRegExp` without Node.js optimizations.
3461       *
3462       * @private
3463       * @param {*} value The value to check.
3464       * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
3465       */
3466      function baseIsRegExp(value) {
3467        return isObjectLike(value) && baseGetTag(value) == regexpTag;
3468      }
3469  
3470      /**
3471       * The base implementation of `_.isSet` without Node.js optimizations.
3472       *
3473       * @private
3474       * @param {*} value The value to check.
3475       * @returns {boolean} Returns `true` if `value` is a set, else `false`.
3476       */
3477      function baseIsSet(value) {
3478        return isObjectLike(value) && getTag(value) == setTag;
3479      }
3480  
3481      /**
3482       * The base implementation of `_.isTypedArray` without Node.js optimizations.
3483       *
3484       * @private
3485       * @param {*} value The value to check.
3486       * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
3487       */
3488      function baseIsTypedArray(value) {
3489        return isObjectLike(value) &&
3490          isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
3491      }
3492  
3493      /**
3494       * The base implementation of `_.iteratee`.
3495       *
3496       * @private
3497       * @param {*} [value=_.identity] The value to convert to an iteratee.
3498       * @returns {Function} Returns the iteratee.
3499       */
3500      function baseIteratee(value) {
3501        // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
3502        // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
3503        if (typeof value == 'function') {
3504          return value;
3505        }
3506        if (value == null) {
3507          return identity;
3508        }
3509        if (typeof value == 'object') {
3510          return isArray(value)
3511            ? baseMatchesProperty(value[0], value[1])
3512            : baseMatches(value);
3513        }
3514        return property(value);
3515      }
3516  
3517      /**
3518       * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
3519       *
3520       * @private
3521       * @param {Object} object The object to query.
3522       * @returns {Array} Returns the array of property names.
3523       */
3524      function baseKeys(object) {
3525        if (!isPrototype(object)) {
3526          return nativeKeys(object);
3527        }
3528        var result = [];
3529        for (var key in Object(object)) {
3530          if (hasOwnProperty.call(object, key) && key != 'constructor') {
3531            result.push(key);
3532          }
3533        }
3534        return result;
3535      }
3536  
3537      /**
3538       * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
3539       *
3540       * @private
3541       * @param {Object} object The object to query.
3542       * @returns {Array} Returns the array of property names.
3543       */
3544      function baseKeysIn(object) {
3545        if (!isObject(object)) {
3546          return nativeKeysIn(object);
3547        }
3548        var isProto = isPrototype(object),
3549            result = [];
3550  
3551        for (var key in object) {
3552          if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
3553            result.push(key);
3554          }
3555        }
3556        return result;
3557      }
3558  
3559      /**
3560       * The base implementation of `_.lt` which doesn't coerce arguments.
3561       *
3562       * @private
3563       * @param {*} value The value to compare.
3564       * @param {*} other The other value to compare.
3565       * @returns {boolean} Returns `true` if `value` is less than `other`,
3566       *  else `false`.
3567       */
3568      function baseLt(value, other) {
3569        return value < other;
3570      }
3571  
3572      /**
3573       * The base implementation of `_.map` without support for iteratee shorthands.
3574       *
3575       * @private
3576       * @param {Array|Object} collection The collection to iterate over.
3577       * @param {Function} iteratee The function invoked per iteration.
3578       * @returns {Array} Returns the new mapped array.
3579       */
3580      function baseMap(collection, iteratee) {
3581        var index = -1,
3582            result = isArrayLike(collection) ? Array(collection.length) : [];
3583  
3584        baseEach(collection, function(value, key, collection) {
3585          result[++index] = iteratee(value, key, collection);
3586        });
3587        return result;
3588      }
3589  
3590      /**
3591       * The base implementation of `_.matches` which doesn't clone `source`.
3592       *
3593       * @private
3594       * @param {Object} source The object of property values to match.
3595       * @returns {Function} Returns the new spec function.
3596       */
3597      function baseMatches(source) {
3598        var matchData = getMatchData(source);
3599        if (matchData.length == 1 && matchData[0][2]) {
3600          return matchesStrictComparable(matchData[0][0], matchData[0][1]);
3601        }
3602        return function(object) {
3603          return object === source || baseIsMatch(object, source, matchData);
3604        };
3605      }
3606  
3607      /**
3608       * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
3609       *
3610       * @private
3611       * @param {string} path The path of the property to get.
3612       * @param {*} srcValue The value to match.
3613       * @returns {Function} Returns the new spec function.
3614       */
3615      function baseMatchesProperty(path, srcValue) {
3616        if (isKey(path) && isStrictComparable(srcValue)) {
3617          return matchesStrictComparable(toKey(path), srcValue);
3618        }
3619        return function(object) {
3620          var objValue = get(object, path);
3621          return (objValue === undefined && objValue === srcValue)
3622            ? hasIn(object, path)
3623            : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
3624        };
3625      }
3626  
3627      /**
3628       * The base implementation of `_.merge` without support for multiple sources.
3629       *
3630       * @private
3631       * @param {Object} object The destination object.
3632       * @param {Object} source The source object.
3633       * @param {number} srcIndex The index of `source`.
3634       * @param {Function} [customizer] The function to customize merged values.
3635       * @param {Object} [stack] Tracks traversed source values and their merged
3636       *  counterparts.
3637       */
3638      function baseMerge(object, source, srcIndex, customizer, stack) {
3639        if (object === source) {
3640          return;
3641        }
3642        baseFor(source, function(srcValue, key) {
3643          stack || (stack = new Stack);
3644          if (isObject(srcValue)) {
3645            baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
3646          }
3647          else {
3648            var newValue = customizer
3649              ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
3650              : undefined;
3651  
3652            if (newValue === undefined) {
3653              newValue = srcValue;
3654            }
3655            assignMergeValue(object, key, newValue);
3656          }
3657        }, keysIn);
3658      }
3659  
3660      /**
3661       * A specialized version of `baseMerge` for arrays and objects which performs
3662       * deep merges and tracks traversed objects enabling objects with circular
3663       * references to be merged.
3664       *
3665       * @private
3666       * @param {Object} object The destination object.
3667       * @param {Object} source The source object.
3668       * @param {string} key The key of the value to merge.
3669       * @param {number} srcIndex The index of `source`.
3670       * @param {Function} mergeFunc The function to merge values.
3671       * @param {Function} [customizer] The function to customize assigned values.
3672       * @param {Object} [stack] Tracks traversed source values and their merged
3673       *  counterparts.
3674       */
3675      function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
3676        var objValue = safeGet(object, key),
3677            srcValue = safeGet(source, key),
3678            stacked = stack.get(srcValue);
3679  
3680        if (stacked) {
3681          assignMergeValue(object, key, stacked);
3682          return;
3683        }
3684        var newValue = customizer
3685          ? customizer(objValue, srcValue, (key + ''), object, source, stack)
3686          : undefined;
3687  
3688        var isCommon = newValue === undefined;
3689  
3690        if (isCommon) {
3691          var isArr = isArray(srcValue),
3692              isBuff = !isArr && isBuffer(srcValue),
3693              isTyped = !isArr && !isBuff && isTypedArray(srcValue);
3694  
3695          newValue = srcValue;
3696          if (isArr || isBuff || isTyped) {
3697            if (isArray(objValue)) {
3698              newValue = objValue;
3699            }
3700            else if (isArrayLikeObject(objValue)) {
3701              newValue = copyArray(objValue);
3702            }
3703            else if (isBuff) {
3704              isCommon = false;
3705              newValue = cloneBuffer(srcValue, true);
3706            }
3707            else if (isTyped) {
3708              isCommon = false;
3709              newValue = cloneTypedArray(srcValue, true);
3710            }
3711            else {
3712              newValue = [];
3713            }
3714          }
3715          else if (isPlainObject(srcValue) || isArguments(srcValue)) {
3716            newValue = objValue;
3717            if (isArguments(objValue)) {
3718              newValue = toPlainObject(objValue);
3719            }
3720            else if (!isObject(objValue) || isFunction(objValue)) {
3721              newValue = initCloneObject(srcValue);
3722            }
3723          }
3724          else {
3725            isCommon = false;
3726          }
3727        }
3728        if (isCommon) {
3729          // Recursively merge objects and arrays (susceptible to call stack limits).
3730          stack.set(srcValue, newValue);
3731          mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
3732          stack['delete'](srcValue);
3733        }
3734        assignMergeValue(object, key, newValue);
3735      }
3736  
3737      /**
3738       * The base implementation of `_.nth` which doesn't coerce arguments.
3739       *
3740       * @private
3741       * @param {Array} array The array to query.
3742       * @param {number} n The index of the element to return.
3743       * @returns {*} Returns the nth element of `array`.
3744       */
3745      function baseNth(array, n) {
3746        var length = array.length;
3747        if (!length) {
3748          return;
3749        }
3750        n += n < 0 ? length : 0;
3751        return isIndex(n, length) ? array[n] : undefined;
3752      }
3753  
3754      /**
3755       * The base implementation of `_.orderBy` without param guards.
3756       *
3757       * @private
3758       * @param {Array|Object} collection The collection to iterate over.
3759       * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
3760       * @param {string[]} orders The sort orders of `iteratees`.
3761       * @returns {Array} Returns the new sorted array.
3762       */
3763      function baseOrderBy(collection, iteratees, orders) {
3764        if (iteratees.length) {
3765          iteratees = arrayMap(iteratees, function(iteratee) {
3766            if (isArray(iteratee)) {
3767              return function(value) {
3768                return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
3769              }
3770            }
3771            return iteratee;
3772          });
3773        } else {
3774          iteratees = [identity];
3775        }
3776  
3777        var index = -1;
3778        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
3779  
3780        var result = baseMap(collection, function(value, key, collection) {
3781          var criteria = arrayMap(iteratees, function(iteratee) {
3782            return iteratee(value);
3783          });
3784          return { 'criteria': criteria, 'index': ++index, 'value': value };
3785        });
3786  
3787        return baseSortBy(result, function(object, other) {
3788          return compareMultiple(object, other, orders);
3789        });
3790      }
3791  
3792      /**
3793       * The base implementation of `_.pick` without support for individual
3794       * property identifiers.
3795       *
3796       * @private
3797       * @param {Object} object The source object.
3798       * @param {string[]} paths The property paths to pick.
3799       * @returns {Object} Returns the new object.
3800       */
3801      function basePick(object, paths) {
3802        return basePickBy(object, paths, function(value, path) {
3803          return hasIn(object, path);
3804        });
3805      }
3806  
3807      /**
3808       * The base implementation of  `_.pickBy` without support for iteratee shorthands.
3809       *
3810       * @private
3811       * @param {Object} object The source object.
3812       * @param {string[]} paths The property paths to pick.
3813       * @param {Function} predicate The function invoked per property.
3814       * @returns {Object} Returns the new object.
3815       */
3816      function basePickBy(object, paths, predicate) {
3817        var index = -1,
3818            length = paths.length,
3819            result = {};
3820  
3821        while (++index < length) {
3822          var path = paths[index],
3823              value = baseGet(object, path);
3824  
3825          if (predicate(value, path)) {
3826            baseSet(result, castPath(path, object), value);
3827          }
3828        }
3829        return result;
3830      }
3831  
3832      /**
3833       * A specialized version of `baseProperty` which supports deep paths.
3834       *
3835       * @private
3836       * @param {Array|string} path The path of the property to get.
3837       * @returns {Function} Returns the new accessor function.
3838       */
3839      function basePropertyDeep(path) {
3840        return function(object) {
3841          return baseGet(object, path);
3842        };
3843      }
3844  
3845      /**
3846       * The base implementation of `_.pullAllBy` without support for iteratee
3847       * shorthands.
3848       *
3849       * @private
3850       * @param {Array} array The array to modify.
3851       * @param {Array} values The values to remove.
3852       * @param {Function} [iteratee] The iteratee invoked per element.
3853       * @param {Function} [comparator] The comparator invoked per element.
3854       * @returns {Array} Returns `array`.
3855       */
3856      function basePullAll(array, values, iteratee, comparator) {
3857        var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
3858            index = -1,
3859            length = values.length,
3860            seen = array;
3861  
3862        if (array === values) {
3863          values = copyArray(values);
3864        }
3865        if (iteratee) {
3866          seen = arrayMap(array, baseUnary(iteratee));
3867        }
3868        while (++index < length) {
3869          var fromIndex = 0,
3870              value = values[index],
3871              computed = iteratee ? iteratee(value) : value;
3872  
3873          while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
3874            if (seen !== array) {
3875              splice.call(seen, fromIndex, 1);
3876            }
3877            splice.call(array, fromIndex, 1);
3878          }
3879        }
3880        return array;
3881      }
3882  
3883      /**
3884       * The base implementation of `_.pullAt` without support for individual
3885       * indexes or capturing the removed elements.
3886       *
3887       * @private
3888       * @param {Array} array The array to modify.
3889       * @param {number[]} indexes The indexes of elements to remove.
3890       * @returns {Array} Returns `array`.
3891       */
3892      function basePullAt(array, indexes) {
3893        var length = array ? indexes.length : 0,
3894            lastIndex = length - 1;
3895  
3896        while (length--) {
3897          var index = indexes[length];
3898          if (length == lastIndex || index !== previous) {
3899            var previous = index;
3900            if (isIndex(index)) {
3901              splice.call(array, index, 1);
3902            } else {
3903              baseUnset(array, index);
3904            }
3905          }
3906        }
3907        return array;
3908      }
3909  
3910      /**
3911       * The base implementation of `_.random` without support for returning
3912       * floating-point numbers.
3913       *
3914       * @private
3915       * @param {number} lower The lower bound.
3916       * @param {number} upper The upper bound.
3917       * @returns {number} Returns the random number.
3918       */
3919      function baseRandom(lower, upper) {
3920        return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
3921      }
3922  
3923      /**
3924       * The base implementation of `_.range` and `_.rangeRight` which doesn't
3925       * coerce arguments.
3926       *
3927       * @private
3928       * @param {number} start The start of the range.
3929       * @param {number} end The end of the range.
3930       * @param {number} step The value to increment or decrement by.
3931       * @param {boolean} [fromRight] Specify iterating from right to left.
3932       * @returns {Array} Returns the range of numbers.
3933       */
3934      function baseRange(start, end, step, fromRight) {
3935        var index = -1,
3936            length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
3937            result = Array(length);
3938  
3939        while (length--) {
3940          result[fromRight ? length : ++index] = start;
3941          start += step;
3942        }
3943        return result;
3944      }
3945  
3946      /**
3947       * The base implementation of `_.repeat` which doesn't coerce arguments.
3948       *
3949       * @private
3950       * @param {string} string The string to repeat.
3951       * @param {number} n The number of times to repeat the string.
3952       * @returns {string} Returns the repeated string.
3953       */
3954      function baseRepeat(string, n) {
3955        var result = '';
3956        if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
3957          return result;
3958        }
3959        // Leverage the exponentiation by squaring algorithm for a faster repeat.
3960        // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
3961        do {
3962          if (n % 2) {
3963            result += string;
3964          }
3965          n = nativeFloor(n / 2);
3966          if (n) {
3967            string += string;
3968          }
3969        } while (n);
3970  
3971        return result;
3972      }
3973  
3974      /**
3975       * The base implementation of `_.rest` which doesn't validate or coerce arguments.
3976       *
3977       * @private
3978       * @param {Function} func The function to apply a rest parameter to.
3979       * @param {number} [start=func.length-1] The start position of the rest parameter.
3980       * @returns {Function} Returns the new function.
3981       */
3982      function baseRest(func, start) {
3983        return setToString(overRest(func, start, identity), func + '');
3984      }
3985  
3986      /**
3987       * The base implementation of `_.sample`.
3988       *
3989       * @private
3990       * @param {Array|Object} collection The collection to sample.
3991       * @returns {*} Returns the random element.
3992       */
3993      function baseSample(collection) {
3994        return arraySample(values(collection));
3995      }
3996  
3997      /**
3998       * The base implementation of `_.sampleSize` without param guards.
3999       *
4000       * @private
4001       * @param {Array|Object} collection The collection to sample.
4002       * @param {number} n The number of elements to sample.
4003       * @returns {Array} Returns the random elements.
4004       */
4005      function baseSampleSize(collection, n) {
4006        var array = values(collection);
4007        return shuffleSelf(array, baseClamp(n, 0, array.length));
4008      }
4009  
4010      /**
4011       * The base implementation of `_.set`.
4012       *
4013       * @private
4014       * @param {Object} object The object to modify.
4015       * @param {Array|string} path The path of the property to set.
4016       * @param {*} value The value to set.
4017       * @param {Function} [customizer] The function to customize path creation.
4018       * @returns {Object} Returns `object`.
4019       */
4020      function baseSet(object, path, value, customizer) {
4021        if (!isObject(object)) {
4022          return object;
4023        }
4024        path = castPath(path, object);
4025  
4026        var index = -1,
4027            length = path.length,
4028            lastIndex = length - 1,
4029            nested = object;
4030  
4031        while (nested != null && ++index < length) {
4032          var key = toKey(path[index]),
4033              newValue = value;
4034  
4035          if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
4036            return object;
4037          }
4038  
4039          if (index != lastIndex) {
4040            var objValue = nested[key];
4041            newValue = customizer ? customizer(objValue, key, nested) : undefined;
4042            if (newValue === undefined) {
4043              newValue = isObject(objValue)
4044                ? objValue
4045                : (isIndex(path[index + 1]) ? [] : {});
4046            }
4047          }
4048          assignValue(nested, key, newValue);
4049          nested = nested[key];
4050        }
4051        return object;
4052      }
4053  
4054      /**
4055       * The base implementation of `setData` without support for hot loop shorting.
4056       *
4057       * @private
4058       * @param {Function} func The function to associate metadata with.
4059       * @param {*} data The metadata.
4060       * @returns {Function} Returns `func`.
4061       */
4062      var baseSetData = !metaMap ? identity : function(func, data) {
4063        metaMap.set(func, data);
4064        return func;
4065      };
4066  
4067      /**
4068       * The base implementation of `setToString` without support for hot loop shorting.
4069       *
4070       * @private
4071       * @param {Function} func The function to modify.
4072       * @param {Function} string The `toString` result.
4073       * @returns {Function} Returns `func`.
4074       */
4075      var baseSetToString = !defineProperty ? identity : function(func, string) {
4076        return defineProperty(func, 'toString', {
4077          'configurable': true,
4078          'enumerable': false,
4079          'value': constant(string),
4080          'writable': true
4081        });
4082      };
4083  
4084      /**
4085       * The base implementation of `_.shuffle`.
4086       *
4087       * @private
4088       * @param {Array|Object} collection The collection to shuffle.
4089       * @returns {Array} Returns the new shuffled array.
4090       */
4091      function baseShuffle(collection) {
4092        return shuffleSelf(values(collection));
4093      }
4094  
4095      /**
4096       * The base implementation of `_.slice` without an iteratee call guard.
4097       *
4098       * @private
4099       * @param {Array} array The array to slice.
4100       * @param {number} [start=0] The start position.
4101       * @param {number} [end=array.length] The end position.
4102       * @returns {Array} Returns the slice of `array`.
4103       */
4104      function baseSlice(array, start, end) {
4105        var index = -1,
4106            length = array.length;
4107  
4108        if (start < 0) {
4109          start = -start > length ? 0 : (length + start);
4110        }
4111        end = end > length ? length : end;
4112        if (end < 0) {
4113          end += length;
4114        }
4115        length = start > end ? 0 : ((end - start) >>> 0);
4116        start >>>= 0;
4117  
4118        var result = Array(length);
4119        while (++index < length) {
4120          result[index] = array[index + start];
4121        }
4122        return result;
4123      }
4124  
4125      /**
4126       * The base implementation of `_.some` without support for iteratee shorthands.
4127       *
4128       * @private
4129       * @param {Array|Object} collection The collection to iterate over.
4130       * @param {Function} predicate The function invoked per iteration.
4131       * @returns {boolean} Returns `true` if any element passes the predicate check,
4132       *  else `false`.
4133       */
4134      function baseSome(collection, predicate) {
4135        var result;
4136  
4137        baseEach(collection, function(value, index, collection) {
4138          result = predicate(value, index, collection);
4139          return !result;
4140        });
4141        return !!result;
4142      }
4143  
4144      /**
4145       * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
4146       * performs a binary search of `array` to determine the index at which `value`
4147       * should be inserted into `array` in order to maintain its sort order.
4148       *
4149       * @private
4150       * @param {Array} array The sorted array to inspect.
4151       * @param {*} value The value to evaluate.
4152       * @param {boolean} [retHighest] Specify returning the highest qualified index.
4153       * @returns {number} Returns the index at which `value` should be inserted
4154       *  into `array`.
4155       */
4156      function baseSortedIndex(array, value, retHighest) {
4157        var low = 0,
4158            high = array == null ? low : array.length;
4159  
4160        if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
4161          while (low < high) {
4162            var mid = (low + high) >>> 1,
4163                computed = array[mid];
4164  
4165            if (computed !== null && !isSymbol(computed) &&
4166                (retHighest ? (computed <= value) : (computed < value))) {
4167              low = mid + 1;
4168            } else {
4169              high = mid;
4170            }
4171          }
4172          return high;
4173        }
4174        return baseSortedIndexBy(array, value, identity, retHighest);
4175      }
4176  
4177      /**
4178       * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
4179       * which invokes `iteratee` for `value` and each element of `array` to compute
4180       * their sort ranking. The iteratee is invoked with one argument; (value).
4181       *
4182       * @private
4183       * @param {Array} array The sorted array to inspect.
4184       * @param {*} value The value to evaluate.
4185       * @param {Function} iteratee The iteratee invoked per element.
4186       * @param {boolean} [retHighest] Specify returning the highest qualified index.
4187       * @returns {number} Returns the index at which `value` should be inserted
4188       *  into `array`.
4189       */
4190      function baseSortedIndexBy(array, value, iteratee, retHighest) {
4191        var low = 0,
4192            high = array == null ? 0 : array.length;
4193        if (high === 0) {
4194          return 0;
4195        }
4196  
4197        value = iteratee(value);
4198        var valIsNaN = value !== value,
4199            valIsNull = value === null,
4200            valIsSymbol = isSymbol(value),
4201            valIsUndefined = value === undefined;
4202  
4203        while (low < high) {
4204          var mid = nativeFloor((low + high) / 2),
4205              computed = iteratee(array[mid]),
4206              othIsDefined = computed !== undefined,
4207              othIsNull = computed === null,
4208              othIsReflexive = computed === computed,
4209              othIsSymbol = isSymbol(computed);
4210  
4211          if (valIsNaN) {
4212            var setLow = retHighest || othIsReflexive;
4213          } else if (valIsUndefined) {
4214            setLow = othIsReflexive && (retHighest || othIsDefined);
4215          } else if (valIsNull) {
4216            setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
4217          } else if (valIsSymbol) {
4218            setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
4219          } else if (othIsNull || othIsSymbol) {
4220            setLow = false;
4221          } else {
4222            setLow = retHighest ? (computed <= value) : (computed < value);
4223          }
4224          if (setLow) {
4225            low = mid + 1;
4226          } else {
4227            high = mid;
4228          }
4229        }
4230        return nativeMin(high, MAX_ARRAY_INDEX);
4231      }
4232  
4233      /**
4234       * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
4235       * support for iteratee shorthands.
4236       *
4237       * @private
4238       * @param {Array} array The array to inspect.
4239       * @param {Function} [iteratee] The iteratee invoked per element.
4240       * @returns {Array} Returns the new duplicate free array.
4241       */
4242      function baseSortedUniq(array, iteratee) {
4243        var index = -1,
4244            length = array.length,
4245            resIndex = 0,
4246            result = [];
4247  
4248        while (++index < length) {
4249          var value = array[index],
4250              computed = iteratee ? iteratee(value) : value;
4251  
4252          if (!index || !eq(computed, seen)) {
4253            var seen = computed;
4254            result[resIndex++] = value === 0 ? 0 : value;
4255          }
4256        }
4257        return result;
4258      }
4259  
4260      /**
4261       * The base implementation of `_.toNumber` which doesn't ensure correct
4262       * conversions of binary, hexadecimal, or octal string values.
4263       *
4264       * @private
4265       * @param {*} value The value to process.
4266       * @returns {number} Returns the number.
4267       */
4268      function baseToNumber(value) {
4269        if (typeof value == 'number') {
4270          return value;
4271        }
4272        if (isSymbol(value)) {
4273          return NAN;
4274        }
4275        return +value;
4276      }
4277  
4278      /**
4279       * The base implementation of `_.toString` which doesn't convert nullish
4280       * values to empty strings.
4281       *
4282       * @private
4283       * @param {*} value The value to process.
4284       * @returns {string} Returns the string.
4285       */
4286      function baseToString(value) {
4287        // Exit early for strings to avoid a performance hit in some environments.
4288        if (typeof value == 'string') {
4289          return value;
4290        }
4291        if (isArray(value)) {
4292          // Recursively convert values (susceptible to call stack limits).
4293          return arrayMap(value, baseToString) + '';
4294        }
4295        if (isSymbol(value)) {
4296          return symbolToString ? symbolToString.call(value) : '';
4297        }
4298        var result = (value + '');
4299        return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
4300      }
4301  
4302      /**
4303       * The base implementation of `_.uniqBy` without support for iteratee shorthands.
4304       *
4305       * @private
4306       * @param {Array} array The array to inspect.
4307       * @param {Function} [iteratee] The iteratee invoked per element.
4308       * @param {Function} [comparator] The comparator invoked per element.
4309       * @returns {Array} Returns the new duplicate free array.
4310       */
4311      function baseUniq(array, iteratee, comparator) {
4312        var index = -1,
4313            includes = arrayIncludes,
4314            length = array.length,
4315            isCommon = true,
4316            result = [],
4317            seen = result;
4318  
4319        if (comparator) {
4320          isCommon = false;
4321          includes = arrayIncludesWith;
4322        }
4323        else if (length >= LARGE_ARRAY_SIZE) {
4324          var set = iteratee ? null : createSet(array);
4325          if (set) {
4326            return setToArray(set);
4327          }
4328          isCommon = false;
4329          includes = cacheHas;
4330          seen = new SetCache;
4331        }
4332        else {
4333          seen = iteratee ? [] : result;
4334        }
4335        outer:
4336        while (++index < length) {
4337          var value = array[index],
4338              computed = iteratee ? iteratee(value) : value;
4339  
4340          value = (comparator || value !== 0) ? value : 0;
4341          if (isCommon && computed === computed) {
4342            var seenIndex = seen.length;
4343            while (seenIndex--) {
4344              if (seen[seenIndex] === computed) {
4345                continue outer;
4346              }
4347            }
4348            if (iteratee) {
4349              seen.push(computed);
4350            }
4351            result.push(value);
4352          }
4353          else if (!includes(seen, computed, comparator)) {
4354            if (seen !== result) {
4355              seen.push(computed);
4356            }
4357            result.push(value);
4358          }
4359        }
4360        return result;
4361      }
4362  
4363      /**
4364       * The base implementation of `_.unset`.
4365       *
4366       * @private
4367       * @param {Object} object The object to modify.
4368       * @param {Array|string} path The property path to unset.
4369       * @returns {boolean} Returns `true` if the property is deleted, else `false`.
4370       */
4371      function baseUnset(object, path) {
4372        path = castPath(path, object);
4373        object = parent(object, path);
4374        return object == null || delete object[toKey(last(path))];
4375      }
4376  
4377      /**
4378       * The base implementation of `_.update`.
4379       *
4380       * @private
4381       * @param {Object} object The object to modify.
4382       * @param {Array|string} path The path of the property to update.
4383       * @param {Function} updater The function to produce the updated value.
4384       * @param {Function} [customizer] The function to customize path creation.
4385       * @returns {Object} Returns `object`.
4386       */
4387      function baseUpdate(object, path, updater, customizer) {
4388        return baseSet(object, path, updater(baseGet(object, path)), customizer);
4389      }
4390  
4391      /**
4392       * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
4393       * without support for iteratee shorthands.
4394       *
4395       * @private
4396       * @param {Array} array The array to query.
4397       * @param {Function} predicate The function invoked per iteration.
4398       * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
4399       * @param {boolean} [fromRight] Specify iterating from right to left.
4400       * @returns {Array} Returns the slice of `array`.
4401       */
4402      function baseWhile(array, predicate, isDrop, fromRight) {
4403        var length = array.length,
4404            index = fromRight ? length : -1;
4405  
4406        while ((fromRight ? index-- : ++index < length) &&
4407          predicate(array[index], index, array)) {}
4408  
4409        return isDrop
4410          ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
4411          : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
4412      }
4413  
4414      /**
4415       * The base implementation of `wrapperValue` which returns the result of
4416       * performing a sequence of actions on the unwrapped `value`, where each
4417       * successive action is supplied the return value of the previous.
4418       *
4419       * @private
4420       * @param {*} value The unwrapped value.
4421       * @param {Array} actions Actions to perform to resolve the unwrapped value.
4422       * @returns {*} Returns the resolved value.
4423       */
4424      function baseWrapperValue(value, actions) {
4425        var result = value;
4426        if (result instanceof LazyWrapper) {
4427          result = result.value();
4428        }
4429        return arrayReduce(actions, function(result, action) {
4430          return action.func.apply(action.thisArg, arrayPush([result], action.args));
4431        }, result);
4432      }
4433  
4434      /**
4435       * The base implementation of methods like `_.xor`, without support for
4436       * iteratee shorthands, that accepts an array of arrays to inspect.
4437       *
4438       * @private
4439       * @param {Array} arrays The arrays to inspect.
4440       * @param {Function} [iteratee] The iteratee invoked per element.
4441       * @param {Function} [comparator] The comparator invoked per element.
4442       * @returns {Array} Returns the new array of values.
4443       */
4444      function baseXor(arrays, iteratee, comparator) {
4445        var length = arrays.length;
4446        if (length < 2) {
4447          return length ? baseUniq(arrays[0]) : [];
4448        }
4449        var index = -1,
4450            result = Array(length);
4451  
4452        while (++index < length) {
4453          var array = arrays[index],
4454              othIndex = -1;
4455  
4456          while (++othIndex < length) {
4457            if (othIndex != index) {
4458              result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
4459            }
4460          }
4461        }
4462        return baseUniq(baseFlatten(result, 1), iteratee, comparator);
4463      }
4464  
4465      /**
4466       * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
4467       *
4468       * @private
4469       * @param {Array} props The property identifiers.
4470       * @param {Array} values The property values.
4471       * @param {Function} assignFunc The function to assign values.
4472       * @returns {Object} Returns the new object.
4473       */
4474      function baseZipObject(props, values, assignFunc) {
4475        var index = -1,
4476            length = props.length,
4477            valsLength = values.length,
4478            result = {};
4479  
4480        while (++index < length) {
4481          var value = index < valsLength ? values[index] : undefined;
4482          assignFunc(result, props[index], value);
4483        }
4484        return result;
4485      }
4486  
4487      /**
4488       * Casts `value` to an empty array if it's not an array like object.
4489       *
4490       * @private
4491       * @param {*} value The value to inspect.
4492       * @returns {Array|Object} Returns the cast array-like object.
4493       */
4494      function castArrayLikeObject(value) {
4495        return isArrayLikeObject(value) ? value : [];
4496      }
4497  
4498      /**
4499       * Casts `value` to `identity` if it's not a function.
4500       *
4501       * @private
4502       * @param {*} value The value to inspect.
4503       * @returns {Function} Returns cast function.
4504       */
4505      function castFunction(value) {
4506        return typeof value == 'function' ? value : identity;
4507      }
4508  
4509      /**
4510       * Casts `value` to a path array if it's not one.
4511       *
4512       * @private
4513       * @param {*} value The value to inspect.
4514       * @param {Object} [object] The object to query keys on.
4515       * @returns {Array} Returns the cast property path array.
4516       */
4517      function castPath(value, object) {
4518        if (isArray(value)) {
4519          return value;
4520        }
4521        return isKey(value, object) ? [value] : stringToPath(toString(value));
4522      }
4523  
4524      /**
4525       * A `baseRest` alias which can be replaced with `identity` by module
4526       * replacement plugins.
4527       *
4528       * @private
4529       * @type {Function}
4530       * @param {Function} func The function to apply a rest parameter to.
4531       * @returns {Function} Returns the new function.
4532       */
4533      var castRest = baseRest;
4534  
4535      /**
4536       * Casts `array` to a slice if it's needed.
4537       *
4538       * @private
4539       * @param {Array} array The array to inspect.
4540       * @param {number} start The start position.
4541       * @param {number} [end=array.length] The end position.
4542       * @returns {Array} Returns the cast slice.
4543       */
4544      function castSlice(array, start, end) {
4545        var length = array.length;
4546        end = end === undefined ? length : end;
4547        return (!start && end >= length) ? array : baseSlice(array, start, end);
4548      }
4549  
4550      /**
4551       * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
4552       *
4553       * @private
4554       * @param {number|Object} id The timer id or timeout object of the timer to clear.
4555       */
4556      var clearTimeout = ctxClearTimeout || function(id) {
4557        return root.clearTimeout(id);
4558      };
4559  
4560      /**
4561       * Creates a clone of  `buffer`.
4562       *
4563       * @private
4564       * @param {Buffer} buffer The buffer to clone.
4565       * @param {boolean} [isDeep] Specify a deep clone.
4566       * @returns {Buffer} Returns the cloned buffer.
4567       */
4568      function cloneBuffer(buffer, isDeep) {
4569        if (isDeep) {
4570          return buffer.slice();
4571        }
4572        var length = buffer.length,
4573            result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
4574  
4575        buffer.copy(result);
4576        return result;
4577      }
4578  
4579      /**
4580       * Creates a clone of `arrayBuffer`.
4581       *
4582       * @private
4583       * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
4584       * @returns {ArrayBuffer} Returns the cloned array buffer.
4585       */
4586      function cloneArrayBuffer(arrayBuffer) {
4587        var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
4588        new Uint8Array(result).set(new Uint8Array(arrayBuffer));
4589        return result;
4590      }
4591  
4592      /**
4593       * Creates a clone of `dataView`.
4594       *
4595       * @private
4596       * @param {Object} dataView The data view to clone.
4597       * @param {boolean} [isDeep] Specify a deep clone.
4598       * @returns {Object} Returns the cloned data view.
4599       */
4600      function cloneDataView(dataView, isDeep) {
4601        var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
4602        return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
4603      }
4604  
4605      /**
4606       * Creates a clone of `regexp`.
4607       *
4608       * @private
4609       * @param {Object} regexp The regexp to clone.
4610       * @returns {Object} Returns the cloned regexp.
4611       */
4612      function cloneRegExp(regexp) {
4613        var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
4614        result.lastIndex = regexp.lastIndex;
4615        return result;
4616      }
4617  
4618      /**
4619       * Creates a clone of the `symbol` object.
4620       *
4621       * @private
4622       * @param {Object} symbol The symbol object to clone.
4623       * @returns {Object} Returns the cloned symbol object.
4624       */
4625      function cloneSymbol(symbol) {
4626        return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
4627      }
4628  
4629      /**
4630       * Creates a clone of `typedArray`.
4631       *
4632       * @private
4633       * @param {Object} typedArray The typed array to clone.
4634       * @param {boolean} [isDeep] Specify a deep clone.
4635       * @returns {Object} Returns the cloned typed array.
4636       */
4637      function cloneTypedArray(typedArray, isDeep) {
4638        var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
4639        return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
4640      }
4641  
4642      /**
4643       * Compares values to sort them in ascending order.
4644       *
4645       * @private
4646       * @param {*} value The value to compare.
4647       * @param {*} other The other value to compare.
4648       * @returns {number} Returns the sort order indicator for `value`.
4649       */
4650      function compareAscending(value, other) {
4651        if (value !== other) {
4652          var valIsDefined = value !== undefined,
4653              valIsNull = value === null,
4654              valIsReflexive = value === value,
4655              valIsSymbol = isSymbol(value);
4656  
4657          var othIsDefined = other !== undefined,
4658              othIsNull = other === null,
4659              othIsReflexive = other === other,
4660              othIsSymbol = isSymbol(other);
4661  
4662          if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
4663              (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
4664              (valIsNull && othIsDefined && othIsReflexive) ||
4665              (!valIsDefined && othIsReflexive) ||
4666              !valIsReflexive) {
4667            return 1;
4668          }
4669          if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
4670              (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
4671              (othIsNull && valIsDefined && valIsReflexive) ||
4672              (!othIsDefined && valIsReflexive) ||
4673              !othIsReflexive) {
4674            return -1;
4675          }
4676        }
4677        return 0;
4678      }
4679  
4680      /**
4681       * Used by `_.orderBy` to compare multiple properties of a value to another
4682       * and stable sort them.
4683       *
4684       * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
4685       * specify an order of "desc" for descending or "asc" for ascending sort order
4686       * of corresponding values.
4687       *
4688       * @private
4689       * @param {Object} object The object to compare.
4690       * @param {Object} other The other object to compare.
4691       * @param {boolean[]|string[]} orders The order to sort by for each property.
4692       * @returns {number} Returns the sort order indicator for `object`.
4693       */
4694      function compareMultiple(object, other, orders) {
4695        var index = -1,
4696            objCriteria = object.criteria,
4697            othCriteria = other.criteria,
4698            length = objCriteria.length,
4699            ordersLength = orders.length;
4700  
4701        while (++index < length) {
4702          var result = compareAscending(objCriteria[index], othCriteria[index]);
4703          if (result) {
4704            if (index >= ordersLength) {
4705              return result;
4706            }
4707            var order = orders[index];
4708            return result * (order == 'desc' ? -1 : 1);
4709          }
4710        }
4711        // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
4712        // that causes it, under certain circumstances, to provide the same value for
4713        // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
4714        // for more details.
4715        //
4716        // This also ensures a stable sort in V8 and other engines.
4717        // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
4718        return object.index - other.index;
4719      }
4720  
4721      /**
4722       * Creates an array that is the composition of partially applied arguments,
4723       * placeholders, and provided arguments into a single array of arguments.
4724       *
4725       * @private
4726       * @param {Array} args The provided arguments.
4727       * @param {Array} partials The arguments to prepend to those provided.
4728       * @param {Array} holders The `partials` placeholder indexes.
4729       * @params {boolean} [isCurried] Specify composing for a curried function.
4730       * @returns {Array} Returns the new array of composed arguments.
4731       */
4732      function composeArgs(args, partials, holders, isCurried) {
4733        var argsIndex = -1,
4734            argsLength = args.length,
4735            holdersLength = holders.length,
4736            leftIndex = -1,
4737            leftLength = partials.length,
4738            rangeLength = nativeMax(argsLength - holdersLength, 0),
4739            result = Array(leftLength + rangeLength),
4740            isUncurried = !isCurried;
4741  
4742        while (++leftIndex < leftLength) {
4743          result[leftIndex] = partials[leftIndex];
4744        }
4745        while (++argsIndex < holdersLength) {
4746          if (isUncurried || argsIndex < argsLength) {
4747            result[holders[argsIndex]] = args[argsIndex];
4748          }
4749        }
4750        while (rangeLength--) {
4751          result[leftIndex++] = args[argsIndex++];
4752        }
4753        return result;
4754      }
4755  
4756      /**
4757       * This function is like `composeArgs` except that the arguments composition
4758       * is tailored for `_.partialRight`.
4759       *
4760       * @private
4761       * @param {Array} args The provided arguments.
4762       * @param {Array} partials The arguments to append to those provided.
4763       * @param {Array} holders The `partials` placeholder indexes.
4764       * @params {boolean} [isCurried] Specify composing for a curried function.
4765       * @returns {Array} Returns the new array of composed arguments.
4766       */
4767      function composeArgsRight(args, partials, holders, isCurried) {
4768        var argsIndex = -1,
4769            argsLength = args.length,
4770            holdersIndex = -1,
4771            holdersLength = holders.length,
4772            rightIndex = -1,
4773            rightLength = partials.length,
4774            rangeLength = nativeMax(argsLength - holdersLength, 0),
4775            result = Array(rangeLength + rightLength),
4776            isUncurried = !isCurried;
4777  
4778        while (++argsIndex < rangeLength) {
4779          result[argsIndex] = args[argsIndex];
4780        }
4781        var offset = argsIndex;
4782        while (++rightIndex < rightLength) {
4783          result[offset + rightIndex] = partials[rightIndex];
4784        }
4785        while (++holdersIndex < holdersLength) {
4786          if (isUncurried || argsIndex < argsLength) {
4787            result[offset + holders[holdersIndex]] = args[argsIndex++];
4788          }
4789        }
4790        return result;
4791      }
4792  
4793      /**
4794       * Copies the values of `source` to `array`.
4795       *
4796       * @private
4797       * @param {Array} source The array to copy values from.
4798       * @param {Array} [array=[]] The array to copy values to.
4799       * @returns {Array} Returns `array`.
4800       */
4801      function copyArray(source, array) {
4802        var index = -1,
4803            length = source.length;
4804  
4805        array || (array = Array(length));
4806        while (++index < length) {
4807          array[index] = source[index];
4808        }
4809        return array;
4810      }
4811  
4812      /**
4813       * Copies properties of `source` to `object`.
4814       *
4815       * @private
4816       * @param {Object} source The object to copy properties from.
4817       * @param {Array} props The property identifiers to copy.
4818       * @param {Object} [object={}] The object to copy properties to.
4819       * @param {Function} [customizer] The function to customize copied values.
4820       * @returns {Object} Returns `object`.
4821       */
4822      function copyObject(source, props, object, customizer) {
4823        var isNew = !object;
4824        object || (object = {});
4825  
4826        var index = -1,
4827            length = props.length;
4828  
4829        while (++index < length) {
4830          var key = props[index];
4831  
4832          var newValue = customizer
4833            ? customizer(object[key], source[key], key, object, source)
4834            : undefined;
4835  
4836          if (newValue === undefined) {
4837            newValue = source[key];
4838          }
4839          if (isNew) {
4840            baseAssignValue(object, key, newValue);
4841          } else {
4842            assignValue(object, key, newValue);
4843          }
4844        }
4845        return object;
4846      }
4847  
4848      /**
4849       * Copies own symbols of `source` to `object`.
4850       *
4851       * @private
4852       * @param {Object} source The object to copy symbols from.
4853       * @param {Object} [object={}] The object to copy symbols to.
4854       * @returns {Object} Returns `object`.
4855       */
4856      function copySymbols(source, object) {
4857        return copyObject(source, getSymbols(source), object);
4858      }
4859  
4860      /**
4861       * Copies own and inherited symbols of `source` to `object`.
4862       *
4863       * @private
4864       * @param {Object} source The object to copy symbols from.
4865       * @param {Object} [object={}] The object to copy symbols to.
4866       * @returns {Object} Returns `object`.
4867       */
4868      function copySymbolsIn(source, object) {
4869        return copyObject(source, getSymbolsIn(source), object);
4870      }
4871  
4872      /**
4873       * Creates a function like `_.groupBy`.
4874       *
4875       * @private
4876       * @param {Function} setter The function to set accumulator values.
4877       * @param {Function} [initializer] The accumulator object initializer.
4878       * @returns {Function} Returns the new aggregator function.
4879       */
4880      function createAggregator(setter, initializer) {
4881        return function(collection, iteratee) {
4882          var func = isArray(collection) ? arrayAggregator : baseAggregator,
4883              accumulator = initializer ? initializer() : {};
4884  
4885          return func(collection, setter, getIteratee(iteratee, 2), accumulator);
4886        };
4887      }
4888  
4889      /**
4890       * Creates a function like `_.assign`.
4891       *
4892       * @private
4893       * @param {Function} assigner The function to assign values.
4894       * @returns {Function} Returns the new assigner function.
4895       */
4896      function createAssigner(assigner) {
4897        return baseRest(function(object, sources) {
4898          var index = -1,
4899              length = sources.length,
4900              customizer = length > 1 ? sources[length - 1] : undefined,
4901              guard = length > 2 ? sources[2] : undefined;
4902  
4903          customizer = (assigner.length > 3 && typeof customizer == 'function')
4904            ? (length--, customizer)
4905            : undefined;
4906  
4907          if (guard && isIterateeCall(sources[0], sources[1], guard)) {
4908            customizer = length < 3 ? undefined : customizer;
4909            length = 1;
4910          }
4911          object = Object(object);
4912          while (++index < length) {
4913            var source = sources[index];
4914            if (source) {
4915              assigner(object, source, index, customizer);
4916            }
4917          }
4918          return object;
4919        });
4920      }
4921  
4922      /**
4923       * Creates a `baseEach` or `baseEachRight` function.
4924       *
4925       * @private
4926       * @param {Function} eachFunc The function to iterate over a collection.
4927       * @param {boolean} [fromRight] Specify iterating from right to left.
4928       * @returns {Function} Returns the new base function.
4929       */
4930      function createBaseEach(eachFunc, fromRight) {
4931        return function(collection, iteratee) {
4932          if (collection == null) {
4933            return collection;
4934          }
4935          if (!isArrayLike(collection)) {
4936            return eachFunc(collection, iteratee);
4937          }
4938          var length = collection.length,
4939              index = fromRight ? length : -1,
4940              iterable = Object(collection);
4941  
4942          while ((fromRight ? index-- : ++index < length)) {
4943            if (iteratee(iterable[index], index, iterable) === false) {
4944              break;
4945            }
4946          }
4947          return collection;
4948        };
4949      }
4950  
4951      /**
4952       * Creates a base function for methods like `_.forIn` and `_.forOwn`.
4953       *
4954       * @private
4955       * @param {boolean} [fromRight] Specify iterating from right to left.
4956       * @returns {Function} Returns the new base function.
4957       */
4958      function createBaseFor(fromRight) {
4959        return function(object, iteratee, keysFunc) {
4960          var index = -1,
4961              iterable = Object(object),
4962              props = keysFunc(object),
4963              length = props.length;
4964  
4965          while (length--) {
4966            var key = props[fromRight ? length : ++index];
4967            if (iteratee(iterable[key], key, iterable) === false) {
4968              break;
4969            }
4970          }
4971          return object;
4972        };
4973      }
4974  
4975      /**
4976       * Creates a function that wraps `func` to invoke it with the optional `this`
4977       * binding of `thisArg`.
4978       *
4979       * @private
4980       * @param {Function} func The function to wrap.
4981       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
4982       * @param {*} [thisArg] The `this` binding of `func`.
4983       * @returns {Function} Returns the new wrapped function.
4984       */
4985      function createBind(func, bitmask, thisArg) {
4986        var isBind = bitmask & WRAP_BIND_FLAG,
4987            Ctor = createCtor(func);
4988  
4989        function wrapper() {
4990          var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
4991          return fn.apply(isBind ? thisArg : this, arguments);
4992        }
4993        return wrapper;
4994      }
4995  
4996      /**
4997       * Creates a function like `_.lowerFirst`.
4998       *
4999       * @private
5000       * @param {string} methodName The name of the `String` case method to use.
5001       * @returns {Function} Returns the new case function.
5002       */
5003      function createCaseFirst(methodName) {
5004        return function(string) {
5005          string = toString(string);
5006  
5007          var strSymbols = hasUnicode(string)
5008            ? stringToArray(string)
5009            : undefined;
5010  
5011          var chr = strSymbols
5012            ? strSymbols[0]
5013            : string.charAt(0);
5014  
5015          var trailing = strSymbols
5016            ? castSlice(strSymbols, 1).join('')
5017            : string.slice(1);
5018  
5019          return chr[methodName]() + trailing;
5020        };
5021      }
5022  
5023      /**
5024       * Creates a function like `_.camelCase`.
5025       *
5026       * @private
5027       * @param {Function} callback The function to combine each word.
5028       * @returns {Function} Returns the new compounder function.
5029       */
5030      function createCompounder(callback) {
5031        return function(string) {
5032          return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
5033        };
5034      }
5035  
5036      /**
5037       * Creates a function that produces an instance of `Ctor` regardless of
5038       * whether it was invoked as part of a `new` expression or by `call` or `apply`.
5039       *
5040       * @private
5041       * @param {Function} Ctor The constructor to wrap.
5042       * @returns {Function} Returns the new wrapped function.
5043       */
5044      function createCtor(Ctor) {
5045        return function() {
5046          // Use a `switch` statement to work with class constructors. See
5047          // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
5048          // for more details.
5049          var args = arguments;
5050          switch (args.length) {
5051            case 0: return new Ctor;
5052            case 1: return new Ctor(args[0]);
5053            case 2: return new Ctor(args[0], args[1]);
5054            case 3: return new Ctor(args[0], args[1], args[2]);
5055            case 4: return new Ctor(args[0], args[1], args[2], args[3]);
5056            case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
5057            case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
5058            case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
5059          }
5060          var thisBinding = baseCreate(Ctor.prototype),
5061              result = Ctor.apply(thisBinding, args);
5062  
5063          // Mimic the constructor's `return` behavior.
5064          // See https://es5.github.io/#x13.2.2 for more details.
5065          return isObject(result) ? result : thisBinding;
5066        };
5067      }
5068  
5069      /**
5070       * Creates a function that wraps `func` to enable currying.
5071       *
5072       * @private
5073       * @param {Function} func The function to wrap.
5074       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5075       * @param {number} arity The arity of `func`.
5076       * @returns {Function} Returns the new wrapped function.
5077       */
5078      function createCurry(func, bitmask, arity) {
5079        var Ctor = createCtor(func);
5080  
5081        function wrapper() {
5082          var length = arguments.length,
5083              args = Array(length),
5084              index = length,
5085              placeholder = getHolder(wrapper);
5086  
5087          while (index--) {
5088            args[index] = arguments[index];
5089          }
5090          var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
5091            ? []
5092            : replaceHolders(args, placeholder);
5093  
5094          length -= holders.length;
5095          if (length < arity) {
5096            return createRecurry(
5097              func, bitmask, createHybrid, wrapper.placeholder, undefined,
5098              args, holders, undefined, undefined, arity - length);
5099          }
5100          var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5101          return apply(fn, this, args);
5102        }
5103        return wrapper;
5104      }
5105  
5106      /**
5107       * Creates a `_.find` or `_.findLast` function.
5108       *
5109       * @private
5110       * @param {Function} findIndexFunc The function to find the collection index.
5111       * @returns {Function} Returns the new find function.
5112       */
5113      function createFind(findIndexFunc) {
5114        return function(collection, predicate, fromIndex) {
5115          var iterable = Object(collection);
5116          if (!isArrayLike(collection)) {
5117            var iteratee = getIteratee(predicate, 3);
5118            collection = keys(collection);
5119            predicate = function(key) { return iteratee(iterable[key], key, iterable); };
5120          }
5121          var index = findIndexFunc(collection, predicate, fromIndex);
5122          return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
5123        };
5124      }
5125  
5126      /**
5127       * Creates a `_.flow` or `_.flowRight` function.
5128       *
5129       * @private
5130       * @param {boolean} [fromRight] Specify iterating from right to left.
5131       * @returns {Function} Returns the new flow function.
5132       */
5133      function createFlow(fromRight) {
5134        return flatRest(function(funcs) {
5135          var length = funcs.length,
5136              index = length,
5137              prereq = LodashWrapper.prototype.thru;
5138  
5139          if (fromRight) {
5140            funcs.reverse();
5141          }
5142          while (index--) {
5143            var func = funcs[index];
5144            if (typeof func != 'function') {
5145              throw new TypeError(FUNC_ERROR_TEXT);
5146            }
5147            if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
5148              var wrapper = new LodashWrapper([], true);
5149            }
5150          }
5151          index = wrapper ? index : length;
5152          while (++index < length) {
5153            func = funcs[index];
5154  
5155            var funcName = getFuncName(func),
5156                data = funcName == 'wrapper' ? getData(func) : undefined;
5157  
5158            if (data && isLaziable(data[0]) &&
5159                  data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
5160                  !data[4].length && data[9] == 1
5161                ) {
5162              wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
5163            } else {
5164              wrapper = (func.length == 1 && isLaziable(func))
5165                ? wrapper[funcName]()
5166                : wrapper.thru(func);
5167            }
5168          }
5169          return function() {
5170            var args = arguments,
5171                value = args[0];
5172  
5173            if (wrapper && args.length == 1 && isArray(value)) {
5174              return wrapper.plant(value).value();
5175            }
5176            var index = 0,
5177                result = length ? funcs[index].apply(this, args) : value;
5178  
5179            while (++index < length) {
5180              result = funcs[index].call(this, result);
5181            }
5182            return result;
5183          };
5184        });
5185      }
5186  
5187      /**
5188       * Creates a function that wraps `func` to invoke it with optional `this`
5189       * binding of `thisArg`, partial application, and currying.
5190       *
5191       * @private
5192       * @param {Function|string} func The function or method name to wrap.
5193       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5194       * @param {*} [thisArg] The `this` binding of `func`.
5195       * @param {Array} [partials] The arguments to prepend to those provided to
5196       *  the new function.
5197       * @param {Array} [holders] The `partials` placeholder indexes.
5198       * @param {Array} [partialsRight] The arguments to append to those provided
5199       *  to the new function.
5200       * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
5201       * @param {Array} [argPos] The argument positions of the new function.
5202       * @param {number} [ary] The arity cap of `func`.
5203       * @param {number} [arity] The arity of `func`.
5204       * @returns {Function} Returns the new wrapped function.
5205       */
5206      function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
5207        var isAry = bitmask & WRAP_ARY_FLAG,
5208            isBind = bitmask & WRAP_BIND_FLAG,
5209            isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
5210            isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
5211            isFlip = bitmask & WRAP_FLIP_FLAG,
5212            Ctor = isBindKey ? undefined : createCtor(func);
5213  
5214        function wrapper() {
5215          var length = arguments.length,
5216              args = Array(length),
5217              index = length;
5218  
5219          while (index--) {
5220            args[index] = arguments[index];
5221          }
5222          if (isCurried) {
5223            var placeholder = getHolder(wrapper),
5224                holdersCount = countHolders(args, placeholder);
5225          }
5226          if (partials) {
5227            args = composeArgs(args, partials, holders, isCurried);
5228          }
5229          if (partialsRight) {
5230            args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
5231          }
5232          length -= holdersCount;
5233          if (isCurried && length < arity) {
5234            var newHolders = replaceHolders(args, placeholder);
5235            return createRecurry(
5236              func, bitmask, createHybrid, wrapper.placeholder, thisArg,
5237              args, newHolders, argPos, ary, arity - length
5238            );
5239          }
5240          var thisBinding = isBind ? thisArg : this,
5241              fn = isBindKey ? thisBinding[func] : func;
5242  
5243          length = args.length;
5244          if (argPos) {
5245            args = reorder(args, argPos);
5246          } else if (isFlip && length > 1) {
5247            args.reverse();
5248          }
5249          if (isAry && ary < length) {
5250            args.length = ary;
5251          }
5252          if (this && this !== root && this instanceof wrapper) {
5253            fn = Ctor || createCtor(fn);
5254          }
5255          return fn.apply(thisBinding, args);
5256        }
5257        return wrapper;
5258      }
5259  
5260      /**
5261       * Creates a function like `_.invertBy`.
5262       *
5263       * @private
5264       * @param {Function} setter The function to set accumulator values.
5265       * @param {Function} toIteratee The function to resolve iteratees.
5266       * @returns {Function} Returns the new inverter function.
5267       */
5268      function createInverter(setter, toIteratee) {
5269        return function(object, iteratee) {
5270          return baseInverter(object, setter, toIteratee(iteratee), {});
5271        };
5272      }
5273  
5274      /**
5275       * Creates a function that performs a mathematical operation on two values.
5276       *
5277       * @private
5278       * @param {Function} operator The function to perform the operation.
5279       * @param {number} [defaultValue] The value used for `undefined` arguments.
5280       * @returns {Function} Returns the new mathematical operation function.
5281       */
5282      function createMathOperation(operator, defaultValue) {
5283        return function(value, other) {
5284          var result;
5285          if (value === undefined && other === undefined) {
5286            return defaultValue;
5287          }
5288          if (value !== undefined) {
5289            result = value;
5290          }
5291          if (other !== undefined) {
5292            if (result === undefined) {
5293              return other;
5294            }
5295            if (typeof value == 'string' || typeof other == 'string') {
5296              value = baseToString(value);
5297              other = baseToString(other);
5298            } else {
5299              value = baseToNumber(value);
5300              other = baseToNumber(other);
5301            }
5302            result = operator(value, other);
5303          }
5304          return result;
5305        };
5306      }
5307  
5308      /**
5309       * Creates a function like `_.over`.
5310       *
5311       * @private
5312       * @param {Function} arrayFunc The function to iterate over iteratees.
5313       * @returns {Function} Returns the new over function.
5314       */
5315      function createOver(arrayFunc) {
5316        return flatRest(function(iteratees) {
5317          iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
5318          return baseRest(function(args) {
5319            var thisArg = this;
5320            return arrayFunc(iteratees, function(iteratee) {
5321              return apply(iteratee, thisArg, args);
5322            });
5323          });
5324        });
5325      }
5326  
5327      /**
5328       * Creates the padding for `string` based on `length`. The `chars` string
5329       * is truncated if the number of characters exceeds `length`.
5330       *
5331       * @private
5332       * @param {number} length The padding length.
5333       * @param {string} [chars=' '] The string used as padding.
5334       * @returns {string} Returns the padding for `string`.
5335       */
5336      function createPadding(length, chars) {
5337        chars = chars === undefined ? ' ' : baseToString(chars);
5338  
5339        var charsLength = chars.length;
5340        if (charsLength < 2) {
5341          return charsLength ? baseRepeat(chars, length) : chars;
5342        }
5343        var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
5344        return hasUnicode(chars)
5345          ? castSlice(stringToArray(result), 0, length).join('')
5346          : result.slice(0, length);
5347      }
5348  
5349      /**
5350       * Creates a function that wraps `func` to invoke it with the `this` binding
5351       * of `thisArg` and `partials` prepended to the arguments it receives.
5352       *
5353       * @private
5354       * @param {Function} func The function to wrap.
5355       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5356       * @param {*} thisArg The `this` binding of `func`.
5357       * @param {Array} partials The arguments to prepend to those provided to
5358       *  the new function.
5359       * @returns {Function} Returns the new wrapped function.
5360       */
5361      function createPartial(func, bitmask, thisArg, partials) {
5362        var isBind = bitmask & WRAP_BIND_FLAG,
5363            Ctor = createCtor(func);
5364  
5365        function wrapper() {
5366          var argsIndex = -1,
5367              argsLength = arguments.length,
5368              leftIndex = -1,
5369              leftLength = partials.length,
5370              args = Array(leftLength + argsLength),
5371              fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5372  
5373          while (++leftIndex < leftLength) {
5374            args[leftIndex] = partials[leftIndex];
5375          }
5376          while (argsLength--) {
5377            args[leftIndex++] = arguments[++argsIndex];
5378          }
5379          return apply(fn, isBind ? thisArg : this, args);
5380        }
5381        return wrapper;
5382      }
5383  
5384      /**
5385       * Creates a `_.range` or `_.rangeRight` function.
5386       *
5387       * @private
5388       * @param {boolean} [fromRight] Specify iterating from right to left.
5389       * @returns {Function} Returns the new range function.
5390       */
5391      function createRange(fromRight) {
5392        return function(start, end, step) {
5393          if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
5394            end = step = undefined;
5395          }
5396          // Ensure the sign of `-0` is preserved.
5397          start = toFinite(start);
5398          if (end === undefined) {
5399            end = start;
5400            start = 0;
5401          } else {
5402            end = toFinite(end);
5403          }
5404          step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
5405          return baseRange(start, end, step, fromRight);
5406        };
5407      }
5408  
5409      /**
5410       * Creates a function that performs a relational operation on two values.
5411       *
5412       * @private
5413       * @param {Function} operator The function to perform the operation.
5414       * @returns {Function} Returns the new relational operation function.
5415       */
5416      function createRelationalOperation(operator) {
5417        return function(value, other) {
5418          if (!(typeof value == 'string' && typeof other == 'string')) {
5419            value = toNumber(value);
5420            other = toNumber(other);
5421          }
5422          return operator(value, other);
5423        };
5424      }
5425  
5426      /**
5427       * Creates a function that wraps `func` to continue currying.
5428       *
5429       * @private
5430       * @param {Function} func The function to wrap.
5431       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5432       * @param {Function} wrapFunc The function to create the `func` wrapper.
5433       * @param {*} placeholder The placeholder value.
5434       * @param {*} [thisArg] The `this` binding of `func`.
5435       * @param {Array} [partials] The arguments to prepend to those provided to
5436       *  the new function.
5437       * @param {Array} [holders] The `partials` placeholder indexes.
5438       * @param {Array} [argPos] The argument positions of the new function.
5439       * @param {number} [ary] The arity cap of `func`.
5440       * @param {number} [arity] The arity of `func`.
5441       * @returns {Function} Returns the new wrapped function.
5442       */
5443      function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
5444        var isCurry = bitmask & WRAP_CURRY_FLAG,
5445            newHolders = isCurry ? holders : undefined,
5446            newHoldersRight = isCurry ? undefined : holders,
5447            newPartials = isCurry ? partials : undefined,
5448            newPartialsRight = isCurry ? undefined : partials;
5449  
5450        bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
5451        bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
5452  
5453        if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
5454          bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
5455        }
5456        var newData = [
5457          func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
5458          newHoldersRight, argPos, ary, arity
5459        ];
5460  
5461        var result = wrapFunc.apply(undefined, newData);
5462        if (isLaziable(func)) {
5463          setData(result, newData);
5464        }
5465        result.placeholder = placeholder;
5466        return setWrapToString(result, func, bitmask);
5467      }
5468  
5469      /**
5470       * Creates a function like `_.round`.
5471       *
5472       * @private
5473       * @param {string} methodName The name of the `Math` method to use when rounding.
5474       * @returns {Function} Returns the new round function.
5475       */
5476      function createRound(methodName) {
5477        var func = Math[methodName];
5478        return function(number, precision) {
5479          number = toNumber(number);
5480          precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
5481          if (precision && nativeIsFinite(number)) {
5482            // Shift with exponential notation to avoid floating-point issues.
5483            // See [MDN](https://mdn.io/round#Examples) for more details.
5484            var pair = (toString(number) + 'e').split('e'),
5485                value = func(pair[0] + 'e' + (+pair[1] + precision));
5486  
5487            pair = (toString(value) + 'e').split('e');
5488            return +(pair[0] + 'e' + (+pair[1] - precision));
5489          }
5490          return func(number);
5491        };
5492      }
5493  
5494      /**
5495       * Creates a set object of `values`.
5496       *
5497       * @private
5498       * @param {Array} values The values to add to the set.
5499       * @returns {Object} Returns the new set.
5500       */
5501      var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
5502        return new Set(values);
5503      };
5504  
5505      /**
5506       * Creates a `_.toPairs` or `_.toPairsIn` function.
5507       *
5508       * @private
5509       * @param {Function} keysFunc The function to get the keys of a given object.
5510       * @returns {Function} Returns the new pairs function.
5511       */
5512      function createToPairs(keysFunc) {
5513        return function(object) {
5514          var tag = getTag(object);
5515          if (tag == mapTag) {
5516            return mapToArray(object);
5517          }
5518          if (tag == setTag) {
5519            return setToPairs(object);
5520          }
5521          return baseToPairs(object, keysFunc(object));
5522        };
5523      }
5524  
5525      /**
5526       * Creates a function that either curries or invokes `func` with optional
5527       * `this` binding and partially applied arguments.
5528       *
5529       * @private
5530       * @param {Function|string} func The function or method name to wrap.
5531       * @param {number} bitmask The bitmask flags.
5532       *    1 - `_.bind`
5533       *    2 - `_.bindKey`
5534       *    4 - `_.curry` or `_.curryRight` of a bound function
5535       *    8 - `_.curry`
5536       *   16 - `_.curryRight`
5537       *   32 - `_.partial`
5538       *   64 - `_.partialRight`
5539       *  128 - `_.rearg`
5540       *  256 - `_.ary`
5541       *  512 - `_.flip`
5542       * @param {*} [thisArg] The `this` binding of `func`.
5543       * @param {Array} [partials] The arguments to be partially applied.
5544       * @param {Array} [holders] The `partials` placeholder indexes.
5545       * @param {Array} [argPos] The argument positions of the new function.
5546       * @param {number} [ary] The arity cap of `func`.
5547       * @param {number} [arity] The arity of `func`.
5548       * @returns {Function} Returns the new wrapped function.
5549       */
5550      function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
5551        var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
5552        if (!isBindKey && typeof func != 'function') {
5553          throw new TypeError(FUNC_ERROR_TEXT);
5554        }
5555        var length = partials ? partials.length : 0;
5556        if (!length) {
5557          bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
5558          partials = holders = undefined;
5559        }
5560        ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
5561        arity = arity === undefined ? arity : toInteger(arity);
5562        length -= holders ? holders.length : 0;
5563  
5564        if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
5565          var partialsRight = partials,
5566              holdersRight = holders;
5567  
5568          partials = holders = undefined;
5569        }
5570        var data = isBindKey ? undefined : getData(func);
5571  
5572        var newData = [
5573          func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
5574          argPos, ary, arity
5575        ];
5576  
5577        if (data) {
5578          mergeData(newData, data);
5579        }
5580        func = newData[0];
5581        bitmask = newData[1];
5582        thisArg = newData[2];
5583        partials = newData[3];
5584        holders = newData[4];
5585        arity = newData[9] = newData[9] === undefined
5586          ? (isBindKey ? 0 : func.length)
5587          : nativeMax(newData[9] - length, 0);
5588  
5589        if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
5590          bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
5591        }
5592        if (!bitmask || bitmask == WRAP_BIND_FLAG) {
5593          var result = createBind(func, bitmask, thisArg);
5594        } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
5595          result = createCurry(func, bitmask, arity);
5596        } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
5597          result = createPartial(func, bitmask, thisArg, partials);
5598        } else {
5599          result = createHybrid.apply(undefined, newData);
5600        }
5601        var setter = data ? baseSetData : setData;
5602        return setWrapToString(setter(result, newData), func, bitmask);
5603      }
5604  
5605      /**
5606       * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
5607       * of source objects to the destination object for all destination properties
5608       * that resolve to `undefined`.
5609       *
5610       * @private
5611       * @param {*} objValue The destination value.
5612       * @param {*} srcValue The source value.
5613       * @param {string} key The key of the property to assign.
5614       * @param {Object} object The parent object of `objValue`.
5615       * @returns {*} Returns the value to assign.
5616       */
5617      function customDefaultsAssignIn(objValue, srcValue, key, object) {
5618        if (objValue === undefined ||
5619            (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
5620          return srcValue;
5621        }
5622        return objValue;
5623      }
5624  
5625      /**
5626       * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
5627       * objects into destination objects that are passed thru.
5628       *
5629       * @private
5630       * @param {*} objValue The destination value.
5631       * @param {*} srcValue The source value.
5632       * @param {string} key The key of the property to merge.
5633       * @param {Object} object The parent object of `objValue`.
5634       * @param {Object} source The parent object of `srcValue`.
5635       * @param {Object} [stack] Tracks traversed source values and their merged
5636       *  counterparts.
5637       * @returns {*} Returns the value to assign.
5638       */
5639      function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
5640        if (isObject(objValue) && isObject(srcValue)) {
5641          // Recursively merge objects and arrays (susceptible to call stack limits).
5642          stack.set(srcValue, objValue);
5643          baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
5644          stack['delete'](srcValue);
5645        }
5646        return objValue;
5647      }
5648  
5649      /**
5650       * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
5651       * objects.
5652       *
5653       * @private
5654       * @param {*} value The value to inspect.
5655       * @param {string} key The key of the property to inspect.
5656       * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
5657       */
5658      function customOmitClone(value) {
5659        return isPlainObject(value) ? undefined : value;
5660      }
5661  
5662      /**
5663       * A specialized version of `baseIsEqualDeep` for arrays with support for
5664       * partial deep comparisons.
5665       *
5666       * @private
5667       * @param {Array} array The array to compare.
5668       * @param {Array} other The other array to compare.
5669       * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5670       * @param {Function} customizer The function to customize comparisons.
5671       * @param {Function} equalFunc The function to determine equivalents of values.
5672       * @param {Object} stack Tracks traversed `array` and `other` objects.
5673       * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5674       */
5675      function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
5676        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5677            arrLength = array.length,
5678            othLength = other.length;
5679  
5680        if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
5681          return false;
5682        }
5683        // Check that cyclic values are equal.
5684        var arrStacked = stack.get(array);
5685        var othStacked = stack.get(other);
5686        if (arrStacked && othStacked) {
5687          return arrStacked == other && othStacked == array;
5688        }
5689        var index = -1,
5690            result = true,
5691            seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
5692  
5693        stack.set(array, other);
5694        stack.set(other, array);
5695  
5696        // Ignore non-index properties.
5697        while (++index < arrLength) {
5698          var arrValue = array[index],
5699              othValue = other[index];
5700  
5701          if (customizer) {
5702            var compared = isPartial
5703              ? customizer(othValue, arrValue, index, other, array, stack)
5704              : customizer(arrValue, othValue, index, array, other, stack);
5705          }
5706          if (compared !== undefined) {
5707            if (compared) {
5708              continue;
5709            }
5710            result = false;
5711            break;
5712          }
5713          // Recursively compare arrays (susceptible to call stack limits).
5714          if (seen) {
5715            if (!arraySome(other, function(othValue, othIndex) {
5716                  if (!cacheHas(seen, othIndex) &&
5717                      (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
5718                    return seen.push(othIndex);
5719                  }
5720                })) {
5721              result = false;
5722              break;
5723            }
5724          } else if (!(
5725                arrValue === othValue ||
5726                  equalFunc(arrValue, othValue, bitmask, customizer, stack)
5727              )) {
5728            result = false;
5729            break;
5730          }
5731        }
5732        stack['delete'](array);
5733        stack['delete'](other);
5734        return result;
5735      }
5736  
5737      /**
5738       * A specialized version of `baseIsEqualDeep` for comparing objects of
5739       * the same `toStringTag`.
5740       *
5741       * **Note:** This function only supports comparing values with tags of
5742       * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5743       *
5744       * @private
5745       * @param {Object} object The object to compare.
5746       * @param {Object} other The other object to compare.
5747       * @param {string} tag The `toStringTag` of the objects to compare.
5748       * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5749       * @param {Function} customizer The function to customize comparisons.
5750       * @param {Function} equalFunc The function to determine equivalents of values.
5751       * @param {Object} stack Tracks traversed `object` and `other` objects.
5752       * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5753       */
5754      function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
5755        switch (tag) {
5756          case dataViewTag:
5757            if ((object.byteLength != other.byteLength) ||
5758                (object.byteOffset != other.byteOffset)) {
5759              return false;
5760            }
5761            object = object.buffer;
5762            other = other.buffer;
5763  
5764          case arrayBufferTag:
5765            if ((object.byteLength != other.byteLength) ||
5766                !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
5767              return false;
5768            }
5769            return true;
5770  
5771          case boolTag:
5772          case dateTag:
5773          case numberTag:
5774            // Coerce booleans to `1` or `0` and dates to milliseconds.
5775            // Invalid dates are coerced to `NaN`.
5776            return eq(+object, +other);
5777  
5778          case errorTag:
5779            return object.name == other.name && object.message == other.message;
5780  
5781          case regexpTag:
5782          case stringTag:
5783            // Coerce regexes to strings and treat strings, primitives and objects,
5784            // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
5785            // for more details.
5786            return object == (other + '');
5787  
5788          case mapTag:
5789            var convert = mapToArray;
5790  
5791          case setTag:
5792            var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
5793            convert || (convert = setToArray);
5794  
5795            if (object.size != other.size && !isPartial) {
5796              return false;
5797            }
5798            // Assume cyclic values are equal.
5799            var stacked = stack.get(object);
5800            if (stacked) {
5801              return stacked == other;
5802            }
5803            bitmask |= COMPARE_UNORDERED_FLAG;
5804  
5805            // Recursively compare objects (susceptible to call stack limits).
5806            stack.set(object, other);
5807            var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
5808            stack['delete'](object);
5809            return result;
5810  
5811          case symbolTag:
5812            if (symbolValueOf) {
5813              return symbolValueOf.call(object) == symbolValueOf.call(other);
5814            }
5815        }
5816        return false;
5817      }
5818  
5819      /**
5820       * A specialized version of `baseIsEqualDeep` for objects with support for
5821       * partial deep comparisons.
5822       *
5823       * @private
5824       * @param {Object} object The object to compare.
5825       * @param {Object} other The other object to compare.
5826       * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5827       * @param {Function} customizer The function to customize comparisons.
5828       * @param {Function} equalFunc The function to determine equivalents of values.
5829       * @param {Object} stack Tracks traversed `object` and `other` objects.
5830       * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5831       */
5832      function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
5833        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5834            objProps = getAllKeys(object),
5835            objLength = objProps.length,
5836            othProps = getAllKeys(other),
5837            othLength = othProps.length;
5838  
5839        if (objLength != othLength && !isPartial) {
5840          return false;
5841        }
5842        var index = objLength;
5843        while (index--) {
5844          var key = objProps[index];
5845          if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
5846            return false;
5847          }
5848        }
5849        // Check that cyclic values are equal.
5850        var objStacked = stack.get(object);
5851        var othStacked = stack.get(other);
5852        if (objStacked && othStacked) {
5853          return objStacked == other && othStacked == object;
5854        }
5855        var result = true;
5856        stack.set(object, other);
5857        stack.set(other, object);
5858  
5859        var skipCtor = isPartial;
5860        while (++index < objLength) {
5861          key = objProps[index];
5862          var objValue = object[key],
5863              othValue = other[key];
5864  
5865          if (customizer) {
5866            var compared = isPartial
5867              ? customizer(othValue, objValue, key, other, object, stack)
5868              : customizer(objValue, othValue, key, object, other, stack);
5869          }
5870          // Recursively compare objects (susceptible to call stack limits).
5871          if (!(compared === undefined
5872                ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
5873                : compared
5874              )) {
5875            result = false;
5876            break;
5877          }
5878          skipCtor || (skipCtor = key == 'constructor');
5879        }
5880        if (result && !skipCtor) {
5881          var objCtor = object.constructor,
5882              othCtor = other.constructor;
5883  
5884          // Non `Object` object instances with different constructors are not equal.
5885          if (objCtor != othCtor &&
5886              ('constructor' in object && 'constructor' in other) &&
5887              !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
5888                typeof othCtor == 'function' && othCtor instanceof othCtor)) {
5889            result = false;
5890          }
5891        }
5892        stack['delete'](object);
5893        stack['delete'](other);
5894        return result;
5895      }
5896  
5897      /**
5898       * A specialized version of `baseRest` which flattens the rest array.
5899       *
5900       * @private
5901       * @param {Function} func The function to apply a rest parameter to.
5902       * @returns {Function} Returns the new function.
5903       */
5904      function flatRest(func) {
5905        return setToString(overRest(func, undefined, flatten), func + '');
5906      }
5907  
5908      /**
5909       * Creates an array of own enumerable property names and symbols of `object`.
5910       *
5911       * @private
5912       * @param {Object} object The object to query.
5913       * @returns {Array} Returns the array of property names and symbols.
5914       */
5915      function getAllKeys(object) {
5916        return baseGetAllKeys(object, keys, getSymbols);
5917      }
5918  
5919      /**
5920       * Creates an array of own and inherited enumerable property names and
5921       * symbols of `object`.
5922       *
5923       * @private
5924       * @param {Object} object The object to query.
5925       * @returns {Array} Returns the array of property names and symbols.
5926       */
5927      function getAllKeysIn(object) {
5928        return baseGetAllKeys(object, keysIn, getSymbolsIn);
5929      }
5930  
5931      /**
5932       * Gets metadata for `func`.
5933       *
5934       * @private
5935       * @param {Function} func The function to query.
5936       * @returns {*} Returns the metadata for `func`.
5937       */
5938      var getData = !metaMap ? noop : function(func) {
5939        return metaMap.get(func);
5940      };
5941  
5942      /**
5943       * Gets the name of `func`.
5944       *
5945       * @private
5946       * @param {Function} func The function to query.
5947       * @returns {string} Returns the function name.
5948       */
5949      function getFuncName(func) {
5950        var result = (func.name + ''),
5951            array = realNames[result],
5952            length = hasOwnProperty.call(realNames, result) ? array.length : 0;
5953  
5954        while (length--) {
5955          var data = array[length],
5956              otherFunc = data.func;
5957          if (otherFunc == null || otherFunc == func) {
5958            return data.name;
5959          }
5960        }
5961        return result;
5962      }
5963  
5964      /**
5965       * Gets the argument placeholder value for `func`.
5966       *
5967       * @private
5968       * @param {Function} func The function to inspect.
5969       * @returns {*} Returns the placeholder value.
5970       */
5971      function getHolder(func) {
5972        var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
5973        return object.placeholder;
5974      }
5975  
5976      /**
5977       * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
5978       * this function returns the custom method, otherwise it returns `baseIteratee`.
5979       * If arguments are provided, the chosen function is invoked with them and
5980       * its result is returned.
5981       *
5982       * @private
5983       * @param {*} [value] The value to convert to an iteratee.
5984       * @param {number} [arity] The arity of the created iteratee.
5985       * @returns {Function} Returns the chosen function or its result.
5986       */
5987      function getIteratee() {
5988        var result = lodash.iteratee || iteratee;
5989        result = result === iteratee ? baseIteratee : result;
5990        return arguments.length ? result(arguments[0], arguments[1]) : result;
5991      }
5992  
5993      /**
5994       * Gets the data for `map`.
5995       *
5996       * @private
5997       * @param {Object} map The map to query.
5998       * @param {string} key The reference key.
5999       * @returns {*} Returns the map data.
6000       */
6001      function getMapData(map, key) {
6002        var data = map.__data__;
6003        return isKeyable(key)
6004          ? data[typeof key == 'string' ? 'string' : 'hash']
6005          : data.map;
6006      }
6007  
6008      /**
6009       * Gets the property names, values, and compare flags of `object`.
6010       *
6011       * @private
6012       * @param {Object} object The object to query.
6013       * @returns {Array} Returns the match data of `object`.
6014       */
6015      function getMatchData(object) {
6016        var result = keys(object),
6017            length = result.length;
6018  
6019        while (length--) {
6020          var key = result[length],
6021              value = object[key];
6022  
6023          result[length] = [key, value, isStrictComparable(value)];
6024        }
6025        return result;
6026      }
6027  
6028      /**
6029       * Gets the native function at `key` of `object`.
6030       *
6031       * @private
6032       * @param {Object} object The object to query.
6033       * @param {string} key The key of the method to get.
6034       * @returns {*} Returns the function if it's native, else `undefined`.
6035       */
6036      function getNative(object, key) {
6037        var value = getValue(object, key);
6038        return baseIsNative(value) ? value : undefined;
6039      }
6040  
6041      /**
6042       * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
6043       *
6044       * @private
6045       * @param {*} value The value to query.
6046       * @returns {string} Returns the raw `toStringTag`.
6047       */
6048      function getRawTag(value) {
6049        var isOwn = hasOwnProperty.call(value, symToStringTag),
6050            tag = value[symToStringTag];
6051  
6052        try {
6053          value[symToStringTag] = undefined;
6054          var unmasked = true;
6055        } catch (e) {}
6056  
6057        var result = nativeObjectToString.call(value);
6058        if (unmasked) {
6059          if (isOwn) {
6060            value[symToStringTag] = tag;
6061          } else {
6062            delete value[symToStringTag];
6063          }
6064        }
6065        return result;
6066      }
6067  
6068      /**
6069       * Creates an array of the own enumerable symbols of `object`.
6070       *
6071       * @private
6072       * @param {Object} object The object to query.
6073       * @returns {Array} Returns the array of symbols.
6074       */
6075      var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
6076        if (object == null) {
6077          return [];
6078        }
6079        object = Object(object);
6080        return arrayFilter(nativeGetSymbols(object), function(symbol) {
6081          return propertyIsEnumerable.call(object, symbol);
6082        });
6083      };
6084  
6085      /**
6086       * Creates an array of the own and inherited enumerable symbols of `object`.
6087       *
6088       * @private
6089       * @param {Object} object The object to query.
6090       * @returns {Array} Returns the array of symbols.
6091       */
6092      var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
6093        var result = [];
6094        while (object) {
6095          arrayPush(result, getSymbols(object));
6096          object = getPrototype(object);
6097        }
6098        return result;
6099      };
6100  
6101      /**
6102       * Gets the `toStringTag` of `value`.
6103       *
6104       * @private
6105       * @param {*} value The value to query.
6106       * @returns {string} Returns the `toStringTag`.
6107       */
6108      var getTag = baseGetTag;
6109  
6110      // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
6111      if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
6112          (Map && getTag(new Map) != mapTag) ||
6113          (Promise && getTag(Promise.resolve()) != promiseTag) ||
6114          (Set && getTag(new Set) != setTag) ||
6115          (WeakMap && getTag(new WeakMap) != weakMapTag)) {
6116        getTag = function(value) {
6117          var result = baseGetTag(value),
6118              Ctor = result == objectTag ? value.constructor : undefined,
6119              ctorString = Ctor ? toSource(Ctor) : '';
6120  
6121          if (ctorString) {
6122            switch (ctorString) {
6123              case dataViewCtorString: return dataViewTag;
6124              case mapCtorString: return mapTag;
6125              case promiseCtorString: return promiseTag;
6126              case setCtorString: return setTag;
6127              case weakMapCtorString: return weakMapTag;
6128            }
6129          }
6130          return result;
6131        };
6132      }
6133  
6134      /**
6135       * Gets the view, applying any `transforms` to the `start` and `end` positions.
6136       *
6137       * @private
6138       * @param {number} start The start of the view.
6139       * @param {number} end The end of the view.
6140       * @param {Array} transforms The transformations to apply to the view.
6141       * @returns {Object} Returns an object containing the `start` and `end`
6142       *  positions of the view.
6143       */
6144      function getView(start, end, transforms) {
6145        var index = -1,
6146            length = transforms.length;
6147  
6148        while (++index < length) {
6149          var data = transforms[index],
6150              size = data.size;
6151  
6152          switch (data.type) {
6153            case 'drop':      start += size; break;
6154            case 'dropRight': end -= size; break;
6155            case 'take':      end = nativeMin(end, start + size); break;
6156            case 'takeRight': start = nativeMax(start, end - size); break;
6157          }
6158        }
6159        return { 'start': start, 'end': end };
6160      }
6161  
6162      /**
6163       * Extracts wrapper details from the `source` body comment.
6164       *
6165       * @private
6166       * @param {string} source The source to inspect.
6167       * @returns {Array} Returns the wrapper details.
6168       */
6169      function getWrapDetails(source) {
6170        var match = source.match(reWrapDetails);
6171        return match ? match[1].split(reSplitDetails) : [];
6172      }
6173  
6174      /**
6175       * Checks if `path` exists on `object`.
6176       *
6177       * @private
6178       * @param {Object} object The object to query.
6179       * @param {Array|string} path The path to check.
6180       * @param {Function} hasFunc The function to check properties.
6181       * @returns {boolean} Returns `true` if `path` exists, else `false`.
6182       */
6183      function hasPath(object, path, hasFunc) {
6184        path = castPath(path, object);
6185  
6186        var index = -1,
6187            length = path.length,
6188            result = false;
6189  
6190        while (++index < length) {
6191          var key = toKey(path[index]);
6192          if (!(result = object != null && hasFunc(object, key))) {
6193            break;
6194          }
6195          object = object[key];
6196        }
6197        if (result || ++index != length) {
6198          return result;
6199        }
6200        length = object == null ? 0 : object.length;
6201        return !!length && isLength(length) && isIndex(key, length) &&
6202          (isArray(object) || isArguments(object));
6203      }
6204  
6205      /**
6206       * Initializes an array clone.
6207       *
6208       * @private
6209       * @param {Array} array The array to clone.
6210       * @returns {Array} Returns the initialized clone.
6211       */
6212      function initCloneArray(array) {
6213        var length = array.length,
6214            result = new array.constructor(length);
6215  
6216        // Add properties assigned by `RegExp#exec`.
6217        if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
6218          result.index = array.index;
6219          result.input = array.input;
6220        }
6221        return result;
6222      }
6223  
6224      /**
6225       * Initializes an object clone.
6226       *
6227       * @private
6228       * @param {Object} object The object to clone.
6229       * @returns {Object} Returns the initialized clone.
6230       */
6231      function initCloneObject(object) {
6232        return (typeof object.constructor == 'function' && !isPrototype(object))
6233          ? baseCreate(getPrototype(object))
6234          : {};
6235      }
6236  
6237      /**
6238       * Initializes an object clone based on its `toStringTag`.
6239       *
6240       * **Note:** This function only supports cloning values with tags of
6241       * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
6242       *
6243       * @private
6244       * @param {Object} object The object to clone.
6245       * @param {string} tag The `toStringTag` of the object to clone.
6246       * @param {boolean} [isDeep] Specify a deep clone.
6247       * @returns {Object} Returns the initialized clone.
6248       */
6249      function initCloneByTag(object, tag, isDeep) {
6250        var Ctor = object.constructor;
6251        switch (tag) {
6252          case arrayBufferTag:
6253            return cloneArrayBuffer(object);
6254  
6255          case boolTag:
6256          case dateTag:
6257            return new Ctor(+object);
6258  
6259          case dataViewTag:
6260            return cloneDataView(object, isDeep);
6261  
6262          case float32Tag: case float64Tag:
6263          case int8Tag: case int16Tag: case int32Tag:
6264          case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
6265            return cloneTypedArray(object, isDeep);
6266  
6267          case mapTag:
6268            return new Ctor;
6269  
6270          case numberTag:
6271          case stringTag:
6272            return new Ctor(object);
6273  
6274          case regexpTag:
6275            return cloneRegExp(object);
6276  
6277          case setTag:
6278            return new Ctor;
6279  
6280          case symbolTag:
6281            return cloneSymbol(object);
6282        }
6283      }
6284  
6285      /**
6286       * Inserts wrapper `details` in a comment at the top of the `source` body.
6287       *
6288       * @private
6289       * @param {string} source The source to modify.
6290       * @returns {Array} details The details to insert.
6291       * @returns {string} Returns the modified source.
6292       */
6293      function insertWrapDetails(source, details) {
6294        var length = details.length;
6295        if (!length) {
6296          return source;
6297        }
6298        var lastIndex = length - 1;
6299        details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
6300        details = details.join(length > 2 ? ', ' : ' ');
6301        return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
6302      }
6303  
6304      /**
6305       * Checks if `value` is a flattenable `arguments` object or array.
6306       *
6307       * @private
6308       * @param {*} value The value to check.
6309       * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
6310       */
6311      function isFlattenable(value) {
6312        return isArray(value) || isArguments(value) ||
6313          !!(spreadableSymbol && value && value[spreadableSymbol]);
6314      }
6315  
6316      /**
6317       * Checks if `value` is a valid array-like index.
6318       *
6319       * @private
6320       * @param {*} value The value to check.
6321       * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
6322       * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
6323       */
6324      function isIndex(value, length) {
6325        var type = typeof value;
6326        length = length == null ? MAX_SAFE_INTEGER : length;
6327  
6328        return !!length &&
6329          (type == 'number' ||
6330            (type != 'symbol' && reIsUint.test(value))) &&
6331              (value > -1 && value % 1 == 0 && value < length);
6332      }
6333  
6334      /**
6335       * Checks if the given arguments are from an iteratee call.
6336       *
6337       * @private
6338       * @param {*} value The potential iteratee value argument.
6339       * @param {*} index The potential iteratee index or key argument.
6340       * @param {*} object The potential iteratee object argument.
6341       * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
6342       *  else `false`.
6343       */
6344      function isIterateeCall(value, index, object) {
6345        if (!isObject(object)) {
6346          return false;
6347        }
6348        var type = typeof index;
6349        if (type == 'number'
6350              ? (isArrayLike(object) && isIndex(index, object.length))
6351              : (type == 'string' && index in object)
6352            ) {
6353          return eq(object[index], value);
6354        }
6355        return false;
6356      }
6357  
6358      /**
6359       * Checks if `value` is a property name and not a property path.
6360       *
6361       * @private
6362       * @param {*} value The value to check.
6363       * @param {Object} [object] The object to query keys on.
6364       * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
6365       */
6366      function isKey(value, object) {
6367        if (isArray(value)) {
6368          return false;
6369        }
6370        var type = typeof value;
6371        if (type == 'number' || type == 'symbol' || type == 'boolean' ||
6372            value == null || isSymbol(value)) {
6373          return true;
6374        }
6375        return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
6376          (object != null && value in Object(object));
6377      }
6378  
6379      /**
6380       * Checks if `value` is suitable for use as unique object key.
6381       *
6382       * @private
6383       * @param {*} value The value to check.
6384       * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
6385       */
6386      function isKeyable(value) {
6387        var type = typeof value;
6388        return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
6389          ? (value !== '__proto__')
6390          : (value === null);
6391      }
6392  
6393      /**
6394       * Checks if `func` has a lazy counterpart.
6395       *
6396       * @private
6397       * @param {Function} func The function to check.
6398       * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
6399       *  else `false`.
6400       */
6401      function isLaziable(func) {
6402        var funcName = getFuncName(func),
6403            other = lodash[funcName];
6404  
6405        if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
6406          return false;
6407        }
6408        if (func === other) {
6409          return true;
6410        }
6411        var data = getData(other);
6412        return !!data && func === data[0];
6413      }
6414  
6415      /**
6416       * Checks if `func` has its source masked.
6417       *
6418       * @private
6419       * @param {Function} func The function to check.
6420       * @returns {boolean} Returns `true` if `func` is masked, else `false`.
6421       */
6422      function isMasked(func) {
6423        return !!maskSrcKey && (maskSrcKey in func);
6424      }
6425  
6426      /**
6427       * Checks if `func` is capable of being masked.
6428       *
6429       * @private
6430       * @param {*} value The value to check.
6431       * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
6432       */
6433      var isMaskable = coreJsData ? isFunction : stubFalse;
6434  
6435      /**
6436       * Checks if `value` is likely a prototype object.
6437       *
6438       * @private
6439       * @param {*} value The value to check.
6440       * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
6441       */
6442      function isPrototype(value) {
6443        var Ctor = value && value.constructor,
6444            proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
6445  
6446        return value === proto;
6447      }
6448  
6449      /**
6450       * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
6451       *
6452       * @private
6453       * @param {*} value The value to check.
6454       * @returns {boolean} Returns `true` if `value` if suitable for strict
6455       *  equality comparisons, else `false`.
6456       */
6457      function isStrictComparable(value) {
6458        return value === value && !isObject(value);
6459      }
6460  
6461      /**
6462       * A specialized version of `matchesProperty` for source values suitable
6463       * for strict equality comparisons, i.e. `===`.
6464       *
6465       * @private
6466       * @param {string} key The key of the property to get.
6467       * @param {*} srcValue The value to match.
6468       * @returns {Function} Returns the new spec function.
6469       */
6470      function matchesStrictComparable(key, srcValue) {
6471        return function(object) {
6472          if (object == null) {
6473            return false;
6474          }
6475          return object[key] === srcValue &&
6476            (srcValue !== undefined || (key in Object(object)));
6477        };
6478      }
6479  
6480      /**
6481       * A specialized version of `_.memoize` which clears the memoized function's
6482       * cache when it exceeds `MAX_MEMOIZE_SIZE`.
6483       *
6484       * @private
6485       * @param {Function} func The function to have its output memoized.
6486       * @returns {Function} Returns the new memoized function.
6487       */
6488      function memoizeCapped(func) {
6489        var result = memoize(func, function(key) {
6490          if (cache.size === MAX_MEMOIZE_SIZE) {
6491            cache.clear();
6492          }
6493          return key;
6494        });
6495  
6496        var cache = result.cache;
6497        return result;
6498      }
6499  
6500      /**
6501       * Merges the function metadata of `source` into `data`.
6502       *
6503       * Merging metadata reduces the number of wrappers used to invoke a function.
6504       * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
6505       * may be applied regardless of execution order. Methods like `_.ary` and
6506       * `_.rearg` modify function arguments, making the order in which they are
6507       * executed important, preventing the merging of metadata. However, we make
6508       * an exception for a safe combined case where curried functions have `_.ary`
6509       * and or `_.rearg` applied.
6510       *
6511       * @private
6512       * @param {Array} data The destination metadata.
6513       * @param {Array} source The source metadata.
6514       * @returns {Array} Returns `data`.
6515       */
6516      function mergeData(data, source) {
6517        var bitmask = data[1],
6518            srcBitmask = source[1],
6519            newBitmask = bitmask | srcBitmask,
6520            isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
6521  
6522        var isCombo =
6523          ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
6524          ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
6525          ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
6526  
6527        // Exit early if metadata can't be merged.
6528        if (!(isCommon || isCombo)) {
6529          return data;
6530        }
6531        // Use source `thisArg` if available.
6532        if (srcBitmask & WRAP_BIND_FLAG) {
6533          data[2] = source[2];
6534          // Set when currying a bound function.
6535          newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
6536        }
6537        // Compose partial arguments.
6538        var value = source[3];
6539        if (value) {
6540          var partials = data[3];
6541          data[3] = partials ? composeArgs(partials, value, source[4]) : value;
6542          data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
6543        }
6544        // Compose partial right arguments.
6545        value = source[5];
6546        if (value) {
6547          partials = data[5];
6548          data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
6549          data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
6550        }
6551        // Use source `argPos` if available.
6552        value = source[7];
6553        if (value) {
6554          data[7] = value;
6555        }
6556        // Use source `ary` if it's smaller.
6557        if (srcBitmask & WRAP_ARY_FLAG) {
6558          data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
6559        }
6560        // Use source `arity` if one is not provided.
6561        if (data[9] == null) {
6562          data[9] = source[9];
6563        }
6564        // Use source `func` and merge bitmasks.
6565        data[0] = source[0];
6566        data[1] = newBitmask;
6567  
6568        return data;
6569      }
6570  
6571      /**
6572       * This function is like
6573       * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
6574       * except that it includes inherited enumerable properties.
6575       *
6576       * @private
6577       * @param {Object} object The object to query.
6578       * @returns {Array} Returns the array of property names.
6579       */
6580      function nativeKeysIn(object) {
6581        var result = [];
6582        if (object != null) {
6583          for (var key in Object(object)) {
6584            result.push(key);
6585          }
6586        }
6587        return result;
6588      }
6589  
6590      /**
6591       * Converts `value` to a string using `Object.prototype.toString`.
6592       *
6593       * @private
6594       * @param {*} value The value to convert.
6595       * @returns {string} Returns the converted string.
6596       */
6597      function objectToString(value) {
6598        return nativeObjectToString.call(value);
6599      }
6600  
6601      /**
6602       * A specialized version of `baseRest` which transforms the rest array.
6603       *
6604       * @private
6605       * @param {Function} func The function to apply a rest parameter to.
6606       * @param {number} [start=func.length-1] The start position of the rest parameter.
6607       * @param {Function} transform The rest array transform.
6608       * @returns {Function} Returns the new function.
6609       */
6610      function overRest(func, start, transform) {
6611        start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
6612        return function() {
6613          var args = arguments,
6614              index = -1,
6615              length = nativeMax(args.length - start, 0),
6616              array = Array(length);
6617  
6618          while (++index < length) {
6619            array[index] = args[start + index];
6620          }
6621          index = -1;
6622          var otherArgs = Array(start + 1);
6623          while (++index < start) {
6624            otherArgs[index] = args[index];
6625          }
6626          otherArgs[start] = transform(array);
6627          return apply(func, this, otherArgs);
6628        };
6629      }
6630  
6631      /**
6632       * Gets the parent value at `path` of `object`.
6633       *
6634       * @private
6635       * @param {Object} object The object to query.
6636       * @param {Array} path The path to get the parent value of.
6637       * @returns {*} Returns the parent value.
6638       */
6639      function parent(object, path) {
6640        return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
6641      }
6642  
6643      /**
6644       * Reorder `array` according to the specified indexes where the element at
6645       * the first index is assigned as the first element, the element at
6646       * the second index is assigned as the second element, and so on.
6647       *
6648       * @private
6649       * @param {Array} array The array to reorder.
6650       * @param {Array} indexes The arranged array indexes.
6651       * @returns {Array} Returns `array`.
6652       */
6653      function reorder(array, indexes) {
6654        var arrLength = array.length,
6655            length = nativeMin(indexes.length, arrLength),
6656            oldArray = copyArray(array);
6657  
6658        while (length--) {
6659          var index = indexes[length];
6660          array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
6661        }
6662        return array;
6663      }
6664  
6665      /**
6666       * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
6667       *
6668       * @private
6669       * @param {Object} object The object to query.
6670       * @param {string} key The key of the property to get.
6671       * @returns {*} Returns the property value.
6672       */
6673      function safeGet(object, key) {
6674        if (key === 'constructor' && typeof object[key] === 'function') {
6675          return;
6676        }
6677  
6678        if (key == '__proto__') {
6679          return;
6680        }
6681  
6682        return object[key];
6683      }
6684  
6685      /**
6686       * Sets metadata for `func`.
6687       *
6688       * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
6689       * period of time, it will trip its breaker and transition to an identity
6690       * function to avoid garbage collection pauses in V8. See
6691       * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
6692       * for more details.
6693       *
6694       * @private
6695       * @param {Function} func The function to associate metadata with.
6696       * @param {*} data The metadata.
6697       * @returns {Function} Returns `func`.
6698       */
6699      var setData = shortOut(baseSetData);
6700  
6701      /**
6702       * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
6703       *
6704       * @private
6705       * @param {Function} func The function to delay.
6706       * @param {number} wait The number of milliseconds to delay invocation.
6707       * @returns {number|Object} Returns the timer id or timeout object.
6708       */
6709      var setTimeout = ctxSetTimeout || function(func, wait) {
6710        return root.setTimeout(func, wait);
6711      };
6712  
6713      /**
6714       * Sets the `toString` method of `func` to return `string`.
6715       *
6716       * @private
6717       * @param {Function} func The function to modify.
6718       * @param {Function} string The `toString` result.
6719       * @returns {Function} Returns `func`.
6720       */
6721      var setToString = shortOut(baseSetToString);
6722  
6723      /**
6724       * Sets the `toString` method of `wrapper` to mimic the source of `reference`
6725       * with wrapper details in a comment at the top of the source body.
6726       *
6727       * @private
6728       * @param {Function} wrapper The function to modify.
6729       * @param {Function} reference The reference function.
6730       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6731       * @returns {Function} Returns `wrapper`.
6732       */
6733      function setWrapToString(wrapper, reference, bitmask) {
6734        var source = (reference + '');
6735        return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
6736      }
6737  
6738      /**
6739       * Creates a function that'll short out and invoke `identity` instead
6740       * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
6741       * milliseconds.
6742       *
6743       * @private
6744       * @param {Function} func The function to restrict.
6745       * @returns {Function} Returns the new shortable function.
6746       */
6747      function shortOut(func) {
6748        var count = 0,
6749            lastCalled = 0;
6750  
6751        return function() {
6752          var stamp = nativeNow(),
6753              remaining = HOT_SPAN - (stamp - lastCalled);
6754  
6755          lastCalled = stamp;
6756          if (remaining > 0) {
6757            if (++count >= HOT_COUNT) {
6758              return arguments[0];
6759            }
6760          } else {
6761            count = 0;
6762          }
6763          return func.apply(undefined, arguments);
6764        };
6765      }
6766  
6767      /**
6768       * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
6769       *
6770       * @private
6771       * @param {Array} array The array to shuffle.
6772       * @param {number} [size=array.length] The size of `array`.
6773       * @returns {Array} Returns `array`.
6774       */
6775      function shuffleSelf(array, size) {
6776        var index = -1,
6777            length = array.length,
6778            lastIndex = length - 1;
6779  
6780        size = size === undefined ? length : size;
6781        while (++index < size) {
6782          var rand = baseRandom(index, lastIndex),
6783              value = array[rand];
6784  
6785          array[rand] = array[index];
6786          array[index] = value;
6787        }
6788        array.length = size;
6789        return array;
6790      }
6791  
6792      /**
6793       * Converts `string` to a property path array.
6794       *
6795       * @private
6796       * @param {string} string The string to convert.
6797       * @returns {Array} Returns the property path array.
6798       */
6799      var stringToPath = memoizeCapped(function(string) {
6800        var result = [];
6801        if (string.charCodeAt(0) === 46 /* . */) {
6802          result.push('');
6803        }
6804        string.replace(rePropName, function(match, number, quote, subString) {
6805          result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
6806        });
6807        return result;
6808      });
6809  
6810      /**
6811       * Converts `value` to a string key if it's not a string or symbol.
6812       *
6813       * @private
6814       * @param {*} value The value to inspect.
6815       * @returns {string|symbol} Returns the key.
6816       */
6817      function toKey(value) {
6818        if (typeof value == 'string' || isSymbol(value)) {
6819          return value;
6820        }
6821        var result = (value + '');
6822        return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
6823      }
6824  
6825      /**
6826       * Converts `func` to its source code.
6827       *
6828       * @private
6829       * @param {Function} func The function to convert.
6830       * @returns {string} Returns the source code.
6831       */
6832      function toSource(func) {
6833        if (func != null) {
6834          try {
6835            return funcToString.call(func);
6836          } catch (e) {}
6837          try {
6838            return (func + '');
6839          } catch (e) {}
6840        }
6841        return '';
6842      }
6843  
6844      /**
6845       * Updates wrapper `details` based on `bitmask` flags.
6846       *
6847       * @private
6848       * @returns {Array} details The details to modify.
6849       * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6850       * @returns {Array} Returns `details`.
6851       */
6852      function updateWrapDetails(details, bitmask) {
6853        arrayEach(wrapFlags, function(pair) {
6854          var value = '_.' + pair[0];
6855          if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
6856            details.push(value);
6857          }
6858        });
6859        return details.sort();
6860      }
6861  
6862      /**
6863       * Creates a clone of `wrapper`.
6864       *
6865       * @private
6866       * @param {Object} wrapper The wrapper to clone.
6867       * @returns {Object} Returns the cloned wrapper.
6868       */
6869      function wrapperClone(wrapper) {
6870        if (wrapper instanceof LazyWrapper) {
6871          return wrapper.clone();
6872        }
6873        var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
6874        result.__actions__ = copyArray(wrapper.__actions__);
6875        result.__index__  = wrapper.__index__;
6876        result.__values__ = wrapper.__values__;
6877        return result;
6878      }
6879  
6880      /*------------------------------------------------------------------------*/
6881  
6882      /**
6883       * Creates an array of elements split into groups the length of `size`.
6884       * If `array` can't be split evenly, the final chunk will be the remaining
6885       * elements.
6886       *
6887       * @static
6888       * @memberOf _
6889       * @since 3.0.0
6890       * @category Array
6891       * @param {Array} array The array to process.
6892       * @param {number} [size=1] The length of each chunk
6893       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
6894       * @returns {Array} Returns the new array of chunks.
6895       * @example
6896       *
6897       * _.chunk(['a', 'b', 'c', 'd'], 2);
6898       * // => [['a', 'b'], ['c', 'd']]
6899       *
6900       * _.chunk(['a', 'b', 'c', 'd'], 3);
6901       * // => [['a', 'b', 'c'], ['d']]
6902       */
6903      function chunk(array, size, guard) {
6904        if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
6905          size = 1;
6906        } else {
6907          size = nativeMax(toInteger(size), 0);
6908        }
6909        var length = array == null ? 0 : array.length;
6910        if (!length || size < 1) {
6911          return [];
6912        }
6913        var index = 0,
6914            resIndex = 0,
6915            result = Array(nativeCeil(length / size));
6916  
6917        while (index < length) {
6918          result[resIndex++] = baseSlice(array, index, (index += size));
6919        }
6920        return result;
6921      }
6922  
6923      /**
6924       * Creates an array with all falsey values removed. The values `false`, `null`,
6925       * `0`, `""`, `undefined`, and `NaN` are falsey.
6926       *
6927       * @static
6928       * @memberOf _
6929       * @since 0.1.0
6930       * @category Array
6931       * @param {Array} array The array to compact.
6932       * @returns {Array} Returns the new array of filtered values.
6933       * @example
6934       *
6935       * _.compact([0, 1, false, 2, '', 3]);
6936       * // => [1, 2, 3]
6937       */
6938      function compact(array) {
6939        var index = -1,
6940            length = array == null ? 0 : array.length,
6941            resIndex = 0,
6942            result = [];
6943  
6944        while (++index < length) {
6945          var value = array[index];
6946          if (value) {
6947            result[resIndex++] = value;
6948          }
6949        }
6950        return result;
6951      }
6952  
6953      /**
6954       * Creates a new array concatenating `array` with any additional arrays
6955       * and/or values.
6956       *
6957       * @static
6958       * @memberOf _
6959       * @since 4.0.0
6960       * @category Array
6961       * @param {Array} array The array to concatenate.
6962       * @param {...*} [values] The values to concatenate.
6963       * @returns {Array} Returns the new concatenated array.
6964       * @example
6965       *
6966       * var array = [1];
6967       * var other = _.concat(array, 2, [3], [[4]]);
6968       *
6969       * console.log(other);
6970       * // => [1, 2, 3, [4]]
6971       *
6972       * console.log(array);
6973       * // => [1]
6974       */
6975      function concat() {
6976        var length = arguments.length;
6977        if (!length) {
6978          return [];
6979        }
6980        var args = Array(length - 1),
6981            array = arguments[0],
6982            index = length;
6983  
6984        while (index--) {
6985          args[index - 1] = arguments[index];
6986        }
6987        return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
6988      }
6989  
6990      /**
6991       * Creates an array of `array` values not included in the other given arrays
6992       * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
6993       * for equality comparisons. The order and references of result values are
6994       * determined by the first array.
6995       *
6996       * **Note:** Unlike `_.pullAll`, this method returns a new array.
6997       *
6998       * @static
6999       * @memberOf _
7000       * @since 0.1.0
7001       * @category Array
7002       * @param {Array} array The array to inspect.
7003       * @param {...Array} [values] The values to exclude.
7004       * @returns {Array} Returns the new array of filtered values.
7005       * @see _.without, _.xor
7006       * @example
7007       *
7008       * _.difference([2, 1], [2, 3]);
7009       * // => [1]
7010       */
7011      var difference = baseRest(function(array, values) {
7012        return isArrayLikeObject(array)
7013          ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
7014          : [];
7015      });
7016  
7017      /**
7018       * This method is like `_.difference` except that it accepts `iteratee` which
7019       * is invoked for each element of `array` and `values` to generate the criterion
7020       * by which they're compared. The order and references of result values are
7021       * determined by the first array. The iteratee is invoked with one argument:
7022       * (value).
7023       *
7024       * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
7025       *
7026       * @static
7027       * @memberOf _
7028       * @since 4.0.0
7029       * @category Array
7030       * @param {Array} array The array to inspect.
7031       * @param {...Array} [values] The values to exclude.
7032       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7033       * @returns {Array} Returns the new array of filtered values.
7034       * @example
7035       *
7036       * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7037       * // => [1.2]
7038       *
7039       * // The `_.property` iteratee shorthand.
7040       * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
7041       * // => [{ 'x': 2 }]
7042       */
7043      var differenceBy = baseRest(function(array, values) {
7044        var iteratee = last(values);
7045        if (isArrayLikeObject(iteratee)) {
7046          iteratee = undefined;
7047        }
7048        return isArrayLikeObject(array)
7049          ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
7050          : [];
7051      });
7052  
7053      /**
7054       * This method is like `_.difference` except that it accepts `comparator`
7055       * which is invoked to compare elements of `array` to `values`. The order and
7056       * references of result values are determined by the first array. The comparator
7057       * is invoked with two arguments: (arrVal, othVal).
7058       *
7059       * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
7060       *
7061       * @static
7062       * @memberOf _
7063       * @since 4.0.0
7064       * @category Array
7065       * @param {Array} array The array to inspect.
7066       * @param {...Array} [values] The values to exclude.
7067       * @param {Function} [comparator] The comparator invoked per element.
7068       * @returns {Array} Returns the new array of filtered values.
7069       * @example
7070       *
7071       * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7072       *
7073       * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
7074       * // => [{ 'x': 2, 'y': 1 }]
7075       */
7076      var differenceWith = baseRest(function(array, values) {
7077        var comparator = last(values);
7078        if (isArrayLikeObject(comparator)) {
7079          comparator = undefined;
7080        }
7081        return isArrayLikeObject(array)
7082          ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
7083          : [];
7084      });
7085  
7086      /**
7087       * Creates a slice of `array` with `n` elements dropped from the beginning.
7088       *
7089       * @static
7090       * @memberOf _
7091       * @since 0.5.0
7092       * @category Array
7093       * @param {Array} array The array to query.
7094       * @param {number} [n=1] The number of elements to drop.
7095       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7096       * @returns {Array} Returns the slice of `array`.
7097       * @example
7098       *
7099       * _.drop([1, 2, 3]);
7100       * // => [2, 3]
7101       *
7102       * _.drop([1, 2, 3], 2);
7103       * // => [3]
7104       *
7105       * _.drop([1, 2, 3], 5);
7106       * // => []
7107       *
7108       * _.drop([1, 2, 3], 0);
7109       * // => [1, 2, 3]
7110       */
7111      function drop(array, n, guard) {
7112        var length = array == null ? 0 : array.length;
7113        if (!length) {
7114          return [];
7115        }
7116        n = (guard || n === undefined) ? 1 : toInteger(n);
7117        return baseSlice(array, n < 0 ? 0 : n, length);
7118      }
7119  
7120      /**
7121       * Creates a slice of `array` with `n` elements dropped from the end.
7122       *
7123       * @static
7124       * @memberOf _
7125       * @since 3.0.0
7126       * @category Array
7127       * @param {Array} array The array to query.
7128       * @param {number} [n=1] The number of elements to drop.
7129       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7130       * @returns {Array} Returns the slice of `array`.
7131       * @example
7132       *
7133       * _.dropRight([1, 2, 3]);
7134       * // => [1, 2]
7135       *
7136       * _.dropRight([1, 2, 3], 2);
7137       * // => [1]
7138       *
7139       * _.dropRight([1, 2, 3], 5);
7140       * // => []
7141       *
7142       * _.dropRight([1, 2, 3], 0);
7143       * // => [1, 2, 3]
7144       */
7145      function dropRight(array, n, guard) {
7146        var length = array == null ? 0 : array.length;
7147        if (!length) {
7148          return [];
7149        }
7150        n = (guard || n === undefined) ? 1 : toInteger(n);
7151        n = length - n;
7152        return baseSlice(array, 0, n < 0 ? 0 : n);
7153      }
7154  
7155      /**
7156       * Creates a slice of `array` excluding elements dropped from the end.
7157       * Elements are dropped until `predicate` returns falsey. The predicate is
7158       * invoked with three arguments: (value, index, array).
7159       *
7160       * @static
7161       * @memberOf _
7162       * @since 3.0.0
7163       * @category Array
7164       * @param {Array} array The array to query.
7165       * @param {Function} [predicate=_.identity] The function invoked per iteration.
7166       * @returns {Array} Returns the slice of `array`.
7167       * @example
7168       *
7169       * var users = [
7170       *   { 'user': 'barney',  'active': true },
7171       *   { 'user': 'fred',    'active': false },
7172       *   { 'user': 'pebbles', 'active': false }
7173       * ];
7174       *
7175       * _.dropRightWhile(users, function(o) { return !o.active; });
7176       * // => objects for ['barney']
7177       *
7178       * // The `_.matches` iteratee shorthand.
7179       * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
7180       * // => objects for ['barney', 'fred']
7181       *
7182       * // The `_.matchesProperty` iteratee shorthand.
7183       * _.dropRightWhile(users, ['active', false]);
7184       * // => objects for ['barney']
7185       *
7186       * // The `_.property` iteratee shorthand.
7187       * _.dropRightWhile(users, 'active');
7188       * // => objects for ['barney', 'fred', 'pebbles']
7189       */
7190      function dropRightWhile(array, predicate) {
7191        return (array && array.length)
7192          ? baseWhile(array, getIteratee(predicate, 3), true, true)
7193          : [];
7194      }
7195  
7196      /**
7197       * Creates a slice of `array` excluding elements dropped from the beginning.
7198       * Elements are dropped until `predicate` returns falsey. The predicate is
7199       * invoked with three arguments: (value, index, array).
7200       *
7201       * @static
7202       * @memberOf _
7203       * @since 3.0.0
7204       * @category Array
7205       * @param {Array} array The array to query.
7206       * @param {Function} [predicate=_.identity] The function invoked per iteration.
7207       * @returns {Array} Returns the slice of `array`.
7208       * @example
7209       *
7210       * var users = [
7211       *   { 'user': 'barney',  'active': false },
7212       *   { 'user': 'fred',    'active': false },
7213       *   { 'user': 'pebbles', 'active': true }
7214       * ];
7215       *
7216       * _.dropWhile(users, function(o) { return !o.active; });
7217       * // => objects for ['pebbles']
7218       *
7219       * // The `_.matches` iteratee shorthand.
7220       * _.dropWhile(users, { 'user': 'barney', 'active': false });
7221       * // => objects for ['fred', 'pebbles']
7222       *
7223       * // The `_.matchesProperty` iteratee shorthand.
7224       * _.dropWhile(users, ['active', false]);
7225       * // => objects for ['pebbles']
7226       *
7227       * // The `_.property` iteratee shorthand.
7228       * _.dropWhile(users, 'active');
7229       * // => objects for ['barney', 'fred', 'pebbles']
7230       */
7231      function dropWhile(array, predicate) {
7232        return (array && array.length)
7233          ? baseWhile(array, getIteratee(predicate, 3), true)
7234          : [];
7235      }
7236  
7237      /**
7238       * Fills elements of `array` with `value` from `start` up to, but not
7239       * including, `end`.
7240       *
7241       * **Note:** This method mutates `array`.
7242       *
7243       * @static
7244       * @memberOf _
7245       * @since 3.2.0
7246       * @category Array
7247       * @param {Array} array The array to fill.
7248       * @param {*} value The value to fill `array` with.
7249       * @param {number} [start=0] The start position.
7250       * @param {number} [end=array.length] The end position.
7251       * @returns {Array} Returns `array`.
7252       * @example
7253       *
7254       * var array = [1, 2, 3];
7255       *
7256       * _.fill(array, 'a');
7257       * console.log(array);
7258       * // => ['a', 'a', 'a']
7259       *
7260       * _.fill(Array(3), 2);
7261       * // => [2, 2, 2]
7262       *
7263       * _.fill([4, 6, 8, 10], '*', 1, 3);
7264       * // => [4, '*', '*', 10]
7265       */
7266      function fill(array, value, start, end) {
7267        var length = array == null ? 0 : array.length;
7268        if (!length) {
7269          return [];
7270        }
7271        if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
7272          start = 0;
7273          end = length;
7274        }
7275        return baseFill(array, value, start, end);
7276      }
7277  
7278      /**
7279       * This method is like `_.find` except that it returns the index of the first
7280       * element `predicate` returns truthy for instead of the element itself.
7281       *
7282       * @static
7283       * @memberOf _
7284       * @since 1.1.0
7285       * @category Array
7286       * @param {Array} array The array to inspect.
7287       * @param {Function} [predicate=_.identity] The function invoked per iteration.
7288       * @param {number} [fromIndex=0] The index to search from.
7289       * @returns {number} Returns the index of the found element, else `-1`.
7290       * @example
7291       *
7292       * var users = [
7293       *   { 'user': 'barney',  'active': false },
7294       *   { 'user': 'fred',    'active': false },
7295       *   { 'user': 'pebbles', 'active': true }
7296       * ];
7297       *
7298       * _.findIndex(users, function(o) { return o.user == 'barney'; });
7299       * // => 0
7300       *
7301       * // The `_.matches` iteratee shorthand.
7302       * _.findIndex(users, { 'user': 'fred', 'active': false });
7303       * // => 1
7304       *
7305       * // The `_.matchesProperty` iteratee shorthand.
7306       * _.findIndex(users, ['active', false]);
7307       * // => 0
7308       *
7309       * // The `_.property` iteratee shorthand.
7310       * _.findIndex(users, 'active');
7311       * // => 2
7312       */
7313      function findIndex(array, predicate, fromIndex) {
7314        var length = array == null ? 0 : array.length;
7315        if (!length) {
7316          return -1;
7317        }
7318        var index = fromIndex == null ? 0 : toInteger(fromIndex);
7319        if (index < 0) {
7320          index = nativeMax(length + index, 0);
7321        }
7322        return baseFindIndex(array, getIteratee(predicate, 3), index);
7323      }
7324  
7325      /**
7326       * This method is like `_.findIndex` except that it iterates over elements
7327       * of `collection` from right to left.
7328       *
7329       * @static
7330       * @memberOf _
7331       * @since 2.0.0
7332       * @category Array
7333       * @param {Array} array The array to inspect.
7334       * @param {Function} [predicate=_.identity] The function invoked per iteration.
7335       * @param {number} [fromIndex=array.length-1] The index to search from.
7336       * @returns {number} Returns the index of the found element, else `-1`.
7337       * @example
7338       *
7339       * var users = [
7340       *   { 'user': 'barney',  'active': true },
7341       *   { 'user': 'fred',    'active': false },
7342       *   { 'user': 'pebbles', 'active': false }
7343       * ];
7344       *
7345       * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
7346       * // => 2
7347       *
7348       * // The `_.matches` iteratee shorthand.
7349       * _.findLastIndex(users, { 'user': 'barney', 'active': true });
7350       * // => 0
7351       *
7352       * // The `_.matchesProperty` iteratee shorthand.
7353       * _.findLastIndex(users, ['active', false]);
7354       * // => 2
7355       *
7356       * // The `_.property` iteratee shorthand.
7357       * _.findLastIndex(users, 'active');
7358       * // => 0
7359       */
7360      function findLastIndex(array, predicate, fromIndex) {
7361        var length = array == null ? 0 : array.length;
7362        if (!length) {
7363          return -1;
7364        }
7365        var index = length - 1;
7366        if (fromIndex !== undefined) {
7367          index = toInteger(fromIndex);
7368          index = fromIndex < 0
7369            ? nativeMax(length + index, 0)
7370            : nativeMin(index, length - 1);
7371        }
7372        return baseFindIndex(array, getIteratee(predicate, 3), index, true);
7373      }
7374  
7375      /**
7376       * Flattens `array` a single level deep.
7377       *
7378       * @static
7379       * @memberOf _
7380       * @since 0.1.0
7381       * @category Array
7382       * @param {Array} array The array to flatten.
7383       * @returns {Array} Returns the new flattened array.
7384       * @example
7385       *
7386       * _.flatten([1, [2, [3, [4]], 5]]);
7387       * // => [1, 2, [3, [4]], 5]
7388       */
7389      function flatten(array) {
7390        var length = array == null ? 0 : array.length;
7391        return length ? baseFlatten(array, 1) : [];
7392      }
7393  
7394      /**
7395       * Recursively flattens `array`.
7396       *
7397       * @static
7398       * @memberOf _
7399       * @since 3.0.0
7400       * @category Array
7401       * @param {Array} array The array to flatten.
7402       * @returns {Array} Returns the new flattened array.
7403       * @example
7404       *
7405       * _.flattenDeep([1, [2, [3, [4]], 5]]);
7406       * // => [1, 2, 3, 4, 5]
7407       */
7408      function flattenDeep(array) {
7409        var length = array == null ? 0 : array.length;
7410        return length ? baseFlatten(array, INFINITY) : [];
7411      }
7412  
7413      /**
7414       * Recursively flatten `array` up to `depth` times.
7415       *
7416       * @static
7417       * @memberOf _
7418       * @since 4.4.0
7419       * @category Array
7420       * @param {Array} array The array to flatten.
7421       * @param {number} [depth=1] The maximum recursion depth.
7422       * @returns {Array} Returns the new flattened array.
7423       * @example
7424       *
7425       * var array = [1, [2, [3, [4]], 5]];
7426       *
7427       * _.flattenDepth(array, 1);
7428       * // => [1, 2, [3, [4]], 5]
7429       *
7430       * _.flattenDepth(array, 2);
7431       * // => [1, 2, 3, [4], 5]
7432       */
7433      function flattenDepth(array, depth) {
7434        var length = array == null ? 0 : array.length;
7435        if (!length) {
7436          return [];
7437        }
7438        depth = depth === undefined ? 1 : toInteger(depth);
7439        return baseFlatten(array, depth);
7440      }
7441  
7442      /**
7443       * The inverse of `_.toPairs`; this method returns an object composed
7444       * from key-value `pairs`.
7445       *
7446       * @static
7447       * @memberOf _
7448       * @since 4.0.0
7449       * @category Array
7450       * @param {Array} pairs The key-value pairs.
7451       * @returns {Object} Returns the new object.
7452       * @example
7453       *
7454       * _.fromPairs([['a', 1], ['b', 2]]);
7455       * // => { 'a': 1, 'b': 2 }
7456       */
7457      function fromPairs(pairs) {
7458        var index = -1,
7459            length = pairs == null ? 0 : pairs.length,
7460            result = {};
7461  
7462        while (++index < length) {
7463          var pair = pairs[index];
7464          result[pair[0]] = pair[1];
7465        }
7466        return result;
7467      }
7468  
7469      /**
7470       * Gets the first element of `array`.
7471       *
7472       * @static
7473       * @memberOf _
7474       * @since 0.1.0
7475       * @alias first
7476       * @category Array
7477       * @param {Array} array The array to query.
7478       * @returns {*} Returns the first element of `array`.
7479       * @example
7480       *
7481       * _.head([1, 2, 3]);
7482       * // => 1
7483       *
7484       * _.head([]);
7485       * // => undefined
7486       */
7487      function head(array) {
7488        return (array && array.length) ? array[0] : undefined;
7489      }
7490  
7491      /**
7492       * Gets the index at which the first occurrence of `value` is found in `array`
7493       * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7494       * for equality comparisons. If `fromIndex` is negative, it's used as the
7495       * offset from the end of `array`.
7496       *
7497       * @static
7498       * @memberOf _
7499       * @since 0.1.0
7500       * @category Array
7501       * @param {Array} array The array to inspect.
7502       * @param {*} value The value to search for.
7503       * @param {number} [fromIndex=0] The index to search from.
7504       * @returns {number} Returns the index of the matched value, else `-1`.
7505       * @example
7506       *
7507       * _.indexOf([1, 2, 1, 2], 2);
7508       * // => 1
7509       *
7510       * // Search from the `fromIndex`.
7511       * _.indexOf([1, 2, 1, 2], 2, 2);
7512       * // => 3
7513       */
7514      function indexOf(array, value, fromIndex) {
7515        var length = array == null ? 0 : array.length;
7516        if (!length) {
7517          return -1;
7518        }
7519        var index = fromIndex == null ? 0 : toInteger(fromIndex);
7520        if (index < 0) {
7521          index = nativeMax(length + index, 0);
7522        }
7523        return baseIndexOf(array, value, index);
7524      }
7525  
7526      /**
7527       * Gets all but the last element of `array`.
7528       *
7529       * @static
7530       * @memberOf _
7531       * @since 0.1.0
7532       * @category Array
7533       * @param {Array} array The array to query.
7534       * @returns {Array} Returns the slice of `array`.
7535       * @example
7536       *
7537       * _.initial([1, 2, 3]);
7538       * // => [1, 2]
7539       */
7540      function initial(array) {
7541        var length = array == null ? 0 : array.length;
7542        return length ? baseSlice(array, 0, -1) : [];
7543      }
7544  
7545      /**
7546       * Creates an array of unique values that are included in all given arrays
7547       * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7548       * for equality comparisons. The order and references of result values are
7549       * determined by the first array.
7550       *
7551       * @static
7552       * @memberOf _
7553       * @since 0.1.0
7554       * @category Array
7555       * @param {...Array} [arrays] The arrays to inspect.
7556       * @returns {Array} Returns the new array of intersecting values.
7557       * @example
7558       *
7559       * _.intersection([2, 1], [2, 3]);
7560       * // => [2]
7561       */
7562      var intersection = baseRest(function(arrays) {
7563        var mapped = arrayMap(arrays, castArrayLikeObject);
7564        return (mapped.length && mapped[0] === arrays[0])
7565          ? baseIntersection(mapped)
7566          : [];
7567      });
7568  
7569      /**
7570       * This method is like `_.intersection` except that it accepts `iteratee`
7571       * which is invoked for each element of each `arrays` to generate the criterion
7572       * by which they're compared. The order and references of result values are
7573       * determined by the first array. The iteratee is invoked with one argument:
7574       * (value).
7575       *
7576       * @static
7577       * @memberOf _
7578       * @since 4.0.0
7579       * @category Array
7580       * @param {...Array} [arrays] The arrays to inspect.
7581       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7582       * @returns {Array} Returns the new array of intersecting values.
7583       * @example
7584       *
7585       * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7586       * // => [2.1]
7587       *
7588       * // The `_.property` iteratee shorthand.
7589       * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
7590       * // => [{ 'x': 1 }]
7591       */
7592      var intersectionBy = baseRest(function(arrays) {
7593        var iteratee = last(arrays),
7594            mapped = arrayMap(arrays, castArrayLikeObject);
7595  
7596        if (iteratee === last(mapped)) {
7597          iteratee = undefined;
7598        } else {
7599          mapped.pop();
7600        }
7601        return (mapped.length && mapped[0] === arrays[0])
7602          ? baseIntersection(mapped, getIteratee(iteratee, 2))
7603          : [];
7604      });
7605  
7606      /**
7607       * This method is like `_.intersection` except that it accepts `comparator`
7608       * which is invoked to compare elements of `arrays`. The order and references
7609       * of result values are determined by the first array. The comparator is
7610       * invoked with two arguments: (arrVal, othVal).
7611       *
7612       * @static
7613       * @memberOf _
7614       * @since 4.0.0
7615       * @category Array
7616       * @param {...Array} [arrays] The arrays to inspect.
7617       * @param {Function} [comparator] The comparator invoked per element.
7618       * @returns {Array} Returns the new array of intersecting values.
7619       * @example
7620       *
7621       * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7622       * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
7623       *
7624       * _.intersectionWith(objects, others, _.isEqual);
7625       * // => [{ 'x': 1, 'y': 2 }]
7626       */
7627      var intersectionWith = baseRest(function(arrays) {
7628        var comparator = last(arrays),
7629            mapped = arrayMap(arrays, castArrayLikeObject);
7630  
7631        comparator = typeof comparator == 'function' ? comparator : undefined;
7632        if (comparator) {
7633          mapped.pop();
7634        }
7635        return (mapped.length && mapped[0] === arrays[0])
7636          ? baseIntersection(mapped, undefined, comparator)
7637          : [];
7638      });
7639  
7640      /**
7641       * Converts all elements in `array` into a string separated by `separator`.
7642       *
7643       * @static
7644       * @memberOf _
7645       * @since 4.0.0
7646       * @category Array
7647       * @param {Array} array The array to convert.
7648       * @param {string} [separator=','] The element separator.
7649       * @returns {string} Returns the joined string.
7650       * @example
7651       *
7652       * _.join(['a', 'b', 'c'], '~');
7653       * // => 'a~b~c'
7654       */
7655      function join(array, separator) {
7656        return array == null ? '' : nativeJoin.call(array, separator);
7657      }
7658  
7659      /**
7660       * Gets the last element of `array`.
7661       *
7662       * @static
7663       * @memberOf _
7664       * @since 0.1.0
7665       * @category Array
7666       * @param {Array} array The array to query.
7667       * @returns {*} Returns the last element of `array`.
7668       * @example
7669       *
7670       * _.last([1, 2, 3]);
7671       * // => 3
7672       */
7673      function last(array) {
7674        var length = array == null ? 0 : array.length;
7675        return length ? array[length - 1] : undefined;
7676      }
7677  
7678      /**
7679       * This method is like `_.indexOf` except that it iterates over elements of
7680       * `array` from right to left.
7681       *
7682       * @static
7683       * @memberOf _
7684       * @since 0.1.0
7685       * @category Array
7686       * @param {Array} array The array to inspect.
7687       * @param {*} value The value to search for.
7688       * @param {number} [fromIndex=array.length-1] The index to search from.
7689       * @returns {number} Returns the index of the matched value, else `-1`.
7690       * @example
7691       *
7692       * _.lastIndexOf([1, 2, 1, 2], 2);
7693       * // => 3
7694       *
7695       * // Search from the `fromIndex`.
7696       * _.lastIndexOf([1, 2, 1, 2], 2, 2);
7697       * // => 1
7698       */
7699      function lastIndexOf(array, value, fromIndex) {
7700        var length = array == null ? 0 : array.length;
7701        if (!length) {
7702          return -1;
7703        }
7704        var index = length;
7705        if (fromIndex !== undefined) {
7706          index = toInteger(fromIndex);
7707          index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
7708        }
7709        return value === value
7710          ? strictLastIndexOf(array, value, index)
7711          : baseFindIndex(array, baseIsNaN, index, true);
7712      }
7713  
7714      /**
7715       * Gets the element at index `n` of `array`. If `n` is negative, the nth
7716       * element from the end is returned.
7717       *
7718       * @static
7719       * @memberOf _
7720       * @since 4.11.0
7721       * @category Array
7722       * @param {Array} array The array to query.
7723       * @param {number} [n=0] The index of the element to return.
7724       * @returns {*} Returns the nth element of `array`.
7725       * @example
7726       *
7727       * var array = ['a', 'b', 'c', 'd'];
7728       *
7729       * _.nth(array, 1);
7730       * // => 'b'
7731       *
7732       * _.nth(array, -2);
7733       * // => 'c';
7734       */
7735      function nth(array, n) {
7736        return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
7737      }
7738  
7739      /**
7740       * Removes all given values from `array` using
7741       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7742       * for equality comparisons.
7743       *
7744       * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
7745       * to remove elements from an array by predicate.
7746       *
7747       * @static
7748       * @memberOf _
7749       * @since 2.0.0
7750       * @category Array
7751       * @param {Array} array The array to modify.
7752       * @param {...*} [values] The values to remove.
7753       * @returns {Array} Returns `array`.
7754       * @example
7755       *
7756       * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7757       *
7758       * _.pull(array, 'a', 'c');
7759       * console.log(array);
7760       * // => ['b', 'b']
7761       */
7762      var pull = baseRest(pullAll);
7763  
7764      /**
7765       * This method is like `_.pull` except that it accepts an array of values to remove.
7766       *
7767       * **Note:** Unlike `_.difference`, this method mutates `array`.
7768       *
7769       * @static
7770       * @memberOf _
7771       * @since 4.0.0
7772       * @category Array
7773       * @param {Array} array The array to modify.
7774       * @param {Array} values The values to remove.
7775       * @returns {Array} Returns `array`.
7776       * @example
7777       *
7778       * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7779       *
7780       * _.pullAll(array, ['a', 'c']);
7781       * console.log(array);
7782       * // => ['b', 'b']
7783       */
7784      function pullAll(array, values) {
7785        return (array && array.length && values && values.length)
7786          ? basePullAll(array, values)
7787          : array;
7788      }
7789  
7790      /**
7791       * This method is like `_.pullAll` except that it accepts `iteratee` which is
7792       * invoked for each element of `array` and `values` to generate the criterion
7793       * by which they're compared. The iteratee is invoked with one argument: (value).
7794       *
7795       * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
7796       *
7797       * @static
7798       * @memberOf _
7799       * @since 4.0.0
7800       * @category Array
7801       * @param {Array} array The array to modify.
7802       * @param {Array} values The values to remove.
7803       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7804       * @returns {Array} Returns `array`.
7805       * @example
7806       *
7807       * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
7808       *
7809       * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
7810       * console.log(array);
7811       * // => [{ 'x': 2 }]
7812       */
7813      function pullAllBy(array, values, iteratee) {
7814        return (array && array.length && values && values.length)
7815          ? basePullAll(array, values, getIteratee(iteratee, 2))
7816          : array;
7817      }
7818  
7819      /**
7820       * This method is like `_.pullAll` except that it accepts `comparator` which
7821       * is invoked to compare elements of `array` to `values`. The comparator is
7822       * invoked with two arguments: (arrVal, othVal).
7823       *
7824       * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
7825       *
7826       * @static
7827       * @memberOf _
7828       * @since 4.6.0
7829       * @category Array
7830       * @param {Array} array The array to modify.
7831       * @param {Array} values The values to remove.
7832       * @param {Function} [comparator] The comparator invoked per element.
7833       * @returns {Array} Returns `array`.
7834       * @example
7835       *
7836       * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
7837       *
7838       * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
7839       * console.log(array);
7840       * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
7841       */
7842      function pullAllWith(array, values, comparator) {
7843        return (array && array.length && values && values.length)
7844          ? basePullAll(array, values, undefined, comparator)
7845          : array;
7846      }
7847  
7848      /**
7849       * Removes elements from `array` corresponding to `indexes` and returns an
7850       * array of removed elements.
7851       *
7852       * **Note:** Unlike `_.at`, this method mutates `array`.
7853       *
7854       * @static
7855       * @memberOf _
7856       * @since 3.0.0
7857       * @category Array
7858       * @param {Array} array The array to modify.
7859       * @param {...(number|number[])} [indexes] The indexes of elements to remove.
7860       * @returns {Array} Returns the new array of removed elements.
7861       * @example
7862       *
7863       * var array = ['a', 'b', 'c', 'd'];
7864       * var pulled = _.pullAt(array, [1, 3]);
7865       *
7866       * console.log(array);
7867       * // => ['a', 'c']
7868       *
7869       * console.log(pulled);
7870       * // => ['b', 'd']
7871       */
7872      var pullAt = flatRest(function(array, indexes) {
7873        var length = array == null ? 0 : array.length,
7874            result = baseAt(array, indexes);
7875  
7876        basePullAt(array, arrayMap(indexes, function(index) {
7877          return isIndex(index, length) ? +index : index;
7878        }).sort(compareAscending));
7879  
7880        return result;
7881      });
7882  
7883      /**
7884       * Removes all elements from `array` that `predicate` returns truthy for
7885       * and returns an array of the removed elements. The predicate is invoked
7886       * with three arguments: (value, index, array).
7887       *
7888       * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
7889       * to pull elements from an array by value.
7890       *
7891       * @static
7892       * @memberOf _
7893       * @since 2.0.0
7894       * @category Array
7895       * @param {Array} array The array to modify.
7896       * @param {Function} [predicate=_.identity] The function invoked per iteration.
7897       * @returns {Array} Returns the new array of removed elements.
7898       * @example
7899       *
7900       * var array = [1, 2, 3, 4];
7901       * var evens = _.remove(array, function(n) {
7902       *   return n % 2 == 0;
7903       * });
7904       *
7905       * console.log(array);
7906       * // => [1, 3]
7907       *
7908       * console.log(evens);
7909       * // => [2, 4]
7910       */
7911      function remove(array, predicate) {
7912        var result = [];
7913        if (!(array && array.length)) {
7914          return result;
7915        }
7916        var index = -1,
7917            indexes = [],
7918            length = array.length;
7919  
7920        predicate = getIteratee(predicate, 3);
7921        while (++index < length) {
7922          var value = array[index];
7923          if (predicate(value, index, array)) {
7924            result.push(value);
7925            indexes.push(index);
7926          }
7927        }
7928        basePullAt(array, indexes);
7929        return result;
7930      }
7931  
7932      /**
7933       * Reverses `array` so that the first element becomes the last, the second
7934       * element becomes the second to last, and so on.
7935       *
7936       * **Note:** This method mutates `array` and is based on
7937       * [`Array#reverse`](https://mdn.io/Array/reverse).
7938       *
7939       * @static
7940       * @memberOf _
7941       * @since 4.0.0
7942       * @category Array
7943       * @param {Array} array The array to modify.
7944       * @returns {Array} Returns `array`.
7945       * @example
7946       *
7947       * var array = [1, 2, 3];
7948       *
7949       * _.reverse(array);
7950       * // => [3, 2, 1]
7951       *
7952       * console.log(array);
7953       * // => [3, 2, 1]
7954       */
7955      function reverse(array) {
7956        return array == null ? array : nativeReverse.call(array);
7957      }
7958  
7959      /**
7960       * Creates a slice of `array` from `start` up to, but not including, `end`.
7961       *
7962       * **Note:** This method is used instead of
7963       * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
7964       * returned.
7965       *
7966       * @static
7967       * @memberOf _
7968       * @since 3.0.0
7969       * @category Array
7970       * @param {Array} array The array to slice.
7971       * @param {number} [start=0] The start position.
7972       * @param {number} [end=array.length] The end position.
7973       * @returns {Array} Returns the slice of `array`.
7974       */
7975      function slice(array, start, end) {
7976        var length = array == null ? 0 : array.length;
7977        if (!length) {
7978          return [];
7979        }
7980        if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
7981          start = 0;
7982          end = length;
7983        }
7984        else {
7985          start = start == null ? 0 : toInteger(start);
7986          end = end === undefined ? length : toInteger(end);
7987        }
7988        return baseSlice(array, start, end);
7989      }
7990  
7991      /**
7992       * Uses a binary search to determine the lowest index at which `value`
7993       * should be inserted into `array` in order to maintain its sort order.
7994       *
7995       * @static
7996       * @memberOf _
7997       * @since 0.1.0
7998       * @category Array
7999       * @param {Array} array The sorted array to inspect.
8000       * @param {*} value The value to evaluate.
8001       * @returns {number} Returns the index at which `value` should be inserted
8002       *  into `array`.
8003       * @example
8004       *
8005       * _.sortedIndex([30, 50], 40);
8006       * // => 1
8007       */
8008      function sortedIndex(array, value) {
8009        return baseSortedIndex(array, value);
8010      }
8011  
8012      /**
8013       * This method is like `_.sortedIndex` except that it accepts `iteratee`
8014       * which is invoked for `value` and each element of `array` to compute their
8015       * sort ranking. The iteratee is invoked with one argument: (value).
8016       *
8017       * @static
8018       * @memberOf _
8019       * @since 4.0.0
8020       * @category Array
8021       * @param {Array} array The sorted array to inspect.
8022       * @param {*} value The value to evaluate.
8023       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8024       * @returns {number} Returns the index at which `value` should be inserted
8025       *  into `array`.
8026       * @example
8027       *
8028       * var objects = [{ 'x': 4 }, { 'x': 5 }];
8029       *
8030       * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8031       * // => 0
8032       *
8033       * // The `_.property` iteratee shorthand.
8034       * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
8035       * // => 0
8036       */
8037      function sortedIndexBy(array, value, iteratee) {
8038        return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
8039      }
8040  
8041      /**
8042       * This method is like `_.indexOf` except that it performs a binary
8043       * search on a sorted `array`.
8044       *
8045       * @static
8046       * @memberOf _
8047       * @since 4.0.0
8048       * @category Array
8049       * @param {Array} array The array to inspect.
8050       * @param {*} value The value to search for.
8051       * @returns {number} Returns the index of the matched value, else `-1`.
8052       * @example
8053       *
8054       * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
8055       * // => 1
8056       */
8057      function sortedIndexOf(array, value) {
8058        var length = array == null ? 0 : array.length;
8059        if (length) {
8060          var index = baseSortedIndex(array, value);
8061          if (index < length && eq(array[index], value)) {
8062            return index;
8063          }
8064        }
8065        return -1;
8066      }
8067  
8068      /**
8069       * This method is like `_.sortedIndex` except that it returns the highest
8070       * index at which `value` should be inserted into `array` in order to
8071       * maintain its sort order.
8072       *
8073       * @static
8074       * @memberOf _
8075       * @since 3.0.0
8076       * @category Array
8077       * @param {Array} array The sorted array to inspect.
8078       * @param {*} value The value to evaluate.
8079       * @returns {number} Returns the index at which `value` should be inserted
8080       *  into `array`.
8081       * @example
8082       *
8083       * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
8084       * // => 4
8085       */
8086      function sortedLastIndex(array, value) {
8087        return baseSortedIndex(array, value, true);
8088      }
8089  
8090      /**
8091       * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
8092       * which is invoked for `value` and each element of `array` to compute their
8093       * sort ranking. The iteratee is invoked with one argument: (value).
8094       *
8095       * @static
8096       * @memberOf _
8097       * @since 4.0.0
8098       * @category Array
8099       * @param {Array} array The sorted array to inspect.
8100       * @param {*} value The value to evaluate.
8101       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8102       * @returns {number} Returns the index at which `value` should be inserted
8103       *  into `array`.
8104       * @example
8105       *
8106       * var objects = [{ 'x': 4 }, { 'x': 5 }];
8107       *
8108       * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8109       * // => 1
8110       *
8111       * // The `_.property` iteratee shorthand.
8112       * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
8113       * // => 1
8114       */
8115      function sortedLastIndexBy(array, value, iteratee) {
8116        return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
8117      }
8118  
8119      /**
8120       * This method is like `_.lastIndexOf` except that it performs a binary
8121       * search on a sorted `array`.
8122       *
8123       * @static
8124       * @memberOf _
8125       * @since 4.0.0
8126       * @category Array
8127       * @param {Array} array The array to inspect.
8128       * @param {*} value The value to search for.
8129       * @returns {number} Returns the index of the matched value, else `-1`.
8130       * @example
8131       *
8132       * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
8133       * // => 3
8134       */
8135      function sortedLastIndexOf(array, value) {
8136        var length = array == null ? 0 : array.length;
8137        if (length) {
8138          var index = baseSortedIndex(array, value, true) - 1;
8139          if (eq(array[index], value)) {
8140            return index;
8141          }
8142        }
8143        return -1;
8144      }
8145  
8146      /**
8147       * This method is like `_.uniq` except that it's designed and optimized
8148       * for sorted arrays.
8149       *
8150       * @static
8151       * @memberOf _
8152       * @since 4.0.0
8153       * @category Array
8154       * @param {Array} array The array to inspect.
8155       * @returns {Array} Returns the new duplicate free array.
8156       * @example
8157       *
8158       * _.sortedUniq([1, 1, 2]);
8159       * // => [1, 2]
8160       */
8161      function sortedUniq(array) {
8162        return (array && array.length)
8163          ? baseSortedUniq(array)
8164          : [];
8165      }
8166  
8167      /**
8168       * This method is like `_.uniqBy` except that it's designed and optimized
8169       * for sorted arrays.
8170       *
8171       * @static
8172       * @memberOf _
8173       * @since 4.0.0
8174       * @category Array
8175       * @param {Array} array The array to inspect.
8176       * @param {Function} [iteratee] The iteratee invoked per element.
8177       * @returns {Array} Returns the new duplicate free array.
8178       * @example
8179       *
8180       * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
8181       * // => [1.1, 2.3]
8182       */
8183      function sortedUniqBy(array, iteratee) {
8184        return (array && array.length)
8185          ? baseSortedUniq(array, getIteratee(iteratee, 2))
8186          : [];
8187      }
8188  
8189      /**
8190       * Gets all but the first element of `array`.
8191       *
8192       * @static
8193       * @memberOf _
8194       * @since 4.0.0
8195       * @category Array
8196       * @param {Array} array The array to query.
8197       * @returns {Array} Returns the slice of `array`.
8198       * @example
8199       *
8200       * _.tail([1, 2, 3]);
8201       * // => [2, 3]
8202       */
8203      function tail(array) {
8204        var length = array == null ? 0 : array.length;
8205        return length ? baseSlice(array, 1, length) : [];
8206      }
8207  
8208      /**
8209       * Creates a slice of `array` with `n` elements taken from the beginning.
8210       *
8211       * @static
8212       * @memberOf _
8213       * @since 0.1.0
8214       * @category Array
8215       * @param {Array} array The array to query.
8216       * @param {number} [n=1] The number of elements to take.
8217       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8218       * @returns {Array} Returns the slice of `array`.
8219       * @example
8220       *
8221       * _.take([1, 2, 3]);
8222       * // => [1]
8223       *
8224       * _.take([1, 2, 3], 2);
8225       * // => [1, 2]
8226       *
8227       * _.take([1, 2, 3], 5);
8228       * // => [1, 2, 3]
8229       *
8230       * _.take([1, 2, 3], 0);
8231       * // => []
8232       */
8233      function take(array, n, guard) {
8234        if (!(array && array.length)) {
8235          return [];
8236        }
8237        n = (guard || n === undefined) ? 1 : toInteger(n);
8238        return baseSlice(array, 0, n < 0 ? 0 : n);
8239      }
8240  
8241      /**
8242       * Creates a slice of `array` with `n` elements taken from the end.
8243       *
8244       * @static
8245       * @memberOf _
8246       * @since 3.0.0
8247       * @category Array
8248       * @param {Array} array The array to query.
8249       * @param {number} [n=1] The number of elements to take.
8250       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8251       * @returns {Array} Returns the slice of `array`.
8252       * @example
8253       *
8254       * _.takeRight([1, 2, 3]);
8255       * // => [3]
8256       *
8257       * _.takeRight([1, 2, 3], 2);
8258       * // => [2, 3]
8259       *
8260       * _.takeRight([1, 2, 3], 5);
8261       * // => [1, 2, 3]
8262       *
8263       * _.takeRight([1, 2, 3], 0);
8264       * // => []
8265       */
8266      function takeRight(array, n, guard) {
8267        var length = array == null ? 0 : array.length;
8268        if (!length) {
8269          return [];
8270        }
8271        n = (guard || n === undefined) ? 1 : toInteger(n);
8272        n = length - n;
8273        return baseSlice(array, n < 0 ? 0 : n, length);
8274      }
8275  
8276      /**
8277       * Creates a slice of `array` with elements taken from the end. Elements are
8278       * taken until `predicate` returns falsey. The predicate is invoked with
8279       * three arguments: (value, index, array).
8280       *
8281       * @static
8282       * @memberOf _
8283       * @since 3.0.0
8284       * @category Array
8285       * @param {Array} array The array to query.
8286       * @param {Function} [predicate=_.identity] The function invoked per iteration.
8287       * @returns {Array} Returns the slice of `array`.
8288       * @example
8289       *
8290       * var users = [
8291       *   { 'user': 'barney',  'active': true },
8292       *   { 'user': 'fred',    'active': false },
8293       *   { 'user': 'pebbles', 'active': false }
8294       * ];
8295       *
8296       * _.takeRightWhile(users, function(o) { return !o.active; });
8297       * // => objects for ['fred', 'pebbles']
8298       *
8299       * // The `_.matches` iteratee shorthand.
8300       * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
8301       * // => objects for ['pebbles']
8302       *
8303       * // The `_.matchesProperty` iteratee shorthand.
8304       * _.takeRightWhile(users, ['active', false]);
8305       * // => objects for ['fred', 'pebbles']
8306       *
8307       * // The `_.property` iteratee shorthand.
8308       * _.takeRightWhile(users, 'active');
8309       * // => []
8310       */
8311      function takeRightWhile(array, predicate) {
8312        return (array && array.length)
8313          ? baseWhile(array, getIteratee(predicate, 3), false, true)
8314          : [];
8315      }
8316  
8317      /**
8318       * Creates a slice of `array` with elements taken from the beginning. Elements
8319       * are taken until `predicate` returns falsey. The predicate is invoked with
8320       * three arguments: (value, index, array).
8321       *
8322       * @static
8323       * @memberOf _
8324       * @since 3.0.0
8325       * @category Array
8326       * @param {Array} array The array to query.
8327       * @param {Function} [predicate=_.identity] The function invoked per iteration.
8328       * @returns {Array} Returns the slice of `array`.
8329       * @example
8330       *
8331       * var users = [
8332       *   { 'user': 'barney',  'active': false },
8333       *   { 'user': 'fred',    'active': false },
8334       *   { 'user': 'pebbles', 'active': true }
8335       * ];
8336       *
8337       * _.takeWhile(users, function(o) { return !o.active; });
8338       * // => objects for ['barney', 'fred']
8339       *
8340       * // The `_.matches` iteratee shorthand.
8341       * _.takeWhile(users, { 'user': 'barney', 'active': false });
8342       * // => objects for ['barney']
8343       *
8344       * // The `_.matchesProperty` iteratee shorthand.
8345       * _.takeWhile(users, ['active', false]);
8346       * // => objects for ['barney', 'fred']
8347       *
8348       * // The `_.property` iteratee shorthand.
8349       * _.takeWhile(users, 'active');
8350       * // => []
8351       */
8352      function takeWhile(array, predicate) {
8353        return (array && array.length)
8354          ? baseWhile(array, getIteratee(predicate, 3))
8355          : [];
8356      }
8357  
8358      /**
8359       * Creates an array of unique values, in order, from all given arrays using
8360       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8361       * for equality comparisons.
8362       *
8363       * @static
8364       * @memberOf _
8365       * @since 0.1.0
8366       * @category Array
8367       * @param {...Array} [arrays] The arrays to inspect.
8368       * @returns {Array} Returns the new array of combined values.
8369       * @example
8370       *
8371       * _.union([2], [1, 2]);
8372       * // => [2, 1]
8373       */
8374      var union = baseRest(function(arrays) {
8375        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
8376      });
8377  
8378      /**
8379       * This method is like `_.union` except that it accepts `iteratee` which is
8380       * invoked for each element of each `arrays` to generate the criterion by
8381       * which uniqueness is computed. Result values are chosen from the first
8382       * array in which the value occurs. The iteratee is invoked with one argument:
8383       * (value).
8384       *
8385       * @static
8386       * @memberOf _
8387       * @since 4.0.0
8388       * @category Array
8389       * @param {...Array} [arrays] The arrays to inspect.
8390       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8391       * @returns {Array} Returns the new array of combined values.
8392       * @example
8393       *
8394       * _.unionBy([2.1], [1.2, 2.3], Math.floor);
8395       * // => [2.1, 1.2]
8396       *
8397       * // The `_.property` iteratee shorthand.
8398       * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8399       * // => [{ 'x': 1 }, { 'x': 2 }]
8400       */
8401      var unionBy = baseRest(function(arrays) {
8402        var iteratee = last(arrays);
8403        if (isArrayLikeObject(iteratee)) {
8404          iteratee = undefined;
8405        }
8406        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
8407      });
8408  
8409      /**
8410       * This method is like `_.union` except that it accepts `comparator` which
8411       * is invoked to compare elements of `arrays`. Result values are chosen from
8412       * the first array in which the value occurs. The comparator is invoked
8413       * with two arguments: (arrVal, othVal).
8414       *
8415       * @static
8416       * @memberOf _
8417       * @since 4.0.0
8418       * @category Array
8419       * @param {...Array} [arrays] The arrays to inspect.
8420       * @param {Function} [comparator] The comparator invoked per element.
8421       * @returns {Array} Returns the new array of combined values.
8422       * @example
8423       *
8424       * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8425       * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8426       *
8427       * _.unionWith(objects, others, _.isEqual);
8428       * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8429       */
8430      var unionWith = baseRest(function(arrays) {
8431        var comparator = last(arrays);
8432        comparator = typeof comparator == 'function' ? comparator : undefined;
8433        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
8434      });
8435  
8436      /**
8437       * Creates a duplicate-free version of an array, using
8438       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8439       * for equality comparisons, in which only the first occurrence of each element
8440       * is kept. The order of result values is determined by the order they occur
8441       * in the array.
8442       *
8443       * @static
8444       * @memberOf _
8445       * @since 0.1.0
8446       * @category Array
8447       * @param {Array} array The array to inspect.
8448       * @returns {Array} Returns the new duplicate free array.
8449       * @example
8450       *
8451       * _.uniq([2, 1, 2]);
8452       * // => [2, 1]
8453       */
8454      function uniq(array) {
8455        return (array && array.length) ? baseUniq(array) : [];
8456      }
8457  
8458      /**
8459       * This method is like `_.uniq` except that it accepts `iteratee` which is
8460       * invoked for each element in `array` to generate the criterion by which
8461       * uniqueness is computed. The order of result values is determined by the
8462       * order they occur in the array. The iteratee is invoked with one argument:
8463       * (value).
8464       *
8465       * @static
8466       * @memberOf _
8467       * @since 4.0.0
8468       * @category Array
8469       * @param {Array} array The array to inspect.
8470       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8471       * @returns {Array} Returns the new duplicate free array.
8472       * @example
8473       *
8474       * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
8475       * // => [2.1, 1.2]
8476       *
8477       * // The `_.property` iteratee shorthand.
8478       * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
8479       * // => [{ 'x': 1 }, { 'x': 2 }]
8480       */
8481      function uniqBy(array, iteratee) {
8482        return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
8483      }
8484  
8485      /**
8486       * This method is like `_.uniq` except that it accepts `comparator` which
8487       * is invoked to compare elements of `array`. The order of result values is
8488       * determined by the order they occur in the array.The comparator is invoked
8489       * with two arguments: (arrVal, othVal).
8490       *
8491       * @static
8492       * @memberOf _
8493       * @since 4.0.0
8494       * @category Array
8495       * @param {Array} array The array to inspect.
8496       * @param {Function} [comparator] The comparator invoked per element.
8497       * @returns {Array} Returns the new duplicate free array.
8498       * @example
8499       *
8500       * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
8501       *
8502       * _.uniqWith(objects, _.isEqual);
8503       * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
8504       */
8505      function uniqWith(array, comparator) {
8506        comparator = typeof comparator == 'function' ? comparator : undefined;
8507        return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
8508      }
8509  
8510      /**
8511       * This method is like `_.zip` except that it accepts an array of grouped
8512       * elements and creates an array regrouping the elements to their pre-zip
8513       * configuration.
8514       *
8515       * @static
8516       * @memberOf _
8517       * @since 1.2.0
8518       * @category Array
8519       * @param {Array} array The array of grouped elements to process.
8520       * @returns {Array} Returns the new array of regrouped elements.
8521       * @example
8522       *
8523       * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
8524       * // => [['a', 1, true], ['b', 2, false]]
8525       *
8526       * _.unzip(zipped);
8527       * // => [['a', 'b'], [1, 2], [true, false]]
8528       */
8529      function unzip(array) {
8530        if (!(array && array.length)) {
8531          return [];
8532        }
8533        var length = 0;
8534        array = arrayFilter(array, function(group) {
8535          if (isArrayLikeObject(group)) {
8536            length = nativeMax(group.length, length);
8537            return true;
8538          }
8539        });
8540        return baseTimes(length, function(index) {
8541          return arrayMap(array, baseProperty(index));
8542        });
8543      }
8544  
8545      /**
8546       * This method is like `_.unzip` except that it accepts `iteratee` to specify
8547       * how regrouped values should be combined. The iteratee is invoked with the
8548       * elements of each group: (...group).
8549       *
8550       * @static
8551       * @memberOf _
8552       * @since 3.8.0
8553       * @category Array
8554       * @param {Array} array The array of grouped elements to process.
8555       * @param {Function} [iteratee=_.identity] The function to combine
8556       *  regrouped values.
8557       * @returns {Array} Returns the new array of regrouped elements.
8558       * @example
8559       *
8560       * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
8561       * // => [[1, 10, 100], [2, 20, 200]]
8562       *
8563       * _.unzipWith(zipped, _.add);
8564       * // => [3, 30, 300]
8565       */
8566      function unzipWith(array, iteratee) {
8567        if (!(array && array.length)) {
8568          return [];
8569        }
8570        var result = unzip(array);
8571        if (iteratee == null) {
8572          return result;
8573        }
8574        return arrayMap(result, function(group) {
8575          return apply(iteratee, undefined, group);
8576        });
8577      }
8578  
8579      /**
8580       * Creates an array excluding all given values using
8581       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8582       * for equality comparisons.
8583       *
8584       * **Note:** Unlike `_.pull`, this method returns a new array.
8585       *
8586       * @static
8587       * @memberOf _
8588       * @since 0.1.0
8589       * @category Array
8590       * @param {Array} array The array to inspect.
8591       * @param {...*} [values] The values to exclude.
8592       * @returns {Array} Returns the new array of filtered values.
8593       * @see _.difference, _.xor
8594       * @example
8595       *
8596       * _.without([2, 1, 2, 3], 1, 2);
8597       * // => [3]
8598       */
8599      var without = baseRest(function(array, values) {
8600        return isArrayLikeObject(array)
8601          ? baseDifference(array, values)
8602          : [];
8603      });
8604  
8605      /**
8606       * Creates an array of unique values that is the
8607       * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
8608       * of the given arrays. The order of result values is determined by the order
8609       * they occur in the arrays.
8610       *
8611       * @static
8612       * @memberOf _
8613       * @since 2.4.0
8614       * @category Array
8615       * @param {...Array} [arrays] The arrays to inspect.
8616       * @returns {Array} Returns the new array of filtered values.
8617       * @see _.difference, _.without
8618       * @example
8619       *
8620       * _.xor([2, 1], [2, 3]);
8621       * // => [1, 3]
8622       */
8623      var xor = baseRest(function(arrays) {
8624        return baseXor(arrayFilter(arrays, isArrayLikeObject));
8625      });
8626  
8627      /**
8628       * This method is like `_.xor` except that it accepts `iteratee` which is
8629       * invoked for each element of each `arrays` to generate the criterion by
8630       * which by which they're compared. The order of result values is determined
8631       * by the order they occur in the arrays. The iteratee is invoked with one
8632       * argument: (value).
8633       *
8634       * @static
8635       * @memberOf _
8636       * @since 4.0.0
8637       * @category Array
8638       * @param {...Array} [arrays] The arrays to inspect.
8639       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8640       * @returns {Array} Returns the new array of filtered values.
8641       * @example
8642       *
8643       * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8644       * // => [1.2, 3.4]
8645       *
8646       * // The `_.property` iteratee shorthand.
8647       * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8648       * // => [{ 'x': 2 }]
8649       */
8650      var xorBy = baseRest(function(arrays) {
8651        var iteratee = last(arrays);
8652        if (isArrayLikeObject(iteratee)) {
8653          iteratee = undefined;
8654        }
8655        return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
8656      });
8657  
8658      /**
8659       * This method is like `_.xor` except that it accepts `comparator` which is
8660       * invoked to compare elements of `arrays`. The order of result values is
8661       * determined by the order they occur in the arrays. The comparator is invoked
8662       * with two arguments: (arrVal, othVal).
8663       *
8664       * @static
8665       * @memberOf _
8666       * @since 4.0.0
8667       * @category Array
8668       * @param {...Array} [arrays] The arrays to inspect.
8669       * @param {Function} [comparator] The comparator invoked per element.
8670       * @returns {Array} Returns the new array of filtered values.
8671       * @example
8672       *
8673       * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8674       * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8675       *
8676       * _.xorWith(objects, others, _.isEqual);
8677       * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8678       */
8679      var xorWith = baseRest(function(arrays) {
8680        var comparator = last(arrays);
8681        comparator = typeof comparator == 'function' ? comparator : undefined;
8682        return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
8683      });
8684  
8685      /**
8686       * Creates an array of grouped elements, the first of which contains the
8687       * first elements of the given arrays, the second of which contains the
8688       * second elements of the given arrays, and so on.
8689       *
8690       * @static
8691       * @memberOf _
8692       * @since 0.1.0
8693       * @category Array
8694       * @param {...Array} [arrays] The arrays to process.
8695       * @returns {Array} Returns the new array of grouped elements.
8696       * @example
8697       *
8698       * _.zip(['a', 'b'], [1, 2], [true, false]);
8699       * // => [['a', 1, true], ['b', 2, false]]
8700       */
8701      var zip = baseRest(unzip);
8702  
8703      /**
8704       * This method is like `_.fromPairs` except that it accepts two arrays,
8705       * one of property identifiers and one of corresponding values.
8706       *
8707       * @static
8708       * @memberOf _
8709       * @since 0.4.0
8710       * @category Array
8711       * @param {Array} [props=[]] The property identifiers.
8712       * @param {Array} [values=[]] The property values.
8713       * @returns {Object} Returns the new object.
8714       * @example
8715       *
8716       * _.zipObject(['a', 'b'], [1, 2]);
8717       * // => { 'a': 1, 'b': 2 }
8718       */
8719      function zipObject(props, values) {
8720        return baseZipObject(props || [], values || [], assignValue);
8721      }
8722  
8723      /**
8724       * This method is like `_.zipObject` except that it supports property paths.
8725       *
8726       * @static
8727       * @memberOf _
8728       * @since 4.1.0
8729       * @category Array
8730       * @param {Array} [props=[]] The property identifiers.
8731       * @param {Array} [values=[]] The property values.
8732       * @returns {Object} Returns the new object.
8733       * @example
8734       *
8735       * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
8736       * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
8737       */
8738      function zipObjectDeep(props, values) {
8739        return baseZipObject(props || [], values || [], baseSet);
8740      }
8741  
8742      /**
8743       * This method is like `_.zip` except that it accepts `iteratee` to specify
8744       * how grouped values should be combined. The iteratee is invoked with the
8745       * elements of each group: (...group).
8746       *
8747       * @static
8748       * @memberOf _
8749       * @since 3.8.0
8750       * @category Array
8751       * @param {...Array} [arrays] The arrays to process.
8752       * @param {Function} [iteratee=_.identity] The function to combine
8753       *  grouped values.
8754       * @returns {Array} Returns the new array of grouped elements.
8755       * @example
8756       *
8757       * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
8758       *   return a + b + c;
8759       * });
8760       * // => [111, 222]
8761       */
8762      var zipWith = baseRest(function(arrays) {
8763        var length = arrays.length,
8764            iteratee = length > 1 ? arrays[length - 1] : undefined;
8765  
8766        iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
8767        return unzipWith(arrays, iteratee);
8768      });
8769  
8770      /*------------------------------------------------------------------------*/
8771  
8772      /**
8773       * Creates a `lodash` wrapper instance that wraps `value` with explicit method
8774       * chain sequences enabled. The result of such sequences must be unwrapped
8775       * with `_#value`.
8776       *
8777       * @static
8778       * @memberOf _
8779       * @since 1.3.0
8780       * @category Seq
8781       * @param {*} value The value to wrap.
8782       * @returns {Object} Returns the new `lodash` wrapper instance.
8783       * @example
8784       *
8785       * var users = [
8786       *   { 'user': 'barney',  'age': 36 },
8787       *   { 'user': 'fred',    'age': 40 },
8788       *   { 'user': 'pebbles', 'age': 1 }
8789       * ];
8790       *
8791       * var youngest = _
8792       *   .chain(users)
8793       *   .sortBy('age')
8794       *   .map(function(o) {
8795       *     return o.user + ' is ' + o.age;
8796       *   })
8797       *   .head()
8798       *   .value();
8799       * // => 'pebbles is 1'
8800       */
8801      function chain(value) {
8802        var result = lodash(value);
8803        result.__chain__ = true;
8804        return result;
8805      }
8806  
8807      /**
8808       * This method invokes `interceptor` and returns `value`. The interceptor
8809       * is invoked with one argument; (value). The purpose of this method is to
8810       * "tap into" a method chain sequence in order to modify intermediate results.
8811       *
8812       * @static
8813       * @memberOf _
8814       * @since 0.1.0
8815       * @category Seq
8816       * @param {*} value The value to provide to `interceptor`.
8817       * @param {Function} interceptor The function to invoke.
8818       * @returns {*} Returns `value`.
8819       * @example
8820       *
8821       * _([1, 2, 3])
8822       *  .tap(function(array) {
8823       *    // Mutate input array.
8824       *    array.pop();
8825       *  })
8826       *  .reverse()
8827       *  .value();
8828       * // => [2, 1]
8829       */
8830      function tap(value, interceptor) {
8831        interceptor(value);
8832        return value;
8833      }
8834  
8835      /**
8836       * This method is like `_.tap` except that it returns the result of `interceptor`.
8837       * The purpose of this method is to "pass thru" values replacing intermediate
8838       * results in a method chain sequence.
8839       *
8840       * @static
8841       * @memberOf _
8842       * @since 3.0.0
8843       * @category Seq
8844       * @param {*} value The value to provide to `interceptor`.
8845       * @param {Function} interceptor The function to invoke.
8846       * @returns {*} Returns the result of `interceptor`.
8847       * @example
8848       *
8849       * _('  abc  ')
8850       *  .chain()
8851       *  .trim()
8852       *  .thru(function(value) {
8853       *    return [value];
8854       *  })
8855       *  .value();
8856       * // => ['abc']
8857       */
8858      function thru(value, interceptor) {
8859        return interceptor(value);
8860      }
8861  
8862      /**
8863       * This method is the wrapper version of `_.at`.
8864       *
8865       * @name at
8866       * @memberOf _
8867       * @since 1.0.0
8868       * @category Seq
8869       * @param {...(string|string[])} [paths] The property paths to pick.
8870       * @returns {Object} Returns the new `lodash` wrapper instance.
8871       * @example
8872       *
8873       * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
8874       *
8875       * _(object).at(['a[0].b.c', 'a[1]']).value();
8876       * // => [3, 4]
8877       */
8878      var wrapperAt = flatRest(function(paths) {
8879        var length = paths.length,
8880            start = length ? paths[0] : 0,
8881            value = this.__wrapped__,
8882            interceptor = function(object) { return baseAt(object, paths); };
8883  
8884        if (length > 1 || this.__actions__.length ||
8885            !(value instanceof LazyWrapper) || !isIndex(start)) {
8886          return this.thru(interceptor);
8887        }
8888        value = value.slice(start, +start + (length ? 1 : 0));
8889        value.__actions__.push({
8890          'func': thru,
8891          'args': [interceptor],
8892          'thisArg': undefined
8893        });
8894        return new LodashWrapper(value, this.__chain__).thru(function(array) {
8895          if (length && !array.length) {
8896            array.push(undefined);
8897          }
8898          return array;
8899        });
8900      });
8901  
8902      /**
8903       * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
8904       *
8905       * @name chain
8906       * @memberOf _
8907       * @since 0.1.0
8908       * @category Seq
8909       * @returns {Object} Returns the new `lodash` wrapper instance.
8910       * @example
8911       *
8912       * var users = [
8913       *   { 'user': 'barney', 'age': 36 },
8914       *   { 'user': 'fred',   'age': 40 }
8915       * ];
8916       *
8917       * // A sequence without explicit chaining.
8918       * _(users).head();
8919       * // => { 'user': 'barney', 'age': 36 }
8920       *
8921       * // A sequence with explicit chaining.
8922       * _(users)
8923       *   .chain()
8924       *   .head()
8925       *   .pick('user')
8926       *   .value();
8927       * // => { 'user': 'barney' }
8928       */
8929      function wrapperChain() {
8930        return chain(this);
8931      }
8932  
8933      /**
8934       * Executes the chain sequence and returns the wrapped result.
8935       *
8936       * @name commit
8937       * @memberOf _
8938       * @since 3.2.0
8939       * @category Seq
8940       * @returns {Object} Returns the new `lodash` wrapper instance.
8941       * @example
8942       *
8943       * var array = [1, 2];
8944       * var wrapped = _(array).push(3);
8945       *
8946       * console.log(array);
8947       * // => [1, 2]
8948       *
8949       * wrapped = wrapped.commit();
8950       * console.log(array);
8951       * // => [1, 2, 3]
8952       *
8953       * wrapped.last();
8954       * // => 3
8955       *
8956       * console.log(array);
8957       * // => [1, 2, 3]
8958       */
8959      function wrapperCommit() {
8960        return new LodashWrapper(this.value(), this.__chain__);
8961      }
8962  
8963      /**
8964       * Gets the next value on a wrapped object following the
8965       * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
8966       *
8967       * @name next
8968       * @memberOf _
8969       * @since 4.0.0
8970       * @category Seq
8971       * @returns {Object} Returns the next iterator value.
8972       * @example
8973       *
8974       * var wrapped = _([1, 2]);
8975       *
8976       * wrapped.next();
8977       * // => { 'done': false, 'value': 1 }
8978       *
8979       * wrapped.next();
8980       * // => { 'done': false, 'value': 2 }
8981       *
8982       * wrapped.next();
8983       * // => { 'done': true, 'value': undefined }
8984       */
8985      function wrapperNext() {
8986        if (this.__values__ === undefined) {
8987          this.__values__ = toArray(this.value());
8988        }
8989        var done = this.__index__ >= this.__values__.length,
8990            value = done ? undefined : this.__values__[this.__index__++];
8991  
8992        return { 'done': done, 'value': value };
8993      }
8994  
8995      /**
8996       * Enables the wrapper to be iterable.
8997       *
8998       * @name Symbol.iterator
8999       * @memberOf _
9000       * @since 4.0.0
9001       * @category Seq
9002       * @returns {Object} Returns the wrapper object.
9003       * @example
9004       *
9005       * var wrapped = _([1, 2]);
9006       *
9007       * wrapped[Symbol.iterator]() === wrapped;
9008       * // => true
9009       *
9010       * Array.from(wrapped);
9011       * // => [1, 2]
9012       */
9013      function wrapperToIterator() {
9014        return this;
9015      }
9016  
9017      /**
9018       * Creates a clone of the chain sequence planting `value` as the wrapped value.
9019       *
9020       * @name plant
9021       * @memberOf _
9022       * @since 3.2.0
9023       * @category Seq
9024       * @param {*} value The value to plant.
9025       * @returns {Object} Returns the new `lodash` wrapper instance.
9026       * @example
9027       *
9028       * function square(n) {
9029       *   return n * n;
9030       * }
9031       *
9032       * var wrapped = _([1, 2]).map(square);
9033       * var other = wrapped.plant([3, 4]);
9034       *
9035       * other.value();
9036       * // => [9, 16]
9037       *
9038       * wrapped.value();
9039       * // => [1, 4]
9040       */
9041      function wrapperPlant(value) {
9042        var result,
9043            parent = this;
9044  
9045        while (parent instanceof baseLodash) {
9046          var clone = wrapperClone(parent);
9047          clone.__index__ = 0;
9048          clone.__values__ = undefined;
9049          if (result) {
9050            previous.__wrapped__ = clone;
9051          } else {
9052            result = clone;
9053          }
9054          var previous = clone;
9055          parent = parent.__wrapped__;
9056        }
9057        previous.__wrapped__ = value;
9058        return result;
9059      }
9060  
9061      /**
9062       * This method is the wrapper version of `_.reverse`.
9063       *
9064       * **Note:** This method mutates the wrapped array.
9065       *
9066       * @name reverse
9067       * @memberOf _
9068       * @since 0.1.0
9069       * @category Seq
9070       * @returns {Object} Returns the new `lodash` wrapper instance.
9071       * @example
9072       *
9073       * var array = [1, 2, 3];
9074       *
9075       * _(array).reverse().value()
9076       * // => [3, 2, 1]
9077       *
9078       * console.log(array);
9079       * // => [3, 2, 1]
9080       */
9081      function wrapperReverse() {
9082        var value = this.__wrapped__;
9083        if (value instanceof LazyWrapper) {
9084          var wrapped = value;
9085          if (this.__actions__.length) {
9086            wrapped = new LazyWrapper(this);
9087          }
9088          wrapped = wrapped.reverse();
9089          wrapped.__actions__.push({
9090            'func': thru,
9091            'args': [reverse],
9092            'thisArg': undefined
9093          });
9094          return new LodashWrapper(wrapped, this.__chain__);
9095        }
9096        return this.thru(reverse);
9097      }
9098  
9099      /**
9100       * Executes the chain sequence to resolve the unwrapped value.
9101       *
9102       * @name value
9103       * @memberOf _
9104       * @since 0.1.0
9105       * @alias toJSON, valueOf
9106       * @category Seq
9107       * @returns {*} Returns the resolved unwrapped value.
9108       * @example
9109       *
9110       * _([1, 2, 3]).value();
9111       * // => [1, 2, 3]
9112       */
9113      function wrapperValue() {
9114        return baseWrapperValue(this.__wrapped__, this.__actions__);
9115      }
9116  
9117      /*------------------------------------------------------------------------*/
9118  
9119      /**
9120       * Creates an object composed of keys generated from the results of running
9121       * each element of `collection` thru `iteratee`. The corresponding value of
9122       * each key is the number of times the key was returned by `iteratee`. The
9123       * iteratee is invoked with one argument: (value).
9124       *
9125       * @static
9126       * @memberOf _
9127       * @since 0.5.0
9128       * @category Collection
9129       * @param {Array|Object} collection The collection to iterate over.
9130       * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9131       * @returns {Object} Returns the composed aggregate object.
9132       * @example
9133       *
9134       * _.countBy([6.1, 4.2, 6.3], Math.floor);
9135       * // => { '4': 1, '6': 2 }
9136       *
9137       * // The `_.property` iteratee shorthand.
9138       * _.countBy(['one', 'two', 'three'], 'length');
9139       * // => { '3': 2, '5': 1 }
9140       */
9141      var countBy = createAggregator(function(result, value, key) {
9142        if (hasOwnProperty.call(result, key)) {
9143          ++result[key];
9144        } else {
9145          baseAssignValue(result, key, 1);
9146        }
9147      });
9148  
9149      /**
9150       * Checks if `predicate` returns truthy for **all** elements of `collection`.
9151       * Iteration is stopped once `predicate` returns falsey. The predicate is
9152       * invoked with three arguments: (value, index|key, collection).
9153       *
9154       * **Note:** This method returns `true` for
9155       * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
9156       * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
9157       * elements of empty collections.
9158       *
9159       * @static
9160       * @memberOf _
9161       * @since 0.1.0
9162       * @category Collection
9163       * @param {Array|Object} collection The collection to iterate over.
9164       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9165       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9166       * @returns {boolean} Returns `true` if all elements pass the predicate check,
9167       *  else `false`.
9168       * @example
9169       *
9170       * _.every([true, 1, null, 'yes'], Boolean);
9171       * // => false
9172       *
9173       * var users = [
9174       *   { 'user': 'barney', 'age': 36, 'active': false },
9175       *   { 'user': 'fred',   'age': 40, 'active': false }
9176       * ];
9177       *
9178       * // The `_.matches` iteratee shorthand.
9179       * _.every(users, { 'user': 'barney', 'active': false });
9180       * // => false
9181       *
9182       * // The `_.matchesProperty` iteratee shorthand.
9183       * _.every(users, ['active', false]);
9184       * // => true
9185       *
9186       * // The `_.property` iteratee shorthand.
9187       * _.every(users, 'active');
9188       * // => false
9189       */
9190      function every(collection, predicate, guard) {
9191        var func = isArray(collection) ? arrayEvery : baseEvery;
9192        if (guard && isIterateeCall(collection, predicate, guard)) {
9193          predicate = undefined;
9194        }
9195        return func(collection, getIteratee(predicate, 3));
9196      }
9197  
9198      /**
9199       * Iterates over elements of `collection`, returning an array of all elements
9200       * `predicate` returns truthy for. The predicate is invoked with three
9201       * arguments: (value, index|key, collection).
9202       *
9203       * **Note:** Unlike `_.remove`, this method returns a new array.
9204       *
9205       * @static
9206       * @memberOf _
9207       * @since 0.1.0
9208       * @category Collection
9209       * @param {Array|Object} collection The collection to iterate over.
9210       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9211       * @returns {Array} Returns the new filtered array.
9212       * @see _.reject
9213       * @example
9214       *
9215       * var users = [
9216       *   { 'user': 'barney', 'age': 36, 'active': true },
9217       *   { 'user': 'fred',   'age': 40, 'active': false }
9218       * ];
9219       *
9220       * _.filter(users, function(o) { return !o.active; });
9221       * // => objects for ['fred']
9222       *
9223       * // The `_.matches` iteratee shorthand.
9224       * _.filter(users, { 'age': 36, 'active': true });
9225       * // => objects for ['barney']
9226       *
9227       * // The `_.matchesProperty` iteratee shorthand.
9228       * _.filter(users, ['active', false]);
9229       * // => objects for ['fred']
9230       *
9231       * // The `_.property` iteratee shorthand.
9232       * _.filter(users, 'active');
9233       * // => objects for ['barney']
9234       *
9235       * // Combining several predicates using `_.overEvery` or `_.overSome`.
9236       * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
9237       * // => objects for ['fred', 'barney']
9238       */
9239      function filter(collection, predicate) {
9240        var func = isArray(collection) ? arrayFilter : baseFilter;
9241        return func(collection, getIteratee(predicate, 3));
9242      }
9243  
9244      /**
9245       * Iterates over elements of `collection`, returning the first element
9246       * `predicate` returns truthy for. The predicate is invoked with three
9247       * arguments: (value, index|key, collection).
9248       *
9249       * @static
9250       * @memberOf _
9251       * @since 0.1.0
9252       * @category Collection
9253       * @param {Array|Object} collection The collection to inspect.
9254       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9255       * @param {number} [fromIndex=0] The index to search from.
9256       * @returns {*} Returns the matched element, else `undefined`.
9257       * @example
9258       *
9259       * var users = [
9260       *   { 'user': 'barney',  'age': 36, 'active': true },
9261       *   { 'user': 'fred',    'age': 40, 'active': false },
9262       *   { 'user': 'pebbles', 'age': 1,  'active': true }
9263       * ];
9264       *
9265       * _.find(users, function(o) { return o.age < 40; });
9266       * // => object for 'barney'
9267       *
9268       * // The `_.matches` iteratee shorthand.
9269       * _.find(users, { 'age': 1, 'active': true });
9270       * // => object for 'pebbles'
9271       *
9272       * // The `_.matchesProperty` iteratee shorthand.
9273       * _.find(users, ['active', false]);
9274       * // => object for 'fred'
9275       *
9276       * // The `_.property` iteratee shorthand.
9277       * _.find(users, 'active');
9278       * // => object for 'barney'
9279       */
9280      var find = createFind(findIndex);
9281  
9282      /**
9283       * This method is like `_.find` except that it iterates over elements of
9284       * `collection` from right to left.
9285       *
9286       * @static
9287       * @memberOf _
9288       * @since 2.0.0
9289       * @category Collection
9290       * @param {Array|Object} collection The collection to inspect.
9291       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9292       * @param {number} [fromIndex=collection.length-1] The index to search from.
9293       * @returns {*} Returns the matched element, else `undefined`.
9294       * @example
9295       *
9296       * _.findLast([1, 2, 3, 4], function(n) {
9297       *   return n % 2 == 1;
9298       * });
9299       * // => 3
9300       */
9301      var findLast = createFind(findLastIndex);
9302  
9303      /**
9304       * Creates a flattened array of values by running each element in `collection`
9305       * thru `iteratee` and flattening the mapped results. The iteratee is invoked
9306       * with three arguments: (value, index|key, collection).
9307       *
9308       * @static
9309       * @memberOf _
9310       * @since 4.0.0
9311       * @category Collection
9312       * @param {Array|Object} collection The collection to iterate over.
9313       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9314       * @returns {Array} Returns the new flattened array.
9315       * @example
9316       *
9317       * function duplicate(n) {
9318       *   return [n, n];
9319       * }
9320       *
9321       * _.flatMap([1, 2], duplicate);
9322       * // => [1, 1, 2, 2]
9323       */
9324      function flatMap(collection, iteratee) {
9325        return baseFlatten(map(collection, iteratee), 1);
9326      }
9327  
9328      /**
9329       * This method is like `_.flatMap` except that it recursively flattens the
9330       * mapped results.
9331       *
9332       * @static
9333       * @memberOf _
9334       * @since 4.7.0
9335       * @category Collection
9336       * @param {Array|Object} collection The collection to iterate over.
9337       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9338       * @returns {Array} Returns the new flattened array.
9339       * @example
9340       *
9341       * function duplicate(n) {
9342       *   return [[[n, n]]];
9343       * }
9344       *
9345       * _.flatMapDeep([1, 2], duplicate);
9346       * // => [1, 1, 2, 2]
9347       */
9348      function flatMapDeep(collection, iteratee) {
9349        return baseFlatten(map(collection, iteratee), INFINITY);
9350      }
9351  
9352      /**
9353       * This method is like `_.flatMap` except that it recursively flattens the
9354       * mapped results up to `depth` times.
9355       *
9356       * @static
9357       * @memberOf _
9358       * @since 4.7.0
9359       * @category Collection
9360       * @param {Array|Object} collection The collection to iterate over.
9361       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9362       * @param {number} [depth=1] The maximum recursion depth.
9363       * @returns {Array} Returns the new flattened array.
9364       * @example
9365       *
9366       * function duplicate(n) {
9367       *   return [[[n, n]]];
9368       * }
9369       *
9370       * _.flatMapDepth([1, 2], duplicate, 2);
9371       * // => [[1, 1], [2, 2]]
9372       */
9373      function flatMapDepth(collection, iteratee, depth) {
9374        depth = depth === undefined ? 1 : toInteger(depth);
9375        return baseFlatten(map(collection, iteratee), depth);
9376      }
9377  
9378      /**
9379       * Iterates over elements of `collection` and invokes `iteratee` for each element.
9380       * The iteratee is invoked with three arguments: (value, index|key, collection).
9381       * Iteratee functions may exit iteration early by explicitly returning `false`.
9382       *
9383       * **Note:** As with other "Collections" methods, objects with a "length"
9384       * property are iterated like arrays. To avoid this behavior use `_.forIn`
9385       * or `_.forOwn` for object iteration.
9386       *
9387       * @static
9388       * @memberOf _
9389       * @since 0.1.0
9390       * @alias each
9391       * @category Collection
9392       * @param {Array|Object} collection The collection to iterate over.
9393       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9394       * @returns {Array|Object} Returns `collection`.
9395       * @see _.forEachRight
9396       * @example
9397       *
9398       * _.forEach([1, 2], function(value) {
9399       *   console.log(value);
9400       * });
9401       * // => Logs `1` then `2`.
9402       *
9403       * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
9404       *   console.log(key);
9405       * });
9406       * // => Logs 'a' then 'b' (iteration order is not guaranteed).
9407       */
9408      function forEach(collection, iteratee) {
9409        var func = isArray(collection) ? arrayEach : baseEach;
9410        return func(collection, getIteratee(iteratee, 3));
9411      }
9412  
9413      /**
9414       * This method is like `_.forEach` except that it iterates over elements of
9415       * `collection` from right to left.
9416       *
9417       * @static
9418       * @memberOf _
9419       * @since 2.0.0
9420       * @alias eachRight
9421       * @category Collection
9422       * @param {Array|Object} collection The collection to iterate over.
9423       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9424       * @returns {Array|Object} Returns `collection`.
9425       * @see _.forEach
9426       * @example
9427       *
9428       * _.forEachRight([1, 2], function(value) {
9429       *   console.log(value);
9430       * });
9431       * // => Logs `2` then `1`.
9432       */
9433      function forEachRight(collection, iteratee) {
9434        var func = isArray(collection) ? arrayEachRight : baseEachRight;
9435        return func(collection, getIteratee(iteratee, 3));
9436      }
9437  
9438      /**
9439       * Creates an object composed of keys generated from the results of running
9440       * each element of `collection` thru `iteratee`. The order of grouped values
9441       * is determined by the order they occur in `collection`. The corresponding
9442       * value of each key is an array of elements responsible for generating the
9443       * key. The iteratee is invoked with one argument: (value).
9444       *
9445       * @static
9446       * @memberOf _
9447       * @since 0.1.0
9448       * @category Collection
9449       * @param {Array|Object} collection The collection to iterate over.
9450       * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9451       * @returns {Object} Returns the composed aggregate object.
9452       * @example
9453       *
9454       * _.groupBy([6.1, 4.2, 6.3], Math.floor);
9455       * // => { '4': [4.2], '6': [6.1, 6.3] }
9456       *
9457       * // The `_.property` iteratee shorthand.
9458       * _.groupBy(['one', 'two', 'three'], 'length');
9459       * // => { '3': ['one', 'two'], '5': ['three'] }
9460       */
9461      var groupBy = createAggregator(function(result, value, key) {
9462        if (hasOwnProperty.call(result, key)) {
9463          result[key].push(value);
9464        } else {
9465          baseAssignValue(result, key, [value]);
9466        }
9467      });
9468  
9469      /**
9470       * Checks if `value` is in `collection`. If `collection` is a string, it's
9471       * checked for a substring of `value`, otherwise
9472       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9473       * is used for equality comparisons. If `fromIndex` is negative, it's used as
9474       * the offset from the end of `collection`.
9475       *
9476       * @static
9477       * @memberOf _
9478       * @since 0.1.0
9479       * @category Collection
9480       * @param {Array|Object|string} collection The collection to inspect.
9481       * @param {*} value The value to search for.
9482       * @param {number} [fromIndex=0] The index to search from.
9483       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9484       * @returns {boolean} Returns `true` if `value` is found, else `false`.
9485       * @example
9486       *
9487       * _.includes([1, 2, 3], 1);
9488       * // => true
9489       *
9490       * _.includes([1, 2, 3], 1, 2);
9491       * // => false
9492       *
9493       * _.includes({ 'a': 1, 'b': 2 }, 1);
9494       * // => true
9495       *
9496       * _.includes('abcd', 'bc');
9497       * // => true
9498       */
9499      function includes(collection, value, fromIndex, guard) {
9500        collection = isArrayLike(collection) ? collection : values(collection);
9501        fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
9502  
9503        var length = collection.length;
9504        if (fromIndex < 0) {
9505          fromIndex = nativeMax(length + fromIndex, 0);
9506        }
9507        return isString(collection)
9508          ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
9509          : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
9510      }
9511  
9512      /**
9513       * Invokes the method at `path` of each element in `collection`, returning
9514       * an array of the results of each invoked method. Any additional arguments
9515       * are provided to each invoked method. If `path` is a function, it's invoked
9516       * for, and `this` bound to, each element in `collection`.
9517       *
9518       * @static
9519       * @memberOf _
9520       * @since 4.0.0
9521       * @category Collection
9522       * @param {Array|Object} collection The collection to iterate over.
9523       * @param {Array|Function|string} path The path of the method to invoke or
9524       *  the function invoked per iteration.
9525       * @param {...*} [args] The arguments to invoke each method with.
9526       * @returns {Array} Returns the array of results.
9527       * @example
9528       *
9529       * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
9530       * // => [[1, 5, 7], [1, 2, 3]]
9531       *
9532       * _.invokeMap([123, 456], String.prototype.split, '');
9533       * // => [['1', '2', '3'], ['4', '5', '6']]
9534       */
9535      var invokeMap = baseRest(function(collection, path, args) {
9536        var index = -1,
9537            isFunc = typeof path == 'function',
9538            result = isArrayLike(collection) ? Array(collection.length) : [];
9539  
9540        baseEach(collection, function(value) {
9541          result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
9542        });
9543        return result;
9544      });
9545  
9546      /**
9547       * Creates an object composed of keys generated from the results of running
9548       * each element of `collection` thru `iteratee`. The corresponding value of
9549       * each key is the last element responsible for generating the key. The
9550       * iteratee is invoked with one argument: (value).
9551       *
9552       * @static
9553       * @memberOf _
9554       * @since 4.0.0
9555       * @category Collection
9556       * @param {Array|Object} collection The collection to iterate over.
9557       * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9558       * @returns {Object} Returns the composed aggregate object.
9559       * @example
9560       *
9561       * var array = [
9562       *   { 'dir': 'left', 'code': 97 },
9563       *   { 'dir': 'right', 'code': 100 }
9564       * ];
9565       *
9566       * _.keyBy(array, function(o) {
9567       *   return String.fromCharCode(o.code);
9568       * });
9569       * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
9570       *
9571       * _.keyBy(array, 'dir');
9572       * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
9573       */
9574      var keyBy = createAggregator(function(result, value, key) {
9575        baseAssignValue(result, key, value);
9576      });
9577  
9578      /**
9579       * Creates an array of values by running each element in `collection` thru
9580       * `iteratee`. The iteratee is invoked with three arguments:
9581       * (value, index|key, collection).
9582       *
9583       * Many lodash methods are guarded to work as iteratees for methods like
9584       * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
9585       *
9586       * The guarded methods are:
9587       * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
9588       * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
9589       * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
9590       * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
9591       *
9592       * @static
9593       * @memberOf _
9594       * @since 0.1.0
9595       * @category Collection
9596       * @param {Array|Object} collection The collection to iterate over.
9597       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9598       * @returns {Array} Returns the new mapped array.
9599       * @example
9600       *
9601       * function square(n) {
9602       *   return n * n;
9603       * }
9604       *
9605       * _.map([4, 8], square);
9606       * // => [16, 64]
9607       *
9608       * _.map({ 'a': 4, 'b': 8 }, square);
9609       * // => [16, 64] (iteration order is not guaranteed)
9610       *
9611       * var users = [
9612       *   { 'user': 'barney' },
9613       *   { 'user': 'fred' }
9614       * ];
9615       *
9616       * // The `_.property` iteratee shorthand.
9617       * _.map(users, 'user');
9618       * // => ['barney', 'fred']
9619       */
9620      function map(collection, iteratee) {
9621        var func = isArray(collection) ? arrayMap : baseMap;
9622        return func(collection, getIteratee(iteratee, 3));
9623      }
9624  
9625      /**
9626       * This method is like `_.sortBy` except that it allows specifying the sort
9627       * orders of the iteratees to sort by. If `orders` is unspecified, all values
9628       * are sorted in ascending order. Otherwise, specify an order of "desc" for
9629       * descending or "asc" for ascending sort order of corresponding values.
9630       *
9631       * @static
9632       * @memberOf _
9633       * @since 4.0.0
9634       * @category Collection
9635       * @param {Array|Object} collection The collection to iterate over.
9636       * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
9637       *  The iteratees to sort by.
9638       * @param {string[]} [orders] The sort orders of `iteratees`.
9639       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9640       * @returns {Array} Returns the new sorted array.
9641       * @example
9642       *
9643       * var users = [
9644       *   { 'user': 'fred',   'age': 48 },
9645       *   { 'user': 'barney', 'age': 34 },
9646       *   { 'user': 'fred',   'age': 40 },
9647       *   { 'user': 'barney', 'age': 36 }
9648       * ];
9649       *
9650       * // Sort by `user` in ascending order and by `age` in descending order.
9651       * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
9652       * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9653       */
9654      function orderBy(collection, iteratees, orders, guard) {
9655        if (collection == null) {
9656          return [];
9657        }
9658        if (!isArray(iteratees)) {
9659          iteratees = iteratees == null ? [] : [iteratees];
9660        }
9661        orders = guard ? undefined : orders;
9662        if (!isArray(orders)) {
9663          orders = orders == null ? [] : [orders];
9664        }
9665        return baseOrderBy(collection, iteratees, orders);
9666      }
9667  
9668      /**
9669       * Creates an array of elements split into two groups, the first of which
9670       * contains elements `predicate` returns truthy for, the second of which
9671       * contains elements `predicate` returns falsey for. The predicate is
9672       * invoked with one argument: (value).
9673       *
9674       * @static
9675       * @memberOf _
9676       * @since 3.0.0
9677       * @category Collection
9678       * @param {Array|Object} collection The collection to iterate over.
9679       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9680       * @returns {Array} Returns the array of grouped elements.
9681       * @example
9682       *
9683       * var users = [
9684       *   { 'user': 'barney',  'age': 36, 'active': false },
9685       *   { 'user': 'fred',    'age': 40, 'active': true },
9686       *   { 'user': 'pebbles', 'age': 1,  'active': false }
9687       * ];
9688       *
9689       * _.partition(users, function(o) { return o.active; });
9690       * // => objects for [['fred'], ['barney', 'pebbles']]
9691       *
9692       * // The `_.matches` iteratee shorthand.
9693       * _.partition(users, { 'age': 1, 'active': false });
9694       * // => objects for [['pebbles'], ['barney', 'fred']]
9695       *
9696       * // The `_.matchesProperty` iteratee shorthand.
9697       * _.partition(users, ['active', false]);
9698       * // => objects for [['barney', 'pebbles'], ['fred']]
9699       *
9700       * // The `_.property` iteratee shorthand.
9701       * _.partition(users, 'active');
9702       * // => objects for [['fred'], ['barney', 'pebbles']]
9703       */
9704      var partition = createAggregator(function(result, value, key) {
9705        result[key ? 0 : 1].push(value);
9706      }, function() { return [[], []]; });
9707  
9708      /**
9709       * Reduces `collection` to a value which is the accumulated result of running
9710       * each element in `collection` thru `iteratee`, where each successive
9711       * invocation is supplied the return value of the previous. If `accumulator`
9712       * is not given, the first element of `collection` is used as the initial
9713       * value. The iteratee is invoked with four arguments:
9714       * (accumulator, value, index|key, collection).
9715       *
9716       * Many lodash methods are guarded to work as iteratees for methods like
9717       * `_.reduce`, `_.reduceRight`, and `_.transform`.
9718       *
9719       * The guarded methods are:
9720       * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
9721       * and `sortBy`
9722       *
9723       * @static
9724       * @memberOf _
9725       * @since 0.1.0
9726       * @category Collection
9727       * @param {Array|Object} collection The collection to iterate over.
9728       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9729       * @param {*} [accumulator] The initial value.
9730       * @returns {*} Returns the accumulated value.
9731       * @see _.reduceRight
9732       * @example
9733       *
9734       * _.reduce([1, 2], function(sum, n) {
9735       *   return sum + n;
9736       * }, 0);
9737       * // => 3
9738       *
9739       * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
9740       *   (result[value] || (result[value] = [])).push(key);
9741       *   return result;
9742       * }, {});
9743       * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
9744       */
9745      function reduce(collection, iteratee, accumulator) {
9746        var func = isArray(collection) ? arrayReduce : baseReduce,
9747            initAccum = arguments.length < 3;
9748  
9749        return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
9750      }
9751  
9752      /**
9753       * This method is like `_.reduce` except that it iterates over elements of
9754       * `collection` from right to left.
9755       *
9756       * @static
9757       * @memberOf _
9758       * @since 0.1.0
9759       * @category Collection
9760       * @param {Array|Object} collection The collection to iterate over.
9761       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9762       * @param {*} [accumulator] The initial value.
9763       * @returns {*} Returns the accumulated value.
9764       * @see _.reduce
9765       * @example
9766       *
9767       * var array = [[0, 1], [2, 3], [4, 5]];
9768       *
9769       * _.reduceRight(array, function(flattened, other) {
9770       *   return flattened.concat(other);
9771       * }, []);
9772       * // => [4, 5, 2, 3, 0, 1]
9773       */
9774      function reduceRight(collection, iteratee, accumulator) {
9775        var func = isArray(collection) ? arrayReduceRight : baseReduce,
9776            initAccum = arguments.length < 3;
9777  
9778        return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
9779      }
9780  
9781      /**
9782       * The opposite of `_.filter`; this method returns the elements of `collection`
9783       * that `predicate` does **not** return truthy for.
9784       *
9785       * @static
9786       * @memberOf _
9787       * @since 0.1.0
9788       * @category Collection
9789       * @param {Array|Object} collection The collection to iterate over.
9790       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9791       * @returns {Array} Returns the new filtered array.
9792       * @see _.filter
9793       * @example
9794       *
9795       * var users = [
9796       *   { 'user': 'barney', 'age': 36, 'active': false },
9797       *   { 'user': 'fred',   'age': 40, 'active': true }
9798       * ];
9799       *
9800       * _.reject(users, function(o) { return !o.active; });
9801       * // => objects for ['fred']
9802       *
9803       * // The `_.matches` iteratee shorthand.
9804       * _.reject(users, { 'age': 40, 'active': true });
9805       * // => objects for ['barney']
9806       *
9807       * // The `_.matchesProperty` iteratee shorthand.
9808       * _.reject(users, ['active', false]);
9809       * // => objects for ['fred']
9810       *
9811       * // The `_.property` iteratee shorthand.
9812       * _.reject(users, 'active');
9813       * // => objects for ['barney']
9814       */
9815      function reject(collection, predicate) {
9816        var func = isArray(collection) ? arrayFilter : baseFilter;
9817        return func(collection, negate(getIteratee(predicate, 3)));
9818      }
9819  
9820      /**
9821       * Gets a random element from `collection`.
9822       *
9823       * @static
9824       * @memberOf _
9825       * @since 2.0.0
9826       * @category Collection
9827       * @param {Array|Object} collection The collection to sample.
9828       * @returns {*} Returns the random element.
9829       * @example
9830       *
9831       * _.sample([1, 2, 3, 4]);
9832       * // => 2
9833       */
9834      function sample(collection) {
9835        var func = isArray(collection) ? arraySample : baseSample;
9836        return func(collection);
9837      }
9838  
9839      /**
9840       * Gets `n` random elements at unique keys from `collection` up to the
9841       * size of `collection`.
9842       *
9843       * @static
9844       * @memberOf _
9845       * @since 4.0.0
9846       * @category Collection
9847       * @param {Array|Object} collection The collection to sample.
9848       * @param {number} [n=1] The number of elements to sample.
9849       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9850       * @returns {Array} Returns the random elements.
9851       * @example
9852       *
9853       * _.sampleSize([1, 2, 3], 2);
9854       * // => [3, 1]
9855       *
9856       * _.sampleSize([1, 2, 3], 4);
9857       * // => [2, 3, 1]
9858       */
9859      function sampleSize(collection, n, guard) {
9860        if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
9861          n = 1;
9862        } else {
9863          n = toInteger(n);
9864        }
9865        var func = isArray(collection) ? arraySampleSize : baseSampleSize;
9866        return func(collection, n);
9867      }
9868  
9869      /**
9870       * Creates an array of shuffled values, using a version of the
9871       * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
9872       *
9873       * @static
9874       * @memberOf _
9875       * @since 0.1.0
9876       * @category Collection
9877       * @param {Array|Object} collection The collection to shuffle.
9878       * @returns {Array} Returns the new shuffled array.
9879       * @example
9880       *
9881       * _.shuffle([1, 2, 3, 4]);
9882       * // => [4, 1, 3, 2]
9883       */
9884      function shuffle(collection) {
9885        var func = isArray(collection) ? arrayShuffle : baseShuffle;
9886        return func(collection);
9887      }
9888  
9889      /**
9890       * Gets the size of `collection` by returning its length for array-like
9891       * values or the number of own enumerable string keyed properties for objects.
9892       *
9893       * @static
9894       * @memberOf _
9895       * @since 0.1.0
9896       * @category Collection
9897       * @param {Array|Object|string} collection The collection to inspect.
9898       * @returns {number} Returns the collection size.
9899       * @example
9900       *
9901       * _.size([1, 2, 3]);
9902       * // => 3
9903       *
9904       * _.size({ 'a': 1, 'b': 2 });
9905       * // => 2
9906       *
9907       * _.size('pebbles');
9908       * // => 7
9909       */
9910      function size(collection) {
9911        if (collection == null) {
9912          return 0;
9913        }
9914        if (isArrayLike(collection)) {
9915          return isString(collection) ? stringSize(collection) : collection.length;
9916        }
9917        var tag = getTag(collection);
9918        if (tag == mapTag || tag == setTag) {
9919          return collection.size;
9920        }
9921        return baseKeys(collection).length;
9922      }
9923  
9924      /**
9925       * Checks if `predicate` returns truthy for **any** element of `collection`.
9926       * Iteration is stopped once `predicate` returns truthy. The predicate is
9927       * invoked with three arguments: (value, index|key, collection).
9928       *
9929       * @static
9930       * @memberOf _
9931       * @since 0.1.0
9932       * @category Collection
9933       * @param {Array|Object} collection The collection to iterate over.
9934       * @param {Function} [predicate=_.identity] The function invoked per iteration.
9935       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9936       * @returns {boolean} Returns `true` if any element passes the predicate check,
9937       *  else `false`.
9938       * @example
9939       *
9940       * _.some([null, 0, 'yes', false], Boolean);
9941       * // => true
9942       *
9943       * var users = [
9944       *   { 'user': 'barney', 'active': true },
9945       *   { 'user': 'fred',   'active': false }
9946       * ];
9947       *
9948       * // The `_.matches` iteratee shorthand.
9949       * _.some(users, { 'user': 'barney', 'active': false });
9950       * // => false
9951       *
9952       * // The `_.matchesProperty` iteratee shorthand.
9953       * _.some(users, ['active', false]);
9954       * // => true
9955       *
9956       * // The `_.property` iteratee shorthand.
9957       * _.some(users, 'active');
9958       * // => true
9959       */
9960      function some(collection, predicate, guard) {
9961        var func = isArray(collection) ? arraySome : baseSome;
9962        if (guard && isIterateeCall(collection, predicate, guard)) {
9963          predicate = undefined;
9964        }
9965        return func(collection, getIteratee(predicate, 3));
9966      }
9967  
9968      /**
9969       * Creates an array of elements, sorted in ascending order by the results of
9970       * running each element in a collection thru each iteratee. This method
9971       * performs a stable sort, that is, it preserves the original sort order of
9972       * equal elements. The iteratees are invoked with one argument: (value).
9973       *
9974       * @static
9975       * @memberOf _
9976       * @since 0.1.0
9977       * @category Collection
9978       * @param {Array|Object} collection The collection to iterate over.
9979       * @param {...(Function|Function[])} [iteratees=[_.identity]]
9980       *  The iteratees to sort by.
9981       * @returns {Array} Returns the new sorted array.
9982       * @example
9983       *
9984       * var users = [
9985       *   { 'user': 'fred',   'age': 48 },
9986       *   { 'user': 'barney', 'age': 36 },
9987       *   { 'user': 'fred',   'age': 30 },
9988       *   { 'user': 'barney', 'age': 34 }
9989       * ];
9990       *
9991       * _.sortBy(users, [function(o) { return o.user; }]);
9992       * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
9993       *
9994       * _.sortBy(users, ['user', 'age']);
9995       * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
9996       */
9997      var sortBy = baseRest(function(collection, iteratees) {
9998        if (collection == null) {
9999          return [];
10000        }
10001        var length = iteratees.length;
10002        if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
10003          iteratees = [];
10004        } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
10005          iteratees = [iteratees[0]];
10006        }
10007        return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
10008      });
10009  
10010      /*------------------------------------------------------------------------*/
10011  
10012      /**
10013       * Gets the timestamp of the number of milliseconds that have elapsed since
10014       * the Unix epoch (1 January 1970 00:00:00 UTC).
10015       *
10016       * @static
10017       * @memberOf _
10018       * @since 2.4.0
10019       * @category Date
10020       * @returns {number} Returns the timestamp.
10021       * @example
10022       *
10023       * _.defer(function(stamp) {
10024       *   console.log(_.now() - stamp);
10025       * }, _.now());
10026       * // => Logs the number of milliseconds it took for the deferred invocation.
10027       */
10028      var now = ctxNow || function() {
10029        return root.Date.now();
10030      };
10031  
10032      /*------------------------------------------------------------------------*/
10033  
10034      /**
10035       * The opposite of `_.before`; this method creates a function that invokes
10036       * `func` once it's called `n` or more times.
10037       *
10038       * @static
10039       * @memberOf _
10040       * @since 0.1.0
10041       * @category Function
10042       * @param {number} n The number of calls before `func` is invoked.
10043       * @param {Function} func The function to restrict.
10044       * @returns {Function} Returns the new restricted function.
10045       * @example
10046       *
10047       * var saves = ['profile', 'settings'];
10048       *
10049       * var done = _.after(saves.length, function() {
10050       *   console.log('done saving!');
10051       * });
10052       *
10053       * _.forEach(saves, function(type) {
10054       *   asyncSave({ 'type': type, 'complete': done });
10055       * });
10056       * // => Logs 'done saving!' after the two async saves have completed.
10057       */
10058      function after(n, func) {
10059        if (typeof func != 'function') {
10060          throw new TypeError(FUNC_ERROR_TEXT);
10061        }
10062        n = toInteger(n);
10063        return function() {
10064          if (--n < 1) {
10065            return func.apply(this, arguments);
10066          }
10067        };
10068      }
10069  
10070      /**
10071       * Creates a function that invokes `func`, with up to `n` arguments,
10072       * ignoring any additional arguments.
10073       *
10074       * @static
10075       * @memberOf _
10076       * @since 3.0.0
10077       * @category Function
10078       * @param {Function} func The function to cap arguments for.
10079       * @param {number} [n=func.length] The arity cap.
10080       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10081       * @returns {Function} Returns the new capped function.
10082       * @example
10083       *
10084       * _.map(['6', '8', '10'], _.ary(parseInt, 1));
10085       * // => [6, 8, 10]
10086       */
10087      function ary(func, n, guard) {
10088        n = guard ? undefined : n;
10089        n = (func && n == null) ? func.length : n;
10090        return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
10091      }
10092  
10093      /**
10094       * Creates a function that invokes `func`, with the `this` binding and arguments
10095       * of the created function, while it's called less than `n` times. Subsequent
10096       * calls to the created function return the result of the last `func` invocation.
10097       *
10098       * @static
10099       * @memberOf _
10100       * @since 3.0.0
10101       * @category Function
10102       * @param {number} n The number of calls at which `func` is no longer invoked.
10103       * @param {Function} func The function to restrict.
10104       * @returns {Function} Returns the new restricted function.
10105       * @example
10106       *
10107       * jQuery(element).on('click', _.before(5, addContactToList));
10108       * // => Allows adding up to 4 contacts to the list.
10109       */
10110      function before(n, func) {
10111        var result;
10112        if (typeof func != 'function') {
10113          throw new TypeError(FUNC_ERROR_TEXT);
10114        }
10115        n = toInteger(n);
10116        return function() {
10117          if (--n > 0) {
10118            result = func.apply(this, arguments);
10119          }
10120          if (n <= 1) {
10121            func = undefined;
10122          }
10123          return result;
10124        };
10125      }
10126  
10127      /**
10128       * Creates a function that invokes `func` with the `this` binding of `thisArg`
10129       * and `partials` prepended to the arguments it receives.
10130       *
10131       * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
10132       * may be used as a placeholder for partially applied arguments.
10133       *
10134       * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
10135       * property of bound functions.
10136       *
10137       * @static
10138       * @memberOf _
10139       * @since 0.1.0
10140       * @category Function
10141       * @param {Function} func The function to bind.
10142       * @param {*} thisArg The `this` binding of `func`.
10143       * @param {...*} [partials] The arguments to be partially applied.
10144       * @returns {Function} Returns the new bound function.
10145       * @example
10146       *
10147       * function greet(greeting, punctuation) {
10148       *   return greeting + ' ' + this.user + punctuation;
10149       * }
10150       *
10151       * var object = { 'user': 'fred' };
10152       *
10153       * var bound = _.bind(greet, object, 'hi');
10154       * bound('!');
10155       * // => 'hi fred!'
10156       *
10157       * // Bound with placeholders.
10158       * var bound = _.bind(greet, object, _, '!');
10159       * bound('hi');
10160       * // => 'hi fred!'
10161       */
10162      var bind = baseRest(function(func, thisArg, partials) {
10163        var bitmask = WRAP_BIND_FLAG;
10164        if (partials.length) {
10165          var holders = replaceHolders(partials, getHolder(bind));
10166          bitmask |= WRAP_PARTIAL_FLAG;
10167        }
10168        return createWrap(func, bitmask, thisArg, partials, holders);
10169      });
10170  
10171      /**
10172       * Creates a function that invokes the method at `object[key]` with `partials`
10173       * prepended to the arguments it receives.
10174       *
10175       * This method differs from `_.bind` by allowing bound functions to reference
10176       * methods that may be redefined or don't yet exist. See
10177       * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
10178       * for more details.
10179       *
10180       * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
10181       * builds, may be used as a placeholder for partially applied arguments.
10182       *
10183       * @static
10184       * @memberOf _
10185       * @since 0.10.0
10186       * @category Function
10187       * @param {Object} object The object to invoke the method on.
10188       * @param {string} key The key of the method.
10189       * @param {...*} [partials] The arguments to be partially applied.
10190       * @returns {Function} Returns the new bound function.
10191       * @example
10192       *
10193       * var object = {
10194       *   'user': 'fred',
10195       *   'greet': function(greeting, punctuation) {
10196       *     return greeting + ' ' + this.user + punctuation;
10197       *   }
10198       * };
10199       *
10200       * var bound = _.bindKey(object, 'greet', 'hi');
10201       * bound('!');
10202       * // => 'hi fred!'
10203       *
10204       * object.greet = function(greeting, punctuation) {
10205       *   return greeting + 'ya ' + this.user + punctuation;
10206       * };
10207       *
10208       * bound('!');
10209       * // => 'hiya fred!'
10210       *
10211       * // Bound with placeholders.
10212       * var bound = _.bindKey(object, 'greet', _, '!');
10213       * bound('hi');
10214       * // => 'hiya fred!'
10215       */
10216      var bindKey = baseRest(function(object, key, partials) {
10217        var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10218        if (partials.length) {
10219          var holders = replaceHolders(partials, getHolder(bindKey));
10220          bitmask |= WRAP_PARTIAL_FLAG;
10221        }
10222        return createWrap(key, bitmask, object, partials, holders);
10223      });
10224  
10225      /**
10226       * Creates a function that accepts arguments of `func` and either invokes
10227       * `func` returning its result, if at least `arity` number of arguments have
10228       * been provided, or returns a function that accepts the remaining `func`
10229       * arguments, and so on. The arity of `func` may be specified if `func.length`
10230       * is not sufficient.
10231       *
10232       * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
10233       * may be used as a placeholder for provided arguments.
10234       *
10235       * **Note:** This method doesn't set the "length" property of curried functions.
10236       *
10237       * @static
10238       * @memberOf _
10239       * @since 2.0.0
10240       * @category Function
10241       * @param {Function} func The function to curry.
10242       * @param {number} [arity=func.length] The arity of `func`.
10243       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10244       * @returns {Function} Returns the new curried function.
10245       * @example
10246       *
10247       * var abc = function(a, b, c) {
10248       *   return [a, b, c];
10249       * };
10250       *
10251       * var curried = _.curry(abc);
10252       *
10253       * curried(1)(2)(3);
10254       * // => [1, 2, 3]
10255       *
10256       * curried(1, 2)(3);
10257       * // => [1, 2, 3]
10258       *
10259       * curried(1, 2, 3);
10260       * // => [1, 2, 3]
10261       *
10262       * // Curried with placeholders.
10263       * curried(1)(_, 3)(2);
10264       * // => [1, 2, 3]
10265       */
10266      function curry(func, arity, guard) {
10267        arity = guard ? undefined : arity;
10268        var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10269        result.placeholder = curry.placeholder;
10270        return result;
10271      }
10272  
10273      /**
10274       * This method is like `_.curry` except that arguments are applied to `func`
10275       * in the manner of `_.partialRight` instead of `_.partial`.
10276       *
10277       * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
10278       * builds, may be used as a placeholder for provided arguments.
10279       *
10280       * **Note:** This method doesn't set the "length" property of curried functions.
10281       *
10282       * @static
10283       * @memberOf _
10284       * @since 3.0.0
10285       * @category Function
10286       * @param {Function} func The function to curry.
10287       * @param {number} [arity=func.length] The arity of `func`.
10288       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10289       * @returns {Function} Returns the new curried function.
10290       * @example
10291       *
10292       * var abc = function(a, b, c) {
10293       *   return [a, b, c];
10294       * };
10295       *
10296       * var curried = _.curryRight(abc);
10297       *
10298       * curried(3)(2)(1);
10299       * // => [1, 2, 3]
10300       *
10301       * curried(2, 3)(1);
10302       * // => [1, 2, 3]
10303       *
10304       * curried(1, 2, 3);
10305       * // => [1, 2, 3]
10306       *
10307       * // Curried with placeholders.
10308       * curried(3)(1, _)(2);
10309       * // => [1, 2, 3]
10310       */
10311      function curryRight(func, arity, guard) {
10312        arity = guard ? undefined : arity;
10313        var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10314        result.placeholder = curryRight.placeholder;
10315        return result;
10316      }
10317  
10318      /**
10319       * Creates a debounced function that delays invoking `func` until after `wait`
10320       * milliseconds have elapsed since the last time the debounced function was
10321       * invoked. The debounced function comes with a `cancel` method to cancel
10322       * delayed `func` invocations and a `flush` method to immediately invoke them.
10323       * Provide `options` to indicate whether `func` should be invoked on the
10324       * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
10325       * with the last arguments provided to the debounced function. Subsequent
10326       * calls to the debounced function return the result of the last `func`
10327       * invocation.
10328       *
10329       * **Note:** If `leading` and `trailing` options are `true`, `func` is
10330       * invoked on the trailing edge of the timeout only if the debounced function
10331       * is invoked more than once during the `wait` timeout.
10332       *
10333       * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10334       * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10335       *
10336       * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10337       * for details over the differences between `_.debounce` and `_.throttle`.
10338       *
10339       * @static
10340       * @memberOf _
10341       * @since 0.1.0
10342       * @category Function
10343       * @param {Function} func The function to debounce.
10344       * @param {number} [wait=0] The number of milliseconds to delay.
10345       * @param {Object} [options={}] The options object.
10346       * @param {boolean} [options.leading=false]
10347       *  Specify invoking on the leading edge of the timeout.
10348       * @param {number} [options.maxWait]
10349       *  The maximum time `func` is allowed to be delayed before it's invoked.
10350       * @param {boolean} [options.trailing=true]
10351       *  Specify invoking on the trailing edge of the timeout.
10352       * @returns {Function} Returns the new debounced function.
10353       * @example
10354       *
10355       * // Avoid costly calculations while the window size is in flux.
10356       * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
10357       *
10358       * // Invoke `sendMail` when clicked, debouncing subsequent calls.
10359       * jQuery(element).on('click', _.debounce(sendMail, 300, {
10360       *   'leading': true,
10361       *   'trailing': false
10362       * }));
10363       *
10364       * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
10365       * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
10366       * var source = new EventSource('/stream');
10367       * jQuery(source).on('message', debounced);
10368       *
10369       * // Cancel the trailing debounced invocation.
10370       * jQuery(window).on('popstate', debounced.cancel);
10371       */
10372      function debounce(func, wait, options) {
10373        var lastArgs,
10374            lastThis,
10375            maxWait,
10376            result,
10377            timerId,
10378            lastCallTime,
10379            lastInvokeTime = 0,
10380            leading = false,
10381            maxing = false,
10382            trailing = true;
10383  
10384        if (typeof func != 'function') {
10385          throw new TypeError(FUNC_ERROR_TEXT);
10386        }
10387        wait = toNumber(wait) || 0;
10388        if (isObject(options)) {
10389          leading = !!options.leading;
10390          maxing = 'maxWait' in options;
10391          maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
10392          trailing = 'trailing' in options ? !!options.trailing : trailing;
10393        }
10394  
10395        function invokeFunc(time) {
10396          var args = lastArgs,
10397              thisArg = lastThis;
10398  
10399          lastArgs = lastThis = undefined;
10400          lastInvokeTime = time;
10401          result = func.apply(thisArg, args);
10402          return result;
10403        }
10404  
10405        function leadingEdge(time) {
10406          // Reset any `maxWait` timer.
10407          lastInvokeTime = time;
10408          // Start the timer for the trailing edge.
10409          timerId = setTimeout(timerExpired, wait);
10410          // Invoke the leading edge.
10411          return leading ? invokeFunc(time) : result;
10412        }
10413  
10414        function remainingWait(time) {
10415          var timeSinceLastCall = time - lastCallTime,
10416              timeSinceLastInvoke = time - lastInvokeTime,
10417              timeWaiting = wait - timeSinceLastCall;
10418  
10419          return maxing
10420            ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
10421            : timeWaiting;
10422        }
10423  
10424        function shouldInvoke(time) {
10425          var timeSinceLastCall = time - lastCallTime,
10426              timeSinceLastInvoke = time - lastInvokeTime;
10427  
10428          // Either this is the first call, activity has stopped and we're at the
10429          // trailing edge, the system time has gone backwards and we're treating
10430          // it as the trailing edge, or we've hit the `maxWait` limit.
10431          return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
10432            (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
10433        }
10434  
10435        function timerExpired() {
10436          var time = now();
10437          if (shouldInvoke(time)) {
10438            return trailingEdge(time);
10439          }
10440          // Restart the timer.
10441          timerId = setTimeout(timerExpired, remainingWait(time));
10442        }
10443  
10444        function trailingEdge(time) {
10445          timerId = undefined;
10446  
10447          // Only invoke if we have `lastArgs` which means `func` has been
10448          // debounced at least once.
10449          if (trailing && lastArgs) {
10450            return invokeFunc(time);
10451          }
10452          lastArgs = lastThis = undefined;
10453          return result;
10454        }
10455  
10456        function cancel() {
10457          if (timerId !== undefined) {
10458            clearTimeout(timerId);
10459          }
10460          lastInvokeTime = 0;
10461          lastArgs = lastCallTime = lastThis = timerId = undefined;
10462        }
10463  
10464        function flush() {
10465          return timerId === undefined ? result : trailingEdge(now());
10466        }
10467  
10468        function debounced() {
10469          var time = now(),
10470              isInvoking = shouldInvoke(time);
10471  
10472          lastArgs = arguments;
10473          lastThis = this;
10474          lastCallTime = time;
10475  
10476          if (isInvoking) {
10477            if (timerId === undefined) {
10478              return leadingEdge(lastCallTime);
10479            }
10480            if (maxing) {
10481              // Handle invocations in a tight loop.
10482              clearTimeout(timerId);
10483              timerId = setTimeout(timerExpired, wait);
10484              return invokeFunc(lastCallTime);
10485            }
10486          }
10487          if (timerId === undefined) {
10488            timerId = setTimeout(timerExpired, wait);
10489          }
10490          return result;
10491        }
10492        debounced.cancel = cancel;
10493        debounced.flush = flush;
10494        return debounced;
10495      }
10496  
10497      /**
10498       * Defers invoking the `func` until the current call stack has cleared. Any
10499       * additional arguments are provided to `func` when it's invoked.
10500       *
10501       * @static
10502       * @memberOf _
10503       * @since 0.1.0
10504       * @category Function
10505       * @param {Function} func The function to defer.
10506       * @param {...*} [args] The arguments to invoke `func` with.
10507       * @returns {number} Returns the timer id.
10508       * @example
10509       *
10510       * _.defer(function(text) {
10511       *   console.log(text);
10512       * }, 'deferred');
10513       * // => Logs 'deferred' after one millisecond.
10514       */
10515      var defer = baseRest(function(func, args) {
10516        return baseDelay(func, 1, args);
10517      });
10518  
10519      /**
10520       * Invokes `func` after `wait` milliseconds. Any additional arguments are
10521       * provided to `func` when it's invoked.
10522       *
10523       * @static
10524       * @memberOf _
10525       * @since 0.1.0
10526       * @category Function
10527       * @param {Function} func The function to delay.
10528       * @param {number} wait The number of milliseconds to delay invocation.
10529       * @param {...*} [args] The arguments to invoke `func` with.
10530       * @returns {number} Returns the timer id.
10531       * @example
10532       *
10533       * _.delay(function(text) {
10534       *   console.log(text);
10535       * }, 1000, 'later');
10536       * // => Logs 'later' after one second.
10537       */
10538      var delay = baseRest(function(func, wait, args) {
10539        return baseDelay(func, toNumber(wait) || 0, args);
10540      });
10541  
10542      /**
10543       * Creates a function that invokes `func` with arguments reversed.
10544       *
10545       * @static
10546       * @memberOf _
10547       * @since 4.0.0
10548       * @category Function
10549       * @param {Function} func The function to flip arguments for.
10550       * @returns {Function} Returns the new flipped function.
10551       * @example
10552       *
10553       * var flipped = _.flip(function() {
10554       *   return _.toArray(arguments);
10555       * });
10556       *
10557       * flipped('a', 'b', 'c', 'd');
10558       * // => ['d', 'c', 'b', 'a']
10559       */
10560      function flip(func) {
10561        return createWrap(func, WRAP_FLIP_FLAG);
10562      }
10563  
10564      /**
10565       * Creates a function that memoizes the result of `func`. If `resolver` is
10566       * provided, it determines the cache key for storing the result based on the
10567       * arguments provided to the memoized function. By default, the first argument
10568       * provided to the memoized function is used as the map cache key. The `func`
10569       * is invoked with the `this` binding of the memoized function.
10570       *
10571       * **Note:** The cache is exposed as the `cache` property on the memoized
10572       * function. Its creation may be customized by replacing the `_.memoize.Cache`
10573       * constructor with one whose instances implement the
10574       * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
10575       * method interface of `clear`, `delete`, `get`, `has`, and `set`.
10576       *
10577       * @static
10578       * @memberOf _
10579       * @since 0.1.0
10580       * @category Function
10581       * @param {Function} func The function to have its output memoized.
10582       * @param {Function} [resolver] The function to resolve the cache key.
10583       * @returns {Function} Returns the new memoized function.
10584       * @example
10585       *
10586       * var object = { 'a': 1, 'b': 2 };
10587       * var other = { 'c': 3, 'd': 4 };
10588       *
10589       * var values = _.memoize(_.values);
10590       * values(object);
10591       * // => [1, 2]
10592       *
10593       * values(other);
10594       * // => [3, 4]
10595       *
10596       * object.a = 2;
10597       * values(object);
10598       * // => [1, 2]
10599       *
10600       * // Modify the result cache.
10601       * values.cache.set(object, ['a', 'b']);
10602       * values(object);
10603       * // => ['a', 'b']
10604       *
10605       * // Replace `_.memoize.Cache`.
10606       * _.memoize.Cache = WeakMap;
10607       */
10608      function memoize(func, resolver) {
10609        if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
10610          throw new TypeError(FUNC_ERROR_TEXT);
10611        }
10612        var memoized = function() {
10613          var args = arguments,
10614              key = resolver ? resolver.apply(this, args) : args[0],
10615              cache = memoized.cache;
10616  
10617          if (cache.has(key)) {
10618            return cache.get(key);
10619          }
10620          var result = func.apply(this, args);
10621          memoized.cache = cache.set(key, result) || cache;
10622          return result;
10623        };
10624        memoized.cache = new (memoize.Cache || MapCache);
10625        return memoized;
10626      }
10627  
10628      // Expose `MapCache`.
10629      memoize.Cache = MapCache;
10630  
10631      /**
10632       * Creates a function that negates the result of the predicate `func`. The
10633       * `func` predicate is invoked with the `this` binding and arguments of the
10634       * created function.
10635       *
10636       * @static
10637       * @memberOf _
10638       * @since 3.0.0
10639       * @category Function
10640       * @param {Function} predicate The predicate to negate.
10641       * @returns {Function} Returns the new negated function.
10642       * @example
10643       *
10644       * function isEven(n) {
10645       *   return n % 2 == 0;
10646       * }
10647       *
10648       * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
10649       * // => [1, 3, 5]
10650       */
10651      function negate(predicate) {
10652        if (typeof predicate != 'function') {
10653          throw new TypeError(FUNC_ERROR_TEXT);
10654        }
10655        return function() {
10656          var args = arguments;
10657          switch (args.length) {
10658            case 0: return !predicate.call(this);
10659            case 1: return !predicate.call(this, args[0]);
10660            case 2: return !predicate.call(this, args[0], args[1]);
10661            case 3: return !predicate.call(this, args[0], args[1], args[2]);
10662          }
10663          return !predicate.apply(this, args);
10664        };
10665      }
10666  
10667      /**
10668       * Creates a function that is restricted to invoking `func` once. Repeat calls
10669       * to the function return the value of the first invocation. The `func` is
10670       * invoked with the `this` binding and arguments of the created function.
10671       *
10672       * @static
10673       * @memberOf _
10674       * @since 0.1.0
10675       * @category Function
10676       * @param {Function} func The function to restrict.
10677       * @returns {Function} Returns the new restricted function.
10678       * @example
10679       *
10680       * var initialize = _.once(createApplication);
10681       * initialize();
10682       * initialize();
10683       * // => `createApplication` is invoked once
10684       */
10685      function once(func) {
10686        return before(2, func);
10687      }
10688  
10689      /**
10690       * Creates a function that invokes `func` with its arguments transformed.
10691       *
10692       * @static
10693       * @since 4.0.0
10694       * @memberOf _
10695       * @category Function
10696       * @param {Function} func The function to wrap.
10697       * @param {...(Function|Function[])} [transforms=[_.identity]]
10698       *  The argument transforms.
10699       * @returns {Function} Returns the new function.
10700       * @example
10701       *
10702       * function doubled(n) {
10703       *   return n * 2;
10704       * }
10705       *
10706       * function square(n) {
10707       *   return n * n;
10708       * }
10709       *
10710       * var func = _.overArgs(function(x, y) {
10711       *   return [x, y];
10712       * }, [square, doubled]);
10713       *
10714       * func(9, 3);
10715       * // => [81, 6]
10716       *
10717       * func(10, 5);
10718       * // => [100, 10]
10719       */
10720      var overArgs = castRest(function(func, transforms) {
10721        transforms = (transforms.length == 1 && isArray(transforms[0]))
10722          ? arrayMap(transforms[0], baseUnary(getIteratee()))
10723          : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
10724  
10725        var funcsLength = transforms.length;
10726        return baseRest(function(args) {
10727          var index = -1,
10728              length = nativeMin(args.length, funcsLength);
10729  
10730          while (++index < length) {
10731            args[index] = transforms[index].call(this, args[index]);
10732          }
10733          return apply(func, this, args);
10734        });
10735      });
10736  
10737      /**
10738       * Creates a function that invokes `func` with `partials` prepended to the
10739       * arguments it receives. This method is like `_.bind` except it does **not**
10740       * alter the `this` binding.
10741       *
10742       * The `_.partial.placeholder` value, which defaults to `_` in monolithic
10743       * builds, may be used as a placeholder for partially applied arguments.
10744       *
10745       * **Note:** This method doesn't set the "length" property of partially
10746       * applied functions.
10747       *
10748       * @static
10749       * @memberOf _
10750       * @since 0.2.0
10751       * @category Function
10752       * @param {Function} func The function to partially apply arguments to.
10753       * @param {...*} [partials] The arguments to be partially applied.
10754       * @returns {Function} Returns the new partially applied function.
10755       * @example
10756       *
10757       * function greet(greeting, name) {
10758       *   return greeting + ' ' + name;
10759       * }
10760       *
10761       * var sayHelloTo = _.partial(greet, 'hello');
10762       * sayHelloTo('fred');
10763       * // => 'hello fred'
10764       *
10765       * // Partially applied with placeholders.
10766       * var greetFred = _.partial(greet, _, 'fred');
10767       * greetFred('hi');
10768       * // => 'hi fred'
10769       */
10770      var partial = baseRest(function(func, partials) {
10771        var holders = replaceHolders(partials, getHolder(partial));
10772        return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
10773      });
10774  
10775      /**
10776       * This method is like `_.partial` except that partially applied arguments
10777       * are appended to the arguments it receives.
10778       *
10779       * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
10780       * builds, may be used as a placeholder for partially applied arguments.
10781       *
10782       * **Note:** This method doesn't set the "length" property of partially
10783       * applied functions.
10784       *
10785       * @static
10786       * @memberOf _
10787       * @since 1.0.0
10788       * @category Function
10789       * @param {Function} func The function to partially apply arguments to.
10790       * @param {...*} [partials] The arguments to be partially applied.
10791       * @returns {Function} Returns the new partially applied function.
10792       * @example
10793       *
10794       * function greet(greeting, name) {
10795       *   return greeting + ' ' + name;
10796       * }
10797       *
10798       * var greetFred = _.partialRight(greet, 'fred');
10799       * greetFred('hi');
10800       * // => 'hi fred'
10801       *
10802       * // Partially applied with placeholders.
10803       * var sayHelloTo = _.partialRight(greet, 'hello', _);
10804       * sayHelloTo('fred');
10805       * // => 'hello fred'
10806       */
10807      var partialRight = baseRest(function(func, partials) {
10808        var holders = replaceHolders(partials, getHolder(partialRight));
10809        return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
10810      });
10811  
10812      /**
10813       * Creates a function that invokes `func` with arguments arranged according
10814       * to the specified `indexes` where the argument value at the first index is
10815       * provided as the first argument, the argument value at the second index is
10816       * provided as the second argument, and so on.
10817       *
10818       * @static
10819       * @memberOf _
10820       * @since 3.0.0
10821       * @category Function
10822       * @param {Function} func The function to rearrange arguments for.
10823       * @param {...(number|number[])} indexes The arranged argument indexes.
10824       * @returns {Function} Returns the new function.
10825       * @example
10826       *
10827       * var rearged = _.rearg(function(a, b, c) {
10828       *   return [a, b, c];
10829       * }, [2, 0, 1]);
10830       *
10831       * rearged('b', 'c', 'a')
10832       * // => ['a', 'b', 'c']
10833       */
10834      var rearg = flatRest(function(func, indexes) {
10835        return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
10836      });
10837  
10838      /**
10839       * Creates a function that invokes `func` with the `this` binding of the
10840       * created function and arguments from `start` and beyond provided as
10841       * an array.
10842       *
10843       * **Note:** This method is based on the
10844       * [rest parameter](https://mdn.io/rest_parameters).
10845       *
10846       * @static
10847       * @memberOf _
10848       * @since 4.0.0
10849       * @category Function
10850       * @param {Function} func The function to apply a rest parameter to.
10851       * @param {number} [start=func.length-1] The start position of the rest parameter.
10852       * @returns {Function} Returns the new function.
10853       * @example
10854       *
10855       * var say = _.rest(function(what, names) {
10856       *   return what + ' ' + _.initial(names).join(', ') +
10857       *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
10858       * });
10859       *
10860       * say('hello', 'fred', 'barney', 'pebbles');
10861       * // => 'hello fred, barney, & pebbles'
10862       */
10863      function rest(func, start) {
10864        if (typeof func != 'function') {
10865          throw new TypeError(FUNC_ERROR_TEXT);
10866        }
10867        start = start === undefined ? start : toInteger(start);
10868        return baseRest(func, start);
10869      }
10870  
10871      /**
10872       * Creates a function that invokes `func` with the `this` binding of the
10873       * create function and an array of arguments much like
10874       * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
10875       *
10876       * **Note:** This method is based on the
10877       * [spread operator](https://mdn.io/spread_operator).
10878       *
10879       * @static
10880       * @memberOf _
10881       * @since 3.2.0
10882       * @category Function
10883       * @param {Function} func The function to spread arguments over.
10884       * @param {number} [start=0] The start position of the spread.
10885       * @returns {Function} Returns the new function.
10886       * @example
10887       *
10888       * var say = _.spread(function(who, what) {
10889       *   return who + ' says ' + what;
10890       * });
10891       *
10892       * say(['fred', 'hello']);
10893       * // => 'fred says hello'
10894       *
10895       * var numbers = Promise.all([
10896       *   Promise.resolve(40),
10897       *   Promise.resolve(36)
10898       * ]);
10899       *
10900       * numbers.then(_.spread(function(x, y) {
10901       *   return x + y;
10902       * }));
10903       * // => a Promise of 76
10904       */
10905      function spread(func, start) {
10906        if (typeof func != 'function') {
10907          throw new TypeError(FUNC_ERROR_TEXT);
10908        }
10909        start = start == null ? 0 : nativeMax(toInteger(start), 0);
10910        return baseRest(function(args) {
10911          var array = args[start],
10912              otherArgs = castSlice(args, 0, start);
10913  
10914          if (array) {
10915            arrayPush(otherArgs, array);
10916          }
10917          return apply(func, this, otherArgs);
10918        });
10919      }
10920  
10921      /**
10922       * Creates a throttled function that only invokes `func` at most once per
10923       * every `wait` milliseconds. The throttled function comes with a `cancel`
10924       * method to cancel delayed `func` invocations and a `flush` method to
10925       * immediately invoke them. Provide `options` to indicate whether `func`
10926       * should be invoked on the leading and/or trailing edge of the `wait`
10927       * timeout. The `func` is invoked with the last arguments provided to the
10928       * throttled function. Subsequent calls to the throttled function return the
10929       * result of the last `func` invocation.
10930       *
10931       * **Note:** If `leading` and `trailing` options are `true`, `func` is
10932       * invoked on the trailing edge of the timeout only if the throttled function
10933       * is invoked more than once during the `wait` timeout.
10934       *
10935       * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10936       * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10937       *
10938       * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10939       * for details over the differences between `_.throttle` and `_.debounce`.
10940       *
10941       * @static
10942       * @memberOf _
10943       * @since 0.1.0
10944       * @category Function
10945       * @param {Function} func The function to throttle.
10946       * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
10947       * @param {Object} [options={}] The options object.
10948       * @param {boolean} [options.leading=true]
10949       *  Specify invoking on the leading edge of the timeout.
10950       * @param {boolean} [options.trailing=true]
10951       *  Specify invoking on the trailing edge of the timeout.
10952       * @returns {Function} Returns the new throttled function.
10953       * @example
10954       *
10955       * // Avoid excessively updating the position while scrolling.
10956       * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
10957       *
10958       * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
10959       * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
10960       * jQuery(element).on('click', throttled);
10961       *
10962       * // Cancel the trailing throttled invocation.
10963       * jQuery(window).on('popstate', throttled.cancel);
10964       */
10965      function throttle(func, wait, options) {
10966        var leading = true,
10967            trailing = true;
10968  
10969        if (typeof func != 'function') {
10970          throw new TypeError(FUNC_ERROR_TEXT);
10971        }
10972        if (isObject(options)) {
10973          leading = 'leading' in options ? !!options.leading : leading;
10974          trailing = 'trailing' in options ? !!options.trailing : trailing;
10975        }
10976        return debounce(func, wait, {
10977          'leading': leading,
10978          'maxWait': wait,
10979          'trailing': trailing
10980        });
10981      }
10982  
10983      /**
10984       * Creates a function that accepts up to one argument, ignoring any
10985       * additional arguments.
10986       *
10987       * @static
10988       * @memberOf _
10989       * @since 4.0.0
10990       * @category Function
10991       * @param {Function} func The function to cap arguments for.
10992       * @returns {Function} Returns the new capped function.
10993       * @example
10994       *
10995       * _.map(['6', '8', '10'], _.unary(parseInt));
10996       * // => [6, 8, 10]
10997       */
10998      function unary(func) {
10999        return ary(func, 1);
11000      }
11001  
11002      /**
11003       * Creates a function that provides `value` to `wrapper` as its first
11004       * argument. Any additional arguments provided to the function are appended
11005       * to those provided to the `wrapper`. The wrapper is invoked with the `this`
11006       * binding of the created function.
11007       *
11008       * @static
11009       * @memberOf _
11010       * @since 0.1.0
11011       * @category Function
11012       * @param {*} value The value to wrap.
11013       * @param {Function} [wrapper=identity] The wrapper function.
11014       * @returns {Function} Returns the new function.
11015       * @example
11016       *
11017       * var p = _.wrap(_.escape, function(func, text) {
11018       *   return '<p>' + func(text) + '</p>';
11019       * });
11020       *
11021       * p('fred, barney, & pebbles');
11022       * // => '<p>fred, barney, &amp; pebbles</p>'
11023       */
11024      function wrap(value, wrapper) {
11025        return partial(castFunction(wrapper), value);
11026      }
11027  
11028      /*------------------------------------------------------------------------*/
11029  
11030      /**
11031       * Casts `value` as an array if it's not one.
11032       *
11033       * @static
11034       * @memberOf _
11035       * @since 4.4.0
11036       * @category Lang
11037       * @param {*} value The value to inspect.
11038       * @returns {Array} Returns the cast array.
11039       * @example
11040       *
11041       * _.castArray(1);
11042       * // => [1]
11043       *
11044       * _.castArray({ 'a': 1 });
11045       * // => [{ 'a': 1 }]
11046       *
11047       * _.castArray('abc');
11048       * // => ['abc']
11049       *
11050       * _.castArray(null);
11051       * // => [null]
11052       *
11053       * _.castArray(undefined);
11054       * // => [undefined]
11055       *
11056       * _.castArray();
11057       * // => []
11058       *
11059       * var array = [1, 2, 3];
11060       * console.log(_.castArray(array) === array);
11061       * // => true
11062       */
11063      function castArray() {
11064        if (!arguments.length) {
11065          return [];
11066        }
11067        var value = arguments[0];
11068        return isArray(value) ? value : [value];
11069      }
11070  
11071      /**
11072       * Creates a shallow clone of `value`.
11073       *
11074       * **Note:** This method is loosely based on the
11075       * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
11076       * and supports cloning arrays, array buffers, booleans, date objects, maps,
11077       * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
11078       * arrays. The own enumerable properties of `arguments` objects are cloned
11079       * as plain objects. An empty object is returned for uncloneable values such
11080       * as error objects, functions, DOM nodes, and WeakMaps.
11081       *
11082       * @static
11083       * @memberOf _
11084       * @since 0.1.0
11085       * @category Lang
11086       * @param {*} value The value to clone.
11087       * @returns {*} Returns the cloned value.
11088       * @see _.cloneDeep
11089       * @example
11090       *
11091       * var objects = [{ 'a': 1 }, { 'b': 2 }];
11092       *
11093       * var shallow = _.clone(objects);
11094       * console.log(shallow[0] === objects[0]);
11095       * // => true
11096       */
11097      function clone(value) {
11098        return baseClone(value, CLONE_SYMBOLS_FLAG);
11099      }
11100  
11101      /**
11102       * This method is like `_.clone` except that it accepts `customizer` which
11103       * is invoked to produce the cloned value. If `customizer` returns `undefined`,
11104       * cloning is handled by the method instead. The `customizer` is invoked with
11105       * up to four arguments; (value [, index|key, object, stack]).
11106       *
11107       * @static
11108       * @memberOf _
11109       * @since 4.0.0
11110       * @category Lang
11111       * @param {*} value The value to clone.
11112       * @param {Function} [customizer] The function to customize cloning.
11113       * @returns {*} Returns the cloned value.
11114       * @see _.cloneDeepWith
11115       * @example
11116       *
11117       * function customizer(value) {
11118       *   if (_.isElement(value)) {
11119       *     return value.cloneNode(false);
11120       *   }
11121       * }
11122       *
11123       * var el = _.cloneWith(document.body, customizer);
11124       *
11125       * console.log(el === document.body);
11126       * // => false
11127       * console.log(el.nodeName);
11128       * // => 'BODY'
11129       * console.log(el.childNodes.length);
11130       * // => 0
11131       */
11132      function cloneWith(value, customizer) {
11133        customizer = typeof customizer == 'function' ? customizer : undefined;
11134        return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
11135      }
11136  
11137      /**
11138       * This method is like `_.clone` except that it recursively clones `value`.
11139       *
11140       * @static
11141       * @memberOf _
11142       * @since 1.0.0
11143       * @category Lang
11144       * @param {*} value The value to recursively clone.
11145       * @returns {*} Returns the deep cloned value.
11146       * @see _.clone
11147       * @example
11148       *
11149       * var objects = [{ 'a': 1 }, { 'b': 2 }];
11150       *
11151       * var deep = _.cloneDeep(objects);
11152       * console.log(deep[0] === objects[0]);
11153       * // => false
11154       */
11155      function cloneDeep(value) {
11156        return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
11157      }
11158  
11159      /**
11160       * This method is like `_.cloneWith` except that it recursively clones `value`.
11161       *
11162       * @static
11163       * @memberOf _
11164       * @since 4.0.0
11165       * @category Lang
11166       * @param {*} value The value to recursively clone.
11167       * @param {Function} [customizer] The function to customize cloning.
11168       * @returns {*} Returns the deep cloned value.
11169       * @see _.cloneWith
11170       * @example
11171       *
11172       * function customizer(value) {
11173       *   if (_.isElement(value)) {
11174       *     return value.cloneNode(true);
11175       *   }
11176       * }
11177       *
11178       * var el = _.cloneDeepWith(document.body, customizer);
11179       *
11180       * console.log(el === document.body);
11181       * // => false
11182       * console.log(el.nodeName);
11183       * // => 'BODY'
11184       * console.log(el.childNodes.length);
11185       * // => 20
11186       */
11187      function cloneDeepWith(value, customizer) {
11188        customizer = typeof customizer == 'function' ? customizer : undefined;
11189        return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
11190      }
11191  
11192      /**
11193       * Checks if `object` conforms to `source` by invoking the predicate
11194       * properties of `source` with the corresponding property values of `object`.
11195       *
11196       * **Note:** This method is equivalent to `_.conforms` when `source` is
11197       * partially applied.
11198       *
11199       * @static
11200       * @memberOf _
11201       * @since 4.14.0
11202       * @category Lang
11203       * @param {Object} object The object to inspect.
11204       * @param {Object} source The object of property predicates to conform to.
11205       * @returns {boolean} Returns `true` if `object` conforms, else `false`.
11206       * @example
11207       *
11208       * var object = { 'a': 1, 'b': 2 };
11209       *
11210       * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
11211       * // => true
11212       *
11213       * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
11214       * // => false
11215       */
11216      function conformsTo(object, source) {
11217        return source == null || baseConformsTo(object, source, keys(source));
11218      }
11219  
11220      /**
11221       * Performs a
11222       * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
11223       * comparison between two values to determine if they are equivalent.
11224       *
11225       * @static
11226       * @memberOf _
11227       * @since 4.0.0
11228       * @category Lang
11229       * @param {*} value The value to compare.
11230       * @param {*} other The other value to compare.
11231       * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11232       * @example
11233       *
11234       * var object = { 'a': 1 };
11235       * var other = { 'a': 1 };
11236       *
11237       * _.eq(object, object);
11238       * // => true
11239       *
11240       * _.eq(object, other);
11241       * // => false
11242       *
11243       * _.eq('a', 'a');
11244       * // => true
11245       *
11246       * _.eq('a', Object('a'));
11247       * // => false
11248       *
11249       * _.eq(NaN, NaN);
11250       * // => true
11251       */
11252      function eq(value, other) {
11253        return value === other || (value !== value && other !== other);
11254      }
11255  
11256      /**
11257       * Checks if `value` is greater than `other`.
11258       *
11259       * @static
11260       * @memberOf _
11261       * @since 3.9.0
11262       * @category Lang
11263       * @param {*} value The value to compare.
11264       * @param {*} other The other value to compare.
11265       * @returns {boolean} Returns `true` if `value` is greater than `other`,
11266       *  else `false`.
11267       * @see _.lt
11268       * @example
11269       *
11270       * _.gt(3, 1);
11271       * // => true
11272       *
11273       * _.gt(3, 3);
11274       * // => false
11275       *
11276       * _.gt(1, 3);
11277       * // => false
11278       */
11279      var gt = createRelationalOperation(baseGt);
11280  
11281      /**
11282       * Checks if `value` is greater than or equal to `other`.
11283       *
11284       * @static
11285       * @memberOf _
11286       * @since 3.9.0
11287       * @category Lang
11288       * @param {*} value The value to compare.
11289       * @param {*} other The other value to compare.
11290       * @returns {boolean} Returns `true` if `value` is greater than or equal to
11291       *  `other`, else `false`.
11292       * @see _.lte
11293       * @example
11294       *
11295       * _.gte(3, 1);
11296       * // => true
11297       *
11298       * _.gte(3, 3);
11299       * // => true
11300       *
11301       * _.gte(1, 3);
11302       * // => false
11303       */
11304      var gte = createRelationalOperation(function(value, other) {
11305        return value >= other;
11306      });
11307  
11308      /**
11309       * Checks if `value` is likely an `arguments` object.
11310       *
11311       * @static
11312       * @memberOf _
11313       * @since 0.1.0
11314       * @category Lang
11315       * @param {*} value The value to check.
11316       * @returns {boolean} Returns `true` if `value` is an `arguments` object,
11317       *  else `false`.
11318       * @example
11319       *
11320       * _.isArguments(function() { return arguments; }());
11321       * // => true
11322       *
11323       * _.isArguments([1, 2, 3]);
11324       * // => false
11325       */
11326      var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
11327        return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
11328          !propertyIsEnumerable.call(value, 'callee');
11329      };
11330  
11331      /**
11332       * Checks if `value` is classified as an `Array` object.
11333       *
11334       * @static
11335       * @memberOf _
11336       * @since 0.1.0
11337       * @category Lang
11338       * @param {*} value The value to check.
11339       * @returns {boolean} Returns `true` if `value` is an array, else `false`.
11340       * @example
11341       *
11342       * _.isArray([1, 2, 3]);
11343       * // => true
11344       *
11345       * _.isArray(document.body.children);
11346       * // => false
11347       *
11348       * _.isArray('abc');
11349       * // => false
11350       *
11351       * _.isArray(_.noop);
11352       * // => false
11353       */
11354      var isArray = Array.isArray;
11355  
11356      /**
11357       * Checks if `value` is classified as an `ArrayBuffer` object.
11358       *
11359       * @static
11360       * @memberOf _
11361       * @since 4.3.0
11362       * @category Lang
11363       * @param {*} value The value to check.
11364       * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
11365       * @example
11366       *
11367       * _.isArrayBuffer(new ArrayBuffer(2));
11368       * // => true
11369       *
11370       * _.isArrayBuffer(new Array(2));
11371       * // => false
11372       */
11373      var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
11374  
11375      /**
11376       * Checks if `value` is array-like. A value is considered array-like if it's
11377       * not a function and has a `value.length` that's an integer greater than or
11378       * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
11379       *
11380       * @static
11381       * @memberOf _
11382       * @since 4.0.0
11383       * @category Lang
11384       * @param {*} value The value to check.
11385       * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
11386       * @example
11387       *
11388       * _.isArrayLike([1, 2, 3]);
11389       * // => true
11390       *
11391       * _.isArrayLike(document.body.children);
11392       * // => true
11393       *
11394       * _.isArrayLike('abc');
11395       * // => true
11396       *
11397       * _.isArrayLike(_.noop);
11398       * // => false
11399       */
11400      function isArrayLike(value) {
11401        return value != null && isLength(value.length) && !isFunction(value);
11402      }
11403  
11404      /**
11405       * This method is like `_.isArrayLike` except that it also checks if `value`
11406       * is an object.
11407       *
11408       * @static
11409       * @memberOf _
11410       * @since 4.0.0
11411       * @category Lang
11412       * @param {*} value The value to check.
11413       * @returns {boolean} Returns `true` if `value` is an array-like object,
11414       *  else `false`.
11415       * @example
11416       *
11417       * _.isArrayLikeObject([1, 2, 3]);
11418       * // => true
11419       *
11420       * _.isArrayLikeObject(document.body.children);
11421       * // => true
11422       *
11423       * _.isArrayLikeObject('abc');
11424       * // => false
11425       *
11426       * _.isArrayLikeObject(_.noop);
11427       * // => false
11428       */
11429      function isArrayLikeObject(value) {
11430        return isObjectLike(value) && isArrayLike(value);
11431      }
11432  
11433      /**
11434       * Checks if `value` is classified as a boolean primitive or object.
11435       *
11436       * @static
11437       * @memberOf _
11438       * @since 0.1.0
11439       * @category Lang
11440       * @param {*} value The value to check.
11441       * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
11442       * @example
11443       *
11444       * _.isBoolean(false);
11445       * // => true
11446       *
11447       * _.isBoolean(null);
11448       * // => false
11449       */
11450      function isBoolean(value) {
11451        return value === true || value === false ||
11452          (isObjectLike(value) && baseGetTag(value) == boolTag);
11453      }
11454  
11455      /**
11456       * Checks if `value` is a buffer.
11457       *
11458       * @static
11459       * @memberOf _
11460       * @since 4.3.0
11461       * @category Lang
11462       * @param {*} value The value to check.
11463       * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
11464       * @example
11465       *
11466       * _.isBuffer(new Buffer(2));
11467       * // => true
11468       *
11469       * _.isBuffer(new Uint8Array(2));
11470       * // => false
11471       */
11472      var isBuffer = nativeIsBuffer || stubFalse;
11473  
11474      /**
11475       * Checks if `value` is classified as a `Date` object.
11476       *
11477       * @static
11478       * @memberOf _
11479       * @since 0.1.0
11480       * @category Lang
11481       * @param {*} value The value to check.
11482       * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
11483       * @example
11484       *
11485       * _.isDate(new Date);
11486       * // => true
11487       *
11488       * _.isDate('Mon April 23 2012');
11489       * // => false
11490       */
11491      var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
11492  
11493      /**
11494       * Checks if `value` is likely a DOM element.
11495       *
11496       * @static
11497       * @memberOf _
11498       * @since 0.1.0
11499       * @category Lang
11500       * @param {*} value The value to check.
11501       * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
11502       * @example
11503       *
11504       * _.isElement(document.body);
11505       * // => true
11506       *
11507       * _.isElement('<body>');
11508       * // => false
11509       */
11510      function isElement(value) {
11511        return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
11512      }
11513  
11514      /**
11515       * Checks if `value` is an empty object, collection, map, or set.
11516       *
11517       * Objects are considered empty if they have no own enumerable string keyed
11518       * properties.
11519       *
11520       * Array-like values such as `arguments` objects, arrays, buffers, strings, or
11521       * jQuery-like collections are considered empty if they have a `length` of `0`.
11522       * Similarly, maps and sets are considered empty if they have a `size` of `0`.
11523       *
11524       * @static
11525       * @memberOf _
11526       * @since 0.1.0
11527       * @category Lang
11528       * @param {*} value The value to check.
11529       * @returns {boolean} Returns `true` if `value` is empty, else `false`.
11530       * @example
11531       *
11532       * _.isEmpty(null);
11533       * // => true
11534       *
11535       * _.isEmpty(true);
11536       * // => true
11537       *
11538       * _.isEmpty(1);
11539       * // => true
11540       *
11541       * _.isEmpty([1, 2, 3]);
11542       * // => false
11543       *
11544       * _.isEmpty({ 'a': 1 });
11545       * // => false
11546       */
11547      function isEmpty(value) {
11548        if (value == null) {
11549          return true;
11550        }
11551        if (isArrayLike(value) &&
11552            (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
11553              isBuffer(value) || isTypedArray(value) || isArguments(value))) {
11554          return !value.length;
11555        }
11556        var tag = getTag(value);
11557        if (tag == mapTag || tag == setTag) {
11558          return !value.size;
11559        }
11560        if (isPrototype(value)) {
11561          return !baseKeys(value).length;
11562        }
11563        for (var key in value) {
11564          if (hasOwnProperty.call(value, key)) {
11565            return false;
11566          }
11567        }
11568        return true;
11569      }
11570  
11571      /**
11572       * Performs a deep comparison between two values to determine if they are
11573       * equivalent.
11574       *
11575       * **Note:** This method supports comparing arrays, array buffers, booleans,
11576       * date objects, error objects, maps, numbers, `Object` objects, regexes,
11577       * sets, strings, symbols, and typed arrays. `Object` objects are compared
11578       * by their own, not inherited, enumerable properties. Functions and DOM
11579       * nodes are compared by strict equality, i.e. `===`.
11580       *
11581       * @static
11582       * @memberOf _
11583       * @since 0.1.0
11584       * @category Lang
11585       * @param {*} value The value to compare.
11586       * @param {*} other The other value to compare.
11587       * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11588       * @example
11589       *
11590       * var object = { 'a': 1 };
11591       * var other = { 'a': 1 };
11592       *
11593       * _.isEqual(object, other);
11594       * // => true
11595       *
11596       * object === other;
11597       * // => false
11598       */
11599      function isEqual(value, other) {
11600        return baseIsEqual(value, other);
11601      }
11602  
11603      /**
11604       * This method is like `_.isEqual` except that it accepts `customizer` which
11605       * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11606       * are handled by the method instead. The `customizer` is invoked with up to
11607       * six arguments: (objValue, othValue [, index|key, object, other, stack]).
11608       *
11609       * @static
11610       * @memberOf _
11611       * @since 4.0.0
11612       * @category Lang
11613       * @param {*} value The value to compare.
11614       * @param {*} other The other value to compare.
11615       * @param {Function} [customizer] The function to customize comparisons.
11616       * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11617       * @example
11618       *
11619       * function isGreeting(value) {
11620       *   return /^h(?:i|ello)$/.test(value);
11621       * }
11622       *
11623       * function customizer(objValue, othValue) {
11624       *   if (isGreeting(objValue) && isGreeting(othValue)) {
11625       *     return true;
11626       *   }
11627       * }
11628       *
11629       * var array = ['hello', 'goodbye'];
11630       * var other = ['hi', 'goodbye'];
11631       *
11632       * _.isEqualWith(array, other, customizer);
11633       * // => true
11634       */
11635      function isEqualWith(value, other, customizer) {
11636        customizer = typeof customizer == 'function' ? customizer : undefined;
11637        var result = customizer ? customizer(value, other) : undefined;
11638        return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
11639      }
11640  
11641      /**
11642       * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
11643       * `SyntaxError`, `TypeError`, or `URIError` object.
11644       *
11645       * @static
11646       * @memberOf _
11647       * @since 3.0.0
11648       * @category Lang
11649       * @param {*} value The value to check.
11650       * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
11651       * @example
11652       *
11653       * _.isError(new Error);
11654       * // => true
11655       *
11656       * _.isError(Error);
11657       * // => false
11658       */
11659      function isError(value) {
11660        if (!isObjectLike(value)) {
11661          return false;
11662        }
11663        var tag = baseGetTag(value);
11664        return tag == errorTag || tag == domExcTag ||
11665          (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
11666      }
11667  
11668      /**
11669       * Checks if `value` is a finite primitive number.
11670       *
11671       * **Note:** This method is based on
11672       * [`Number.isFinite`](https://mdn.io/Number/isFinite).
11673       *
11674       * @static
11675       * @memberOf _
11676       * @since 0.1.0
11677       * @category Lang
11678       * @param {*} value The value to check.
11679       * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
11680       * @example
11681       *
11682       * _.isFinite(3);
11683       * // => true
11684       *
11685       * _.isFinite(Number.MIN_VALUE);
11686       * // => true
11687       *
11688       * _.isFinite(Infinity);
11689       * // => false
11690       *
11691       * _.isFinite('3');
11692       * // => false
11693       */
11694      function isFinite(value) {
11695        return typeof value == 'number' && nativeIsFinite(value);
11696      }
11697  
11698      /**
11699       * Checks if `value` is classified as a `Function` object.
11700       *
11701       * @static
11702       * @memberOf _
11703       * @since 0.1.0
11704       * @category Lang
11705       * @param {*} value The value to check.
11706       * @returns {boolean} Returns `true` if `value` is a function, else `false`.
11707       * @example
11708       *
11709       * _.isFunction(_);
11710       * // => true
11711       *
11712       * _.isFunction(/abc/);
11713       * // => false
11714       */
11715      function isFunction(value) {
11716        if (!isObject(value)) {
11717          return false;
11718        }
11719        // The use of `Object#toString` avoids issues with the `typeof` operator
11720        // in Safari 9 which returns 'object' for typed arrays and other constructors.
11721        var tag = baseGetTag(value);
11722        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
11723      }
11724  
11725      /**
11726       * Checks if `value` is an integer.
11727       *
11728       * **Note:** This method is based on
11729       * [`Number.isInteger`](https://mdn.io/Number/isInteger).
11730       *
11731       * @static
11732       * @memberOf _
11733       * @since 4.0.0
11734       * @category Lang
11735       * @param {*} value The value to check.
11736       * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
11737       * @example
11738       *
11739       * _.isInteger(3);
11740       * // => true
11741       *
11742       * _.isInteger(Number.MIN_VALUE);
11743       * // => false
11744       *
11745       * _.isInteger(Infinity);
11746       * // => false
11747       *
11748       * _.isInteger('3');
11749       * // => false
11750       */
11751      function isInteger(value) {
11752        return typeof value == 'number' && value == toInteger(value);
11753      }
11754  
11755      /**
11756       * Checks if `value` is a valid array-like length.
11757       *
11758       * **Note:** This method is loosely based on
11759       * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
11760       *
11761       * @static
11762       * @memberOf _
11763       * @since 4.0.0
11764       * @category Lang
11765       * @param {*} value The value to check.
11766       * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
11767       * @example
11768       *
11769       * _.isLength(3);
11770       * // => true
11771       *
11772       * _.isLength(Number.MIN_VALUE);
11773       * // => false
11774       *
11775       * _.isLength(Infinity);
11776       * // => false
11777       *
11778       * _.isLength('3');
11779       * // => false
11780       */
11781      function isLength(value) {
11782        return typeof value == 'number' &&
11783          value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
11784      }
11785  
11786      /**
11787       * Checks if `value` is the
11788       * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
11789       * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
11790       *
11791       * @static
11792       * @memberOf _
11793       * @since 0.1.0
11794       * @category Lang
11795       * @param {*} value The value to check.
11796       * @returns {boolean} Returns `true` if `value` is an object, else `false`.
11797       * @example
11798       *
11799       * _.isObject({});
11800       * // => true
11801       *
11802       * _.isObject([1, 2, 3]);
11803       * // => true
11804       *
11805       * _.isObject(_.noop);
11806       * // => true
11807       *
11808       * _.isObject(null);
11809       * // => false
11810       */
11811      function isObject(value) {
11812        var type = typeof value;
11813        return value != null && (type == 'object' || type == 'function');
11814      }
11815  
11816      /**
11817       * Checks if `value` is object-like. A value is object-like if it's not `null`
11818       * and has a `typeof` result of "object".
11819       *
11820       * @static
11821       * @memberOf _
11822       * @since 4.0.0
11823       * @category Lang
11824       * @param {*} value The value to check.
11825       * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
11826       * @example
11827       *
11828       * _.isObjectLike({});
11829       * // => true
11830       *
11831       * _.isObjectLike([1, 2, 3]);
11832       * // => true
11833       *
11834       * _.isObjectLike(_.noop);
11835       * // => false
11836       *
11837       * _.isObjectLike(null);
11838       * // => false
11839       */
11840      function isObjectLike(value) {
11841        return value != null && typeof value == 'object';
11842      }
11843  
11844      /**
11845       * Checks if `value` is classified as a `Map` object.
11846       *
11847       * @static
11848       * @memberOf _
11849       * @since 4.3.0
11850       * @category Lang
11851       * @param {*} value The value to check.
11852       * @returns {boolean} Returns `true` if `value` is a map, else `false`.
11853       * @example
11854       *
11855       * _.isMap(new Map);
11856       * // => true
11857       *
11858       * _.isMap(new WeakMap);
11859       * // => false
11860       */
11861      var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
11862  
11863      /**
11864       * Performs a partial deep comparison between `object` and `source` to
11865       * determine if `object` contains equivalent property values.
11866       *
11867       * **Note:** This method is equivalent to `_.matches` when `source` is
11868       * partially applied.
11869       *
11870       * Partial comparisons will match empty array and empty object `source`
11871       * values against any array or object value, respectively. See `_.isEqual`
11872       * for a list of supported value comparisons.
11873       *
11874       * @static
11875       * @memberOf _
11876       * @since 3.0.0
11877       * @category Lang
11878       * @param {Object} object The object to inspect.
11879       * @param {Object} source The object of property values to match.
11880       * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11881       * @example
11882       *
11883       * var object = { 'a': 1, 'b': 2 };
11884       *
11885       * _.isMatch(object, { 'b': 2 });
11886       * // => true
11887       *
11888       * _.isMatch(object, { 'b': 1 });
11889       * // => false
11890       */
11891      function isMatch(object, source) {
11892        return object === source || baseIsMatch(object, source, getMatchData(source));
11893      }
11894  
11895      /**
11896       * This method is like `_.isMatch` except that it accepts `customizer` which
11897       * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11898       * are handled by the method instead. The `customizer` is invoked with five
11899       * arguments: (objValue, srcValue, index|key, object, source).
11900       *
11901       * @static
11902       * @memberOf _
11903       * @since 4.0.0
11904       * @category Lang
11905       * @param {Object} object The object to inspect.
11906       * @param {Object} source The object of property values to match.
11907       * @param {Function} [customizer] The function to customize comparisons.
11908       * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11909       * @example
11910       *
11911       * function isGreeting(value) {
11912       *   return /^h(?:i|ello)$/.test(value);
11913       * }
11914       *
11915       * function customizer(objValue, srcValue) {
11916       *   if (isGreeting(objValue) && isGreeting(srcValue)) {
11917       *     return true;
11918       *   }
11919       * }
11920       *
11921       * var object = { 'greeting': 'hello' };
11922       * var source = { 'greeting': 'hi' };
11923       *
11924       * _.isMatchWith(object, source, customizer);
11925       * // => true
11926       */
11927      function isMatchWith(object, source, customizer) {
11928        customizer = typeof customizer == 'function' ? customizer : undefined;
11929        return baseIsMatch(object, source, getMatchData(source), customizer);
11930      }
11931  
11932      /**
11933       * Checks if `value` is `NaN`.
11934       *
11935       * **Note:** This method is based on
11936       * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
11937       * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
11938       * `undefined` and other non-number values.
11939       *
11940       * @static
11941       * @memberOf _
11942       * @since 0.1.0
11943       * @category Lang
11944       * @param {*} value The value to check.
11945       * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
11946       * @example
11947       *
11948       * _.isNaN(NaN);
11949       * // => true
11950       *
11951       * _.isNaN(new Number(NaN));
11952       * // => true
11953       *
11954       * isNaN(undefined);
11955       * // => true
11956       *
11957       * _.isNaN(undefined);
11958       * // => false
11959       */
11960      function isNaN(value) {
11961        // An `NaN` primitive is the only value that is not equal to itself.
11962        // Perform the `toStringTag` check first to avoid errors with some
11963        // ActiveX objects in IE.
11964        return isNumber(value) && value != +value;
11965      }
11966  
11967      /**
11968       * Checks if `value` is a pristine native function.
11969       *
11970       * **Note:** This method can't reliably detect native functions in the presence
11971       * of the core-js package because core-js circumvents this kind of detection.
11972       * Despite multiple requests, the core-js maintainer has made it clear: any
11973       * attempt to fix the detection will be obstructed. As a result, we're left
11974       * with little choice but to throw an error. Unfortunately, this also affects
11975       * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
11976       * which rely on core-js.
11977       *
11978       * @static
11979       * @memberOf _
11980       * @since 3.0.0
11981       * @category Lang
11982       * @param {*} value The value to check.
11983       * @returns {boolean} Returns `true` if `value` is a native function,
11984       *  else `false`.
11985       * @example
11986       *
11987       * _.isNative(Array.prototype.push);
11988       * // => true
11989       *
11990       * _.isNative(_);
11991       * // => false
11992       */
11993      function isNative(value) {
11994        if (isMaskable(value)) {
11995          throw new Error(CORE_ERROR_TEXT);
11996        }
11997        return baseIsNative(value);
11998      }
11999  
12000      /**
12001       * Checks if `value` is `null`.
12002       *
12003       * @static
12004       * @memberOf _
12005       * @since 0.1.0
12006       * @category Lang
12007       * @param {*} value The value to check.
12008       * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
12009       * @example
12010       *
12011       * _.isNull(null);
12012       * // => true
12013       *
12014       * _.isNull(void 0);
12015       * // => false
12016       */
12017      function isNull(value) {
12018        return value === null;
12019      }
12020  
12021      /**
12022       * Checks if `value` is `null` or `undefined`.
12023       *
12024       * @static
12025       * @memberOf _
12026       * @since 4.0.0
12027       * @category Lang
12028       * @param {*} value The value to check.
12029       * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
12030       * @example
12031       *
12032       * _.isNil(null);
12033       * // => true
12034       *
12035       * _.isNil(void 0);
12036       * // => true
12037       *
12038       * _.isNil(NaN);
12039       * // => false
12040       */
12041      function isNil(value) {
12042        return value == null;
12043      }
12044  
12045      /**
12046       * Checks if `value` is classified as a `Number` primitive or object.
12047       *
12048       * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
12049       * classified as numbers, use the `_.isFinite` method.
12050       *
12051       * @static
12052       * @memberOf _
12053       * @since 0.1.0
12054       * @category Lang
12055       * @param {*} value The value to check.
12056       * @returns {boolean} Returns `true` if `value` is a number, else `false`.
12057       * @example
12058       *
12059       * _.isNumber(3);
12060       * // => true
12061       *
12062       * _.isNumber(Number.MIN_VALUE);
12063       * // => true
12064       *
12065       * _.isNumber(Infinity);
12066       * // => true
12067       *
12068       * _.isNumber('3');
12069       * // => false
12070       */
12071      function isNumber(value) {
12072        return typeof value == 'number' ||
12073          (isObjectLike(value) && baseGetTag(value) == numberTag);
12074      }
12075  
12076      /**
12077       * Checks if `value` is a plain object, that is, an object created by the
12078       * `Object` constructor or one with a `[[Prototype]]` of `null`.
12079       *
12080       * @static
12081       * @memberOf _
12082       * @since 0.8.0
12083       * @category Lang
12084       * @param {*} value The value to check.
12085       * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
12086       * @example
12087       *
12088       * function Foo() {
12089       *   this.a = 1;
12090       * }
12091       *
12092       * _.isPlainObject(new Foo);
12093       * // => false
12094       *
12095       * _.isPlainObject([1, 2, 3]);
12096       * // => false
12097       *
12098       * _.isPlainObject({ 'x': 0, 'y': 0 });
12099       * // => true
12100       *
12101       * _.isPlainObject(Object.create(null));
12102       * // => true
12103       */
12104      function isPlainObject(value) {
12105        if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
12106          return false;
12107        }
12108        var proto = getPrototype(value);
12109        if (proto === null) {
12110          return true;
12111        }
12112        var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
12113        return typeof Ctor == 'function' && Ctor instanceof Ctor &&
12114          funcToString.call(Ctor) == objectCtorString;
12115      }
12116  
12117      /**
12118       * Checks if `value` is classified as a `RegExp` object.
12119       *
12120       * @static
12121       * @memberOf _
12122       * @since 0.1.0
12123       * @category Lang
12124       * @param {*} value The value to check.
12125       * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
12126       * @example
12127       *
12128       * _.isRegExp(/abc/);
12129       * // => true
12130       *
12131       * _.isRegExp('/abc/');
12132       * // => false
12133       */
12134      var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
12135  
12136      /**
12137       * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
12138       * double precision number which isn't the result of a rounded unsafe integer.
12139       *
12140       * **Note:** This method is based on
12141       * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
12142       *
12143       * @static
12144       * @memberOf _
12145       * @since 4.0.0
12146       * @category Lang
12147       * @param {*} value The value to check.
12148       * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
12149       * @example
12150       *
12151       * _.isSafeInteger(3);
12152       * // => true
12153       *
12154       * _.isSafeInteger(Number.MIN_VALUE);
12155       * // => false
12156       *
12157       * _.isSafeInteger(Infinity);
12158       * // => false
12159       *
12160       * _.isSafeInteger('3');
12161       * // => false
12162       */
12163      function isSafeInteger(value) {
12164        return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
12165      }
12166  
12167      /**
12168       * Checks if `value` is classified as a `Set` object.
12169       *
12170       * @static
12171       * @memberOf _
12172       * @since 4.3.0
12173       * @category Lang
12174       * @param {*} value The value to check.
12175       * @returns {boolean} Returns `true` if `value` is a set, else `false`.
12176       * @example
12177       *
12178       * _.isSet(new Set);
12179       * // => true
12180       *
12181       * _.isSet(new WeakSet);
12182       * // => false
12183       */
12184      var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
12185  
12186      /**
12187       * Checks if `value` is classified as a `String` primitive or object.
12188       *
12189       * @static
12190       * @since 0.1.0
12191       * @memberOf _
12192       * @category Lang
12193       * @param {*} value The value to check.
12194       * @returns {boolean} Returns `true` if `value` is a string, else `false`.
12195       * @example
12196       *
12197       * _.isString('abc');
12198       * // => true
12199       *
12200       * _.isString(1);
12201       * // => false
12202       */
12203      function isString(value) {
12204        return typeof value == 'string' ||
12205          (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
12206      }
12207  
12208      /**
12209       * Checks if `value` is classified as a `Symbol` primitive or object.
12210       *
12211       * @static
12212       * @memberOf _
12213       * @since 4.0.0
12214       * @category Lang
12215       * @param {*} value The value to check.
12216       * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
12217       * @example
12218       *
12219       * _.isSymbol(Symbol.iterator);
12220       * // => true
12221       *
12222       * _.isSymbol('abc');
12223       * // => false
12224       */
12225      function isSymbol(value) {
12226        return typeof value == 'symbol' ||
12227          (isObjectLike(value) && baseGetTag(value) == symbolTag);
12228      }
12229  
12230      /**
12231       * Checks if `value` is classified as a typed array.
12232       *
12233       * @static
12234       * @memberOf _
12235       * @since 3.0.0
12236       * @category Lang
12237       * @param {*} value The value to check.
12238       * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
12239       * @example
12240       *
12241       * _.isTypedArray(new Uint8Array);
12242       * // => true
12243       *
12244       * _.isTypedArray([]);
12245       * // => false
12246       */
12247      var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
12248  
12249      /**
12250       * Checks if `value` is `undefined`.
12251       *
12252       * @static
12253       * @since 0.1.0
12254       * @memberOf _
12255       * @category Lang
12256       * @param {*} value The value to check.
12257       * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
12258       * @example
12259       *
12260       * _.isUndefined(void 0);
12261       * // => true
12262       *
12263       * _.isUndefined(null);
12264       * // => false
12265       */
12266      function isUndefined(value) {
12267        return value === undefined;
12268      }
12269  
12270      /**
12271       * Checks if `value` is classified as a `WeakMap` object.
12272       *
12273       * @static
12274       * @memberOf _
12275       * @since 4.3.0
12276       * @category Lang
12277       * @param {*} value The value to check.
12278       * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
12279       * @example
12280       *
12281       * _.isWeakMap(new WeakMap);
12282       * // => true
12283       *
12284       * _.isWeakMap(new Map);
12285       * // => false
12286       */
12287      function isWeakMap(value) {
12288        return isObjectLike(value) && getTag(value) == weakMapTag;
12289      }
12290  
12291      /**
12292       * Checks if `value` is classified as a `WeakSet` object.
12293       *
12294       * @static
12295       * @memberOf _
12296       * @since 4.3.0
12297       * @category Lang
12298       * @param {*} value The value to check.
12299       * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
12300       * @example
12301       *
12302       * _.isWeakSet(new WeakSet);
12303       * // => true
12304       *
12305       * _.isWeakSet(new Set);
12306       * // => false
12307       */
12308      function isWeakSet(value) {
12309        return isObjectLike(value) && baseGetTag(value) == weakSetTag;
12310      }
12311  
12312      /**
12313       * Checks if `value` is less than `other`.
12314       *
12315       * @static
12316       * @memberOf _
12317       * @since 3.9.0
12318       * @category Lang
12319       * @param {*} value The value to compare.
12320       * @param {*} other The other value to compare.
12321       * @returns {boolean} Returns `true` if `value` is less than `other`,
12322       *  else `false`.
12323       * @see _.gt
12324       * @example
12325       *
12326       * _.lt(1, 3);
12327       * // => true
12328       *
12329       * _.lt(3, 3);
12330       * // => false
12331       *
12332       * _.lt(3, 1);
12333       * // => false
12334       */
12335      var lt = createRelationalOperation(baseLt);
12336  
12337      /**
12338       * Checks if `value` is less than or equal to `other`.
12339       *
12340       * @static
12341       * @memberOf _
12342       * @since 3.9.0
12343       * @category Lang
12344       * @param {*} value The value to compare.
12345       * @param {*} other The other value to compare.
12346       * @returns {boolean} Returns `true` if `value` is less than or equal to
12347       *  `other`, else `false`.
12348       * @see _.gte
12349       * @example
12350       *
12351       * _.lte(1, 3);
12352       * // => true
12353       *
12354       * _.lte(3, 3);
12355       * // => true
12356       *
12357       * _.lte(3, 1);
12358       * // => false
12359       */
12360      var lte = createRelationalOperation(function(value, other) {
12361        return value <= other;
12362      });
12363  
12364      /**
12365       * Converts `value` to an array.
12366       *
12367       * @static
12368       * @since 0.1.0
12369       * @memberOf _
12370       * @category Lang
12371       * @param {*} value The value to convert.
12372       * @returns {Array} Returns the converted array.
12373       * @example
12374       *
12375       * _.toArray({ 'a': 1, 'b': 2 });
12376       * // => [1, 2]
12377       *
12378       * _.toArray('abc');
12379       * // => ['a', 'b', 'c']
12380       *
12381       * _.toArray(1);
12382       * // => []
12383       *
12384       * _.toArray(null);
12385       * // => []
12386       */
12387      function toArray(value) {
12388        if (!value) {
12389          return [];
12390        }
12391        if (isArrayLike(value)) {
12392          return isString(value) ? stringToArray(value) : copyArray(value);
12393        }
12394        if (symIterator && value[symIterator]) {
12395          return iteratorToArray(value[symIterator]());
12396        }
12397        var tag = getTag(value),
12398            func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
12399  
12400        return func(value);
12401      }
12402  
12403      /**
12404       * Converts `value` to a finite number.
12405       *
12406       * @static
12407       * @memberOf _
12408       * @since 4.12.0
12409       * @category Lang
12410       * @param {*} value The value to convert.
12411       * @returns {number} Returns the converted number.
12412       * @example
12413       *
12414       * _.toFinite(3.2);
12415       * // => 3.2
12416       *
12417       * _.toFinite(Number.MIN_VALUE);
12418       * // => 5e-324
12419       *
12420       * _.toFinite(Infinity);
12421       * // => 1.7976931348623157e+308
12422       *
12423       * _.toFinite('3.2');
12424       * // => 3.2
12425       */
12426      function toFinite(value) {
12427        if (!value) {
12428          return value === 0 ? value : 0;
12429        }
12430        value = toNumber(value);
12431        if (value === INFINITY || value === -INFINITY) {
12432          var sign = (value < 0 ? -1 : 1);
12433          return sign * MAX_INTEGER;
12434        }
12435        return value === value ? value : 0;
12436      }
12437  
12438      /**
12439       * Converts `value` to an integer.
12440       *
12441       * **Note:** This method is loosely based on
12442       * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
12443       *
12444       * @static
12445       * @memberOf _
12446       * @since 4.0.0
12447       * @category Lang
12448       * @param {*} value The value to convert.
12449       * @returns {number} Returns the converted integer.
12450       * @example
12451       *
12452       * _.toInteger(3.2);
12453       * // => 3
12454       *
12455       * _.toInteger(Number.MIN_VALUE);
12456       * // => 0
12457       *
12458       * _.toInteger(Infinity);
12459       * // => 1.7976931348623157e+308
12460       *
12461       * _.toInteger('3.2');
12462       * // => 3
12463       */
12464      function toInteger(value) {
12465        var result = toFinite(value),
12466            remainder = result % 1;
12467  
12468        return result === result ? (remainder ? result - remainder : result) : 0;
12469      }
12470  
12471      /**
12472       * Converts `value` to an integer suitable for use as the length of an
12473       * array-like object.
12474       *
12475       * **Note:** This method is based on
12476       * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
12477       *
12478       * @static
12479       * @memberOf _
12480       * @since 4.0.0
12481       * @category Lang
12482       * @param {*} value The value to convert.
12483       * @returns {number} Returns the converted integer.
12484       * @example
12485       *
12486       * _.toLength(3.2);
12487       * // => 3
12488       *
12489       * _.toLength(Number.MIN_VALUE);
12490       * // => 0
12491       *
12492       * _.toLength(Infinity);
12493       * // => 4294967295
12494       *
12495       * _.toLength('3.2');
12496       * // => 3
12497       */
12498      function toLength(value) {
12499        return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
12500      }
12501  
12502      /**
12503       * Converts `value` to a number.
12504       *
12505       * @static
12506       * @memberOf _
12507       * @since 4.0.0
12508       * @category Lang
12509       * @param {*} value The value to process.
12510       * @returns {number} Returns the number.
12511       * @example
12512       *
12513       * _.toNumber(3.2);
12514       * // => 3.2
12515       *
12516       * _.toNumber(Number.MIN_VALUE);
12517       * // => 5e-324
12518       *
12519       * _.toNumber(Infinity);
12520       * // => Infinity
12521       *
12522       * _.toNumber('3.2');
12523       * // => 3.2
12524       */
12525      function toNumber(value) {
12526        if (typeof value == 'number') {
12527          return value;
12528        }
12529        if (isSymbol(value)) {
12530          return NAN;
12531        }
12532        if (isObject(value)) {
12533          var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
12534          value = isObject(other) ? (other + '') : other;
12535        }
12536        if (typeof value != 'string') {
12537          return value === 0 ? value : +value;
12538        }
12539        value = baseTrim(value);
12540        var isBinary = reIsBinary.test(value);
12541        return (isBinary || reIsOctal.test(value))
12542          ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
12543          : (reIsBadHex.test(value) ? NAN : +value);
12544      }
12545  
12546      /**
12547       * Converts `value` to a plain object flattening inherited enumerable string
12548       * keyed properties of `value` to own properties of the plain object.
12549       *
12550       * @static
12551       * @memberOf _
12552       * @since 3.0.0
12553       * @category Lang
12554       * @param {*} value The value to convert.
12555       * @returns {Object} Returns the converted plain object.
12556       * @example
12557       *
12558       * function Foo() {
12559       *   this.b = 2;
12560       * }
12561       *
12562       * Foo.prototype.c = 3;
12563       *
12564       * _.assign({ 'a': 1 }, new Foo);
12565       * // => { 'a': 1, 'b': 2 }
12566       *
12567       * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
12568       * // => { 'a': 1, 'b': 2, 'c': 3 }
12569       */
12570      function toPlainObject(value) {
12571        return copyObject(value, keysIn(value));
12572      }
12573  
12574      /**
12575       * Converts `value` to a safe integer. A safe integer can be compared and
12576       * represented correctly.
12577       *
12578       * @static
12579       * @memberOf _
12580       * @since 4.0.0
12581       * @category Lang
12582       * @param {*} value The value to convert.
12583       * @returns {number} Returns the converted integer.
12584       * @example
12585       *
12586       * _.toSafeInteger(3.2);
12587       * // => 3
12588       *
12589       * _.toSafeInteger(Number.MIN_VALUE);
12590       * // => 0
12591       *
12592       * _.toSafeInteger(Infinity);
12593       * // => 9007199254740991
12594       *
12595       * _.toSafeInteger('3.2');
12596       * // => 3
12597       */
12598      function toSafeInteger(value) {
12599        return value
12600          ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
12601          : (value === 0 ? value : 0);
12602      }
12603  
12604      /**
12605       * Converts `value` to a string. An empty string is returned for `null`
12606       * and `undefined` values. The sign of `-0` is preserved.
12607       *
12608       * @static
12609       * @memberOf _
12610       * @since 4.0.0
12611       * @category Lang
12612       * @param {*} value The value to convert.
12613       * @returns {string} Returns the converted string.
12614       * @example
12615       *
12616       * _.toString(null);
12617       * // => ''
12618       *
12619       * _.toString(-0);
12620       * // => '-0'
12621       *
12622       * _.toString([1, 2, 3]);
12623       * // => '1,2,3'
12624       */
12625      function toString(value) {
12626        return value == null ? '' : baseToString(value);
12627      }
12628  
12629      /*------------------------------------------------------------------------*/
12630  
12631      /**
12632       * Assigns own enumerable string keyed properties of source objects to the
12633       * destination object. Source objects are applied from left to right.
12634       * Subsequent sources overwrite property assignments of previous sources.
12635       *
12636       * **Note:** This method mutates `object` and is loosely based on
12637       * [`Object.assign`](https://mdn.io/Object/assign).
12638       *
12639       * @static
12640       * @memberOf _
12641       * @since 0.10.0
12642       * @category Object
12643       * @param {Object} object The destination object.
12644       * @param {...Object} [sources] The source objects.
12645       * @returns {Object} Returns `object`.
12646       * @see _.assignIn
12647       * @example
12648       *
12649       * function Foo() {
12650       *   this.a = 1;
12651       * }
12652       *
12653       * function Bar() {
12654       *   this.c = 3;
12655       * }
12656       *
12657       * Foo.prototype.b = 2;
12658       * Bar.prototype.d = 4;
12659       *
12660       * _.assign({ 'a': 0 }, new Foo, new Bar);
12661       * // => { 'a': 1, 'c': 3 }
12662       */
12663      var assign = createAssigner(function(object, source) {
12664        if (isPrototype(source) || isArrayLike(source)) {
12665          copyObject(source, keys(source), object);
12666          return;
12667        }
12668        for (var key in source) {
12669          if (hasOwnProperty.call(source, key)) {
12670            assignValue(object, key, source[key]);
12671          }
12672        }
12673      });
12674  
12675      /**
12676       * This method is like `_.assign` except that it iterates over own and
12677       * inherited source properties.
12678       *
12679       * **Note:** This method mutates `object`.
12680       *
12681       * @static
12682       * @memberOf _
12683       * @since 4.0.0
12684       * @alias extend
12685       * @category Object
12686       * @param {Object} object The destination object.
12687       * @param {...Object} [sources] The source objects.
12688       * @returns {Object} Returns `object`.
12689       * @see _.assign
12690       * @example
12691       *
12692       * function Foo() {
12693       *   this.a = 1;
12694       * }
12695       *
12696       * function Bar() {
12697       *   this.c = 3;
12698       * }
12699       *
12700       * Foo.prototype.b = 2;
12701       * Bar.prototype.d = 4;
12702       *
12703       * _.assignIn({ 'a': 0 }, new Foo, new Bar);
12704       * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
12705       */
12706      var assignIn = createAssigner(function(object, source) {
12707        copyObject(source, keysIn(source), object);
12708      });
12709  
12710      /**
12711       * This method is like `_.assignIn` except that it accepts `customizer`
12712       * which is invoked to produce the assigned values. If `customizer` returns
12713       * `undefined`, assignment is handled by the method instead. The `customizer`
12714       * is invoked with five arguments: (objValue, srcValue, key, object, source).
12715       *
12716       * **Note:** This method mutates `object`.
12717       *
12718       * @static
12719       * @memberOf _
12720       * @since 4.0.0
12721       * @alias extendWith
12722       * @category Object
12723       * @param {Object} object The destination object.
12724       * @param {...Object} sources The source objects.
12725       * @param {Function} [customizer] The function to customize assigned values.
12726       * @returns {Object} Returns `object`.
12727       * @see _.assignWith
12728       * @example
12729       *
12730       * function customizer(objValue, srcValue) {
12731       *   return _.isUndefined(objValue) ? srcValue : objValue;
12732       * }
12733       *
12734       * var defaults = _.partialRight(_.assignInWith, customizer);
12735       *
12736       * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12737       * // => { 'a': 1, 'b': 2 }
12738       */
12739      var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
12740        copyObject(source, keysIn(source), object, customizer);
12741      });
12742  
12743      /**
12744       * This method is like `_.assign` except that it accepts `customizer`
12745       * which is invoked to produce the assigned values. If `customizer` returns
12746       * `undefined`, assignment is handled by the method instead. The `customizer`
12747       * is invoked with five arguments: (objValue, srcValue, key, object, source).
12748       *
12749       * **Note:** This method mutates `object`.
12750       *
12751       * @static
12752       * @memberOf _
12753       * @since 4.0.0
12754       * @category Object
12755       * @param {Object} object The destination object.
12756       * @param {...Object} sources The source objects.
12757       * @param {Function} [customizer] The function to customize assigned values.
12758       * @returns {Object} Returns `object`.
12759       * @see _.assignInWith
12760       * @example
12761       *
12762       * function customizer(objValue, srcValue) {
12763       *   return _.isUndefined(objValue) ? srcValue : objValue;
12764       * }
12765       *
12766       * var defaults = _.partialRight(_.assignWith, customizer);
12767       *
12768       * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12769       * // => { 'a': 1, 'b': 2 }
12770       */
12771      var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
12772        copyObject(source, keys(source), object, customizer);
12773      });
12774  
12775      /**
12776       * Creates an array of values corresponding to `paths` of `object`.
12777       *
12778       * @static
12779       * @memberOf _
12780       * @since 1.0.0
12781       * @category Object
12782       * @param {Object} object The object to iterate over.
12783       * @param {...(string|string[])} [paths] The property paths to pick.
12784       * @returns {Array} Returns the picked values.
12785       * @example
12786       *
12787       * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
12788       *
12789       * _.at(object, ['a[0].b.c', 'a[1]']);
12790       * // => [3, 4]
12791       */
12792      var at = flatRest(baseAt);
12793  
12794      /**
12795       * Creates an object that inherits from the `prototype` object. If a
12796       * `properties` object is given, its own enumerable string keyed properties
12797       * are assigned to the created object.
12798       *
12799       * @static
12800       * @memberOf _
12801       * @since 2.3.0
12802       * @category Object
12803       * @param {Object} prototype The object to inherit from.
12804       * @param {Object} [properties] The properties to assign to the object.
12805       * @returns {Object} Returns the new object.
12806       * @example
12807       *
12808       * function Shape() {
12809       *   this.x = 0;
12810       *   this.y = 0;
12811       * }
12812       *
12813       * function Circle() {
12814       *   Shape.call(this);
12815       * }
12816       *
12817       * Circle.prototype = _.create(Shape.prototype, {
12818       *   'constructor': Circle
12819       * });
12820       *
12821       * var circle = new Circle;
12822       * circle instanceof Circle;
12823       * // => true
12824       *
12825       * circle instanceof Shape;
12826       * // => true
12827       */
12828      function create(prototype, properties) {
12829        var result = baseCreate(prototype);
12830        return properties == null ? result : baseAssign(result, properties);
12831      }
12832  
12833      /**
12834       * Assigns own and inherited enumerable string keyed properties of source
12835       * objects to the destination object for all destination properties that
12836       * resolve to `undefined`. Source objects are applied from left to right.
12837       * Once a property is set, additional values of the same property are ignored.
12838       *
12839       * **Note:** This method mutates `object`.
12840       *
12841       * @static
12842       * @since 0.1.0
12843       * @memberOf _
12844       * @category Object
12845       * @param {Object} object The destination object.
12846       * @param {...Object} [sources] The source objects.
12847       * @returns {Object} Returns `object`.
12848       * @see _.defaultsDeep
12849       * @example
12850       *
12851       * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12852       * // => { 'a': 1, 'b': 2 }
12853       */
12854      var defaults = baseRest(function(object, sources) {
12855        object = Object(object);
12856  
12857        var index = -1;
12858        var length = sources.length;
12859        var guard = length > 2 ? sources[2] : undefined;
12860  
12861        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
12862          length = 1;
12863        }
12864  
12865        while (++index < length) {
12866          var source = sources[index];
12867          var props = keysIn(source);
12868          var propsIndex = -1;
12869          var propsLength = props.length;
12870  
12871          while (++propsIndex < propsLength) {
12872            var key = props[propsIndex];
12873            var value = object[key];
12874  
12875            if (value === undefined ||
12876                (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
12877              object[key] = source[key];
12878            }
12879          }
12880        }
12881  
12882        return object;
12883      });
12884  
12885      /**
12886       * This method is like `_.defaults` except that it recursively assigns
12887       * default properties.
12888       *
12889       * **Note:** This method mutates `object`.
12890       *
12891       * @static
12892       * @memberOf _
12893       * @since 3.10.0
12894       * @category Object
12895       * @param {Object} object The destination object.
12896       * @param {...Object} [sources] The source objects.
12897       * @returns {Object} Returns `object`.
12898       * @see _.defaults
12899       * @example
12900       *
12901       * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
12902       * // => { 'a': { 'b': 2, 'c': 3 } }
12903       */
12904      var defaultsDeep = baseRest(function(args) {
12905        args.push(undefined, customDefaultsMerge);
12906        return apply(mergeWith, undefined, args);
12907      });
12908  
12909      /**
12910       * This method is like `_.find` except that it returns the key of the first
12911       * element `predicate` returns truthy for instead of the element itself.
12912       *
12913       * @static
12914       * @memberOf _
12915       * @since 1.1.0
12916       * @category Object
12917       * @param {Object} object The object to inspect.
12918       * @param {Function} [predicate=_.identity] The function invoked per iteration.
12919       * @returns {string|undefined} Returns the key of the matched element,
12920       *  else `undefined`.
12921       * @example
12922       *
12923       * var users = {
12924       *   'barney':  { 'age': 36, 'active': true },
12925       *   'fred':    { 'age': 40, 'active': false },
12926       *   'pebbles': { 'age': 1,  'active': true }
12927       * };
12928       *
12929       * _.findKey(users, function(o) { return o.age < 40; });
12930       * // => 'barney' (iteration order is not guaranteed)
12931       *
12932       * // The `_.matches` iteratee shorthand.
12933       * _.findKey(users, { 'age': 1, 'active': true });
12934       * // => 'pebbles'
12935       *
12936       * // The `_.matchesProperty` iteratee shorthand.
12937       * _.findKey(users, ['active', false]);
12938       * // => 'fred'
12939       *
12940       * // The `_.property` iteratee shorthand.
12941       * _.findKey(users, 'active');
12942       * // => 'barney'
12943       */
12944      function findKey(object, predicate) {
12945        return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
12946      }
12947  
12948      /**
12949       * This method is like `_.findKey` except that it iterates over elements of
12950       * a collection in the opposite order.
12951       *
12952       * @static
12953       * @memberOf _
12954       * @since 2.0.0
12955       * @category Object
12956       * @param {Object} object The object to inspect.
12957       * @param {Function} [predicate=_.identity] The function invoked per iteration.
12958       * @returns {string|undefined} Returns the key of the matched element,
12959       *  else `undefined`.
12960       * @example
12961       *
12962       * var users = {
12963       *   'barney':  { 'age': 36, 'active': true },
12964       *   'fred':    { 'age': 40, 'active': false },
12965       *   'pebbles': { 'age': 1,  'active': true }
12966       * };
12967       *
12968       * _.findLastKey(users, function(o) { return o.age < 40; });
12969       * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
12970       *
12971       * // The `_.matches` iteratee shorthand.
12972       * _.findLastKey(users, { 'age': 36, 'active': true });
12973       * // => 'barney'
12974       *
12975       * // The `_.matchesProperty` iteratee shorthand.
12976       * _.findLastKey(users, ['active', false]);
12977       * // => 'fred'
12978       *
12979       * // The `_.property` iteratee shorthand.
12980       * _.findLastKey(users, 'active');
12981       * // => 'pebbles'
12982       */
12983      function findLastKey(object, predicate) {
12984        return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
12985      }
12986  
12987      /**
12988       * Iterates over own and inherited enumerable string keyed properties of an
12989       * object and invokes `iteratee` for each property. The iteratee is invoked
12990       * with three arguments: (value, key, object). Iteratee functions may exit
12991       * iteration early by explicitly returning `false`.
12992       *
12993       * @static
12994       * @memberOf _
12995       * @since 0.3.0
12996       * @category Object
12997       * @param {Object} object The object to iterate over.
12998       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12999       * @returns {Object} Returns `object`.
13000       * @see _.forInRight
13001       * @example
13002       *
13003       * function Foo() {
13004       *   this.a = 1;
13005       *   this.b = 2;
13006       * }
13007       *
13008       * Foo.prototype.c = 3;
13009       *
13010       * _.forIn(new Foo, function(value, key) {
13011       *   console.log(key);
13012       * });
13013       * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
13014       */
13015      function forIn(object, iteratee) {
13016        return object == null
13017          ? object
13018          : baseFor(object, getIteratee(iteratee, 3), keysIn);
13019      }
13020  
13021      /**
13022       * This method is like `_.forIn` except that it iterates over properties of
13023       * `object` in the opposite order.
13024       *
13025       * @static
13026       * @memberOf _
13027       * @since 2.0.0
13028       * @category Object
13029       * @param {Object} object The object to iterate over.
13030       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13031       * @returns {Object} Returns `object`.
13032       * @see _.forIn
13033       * @example
13034       *
13035       * function Foo() {
13036       *   this.a = 1;
13037       *   this.b = 2;
13038       * }
13039       *
13040       * Foo.prototype.c = 3;
13041       *
13042       * _.forInRight(new Foo, function(value, key) {
13043       *   console.log(key);
13044       * });
13045       * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
13046       */
13047      function forInRight(object, iteratee) {
13048        return object == null
13049          ? object
13050          : baseForRight(object, getIteratee(iteratee, 3), keysIn);
13051      }
13052  
13053      /**
13054       * Iterates over own enumerable string keyed properties of an object and
13055       * invokes `iteratee` for each property. The iteratee is invoked with three
13056       * arguments: (value, key, object). Iteratee functions may exit iteration
13057       * early by explicitly returning `false`.
13058       *
13059       * @static
13060       * @memberOf _
13061       * @since 0.3.0
13062       * @category Object
13063       * @param {Object} object The object to iterate over.
13064       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13065       * @returns {Object} Returns `object`.
13066       * @see _.forOwnRight
13067       * @example
13068       *
13069       * function Foo() {
13070       *   this.a = 1;
13071       *   this.b = 2;
13072       * }
13073       *
13074       * Foo.prototype.c = 3;
13075       *
13076       * _.forOwn(new Foo, function(value, key) {
13077       *   console.log(key);
13078       * });
13079       * // => Logs 'a' then 'b' (iteration order is not guaranteed).
13080       */
13081      function forOwn(object, iteratee) {
13082        return object && baseForOwn(object, getIteratee(iteratee, 3));
13083      }
13084  
13085      /**
13086       * This method is like `_.forOwn` except that it iterates over properties of
13087       * `object` in the opposite order.
13088       *
13089       * @static
13090       * @memberOf _
13091       * @since 2.0.0
13092       * @category Object
13093       * @param {Object} object The object to iterate over.
13094       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13095       * @returns {Object} Returns `object`.
13096       * @see _.forOwn
13097       * @example
13098       *
13099       * function Foo() {
13100       *   this.a = 1;
13101       *   this.b = 2;
13102       * }
13103       *
13104       * Foo.prototype.c = 3;
13105       *
13106       * _.forOwnRight(new Foo, function(value, key) {
13107       *   console.log(key);
13108       * });
13109       * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
13110       */
13111      function forOwnRight(object, iteratee) {
13112        return object && baseForOwnRight(object, getIteratee(iteratee, 3));
13113      }
13114  
13115      /**
13116       * Creates an array of function property names from own enumerable properties
13117       * of `object`.
13118       *
13119       * @static
13120       * @since 0.1.0
13121       * @memberOf _
13122       * @category Object
13123       * @param {Object} object The object to inspect.
13124       * @returns {Array} Returns the function names.
13125       * @see _.functionsIn
13126       * @example
13127       *
13128       * function Foo() {
13129       *   this.a = _.constant('a');
13130       *   this.b = _.constant('b');
13131       * }
13132       *
13133       * Foo.prototype.c = _.constant('c');
13134       *
13135       * _.functions(new Foo);
13136       * // => ['a', 'b']
13137       */
13138      function functions(object) {
13139        return object == null ? [] : baseFunctions(object, keys(object));
13140      }
13141  
13142      /**
13143       * Creates an array of function property names from own and inherited
13144       * enumerable properties of `object`.
13145       *
13146       * @static
13147       * @memberOf _
13148       * @since 4.0.0
13149       * @category Object
13150       * @param {Object} object The object to inspect.
13151       * @returns {Array} Returns the function names.
13152       * @see _.functions
13153       * @example
13154       *
13155       * function Foo() {
13156       *   this.a = _.constant('a');
13157       *   this.b = _.constant('b');
13158       * }
13159       *
13160       * Foo.prototype.c = _.constant('c');
13161       *
13162       * _.functionsIn(new Foo);
13163       * // => ['a', 'b', 'c']
13164       */
13165      function functionsIn(object) {
13166        return object == null ? [] : baseFunctions(object, keysIn(object));
13167      }
13168  
13169      /**
13170       * Gets the value at `path` of `object`. If the resolved value is
13171       * `undefined`, the `defaultValue` is returned in its place.
13172       *
13173       * @static
13174       * @memberOf _
13175       * @since 3.7.0
13176       * @category Object
13177       * @param {Object} object The object to query.
13178       * @param {Array|string} path The path of the property to get.
13179       * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13180       * @returns {*} Returns the resolved value.
13181       * @example
13182       *
13183       * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13184       *
13185       * _.get(object, 'a[0].b.c');
13186       * // => 3
13187       *
13188       * _.get(object, ['a', '0', 'b', 'c']);
13189       * // => 3
13190       *
13191       * _.get(object, 'a.b.c', 'default');
13192       * // => 'default'
13193       */
13194      function get(object, path, defaultValue) {
13195        var result = object == null ? undefined : baseGet(object, path);
13196        return result === undefined ? defaultValue : result;
13197      }
13198  
13199      /**
13200       * Checks if `path` is a direct property of `object`.
13201       *
13202       * @static
13203       * @since 0.1.0
13204       * @memberOf _
13205       * @category Object
13206       * @param {Object} object The object to query.
13207       * @param {Array|string} path The path to check.
13208       * @returns {boolean} Returns `true` if `path` exists, else `false`.
13209       * @example
13210       *
13211       * var object = { 'a': { 'b': 2 } };
13212       * var other = _.create({ 'a': _.create({ 'b': 2 }) });
13213       *
13214       * _.has(object, 'a');
13215       * // => true
13216       *
13217       * _.has(object, 'a.b');
13218       * // => true
13219       *
13220       * _.has(object, ['a', 'b']);
13221       * // => true
13222       *
13223       * _.has(other, 'a');
13224       * // => false
13225       */
13226      function has(object, path) {
13227        return object != null && hasPath(object, path, baseHas);
13228      }
13229  
13230      /**
13231       * Checks if `path` is a direct or inherited property of `object`.
13232       *
13233       * @static
13234       * @memberOf _
13235       * @since 4.0.0
13236       * @category Object
13237       * @param {Object} object The object to query.
13238       * @param {Array|string} path The path to check.
13239       * @returns {boolean} Returns `true` if `path` exists, else `false`.
13240       * @example
13241       *
13242       * var object = _.create({ 'a': _.create({ 'b': 2 }) });
13243       *
13244       * _.hasIn(object, 'a');
13245       * // => true
13246       *
13247       * _.hasIn(object, 'a.b');
13248       * // => true
13249       *
13250       * _.hasIn(object, ['a', 'b']);
13251       * // => true
13252       *
13253       * _.hasIn(object, 'b');
13254       * // => false
13255       */
13256      function hasIn(object, path) {
13257        return object != null && hasPath(object, path, baseHasIn);
13258      }
13259  
13260      /**
13261       * Creates an object composed of the inverted keys and values of `object`.
13262       * If `object` contains duplicate values, subsequent values overwrite
13263       * property assignments of previous values.
13264       *
13265       * @static
13266       * @memberOf _
13267       * @since 0.7.0
13268       * @category Object
13269       * @param {Object} object The object to invert.
13270       * @returns {Object} Returns the new inverted object.
13271       * @example
13272       *
13273       * var object = { 'a': 1, 'b': 2, 'c': 1 };
13274       *
13275       * _.invert(object);
13276       * // => { '1': 'c', '2': 'b' }
13277       */
13278      var invert = createInverter(function(result, value, key) {
13279        if (value != null &&
13280            typeof value.toString != 'function') {
13281          value = nativeObjectToString.call(value);
13282        }
13283  
13284        result[value] = key;
13285      }, constant(identity));
13286  
13287      /**
13288       * This method is like `_.invert` except that the inverted object is generated
13289       * from the results of running each element of `object` thru `iteratee`. The
13290       * corresponding inverted value of each inverted key is an array of keys
13291       * responsible for generating the inverted value. The iteratee is invoked
13292       * with one argument: (value).
13293       *
13294       * @static
13295       * @memberOf _
13296       * @since 4.1.0
13297       * @category Object
13298       * @param {Object} object The object to invert.
13299       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
13300       * @returns {Object} Returns the new inverted object.
13301       * @example
13302       *
13303       * var object = { 'a': 1, 'b': 2, 'c': 1 };
13304       *
13305       * _.invertBy(object);
13306       * // => { '1': ['a', 'c'], '2': ['b'] }
13307       *
13308       * _.invertBy(object, function(value) {
13309       *   return 'group' + value;
13310       * });
13311       * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
13312       */
13313      var invertBy = createInverter(function(result, value, key) {
13314        if (value != null &&
13315            typeof value.toString != 'function') {
13316          value = nativeObjectToString.call(value);
13317        }
13318  
13319        if (hasOwnProperty.call(result, value)) {
13320          result[value].push(key);
13321        } else {
13322          result[value] = [key];
13323        }
13324      }, getIteratee);
13325  
13326      /**
13327       * Invokes the method at `path` of `object`.
13328       *
13329       * @static
13330       * @memberOf _
13331       * @since 4.0.0
13332       * @category Object
13333       * @param {Object} object The object to query.
13334       * @param {Array|string} path The path of the method to invoke.
13335       * @param {...*} [args] The arguments to invoke the method with.
13336       * @returns {*} Returns the result of the invoked method.
13337       * @example
13338       *
13339       * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
13340       *
13341       * _.invoke(object, 'a[0].b.c.slice', 1, 3);
13342       * // => [2, 3]
13343       */
13344      var invoke = baseRest(baseInvoke);
13345  
13346      /**
13347       * Creates an array of the own enumerable property names of `object`.
13348       *
13349       * **Note:** Non-object values are coerced to objects. See the
13350       * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
13351       * for more details.
13352       *
13353       * @static
13354       * @since 0.1.0
13355       * @memberOf _
13356       * @category Object
13357       * @param {Object} object The object to query.
13358       * @returns {Array} Returns the array of property names.
13359       * @example
13360       *
13361       * function Foo() {
13362       *   this.a = 1;
13363       *   this.b = 2;
13364       * }
13365       *
13366       * Foo.prototype.c = 3;
13367       *
13368       * _.keys(new Foo);
13369       * // => ['a', 'b'] (iteration order is not guaranteed)
13370       *
13371       * _.keys('hi');
13372       * // => ['0', '1']
13373       */
13374      function keys(object) {
13375        return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
13376      }
13377  
13378      /**
13379       * Creates an array of the own and inherited enumerable property names of `object`.
13380       *
13381       * **Note:** Non-object values are coerced to objects.
13382       *
13383       * @static
13384       * @memberOf _
13385       * @since 3.0.0
13386       * @category Object
13387       * @param {Object} object The object to query.
13388       * @returns {Array} Returns the array of property names.
13389       * @example
13390       *
13391       * function Foo() {
13392       *   this.a = 1;
13393       *   this.b = 2;
13394       * }
13395       *
13396       * Foo.prototype.c = 3;
13397       *
13398       * _.keysIn(new Foo);
13399       * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
13400       */
13401      function keysIn(object) {
13402        return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
13403      }
13404  
13405      /**
13406       * The opposite of `_.mapValues`; this method creates an object with the
13407       * same values as `object` and keys generated by running each own enumerable
13408       * string keyed property of `object` thru `iteratee`. The iteratee is invoked
13409       * with three arguments: (value, key, object).
13410       *
13411       * @static
13412       * @memberOf _
13413       * @since 3.8.0
13414       * @category Object
13415       * @param {Object} object The object to iterate over.
13416       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13417       * @returns {Object} Returns the new mapped object.
13418       * @see _.mapValues
13419       * @example
13420       *
13421       * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
13422       *   return key + value;
13423       * });
13424       * // => { 'a1': 1, 'b2': 2 }
13425       */
13426      function mapKeys(object, iteratee) {
13427        var result = {};
13428        iteratee = getIteratee(iteratee, 3);
13429  
13430        baseForOwn(object, function(value, key, object) {
13431          baseAssignValue(result, iteratee(value, key, object), value);
13432        });
13433        return result;
13434      }
13435  
13436      /**
13437       * Creates an object with the same keys as `object` and values generated
13438       * by running each own enumerable string keyed property of `object` thru
13439       * `iteratee`. The iteratee is invoked with three arguments:
13440       * (value, key, object).
13441       *
13442       * @static
13443       * @memberOf _
13444       * @since 2.4.0
13445       * @category Object
13446       * @param {Object} object The object to iterate over.
13447       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13448       * @returns {Object} Returns the new mapped object.
13449       * @see _.mapKeys
13450       * @example
13451       *
13452       * var users = {
13453       *   'fred':    { 'user': 'fred',    'age': 40 },
13454       *   'pebbles': { 'user': 'pebbles', 'age': 1 }
13455       * };
13456       *
13457       * _.mapValues(users, function(o) { return o.age; });
13458       * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13459       *
13460       * // The `_.property` iteratee shorthand.
13461       * _.mapValues(users, 'age');
13462       * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13463       */
13464      function mapValues(object, iteratee) {
13465        var result = {};
13466        iteratee = getIteratee(iteratee, 3);
13467  
13468        baseForOwn(object, function(value, key, object) {
13469          baseAssignValue(result, key, iteratee(value, key, object));
13470        });
13471        return result;
13472      }
13473  
13474      /**
13475       * This method is like `_.assign` except that it recursively merges own and
13476       * inherited enumerable string keyed properties of source objects into the
13477       * destination object. Source properties that resolve to `undefined` are
13478       * skipped if a destination value exists. Array and plain object properties
13479       * are merged recursively. Other objects and value types are overridden by
13480       * assignment. Source objects are applied from left to right. Subsequent
13481       * sources overwrite property assignments of previous sources.
13482       *
13483       * **Note:** This method mutates `object`.
13484       *
13485       * @static
13486       * @memberOf _
13487       * @since 0.5.0
13488       * @category Object
13489       * @param {Object} object The destination object.
13490       * @param {...Object} [sources] The source objects.
13491       * @returns {Object} Returns `object`.
13492       * @example
13493       *
13494       * var object = {
13495       *   'a': [{ 'b': 2 }, { 'd': 4 }]
13496       * };
13497       *
13498       * var other = {
13499       *   'a': [{ 'c': 3 }, { 'e': 5 }]
13500       * };
13501       *
13502       * _.merge(object, other);
13503       * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
13504       */
13505      var merge = createAssigner(function(object, source, srcIndex) {
13506        baseMerge(object, source, srcIndex);
13507      });
13508  
13509      /**
13510       * This method is like `_.merge` except that it accepts `customizer` which
13511       * is invoked to produce the merged values of the destination and source
13512       * properties. If `customizer` returns `undefined`, merging is handled by the
13513       * method instead. The `customizer` is invoked with six arguments:
13514       * (objValue, srcValue, key, object, source, stack).
13515       *
13516       * **Note:** This method mutates `object`.
13517       *
13518       * @static
13519       * @memberOf _
13520       * @since 4.0.0
13521       * @category Object
13522       * @param {Object} object The destination object.
13523       * @param {...Object} sources The source objects.
13524       * @param {Function} customizer The function to customize assigned values.
13525       * @returns {Object} Returns `object`.
13526       * @example
13527       *
13528       * function customizer(objValue, srcValue) {
13529       *   if (_.isArray(objValue)) {
13530       *     return objValue.concat(srcValue);
13531       *   }
13532       * }
13533       *
13534       * var object = { 'a': [1], 'b': [2] };
13535       * var other = { 'a': [3], 'b': [4] };
13536       *
13537       * _.mergeWith(object, other, customizer);
13538       * // => { 'a': [1, 3], 'b': [2, 4] }
13539       */
13540      var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
13541        baseMerge(object, source, srcIndex, customizer);
13542      });
13543  
13544      /**
13545       * The opposite of `_.pick`; this method creates an object composed of the
13546       * own and inherited enumerable property paths of `object` that are not omitted.
13547       *
13548       * **Note:** This method is considerably slower than `_.pick`.
13549       *
13550       * @static
13551       * @since 0.1.0
13552       * @memberOf _
13553       * @category Object
13554       * @param {Object} object The source object.
13555       * @param {...(string|string[])} [paths] The property paths to omit.
13556       * @returns {Object} Returns the new object.
13557       * @example
13558       *
13559       * var object = { 'a': 1, 'b': '2', 'c': 3 };
13560       *
13561       * _.omit(object, ['a', 'c']);
13562       * // => { 'b': '2' }
13563       */
13564      var omit = flatRest(function(object, paths) {
13565        var result = {};
13566        if (object == null) {
13567          return result;
13568        }
13569        var isDeep = false;
13570        paths = arrayMap(paths, function(path) {
13571          path = castPath(path, object);
13572          isDeep || (isDeep = path.length > 1);
13573          return path;
13574        });
13575        copyObject(object, getAllKeysIn(object), result);
13576        if (isDeep) {
13577          result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
13578        }
13579        var length = paths.length;
13580        while (length--) {
13581          baseUnset(result, paths[length]);
13582        }
13583        return result;
13584      });
13585  
13586      /**
13587       * The opposite of `_.pickBy`; this method creates an object composed of
13588       * the own and inherited enumerable string keyed properties of `object` that
13589       * `predicate` doesn't return truthy for. The predicate is invoked with two
13590       * arguments: (value, key).
13591       *
13592       * @static
13593       * @memberOf _
13594       * @since 4.0.0
13595       * @category Object
13596       * @param {Object} object The source object.
13597       * @param {Function} [predicate=_.identity] The function invoked per property.
13598       * @returns {Object} Returns the new object.
13599       * @example
13600       *
13601       * var object = { 'a': 1, 'b': '2', 'c': 3 };
13602       *
13603       * _.omitBy(object, _.isNumber);
13604       * // => { 'b': '2' }
13605       */
13606      function omitBy(object, predicate) {
13607        return pickBy(object, negate(getIteratee(predicate)));
13608      }
13609  
13610      /**
13611       * Creates an object composed of the picked `object` properties.
13612       *
13613       * @static
13614       * @since 0.1.0
13615       * @memberOf _
13616       * @category Object
13617       * @param {Object} object The source object.
13618       * @param {...(string|string[])} [paths] The property paths to pick.
13619       * @returns {Object} Returns the new object.
13620       * @example
13621       *
13622       * var object = { 'a': 1, 'b': '2', 'c': 3 };
13623       *
13624       * _.pick(object, ['a', 'c']);
13625       * // => { 'a': 1, 'c': 3 }
13626       */
13627      var pick = flatRest(function(object, paths) {
13628        return object == null ? {} : basePick(object, paths);
13629      });
13630  
13631      /**
13632       * Creates an object composed of the `object` properties `predicate` returns
13633       * truthy for. The predicate is invoked with two arguments: (value, key).
13634       *
13635       * @static
13636       * @memberOf _
13637       * @since 4.0.0
13638       * @category Object
13639       * @param {Object} object The source object.
13640       * @param {Function} [predicate=_.identity] The function invoked per property.
13641       * @returns {Object} Returns the new object.
13642       * @example
13643       *
13644       * var object = { 'a': 1, 'b': '2', 'c': 3 };
13645       *
13646       * _.pickBy(object, _.isNumber);
13647       * // => { 'a': 1, 'c': 3 }
13648       */
13649      function pickBy(object, predicate) {
13650        if (object == null) {
13651          return {};
13652        }
13653        var props = arrayMap(getAllKeysIn(object), function(prop) {
13654          return [prop];
13655        });
13656        predicate = getIteratee(predicate);
13657        return basePickBy(object, props, function(value, path) {
13658          return predicate(value, path[0]);
13659        });
13660      }
13661  
13662      /**
13663       * This method is like `_.get` except that if the resolved value is a
13664       * function it's invoked with the `this` binding of its parent object and
13665       * its result is returned.
13666       *
13667       * @static
13668       * @since 0.1.0
13669       * @memberOf _
13670       * @category Object
13671       * @param {Object} object The object to query.
13672       * @param {Array|string} path The path of the property to resolve.
13673       * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13674       * @returns {*} Returns the resolved value.
13675       * @example
13676       *
13677       * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
13678       *
13679       * _.result(object, 'a[0].b.c1');
13680       * // => 3
13681       *
13682       * _.result(object, 'a[0].b.c2');
13683       * // => 4
13684       *
13685       * _.result(object, 'a[0].b.c3', 'default');
13686       * // => 'default'
13687       *
13688       * _.result(object, 'a[0].b.c3', _.constant('default'));
13689       * // => 'default'
13690       */
13691      function result(object, path, defaultValue) {
13692        path = castPath(path, object);
13693  
13694        var index = -1,
13695            length = path.length;
13696  
13697        // Ensure the loop is entered when path is empty.
13698        if (!length) {
13699          length = 1;
13700          object = undefined;
13701        }
13702        while (++index < length) {
13703          var value = object == null ? undefined : object[toKey(path[index])];
13704          if (value === undefined) {
13705            index = length;
13706            value = defaultValue;
13707          }
13708          object = isFunction(value) ? value.call(object) : value;
13709        }
13710        return object;
13711      }
13712  
13713      /**
13714       * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
13715       * it's created. Arrays are created for missing index properties while objects
13716       * are created for all other missing properties. Use `_.setWith` to customize
13717       * `path` creation.
13718       *
13719       * **Note:** This method mutates `object`.
13720       *
13721       * @static
13722       * @memberOf _
13723       * @since 3.7.0
13724       * @category Object
13725       * @param {Object} object The object to modify.
13726       * @param {Array|string} path The path of the property to set.
13727       * @param {*} value The value to set.
13728       * @returns {Object} Returns `object`.
13729       * @example
13730       *
13731       * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13732       *
13733       * _.set(object, 'a[0].b.c', 4);
13734       * console.log(object.a[0].b.c);
13735       * // => 4
13736       *
13737       * _.set(object, ['x', '0', 'y', 'z'], 5);
13738       * console.log(object.x[0].y.z);
13739       * // => 5
13740       */
13741      function set(object, path, value) {
13742        return object == null ? object : baseSet(object, path, value);
13743      }
13744  
13745      /**
13746       * This method is like `_.set` except that it accepts `customizer` which is
13747       * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13748       * path creation is handled by the method instead. The `customizer` is invoked
13749       * with three arguments: (nsValue, key, nsObject).
13750       *
13751       * **Note:** This method mutates `object`.
13752       *
13753       * @static
13754       * @memberOf _
13755       * @since 4.0.0
13756       * @category Object
13757       * @param {Object} object The object to modify.
13758       * @param {Array|string} path The path of the property to set.
13759       * @param {*} value The value to set.
13760       * @param {Function} [customizer] The function to customize assigned values.
13761       * @returns {Object} Returns `object`.
13762       * @example
13763       *
13764       * var object = {};
13765       *
13766       * _.setWith(object, '[0][1]', 'a', Object);
13767       * // => { '0': { '1': 'a' } }
13768       */
13769      function setWith(object, path, value, customizer) {
13770        customizer = typeof customizer == 'function' ? customizer : undefined;
13771        return object == null ? object : baseSet(object, path, value, customizer);
13772      }
13773  
13774      /**
13775       * Creates an array of own enumerable string keyed-value pairs for `object`
13776       * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
13777       * entries are returned.
13778       *
13779       * @static
13780       * @memberOf _
13781       * @since 4.0.0
13782       * @alias entries
13783       * @category Object
13784       * @param {Object} object The object to query.
13785       * @returns {Array} Returns the key-value pairs.
13786       * @example
13787       *
13788       * function Foo() {
13789       *   this.a = 1;
13790       *   this.b = 2;
13791       * }
13792       *
13793       * Foo.prototype.c = 3;
13794       *
13795       * _.toPairs(new Foo);
13796       * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
13797       */
13798      var toPairs = createToPairs(keys);
13799  
13800      /**
13801       * Creates an array of own and inherited enumerable string keyed-value pairs
13802       * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
13803       * or set, its entries are returned.
13804       *
13805       * @static
13806       * @memberOf _
13807       * @since 4.0.0
13808       * @alias entriesIn
13809       * @category Object
13810       * @param {Object} object The object to query.
13811       * @returns {Array} Returns the key-value pairs.
13812       * @example
13813       *
13814       * function Foo() {
13815       *   this.a = 1;
13816       *   this.b = 2;
13817       * }
13818       *
13819       * Foo.prototype.c = 3;
13820       *
13821       * _.toPairsIn(new Foo);
13822       * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
13823       */
13824      var toPairsIn = createToPairs(keysIn);
13825  
13826      /**
13827       * An alternative to `_.reduce`; this method transforms `object` to a new
13828       * `accumulator` object which is the result of running each of its own
13829       * enumerable string keyed properties thru `iteratee`, with each invocation
13830       * potentially mutating the `accumulator` object. If `accumulator` is not
13831       * provided, a new object with the same `[[Prototype]]` will be used. The
13832       * iteratee is invoked with four arguments: (accumulator, value, key, object).
13833       * Iteratee functions may exit iteration early by explicitly returning `false`.
13834       *
13835       * @static
13836       * @memberOf _
13837       * @since 1.3.0
13838       * @category Object
13839       * @param {Object} object The object to iterate over.
13840       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13841       * @param {*} [accumulator] The custom accumulator value.
13842       * @returns {*} Returns the accumulated value.
13843       * @example
13844       *
13845       * _.transform([2, 3, 4], function(result, n) {
13846       *   result.push(n *= n);
13847       *   return n % 2 == 0;
13848       * }, []);
13849       * // => [4, 9]
13850       *
13851       * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
13852       *   (result[value] || (result[value] = [])).push(key);
13853       * }, {});
13854       * // => { '1': ['a', 'c'], '2': ['b'] }
13855       */
13856      function transform(object, iteratee, accumulator) {
13857        var isArr = isArray(object),
13858            isArrLike = isArr || isBuffer(object) || isTypedArray(object);
13859  
13860        iteratee = getIteratee(iteratee, 4);
13861        if (accumulator == null) {
13862          var Ctor = object && object.constructor;
13863          if (isArrLike) {
13864            accumulator = isArr ? new Ctor : [];
13865          }
13866          else if (isObject(object)) {
13867            accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
13868          }
13869          else {
13870            accumulator = {};
13871          }
13872        }
13873        (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
13874          return iteratee(accumulator, value, index, object);
13875        });
13876        return accumulator;
13877      }
13878  
13879      /**
13880       * Removes the property at `path` of `object`.
13881       *
13882       * **Note:** This method mutates `object`.
13883       *
13884       * @static
13885       * @memberOf _
13886       * @since 4.0.0
13887       * @category Object
13888       * @param {Object} object The object to modify.
13889       * @param {Array|string} path The path of the property to unset.
13890       * @returns {boolean} Returns `true` if the property is deleted, else `false`.
13891       * @example
13892       *
13893       * var object = { 'a': [{ 'b': { 'c': 7 } }] };
13894       * _.unset(object, 'a[0].b.c');
13895       * // => true
13896       *
13897       * console.log(object);
13898       * // => { 'a': [{ 'b': {} }] };
13899       *
13900       * _.unset(object, ['a', '0', 'b', 'c']);
13901       * // => true
13902       *
13903       * console.log(object);
13904       * // => { 'a': [{ 'b': {} }] };
13905       */
13906      function unset(object, path) {
13907        return object == null ? true : baseUnset(object, path);
13908      }
13909  
13910      /**
13911       * This method is like `_.set` except that accepts `updater` to produce the
13912       * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
13913       * is invoked with one argument: (value).
13914       *
13915       * **Note:** This method mutates `object`.
13916       *
13917       * @static
13918       * @memberOf _
13919       * @since 4.6.0
13920       * @category Object
13921       * @param {Object} object The object to modify.
13922       * @param {Array|string} path The path of the property to set.
13923       * @param {Function} updater The function to produce the updated value.
13924       * @returns {Object} Returns `object`.
13925       * @example
13926       *
13927       * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13928       *
13929       * _.update(object, 'a[0].b.c', function(n) { return n * n; });
13930       * console.log(object.a[0].b.c);
13931       * // => 9
13932       *
13933       * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
13934       * console.log(object.x[0].y.z);
13935       * // => 0
13936       */
13937      function update(object, path, updater) {
13938        return object == null ? object : baseUpdate(object, path, castFunction(updater));
13939      }
13940  
13941      /**
13942       * This method is like `_.update` except that it accepts `customizer` which is
13943       * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13944       * path creation is handled by the method instead. The `customizer` is invoked
13945       * with three arguments: (nsValue, key, nsObject).
13946       *
13947       * **Note:** This method mutates `object`.
13948       *
13949       * @static
13950       * @memberOf _
13951       * @since 4.6.0
13952       * @category Object
13953       * @param {Object} object The object to modify.
13954       * @param {Array|string} path The path of the property to set.
13955       * @param {Function} updater The function to produce the updated value.
13956       * @param {Function} [customizer] The function to customize assigned values.
13957       * @returns {Object} Returns `object`.
13958       * @example
13959       *
13960       * var object = {};
13961       *
13962       * _.updateWith(object, '[0][1]', _.constant('a'), Object);
13963       * // => { '0': { '1': 'a' } }
13964       */
13965      function updateWith(object, path, updater, customizer) {
13966        customizer = typeof customizer == 'function' ? customizer : undefined;
13967        return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
13968      }
13969  
13970      /**
13971       * Creates an array of the own enumerable string keyed property values of `object`.
13972       *
13973       * **Note:** Non-object values are coerced to objects.
13974       *
13975       * @static
13976       * @since 0.1.0
13977       * @memberOf _
13978       * @category Object
13979       * @param {Object} object The object to query.
13980       * @returns {Array} Returns the array of property values.
13981       * @example
13982       *
13983       * function Foo() {
13984       *   this.a = 1;
13985       *   this.b = 2;
13986       * }
13987       *
13988       * Foo.prototype.c = 3;
13989       *
13990       * _.values(new Foo);
13991       * // => [1, 2] (iteration order is not guaranteed)
13992       *
13993       * _.values('hi');
13994       * // => ['h', 'i']
13995       */
13996      function values(object) {
13997        return object == null ? [] : baseValues(object, keys(object));
13998      }
13999  
14000      /**
14001       * Creates an array of the own and inherited enumerable string keyed property
14002       * values of `object`.
14003       *
14004       * **Note:** Non-object values are coerced to objects.
14005       *
14006       * @static
14007       * @memberOf _
14008       * @since 3.0.0
14009       * @category Object
14010       * @param {Object} object The object to query.
14011       * @returns {Array} Returns the array of property values.
14012       * @example
14013       *
14014       * function Foo() {
14015       *   this.a = 1;
14016       *   this.b = 2;
14017       * }
14018       *
14019       * Foo.prototype.c = 3;
14020       *
14021       * _.valuesIn(new Foo);
14022       * // => [1, 2, 3] (iteration order is not guaranteed)
14023       */
14024      function valuesIn(object) {
14025        return object == null ? [] : baseValues(object, keysIn(object));
14026      }
14027  
14028      /*------------------------------------------------------------------------*/
14029  
14030      /**
14031       * Clamps `number` within the inclusive `lower` and `upper` bounds.
14032       *
14033       * @static
14034       * @memberOf _
14035       * @since 4.0.0
14036       * @category Number
14037       * @param {number} number The number to clamp.
14038       * @param {number} [lower] The lower bound.
14039       * @param {number} upper The upper bound.
14040       * @returns {number} Returns the clamped number.
14041       * @example
14042       *
14043       * _.clamp(-10, -5, 5);
14044       * // => -5
14045       *
14046       * _.clamp(10, -5, 5);
14047       * // => 5
14048       */
14049      function clamp(number, lower, upper) {
14050        if (upper === undefined) {
14051          upper = lower;
14052          lower = undefined;
14053        }
14054        if (upper !== undefined) {
14055          upper = toNumber(upper);
14056          upper = upper === upper ? upper : 0;
14057        }
14058        if (lower !== undefined) {
14059          lower = toNumber(lower);
14060          lower = lower === lower ? lower : 0;
14061        }
14062        return baseClamp(toNumber(number), lower, upper);
14063      }
14064  
14065      /**
14066       * Checks if `n` is between `start` and up to, but not including, `end`. If
14067       * `end` is not specified, it's set to `start` with `start` then set to `0`.
14068       * If `start` is greater than `end` the params are swapped to support
14069       * negative ranges.
14070       *
14071       * @static
14072       * @memberOf _
14073       * @since 3.3.0
14074       * @category Number
14075       * @param {number} number The number to check.
14076       * @param {number} [start=0] The start of the range.
14077       * @param {number} end The end of the range.
14078       * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
14079       * @see _.range, _.rangeRight
14080       * @example
14081       *
14082       * _.inRange(3, 2, 4);
14083       * // => true
14084       *
14085       * _.inRange(4, 8);
14086       * // => true
14087       *
14088       * _.inRange(4, 2);
14089       * // => false
14090       *
14091       * _.inRange(2, 2);
14092       * // => false
14093       *
14094       * _.inRange(1.2, 2);
14095       * // => true
14096       *
14097       * _.inRange(5.2, 4);
14098       * // => false
14099       *
14100       * _.inRange(-3, -2, -6);
14101       * // => true
14102       */
14103      function inRange(number, start, end) {
14104        start = toFinite(start);
14105        if (end === undefined) {
14106          end = start;
14107          start = 0;
14108        } else {
14109          end = toFinite(end);
14110        }
14111        number = toNumber(number);
14112        return baseInRange(number, start, end);
14113      }
14114  
14115      /**
14116       * Produces a random number between the inclusive `lower` and `upper` bounds.
14117       * If only one argument is provided a number between `0` and the given number
14118       * is returned. If `floating` is `true`, or either `lower` or `upper` are
14119       * floats, a floating-point number is returned instead of an integer.
14120       *
14121       * **Note:** JavaScript follows the IEEE-754 standard for resolving
14122       * floating-point values which can produce unexpected results.
14123       *
14124       * @static
14125       * @memberOf _
14126       * @since 0.7.0
14127       * @category Number
14128       * @param {number} [lower=0] The lower bound.
14129       * @param {number} [upper=1] The upper bound.
14130       * @param {boolean} [floating] Specify returning a floating-point number.
14131       * @returns {number} Returns the random number.
14132       * @example
14133       *
14134       * _.random(0, 5);
14135       * // => an integer between 0 and 5
14136       *
14137       * _.random(5);
14138       * // => also an integer between 0 and 5
14139       *
14140       * _.random(5, true);
14141       * // => a floating-point number between 0 and 5
14142       *
14143       * _.random(1.2, 5.2);
14144       * // => a floating-point number between 1.2 and 5.2
14145       */
14146      function random(lower, upper, floating) {
14147        if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
14148          upper = floating = undefined;
14149        }
14150        if (floating === undefined) {
14151          if (typeof upper == 'boolean') {
14152            floating = upper;
14153            upper = undefined;
14154          }
14155          else if (typeof lower == 'boolean') {
14156            floating = lower;
14157            lower = undefined;
14158          }
14159        }
14160        if (lower === undefined && upper === undefined) {
14161          lower = 0;
14162          upper = 1;
14163        }
14164        else {
14165          lower = toFinite(lower);
14166          if (upper === undefined) {
14167            upper = lower;
14168            lower = 0;
14169          } else {
14170            upper = toFinite(upper);
14171          }
14172        }
14173        if (lower > upper) {
14174          var temp = lower;
14175          lower = upper;
14176          upper = temp;
14177        }
14178        if (floating || lower % 1 || upper % 1) {
14179          var rand = nativeRandom();
14180          return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
14181        }
14182        return baseRandom(lower, upper);
14183      }
14184  
14185      /*------------------------------------------------------------------------*/
14186  
14187      /**
14188       * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
14189       *
14190       * @static
14191       * @memberOf _
14192       * @since 3.0.0
14193       * @category String
14194       * @param {string} [string=''] The string to convert.
14195       * @returns {string} Returns the camel cased string.
14196       * @example
14197       *
14198       * _.camelCase('Foo Bar');
14199       * // => 'fooBar'
14200       *
14201       * _.camelCase('--foo-bar--');
14202       * // => 'fooBar'
14203       *
14204       * _.camelCase('__FOO_BAR__');
14205       * // => 'fooBar'
14206       */
14207      var camelCase = createCompounder(function(result, word, index) {
14208        word = word.toLowerCase();
14209        return result + (index ? capitalize(word) : word);
14210      });
14211  
14212      /**
14213       * Converts the first character of `string` to upper case and the remaining
14214       * to lower case.
14215       *
14216       * @static
14217       * @memberOf _
14218       * @since 3.0.0
14219       * @category String
14220       * @param {string} [string=''] The string to capitalize.
14221       * @returns {string} Returns the capitalized string.
14222       * @example
14223       *
14224       * _.capitalize('FRED');
14225       * // => 'Fred'
14226       */
14227      function capitalize(string) {
14228        return upperFirst(toString(string).toLowerCase());
14229      }
14230  
14231      /**
14232       * Deburrs `string` by converting
14233       * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
14234       * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
14235       * letters to basic Latin letters and removing
14236       * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
14237       *
14238       * @static
14239       * @memberOf _
14240       * @since 3.0.0
14241       * @category String
14242       * @param {string} [string=''] The string to deburr.
14243       * @returns {string} Returns the deburred string.
14244       * @example
14245       *
14246       * _.deburr('déjà vu');
14247       * // => 'deja vu'
14248       */
14249      function deburr(string) {
14250        string = toString(string);
14251        return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
14252      }
14253  
14254      /**
14255       * Checks if `string` ends with the given target string.
14256       *
14257       * @static
14258       * @memberOf _
14259       * @since 3.0.0
14260       * @category String
14261       * @param {string} [string=''] The string to inspect.
14262       * @param {string} [target] The string to search for.
14263       * @param {number} [position=string.length] The position to search up to.
14264       * @returns {boolean} Returns `true` if `string` ends with `target`,
14265       *  else `false`.
14266       * @example
14267       *
14268       * _.endsWith('abc', 'c');
14269       * // => true
14270       *
14271       * _.endsWith('abc', 'b');
14272       * // => false
14273       *
14274       * _.endsWith('abc', 'b', 2);
14275       * // => true
14276       */
14277      function endsWith(string, target, position) {
14278        string = toString(string);
14279        target = baseToString(target);
14280  
14281        var length = string.length;
14282        position = position === undefined
14283          ? length
14284          : baseClamp(toInteger(position), 0, length);
14285  
14286        var end = position;
14287        position -= target.length;
14288        return position >= 0 && string.slice(position, end) == target;
14289      }
14290  
14291      /**
14292       * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
14293       * corresponding HTML entities.
14294       *
14295       * **Note:** No other characters are escaped. To escape additional
14296       * characters use a third-party library like [_he_](https://mths.be/he).
14297       *
14298       * Though the ">" character is escaped for symmetry, characters like
14299       * ">" and "/" don't need escaping in HTML and have no special meaning
14300       * unless they're part of a tag or unquoted attribute value. See
14301       * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
14302       * (under "semi-related fun fact") for more details.
14303       *
14304       * When working with HTML you should always
14305       * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
14306       * XSS vectors.
14307       *
14308       * @static
14309       * @since 0.1.0
14310       * @memberOf _
14311       * @category String
14312       * @param {string} [string=''] The string to escape.
14313       * @returns {string} Returns the escaped string.
14314       * @example
14315       *
14316       * _.escape('fred, barney, & pebbles');
14317       * // => 'fred, barney, &amp; pebbles'
14318       */
14319      function escape(string) {
14320        string = toString(string);
14321        return (string && reHasUnescapedHtml.test(string))
14322          ? string.replace(reUnescapedHtml, escapeHtmlChar)
14323          : string;
14324      }
14325  
14326      /**
14327       * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
14328       * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
14329       *
14330       * @static
14331       * @memberOf _
14332       * @since 3.0.0
14333       * @category String
14334       * @param {string} [string=''] The string to escape.
14335       * @returns {string} Returns the escaped string.
14336       * @example
14337       *
14338       * _.escapeRegExp('[lodash](https://lodash.com/)');
14339       * // => '\[lodash\]\(https://lodash\.com/\)'
14340       */
14341      function escapeRegExp(string) {
14342        string = toString(string);
14343        return (string && reHasRegExpChar.test(string))
14344          ? string.replace(reRegExpChar, '\\$&')
14345          : string;
14346      }
14347  
14348      /**
14349       * Converts `string` to
14350       * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
14351       *
14352       * @static
14353       * @memberOf _
14354       * @since 3.0.0
14355       * @category String
14356       * @param {string} [string=''] The string to convert.
14357       * @returns {string} Returns the kebab cased string.
14358       * @example
14359       *
14360       * _.kebabCase('Foo Bar');
14361       * // => 'foo-bar'
14362       *
14363       * _.kebabCase('fooBar');
14364       * // => 'foo-bar'
14365       *
14366       * _.kebabCase('__FOO_BAR__');
14367       * // => 'foo-bar'
14368       */
14369      var kebabCase = createCompounder(function(result, word, index) {
14370        return result + (index ? '-' : '') + word.toLowerCase();
14371      });
14372  
14373      /**
14374       * Converts `string`, as space separated words, to lower case.
14375       *
14376       * @static
14377       * @memberOf _
14378       * @since 4.0.0
14379       * @category String
14380       * @param {string} [string=''] The string to convert.
14381       * @returns {string} Returns the lower cased string.
14382       * @example
14383       *
14384       * _.lowerCase('--Foo-Bar--');
14385       * // => 'foo bar'
14386       *
14387       * _.lowerCase('fooBar');
14388       * // => 'foo bar'
14389       *
14390       * _.lowerCase('__FOO_BAR__');
14391       * // => 'foo bar'
14392       */
14393      var lowerCase = createCompounder(function(result, word, index) {
14394        return result + (index ? ' ' : '') + word.toLowerCase();
14395      });
14396  
14397      /**
14398       * Converts the first character of `string` to lower case.
14399       *
14400       * @static
14401       * @memberOf _
14402       * @since 4.0.0
14403       * @category String
14404       * @param {string} [string=''] The string to convert.
14405       * @returns {string} Returns the converted string.
14406       * @example
14407       *
14408       * _.lowerFirst('Fred');
14409       * // => 'fred'
14410       *
14411       * _.lowerFirst('FRED');
14412       * // => 'fRED'
14413       */
14414      var lowerFirst = createCaseFirst('toLowerCase');
14415  
14416      /**
14417       * Pads `string` on the left and right sides if it's shorter than `length`.
14418       * Padding characters are truncated if they can't be evenly divided by `length`.
14419       *
14420       * @static
14421       * @memberOf _
14422       * @since 3.0.0
14423       * @category String
14424       * @param {string} [string=''] The string to pad.
14425       * @param {number} [length=0] The padding length.
14426       * @param {string} [chars=' '] The string used as padding.
14427       * @returns {string} Returns the padded string.
14428       * @example
14429       *
14430       * _.pad('abc', 8);
14431       * // => '  abc   '
14432       *
14433       * _.pad('abc', 8, '_-');
14434       * // => '_-abc_-_'
14435       *
14436       * _.pad('abc', 3);
14437       * // => 'abc'
14438       */
14439      function pad(string, length, chars) {
14440        string = toString(string);
14441        length = toInteger(length);
14442  
14443        var strLength = length ? stringSize(string) : 0;
14444        if (!length || strLength >= length) {
14445          return string;
14446        }
14447        var mid = (length - strLength) / 2;
14448        return (
14449          createPadding(nativeFloor(mid), chars) +
14450          string +
14451          createPadding(nativeCeil(mid), chars)
14452        );
14453      }
14454  
14455      /**
14456       * Pads `string` on the right side if it's shorter than `length`. Padding
14457       * characters are truncated if they exceed `length`.
14458       *
14459       * @static
14460       * @memberOf _
14461       * @since 4.0.0
14462       * @category String
14463       * @param {string} [string=''] The string to pad.
14464       * @param {number} [length=0] The padding length.
14465       * @param {string} [chars=' '] The string used as padding.
14466       * @returns {string} Returns the padded string.
14467       * @example
14468       *
14469       * _.padEnd('abc', 6);
14470       * // => 'abc   '
14471       *
14472       * _.padEnd('abc', 6, '_-');
14473       * // => 'abc_-_'
14474       *
14475       * _.padEnd('abc', 3);
14476       * // => 'abc'
14477       */
14478      function padEnd(string, length, chars) {
14479        string = toString(string);
14480        length = toInteger(length);
14481  
14482        var strLength = length ? stringSize(string) : 0;
14483        return (length && strLength < length)
14484          ? (string + createPadding(length - strLength, chars))
14485          : string;
14486      }
14487  
14488      /**
14489       * Pads `string` on the left side if it's shorter than `length`. Padding
14490       * characters are truncated if they exceed `length`.
14491       *
14492       * @static
14493       * @memberOf _
14494       * @since 4.0.0
14495       * @category String
14496       * @param {string} [string=''] The string to pad.
14497       * @param {number} [length=0] The padding length.
14498       * @param {string} [chars=' '] The string used as padding.
14499       * @returns {string} Returns the padded string.
14500       * @example
14501       *
14502       * _.padStart('abc', 6);
14503       * // => '   abc'
14504       *
14505       * _.padStart('abc', 6, '_-');
14506       * // => '_-_abc'
14507       *
14508       * _.padStart('abc', 3);
14509       * // => 'abc'
14510       */
14511      function padStart(string, length, chars) {
14512        string = toString(string);
14513        length = toInteger(length);
14514  
14515        var strLength = length ? stringSize(string) : 0;
14516        return (length && strLength < length)
14517          ? (createPadding(length - strLength, chars) + string)
14518          : string;
14519      }
14520  
14521      /**
14522       * Converts `string` to an integer of the specified radix. If `radix` is
14523       * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
14524       * hexadecimal, in which case a `radix` of `16` is used.
14525       *
14526       * **Note:** This method aligns with the
14527       * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
14528       *
14529       * @static
14530       * @memberOf _
14531       * @since 1.1.0
14532       * @category String
14533       * @param {string} string The string to convert.
14534       * @param {number} [radix=10] The radix to interpret `value` by.
14535       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14536       * @returns {number} Returns the converted integer.
14537       * @example
14538       *
14539       * _.parseInt('08');
14540       * // => 8
14541       *
14542       * _.map(['6', '08', '10'], _.parseInt);
14543       * // => [6, 8, 10]
14544       */
14545      function parseInt(string, radix, guard) {
14546        if (guard || radix == null) {
14547          radix = 0;
14548        } else if (radix) {
14549          radix = +radix;
14550        }
14551        return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
14552      }
14553  
14554      /**
14555       * Repeats the given string `n` times.
14556       *
14557       * @static
14558       * @memberOf _
14559       * @since 3.0.0
14560       * @category String
14561       * @param {string} [string=''] The string to repeat.
14562       * @param {number} [n=1] The number of times to repeat the string.
14563       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14564       * @returns {string} Returns the repeated string.
14565       * @example
14566       *
14567       * _.repeat('*', 3);
14568       * // => '***'
14569       *
14570       * _.repeat('abc', 2);
14571       * // => 'abcabc'
14572       *
14573       * _.repeat('abc', 0);
14574       * // => ''
14575       */
14576      function repeat(string, n, guard) {
14577        if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
14578          n = 1;
14579        } else {
14580          n = toInteger(n);
14581        }
14582        return baseRepeat(toString(string), n);
14583      }
14584  
14585      /**
14586       * Replaces matches for `pattern` in `string` with `replacement`.
14587       *
14588       * **Note:** This method is based on
14589       * [`String#replace`](https://mdn.io/String/replace).
14590       *
14591       * @static
14592       * @memberOf _
14593       * @since 4.0.0
14594       * @category String
14595       * @param {string} [string=''] The string to modify.
14596       * @param {RegExp|string} pattern The pattern to replace.
14597       * @param {Function|string} replacement The match replacement.
14598       * @returns {string} Returns the modified string.
14599       * @example
14600       *
14601       * _.replace('Hi Fred', 'Fred', 'Barney');
14602       * // => 'Hi Barney'
14603       */
14604      function replace() {
14605        var args = arguments,
14606            string = toString(args[0]);
14607  
14608        return args.length < 3 ? string : string.replace(args[1], args[2]);
14609      }
14610  
14611      /**
14612       * Converts `string` to
14613       * [snake case](https://en.wikipedia.org/wiki/Snake_case).
14614       *
14615       * @static
14616       * @memberOf _
14617       * @since 3.0.0
14618       * @category String
14619       * @param {string} [string=''] The string to convert.
14620       * @returns {string} Returns the snake cased string.
14621       * @example
14622       *
14623       * _.snakeCase('Foo Bar');
14624       * // => 'foo_bar'
14625       *
14626       * _.snakeCase('fooBar');
14627       * // => 'foo_bar'
14628       *
14629       * _.snakeCase('--FOO-BAR--');
14630       * // => 'foo_bar'
14631       */
14632      var snakeCase = createCompounder(function(result, word, index) {
14633        return result + (index ? '_' : '') + word.toLowerCase();
14634      });
14635  
14636      /**
14637       * Splits `string` by `separator`.
14638       *
14639       * **Note:** This method is based on
14640       * [`String#split`](https://mdn.io/String/split).
14641       *
14642       * @static
14643       * @memberOf _
14644       * @since 4.0.0
14645       * @category String
14646       * @param {string} [string=''] The string to split.
14647       * @param {RegExp|string} separator The separator pattern to split by.
14648       * @param {number} [limit] The length to truncate results to.
14649       * @returns {Array} Returns the string segments.
14650       * @example
14651       *
14652       * _.split('a-b-c', '-', 2);
14653       * // => ['a', 'b']
14654       */
14655      function split(string, separator, limit) {
14656        if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
14657          separator = limit = undefined;
14658        }
14659        limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
14660        if (!limit) {
14661          return [];
14662        }
14663        string = toString(string);
14664        if (string && (
14665              typeof separator == 'string' ||
14666              (separator != null && !isRegExp(separator))
14667            )) {
14668          separator = baseToString(separator);
14669          if (!separator && hasUnicode(string)) {
14670            return castSlice(stringToArray(string), 0, limit);
14671          }
14672        }
14673        return string.split(separator, limit);
14674      }
14675  
14676      /**
14677       * Converts `string` to
14678       * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
14679       *
14680       * @static
14681       * @memberOf _
14682       * @since 3.1.0
14683       * @category String
14684       * @param {string} [string=''] The string to convert.
14685       * @returns {string} Returns the start cased string.
14686       * @example
14687       *
14688       * _.startCase('--foo-bar--');
14689       * // => 'Foo Bar'
14690       *
14691       * _.startCase('fooBar');
14692       * // => 'Foo Bar'
14693       *
14694       * _.startCase('__FOO_BAR__');
14695       * // => 'FOO BAR'
14696       */
14697      var startCase = createCompounder(function(result, word, index) {
14698        return result + (index ? ' ' : '') + upperFirst(word);
14699      });
14700  
14701      /**
14702       * Checks if `string` starts with the given target string.
14703       *
14704       * @static
14705       * @memberOf _
14706       * @since 3.0.0
14707       * @category String
14708       * @param {string} [string=''] The string to inspect.
14709       * @param {string} [target] The string to search for.
14710       * @param {number} [position=0] The position to search from.
14711       * @returns {boolean} Returns `true` if `string` starts with `target`,
14712       *  else `false`.
14713       * @example
14714       *
14715       * _.startsWith('abc', 'a');
14716       * // => true
14717       *
14718       * _.startsWith('abc', 'b');
14719       * // => false
14720       *
14721       * _.startsWith('abc', 'b', 1);
14722       * // => true
14723       */
14724      function startsWith(string, target, position) {
14725        string = toString(string);
14726        position = position == null
14727          ? 0
14728          : baseClamp(toInteger(position), 0, string.length);
14729  
14730        target = baseToString(target);
14731        return string.slice(position, position + target.length) == target;
14732      }
14733  
14734      /**
14735       * Creates a compiled template function that can interpolate data properties
14736       * in "interpolate" delimiters, HTML-escape interpolated data properties in
14737       * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
14738       * properties may be accessed as free variables in the template. If a setting
14739       * object is given, it takes precedence over `_.templateSettings` values.
14740       *
14741       * **Note:** In the development build `_.template` utilizes
14742       * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
14743       * for easier debugging.
14744       *
14745       * For more information on precompiling templates see
14746       * [lodash's custom builds documentation](https://lodash.com/custom-builds).
14747       *
14748       * For more information on Chrome extension sandboxes see
14749       * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
14750       *
14751       * @static
14752       * @since 0.1.0
14753       * @memberOf _
14754       * @category String
14755       * @param {string} [string=''] The template string.
14756       * @param {Object} [options={}] The options object.
14757       * @param {RegExp} [options.escape=_.templateSettings.escape]
14758       *  The HTML "escape" delimiter.
14759       * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
14760       *  The "evaluate" delimiter.
14761       * @param {Object} [options.imports=_.templateSettings.imports]
14762       *  An object to import into the template as free variables.
14763       * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
14764       *  The "interpolate" delimiter.
14765       * @param {string} [options.sourceURL='lodash.templateSources[n]']
14766       *  The sourceURL of the compiled template.
14767       * @param {string} [options.variable='obj']
14768       *  The data object variable name.
14769       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14770       * @returns {Function} Returns the compiled template function.
14771       * @example
14772       *
14773       * // Use the "interpolate" delimiter to create a compiled template.
14774       * var compiled = _.template('hello <%= user %>!');
14775       * compiled({ 'user': 'fred' });
14776       * // => 'hello fred!'
14777       *
14778       * // Use the HTML "escape" delimiter to escape data property values.
14779       * var compiled = _.template('<b><%- value %></b>');
14780       * compiled({ 'value': '<script>' });
14781       * // => '<b>&lt;script&gt;</b>'
14782       *
14783       * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
14784       * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
14785       * compiled({ 'users': ['fred', 'barney'] });
14786       * // => '<li>fred</li><li>barney</li>'
14787       *
14788       * // Use the internal `print` function in "evaluate" delimiters.
14789       * var compiled = _.template('<% print("hello " + user); %>!');
14790       * compiled({ 'user': 'barney' });
14791       * // => 'hello barney!'
14792       *
14793       * // Use the ES template literal delimiter as an "interpolate" delimiter.
14794       * // Disable support by replacing the "interpolate" delimiter.
14795       * var compiled = _.template('hello ${ user }!');
14796       * compiled({ 'user': 'pebbles' });
14797       * // => 'hello pebbles!'
14798       *
14799       * // Use backslashes to treat delimiters as plain text.
14800       * var compiled = _.template('<%= "\\<%- value %\\>" %>');
14801       * compiled({ 'value': 'ignored' });
14802       * // => '<%- value %>'
14803       *
14804       * // Use the `imports` option to import `jQuery` as `jq`.
14805       * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
14806       * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
14807       * compiled({ 'users': ['fred', 'barney'] });
14808       * // => '<li>fred</li><li>barney</li>'
14809       *
14810       * // Use the `sourceURL` option to specify a custom sourceURL for the template.
14811       * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
14812       * compiled(data);
14813       * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
14814       *
14815       * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
14816       * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
14817       * compiled.source;
14818       * // => function(data) {
14819       * //   var __t, __p = '';
14820       * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
14821       * //   return __p;
14822       * // }
14823       *
14824       * // Use custom template delimiters.
14825       * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
14826       * var compiled = _.template('hello {{ user }}!');
14827       * compiled({ 'user': 'mustache' });
14828       * // => 'hello mustache!'
14829       *
14830       * // Use the `source` property to inline compiled templates for meaningful
14831       * // line numbers in error messages and stack traces.
14832       * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
14833       *   var JST = {\
14834       *     "main": ' + _.template(mainText).source + '\
14835       *   };\
14836       * ');
14837       */
14838      function template(string, options, guard) {
14839        // Based on John Resig's `tmpl` implementation
14840        // (http://ejohn.org/blog/javascript-micro-templating/)
14841        // and Laura Doktorova's doT.js (https://github.com/olado/doT).
14842        var settings = lodash.templateSettings;
14843  
14844        if (guard && isIterateeCall(string, options, guard)) {
14845          options = undefined;
14846        }
14847        string = toString(string);
14848        options = assignInWith({}, options, settings, customDefaultsAssignIn);
14849  
14850        var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
14851            importsKeys = keys(imports),
14852            importsValues = baseValues(imports, importsKeys);
14853  
14854        var isEscaping,
14855            isEvaluating,
14856            index = 0,
14857            interpolate = options.interpolate || reNoMatch,
14858            source = "__p += '";
14859  
14860        // Compile the regexp to match each delimiter.
14861        var reDelimiters = RegExp(
14862          (options.escape || reNoMatch).source + '|' +
14863          interpolate.source + '|' +
14864          (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
14865          (options.evaluate || reNoMatch).source + '|$'
14866        , 'g');
14867  
14868        // Use a sourceURL for easier debugging.
14869        // The sourceURL gets injected into the source that's eval-ed, so be careful
14870        // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
14871        // and escape the comment, thus injecting code that gets evaled.
14872        var sourceURL = '//# sourceURL=' +
14873          (hasOwnProperty.call(options, 'sourceURL')
14874            ? (options.sourceURL + '').replace(/\s/g, ' ')
14875            : ('lodash.templateSources[' + (++templateCounter) + ']')
14876          ) + '\n';
14877  
14878        string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
14879          interpolateValue || (interpolateValue = esTemplateValue);
14880  
14881          // Escape characters that can't be included in string literals.
14882          source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
14883  
14884          // Replace delimiters with snippets.
14885          if (escapeValue) {
14886            isEscaping = true;
14887            source += "' +\n__e(" + escapeValue + ") +\n'";
14888          }
14889          if (evaluateValue) {
14890            isEvaluating = true;
14891            source += "';\n" + evaluateValue + ";\n__p += '";
14892          }
14893          if (interpolateValue) {
14894            source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
14895          }
14896          index = offset + match.length;
14897  
14898          // The JS engine embedded in Adobe products needs `match` returned in
14899          // order to produce the correct `offset` value.
14900          return match;
14901        });
14902  
14903        source += "';\n";
14904  
14905        // If `variable` is not specified wrap a with-statement around the generated
14906        // code to add the data object to the top of the scope chain.
14907        var variable = hasOwnProperty.call(options, 'variable') && options.variable;
14908        if (!variable) {
14909          source = 'with (obj) {\n' + source + '\n}\n';
14910        }
14911        // Throw an error if a forbidden character was found in `variable`, to prevent
14912        // potential command injection attacks.
14913        else if (reForbiddenIdentifierChars.test(variable)) {
14914          throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
14915        }
14916  
14917        // Cleanup code by stripping empty strings.
14918        source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
14919          .replace(reEmptyStringMiddle, '$1')
14920          .replace(reEmptyStringTrailing, '$1;');
14921  
14922        // Frame code as the function body.
14923        source = 'function(' + (variable || 'obj') + ') {\n' +
14924          (variable
14925            ? ''
14926            : 'obj || (obj = {});\n'
14927          ) +
14928          "var __t, __p = ''" +
14929          (isEscaping
14930             ? ', __e = _.escape'
14931             : ''
14932          ) +
14933          (isEvaluating
14934            ? ', __j = Array.prototype.join;\n' +
14935              "function print() { __p += __j.call(arguments, '') }\n"
14936            : ';\n'
14937          ) +
14938          source +
14939          'return __p\n}';
14940  
14941        var result = attempt(function() {
14942          return Function(importsKeys, sourceURL + 'return ' + source)
14943            .apply(undefined, importsValues);
14944        });
14945  
14946        // Provide the compiled function's source by its `toString` method or
14947        // the `source` property as a convenience for inlining compiled templates.
14948        result.source = source;
14949        if (isError(result)) {
14950          throw result;
14951        }
14952        return result;
14953      }
14954  
14955      /**
14956       * Converts `string`, as a whole, to lower case just like
14957       * [String#toLowerCase](https://mdn.io/toLowerCase).
14958       *
14959       * @static
14960       * @memberOf _
14961       * @since 4.0.0
14962       * @category String
14963       * @param {string} [string=''] The string to convert.
14964       * @returns {string} Returns the lower cased string.
14965       * @example
14966       *
14967       * _.toLower('--Foo-Bar--');
14968       * // => '--foo-bar--'
14969       *
14970       * _.toLower('fooBar');
14971       * // => 'foobar'
14972       *
14973       * _.toLower('__FOO_BAR__');
14974       * // => '__foo_bar__'
14975       */
14976      function toLower(value) {
14977        return toString(value).toLowerCase();
14978      }
14979  
14980      /**
14981       * Converts `string`, as a whole, to upper case just like
14982       * [String#toUpperCase](https://mdn.io/toUpperCase).
14983       *
14984       * @static
14985       * @memberOf _
14986       * @since 4.0.0
14987       * @category String
14988       * @param {string} [string=''] The string to convert.
14989       * @returns {string} Returns the upper cased string.
14990       * @example
14991       *
14992       * _.toUpper('--foo-bar--');
14993       * // => '--FOO-BAR--'
14994       *
14995       * _.toUpper('fooBar');
14996       * // => 'FOOBAR'
14997       *
14998       * _.toUpper('__foo_bar__');
14999       * // => '__FOO_BAR__'
15000       */
15001      function toUpper(value) {
15002        return toString(value).toUpperCase();
15003      }
15004  
15005      /**
15006       * Removes leading and trailing whitespace or specified characters from `string`.
15007       *
15008       * @static
15009       * @memberOf _
15010       * @since 3.0.0
15011       * @category String
15012       * @param {string} [string=''] The string to trim.
15013       * @param {string} [chars=whitespace] The characters to trim.
15014       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15015       * @returns {string} Returns the trimmed string.
15016       * @example
15017       *
15018       * _.trim('  abc  ');
15019       * // => 'abc'
15020       *
15021       * _.trim('-_-abc-_-', '_-');
15022       * // => 'abc'
15023       *
15024       * _.map(['  foo  ', '  bar  '], _.trim);
15025       * // => ['foo', 'bar']
15026       */
15027      function trim(string, chars, guard) {
15028        string = toString(string);
15029        if (string && (guard || chars === undefined)) {
15030          return baseTrim(string);
15031        }
15032        if (!string || !(chars = baseToString(chars))) {
15033          return string;
15034        }
15035        var strSymbols = stringToArray(string),
15036            chrSymbols = stringToArray(chars),
15037            start = charsStartIndex(strSymbols, chrSymbols),
15038            end = charsEndIndex(strSymbols, chrSymbols) + 1;
15039  
15040        return castSlice(strSymbols, start, end).join('');
15041      }
15042  
15043      /**
15044       * Removes trailing whitespace or specified characters from `string`.
15045       *
15046       * @static
15047       * @memberOf _
15048       * @since 4.0.0
15049       * @category String
15050       * @param {string} [string=''] The string to trim.
15051       * @param {string} [chars=whitespace] The characters to trim.
15052       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15053       * @returns {string} Returns the trimmed string.
15054       * @example
15055       *
15056       * _.trimEnd('  abc  ');
15057       * // => '  abc'
15058       *
15059       * _.trimEnd('-_-abc-_-', '_-');
15060       * // => '-_-abc'
15061       */
15062      function trimEnd(string, chars, guard) {
15063        string = toString(string);
15064        if (string && (guard || chars === undefined)) {
15065          return string.slice(0, trimmedEndIndex(string) + 1);
15066        }
15067        if (!string || !(chars = baseToString(chars))) {
15068          return string;
15069        }
15070        var strSymbols = stringToArray(string),
15071            end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
15072  
15073        return castSlice(strSymbols, 0, end).join('');
15074      }
15075  
15076      /**
15077       * Removes leading whitespace or specified characters from `string`.
15078       *
15079       * @static
15080       * @memberOf _
15081       * @since 4.0.0
15082       * @category String
15083       * @param {string} [string=''] The string to trim.
15084       * @param {string} [chars=whitespace] The characters to trim.
15085       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15086       * @returns {string} Returns the trimmed string.
15087       * @example
15088       *
15089       * _.trimStart('  abc  ');
15090       * // => 'abc  '
15091       *
15092       * _.trimStart('-_-abc-_-', '_-');
15093       * // => 'abc-_-'
15094       */
15095      function trimStart(string, chars, guard) {
15096        string = toString(string);
15097        if (string && (guard || chars === undefined)) {
15098          return string.replace(reTrimStart, '');
15099        }
15100        if (!string || !(chars = baseToString(chars))) {
15101          return string;
15102        }
15103        var strSymbols = stringToArray(string),
15104            start = charsStartIndex(strSymbols, stringToArray(chars));
15105  
15106        return castSlice(strSymbols, start).join('');
15107      }
15108  
15109      /**
15110       * Truncates `string` if it's longer than the given maximum string length.
15111       * The last characters of the truncated string are replaced with the omission
15112       * string which defaults to "...".
15113       *
15114       * @static
15115       * @memberOf _
15116       * @since 4.0.0
15117       * @category String
15118       * @param {string} [string=''] The string to truncate.
15119       * @param {Object} [options={}] The options object.
15120       * @param {number} [options.length=30] The maximum string length.
15121       * @param {string} [options.omission='...'] The string to indicate text is omitted.
15122       * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
15123       * @returns {string} Returns the truncated string.
15124       * @example
15125       *
15126       * _.truncate('hi-diddly-ho there, neighborino');
15127       * // => 'hi-diddly-ho there, neighbo...'
15128       *
15129       * _.truncate('hi-diddly-ho there, neighborino', {
15130       *   'length': 24,
15131       *   'separator': ' '
15132       * });
15133       * // => 'hi-diddly-ho there,...'
15134       *
15135       * _.truncate('hi-diddly-ho there, neighborino', {
15136       *   'length': 24,
15137       *   'separator': /,? +/
15138       * });
15139       * // => 'hi-diddly-ho there...'
15140       *
15141       * _.truncate('hi-diddly-ho there, neighborino', {
15142       *   'omission': ' [...]'
15143       * });
15144       * // => 'hi-diddly-ho there, neig [...]'
15145       */
15146      function truncate(string, options) {
15147        var length = DEFAULT_TRUNC_LENGTH,
15148            omission = DEFAULT_TRUNC_OMISSION;
15149  
15150        if (isObject(options)) {
15151          var separator = 'separator' in options ? options.separator : separator;
15152          length = 'length' in options ? toInteger(options.length) : length;
15153          omission = 'omission' in options ? baseToString(options.omission) : omission;
15154        }
15155        string = toString(string);
15156  
15157        var strLength = string.length;
15158        if (hasUnicode(string)) {
15159          var strSymbols = stringToArray(string);
15160          strLength = strSymbols.length;
15161        }
15162        if (length >= strLength) {
15163          return string;
15164        }
15165        var end = length - stringSize(omission);
15166        if (end < 1) {
15167          return omission;
15168        }
15169        var result = strSymbols
15170          ? castSlice(strSymbols, 0, end).join('')
15171          : string.slice(0, end);
15172  
15173        if (separator === undefined) {
15174          return result + omission;
15175        }
15176        if (strSymbols) {
15177          end += (result.length - end);
15178        }
15179        if (isRegExp(separator)) {
15180          if (string.slice(end).search(separator)) {
15181            var match,
15182                substring = result;
15183  
15184            if (!separator.global) {
15185              separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
15186            }
15187            separator.lastIndex = 0;
15188            while ((match = separator.exec(substring))) {
15189              var newEnd = match.index;
15190            }
15191            result = result.slice(0, newEnd === undefined ? end : newEnd);
15192          }
15193        } else if (string.indexOf(baseToString(separator), end) != end) {
15194          var index = result.lastIndexOf(separator);
15195          if (index > -1) {
15196            result = result.slice(0, index);
15197          }
15198        }
15199        return result + omission;
15200      }
15201  
15202      /**
15203       * The inverse of `_.escape`; this method converts the HTML entities
15204       * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
15205       * their corresponding characters.
15206       *
15207       * **Note:** No other HTML entities are unescaped. To unescape additional
15208       * HTML entities use a third-party library like [_he_](https://mths.be/he).
15209       *
15210       * @static
15211       * @memberOf _
15212       * @since 0.6.0
15213       * @category String
15214       * @param {string} [string=''] The string to unescape.
15215       * @returns {string} Returns the unescaped string.
15216       * @example
15217       *
15218       * _.unescape('fred, barney, &amp; pebbles');
15219       * // => 'fred, barney, & pebbles'
15220       */
15221      function unescape(string) {
15222        string = toString(string);
15223        return (string && reHasEscapedHtml.test(string))
15224          ? string.replace(reEscapedHtml, unescapeHtmlChar)
15225          : string;
15226      }
15227  
15228      /**
15229       * Converts `string`, as space separated words, to upper case.
15230       *
15231       * @static
15232       * @memberOf _
15233       * @since 4.0.0
15234       * @category String
15235       * @param {string} [string=''] The string to convert.
15236       * @returns {string} Returns the upper cased string.
15237       * @example
15238       *
15239       * _.upperCase('--foo-bar');
15240       * // => 'FOO BAR'
15241       *
15242       * _.upperCase('fooBar');
15243       * // => 'FOO BAR'
15244       *
15245       * _.upperCase('__foo_bar__');
15246       * // => 'FOO BAR'
15247       */
15248      var upperCase = createCompounder(function(result, word, index) {
15249        return result + (index ? ' ' : '') + word.toUpperCase();
15250      });
15251  
15252      /**
15253       * Converts the first character of `string` to upper case.
15254       *
15255       * @static
15256       * @memberOf _
15257       * @since 4.0.0
15258       * @category String
15259       * @param {string} [string=''] The string to convert.
15260       * @returns {string} Returns the converted string.
15261       * @example
15262       *
15263       * _.upperFirst('fred');
15264       * // => 'Fred'
15265       *
15266       * _.upperFirst('FRED');
15267       * // => 'FRED'
15268       */
15269      var upperFirst = createCaseFirst('toUpperCase');
15270  
15271      /**
15272       * Splits `string` into an array of its words.
15273       *
15274       * @static
15275       * @memberOf _
15276       * @since 3.0.0
15277       * @category String
15278       * @param {string} [string=''] The string to inspect.
15279       * @param {RegExp|string} [pattern] The pattern to match words.
15280       * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15281       * @returns {Array} Returns the words of `string`.
15282       * @example
15283       *
15284       * _.words('fred, barney, & pebbles');
15285       * // => ['fred', 'barney', 'pebbles']
15286       *
15287       * _.words('fred, barney, & pebbles', /[^, ]+/g);
15288       * // => ['fred', 'barney', '&', 'pebbles']
15289       */
15290      function words(string, pattern, guard) {
15291        string = toString(string);
15292        pattern = guard ? undefined : pattern;
15293  
15294        if (pattern === undefined) {
15295          return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
15296        }
15297        return string.match(pattern) || [];
15298      }
15299  
15300      /*------------------------------------------------------------------------*/
15301  
15302      /**
15303       * Attempts to invoke `func`, returning either the result or the caught error
15304       * object. Any additional arguments are provided to `func` when it's invoked.
15305       *
15306       * @static
15307       * @memberOf _
15308       * @since 3.0.0
15309       * @category Util
15310       * @param {Function} func The function to attempt.
15311       * @param {...*} [args] The arguments to invoke `func` with.
15312       * @returns {*} Returns the `func` result or error object.
15313       * @example
15314       *
15315       * // Avoid throwing errors for invalid selectors.
15316       * var elements = _.attempt(function(selector) {
15317       *   return document.querySelectorAll(selector);
15318       * }, '>_>');
15319       *
15320       * if (_.isError(elements)) {
15321       *   elements = [];
15322       * }
15323       */
15324      var attempt = baseRest(function(func, args) {
15325        try {
15326          return apply(func, undefined, args);
15327        } catch (e) {
15328          return isError(e) ? e : new Error(e);
15329        }
15330      });
15331  
15332      /**
15333       * Binds methods of an object to the object itself, overwriting the existing
15334       * method.
15335       *
15336       * **Note:** This method doesn't set the "length" property of bound functions.
15337       *
15338       * @static
15339       * @since 0.1.0
15340       * @memberOf _
15341       * @category Util
15342       * @param {Object} object The object to bind and assign the bound methods to.
15343       * @param {...(string|string[])} methodNames The object method names to bind.
15344       * @returns {Object} Returns `object`.
15345       * @example
15346       *
15347       * var view = {
15348       *   'label': 'docs',
15349       *   'click': function() {
15350       *     console.log('clicked ' + this.label);
15351       *   }
15352       * };
15353       *
15354       * _.bindAll(view, ['click']);
15355       * jQuery(element).on('click', view.click);
15356       * // => Logs 'clicked docs' when clicked.
15357       */
15358      var bindAll = flatRest(function(object, methodNames) {
15359        arrayEach(methodNames, function(key) {
15360          key = toKey(key);
15361          baseAssignValue(object, key, bind(object[key], object));
15362        });
15363        return object;
15364      });
15365  
15366      /**
15367       * Creates a function that iterates over `pairs` and invokes the corresponding
15368       * function of the first predicate to return truthy. The predicate-function
15369       * pairs are invoked with the `this` binding and arguments of the created
15370       * function.
15371       *
15372       * @static
15373       * @memberOf _
15374       * @since 4.0.0
15375       * @category Util
15376       * @param {Array} pairs The predicate-function pairs.
15377       * @returns {Function} Returns the new composite function.
15378       * @example
15379       *
15380       * var func = _.cond([
15381       *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
15382       *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
15383       *   [_.stubTrue,                      _.constant('no match')]
15384       * ]);
15385       *
15386       * func({ 'a': 1, 'b': 2 });
15387       * // => 'matches A'
15388       *
15389       * func({ 'a': 0, 'b': 1 });
15390       * // => 'matches B'
15391       *
15392       * func({ 'a': '1', 'b': '2' });
15393       * // => 'no match'
15394       */
15395      function cond(pairs) {
15396        var length = pairs == null ? 0 : pairs.length,
15397            toIteratee = getIteratee();
15398  
15399        pairs = !length ? [] : arrayMap(pairs, function(pair) {
15400          if (typeof pair[1] != 'function') {
15401            throw new TypeError(FUNC_ERROR_TEXT);
15402          }
15403          return [toIteratee(pair[0]), pair[1]];
15404        });
15405  
15406        return baseRest(function(args) {
15407          var index = -1;
15408          while (++index < length) {
15409            var pair = pairs[index];
15410            if (apply(pair[0], this, args)) {
15411              return apply(pair[1], this, args);
15412            }
15413          }
15414        });
15415      }
15416  
15417      /**
15418       * Creates a function that invokes the predicate properties of `source` with
15419       * the corresponding property values of a given object, returning `true` if
15420       * all predicates return truthy, else `false`.
15421       *
15422       * **Note:** The created function is equivalent to `_.conformsTo` with
15423       * `source` partially applied.
15424       *
15425       * @static
15426       * @memberOf _
15427       * @since 4.0.0
15428       * @category Util
15429       * @param {Object} source The object of property predicates to conform to.
15430       * @returns {Function} Returns the new spec function.
15431       * @example
15432       *
15433       * var objects = [
15434       *   { 'a': 2, 'b': 1 },
15435       *   { 'a': 1, 'b': 2 }
15436       * ];
15437       *
15438       * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
15439       * // => [{ 'a': 1, 'b': 2 }]
15440       */
15441      function conforms(source) {
15442        return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
15443      }
15444  
15445      /**
15446       * Creates a function that returns `value`.
15447       *
15448       * @static
15449       * @memberOf _
15450       * @since 2.4.0
15451       * @category Util
15452       * @param {*} value The value to return from the new function.
15453       * @returns {Function} Returns the new constant function.
15454       * @example
15455       *
15456       * var objects = _.times(2, _.constant({ 'a': 1 }));
15457       *
15458       * console.log(objects);
15459       * // => [{ 'a': 1 }, { 'a': 1 }]
15460       *
15461       * console.log(objects[0] === objects[1]);
15462       * // => true
15463       */
15464      function constant(value) {
15465        return function() {
15466          return value;
15467        };
15468      }
15469  
15470      /**
15471       * Checks `value` to determine whether a default value should be returned in
15472       * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
15473       * or `undefined`.
15474       *
15475       * @static
15476       * @memberOf _
15477       * @since 4.14.0
15478       * @category Util
15479       * @param {*} value The value to check.
15480       * @param {*} defaultValue The default value.
15481       * @returns {*} Returns the resolved value.
15482       * @example
15483       *
15484       * _.defaultTo(1, 10);
15485       * // => 1
15486       *
15487       * _.defaultTo(undefined, 10);
15488       * // => 10
15489       */
15490      function defaultTo(value, defaultValue) {
15491        return (value == null || value !== value) ? defaultValue : value;
15492      }
15493  
15494      /**
15495       * Creates a function that returns the result of invoking the given functions
15496       * with the `this` binding of the created function, where each successive
15497       * invocation is supplied the return value of the previous.
15498       *
15499       * @static
15500       * @memberOf _
15501       * @since 3.0.0
15502       * @category Util
15503       * @param {...(Function|Function[])} [funcs] The functions to invoke.
15504       * @returns {Function} Returns the new composite function.
15505       * @see _.flowRight
15506       * @example
15507       *
15508       * function square(n) {
15509       *   return n * n;
15510       * }
15511       *
15512       * var addSquare = _.flow([_.add, square]);
15513       * addSquare(1, 2);
15514       * // => 9
15515       */
15516      var flow = createFlow();
15517  
15518      /**
15519       * This method is like `_.flow` except that it creates a function that
15520       * invokes the given functions from right to left.
15521       *
15522       * @static
15523       * @since 3.0.0
15524       * @memberOf _
15525       * @category Util
15526       * @param {...(Function|Function[])} [funcs] The functions to invoke.
15527       * @returns {Function} Returns the new composite function.
15528       * @see _.flow
15529       * @example
15530       *
15531       * function square(n) {
15532       *   return n * n;
15533       * }
15534       *
15535       * var addSquare = _.flowRight([square, _.add]);
15536       * addSquare(1, 2);
15537       * // => 9
15538       */
15539      var flowRight = createFlow(true);
15540  
15541      /**
15542       * This method returns the first argument it receives.
15543       *
15544       * @static
15545       * @since 0.1.0
15546       * @memberOf _
15547       * @category Util
15548       * @param {*} value Any value.
15549       * @returns {*} Returns `value`.
15550       * @example
15551       *
15552       * var object = { 'a': 1 };
15553       *
15554       * console.log(_.identity(object) === object);
15555       * // => true
15556       */
15557      function identity(value) {
15558        return value;
15559      }
15560  
15561      /**
15562       * Creates a function that invokes `func` with the arguments of the created
15563       * function. If `func` is a property name, the created function returns the
15564       * property value for a given element. If `func` is an array or object, the
15565       * created function returns `true` for elements that contain the equivalent
15566       * source properties, otherwise it returns `false`.
15567       *
15568       * @static
15569       * @since 4.0.0
15570       * @memberOf _
15571       * @category Util
15572       * @param {*} [func=_.identity] The value to convert to a callback.
15573       * @returns {Function} Returns the callback.
15574       * @example
15575       *
15576       * var users = [
15577       *   { 'user': 'barney', 'age': 36, 'active': true },
15578       *   { 'user': 'fred',   'age': 40, 'active': false }
15579       * ];
15580       *
15581       * // The `_.matches` iteratee shorthand.
15582       * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
15583       * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
15584       *
15585       * // The `_.matchesProperty` iteratee shorthand.
15586       * _.filter(users, _.iteratee(['user', 'fred']));
15587       * // => [{ 'user': 'fred', 'age': 40 }]
15588       *
15589       * // The `_.property` iteratee shorthand.
15590       * _.map(users, _.iteratee('user'));
15591       * // => ['barney', 'fred']
15592       *
15593       * // Create custom iteratee shorthands.
15594       * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
15595       *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
15596       *     return func.test(string);
15597       *   };
15598       * });
15599       *
15600       * _.filter(['abc', 'def'], /ef/);
15601       * // => ['def']
15602       */
15603      function iteratee(func) {
15604        return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
15605      }
15606  
15607      /**
15608       * Creates a function that performs a partial deep comparison between a given
15609       * object and `source`, returning `true` if the given object has equivalent
15610       * property values, else `false`.
15611       *
15612       * **Note:** The created function is equivalent to `_.isMatch` with `source`
15613       * partially applied.
15614       *
15615       * Partial comparisons will match empty array and empty object `source`
15616       * values against any array or object value, respectively. See `_.isEqual`
15617       * for a list of supported value comparisons.
15618       *
15619       * **Note:** Multiple values can be checked by combining several matchers
15620       * using `_.overSome`
15621       *
15622       * @static
15623       * @memberOf _
15624       * @since 3.0.0
15625       * @category Util
15626       * @param {Object} source The object of property values to match.
15627       * @returns {Function} Returns the new spec function.
15628       * @example
15629       *
15630       * var objects = [
15631       *   { 'a': 1, 'b': 2, 'c': 3 },
15632       *   { 'a': 4, 'b': 5, 'c': 6 }
15633       * ];
15634       *
15635       * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
15636       * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
15637       *
15638       * // Checking for several possible values
15639       * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
15640       * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
15641       */
15642      function matches(source) {
15643        return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
15644      }
15645  
15646      /**
15647       * Creates a function that performs a partial deep comparison between the
15648       * value at `path` of a given object to `srcValue`, returning `true` if the
15649       * object value is equivalent, else `false`.
15650       *
15651       * **Note:** Partial comparisons will match empty array and empty object
15652       * `srcValue` values against any array or object value, respectively. See
15653       * `_.isEqual` for a list of supported value comparisons.
15654       *
15655       * **Note:** Multiple values can be checked by combining several matchers
15656       * using `_.overSome`
15657       *
15658       * @static
15659       * @memberOf _
15660       * @since 3.2.0
15661       * @category Util
15662       * @param {Array|string} path The path of the property to get.
15663       * @param {*} srcValue The value to match.
15664       * @returns {Function} Returns the new spec function.
15665       * @example
15666       *
15667       * var objects = [
15668       *   { 'a': 1, 'b': 2, 'c': 3 },
15669       *   { 'a': 4, 'b': 5, 'c': 6 }
15670       * ];
15671       *
15672       * _.find(objects, _.matchesProperty('a', 4));
15673       * // => { 'a': 4, 'b': 5, 'c': 6 }
15674       *
15675       * // Checking for several possible values
15676       * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
15677       * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
15678       */
15679      function matchesProperty(path, srcValue) {
15680        return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
15681      }
15682  
15683      /**
15684       * Creates a function that invokes the method at `path` of a given object.
15685       * Any additional arguments are provided to the invoked method.
15686       *
15687       * @static
15688       * @memberOf _
15689       * @since 3.7.0
15690       * @category Util
15691       * @param {Array|string} path The path of the method to invoke.
15692       * @param {...*} [args] The arguments to invoke the method with.
15693       * @returns {Function} Returns the new invoker function.
15694       * @example
15695       *
15696       * var objects = [
15697       *   { 'a': { 'b': _.constant(2) } },
15698       *   { 'a': { 'b': _.constant(1) } }
15699       * ];
15700       *
15701       * _.map(objects, _.method('a.b'));
15702       * // => [2, 1]
15703       *
15704       * _.map(objects, _.method(['a', 'b']));
15705       * // => [2, 1]
15706       */
15707      var method = baseRest(function(path, args) {
15708        return function(object) {
15709          return baseInvoke(object, path, args);
15710        };
15711      });
15712  
15713      /**
15714       * The opposite of `_.method`; this method creates a function that invokes
15715       * the method at a given path of `object`. Any additional arguments are
15716       * provided to the invoked method.
15717       *
15718       * @static
15719       * @memberOf _
15720       * @since 3.7.0
15721       * @category Util
15722       * @param {Object} object The object to query.
15723       * @param {...*} [args] The arguments to invoke the method with.
15724       * @returns {Function} Returns the new invoker function.
15725       * @example
15726       *
15727       * var array = _.times(3, _.constant),
15728       *     object = { 'a': array, 'b': array, 'c': array };
15729       *
15730       * _.map(['a[2]', 'c[0]'], _.methodOf(object));
15731       * // => [2, 0]
15732       *
15733       * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
15734       * // => [2, 0]
15735       */
15736      var methodOf = baseRest(function(object, args) {
15737        return function(path) {
15738          return baseInvoke(object, path, args);
15739        };
15740      });
15741  
15742      /**
15743       * Adds all own enumerable string keyed function properties of a source
15744       * object to the destination object. If `object` is a function, then methods
15745       * are added to its prototype as well.
15746       *
15747       * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
15748       * avoid conflicts caused by modifying the original.
15749       *
15750       * @static
15751       * @since 0.1.0
15752       * @memberOf _
15753       * @category Util
15754       * @param {Function|Object} [object=lodash] The destination object.
15755       * @param {Object} source The object of functions to add.
15756       * @param {Object} [options={}] The options object.
15757       * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
15758       * @returns {Function|Object} Returns `object`.
15759       * @example
15760       *
15761       * function vowels(string) {
15762       *   return _.filter(string, function(v) {
15763       *     return /[aeiou]/i.test(v);
15764       *   });
15765       * }
15766       *
15767       * _.mixin({ 'vowels': vowels });
15768       * _.vowels('fred');
15769       * // => ['e']
15770       *
15771       * _('fred').vowels().value();
15772       * // => ['e']
15773       *
15774       * _.mixin({ 'vowels': vowels }, { 'chain': false });
15775       * _('fred').vowels();
15776       * // => ['e']
15777       */
15778      function mixin(object, source, options) {
15779        var props = keys(source),
15780            methodNames = baseFunctions(source, props);
15781  
15782        if (options == null &&
15783            !(isObject(source) && (methodNames.length || !props.length))) {
15784          options = source;
15785          source = object;
15786          object = this;
15787          methodNames = baseFunctions(source, keys(source));
15788        }
15789        var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
15790            isFunc = isFunction(object);
15791  
15792        arrayEach(methodNames, function(methodName) {
15793          var func = source[methodName];
15794          object[methodName] = func;
15795          if (isFunc) {
15796            object.prototype[methodName] = function() {
15797              var chainAll = this.__chain__;
15798              if (chain || chainAll) {
15799                var result = object(this.__wrapped__),
15800                    actions = result.__actions__ = copyArray(this.__actions__);
15801  
15802                actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
15803                result.__chain__ = chainAll;
15804                return result;
15805              }
15806              return func.apply(object, arrayPush([this.value()], arguments));
15807            };
15808          }
15809        });
15810  
15811        return object;
15812      }
15813  
15814      /**
15815       * Reverts the `_` variable to its previous value and returns a reference to
15816       * the `lodash` function.
15817       *
15818       * @static
15819       * @since 0.1.0
15820       * @memberOf _
15821       * @category Util
15822       * @returns {Function} Returns the `lodash` function.
15823       * @example
15824       *
15825       * var lodash = _.noConflict();
15826       */
15827      function noConflict() {
15828        if (root._ === this) {
15829          root._ = oldDash;
15830        }
15831        return this;
15832      }
15833  
15834      /**
15835       * This method returns `undefined`.
15836       *
15837       * @static
15838       * @memberOf _
15839       * @since 2.3.0
15840       * @category Util
15841       * @example
15842       *
15843       * _.times(2, _.noop);
15844       * // => [undefined, undefined]
15845       */
15846      function noop() {
15847        // No operation performed.
15848      }
15849  
15850      /**
15851       * Creates a function that gets the argument at index `n`. If `n` is negative,
15852       * the nth argument from the end is returned.
15853       *
15854       * @static
15855       * @memberOf _
15856       * @since 4.0.0
15857       * @category Util
15858       * @param {number} [n=0] The index of the argument to return.
15859       * @returns {Function} Returns the new pass-thru function.
15860       * @example
15861       *
15862       * var func = _.nthArg(1);
15863       * func('a', 'b', 'c', 'd');
15864       * // => 'b'
15865       *
15866       * var func = _.nthArg(-2);
15867       * func('a', 'b', 'c', 'd');
15868       * // => 'c'
15869       */
15870      function nthArg(n) {
15871        n = toInteger(n);
15872        return baseRest(function(args) {
15873          return baseNth(args, n);
15874        });
15875      }
15876  
15877      /**
15878       * Creates a function that invokes `iteratees` with the arguments it receives
15879       * and returns their results.
15880       *
15881       * @static
15882       * @memberOf _
15883       * @since 4.0.0
15884       * @category Util
15885       * @param {...(Function|Function[])} [iteratees=[_.identity]]
15886       *  The iteratees to invoke.
15887       * @returns {Function} Returns the new function.
15888       * @example
15889       *
15890       * var func = _.over([Math.max, Math.min]);
15891       *
15892       * func(1, 2, 3, 4);
15893       * // => [4, 1]
15894       */
15895      var over = createOver(arrayMap);
15896  
15897      /**
15898       * Creates a function that checks if **all** of the `predicates` return
15899       * truthy when invoked with the arguments it receives.
15900       *
15901       * Following shorthands are possible for providing predicates.
15902       * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
15903       * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
15904       *
15905       * @static
15906       * @memberOf _
15907       * @since 4.0.0
15908       * @category Util
15909       * @param {...(Function|Function[])} [predicates=[_.identity]]
15910       *  The predicates to check.
15911       * @returns {Function} Returns the new function.
15912       * @example
15913       *
15914       * var func = _.overEvery([Boolean, isFinite]);
15915       *
15916       * func('1');
15917       * // => true
15918       *
15919       * func(null);
15920       * // => false
15921       *
15922       * func(NaN);
15923       * // => false
15924       */
15925      var overEvery = createOver(arrayEvery);
15926  
15927      /**
15928       * Creates a function that checks if **any** of the `predicates` return
15929       * truthy when invoked with the arguments it receives.
15930       *
15931       * Following shorthands are possible for providing predicates.
15932       * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
15933       * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
15934       *
15935       * @static
15936       * @memberOf _
15937       * @since 4.0.0
15938       * @category Util
15939       * @param {...(Function|Function[])} [predicates=[_.identity]]
15940       *  The predicates to check.
15941       * @returns {Function} Returns the new function.
15942       * @example
15943       *
15944       * var func = _.overSome([Boolean, isFinite]);
15945       *
15946       * func('1');
15947       * // => true
15948       *
15949       * func(null);
15950       * // => true
15951       *
15952       * func(NaN);
15953       * // => false
15954       *
15955       * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
15956       * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
15957       */
15958      var overSome = createOver(arraySome);
15959  
15960      /**
15961       * Creates a function that returns the value at `path` of a given object.
15962       *
15963       * @static
15964       * @memberOf _
15965       * @since 2.4.0
15966       * @category Util
15967       * @param {Array|string} path The path of the property to get.
15968       * @returns {Function} Returns the new accessor function.
15969       * @example
15970       *
15971       * var objects = [
15972       *   { 'a': { 'b': 2 } },
15973       *   { 'a': { 'b': 1 } }
15974       * ];
15975       *
15976       * _.map(objects, _.property('a.b'));
15977       * // => [2, 1]
15978       *
15979       * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
15980       * // => [1, 2]
15981       */
15982      function property(path) {
15983        return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
15984      }
15985  
15986      /**
15987       * The opposite of `_.property`; this method creates a function that returns
15988       * the value at a given path of `object`.
15989       *
15990       * @static
15991       * @memberOf _
15992       * @since 3.0.0
15993       * @category Util
15994       * @param {Object} object The object to query.
15995       * @returns {Function} Returns the new accessor function.
15996       * @example
15997       *
15998       * var array = [0, 1, 2],
15999       *     object = { 'a': array, 'b': array, 'c': array };
16000       *
16001       * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
16002       * // => [2, 0]
16003       *
16004       * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
16005       * // => [2, 0]
16006       */
16007      function propertyOf(object) {
16008        return function(path) {
16009          return object == null ? undefined : baseGet(object, path);
16010        };
16011      }
16012  
16013      /**
16014       * Creates an array of numbers (positive and/or negative) progressing from
16015       * `start` up to, but not including, `end`. A step of `-1` is used if a negative
16016       * `start` is specified without an `end` or `step`. If `end` is not specified,
16017       * it's set to `start` with `start` then set to `0`.
16018       *
16019       * **Note:** JavaScript follows the IEEE-754 standard for resolving
16020       * floating-point values which can produce unexpected results.
16021       *
16022       * @static
16023       * @since 0.1.0
16024       * @memberOf _
16025       * @category Util
16026       * @param {number} [start=0] The start of the range.
16027       * @param {number} end The end of the range.
16028       * @param {number} [step=1] The value to increment or decrement by.
16029       * @returns {Array} Returns the range of numbers.
16030       * @see _.inRange, _.rangeRight
16031       * @example
16032       *
16033       * _.range(4);
16034       * // => [0, 1, 2, 3]
16035       *
16036       * _.range(-4);
16037       * // => [0, -1, -2, -3]
16038       *
16039       * _.range(1, 5);
16040       * // => [1, 2, 3, 4]
16041       *
16042       * _.range(0, 20, 5);
16043       * // => [0, 5, 10, 15]
16044       *
16045       * _.range(0, -4, -1);
16046       * // => [0, -1, -2, -3]
16047       *
16048       * _.range(1, 4, 0);
16049       * // => [1, 1, 1]
16050       *
16051       * _.range(0);
16052       * // => []
16053       */
16054      var range = createRange();
16055  
16056      /**
16057       * This method is like `_.range` except that it populates values in
16058       * descending order.
16059       *
16060       * @static
16061       * @memberOf _
16062       * @since 4.0.0
16063       * @category Util
16064       * @param {number} [start=0] The start of the range.
16065       * @param {number} end The end of the range.
16066       * @param {number} [step=1] The value to increment or decrement by.
16067       * @returns {Array} Returns the range of numbers.
16068       * @see _.inRange, _.range
16069       * @example
16070       *
16071       * _.rangeRight(4);
16072       * // => [3, 2, 1, 0]
16073       *
16074       * _.rangeRight(-4);
16075       * // => [-3, -2, -1, 0]
16076       *
16077       * _.rangeRight(1, 5);
16078       * // => [4, 3, 2, 1]
16079       *
16080       * _.rangeRight(0, 20, 5);
16081       * // => [15, 10, 5, 0]
16082       *
16083       * _.rangeRight(0, -4, -1);
16084       * // => [-3, -2, -1, 0]
16085       *
16086       * _.rangeRight(1, 4, 0);
16087       * // => [1, 1, 1]
16088       *
16089       * _.rangeRight(0);
16090       * // => []
16091       */
16092      var rangeRight = createRange(true);
16093  
16094      /**
16095       * This method returns a new empty array.
16096       *
16097       * @static
16098       * @memberOf _
16099       * @since 4.13.0
16100       * @category Util
16101       * @returns {Array} Returns the new empty array.
16102       * @example
16103       *
16104       * var arrays = _.times(2, _.stubArray);
16105       *
16106       * console.log(arrays);
16107       * // => [[], []]
16108       *
16109       * console.log(arrays[0] === arrays[1]);
16110       * // => false
16111       */
16112      function stubArray() {
16113        return [];
16114      }
16115  
16116      /**
16117       * This method returns `false`.
16118       *
16119       * @static
16120       * @memberOf _
16121       * @since 4.13.0
16122       * @category Util
16123       * @returns {boolean} Returns `false`.
16124       * @example
16125       *
16126       * _.times(2, _.stubFalse);
16127       * // => [false, false]
16128       */
16129      function stubFalse() {
16130        return false;
16131      }
16132  
16133      /**
16134       * This method returns a new empty object.
16135       *
16136       * @static
16137       * @memberOf _
16138       * @since 4.13.0
16139       * @category Util
16140       * @returns {Object} Returns the new empty object.
16141       * @example
16142       *
16143       * var objects = _.times(2, _.stubObject);
16144       *
16145       * console.log(objects);
16146       * // => [{}, {}]
16147       *
16148       * console.log(objects[0] === objects[1]);
16149       * // => false
16150       */
16151      function stubObject() {
16152        return {};
16153      }
16154  
16155      /**
16156       * This method returns an empty string.
16157       *
16158       * @static
16159       * @memberOf _
16160       * @since 4.13.0
16161       * @category Util
16162       * @returns {string} Returns the empty string.
16163       * @example
16164       *
16165       * _.times(2, _.stubString);
16166       * // => ['', '']
16167       */
16168      function stubString() {
16169        return '';
16170      }
16171  
16172      /**
16173       * This method returns `true`.
16174       *
16175       * @static
16176       * @memberOf _
16177       * @since 4.13.0
16178       * @category Util
16179       * @returns {boolean} Returns `true`.
16180       * @example
16181       *
16182       * _.times(2, _.stubTrue);
16183       * // => [true, true]
16184       */
16185      function stubTrue() {
16186        return true;
16187      }
16188  
16189      /**
16190       * Invokes the iteratee `n` times, returning an array of the results of
16191       * each invocation. The iteratee is invoked with one argument; (index).
16192       *
16193       * @static
16194       * @since 0.1.0
16195       * @memberOf _
16196       * @category Util
16197       * @param {number} n The number of times to invoke `iteratee`.
16198       * @param {Function} [iteratee=_.identity] The function invoked per iteration.
16199       * @returns {Array} Returns the array of results.
16200       * @example
16201       *
16202       * _.times(3, String);
16203       * // => ['0', '1', '2']
16204       *
16205       *  _.times(4, _.constant(0));
16206       * // => [0, 0, 0, 0]
16207       */
16208      function times(n, iteratee) {
16209        n = toInteger(n);
16210        if (n < 1 || n > MAX_SAFE_INTEGER) {
16211          return [];
16212        }
16213        var index = MAX_ARRAY_LENGTH,
16214            length = nativeMin(n, MAX_ARRAY_LENGTH);
16215  
16216        iteratee = getIteratee(iteratee);
16217        n -= MAX_ARRAY_LENGTH;
16218  
16219        var result = baseTimes(length, iteratee);
16220        while (++index < n) {
16221          iteratee(index);
16222        }
16223        return result;
16224      }
16225  
16226      /**
16227       * Converts `value` to a property path array.
16228       *
16229       * @static
16230       * @memberOf _
16231       * @since 4.0.0
16232       * @category Util
16233       * @param {*} value The value to convert.
16234       * @returns {Array} Returns the new property path array.
16235       * @example
16236       *
16237       * _.toPath('a.b.c');
16238       * // => ['a', 'b', 'c']
16239       *
16240       * _.toPath('a[0].b.c');
16241       * // => ['a', '0', 'b', 'c']
16242       */
16243      function toPath(value) {
16244        if (isArray(value)) {
16245          return arrayMap(value, toKey);
16246        }
16247        return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
16248      }
16249  
16250      /**
16251       * Generates a unique ID. If `prefix` is given, the ID is appended to it.
16252       *
16253       * @static
16254       * @since 0.1.0
16255       * @memberOf _
16256       * @category Util
16257       * @param {string} [prefix=''] The value to prefix the ID with.
16258       * @returns {string} Returns the unique ID.
16259       * @example
16260       *
16261       * _.uniqueId('contact_');
16262       * // => 'contact_104'
16263       *
16264       * _.uniqueId();
16265       * // => '105'
16266       */
16267      function uniqueId(prefix) {
16268        var id = ++idCounter;
16269        return toString(prefix) + id;
16270      }
16271  
16272      /*------------------------------------------------------------------------*/
16273  
16274      /**
16275       * Adds two numbers.
16276       *
16277       * @static
16278       * @memberOf _
16279       * @since 3.4.0
16280       * @category Math
16281       * @param {number} augend The first number in an addition.
16282       * @param {number} addend The second number in an addition.
16283       * @returns {number} Returns the total.
16284       * @example
16285       *
16286       * _.add(6, 4);
16287       * // => 10
16288       */
16289      var add = createMathOperation(function(augend, addend) {
16290        return augend + addend;
16291      }, 0);
16292  
16293      /**
16294       * Computes `number` rounded up to `precision`.
16295       *
16296       * @static
16297       * @memberOf _
16298       * @since 3.10.0
16299       * @category Math
16300       * @param {number} number The number to round up.
16301       * @param {number} [precision=0] The precision to round up to.
16302       * @returns {number} Returns the rounded up number.
16303       * @example
16304       *
16305       * _.ceil(4.006);
16306       * // => 5
16307       *
16308       * _.ceil(6.004, 2);
16309       * // => 6.01
16310       *
16311       * _.ceil(6040, -2);
16312       * // => 6100
16313       */
16314      var ceil = createRound('ceil');
16315  
16316      /**
16317       * Divide two numbers.
16318       *
16319       * @static
16320       * @memberOf _
16321       * @since 4.7.0
16322       * @category Math
16323       * @param {number} dividend The first number in a division.
16324       * @param {number} divisor The second number in a division.
16325       * @returns {number} Returns the quotient.
16326       * @example
16327       *
16328       * _.divide(6, 4);
16329       * // => 1.5
16330       */
16331      var divide = createMathOperation(function(dividend, divisor) {
16332        return dividend / divisor;
16333      }, 1);
16334  
16335      /**
16336       * Computes `number` rounded down to `precision`.
16337       *
16338       * @static
16339       * @memberOf _
16340       * @since 3.10.0
16341       * @category Math
16342       * @param {number} number The number to round down.
16343       * @param {number} [precision=0] The precision to round down to.
16344       * @returns {number} Returns the rounded down number.
16345       * @example
16346       *
16347       * _.floor(4.006);
16348       * // => 4
16349       *
16350       * _.floor(0.046, 2);
16351       * // => 0.04
16352       *
16353       * _.floor(4060, -2);
16354       * // => 4000
16355       */
16356      var floor = createRound('floor');
16357  
16358      /**
16359       * Computes the maximum value of `array`. If `array` is empty or falsey,
16360       * `undefined` is returned.
16361       *
16362       * @static
16363       * @since 0.1.0
16364       * @memberOf _
16365       * @category Math
16366       * @param {Array} array The array to iterate over.
16367       * @returns {*} Returns the maximum value.
16368       * @example
16369       *
16370       * _.max([4, 2, 8, 6]);
16371       * // => 8
16372       *
16373       * _.max([]);
16374       * // => undefined
16375       */
16376      function max(array) {
16377        return (array && array.length)
16378          ? baseExtremum(array, identity, baseGt)
16379          : undefined;
16380      }
16381  
16382      /**
16383       * This method is like `_.max` except that it accepts `iteratee` which is
16384       * invoked for each element in `array` to generate the criterion by which
16385       * the value is ranked. The iteratee is invoked with one argument: (value).
16386       *
16387       * @static
16388       * @memberOf _
16389       * @since 4.0.0
16390       * @category Math
16391       * @param {Array} array The array to iterate over.
16392       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16393       * @returns {*} Returns the maximum value.
16394       * @example
16395       *
16396       * var objects = [{ 'n': 1 }, { 'n': 2 }];
16397       *
16398       * _.maxBy(objects, function(o) { return o.n; });
16399       * // => { 'n': 2 }
16400       *
16401       * // The `_.property` iteratee shorthand.
16402       * _.maxBy(objects, 'n');
16403       * // => { 'n': 2 }
16404       */
16405      function maxBy(array, iteratee) {
16406        return (array && array.length)
16407          ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
16408          : undefined;
16409      }
16410  
16411      /**
16412       * Computes the mean of the values in `array`.
16413       *
16414       * @static
16415       * @memberOf _
16416       * @since 4.0.0
16417       * @category Math
16418       * @param {Array} array The array to iterate over.
16419       * @returns {number} Returns the mean.
16420       * @example
16421       *
16422       * _.mean([4, 2, 8, 6]);
16423       * // => 5
16424       */
16425      function mean(array) {
16426        return baseMean(array, identity);
16427      }
16428  
16429      /**
16430       * This method is like `_.mean` except that it accepts `iteratee` which is
16431       * invoked for each element in `array` to generate the value to be averaged.
16432       * The iteratee is invoked with one argument: (value).
16433       *
16434       * @static
16435       * @memberOf _
16436       * @since 4.7.0
16437       * @category Math
16438       * @param {Array} array The array to iterate over.
16439       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16440       * @returns {number} Returns the mean.
16441       * @example
16442       *
16443       * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16444       *
16445       * _.meanBy(objects, function(o) { return o.n; });
16446       * // => 5
16447       *
16448       * // The `_.property` iteratee shorthand.
16449       * _.meanBy(objects, 'n');
16450       * // => 5
16451       */
16452      function meanBy(array, iteratee) {
16453        return baseMean(array, getIteratee(iteratee, 2));
16454      }
16455  
16456      /**
16457       * Computes the minimum value of `array`. If `array` is empty or falsey,
16458       * `undefined` is returned.
16459       *
16460       * @static
16461       * @since 0.1.0
16462       * @memberOf _
16463       * @category Math
16464       * @param {Array} array The array to iterate over.
16465       * @returns {*} Returns the minimum value.
16466       * @example
16467       *
16468       * _.min([4, 2, 8, 6]);
16469       * // => 2
16470       *
16471       * _.min([]);
16472       * // => undefined
16473       */
16474      function min(array) {
16475        return (array && array.length)
16476          ? baseExtremum(array, identity, baseLt)
16477          : undefined;
16478      }
16479  
16480      /**
16481       * This method is like `_.min` except that it accepts `iteratee` which is
16482       * invoked for each element in `array` to generate the criterion by which
16483       * the value is ranked. The iteratee is invoked with one argument: (value).
16484       *
16485       * @static
16486       * @memberOf _
16487       * @since 4.0.0
16488       * @category Math
16489       * @param {Array} array The array to iterate over.
16490       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16491       * @returns {*} Returns the minimum value.
16492       * @example
16493       *
16494       * var objects = [{ 'n': 1 }, { 'n': 2 }];
16495       *
16496       * _.minBy(objects, function(o) { return o.n; });
16497       * // => { 'n': 1 }
16498       *
16499       * // The `_.property` iteratee shorthand.
16500       * _.minBy(objects, 'n');
16501       * // => { 'n': 1 }
16502       */
16503      function minBy(array, iteratee) {
16504        return (array && array.length)
16505          ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
16506          : undefined;
16507      }
16508  
16509      /**
16510       * Multiply two numbers.
16511       *
16512       * @static
16513       * @memberOf _
16514       * @since 4.7.0
16515       * @category Math
16516       * @param {number} multiplier The first number in a multiplication.
16517       * @param {number} multiplicand The second number in a multiplication.
16518       * @returns {number} Returns the product.
16519       * @example
16520       *
16521       * _.multiply(6, 4);
16522       * // => 24
16523       */
16524      var multiply = createMathOperation(function(multiplier, multiplicand) {
16525        return multiplier * multiplicand;
16526      }, 1);
16527  
16528      /**
16529       * Computes `number` rounded to `precision`.
16530       *
16531       * @static
16532       * @memberOf _
16533       * @since 3.10.0
16534       * @category Math
16535       * @param {number} number The number to round.
16536       * @param {number} [precision=0] The precision to round to.
16537       * @returns {number} Returns the rounded number.
16538       * @example
16539       *
16540       * _.round(4.006);
16541       * // => 4
16542       *
16543       * _.round(4.006, 2);
16544       * // => 4.01
16545       *
16546       * _.round(4060, -2);
16547       * // => 4100
16548       */
16549      var round = createRound('round');
16550  
16551      /**
16552       * Subtract two numbers.
16553       *
16554       * @static
16555       * @memberOf _
16556       * @since 4.0.0
16557       * @category Math
16558       * @param {number} minuend The first number in a subtraction.
16559       * @param {number} subtrahend The second number in a subtraction.
16560       * @returns {number} Returns the difference.
16561       * @example
16562       *
16563       * _.subtract(6, 4);
16564       * // => 2
16565       */
16566      var subtract = createMathOperation(function(minuend, subtrahend) {
16567        return minuend - subtrahend;
16568      }, 0);
16569  
16570      /**
16571       * Computes the sum of the values in `array`.
16572       *
16573       * @static
16574       * @memberOf _
16575       * @since 3.4.0
16576       * @category Math
16577       * @param {Array} array The array to iterate over.
16578       * @returns {number} Returns the sum.
16579       * @example
16580       *
16581       * _.sum([4, 2, 8, 6]);
16582       * // => 20
16583       */
16584      function sum(array) {
16585        return (array && array.length)
16586          ? baseSum(array, identity)
16587          : 0;
16588      }
16589  
16590      /**
16591       * This method is like `_.sum` except that it accepts `iteratee` which is
16592       * invoked for each element in `array` to generate the value to be summed.
16593       * The iteratee is invoked with one argument: (value).
16594       *
16595       * @static
16596       * @memberOf _
16597       * @since 4.0.0
16598       * @category Math
16599       * @param {Array} array The array to iterate over.
16600       * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16601       * @returns {number} Returns the sum.
16602       * @example
16603       *
16604       * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16605       *
16606       * _.sumBy(objects, function(o) { return o.n; });
16607       * // => 20
16608       *
16609       * // The `_.property` iteratee shorthand.
16610       * _.sumBy(objects, 'n');
16611       * // => 20
16612       */
16613      function sumBy(array, iteratee) {
16614        return (array && array.length)
16615          ? baseSum(array, getIteratee(iteratee, 2))
16616          : 0;
16617      }
16618  
16619      /*------------------------------------------------------------------------*/
16620  
16621      // Add methods that return wrapped values in chain sequences.
16622      lodash.after = after;
16623      lodash.ary = ary;
16624      lodash.assign = assign;
16625      lodash.assignIn = assignIn;
16626      lodash.assignInWith = assignInWith;
16627      lodash.assignWith = assignWith;
16628      lodash.at = at;
16629      lodash.before = before;
16630      lodash.bind = bind;
16631      lodash.bindAll = bindAll;
16632      lodash.bindKey = bindKey;
16633      lodash.castArray = castArray;
16634      lodash.chain = chain;
16635      lodash.chunk = chunk;
16636      lodash.compact = compact;
16637      lodash.concat = concat;
16638      lodash.cond = cond;
16639      lodash.conforms = conforms;
16640      lodash.constant = constant;
16641      lodash.countBy = countBy;
16642      lodash.create = create;
16643      lodash.curry = curry;
16644      lodash.curryRight = curryRight;
16645      lodash.debounce = debounce;
16646      lodash.defaults = defaults;
16647      lodash.defaultsDeep = defaultsDeep;
16648      lodash.defer = defer;
16649      lodash.delay = delay;
16650      lodash.difference = difference;
16651      lodash.differenceBy = differenceBy;
16652      lodash.differenceWith = differenceWith;
16653      lodash.drop = drop;
16654      lodash.dropRight = dropRight;
16655      lodash.dropRightWhile = dropRightWhile;
16656      lodash.dropWhile = dropWhile;
16657      lodash.fill = fill;
16658      lodash.filter = filter;
16659      lodash.flatMap = flatMap;
16660      lodash.flatMapDeep = flatMapDeep;
16661      lodash.flatMapDepth = flatMapDepth;
16662      lodash.flatten = flatten;
16663      lodash.flattenDeep = flattenDeep;
16664      lodash.flattenDepth = flattenDepth;
16665      lodash.flip = flip;
16666      lodash.flow = flow;
16667      lodash.flowRight = flowRight;
16668      lodash.fromPairs = fromPairs;
16669      lodash.functions = functions;
16670      lodash.functionsIn = functionsIn;
16671      lodash.groupBy = groupBy;
16672      lodash.initial = initial;
16673      lodash.intersection = intersection;
16674      lodash.intersectionBy = intersectionBy;
16675      lodash.intersectionWith = intersectionWith;
16676      lodash.invert = invert;
16677      lodash.invertBy = invertBy;
16678      lodash.invokeMap = invokeMap;
16679      lodash.iteratee = iteratee;
16680      lodash.keyBy = keyBy;
16681      lodash.keys = keys;
16682      lodash.keysIn = keysIn;
16683      lodash.map = map;
16684      lodash.mapKeys = mapKeys;
16685      lodash.mapValues = mapValues;
16686      lodash.matches = matches;
16687      lodash.matchesProperty = matchesProperty;
16688      lodash.memoize = memoize;
16689      lodash.merge = merge;
16690      lodash.mergeWith = mergeWith;
16691      lodash.method = method;
16692      lodash.methodOf = methodOf;
16693      lodash.mixin = mixin;
16694      lodash.negate = negate;
16695      lodash.nthArg = nthArg;
16696      lodash.omit = omit;
16697      lodash.omitBy = omitBy;
16698      lodash.once = once;
16699      lodash.orderBy = orderBy;
16700      lodash.over = over;
16701      lodash.overArgs = overArgs;
16702      lodash.overEvery = overEvery;
16703      lodash.overSome = overSome;
16704      lodash.partial = partial;
16705      lodash.partialRight = partialRight;
16706      lodash.partition = partition;
16707      lodash.pick = pick;
16708      lodash.pickBy = pickBy;
16709      lodash.property = property;
16710      lodash.propertyOf = propertyOf;
16711      lodash.pull = pull;
16712      lodash.pullAll = pullAll;
16713      lodash.pullAllBy = pullAllBy;
16714      lodash.pullAllWith = pullAllWith;
16715      lodash.pullAt = pullAt;
16716      lodash.range = range;
16717      lodash.rangeRight = rangeRight;
16718      lodash.rearg = rearg;
16719      lodash.reject = reject;
16720      lodash.remove = remove;
16721      lodash.rest = rest;
16722      lodash.reverse = reverse;
16723      lodash.sampleSize = sampleSize;
16724      lodash.set = set;
16725      lodash.setWith = setWith;
16726      lodash.shuffle = shuffle;
16727      lodash.slice = slice;
16728      lodash.sortBy = sortBy;
16729      lodash.sortedUniq = sortedUniq;
16730      lodash.sortedUniqBy = sortedUniqBy;
16731      lodash.split = split;
16732      lodash.spread = spread;
16733      lodash.tail = tail;
16734      lodash.take = take;
16735      lodash.takeRight = takeRight;
16736      lodash.takeRightWhile = takeRightWhile;
16737      lodash.takeWhile = takeWhile;
16738      lodash.tap = tap;
16739      lodash.throttle = throttle;
16740      lodash.thru = thru;
16741      lodash.toArray = toArray;
16742      lodash.toPairs = toPairs;
16743      lodash.toPairsIn = toPairsIn;
16744      lodash.toPath = toPath;
16745      lodash.toPlainObject = toPlainObject;
16746      lodash.transform = transform;
16747      lodash.unary = unary;
16748      lodash.union = union;
16749      lodash.unionBy = unionBy;
16750      lodash.unionWith = unionWith;
16751      lodash.uniq = uniq;
16752      lodash.uniqBy = uniqBy;
16753      lodash.uniqWith = uniqWith;
16754      lodash.unset = unset;
16755      lodash.unzip = unzip;
16756      lodash.unzipWith = unzipWith;
16757      lodash.update = update;
16758      lodash.updateWith = updateWith;
16759      lodash.values = values;
16760      lodash.valuesIn = valuesIn;
16761      lodash.without = without;
16762      lodash.words = words;
16763      lodash.wrap = wrap;
16764      lodash.xor = xor;
16765      lodash.xorBy = xorBy;
16766      lodash.xorWith = xorWith;
16767      lodash.zip = zip;
16768      lodash.zipObject = zipObject;
16769      lodash.zipObjectDeep = zipObjectDeep;
16770      lodash.zipWith = zipWith;
16771  
16772      // Add aliases.
16773      lodash.entries = toPairs;
16774      lodash.entriesIn = toPairsIn;
16775      lodash.extend = assignIn;
16776      lodash.extendWith = assignInWith;
16777  
16778      // Add methods to `lodash.prototype`.
16779      mixin(lodash, lodash);
16780  
16781      /*------------------------------------------------------------------------*/
16782  
16783      // Add methods that return unwrapped values in chain sequences.
16784      lodash.add = add;
16785      lodash.attempt = attempt;
16786      lodash.camelCase = camelCase;
16787      lodash.capitalize = capitalize;
16788      lodash.ceil = ceil;
16789      lodash.clamp = clamp;
16790      lodash.clone = clone;
16791      lodash.cloneDeep = cloneDeep;
16792      lodash.cloneDeepWith = cloneDeepWith;
16793      lodash.cloneWith = cloneWith;
16794      lodash.conformsTo = conformsTo;
16795      lodash.deburr = deburr;
16796      lodash.defaultTo = defaultTo;
16797      lodash.divide = divide;
16798      lodash.endsWith = endsWith;
16799      lodash.eq = eq;
16800      lodash.escape = escape;
16801      lodash.escapeRegExp = escapeRegExp;
16802      lodash.every = every;
16803      lodash.find = find;
16804      lodash.findIndex = findIndex;
16805      lodash.findKey = findKey;
16806      lodash.findLast = findLast;
16807      lodash.findLastIndex = findLastIndex;
16808      lodash.findLastKey = findLastKey;
16809      lodash.floor = floor;
16810      lodash.forEach = forEach;
16811      lodash.forEachRight = forEachRight;
16812      lodash.forIn = forIn;
16813      lodash.forInRight = forInRight;
16814      lodash.forOwn = forOwn;
16815      lodash.forOwnRight = forOwnRight;
16816      lodash.get = get;
16817      lodash.gt = gt;
16818      lodash.gte = gte;
16819      lodash.has = has;
16820      lodash.hasIn = hasIn;
16821      lodash.head = head;
16822      lodash.identity = identity;
16823      lodash.includes = includes;
16824      lodash.indexOf = indexOf;
16825      lodash.inRange = inRange;
16826      lodash.invoke = invoke;
16827      lodash.isArguments = isArguments;
16828      lodash.isArray = isArray;
16829      lodash.isArrayBuffer = isArrayBuffer;
16830      lodash.isArrayLike = isArrayLike;
16831      lodash.isArrayLikeObject = isArrayLikeObject;
16832      lodash.isBoolean = isBoolean;
16833      lodash.isBuffer = isBuffer;
16834      lodash.isDate = isDate;
16835      lodash.isElement = isElement;
16836      lodash.isEmpty = isEmpty;
16837      lodash.isEqual = isEqual;
16838      lodash.isEqualWith = isEqualWith;
16839      lodash.isError = isError;
16840      lodash.isFinite = isFinite;
16841      lodash.isFunction = isFunction;
16842      lodash.isInteger = isInteger;
16843      lodash.isLength = isLength;
16844      lodash.isMap = isMap;
16845      lodash.isMatch = isMatch;
16846      lodash.isMatchWith = isMatchWith;
16847      lodash.isNaN = isNaN;
16848      lodash.isNative = isNative;
16849      lodash.isNil = isNil;
16850      lodash.isNull = isNull;
16851      lodash.isNumber = isNumber;
16852      lodash.isObject = isObject;
16853      lodash.isObjectLike = isObjectLike;
16854      lodash.isPlainObject = isPlainObject;
16855      lodash.isRegExp = isRegExp;
16856      lodash.isSafeInteger = isSafeInteger;
16857      lodash.isSet = isSet;
16858      lodash.isString = isString;
16859      lodash.isSymbol = isSymbol;
16860      lodash.isTypedArray = isTypedArray;
16861      lodash.isUndefined = isUndefined;
16862      lodash.isWeakMap = isWeakMap;
16863      lodash.isWeakSet = isWeakSet;
16864      lodash.join = join;
16865      lodash.kebabCase = kebabCase;
16866      lodash.last = last;
16867      lodash.lastIndexOf = lastIndexOf;
16868      lodash.lowerCase = lowerCase;
16869      lodash.lowerFirst = lowerFirst;
16870      lodash.lt = lt;
16871      lodash.lte = lte;
16872      lodash.max = max;
16873      lodash.maxBy = maxBy;
16874      lodash.mean = mean;
16875      lodash.meanBy = meanBy;
16876      lodash.min = min;
16877      lodash.minBy = minBy;
16878      lodash.stubArray = stubArray;
16879      lodash.stubFalse = stubFalse;
16880      lodash.stubObject = stubObject;
16881      lodash.stubString = stubString;
16882      lodash.stubTrue = stubTrue;
16883      lodash.multiply = multiply;
16884      lodash.nth = nth;
16885      lodash.noConflict = noConflict;
16886      lodash.noop = noop;
16887      lodash.now = now;
16888      lodash.pad = pad;
16889      lodash.padEnd = padEnd;
16890      lodash.padStart = padStart;
16891      lodash.parseInt = parseInt;
16892      lodash.random = random;
16893      lodash.reduce = reduce;
16894      lodash.reduceRight = reduceRight;
16895      lodash.repeat = repeat;
16896      lodash.replace = replace;
16897      lodash.result = result;
16898      lodash.round = round;
16899      lodash.runInContext = runInContext;
16900      lodash.sample = sample;
16901      lodash.size = size;
16902      lodash.snakeCase = snakeCase;
16903      lodash.some = some;
16904      lodash.sortedIndex = sortedIndex;
16905      lodash.sortedIndexBy = sortedIndexBy;
16906      lodash.sortedIndexOf = sortedIndexOf;
16907      lodash.sortedLastIndex = sortedLastIndex;
16908      lodash.sortedLastIndexBy = sortedLastIndexBy;
16909      lodash.sortedLastIndexOf = sortedLastIndexOf;
16910      lodash.startCase = startCase;
16911      lodash.startsWith = startsWith;
16912      lodash.subtract = subtract;
16913      lodash.sum = sum;
16914      lodash.sumBy = sumBy;
16915      lodash.template = template;
16916      lodash.times = times;
16917      lodash.toFinite = toFinite;
16918      lodash.toInteger = toInteger;
16919      lodash.toLength = toLength;
16920      lodash.toLower = toLower;
16921      lodash.toNumber = toNumber;
16922      lodash.toSafeInteger = toSafeInteger;
16923      lodash.toString = toString;
16924      lodash.toUpper = toUpper;
16925      lodash.trim = trim;
16926      lodash.trimEnd = trimEnd;
16927      lodash.trimStart = trimStart;
16928      lodash.truncate = truncate;
16929      lodash.unescape = unescape;
16930      lodash.uniqueId = uniqueId;
16931      lodash.upperCase = upperCase;
16932      lodash.upperFirst = upperFirst;
16933  
16934      // Add aliases.
16935      lodash.each = forEach;
16936      lodash.eachRight = forEachRight;
16937      lodash.first = head;
16938  
16939      mixin(lodash, (function() {
16940        var source = {};
16941        baseForOwn(lodash, function(func, methodName) {
16942          if (!hasOwnProperty.call(lodash.prototype, methodName)) {
16943            source[methodName] = func;
16944          }
16945        });
16946        return source;
16947      }()), { 'chain': false });
16948  
16949      /*------------------------------------------------------------------------*/
16950  
16951      /**
16952       * The semantic version number.
16953       *
16954       * @static
16955       * @memberOf _
16956       * @type {string}
16957       */
16958      lodash.VERSION = VERSION;
16959  
16960      // Assign default placeholders.
16961      arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
16962        lodash[methodName].placeholder = lodash;
16963      });
16964  
16965      // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
16966      arrayEach(['drop', 'take'], function(methodName, index) {
16967        LazyWrapper.prototype[methodName] = function(n) {
16968          n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
16969  
16970          var result = (this.__filtered__ && !index)
16971            ? new LazyWrapper(this)
16972            : this.clone();
16973  
16974          if (result.__filtered__) {
16975            result.__takeCount__ = nativeMin(n, result.__takeCount__);
16976          } else {
16977            result.__views__.push({
16978              'size': nativeMin(n, MAX_ARRAY_LENGTH),
16979              'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
16980            });
16981          }
16982          return result;
16983        };
16984  
16985        LazyWrapper.prototype[methodName + 'Right'] = function(n) {
16986          return this.reverse()[methodName](n).reverse();
16987        };
16988      });
16989  
16990      // Add `LazyWrapper` methods that accept an `iteratee` value.
16991      arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
16992        var type = index + 1,
16993            isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
16994  
16995        LazyWrapper.prototype[methodName] = function(iteratee) {
16996          var result = this.clone();
16997          result.__iteratees__.push({
16998            'iteratee': getIteratee(iteratee, 3),
16999            'type': type
17000          });
17001          result.__filtered__ = result.__filtered__ || isFilter;
17002          return result;
17003        };
17004      });
17005  
17006      // Add `LazyWrapper` methods for `_.head` and `_.last`.
17007      arrayEach(['head', 'last'], function(methodName, index) {
17008        var takeName = 'take' + (index ? 'Right' : '');
17009  
17010        LazyWrapper.prototype[methodName] = function() {
17011          return this[takeName](1).value()[0];
17012        };
17013      });
17014  
17015      // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
17016      arrayEach(['initial', 'tail'], function(methodName, index) {
17017        var dropName = 'drop' + (index ? '' : 'Right');
17018  
17019        LazyWrapper.prototype[methodName] = function() {
17020          return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
17021        };
17022      });
17023  
17024      LazyWrapper.prototype.compact = function() {
17025        return this.filter(identity);
17026      };
17027  
17028      LazyWrapper.prototype.find = function(predicate) {
17029        return this.filter(predicate).head();
17030      };
17031  
17032      LazyWrapper.prototype.findLast = function(predicate) {
17033        return this.reverse().find(predicate);
17034      };
17035  
17036      LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
17037        if (typeof path == 'function') {
17038          return new LazyWrapper(this);
17039        }
17040        return this.map(function(value) {
17041          return baseInvoke(value, path, args);
17042        });
17043      });
17044  
17045      LazyWrapper.prototype.reject = function(predicate) {
17046        return this.filter(negate(getIteratee(predicate)));
17047      };
17048  
17049      LazyWrapper.prototype.slice = function(start, end) {
17050        start = toInteger(start);
17051  
17052        var result = this;
17053        if (result.__filtered__ && (start > 0 || end < 0)) {
17054          return new LazyWrapper(result);
17055        }
17056        if (start < 0) {
17057          result = result.takeRight(-start);
17058        } else if (start) {
17059          result = result.drop(start);
17060        }
17061        if (end !== undefined) {
17062          end = toInteger(end);
17063          result = end < 0 ? result.dropRight(-end) : result.take(end - start);
17064        }
17065        return result;
17066      };
17067  
17068      LazyWrapper.prototype.takeRightWhile = function(predicate) {
17069        return this.reverse().takeWhile(predicate).reverse();
17070      };
17071  
17072      LazyWrapper.prototype.toArray = function() {
17073        return this.take(MAX_ARRAY_LENGTH);
17074      };
17075  
17076      // Add `LazyWrapper` methods to `lodash.prototype`.
17077      baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17078        var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
17079            isTaker = /^(?:head|last)$/.test(methodName),
17080            lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
17081            retUnwrapped = isTaker || /^find/.test(methodName);
17082  
17083        if (!lodashFunc) {
17084          return;
17085        }
17086        lodash.prototype[methodName] = function() {
17087          var value = this.__wrapped__,
17088              args = isTaker ? [1] : arguments,
17089              isLazy = value instanceof LazyWrapper,
17090              iteratee = args[0],
17091              useLazy = isLazy || isArray(value);
17092  
17093          var interceptor = function(value) {
17094            var result = lodashFunc.apply(lodash, arrayPush([value], args));
17095            return (isTaker && chainAll) ? result[0] : result;
17096          };
17097  
17098          if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
17099            // Avoid lazy use if the iteratee has a "length" value other than `1`.
17100            isLazy = useLazy = false;
17101          }
17102          var chainAll = this.__chain__,
17103              isHybrid = !!this.__actions__.length,
17104              isUnwrapped = retUnwrapped && !chainAll,
17105              onlyLazy = isLazy && !isHybrid;
17106  
17107          if (!retUnwrapped && useLazy) {
17108            value = onlyLazy ? value : new LazyWrapper(this);
17109            var result = func.apply(value, args);
17110            result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
17111            return new LodashWrapper(result, chainAll);
17112          }
17113          if (isUnwrapped && onlyLazy) {
17114            return func.apply(this, args);
17115          }
17116          result = this.thru(interceptor);
17117          return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
17118        };
17119      });
17120  
17121      // Add `Array` methods to `lodash.prototype`.
17122      arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
17123        var func = arrayProto[methodName],
17124            chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
17125            retUnwrapped = /^(?:pop|shift)$/.test(methodName);
17126  
17127        lodash.prototype[methodName] = function() {
17128          var args = arguments;
17129          if (retUnwrapped && !this.__chain__) {
17130            var value = this.value();
17131            return func.apply(isArray(value) ? value : [], args);
17132          }
17133          return this[chainName](function(value) {
17134            return func.apply(isArray(value) ? value : [], args);
17135          });
17136        };
17137      });
17138  
17139      // Map minified method names to their real names.
17140      baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17141        var lodashFunc = lodash[methodName];
17142        if (lodashFunc) {
17143          var key = lodashFunc.name + '';
17144          if (!hasOwnProperty.call(realNames, key)) {
17145            realNames[key] = [];
17146          }
17147          realNames[key].push({ 'name': methodName, 'func': lodashFunc });
17148        }
17149      });
17150  
17151      realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
17152        'name': 'wrapper',
17153        'func': undefined
17154      }];
17155  
17156      // Add methods to `LazyWrapper`.
17157      LazyWrapper.prototype.clone = lazyClone;
17158      LazyWrapper.prototype.reverse = lazyReverse;
17159      LazyWrapper.prototype.value = lazyValue;
17160  
17161      // Add chain sequence methods to the `lodash` wrapper.
17162      lodash.prototype.at = wrapperAt;
17163      lodash.prototype.chain = wrapperChain;
17164      lodash.prototype.commit = wrapperCommit;
17165      lodash.prototype.next = wrapperNext;
17166      lodash.prototype.plant = wrapperPlant;
17167      lodash.prototype.reverse = wrapperReverse;
17168      lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
17169  
17170      // Add lazy aliases.
17171      lodash.prototype.first = lodash.prototype.head;
17172  
17173      if (symIterator) {
17174        lodash.prototype[symIterator] = wrapperToIterator;
17175      }
17176      return lodash;
17177    });
17178  
17179    /*--------------------------------------------------------------------------*/
17180  
17181    // Export lodash.
17182    var _ = runInContext();
17183  
17184    // Some AMD build optimizers, like r.js, check for condition patterns like:
17185    if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
17186      // Expose Lodash on the global object to prevent errors when Lodash is
17187      // loaded by a script tag in the presence of an AMD loader.
17188      // See http://requirejs.org/docs/errors.html#mismatch for more details.
17189      // Use `_.noConflict` to remove Lodash from the global object.
17190      root._ = _;
17191  
17192      // Define as an anonymous module so, through path mapping, it can be
17193      // referenced as the "underscore" module.
17194      define(function() {
17195        return _;
17196      });
17197    }
17198    // Check for `exports` after `define` in case a build optimizer adds it.
17199    else if (freeModule) {
17200      // Export for Node.js.
17201      (freeModule.exports = _)._ = _;
17202      // Export for CommonJS support.
17203      freeExports._ = _;
17204    }
17205    else {
17206      // Export to the global object.
17207      root._ = _;
17208    }
17209  }.call(this));


Generated : Sat Dec 21 08:20:01 2024 Cross-referenced by PHPXref