You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			746 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			746 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			JavaScript
		
	
/**
 | 
						|
 * lodash (Custom Build) <https://lodash.com/>
 | 
						|
 * Build: `lodash modularize exports="npm" -o ./`
 | 
						|
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 | 
						|
 * Released under MIT license <https://lodash.com/license>
 | 
						|
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 | 
						|
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 | 
						|
 */
 | 
						|
 | 
						|
/** Used as references for various `Number` constants. */
 | 
						|
var INFINITY = 1 / 0,
 | 
						|
    MAX_SAFE_INTEGER = 9007199254740991,
 | 
						|
    MAX_INTEGER = 1.7976931348623157e+308,
 | 
						|
    NAN = 0 / 0;
 | 
						|
 | 
						|
/** `Object#toString` result references. */
 | 
						|
var argsTag = '[object Arguments]',
 | 
						|
    funcTag = '[object Function]',
 | 
						|
    genTag = '[object GeneratorFunction]',
 | 
						|
    stringTag = '[object String]',
 | 
						|
    symbolTag = '[object Symbol]';
 | 
						|
 | 
						|
/** Used to match leading and trailing whitespace. */
 | 
						|
var reTrim = /^\s+|\s+$/g;
 | 
						|
 | 
						|
/** Used to detect bad signed hexadecimal string values. */
 | 
						|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
 | 
						|
 | 
						|
/** Used to detect binary string values. */
 | 
						|
var reIsBinary = /^0b[01]+$/i;
 | 
						|
 | 
						|
/** Used to detect octal string values. */
 | 
						|
var reIsOctal = /^0o[0-7]+$/i;
 | 
						|
 | 
						|
/** Used to detect unsigned integer values. */
 | 
						|
var reIsUint = /^(?:0|[1-9]\d*)$/;
 | 
						|
 | 
						|
/** Built-in method references without a dependency on `root`. */
 | 
						|
var freeParseInt = parseInt;
 | 
						|
 | 
						|
/**
 | 
						|
 * A specialized version of `_.map` for arrays without support for iteratee
 | 
						|
 * shorthands.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Array} [array] The array to iterate over.
 | 
						|
 * @param {Function} iteratee The function invoked per iteration.
 | 
						|
 * @returns {Array} Returns the new mapped array.
 | 
						|
 */
 | 
						|
