' + func(text) + '
';\n\t * });\n\t *\n\t * p('fred, barney, & pebbles');\n\t * // => 'fred, barney, & pebbles
'\n\t */\n\t function wrap(value, wrapper) {\n\t wrapper = wrapper == null ? identity : wrapper;\n\t return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);\n\t }\n\t\n\t /*------------------------------------------------------------------------*/\n\t\n\t /**\n\t * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n\t * otherwise they are assigned by reference. If `customizer` is provided it is\n\t * invoked to produce the cloned values. If `customizer` returns `undefined`\n\t * cloning is handled by the method instead. The `customizer` is bound to\n\t * `thisArg` and invoked with two argument; (value [, index|key, object]).\n\t *\n\t * **Note:** This method is loosely based on the\n\t * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n\t * The enumerable properties of `arguments` objects and objects created by\n\t * constructors other than `Object` are cloned to plain `Object` objects. An\n\t * empty object is returned for uncloneable values such as functions, DOM nodes,\n\t * Maps, Sets, and WeakMaps.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to clone.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @param {Function} [customizer] The function to customize cloning values.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {*} Returns the cloned value.\n\t * @example\n\t *\n\t * var users = [\n\t * { 'user': 'barney' },\n\t * { 'user': 'fred' }\n\t * ];\n\t *\n\t * var shallow = _.clone(users);\n\t * shallow[0] === users[0];\n\t * // => true\n\t *\n\t * var deep = _.clone(users, true);\n\t * deep[0] === users[0];\n\t * // => false\n\t *\n\t * // using a customizer callback\n\t * var el = _.clone(document.body, function(value) {\n\t * if (_.isElement(value)) {\n\t * return value.cloneNode(false);\n\t * }\n\t * });\n\t *\n\t * el === document.body\n\t * // => false\n\t * el.nodeName\n\t * // => BODY\n\t * el.childNodes.length;\n\t * // => 0\n\t */\n\t function clone(value, isDeep, customizer, thisArg) {\n\t if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n\t isDeep = false;\n\t }\n\t else if (typeof isDeep == 'function') {\n\t thisArg = customizer;\n\t customizer = isDeep;\n\t isDeep = false;\n\t }\n\t return typeof customizer == 'function'\n\t ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))\n\t : baseClone(value, isDeep);\n\t }\n\t\n\t /**\n\t * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n\t * to produce the cloned values. If `customizer` returns `undefined` cloning\n\t * is handled by the method instead. The `customizer` is bound to `thisArg`\n\t * and invoked with two argument; (value [, index|key, object]).\n\t *\n\t * **Note:** This method is loosely based on the\n\t * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n\t * The enumerable properties of `arguments` objects and objects created by\n\t * constructors other than `Object` are cloned to plain `Object` objects. An\n\t * empty object is returned for uncloneable values such as functions, DOM nodes,\n\t * Maps, Sets, and WeakMaps.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to deep clone.\n\t * @param {Function} [customizer] The function to customize cloning values.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {*} Returns the deep cloned value.\n\t * @example\n\t *\n\t * var users = [\n\t * { 'user': 'barney' },\n\t * { 'user': 'fred' }\n\t * ];\n\t *\n\t * var deep = _.cloneDeep(users);\n\t * deep[0] === users[0];\n\t * // => false\n\t *\n\t * // using a customizer callback\n\t * var el = _.cloneDeep(document.body, function(value) {\n\t * if (_.isElement(value)) {\n\t * return value.cloneNode(true);\n\t * }\n\t * });\n\t *\n\t * el === document.body\n\t * // => false\n\t * el.nodeName\n\t * // => BODY\n\t * el.childNodes.length;\n\t * // => 20\n\t */\n\t function cloneDeep(value, customizer, thisArg) {\n\t return typeof customizer == 'function'\n\t ? baseClone(value, true, bindCallback(customizer, thisArg, 1))\n\t : baseClone(value, true);\n\t }\n\t\n\t /**\n\t * Checks if `value` is greater than `other`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.\n\t * @example\n\t *\n\t * _.gt(3, 1);\n\t * // => true\n\t *\n\t * _.gt(3, 3);\n\t * // => false\n\t *\n\t * _.gt(1, 3);\n\t * // => false\n\t */\n\t function gt(value, other) {\n\t return value > other;\n\t }\n\t\n\t /**\n\t * Checks if `value` is greater than or equal to `other`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.\n\t * @example\n\t *\n\t * _.gte(3, 1);\n\t * // => true\n\t *\n\t * _.gte(3, 3);\n\t * // => true\n\t *\n\t * _.gte(1, 3);\n\t * // => false\n\t */\n\t function gte(value, other) {\n\t return value >= other;\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\t function isArguments(value) {\n\t return isObjectLike(value) && isArrayLike(value) &&\n\t hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(function() { return arguments; }());\n\t * // => false\n\t */\n\t var isArray = nativeIsArray || function(value) {\n\t return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n\t };\n\t\n\t /**\n\t * Checks if `value` is classified as a boolean primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isBoolean(false);\n\t * // => true\n\t *\n\t * _.isBoolean(null);\n\t * // => false\n\t */\n\t function isBoolean(value) {\n\t return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a `Date` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isDate(new Date);\n\t * // => true\n\t *\n\t * _.isDate('Mon April 23 2012');\n\t * // => false\n\t */\n\t function isDate(value) {\n\t return isObjectLike(value) && objToString.call(value) == dateTag;\n\t }\n\t\n\t /**\n\t * Checks if `value` is a DOM element.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n\t * @example\n\t *\n\t * _.isElement(document.body);\n\t * // => true\n\t *\n\t * _.isElement('');\n\t * // => false\n\t */\n\t function isElement(value) {\n\t return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n\t }\n\t\n\t /**\n\t * Checks if `value` is empty. A value is considered empty unless it is an\n\t * `arguments` object, array, string, or jQuery-like collection with a length\n\t * greater than `0` or an object with own enumerable properties.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {Array|Object|string} value The value to inspect.\n\t * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n\t * @example\n\t *\n\t * _.isEmpty(null);\n\t * // => true\n\t *\n\t * _.isEmpty(true);\n\t * // => true\n\t *\n\t * _.isEmpty(1);\n\t * // => true\n\t *\n\t * _.isEmpty([1, 2, 3]);\n\t * // => false\n\t *\n\t * _.isEmpty({ 'a': 1 });\n\t * // => false\n\t */\n\t function isEmpty(value) {\n\t if (value == null) {\n\t return true;\n\t }\n\t if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||\n\t (isObjectLike(value) && isFunction(value.splice)))) {\n\t return !value.length;\n\t }\n\t return !keys(value).length;\n\t }\n\t\n\t /**\n\t * Performs a deep comparison between two values to determine if they are\n\t * equivalent. If `customizer` is provided it is invoked to compare values.\n\t * If `customizer` returns `undefined` comparisons are handled by the method\n\t * instead. The `customizer` is bound to `thisArg` and invoked with three\n\t * arguments: (value, other [, index|key]).\n\t *\n\t * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n\t * numbers, `Object` objects, regexes, and strings. Objects are compared by\n\t * their own, not inherited, enumerable properties. Functions and DOM nodes\n\t * are **not** supported. Provide a customizer function to extend support\n\t * for comparing other values.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @alias eq\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @param {Function} [customizer] The function to customize value comparisons.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * object == other;\n\t * // => false\n\t *\n\t * _.isEqual(object, other);\n\t * // => true\n\t *\n\t * // using a customizer callback\n\t * var array = ['hello', 'goodbye'];\n\t * var other = ['hi', 'goodbye'];\n\t *\n\t * _.isEqual(array, other, function(value, other) {\n\t * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n\t * return true;\n\t * }\n\t * });\n\t * // => true\n\t */\n\t function isEqual(value, other, customizer, thisArg) {\n\t customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n\t var result = customizer ? customizer(value, other) : undefined;\n\t return result === undefined ? baseIsEqual(value, other, customizer) : !!result;\n\t }\n\t\n\t /**\n\t * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n\t * `SyntaxError`, `TypeError`, or `URIError` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n\t * @example\n\t *\n\t * _.isError(new Error);\n\t * // => true\n\t *\n\t * _.isError(Error);\n\t * // => false\n\t */\n\t function isError(value) {\n\t return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n\t }\n\t\n\t /**\n\t * Checks if `value` is a finite primitive number.\n\t *\n\t * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n\t * @example\n\t *\n\t * _.isFinite(10);\n\t * // => true\n\t *\n\t * _.isFinite('10');\n\t * // => false\n\t *\n\t * _.isFinite(true);\n\t * // => false\n\t *\n\t * _.isFinite(Object(10));\n\t * // => false\n\t *\n\t * _.isFinite(Infinity);\n\t * // => false\n\t */\n\t function isFinite(value) {\n\t return typeof value == 'number' && nativeIsFinite(value);\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\t function isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in older versions of Chrome and Safari which return 'function' for regexes\n\t // and Safari 8 equivalents which return 'object' for typed array constructors.\n\t return isObject(value) && objToString.call(value) == funcTag;\n\t }\n\t\n\t /**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(1);\n\t * // => false\n\t */\n\t function isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t }\n\t\n\t /**\n\t * Performs a deep comparison between `object` and `source` to determine if\n\t * `object` contains equivalent property values. If `customizer` is provided\n\t * it is invoked to compare values. If `customizer` returns `undefined`\n\t * comparisons are handled by the method instead. The `customizer` is bound\n\t * to `thisArg` and invoked with three arguments: (value, other, index|key).\n\t *\n\t * **Note:** This method supports comparing properties of arrays, booleans,\n\t * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n\t * and DOM nodes are **not** supported. Provide a customizer function to extend\n\t * support for comparing other values.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {Object} object The object to inspect.\n\t * @param {Object} source The object of property values to match.\n\t * @param {Function} [customizer] The function to customize value comparisons.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred', 'age': 40 };\n\t *\n\t * _.isMatch(object, { 'age': 40 });\n\t * // => true\n\t *\n\t * _.isMatch(object, { 'age': 36 });\n\t * // => false\n\t *\n\t * // using a customizer callback\n\t * var object = { 'greeting': 'hello' };\n\t * var source = { 'greeting': 'hi' };\n\t *\n\t * _.isMatch(object, source, function(value, other) {\n\t * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n\t * });\n\t * // => true\n\t */\n\t function isMatch(object, source, customizer, thisArg) {\n\t customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n\t return baseIsMatch(object, getMatchData(source), customizer);\n\t }\n\t\n\t /**\n\t * Checks if `value` is `NaN`.\n\t *\n\t * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n\t * which returns `true` for `undefined` and other non-numeric values.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n\t * @example\n\t *\n\t * _.isNaN(NaN);\n\t * // => true\n\t *\n\t * _.isNaN(new Number(NaN));\n\t * // => true\n\t *\n\t * isNaN(undefined);\n\t * // => true\n\t *\n\t * _.isNaN(undefined);\n\t * // => false\n\t */\n\t function isNaN(value) {\n\t // An `NaN` primitive is the only value that is not equal to itself.\n\t // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n\t return isNumber(value) && value != +value;\n\t }\n\t\n\t /**\n\t * Checks if `value` is a native function.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n\t * @example\n\t *\n\t * _.isNative(Array.prototype.push);\n\t * // => true\n\t *\n\t * _.isNative(_);\n\t * // => false\n\t */\n\t function isNative(value) {\n\t if (value == null) {\n\t return false;\n\t }\n\t if (isFunction(value)) {\n\t return reIsNative.test(fnToString.call(value));\n\t }\n\t return isObjectLike(value) && reIsHostCtor.test(value);\n\t }\n\t\n\t /**\n\t * Checks if `value` is `null`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n\t * @example\n\t *\n\t * _.isNull(null);\n\t * // => true\n\t *\n\t * _.isNull(void 0);\n\t * // => false\n\t */\n\t function isNull(value) {\n\t return value === null;\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a `Number` primitive or object.\n\t *\n\t * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n\t * as numbers, use the `_.isFinite` method.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isNumber(8.4);\n\t * // => true\n\t *\n\t * _.isNumber(NaN);\n\t * // => true\n\t *\n\t * _.isNumber('8.4');\n\t * // => false\n\t */\n\t function isNumber(value) {\n\t return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n\t }\n\t\n\t /**\n\t * Checks if `value` is a plain object, that is, an object created by the\n\t * `Object` constructor or one with a `[[Prototype]]` of `null`.\n\t *\n\t * **Note:** This method assumes objects created by the `Object` constructor\n\t * have no inherited enumerable properties.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * }\n\t *\n\t * _.isPlainObject(new Foo);\n\t * // => false\n\t *\n\t * _.isPlainObject([1, 2, 3]);\n\t * // => false\n\t *\n\t * _.isPlainObject({ 'x': 0, 'y': 0 });\n\t * // => true\n\t *\n\t * _.isPlainObject(Object.create(null));\n\t * // => true\n\t */\n\t function isPlainObject(value) {\n\t var Ctor;\n\t\n\t // Exit early for non `Object` objects.\n\t if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||\n\t (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n\t return false;\n\t }\n\t // IE < 9 iterates inherited properties before own properties. If the first\n\t // iterated property is an object's own property then there are no inherited\n\t // enumerable properties.\n\t var result;\n\t // In most environments an object's own properties are iterated before\n\t // its inherited properties. If the last iterated property is an object's\n\t // own property then there are no inherited enumerable properties.\n\t baseForIn(value, function(subValue, key) {\n\t result = key;\n\t });\n\t return result === undefined || hasOwnProperty.call(value, result);\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a `RegExp` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isRegExp(/abc/);\n\t * // => true\n\t *\n\t * _.isRegExp('/abc/');\n\t * // => false\n\t */\n\t function isRegExp(value) {\n\t return isObject(value) && objToString.call(value) == regexpTag;\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\t function isString(value) {\n\t return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n\t }\n\t\n\t /**\n\t * Checks if `value` is classified as a typed array.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isTypedArray(new Uint8Array);\n\t * // => true\n\t *\n\t * _.isTypedArray([]);\n\t * // => false\n\t */\n\t function isTypedArray(value) {\n\t return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n\t }\n\t\n\t /**\n\t * Checks if `value` is `undefined`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n\t * @example\n\t *\n\t * _.isUndefined(void 0);\n\t * // => true\n\t *\n\t * _.isUndefined(null);\n\t * // => false\n\t */\n\t function isUndefined(value) {\n\t return value === undefined;\n\t }\n\t\n\t /**\n\t * Checks if `value` is less than `other`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.\n\t * @example\n\t *\n\t * _.lt(1, 3);\n\t * // => true\n\t *\n\t * _.lt(3, 3);\n\t * // => false\n\t *\n\t * _.lt(3, 1);\n\t * // => false\n\t */\n\t function lt(value, other) {\n\t return value < other;\n\t }\n\t\n\t /**\n\t * Checks if `value` is less than or equal to `other`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.\n\t * @example\n\t *\n\t * _.lte(1, 3);\n\t * // => true\n\t *\n\t * _.lte(3, 3);\n\t * // => true\n\t *\n\t * _.lte(3, 1);\n\t * // => false\n\t */\n\t function lte(value, other) {\n\t return value <= other;\n\t }\n\t\n\t /**\n\t * Converts `value` to an array.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {Array} Returns the converted array.\n\t * @example\n\t *\n\t * (function() {\n\t * return _.toArray(arguments).slice(1);\n\t * }(1, 2, 3));\n\t * // => [2, 3]\n\t */\n\t function toArray(value) {\n\t var length = value ? getLength(value) : 0;\n\t if (!isLength(length)) {\n\t return values(value);\n\t }\n\t if (!length) {\n\t return [];\n\t }\n\t return arrayCopy(value);\n\t }\n\t\n\t /**\n\t * Converts `value` to a plain object flattening inherited enumerable\n\t * properties of `value` to own properties of the plain object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {Object} Returns the converted plain object.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo);\n\t * // => { 'a': 1, 'b': 2 }\n\t *\n\t * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n\t * // => { 'a': 1, 'b': 2, 'c': 3 }\n\t */\n\t function toPlainObject(value) {\n\t return baseCopy(value, keysIn(value));\n\t }\n\t\n\t /*------------------------------------------------------------------------*/\n\t\n\t /**\n\t * Recursively merges own enumerable properties of the source object(s), that\n\t * don't resolve to `undefined` into the destination object. Subsequent sources\n\t * overwrite property assignments of previous sources. If `customizer` is\n\t * provided it is invoked to produce the merged values of the destination and\n\t * source properties. If `customizer` returns `undefined` merging is handled\n\t * by the method instead. The `customizer` is bound to `thisArg` and invoked\n\t * with five arguments: (objectValue, sourceValue, key, object, source).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @param {Function} [customizer] The function to customize assigned values.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * var users = {\n\t * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n\t * };\n\t *\n\t * var ages = {\n\t * 'data': [{ 'age': 36 }, { 'age': 40 }]\n\t * };\n\t *\n\t * _.merge(users, ages);\n\t * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n\t *\n\t * // using a customizer callback\n\t * var object = {\n\t * 'fruits': ['apple'],\n\t * 'vegetables': ['beet']\n\t * };\n\t *\n\t * var other = {\n\t * 'fruits': ['banana'],\n\t * 'vegetables': ['carrot']\n\t * };\n\t *\n\t * _.merge(object, other, function(a, b) {\n\t * if (_.isArray(a)) {\n\t * return a.concat(b);\n\t * }\n\t * });\n\t * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n\t */\n\t var merge = createAssigner(baseMerge);\n\t\n\t /**\n\t * Assigns own enumerable properties of source object(s) to the destination\n\t * object. Subsequent sources overwrite property assignments of previous sources.\n\t * If `customizer` is provided it is invoked to produce the assigned values.\n\t * The `customizer` is bound to `thisArg` and invoked with five arguments:\n\t * (objectValue, sourceValue, key, object, source).\n\t *\n\t * **Note:** This method mutates `object` and is based on\n\t * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @alias extend\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @param {Function} [customizer] The function to customize assigned values.\n\t * @param {*} [thisArg] The `this` binding of `customizer`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n\t * // => { 'user': 'fred', 'age': 40 }\n\t *\n\t * // using a customizer callback\n\t * var defaults = _.partialRight(_.assign, function(value, other) {\n\t * return _.isUndefined(value) ? other : value;\n\t * });\n\t *\n\t * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n\t * // => { 'user': 'barney', 'age': 36 }\n\t */\n\t var assign = createAssigner(function(object, source, customizer) {\n\t return customizer\n\t ? assignWith(object, source, customizer)\n\t : baseAssign(object, source);\n\t });\n\t\n\t /**\n\t * Creates an object that inherits from the given `prototype` object. If a\n\t * `properties` object is provided its own enumerable properties are assigned\n\t * to the created object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} prototype The object to inherit from.\n\t * @param {Object} [properties] The properties to assign to the object.\n\t * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n\t * @returns {Object} Returns the new object.\n\t * @example\n\t *\n\t * function Shape() {\n\t * this.x = 0;\n\t * this.y = 0;\n\t * }\n\t *\n\t * function Circle() {\n\t * Shape.call(this);\n\t * }\n\t *\n\t * Circle.prototype = _.create(Shape.prototype, {\n\t * 'constructor': Circle\n\t * });\n\t *\n\t * var circle = new Circle;\n\t * circle instanceof Circle;\n\t * // => true\n\t *\n\t * circle instanceof Shape;\n\t * // => true\n\t */\n\t function create(prototype, properties, guard) {\n\t var result = baseCreate(prototype);\n\t if (guard && isIterateeCall(prototype, properties, guard)) {\n\t properties = undefined;\n\t }\n\t return properties ? baseAssign(result, properties) : result;\n\t }\n\t\n\t /**\n\t * Assigns own enumerable properties of source object(s) to the destination\n\t * object for all destination properties that resolve to `undefined`. Once a\n\t * property is set, additional values of the same property are ignored.\n\t *\n\t * **Note:** This method mutates `object`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n\t * // => { 'user': 'barney', 'age': 36 }\n\t */\n\t var defaults = createDefaults(assign, assignDefaults);\n\t\n\t /**\n\t * This method is like `_.defaults` except that it recursively assigns\n\t * default properties.\n\t *\n\t * **Note:** This method mutates `object`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });\n\t * // => { 'user': { 'name': 'barney', 'age': 36 } }\n\t *\n\t */\n\t var defaultsDeep = createDefaults(merge, mergeDefaults);\n\t\n\t /**\n\t * This method is like `_.find` except that it returns the key of the first\n\t * element `predicate` returns truthy for instead of the element itself.\n\t *\n\t * If a property name is provided for `predicate` the created `_.property`\n\t * style callback returns the property value of the given element.\n\t *\n\t * If a value is also provided for `thisArg` the created `_.matchesProperty`\n\t * style callback returns `true` for elements that have a matching property\n\t * value, else `false`.\n\t *\n\t * If an object is provided for `predicate` the created `_.matches` style\n\t * callback returns `true` for elements that have the properties of the given\n\t * object, else `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to search.\n\t * @param {Function|Object|string} [predicate=_.identity] The function invoked\n\t * per iteration.\n\t * @param {*} [thisArg] The `this` binding of `predicate`.\n\t * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n\t * @example\n\t *\n\t * var users = {\n\t * 'barney': { 'age': 36, 'active': true },\n\t * 'fred': { 'age': 40, 'active': false },\n\t * 'pebbles': { 'age': 1, 'active': true }\n\t * };\n\t *\n\t * _.findKey(users, function(chr) {\n\t * return chr.age < 40;\n\t * });\n\t * // => 'barney' (iteration order is not guaranteed)\n\t *\n\t * // using the `_.matches` callback shorthand\n\t * _.findKey(users, { 'age': 1, 'active': true });\n\t * // => 'pebbles'\n\t *\n\t * // using the `_.matchesProperty` callback shorthand\n\t * _.findKey(users, 'active', false);\n\t * // => 'fred'\n\t *\n\t * // using the `_.property` callback shorthand\n\t * _.findKey(users, 'active');\n\t * // => 'barney'\n\t */\n\t var findKey = createFindKey(baseForOwn);\n\t\n\t /**\n\t * This method is like `_.findKey` except that it iterates over elements of\n\t * a collection in the opposite order.\n\t *\n\t * If a property name is provided for `predicate` the created `_.property`\n\t * style callback returns the property value of the given element.\n\t *\n\t * If a value is also provided for `thisArg` the created `_.matchesProperty`\n\t * style callback returns `true` for elements that have a matching property\n\t * value, else `false`.\n\t *\n\t * If an object is provided for `predicate` the created `_.matches` style\n\t * callback returns `true` for elements that have the properties of the given\n\t * object, else `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to search.\n\t * @param {Function|Object|string} [predicate=_.identity] The function invoked\n\t * per iteration.\n\t * @param {*} [thisArg] The `this` binding of `predicate`.\n\t * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n\t * @example\n\t *\n\t * var users = {\n\t * 'barney': { 'age': 36, 'active': true },\n\t * 'fred': { 'age': 40, 'active': false },\n\t * 'pebbles': { 'age': 1, 'active': true }\n\t * };\n\t *\n\t * _.findLastKey(users, function(chr) {\n\t * return chr.age < 40;\n\t * });\n\t * // => returns `pebbles` assuming `_.findKey` returns `barney`\n\t *\n\t * // using the `_.matches` callback shorthand\n\t * _.findLastKey(users, { 'age': 36, 'active': true });\n\t * // => 'barney'\n\t *\n\t * // using the `_.matchesProperty` callback shorthand\n\t * _.findLastKey(users, 'active', false);\n\t * // => 'fred'\n\t *\n\t * // using the `_.property` callback shorthand\n\t * _.findLastKey(users, 'active');\n\t * // => 'pebbles'\n\t */\n\t var findLastKey = createFindKey(baseForOwnRight);\n\t\n\t /**\n\t * Iterates over own and inherited enumerable properties of an object invoking\n\t * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n\t * with three arguments: (value, key, object). Iteratee functions may exit\n\t * iteration early by explicitly returning `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.forIn(new Foo, function(value, key) {\n\t * console.log(key);\n\t * });\n\t * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n\t */\n\t var forIn = createForIn(baseFor);\n\t\n\t /**\n\t * This method is like `_.forIn` except that it iterates over properties of\n\t * `object` in the opposite order.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.forInRight(new Foo, function(value, key) {\n\t * console.log(key);\n\t * });\n\t * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n\t */\n\t var forInRight = createForIn(baseForRight);\n\t\n\t /**\n\t * Iterates over own enumerable properties of an object invoking `iteratee`\n\t * for each property. The `iteratee` is bound to `thisArg` and invoked with\n\t * three arguments: (value, key, object). Iteratee functions may exit iteration\n\t * early by explicitly returning `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.forOwn(new Foo, function(value, key) {\n\t * console.log(key);\n\t * });\n\t * // => logs 'a' and 'b' (iteration order is not guaranteed)\n\t */\n\t var forOwn = createForOwn(baseForOwn);\n\t\n\t /**\n\t * This method is like `_.forOwn` except that it iterates over properties of\n\t * `object` in the opposite order.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.forOwnRight(new Foo, function(value, key) {\n\t * console.log(key);\n\t * });\n\t * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n\t */\n\t var forOwnRight = createForOwn(baseForOwnRight);\n\t\n\t /**\n\t * Creates an array of function property names from all enumerable properties,\n\t * own and inherited, of `object`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @alias methods\n\t * @category Object\n\t * @param {Object} object The object to inspect.\n\t * @returns {Array} Returns the new array of property names.\n\t * @example\n\t *\n\t * _.functions(_);\n\t * // => ['after', 'ary', 'assign', ...]\n\t */\n\t function functions(object) {\n\t return baseFunctions(object, keysIn(object));\n\t }\n\t\n\t /**\n\t * Gets the property value at `path` of `object`. If the resolved value is\n\t * `undefined` the `defaultValue` is used in its place.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} path The path of the property to get.\n\t * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n\t * @returns {*} Returns the resolved value.\n\t * @example\n\t *\n\t * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n\t *\n\t * _.get(object, 'a[0].b.c');\n\t * // => 3\n\t *\n\t * _.get(object, ['a', '0', 'b', 'c']);\n\t * // => 3\n\t *\n\t * _.get(object, 'a.b.c', 'default');\n\t * // => 'default'\n\t */\n\t function get(object, path, defaultValue) {\n\t var result = object == null ? undefined : baseGet(object, toPath(path), path + '');\n\t return result === undefined ? defaultValue : result;\n\t }\n\t\n\t /**\n\t * Checks if `path` is a direct property.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} path The path to check.\n\t * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.\n\t * @example\n\t *\n\t * var object = { 'a': { 'b': { 'c': 3 } } };\n\t *\n\t * _.has(object, 'a');\n\t * // => true\n\t *\n\t * _.has(object, 'a.b.c');\n\t * // => true\n\t *\n\t * _.has(object, ['a', 'b', 'c']);\n\t * // => true\n\t */\n\t function has(object, path) {\n\t if (object == null) {\n\t return false;\n\t }\n\t var result = hasOwnProperty.call(object, path);\n\t if (!result && !isKey(path)) {\n\t path = toPath(path);\n\t object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n\t if (object == null) {\n\t return false;\n\t }\n\t path = last(path);\n\t result = hasOwnProperty.call(object, path);\n\t }\n\t return result || (isLength(object.length) && isIndex(path, object.length) &&\n\t (isArray(object) || isArguments(object)));\n\t }\n\t\n\t /**\n\t * Creates an object composed of the inverted keys and values of `object`.\n\t * If `object` contains duplicate values, subsequent values overwrite property\n\t * assignments of previous values unless `multiValue` is `true`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to invert.\n\t * @param {boolean} [multiValue] Allow multiple values per key.\n\t * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n\t * @returns {Object} Returns the new inverted object.\n\t * @example\n\t *\n\t * var object = { 'a': 1, 'b': 2, 'c': 1 };\n\t *\n\t * _.invert(object);\n\t * // => { '1': 'c', '2': 'b' }\n\t *\n\t * // with `multiValue`\n\t * _.invert(object, true);\n\t * // => { '1': ['a', 'c'], '2': ['b'] }\n\t */\n\t function invert(object, multiValue, guard) {\n\t if (guard && isIterateeCall(object, multiValue, guard)) {\n\t multiValue = undefined;\n\t }\n\t var index = -1,\n\t props = keys(object),\n\t length = props.length,\n\t result = {};\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t value = object[key];\n\t\n\t if (multiValue) {\n\t if (hasOwnProperty.call(result, value)) {\n\t result[value].push(key);\n\t } else {\n\t result[value] = [key];\n\t }\n\t }\n\t else {\n\t result[value] = key;\n\t }\n\t }\n\t return result;\n\t }\n\t\n\t /**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\t var keys = !nativeKeys ? shimKeys : function(object) {\n\t var Ctor = object == null ? undefined : object.constructor;\n\t if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n\t (typeof object != 'function' && isArrayLike(object))) {\n\t return shimKeys(object);\n\t }\n\t return isObject(object) ? nativeKeys(object) : [];\n\t };\n\t\n\t /**\n\t * Creates an array of the own and inherited enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keysIn(new Foo);\n\t * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n\t */\n\t function keysIn(object) {\n\t if (object == null) {\n\t return [];\n\t }\n\t if (!isObject(object)) {\n\t object = Object(object);\n\t }\n\t var length = object.length;\n\t length = (length && isLength(length) &&\n\t (isArray(object) || isArguments(object)) && length) || 0;\n\t\n\t var Ctor = object.constructor,\n\t index = -1,\n\t isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n\t result = Array(length),\n\t skipIndexes = length > 0;\n\t\n\t while (++index < length) {\n\t result[index] = (index + '');\n\t }\n\t for (var key in object) {\n\t if (!(skipIndexes && isIndex(key, length)) &&\n\t !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t }\n\t\n\t /**\n\t * The opposite of `_.mapValues`; this method creates an object with the\n\t * same values as `object` and keys generated by running each own enumerable\n\t * property of `object` through `iteratee`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n\t * per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns the new mapped object.\n\t * @example\n\t *\n\t * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n\t * return key + value;\n\t * });\n\t * // => { 'a1': 1, 'b2': 2 }\n\t */\n\t var mapKeys = createObjectMapper(true);\n\t\n\t /**\n\t * Creates an object with the same keys as `object` and values generated by\n\t * running each own enumerable property of `object` through `iteratee`. The\n\t * iteratee function is bound to `thisArg` and invoked with three arguments:\n\t * (value, key, object).\n\t *\n\t * If a property name is provided for `iteratee` the created `_.property`\n\t * style callback returns the property value of the given element.\n\t *\n\t * If a value is also provided for `thisArg` the created `_.matchesProperty`\n\t * style callback returns `true` for elements that have a matching property\n\t * value, else `false`.\n\t *\n\t * If an object is provided for `iteratee` the created `_.matches` style\n\t * callback returns `true` for elements that have the properties of the given\n\t * object, else `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to iterate over.\n\t * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n\t * per iteration.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {Object} Returns the new mapped object.\n\t * @example\n\t *\n\t * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n\t * return n * 3;\n\t * });\n\t * // => { 'a': 3, 'b': 6 }\n\t *\n\t * var users = {\n\t * 'fred': { 'user': 'fred', 'age': 40 },\n\t * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n\t * };\n\t *\n\t * // using the `_.property` callback shorthand\n\t * _.mapValues(users, 'age');\n\t * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n\t */\n\t var mapValues = createObjectMapper();\n\t\n\t /**\n\t * The opposite of `_.pick`; this method creates an object composed of the\n\t * own and inherited enumerable properties of `object` that are not omitted.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The source object.\n\t * @param {Function|...(string|string[])} [predicate] The function invoked per\n\t * iteration or property names to omit, specified as individual property\n\t * names or arrays of property names.\n\t * @param {*} [thisArg] The `this` binding of `predicate`.\n\t * @returns {Object} Returns the new object.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred', 'age': 40 };\n\t *\n\t * _.omit(object, 'age');\n\t * // => { 'user': 'fred' }\n\t *\n\t * _.omit(object, _.isNumber);\n\t * // => { 'user': 'fred' }\n\t */\n\t var omit = restParam(function(object, props) {\n\t if (object == null) {\n\t return {};\n\t }\n\t if (typeof props[0] != 'function') {\n\t var props = arrayMap(baseFlatten(props), String);\n\t return pickByArray(object, baseDifference(keysIn(object), props));\n\t }\n\t var predicate = bindCallback(props[0], props[1], 3);\n\t return pickByCallback(object, function(value, key, object) {\n\t return !predicate(value, key, object);\n\t });\n\t });\n\t\n\t /**\n\t * Creates a two dimensional array of the key-value pairs for `object`,\n\t * e.g. `[[key1, value1], [key2, value2]]`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the new array of key-value pairs.\n\t * @example\n\t *\n\t * _.pairs({ 'barney': 36, 'fred': 40 });\n\t * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n\t */\n\t function pairs(object) {\n\t object = toObject(object);\n\t\n\t var index = -1,\n\t props = keys(object),\n\t length = props.length,\n\t result = Array(length);\n\t\n\t while (++index < length) {\n\t var key = props[index];\n\t result[index] = [key, object[key]];\n\t }\n\t return result;\n\t }\n\t\n\t /**\n\t * Creates an object composed of the picked `object` properties. Property\n\t * names may be specified as individual arguments or as arrays of property\n\t * names. If `predicate` is provided it is invoked for each property of `object`\n\t * picking the properties `predicate` returns truthy for. The predicate is\n\t * bound to `thisArg` and invoked with three arguments: (value, key, object).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The source object.\n\t * @param {Function|...(string|string[])} [predicate] The function invoked per\n\t * iteration or property names to pick, specified as individual property\n\t * names or arrays of property names.\n\t * @param {*} [thisArg] The `this` binding of `predicate`.\n\t * @returns {Object} Returns the new object.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred', 'age': 40 };\n\t *\n\t * _.pick(object, 'user');\n\t * // => { 'user': 'fred' }\n\t *\n\t * _.pick(object, _.isString);\n\t * // => { 'user': 'fred' }\n\t */\n\t var pick = restParam(function(object, props) {\n\t if (object == null) {\n\t return {};\n\t }\n\t return typeof props[0] == 'function'\n\t ? pickByCallback(object, bindCallback(props[0], props[1], 3))\n\t : pickByArray(object, baseFlatten(props));\n\t });\n\t\n\t /**\n\t * This method is like `_.get` except that if the resolved value is a function\n\t * it is invoked with the `this` binding of its parent object and its result\n\t * is returned.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} path The path of the property to resolve.\n\t * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n\t * @returns {*} Returns the resolved value.\n\t * @example\n\t *\n\t * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n\t *\n\t * _.result(object, 'a[0].b.c1');\n\t * // => 3\n\t *\n\t * _.result(object, 'a[0].b.c2');\n\t * // => 4\n\t *\n\t * _.result(object, 'a.b.c', 'default');\n\t * // => 'default'\n\t *\n\t * _.result(object, 'a.b.c', _.constant('default'));\n\t * // => 'default'\n\t */\n\t function result(object, path, defaultValue) {\n\t var result = object == null ? undefined : object[path];\n\t if (result === undefined) {\n\t if (object != null && !isKey(path, object)) {\n\t path = toPath(path);\n\t object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n\t result = object == null ? undefined : object[last(path)];\n\t }\n\t result = result === undefined ? defaultValue : result;\n\t }\n\t return isFunction(result) ? result.call(object) : result;\n\t }\n\t\n\t /**\n\t * Sets the property value of `path` on `object`. If a portion of `path`\n\t * does not exist it is created.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to augment.\n\t * @param {Array|string} path The path of the property to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n\t *\n\t * _.set(object, 'a[0].b.c', 4);\n\t * console.log(object.a[0].b.c);\n\t * // => 4\n\t *\n\t * _.set(object, 'x[0].y.z', 5);\n\t * console.log(object.x[0].y.z);\n\t * // => 5\n\t */\n\t function set(object, path, value) {\n\t if (object == null) {\n\t return object;\n\t }\n\t var pathKey = (path + '');\n\t path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);\n\t\n\t var index = -1,\n\t length = path.length,\n\t lastIndex = length - 1,\n\t nested = object;\n\t\n\t while (nested != null && ++index < length) {\n\t var key = path[index];\n\t if (isObject(nested)) {\n\t if (index == lastIndex) {\n\t nested[key] = value;\n\t } else if (nested[key] == null) {\n\t nested[key] = isIndex(path[index + 1]) ? [] : {};\n\t }\n\t }\n\t nested = nested[key];\n\t }\n\t return object;\n\t }\n\t\n\t /**\n\t * An alternative to `_.reduce`; this method transforms `object` to a new\n\t * `accumulator` object which is the result of running each of its own enumerable\n\t * properties through `iteratee`, with each invocation potentially mutating\n\t * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n\t * with four arguments: (accumulator, value, key, object). Iteratee functions\n\t * may exit iteration early by explicitly returning `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Array|Object} object The object to iterate over.\n\t * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n\t * @param {*} [accumulator] The custom accumulator value.\n\t * @param {*} [thisArg] The `this` binding of `iteratee`.\n\t * @returns {*} Returns the accumulated value.\n\t * @example\n\t *\n\t * _.transform([2, 3, 4], function(result, n) {\n\t * result.push(n *= n);\n\t * return n % 2 == 0;\n\t * });\n\t * // => [4, 9]\n\t *\n\t * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {\n\t * result[key] = n * 3;\n\t * });\n\t * // => { 'a': 3, 'b': 6 }\n\t */\n\t function transform(object, iteratee, accumulator, thisArg) {\n\t var isArr = isArray(object) || isTypedArray(object);\n\t iteratee = getCallback(iteratee, thisArg, 4);\n\t\n\t if (accumulator == null) {\n\t if (isArr || isObject(object)) {\n\t var Ctor = object.constructor;\n\t if (isArr) {\n\t accumulator = isArray(object) ? new Ctor : [];\n\t } else {\n\t accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);\n\t }\n\t } else {\n\t accumulator = {};\n\t }\n\t }\n\t (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {\n\t return iteratee(accumulator, value, index, object);\n\t });\n\t return accumulator;\n\t }\n\t\n\t /**\n\t * Creates an array of the own enumerable property values of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property values.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.values(new Foo);\n\t * // => [1, 2] (iteration order is not guaranteed)\n\t *\n\t * _.values('hi');\n\t * // => ['h', 'i']\n\t */\n\t function values(object) {\n\t return baseValues(object, keys(object));\n\t }\n\t\n\t /**\n\t * Creates an array of the own and inherited enumerable property values\n\t * of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property values.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.valuesIn(new Foo);\n\t * // => [1, 2, 3] (iteration order is not guaranteed)\n\t */\n\t function valuesIn(object) {\n\t return baseValues(object, keysIn(object));\n\t }\n\t\n\t /*------------------------------------------------------------------------*/\n\t\n\t /**\n\t * Checks if `n` is between `start` and up to but not including, `end`. If\n\t * `end` is not specified it is set to `start` with `start` then set to `0`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Number\n\t * @param {number} n The number to check.\n\t * @param {number} [start=0] The start of the range.\n\t * @param {number} end The end of the range.\n\t * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n\t * @example\n\t *\n\t * _.inRange(3, 2, 4);\n\t * // => true\n\t *\n\t * _.inRange(4, 8);\n\t * // => true\n\t *\n\t * _.inRange(4, 2);\n\t * // => false\n\t *\n\t * _.inRange(2, 2);\n\t * // => false\n\t *\n\t * _.inRange(1.2, 2);\n\t * // => true\n\t *\n\t * _.inRange(5.2, 4);\n\t * // => false\n\t */\n\t function inRange(value, start, end) {\n\t start = +start || 0;\n\t if (end === undefined) {\n\t end = start;\n\t start = 0;\n\t } else {\n\t end = +end || 0;\n\t }\n\t return value >= nativeMin(start, end) && value < nativeMax(start, end);\n\t }\n\t\n\t /**\n\t * Produces a random number between `min` and `max` (inclusive). If only one\n\t * argument is provided a number between `0` and the given number is returned.\n\t * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n\t * number is returned instead of an integer.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Number\n\t * @param {number} [min=0] The minimum possible value.\n\t * @param {number} [max=1] The maximum possible value.\n\t * @param {boolean} [floating] Specify returning a floating-point number.\n\t * @returns {number} Returns the random number.\n\t * @example\n\t *\n\t * _.random(0, 5);\n\t * // => an integer between 0 and 5\n\t *\n\t * _.random(5);\n\t * // => also an integer between 0 and 5\n\t *\n\t * _.random(5, true);\n\t * // => a floating-point number between 0 and 5\n\t *\n\t * _.random(1.2, 5.2);\n\t * // => a floating-point number between 1.2 and 5.2\n\t */\n\t function random(min, max, floating) {\n\t if (floating && isIterateeCall(min, max, floating)) {\n\t max = floating = undefined;\n\t }\n\t var noMin = min == null,\n\t noMax = max == null;\n\t\n\t if (floating == null) {\n\t if (noMax && typeof min == 'boolean') {\n\t floating = min;\n\t min = 1;\n\t }\n\t else if (typeof max == 'boolean') {\n\t floating = max;\n\t noMax = true;\n\t }\n\t }\n\t if (noMin && noMax) {\n\t max = 1;\n\t noMax = false;\n\t }\n\t min = +min || 0;\n\t if (noMax) {\n\t max = min;\n\t min = 0;\n\t } else {\n\t max = +max || 0;\n\t }\n\t if (floating || min % 1 || max % 1) {\n\t var rand = nativeRandom();\n\t return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);\n\t }\n\t return baseRandom(min, max);\n\t }\n\t\n\t /*------------------------------------------------------------------------*/\n\t\n\t /**\n\t * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to convert.\n\t * @returns {string} Returns the camel cased string.\n\t * @example\n\t *\n\t * _.camelCase('Foo Bar');\n\t * // => 'fooBar'\n\t *\n\t * _.camelCase('--foo-bar');\n\t * // => 'fooBar'\n\t *\n\t * _.camelCase('__foo_bar__');\n\t * // => 'fooBar'\n\t */\n\t var camelCase = createCompounder(function(result, word, index) {\n\t word = word.toLowerCase();\n\t return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);\n\t });\n\t\n\t /**\n\t * Capitalizes the first character of `string`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to capitalize.\n\t * @returns {string} Returns the capitalized string.\n\t * @example\n\t *\n\t * _.capitalize('fred');\n\t * // => 'Fred'\n\t */\n\t function capitalize(string) {\n\t string = baseToString(string);\n\t return string && (string.charAt(0).toUpperCase() + string.slice(1));\n\t }\n\t\n\t /**\n\t * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n\t * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to deburr.\n\t * @returns {string} Returns the deburred string.\n\t * @example\n\t *\n\t * _.deburr('déjà vu');\n\t * // => 'deja vu'\n\t */\n\t function deburr(string) {\n\t string = baseToString(string);\n\t return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');\n\t }\n\t\n\t /**\n\t * Checks if `string` ends with the given target string.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to search.\n\t * @param {string} [target] The string to search for.\n\t * @param {number} [position=string.length] The position to search from.\n\t * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n\t * @example\n\t *\n\t * _.endsWith('abc', 'c');\n\t * // => true\n\t *\n\t * _.endsWith('abc', 'b');\n\t * // => false\n\t *\n\t * _.endsWith('abc', 'b', 2);\n\t * // => true\n\t */\n\t function endsWith(string, target, position) {\n\t string = baseToString(string);\n\t target = (target + '');\n\t\n\t var length = string.length;\n\t position = position === undefined\n\t ? length\n\t : nativeMin(position < 0 ? 0 : (+position || 0), length);\n\t\n\t position -= target.length;\n\t return position >= 0 && string.indexOf(target, position) == position;\n\t }\n\t\n\t /**\n\t * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n\t * their corresponding HTML entities.\n\t *\n\t * **Note:** No other characters are escaped. To escape additional characters\n\t * use a third-party library like [_he_](https://mths.be/he).\n\t *\n\t * Though the \">\" character is escaped for symmetry, characters like\n\t * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n\t * unless they're part of a tag or unquoted attribute value.\n\t * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n\t * (under \"semi-related fun fact\") for more details.\n\t *\n\t * Backticks are escaped because in Internet Explorer < 9, they can break out\n\t * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),\n\t * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and\n\t * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)\n\t * for more details.\n\t *\n\t * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n\t * to reduce XSS vectors.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to escape.\n\t * @returns {string} Returns the escaped string.\n\t * @example\n\t *\n\t * _.escape('fred, barney, & pebbles');\n\t * // => 'fred, barney, & pebbles'\n\t */\n\t function escape(string) {\n\t // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n\t string = baseToString(string);\n\t return (string && reHasUnescapedHtml.test(string))\n\t ? string.replace(reUnescapedHtml, escapeHtmlChar)\n\t : string;\n\t }\n\t\n\t /**\n\t * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n\t * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to escape.\n\t * @returns {string} Returns the escaped string.\n\t * @example\n\t *\n\t * _.escapeRegExp('[lodash](https://lodash.com/)');\n\t * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n\t */\n\t function escapeRegExp(string) {\n\t string = baseToString(string);\n\t return (string && reHasRegExpChars.test(string))\n\t ? string.replace(reRegExpChars, escapeRegExpChar)\n\t : (string || '(?:)');\n\t }\n\t\n\t /**\n\t * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to convert.\n\t * @returns {string} Returns the kebab cased string.\n\t * @example\n\t *\n\t * _.kebabCase('Foo Bar');\n\t * // => 'foo-bar'\n\t *\n\t * _.kebabCase('fooBar');\n\t * // => 'foo-bar'\n\t *\n\t * _.kebabCase('__foo_bar__');\n\t * // => 'foo-bar'\n\t */\n\t var kebabCase = createCompounder(function(result, word, index) {\n\t return result + (index ? '-' : '') + word.toLowerCase();\n\t });\n\t\n\t /**\n\t * Pads `string` on the left and right sides if it's shorter than `length`.\n\t * Padding characters are truncated if they can't be evenly divided by `length`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to pad.\n\t * @param {number} [length=0] The padding length.\n\t * @param {string} [chars=' '] The string used as padding.\n\t * @returns {string} Returns the padded string.\n\t * @example\n\t *\n\t * _.pad('abc', 8);\n\t * // => ' abc '\n\t *\n\t * _.pad('abc', 8, '_-');\n\t * // => '_-abc_-_'\n\t *\n\t * _.pad('abc', 3);\n\t * // => 'abc'\n\t */\n\t function pad(string, length, chars) {\n\t string = baseToString(string);\n\t length = +length;\n\t\n\t var strLength = string.length;\n\t if (strLength >= length || !nativeIsFinite(length)) {\n\t return string;\n\t }\n\t var mid = (length - strLength) / 2,\n\t leftLength = nativeFloor(mid),\n\t rightLength = nativeCeil(mid);\n\t\n\t chars = createPadding('', rightLength, chars);\n\t return chars.slice(0, leftLength) + string + chars;\n\t }\n\t\n\t /**\n\t * Pads `string` on the left side if it's shorter than `length`. Padding\n\t * characters are truncated if they exceed `length`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to pad.\n\t * @param {number} [length=0] The padding length.\n\t * @param {string} [chars=' '] The string used as padding.\n\t * @returns {string} Returns the padded string.\n\t * @example\n\t *\n\t * _.padLeft('abc', 6);\n\t * // => ' abc'\n\t *\n\t * _.padLeft('abc', 6, '_-');\n\t * // => '_-_abc'\n\t *\n\t * _.padLeft('abc', 3);\n\t * // => 'abc'\n\t */\n\t var padLeft = createPadDir();\n\t\n\t /**\n\t * Pads `string` on the right side if it's shorter than `length`. Padding\n\t * characters are truncated if they exceed `length`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} [string=''] The string to pad.\n\t * @param {number} [length=0] The padding length.\n\t * @param {string} [chars=' '] The string used as padding.\n\t * @returns {string} Returns the padded string.\n\t * @example\n\t *\n\t * _.padRight('abc', 6);\n\t * // => 'abc '\n\t *\n\t * _.padRight('abc', 6, '_-');\n\t * // => 'abc_-_'\n\t *\n\t * _.padRight('abc', 3);\n\t * // => 'abc'\n\t */\n\t var padRight = createPadDir(true);\n\t\n\t /**\n\t * Converts `string` to an integer of the specified radix. If `radix` is\n\t * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n\t * in which case a `radix` of `16` is used.\n\t *\n\t * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n\t * of `parseInt`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category String\n\t * @param {string} string The string to convert.\n\t * @param {number} [radix] The radix to interpret `value` by.\n\t * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.parseInt('08');\n\t * // => 8\n\t *\n\t * _.map(['6', '08', '10'], _.parseInt);\n\t * // => [6, 8, 10]\n\t */\n\t function parseInt(string, radix, guard) {\n\t // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n\t // Chrome fails to trim leading