.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / lodash / lodash.js
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));