function arrayMap(array, iteratee) {
 | 
						|
  var index = -1,
 | 
						|
      length = array ? array.length : 0,
 | 
						|
      result = Array(length);
 | 
						|
 | 
						|
  while (++index < length) {
 | 
						|
    result[index] = iteratee(array[index], index, array);
 | 
						|
  }
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.findIndex` and `_.findLastIndex` without
 | 
						|
 * support for iteratee shorthands.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Array} array The array to inspect.
 | 
						|
 * @param {Function} predicate The function invoked per iteration.
 | 
						|
 * @param {number} fromIndex The index to search from.
 | 
						|
 * @param {boolean} [fromRight] Specify iterating from right to left.
 | 
						|
 * @returns {number} Returns the index of the matched value, else `-1`.
 | 
						|
 */
 | 
						|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
 | 
						|
  var length = array.length,
 | 
						|
      index = fromIndex + (fromRight ? 1 : -1);
 | 
						|
 | 
						|
  while ((fromRight ? index-- : ++index < length)) {
 | 
						|
    if (predicate(array[index], index, array)) {
 | 
						|
      return index;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return -1;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Array} array The array to inspect.
 | 
						|
 * @param {*} value The value to search for.
 | 
						|
 * @param {number} fromIndex The index to search from.
 | 
						|
 * @returns {number} Returns the index of the matched value, else `-1`.
 | 
						|
 */
 | 
						|
function baseIndexOf(array, value, fromIndex) {
 | 
						|
  if (value !== value) {
 | 
						|
    return baseFindIndex(array, baseIsNaN, fromIndex);
 | 
						|
  }
 | 
						|
  var index = fromIndex - 1,
 | 
						|
      length = array.length;
 | 
						|
 | 
						|
  while (++index < length) {
 | 
						|
    if (array[index] === value) {
 | 
						|
      return index;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return -1;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.isNaN` without support for number objects.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 | 
						|
 */
 | 
						|
function baseIsNaN(value) {
 | 
						|
  return value !== value;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.times` without support for iteratee shorthands
 | 
						|
 * or max array length checks.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {number} n The number of times to invoke `iteratee`.
 | 
						|
 * @param {Function} iteratee The function invoked per iteration.
 | 
						|
 * @returns {Array} Returns the array of results.
 | 
						|
 */
 | 
						|
function baseTimes(n, iteratee) {
 | 
						|
  var index = -1,
 | 
						|
      result = Array(n);
 | 
						|
 | 
						|
  while (++index < n) {
 | 
						|
    result[index] = iteratee(index);
 | 
						|
  }
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.values` and `_.valuesIn` which creates an
 | 
						|
 * array of `object` property values corresponding to the property names
 | 
						|
 * of `props`.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Object} object The object to query.
 | 
						|
 * @param {Array} props The property names to get values for.
 | 
						|
 * @returns {Object} Returns the array of property values.
 | 
						|
 */
 | 
						|
function baseValues(object, props) {
 | 
						|
  return arrayMap(props, function(key) {
 | 
						|
    return object[key];
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Creates a unary function that invokes `func` with its argument transformed.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Function} func The function to wrap.
 | 
						|
 * @param {Function} transform The argument transform.
 | 
						|
 * @returns {Function} Returns the new function.
 | 
						|
 */
 | 
						|
function overArg(func, transform) {
 | 
						|
  return function(arg) {
 | 
						|
    return func(transform(arg));
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
/** Used for built-in method references. */
 | 
						|
var objectProto = Object.prototype;
 | 
						|
 | 
						|
/** Used to check objects for own properties. */
 | 
						|
var hasOwnProperty = objectProto.hasOwnProperty;
 | 
						|
 | 
						|
/**
 | 
						|
 * Used to resolve the
 | 
						|
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 | 
						|
 * of values.
 | 
						|
 */
 | 
						|
var objectToString = objectProto.toString;
 | 
						|
 | 
						|
/** Built-in value references. */
 | 
						|
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
 | 
						|
 | 
						|
/* Built-in method references for those with the same name as other `lodash` methods. */
 | 
						|
var nativeKeys = overArg(Object.keys, Object),
 | 
						|
    nativeMax = Math.max;
 | 
						|
 | 
						|
/**
 | 
						|
 * Creates an array of the enumerable property names of the array-like `value`.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {*} value The value to query.
 | 
						|
 * @param {boolean} inherited Specify returning inherited property names.
 | 
						|
 * @returns {Array} Returns the array of property names.
 | 
						|
 */
 | 
						|
function arrayLikeKeys(value, inherited) {
 | 
						|
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
 | 
						|
  // Safari 9 makes `arguments.length` enumerable in strict mode.
 | 
						|
  var result = (isArray(value) || isArguments(value))
 | 
						|
    ? baseTimes(value.length, String)
 | 
						|
    : [];
 | 
						|
 | 
						|
  var length = result.length,
 | 
						|
      skipIndexes = !!length;
 | 
						|
 | 
						|
  for (var key in value) {
 | 
						|
    if ((inherited || hasOwnProperty.call(value, key)) &&
 | 
						|
        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
 | 
						|
      result.push(key);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {Object} object The object to query.
 | 
						|
 * @returns {Array} Returns the array of property names.
 | 
						|
 */
 | 
						|
function baseKeys(object) {
 | 
						|
  if (!isPrototype(object)) {
 | 
						|
    return nativeKeys(object);
 | 
						|
  }
 | 
						|
  var result = [];
 | 
						|
  for (var key in Object(object)) {
 | 
						|
    if (hasOwnProperty.call(object, key) && key != 'constructor') {
 | 
						|
      result.push(key);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is a valid array-like index.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 | 
						|
 */
 | 
						|
function isIndex(value, length) {
 | 
						|
  length = length == null ? MAX_SAFE_INTEGER : length;
 | 
						|
  return !!length &&
 | 
						|
    (typeof value == 'number' || reIsUint.test(value)) &&
 | 
						|
    (value > -1 && value % 1 == 0 && value < length);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is likely a prototype object.
 | 
						|
 *
 | 
						|
 * @private
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 | 
						|
 */
 | 
						|
function isPrototype(value) {
 | 
						|
  var Ctor = value && value.constructor,
 | 
						|
      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
 | 
						|
 | 
						|
  return value === proto;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is in `collection`. If `collection` is a string, it's
 | 
						|
 * checked for a substring of `value`, otherwise
 | 
						|
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 | 
						|
 * is used for equality comparisons. If `fromIndex` is negative, it's used as
 | 
						|
 * the offset from the end of `collection`.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 0.1.0
 | 
						|
 * @category Collection
 | 
						|
 * @param {Array|Object|string} collection The collection to inspect.
 | 
						|
 * @param {*} value The value to search for.
 | 
						|
 * @param {number} [fromIndex=0] The index to search from.
 | 
						|
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is found, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.includes([1, 2, 3], 1);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.includes([1, 2, 3], 1, 2);
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.includes({ 'a': 1, 'b': 2 }, 1);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.includes('abcd', 'bc');
 | 
						|
 * // => true
 | 
						|
 */
 | 
						|
function includes(collection, value, fromIndex, guard) {
 | 
						|
  collection = isArrayLike(collection) ? collection : values(collection);
 | 
						|
  fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
 | 
						|
 | 
						|
  var length = collection.length;
 | 
						|
  if (fromIndex < 0) {
 | 
						|
    fromIndex = nativeMax(length + fromIndex, 0);
 | 
						|
  }
 | 
						|
  return isString(collection)
 | 
						|
    ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
 | 
						|
    : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is likely an `arguments` object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 0.1.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 | 
						|
 *  else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isArguments(function() { return arguments; }());
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArguments([1, 2, 3]);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isArguments(value) {
 | 
						|
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
 | 
						|
  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
 | 
						|
    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is classified as an `Array` object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 0.1.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isArray([1, 2, 3]);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArray(document.body.children);
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isArray('abc');
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isArray(_.noop);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
var isArray = Array.isArray;
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is array-like. A value is considered array-like if it's
 | 
						|
 * not a function and has a `value.length` that's an integer greater than or
 | 
						|
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isArrayLike([1, 2, 3]);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArrayLike(document.body.children);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArrayLike('abc');
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArrayLike(_.noop);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isArrayLike(value) {
 | 
						|
  return value != null && isLength(value.length) && !isFunction(value);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * This method is like `_.isArrayLike` except that it also checks if `value`
 | 
						|
 * is an object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is an array-like object,
 | 
						|
 *  else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isArrayLikeObject([1, 2, 3]);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArrayLikeObject(document.body.children);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isArrayLikeObject('abc');
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isArrayLikeObject(_.noop);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isArrayLikeObject(value) {
 | 
						|
  return isObjectLike(value) && isArrayLike(value);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is classified as a `Function` object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 0.1.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isFunction(_);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isFunction(/abc/);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isFunction(value) {
 | 
						|
  // The use of `Object#toString` avoids issues with the `typeof` operator
 | 
						|
  // in Safari 8-9 which returns 'object' for typed array and other constructors.
 | 
						|
  var tag = isObject(value) ? objectToString.call(value) : '';
 | 
						|
  return tag == funcTag || tag == genTag;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is a valid array-like length.
 | 
						|
 *
 | 
						|
 * **Note:** This method is loosely based on
 | 
						|
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isLength(3);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isLength(Number.MIN_VALUE);
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isLength(Infinity);
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isLength('3');
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isLength(value) {
 | 
						|
  return typeof value == 'number' &&
 | 
						|
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is the
 | 
						|
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 | 
						|
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 0.1.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isObject({});
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isObject([1, 2, 3]);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isObject(_.noop);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isObject(null);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isObject(value) {
 | 
						|
  var type = typeof value;
 | 
						|
  return !!value && (type == 'object' || type == 'function');
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 | 
						|
 * and has a `typeof` result of "object".
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isObjectLike({});
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isObjectLike([1, 2, 3]);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isObjectLike(_.noop);
 | 
						|
 * // => false
 | 
						|
 *
 | 
						|
 * _.isObjectLike(null);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isObjectLike(value) {
 | 
						|
  return !!value && typeof value == 'object';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is classified as a `String` primitive or object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @since 0.1.0
 | 
						|
 * @memberOf _
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isString('abc');
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isString(1);
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isString(value) {
 | 
						|
  return typeof value == 'string' ||
 | 
						|
    (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if `value` is classified as a `Symbol` primitive or object.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to check.
 | 
						|
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.isSymbol(Symbol.iterator);
 | 
						|
 * // => true
 | 
						|
 *
 | 
						|
 * _.isSymbol('abc');
 | 
						|
 * // => false
 | 
						|
 */
 | 
						|
function isSymbol(value) {
 | 
						|
  return typeof value == 'symbol' ||
 | 
						|
    (isObjectLike(value) && objectToString.call(value) == symbolTag);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Converts `value` to a finite number.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.12.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to convert.
 | 
						|
 * @returns {number} Returns the converted number.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.toFinite(3.2);
 | 
						|
 * // => 3.2
 | 
						|
 *
 | 
						|
 * _.toFinite(Number.MIN_VALUE);
 | 
						|
 * // => 5e-324
 | 
						|
 *
 | 
						|
 * _.toFinite(Infinity);
 | 
						|
 * // => 1.7976931348623157e+308
 | 
						|
 *
 | 
						|
 * _.toFinite('3.2');
 | 
						|
 * // => 3.2
 | 
						|
 */
 | 
						|
function toFinite(value) {
 | 
						|
  if (!value) {
 | 
						|
    return value === 0 ? value : 0;
 | 
						|
  }
 | 
						|
  value = toNumber(value);
 | 
						|
  if (value === INFINITY || value === -INFINITY) {
 | 
						|
    var sign = (value < 0 ? -1 : 1);
 | 
						|
    return sign * MAX_INTEGER;
 | 
						|
  }
 | 
						|
  return value === value ? value : 0;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Converts `value` to an integer.
 | 
						|
 *
 | 
						|
 * **Note:** This method is loosely based on
 | 
						|
 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to convert.
 | 
						|
 * @returns {number} Returns the converted integer.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.toInteger(3.2);
 | 
						|
 * // => 3
 | 
						|
 *
 | 
						|
 * _.toInteger(Number.MIN_VALUE);
 | 
						|
 * // => 0
 | 
						|
 *
 | 
						|
 * _.toInteger(Infinity);
 | 
						|
 * // => 1.7976931348623157e+308
 | 
						|
 *
 | 
						|
 * _.toInteger('3.2');
 | 
						|
 * // => 3
 | 
						|
 */
 | 
						|
function toInteger(value) {
 | 
						|
  var result = toFinite(value),
 | 
						|
      remainder = result % 1;
 | 
						|
 | 
						|
  return result === result ? (remainder ? result - remainder : result) : 0;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Converts `value` to a number.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @memberOf _
 | 
						|
 * @since 4.0.0
 | 
						|
 * @category Lang
 | 
						|
 * @param {*} value The value to process.
 | 
						|
 * @returns {number} Returns the number.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * _.toNumber(3.2);
 | 
						|
 * // => 3.2
 | 
						|
 *
 | 
						|
 * _.toNumber(Number.MIN_VALUE);
 | 
						|
 * // => 5e-324
 | 
						|
 *
 | 
						|
 * _.toNumber(Infinity);
 | 
						|
 * // => Infinity
 | 
						|
 *
 | 
						|
 * _.toNumber('3.2');
 | 
						|
 * // => 3.2
 | 
						|
 */
 | 
						|
function toNumber(value) {
 | 
						|
  if (typeof value == 'number') {
 | 
						|
    return value;
 | 
						|
  }
 | 
						|
  if (isSymbol(value)) {
 | 
						|
    return NAN;
 | 
						|
  }
 | 
						|
  if (isObject(value)) {
 | 
						|
    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
 | 
						|
    value = isObject(other) ? (other + '') : other;
 | 
						|
  }
 | 
						|
  if (typeof value != 'string') {
 | 
						|
    return value === 0 ? value : +value;
 | 
						|
  }
 | 
						|
  value = value.replace(reTrim, '');
 | 
						|
  var isBinary = reIsBinary.test(value);
 | 
						|
  return (isBinary || reIsOctal.test(value))
 | 
						|
    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
 | 
						|
    : (reIsBadHex.test(value) ? NAN : +value);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Creates an array of the own enumerable property names of `object`.
 | 
						|
 *
 | 
						|
 * **Note:** Non-object values are coerced to objects. See the
 | 
						|
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 | 
						|
 * for more details.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @since 0.1.0
 | 
						|
 * @memberOf _
 | 
						|
 * @category Object
 | 
						|
 * @param {Object} object The object to query.
 | 
						|
 * @returns {Array} Returns the array of property names.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * function Foo() {
 | 
						|
 *   this.a = 1;
 | 
						|
 *   this.b = 2;
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * Foo.prototype.c = 3;
 | 
						|
 *
 | 
						|
 * _.keys(new Foo);
 | 
						|
 * // => ['a', 'b'] (iteration order is not guaranteed)
 | 
						|
 *
 | 
						|
 * _.keys('hi');
 | 
						|
 * // => ['0', '1']
 | 
						|
 */
 | 
						|
function keys(object) {
 | 
						|
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Creates an array of the own enumerable string keyed property values of `object`.
 | 
						|
 *
 | 
						|
 * **Note:** Non-object values are coerced to objects.
 | 
						|
 *
 | 
						|
 * @static
 | 
						|
 * @since 0.1.0
 | 
						|
 * @memberOf _
 | 
						|
 * @category Object
 | 
						|
 * @param {Object} object The object to query.
 | 
						|
 * @returns {Array} Returns the array of property values.
 | 
						|
 * @example
 | 
						|
 *
 | 
						|
 * function Foo() {
 | 
						|
 *   this.a = 1;
 | 
						|
 *   this.b = 2;
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * Foo.prototype.c = 3;
 | 
						|
 *
 | 
						|
 * _.values(new Foo);
 | 
						|
 * // => [1, 2] (iteration order is not guaranteed)
 | 
						|
 *
 | 
						|
 * _.values('hi');
 | 
						|
 * // => ['h', 'i']
 | 
						|
 */
 | 
						|
function values(object) {
 | 
						|
  return object ? baseValues(object, keys(object)) : [];
 | 
						|
}
 | 
						|
 | 
						|
module.exports = includes;
 |