ut2 1.3.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ut2.js +104 -33
- package/dist/ut2.js.map +1 -1
- package/dist/ut2.min.js +1 -1
- package/dist/ut2.min.js.map +1 -1
- package/es/index.js +1 -0
- package/es/internals/checkType.js +11 -0
- package/es/internals/helpers.js +5 -6
- package/es/internals/native.js +10 -1
- package/es/isArguments.js +4 -4
- package/es/isArrayBuffer.js +3 -3
- package/es/isBlob.js +3 -3
- package/es/isBoolean.js +3 -2
- package/es/isDataView.js +3 -2
- package/es/isDate.js +3 -3
- package/es/isError.js +3 -5
- package/es/isFunction.js +3 -2
- package/es/isMap.js +3 -3
- package/es/isMatch.js +71 -0
- package/es/isNumber.js +3 -3
- package/es/isPlainObject.js +3 -3
- package/es/isRegExp.js +3 -3
- package/es/isSet.js +3 -3
- package/es/isString.js +3 -3
- package/es/isSymbol.js +3 -3
- package/es/isTypedArray.js +3 -2
- package/es/isWeakMap.js +3 -3
- package/es/isWeakSet.js +3 -3
- package/lib/index.js +2 -0
- package/lib/internals/checkType.js +14 -0
- package/lib/internals/helpers.js +3 -4
- package/lib/internals/native.js +9 -0
- package/lib/isArguments.js +2 -2
- package/lib/isArrayBuffer.js +3 -3
- package/lib/isBlob.js +2 -2
- package/lib/isBoolean.js +3 -2
- package/lib/isDataView.js +3 -2
- package/lib/isDate.js +3 -3
- package/lib/isError.js +3 -5
- package/lib/isFunction.js +3 -2
- package/lib/isMap.js +3 -3
- package/lib/isMatch.js +73 -0
- package/lib/isNumber.js +3 -3
- package/lib/isPlainObject.js +2 -2
- package/lib/isRegExp.js +3 -3
- package/lib/isSet.js +3 -3
- package/lib/isString.js +3 -3
- package/lib/isSymbol.js +3 -3
- package/lib/isTypedArray.js +3 -2
- package/lib/isWeakMap.js +3 -3
- package/lib/isWeakSet.js +3 -3
- package/package.json +1 -1
- package/types/index.d.ts +1 -0
- package/types/internals/checkType.d.ts +2 -0
- package/types/internals/native.d.ts +6 -0
- package/types/isMatch.d.ts +44 -0
- package/es/internals/isType.js +0 -11
- package/lib/internals/isType.js +0 -13
- package/types/internals/isType.d.ts +0 -11
package/dist/ut2.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ut2.min.js","sources":["../src/isArray.ts","../src/internals/native.ts","../src/isObject.ts","../src/internals/getTag.ts","../src/internals/isType.ts","../src/isObjectLike.ts","../src/isSymbol.ts","../src/toNumber.ts","../src/toInteger.ts","../src/toLength.ts","../src/eq.ts","../src/internals/createIteratee.ts","../src/difference.ts","../src/intersection.ts","../src/internals/helpers.ts","../src/isFunction.ts","../src/isLength.ts","../src/isArrayLike.ts","../src/nth.ts","../src/toFinite.ts","../src/randomInt.ts","../src/uniq.ts","../src/union.ts","../src/isArrayLikeObject.ts","../src/unzip.ts","../src/identity.ts","../src/toString.ts","../src/internals/compare.ts","../src/orderBy.ts","../src/defaultTo.ts","../src/before.ts","../src/internals/baseDebounce.ts","../src/negate.ts","../src/internals/nodeUtil.ts","../src/isBuffer.ts","../src/isPlainObject.ts","../src/internals/keys.ts","../src/internals/isPrototype.ts","../src/isMap.ts","../src/isSet.ts","../src/internals/getSymbols.ts","../src/allKeys.ts","../src/isNil.ts","../src/isTypedArray.ts","../src/isEqual.ts","../src/isFinite.ts","../src/isInteger.ts","../src/isNumber.ts","../src/internals/decimalAdjust.ts","../src/internals/comparator.ts","../src/gt.ts","../src/internals/createExtremum.ts","../src/lt.ts","../src/internals/getKeysIn.ts","../src/allKeysIn.ts","../src/internals/getSymbolsIn.ts","../src/merge.ts","../src/castArray.ts","../src/pickBy.ts","../src/words.ts","../src/internals/splitCaseWords.ts","../src/internals/createCaseFirst.ts","../src/upperFirst.ts","../src/escape.ts","../src/escapeRegExp.ts","../src/unescape.ts","../src/conformsTo.ts","../src/uniqueId.ts","../src/after.ts","../src/camelCase.ts","../src/capitalize.ts","../src/ceil.ts","../src/chunk.ts","../src/clamp.ts","../src/compact.ts","../src/conforms.ts","../src/constant.ts","../src/countBy.ts","../src/debounce.ts","../src/delay.ts","../src/floor.ts","../src/fromPairs.ts","../src/groupBy.ts","../src/gte.ts","../src/inRange.ts","../src/isArguments.ts","../src/isArrayBuffer.ts","../src/isBlob.ts","../src/isBoolean.ts","../src/isDataView.ts","../src/isDate.ts","../src/isElement.ts","../src/isEmpty.ts","../src/isError.ts","../src/isNaN.ts","../src/isNull.ts","../src/isPromiseLike.ts","../src/isRegExp.ts","../src/isSafeInteger.ts","../src/isString.ts","../src/isUndefined.ts","../src/isWeakMap.ts","../src/isWeakSet.ts","../src/kebabCase.ts","../src/keyBy.ts","../src/keysIn.ts","../src/lowerCase.ts","../src/lowerFirst.ts","../src/lte.ts","../src/max.ts","../src/min.ts","../src/noop.ts","../src/nthArg.ts","../src/omit.ts","../src/omitBy.ts","../src/once.ts","../src/partial.ts","../src/partition.ts","../src/pick.ts","../src/random.ts","../src/round.ts","../src/shuffle.ts","../src/sleep.ts","../src/snakeCase.ts","../src/throttle.ts","../src/times.ts","../src/toSafeInteger.ts","../src/upperCase.ts","../src/xor.ts","../src/zip.ts"],"sourcesContent":["/**\n * 检查值是否为 `Array` 对象。\n *\n * @static\n * @alias module:Language.isArray\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `Array` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArray([1, 2, 3]); // true\n *\n * isArray(document.body.children); // true\n *\n * isArray('abc'); // false\n *\n * isArray(1); // false\n *\n * isArray(()=>{}); // false\n *\n */\nfunction isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\nexport default isArray;\n","const freeGlobalThis = typeof globalThis === 'object' && globalThis && globalThis.Object === Object && globalThis;\nconst freeGlobal = typeof global === 'object' && global && global.Object === Object && global;\nconst freeSelf = typeof self === 'object' && self && self.Object === Object && self;\n\nexport const root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')() || {};\n\nexport const objectProto = Object.prototype;\n\nexport const objectToString = objectProto.toString;\n\nexport const hasOwnProperty = objectProto.hasOwnProperty;\n\nexport const propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\nexport const functionToString = Function.prototype.toString;\n\nexport const objectCtorString = functionToString.call(Object);\n\nexport const symbolProto = Symbol ? Symbol.prototype : undefined;\nexport const symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\nexport const symbolToString = symbolProto ? symbolProto.toString : undefined;\nexport const symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nexport const arrayProto = Array.prototype;\nexport const arrSlice = Array.prototype.slice;\n\n/**\n * 最大安全整数。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER | MAX_SAFE_INTEGER}\n */\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n/**\n * 最小安全整数。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER | MIN_SAFE_INTEGER}\n */\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n\n/**\n * 最大数组长度 `Math.pow(2,32) - 1` 。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/length | length}\n */\nexport const MAX_ARRAY_LENGTH = 4294967295;\n\n// Blob 对象是否存在\nexport const blobExisted = typeof Blob !== 'undefined';\n\nexport function toSource(func: any) {\n if (func !== null) {\n try {\n return functionToString.call(func);\n } catch (e) {\n /* empty */\n }\n try {\n return func + '';\n } catch (e) {\n /* empty */\n }\n }\n return '';\n}\n\nexport const numberTag = '[object Number]';\nexport const booleanTag = '[object Boolean]';\nexport const stringTag = '[object String]';\nexport const dateTag = '[object Date]';\nexport const regExpTag = '[object RegExp]';\nexport const symbolTag = '[object Symbol]';\nexport const errorTag = '[object Error]';\nexport const arrayBufferTag = '[object ArrayBuffer]';\nexport const argumentsTag = '[object Arguments]';\nexport const arrayTag = '[object Array]';\n\nexport const objectTag = '[object Object]';\nexport const dataViewTag = '[object DataView]';\nexport const mapTag = '[object Map]';\nexport const promiseTag = '[object Promise]';\nexport const setTag = '[object Set]';\nexport const weakMapTag = '[object WeakMap]';\n\nexport const dataViewExisted = typeof DataView !== 'undefined';\nexport const mapExisted = typeof Map !== 'undefined';\nexport const promiseExisted = typeof Promise !== 'undefined';\nexport const setExisted = typeof Set !== 'undefined';\nexport const weakMapExisted = typeof WeakMap !== 'undefined';\n\nexport const initSource = (existed: boolean, str: string) => (existed ? str : '');\n\nexport const dataViewCtorString = initSource(dataViewExisted, toSource(DataView));\nexport const mapCtorString = initSource(mapExisted, toSource(Map));\nexport const promiseCtorString = initSource(promiseExisted, toSource(Promise));\nexport const setCtorString = initSource(setExisted, toSource(Set));\nexport const weakMapCtorString = initSource(weakMapExisted, toSource(WeakMap));\n","/**\n * 检查值是否为对象。(例如,数组、函数、对象、正则表达式、new Number(0) 和 new String(''))。\n *\n * @static\n * @alias module:Language.isObject\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/#sec-ecmascript-language-types | language type}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isObject({}); // true\n *\n * isObject([1,2,3]); // true\n *\n * isObject(()=>{}); // true\n *\n * isObject(null); // false\n *\n */\nfunction isObject(value: any) {\n const type = typeof value;\n return value != null && (type === 'object' || type === 'function');\n}\n\nexport default isObject;\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n hasOwnProperty,\n objectToString,\n toSource,\n objectTag,\n dataViewTag,\n mapTag,\n promiseTag,\n setTag,\n weakMapTag,\n dataViewExisted,\n mapExisted,\n promiseExisted,\n setExisted,\n weakMapExisted,\n dataViewCtorString,\n mapCtorString,\n promiseCtorString,\n setCtorString,\n weakMapCtorString,\n symToStringTag\n} from './native';\n\n/**\n * 获取值的 `Object.prototype.toString` ,并且忽略 `Symbol.toStringTag` 影响。\n *\n * @private\n * @param value 要查询的值\n * @returns 对象名称\n */\nfunction getRawTag(value: any) {\n const isOwn = hasOwnProperty.call(value, symToStringTag!);\n const tag = value[symToStringTag!];\n let unmasked = false;\n\n try {\n value[symToStringTag!] = undefined;\n unmasked = true;\n } catch (e) {\n /* empty */\n }\n\n const result = objectToString.call(value);\n\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag!] = tag;\n } else {\n delete value[symToStringTag!];\n }\n }\n return result;\n}\n\n/**\n * 获取值的 `Object.prototype.toString` ,忽略 `Symbol.toStringTag` 影响。\n *\n * @private\n * @param value 要查询的值\n * @returns 对象名称\n */\nfunction _getTag(value: any) {\n return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString.call(value);\n}\n\nlet getTag = _getTag;\n\n// 以下数据类型执行 `Object.prototype.toString` 返回错误结果 `[object Object]`:\n// ie11 的 DataView、Map、Set、WeakMap ,node.js 版本 < 6 的 Promise 。\nif (\n (dataViewExisted && objectToString.call(new DataView(new ArrayBuffer(1))) !== dataViewTag) ||\n (mapExisted && objectToString.call(new Map()) !== mapTag) ||\n (promiseExisted && objectToString.call(Promise.resolve()) !== promiseTag) ||\n (setExisted && objectToString.call(new Set()) !== setTag) ||\n (weakMapExisted && objectToString.call(new WeakMap()) !== weakMapTag)\n) {\n getTag = function (value: any) {\n const result = _getTag(value);\n const Ctor = result === objectTag ? value.constructor : undefined;\n const ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString:\n return dataViewTag;\n case mapCtorString:\n return mapTag;\n case promiseCtorString:\n return promiseTag;\n case setCtorString:\n return setTag;\n case weakMapCtorString:\n return weakMapTag;\n }\n }\n\n return result;\n };\n}\n\nexport default getTag;\n","import getTag from './getTag';\n\n/**\n * 检测值的 `Object.prototype.toString` 类型。\n *\n * @private\n * @since 1.0.0\n * @param {*} value 检查值\n * @param {string | string[]} type 类型名称\n * @returns {boolean} 返回值类型是否匹配\n */\nfunction isType(value: any, type: string | string[]) {\n const nativeTypeString = getTag(value);\n if (typeof type === 'string') {\n return nativeTypeString === '[object ' + type + ']';\n }\n return type.some((item) => nativeTypeString === '[object ' + item + ']');\n}\n\nexport default isType;\n","/**\n * 检查值是否为类对象。\n *\n * 如果一个值不为 `null` 并且 `typeof` 结果为 `object`,则该值是类对象。\n *\n * @static\n * @alias module:Language.isObjectLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isObjectLike({}); // true\n *\n * isObjectLike([1,2,3]); // true\n *\n * isObjectLike(()=>{}); // false\n *\n * isObjectLike(null); // false\n *\n */\nfunction isObjectLike(value: any) {\n return value != null && typeof value === 'object';\n}\n\nexport default isObjectLike;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Symbol` 类型或对象。\n *\n * @static\n * @alias module:Language.isSymbol\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Symbol` 类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSymbol(Symbol()); // true\n *\n * isSymbol(Symbol.iterator); // true\n *\n * isSymbol(\"abc\"); // false\n *\n */\nfunction isSymbol(value: any) {\n return typeof value === 'symbol' || (isObjectLike(value) && isType(value, 'Symbol'));\n}\n\nexport default isSymbol;\n","import isObject from './isObject';\nimport isSymbol from './isSymbol';\n\nconst reIsBinary = /^0b[01]+$/i;\n\nconst reIsOctal = /^0o[0-7]+$/i;\n\n// Number('-0x1a2b3c') // NaN\n// parseInt('-0x1a2b3c') // -1715004\n// 统一处理为 NaN\nconst reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/**\n * 转换 `value` 为数字。\n *\n * @static\n * @alias module:Util.toNumber\n * @since 1.0.0\n * @param {*} value 要处理的值。\n * @returns {number} 转换后的数字。\n * @example\n *\n * toNumber(3.2); // 3.2\n *\n * toNumber('3.2'); // 3.2\n *\n * toNumber(-0); // -0\n *\n * toNumber('-0'); // -0\n *\n * toNumber('0'); // 0\n *\n * toNumber(NaN); // NaN\n *\n * toNumber(Infinity); // Infinity\n *\n * toNumber(-Infinity); // -Infinity\n *\n */\nfunction toNumber(value: any): number {\n if (typeof value === 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NaN;\n }\n if (isObject(value)) {\n value = Number(value);\n }\n if (typeof value !== 'string') {\n return value === 0 ? value : +value;\n }\n value = value.trim();\n const isBinary = reIsBinary.test(value);\n\n return isBinary || reIsOctal.test(value)\n ? parseInt(value.slice(2), isBinary ? 2 : 8)\n : reIsBadHex.test(value)\n ? NaN\n : +value;\n}\n\nexport default toNumber;\n","import toNumber from './toNumber';\n\n/**\n * 转换 `value` 为一个整数。\n *\n * 注意: 这个方法基于 [ToIntegerOrInfinity](https://tc39.es/ecma262/#sec-tointegerorinfinity) ,区别在于 `-0` 会返回 `-0` 。\n *\n * @static\n * @alias module:Util.toInteger\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toInteger(3.2); // 3\n *\n * toInteger('3.2'); // 3\n *\n * toInteger(-0); // -0\n *\n * toInteger('-0'); // -0\n *\n * toInteger('0'); // 0\n *\n * toInteger(NaN); // 0\n *\n * toInteger(Infinity); // Infinity\n *\n * toInteger(-Infinity); // -Infinity\n *\n */\nfunction toInteger(value: any) {\n const result = toNumber(value);\n\n // NaN -0 +0 0 Infinity -Infinity\n if (!result || result === Infinity || result === -Infinity) {\n return result === result ? result : 0;\n }\n const remainder = result % 1;\n return remainder ? result - remainder : result;\n}\n\nexport default toInteger;\n","import { MAX_ARRAY_LENGTH } from './internals/native';\nimport toInteger from './toInteger';\n\n/**\n * 转换 `value` 为数组对象的长度整数。\n *\n * @static\n * @alias module:Util.toLength\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/length | length}\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toLength(3.2); // 3\n *\n * toLength('3.2'); // 3\n *\n * toLength(-0); // 0\n *\n * toLength('-0'); // 0\n *\n * toLength('0'); // 0\n *\n * toLength(NaN); // 0\n *\n * toLength(Infinity); // 4294967295\n *\n * toLength(-Infinity); // 0\n *\n */\nfunction toLength(value: any): number {\n value = toInteger(value);\n if (!value) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > MAX_ARRAY_LENGTH) {\n return MAX_ARRAY_LENGTH;\n }\n return value;\n}\n\nexport default toLength;\n","/**\n * 检查两个值是否相等。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Util.eq\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness | JavaScript 中的相等性判断}\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {boolean} 如果两个值相等,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * eq(-0, 0); // true\n *\n * eq(1, 1); // true\n *\n * eq(NaN, NaN); // true\n *\n * eq('a', 'a'); // true\n *\n * const object = {a: 1};\n *\n * eq(object, {a: 1}); // false\n *\n * eq(object, object); // true\n *\n * eq(-0, 0, true); // false\n *\n */\nfunction eq(value: any, other: any, strictCheck = false) {\n if (value === other) {\n return strictCheck ? value !== 0 || 1 / value === 1 / other : true;\n }\n return value !== value && other !== other;\n}\n\nexport default eq;\n","import isSymbol from '../isSymbol';\n\n/**\n * 创建迭代函数。\n *\n * @private\n * @param {Function} iteratee 迭代函数或对象属性。\n * @returns {Function} 如果参数为函数,返回该函数,否则包装一个返回对象属性的函数。\n */\nfunction createIteratee<T, F extends (value: T) => any, K extends keyof T>(iteratee?: F | K) {\n if (typeof iteratee === 'function') {\n return iteratee;\n }\n // 属性键值可能为 Symbol, string, number\n if (typeof iteratee === 'string' || typeof iteratee === 'number' || isSymbol(iteratee)) {\n return (value: any) => value[iteratee];\n }\n return (value: any) => value;\n}\n\nexport default createIteratee;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个 `array` 排除 `values` 值的新数组。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.difference\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} values 排除的值。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 过滤值后的新数组。\n * @example\n *\n * difference([3, 1, 2], [4, 2]); // [3, 1]\n *\n * difference([3.1, 2.2, 1.3], [4.4, 2.5], Math.floor); // [3.1, 1.3]\n *\n * difference([{x: 2}, {x: 1}], [{x: 1}], item=>item.x); // [{x: 2}]\n *\n * // 如果迭代元素为对象,迭代函数可以直接写入对象属性。\n * difference([{x: 2}, {x: 1}], [{x: 1}], 'x'); // [{x: 2}]\n *\n * difference([-0, 0], [0]); // []\n *\n * difference([-0, 0], [0], undefined, true); // [-0]\n *\n */\nfunction difference<T, F extends (value: T) => any, K extends keyof T>(array: T[], values: any[], iteratee?: F | K, strictCheck = false) {\n if (!isArray(array)) {\n return [];\n }\n\n if (!isArray(values)) {\n return array;\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n return array.filter((item) => {\n const current = internalIteratee(item);\n // 注意此处不能使用 `find` ,如果值存在 `undefined` 不好处理。\n // 为什么不直接使用 `includes` (includes 比较用的是 sameValueZero),因为要支持 iteratee 。\n return values.findIndex((value) => eq(internalIteratee(value), current, strictCheck)) === -1;\n });\n}\n\nexport default difference;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建唯一值的数组,该数组包含 2 个数组参数都包含的元素(交集)。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.intersection\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} other 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 包含所有传入数组交集元素的新数组。\n * @example\n *\n * intersection([2, 1, 1], [4, 2]); // [2]\n *\n * intersection([2.1, 1.2], [4.3, 2.4], Math.floor); // [2.1]\n *\n * intersection([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 1}]\n *\n * // 迭代函数可以直接写入属性。\n * intersection([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 1}]\n *\n * intersection([-0, 0], [0]); // [-0]\n *\n * intersection([-0, 0], [0], undefined, true); // [0]\n *\n */\nfunction intersection<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[], iteratee?: F | K, strictCheck = false) {\n if (!isArray(array) || !isArray(other)) {\n return [];\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n const caches: any[] = [];\n return array.filter((item) => {\n const current = internalIteratee(item);\n\n if (other.findIndex((value) => eq(internalIteratee(value), current, strictCheck)) !== -1 && !caches.includes(current)) {\n caches.push(current);\n return true;\n }\n return false;\n });\n}\n\nexport default intersection;\n","// 主要是为了便于一些方法测试,比如一些方法要检测是否存在。\n\nimport isType from './isType';\nimport { arrayProto } from './native';\n\nexport const argType = 'Arguments';\n\n// @ts-ignore\nexport const supportedArgumentsType = isType((() => arguments)(), argType);\n\nexport const FUNC_ERROR_TEXT = 'Expected a function';\n\nexport const numberIsFinite = Number.isFinite;\nexport const numberIsInteger = Number.isInteger;\nexport const numberIsSafeInteger = Number.isSafeInteger;\n\nexport const objectGetOwnPropertySymbols = Object.getOwnPropertySymbols;\n\nexport const arrayAt = arrayProto.at;\n\n/**\n * ut2 版本号。\n *\n * @static\n * @since 1.0.0\n */\nexport const VERSION = BUILD_VERSION;\n","import isType from './internals/isType';\nimport isObject from './isObject';\n\n/**\n * 检查值是否为 `Function` 对象 。\n *\n * `Function` `AsyncFunction` `GeneratorFunction` `Proxy` 都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isFunction\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Function` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isFunction(()=>{})); // true\n *\n * isFunction(/x/); // false\n *\n */\nfunction isFunction(value: any) {\n if (!isObject(value)) {\n return false;\n }\n return isType(value, ['Function', 'AsyncFunction', 'GeneratorFunction', 'Proxy']);\n}\n\nexport default isFunction;\n","import { MAX_SAFE_INTEGER } from './internals/native';\n\n/**\n * 检查值是否为有效的类数组长度。\n *\n * @static\n * @alias module:Language.isLength\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/#sec-tolength | ToLength}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为有效的类数组长度,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isLength(3); // true\n *\n * isLength('3'); // false\n *\n * isLength(Number.Min_VALUE); // false\n *\n * isLength(Number.Infinity); // false\n *\n */\nfunction isLength(value: any): value is number {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction';\nimport isLength from './isLength';\n\n/**\n * 检查值是否为类数组。\n *\n * 如果一个值不是函数并且其 `value.length` 是大于或等于 `0` 且小于或等于 `Number.MAX_SAFE_INTEGER` 的整数,则该值被视为类数组。\n *\n * @static\n * @alias module:Language.isArrayLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类数组,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayLike([1, 2, 3]); // true\n *\n * isArrayLike(document.body.children); // true\n *\n * isArrayLike('abc'); // true\n *\n * isArrayLike(()=>{}); // false\n *\n */\nfunction isArrayLike(value: any) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import { arrayAt } from './internals/helpers';\nimport isArrayLike from './isArrayLike';\n\n/**\n * 获取数组的第 `n` 个元素。如果 `n` 为负数,则返回从数组结尾开始的第 `n` 个元素。\n *\n * 同 `Array.prototype.at` 方法。\n *\n * @static\n * @alias module:Array.nth\n * @since 1.0.0\n * @param {Array} array 要查询的数组。\n * @param {number} [n=0] 要返回元素的索引值。\n * @returns {*} 数组的第 `n` 个元素。\n * @example\n *\n * const arr = ['a', 'b', 'c', 'd'];\n *\n * nth(arr, 1); // 'b'\n *\n * nth(arr, -2); // 'c'\n *\n */\nfunction nth<T = any>(array: T[], n = 0): T {\n if (!isArrayLike(array)) {\n return undefined as any;\n }\n\n if (typeof arrayAt === 'function') {\n return arrayAt.call(array, n);\n }\n const index = n < 0 ? n + array.length : n;\n return array[index];\n}\n\nexport default nth;\n","import toNumber from './toNumber';\n\nconst MAX_VALUE = 1.7976931348623157e308;\n\n/**\n * 转换 `value` 为一个有限数字。\n *\n * @static\n * @alias module:Util.toFinite\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的数字。\n * @example\n *\n * toFinite(3.2); // 3.2\n *\n * toFinite('3.2'); // 3.2\n *\n * toFinite(-0); // -0\n *\n * toFinite('-0'); // -0\n *\n * toFinite('0'); // 0\n *\n * toFinite(NaN); // 0\n *\n * toFinite(Infinity); // 1.7976931348623157e+308\n *\n * toFinite(-Infinity); // -1.7976931348623157e+308\n *\n */\nfunction toFinite(value: any): number {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === Infinity || value === -Infinity) {\n const sign = value < 0 ? -1 : 1;\n return sign * MAX_VALUE;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite';\n\n/**\n * 产生一个包含 `lower` 与 `upper` 之间的随机整数。\n *\n * 如果参数非整数 `lower=Math.ceil(lower)` `upper=Math.floor(upper)` 。如果 `lower` 大于 `upper` 会自动交换参数。\n *\n * @static\n * @alias module:Number.randomInt\n * @since 1.0.0\n * @param {number} [lower=0] 下限。\n * @param {number} [upper=1] 上限。\n * @returns {number} 随机整数。\n * @example\n *\n * randomInt(); // 0 到 1 之间的整数\n *\n * randomInt(2, 4); // 2 到 4 之间的整数\n *\n * randomInt(4, 2); // 2 到 4 之间的整数\n *\n * randomInt(1.2, 2.4); // 2\n *\n */\nfunction randomInt(lower = 0, upper = 1) {\n lower = toFinite(lower);\n upper = toFinite(upper);\n let min = Math.ceil(Math.min(lower, upper) || 0);\n let max = Math.floor(Math.max(lower, upper) || 0);\n\n // 如果两个值都是整数位相同,浮点数不同, 大小值的可能会互换。(如 1.2, 1.3)\n if (min > max) {\n // [min, max] = [max, min]\n const temp = min;\n min = max;\n max = temp;\n }\n\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nexport default randomInt;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个去重后的数组副本。只有第一次出现的元素才会被保留。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.uniq\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 去重后的新数组。\n * @example\n *\n * uniq([2, 1, 2]); // [2, 1]\n *\n * uniq(['a', NaN, 2, 1, NaN, 'a', 1]); // ['a', NaN, 2, 1]\n *\n * uniq([{x: 1}, {x: 2}, {x: 1}], item=>item.x); // [{x: 1}, {x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * uniq([{x: 1}, {x: 2}, {x: 1}], 'x'); // [{x: 1}, {x: 2}]\n *\n * uniq([-0, 0]); // [-0]\n *\n * uniq([-0, 0], undefined, true); // [-0, 0]\n *\n */\nfunction uniq<T, F extends (value: T) => any, K extends keyof T>(array: T[], iteratee?: F | K, strickCheck = false) {\n if (!isArray(array)) {\n return [];\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n return array.filter((value, index, arr) => {\n const current = internalIteratee(value);\n return arr.findIndex((item) => eq(internalIteratee(item), current, strickCheck)) === index;\n });\n}\n\nexport default uniq;\n","import isArray from './isArray';\nimport uniq from './uniq';\n\n/**\n * 创建一个按顺序排列的唯一值的数组(并集)。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。与 [`uniq`](#.uniq) 相似。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.union\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} [other=[]] 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 新的联合数组。\n * @example\n *\n * union([2], [1, 2]); // [2, 1]\n *\n * union([2.1], [1.2, 2.3], Math.floor); // [2.1, 1.2]\n *\n * union([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 1}, {x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * union([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 1}, {x: 2}]\n *\n * union([-0, 0], [-0]); // [-0]\n *\n * union([-0, 0], [-0], undefined, true); // [-0, 0]\n *\n */\nfunction union<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[] = [], iteratee?: F | K, strickCheck = false) {\n array = isArray(array) ? array : [];\n other = isArray(other) ? other : [];\n return uniq(array.concat(other), iteratee, strickCheck);\n}\n\nexport default union;\n","import isArrayLike from './isArrayLike';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为类数组对象。\n *\n * @static\n * @alias module:Language.isArrayLikeObject\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为类数组对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayLikeObject([1, 2, 3]); // true\n *\n * isArrayLikeObject(document.body.children); // true\n *\n * isArrayLikeObject('abc'); // false\n *\n * isArrayLikeObject(()=>{}); // false\n *\n */\nfunction isArrayLikeObject(value: any) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import isArray from './isArray';\nimport isArrayLikeObject from './isArrayLikeObject';\n\n/**\n * 与 [`zip`](#.zip) 类似,除了它接受分组元素的数组,并且创建一个数组,分组元素到打包前的结构。(返回数组的第一个元素包含所有的输入数组的第一元素,第二个元素包含了所有的输入数组的第二元素,依此类推。)。\n *\n * @static\n * @alias module:Array.unzip\n * @since 1.0.0\n * @param {Array} array 要处理的分组元素数组。\n * @returns {Array} 重组元素的新数组。\n * @example\n *\n * unzip([['barney', 'fred'], [36, 40]]); // [['barney', 36], ['fred', 40]]\n *\n * unzip([['barney', 36], ['fred', 40]]); // [['barney', 'fred'], [36, 40]]\n *\n */\nfunction unzip(array: any[][]) {\n if (!isArray(array) || array.length === 0) {\n return [];\n }\n let length = 0;\n array = array.filter((group) => {\n if (isArrayLikeObject(group)) {\n length = Math.max(group.length, length);\n return true;\n }\n return false;\n });\n const result = Array(length);\n let index = -1;\n while (++index < length) {\n const item = array.map((group) => group[index]);\n result[index] = item;\n }\n return result;\n}\n\nexport default unzip;\n","/**\n * 返回第一个参数。\n *\n * @static\n * @alias module:Util.identity\n * @since 1.0.0\n * @param {*} value 任意值。\n * @returns 返回 `value` 。\n * @example\n *\n * const obj = { a: 1, b: 2 };\n *\n * console.log(identity(obj, 1) === obj); // true\n *\n */\n\nfunction identity<T>(value?: T): T;\nfunction identity<T>(value: T, ...args: any[]): T;\nfunction identity<T>(value?: T) {\n return value;\n}\n\nexport default identity;\n","import isArray from './isArray';\nimport isSymbol from './isSymbol';\n\nfunction baseToString(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n if (isArray(value)) {\n return `${value.map(baseToString)}`;\n }\n if (isSymbol(value)) {\n return value.toString();\n }\n const result = '' + value;\n return result == '0' && 1 / value === -Infinity ? '-0' : result;\n}\n\n/**\n * 转换 `value` 为字符串。`null` 和 `undefined` 将返回空字符串。`-0` 将被转换为 `\"-0\"` 。\n *\n * @static\n * @alias module:Util.toString\n * @since 1.0.0\n * @param {*} value 要处理的值。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * toString(null); // ''\n *\n * toString(-0); // '-0'\n *\n * // 数组中的 `null` `undefined` 返回 'null' 'undefined'\n * toString([undefined, null]); // 'undefined,null'\n *\n * toString('a'); // 'a'\n *\n * toString(3); // '3'\n *\n */\nfunction toString(value: any) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isSymbol from '../isSymbol';\nimport toString from '../toString';\n\nexport function compareAsc(value: any, other: any) {\n const valueIsSymbol = isSymbol(value);\n const otherIsSymbol = isSymbol(other);\n const valueStr = toString(value);\n const otherStr = toString(other);\n\n if (!otherIsSymbol && (valueIsSymbol || valueStr > otherStr)) {\n return 1;\n }\n if (!valueIsSymbol && (otherIsSymbol || valueStr < otherStr)) {\n return -1;\n }\n return 0;\n}\n\nexport function compareDesc(value: any, other: any) {\n const valueIsSymbol = isSymbol(value);\n const otherIsSymbol = isSymbol(other);\n const valueStr = toString(value);\n const otherStr = toString(other);\n\n if (!otherIsSymbol && (valueIsSymbol || valueStr > otherStr)) {\n return -1;\n }\n if (!valueIsSymbol && (otherIsSymbol || valueStr < otherStr)) {\n return 1;\n }\n return 0;\n}\n\nexport type OrderData<T> = {\n criteria: any[];\n index: number;\n value: T;\n};\nexport type Order = 'asc' | 'desc' | ((a: any, b: any) => number);\n\nexport function compareMultiple<T>(object: OrderData<T>, other: OrderData<T>, orders: Order[]) {\n const objCriteria = object.criteria;\n const othCriteria = other.criteria;\n const length = objCriteria.length;\n let index = -1;\n\n while (++index < length) {\n const order = orders[index];\n const cmpFn = typeof order === 'function' ? order : order === 'desc' ? compareDesc : compareAsc;\n const result = cmpFn(objCriteria[index], othCriteria[index]);\n if (result) {\n return result;\n }\n }\n\n return object.index - other.index;\n}\n","import identity from './identity';\nimport createIteratee from './internals/createIteratee';\nimport { compareMultiple, Order, OrderData } from './internals/compare';\nimport isArray from './isArray';\n\n/**\n * 创建一个元素数组,以迭代函数处理的结果排序。如果没有指定排序,默认为升序排序。\n *\n * `asc` 升序, `desc` 降序,默认执行稳定排序,也就是说相同元素会保持原始排序。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.orderBy\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort | sort}\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string | Array} [iteratees] 排序的迭代函数。\n * @param {'asc' | 'desc' | Array} [orders] 迭代函数的排序顺序。\n * @returns {Array} 排序后的新数组。\n * @example\n *\n * const array = [2, 1, 3, 5, 4];\n *\n * orderBy(array);; // [1, 2, 3, 4, 5]\n *\n * orderBy(array, item=>item, 'desc');; // [5, 4, 3, 2, 1]\n *\n * const objects = [\n * { a: 'x', b: 3 },\n * { a: 'y', b: 4 },\n * { a: 'x', b: 1 },\n * { a: 'y', b: 2 }\n * ];\n *\n * orderBy(objects, 'b');\n * // [{ a: 'x', b: 1 },{ a: 'y', b: 2 },{ a: 'x', b: 3 },{ a: 'y', b: 4 }]\n *\n * // 迭代函数可以直接写入属性。\n * orderBy(objects, ['a', 'b'], ['asc', 'desc']);\n * // [{ a: 'x', b: 3 },{ a: 'x', b: 1 },{ a: 'y', b: 4 },{ a: 'y', b: 2 }]\n *\n */\nfunction orderBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratees?: F | K | (F | K)[], orders?: Order | Order[]) {\n const result: OrderData<T>[] = [];\n\n iteratees = (isArray(iteratees) ? iteratees : iteratees !== undefined ? [iteratees] : [identity]) as (F | K)[];\n orders = (isArray(orders) ? orders : orders !== undefined ? [orders] : []) as ('asc' | 'desc')[];\n\n if (isArray(collection)) {\n collection.forEach((item, index) => {\n const criteria = (iteratees as (F | K)[]).map((iteratee) => createIteratee<T, F, K>(iteratee)(item));\n result.push({\n criteria,\n index,\n value: item\n });\n });\n }\n\n return result.sort((a, b) => compareMultiple<T>(a, b, orders as Order[])).map((item) => item.value);\n}\n\nexport default orderBy;\n","/**\n * 检查值以确定是否应在其位置返回默认值。如果值为 `NaN` `null` 或 `undefined` ,返回 `defaultValue` 。\n *\n * @static\n * @alias module:Util.defaultTo\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @param {*} defaultValue 默认值。\n * @returns {*} 如果值为 `NaN` `null` 或 `undefined` ,返回 `defaultValue` ,否则返回 `value` 。\n * @example\n *\n * defaultTo(undefined, 1); // 1\n *\n * defaultTo(10, 1); // 10\n *\n * defaultTo(null, undefined); // undefined\n *\n */\n\nfunction defaultTo<T>(value: T | null | undefined, defaultValue: T): T;\nfunction defaultTo<T, D>(value: T | null | undefined, defaultValue: D): T | D;\nfunction defaultTo<T, D>(value: T, defaultValue: D) {\n return value == null || value !== value ? defaultValue : value;\n}\n\nexport default defaultTo;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 创建一个调用 `func` 的函数,调用次数少于 `n` 次。之后再调用这个函数,将返回最后一次调用 `func` 的结果。\n *\n * @static\n * @alias module:Function.before\n * @since 1.0.0\n * @param {number} n 不再调用 `func` 的次数。\n * @param {Function} func 限制执行的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * let count = 0;\n *\n * const increment = before(3, () => {\n * return ++count;\n * });\n *\n * increment(); // 1\n * increment(); // 2\n * increment(); // 2 返回之前的结果\n *\n */\nfunction before<T extends (...args: any[]) => any>(n: number, func: T) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n let result: ReturnType<T>;\n n = defaultTo(toNumber(n), 0);\n return function () {\n if (--n > 0) {\n // @ts-ignore\n // eslint-disable-next-line prefer-rest-params\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n // @ts-ignore\n func = undefined;\n }\n return result;\n } as T;\n}\n\nexport default before;\n","import defaultTo from '../defaultTo';\nimport toNumber from '../toNumber';\nimport { FUNC_ERROR_TEXT } from './helpers';\n\nfunction baseDebounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n immediate: boolean,\n __throttle__ = false\n) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n let timer: any,\n lastCallTime: number | undefined,\n lastInvokeTime: number,\n lastArgs: any[] | undefined,\n lastThis: any,\n result: ReturnType<T>;\n\n wait = defaultTo(toNumber(wait), 0);\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined) {\n return true;\n }\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n return (\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (__throttle__ && timeSinceLastInvoke >= wait)\n );\n }\n\n function invokeFunc(time: number) {\n lastInvokeTime = time;\n result = func.apply(lastThis, lastArgs as any[]);\n lastThis = lastArgs = undefined;\n return result;\n }\n\n function debounced(this: any, ...args: Parameters<T>) {\n lastThis = this;\n lastArgs = args;\n\n const time = Date.now();\n const isInvoke = shouldInvoke(time); // 是否可以立即调用\n\n const waitTime = !__throttle__\n ? wait\n : !isInvoke && lastCallTime !== undefined && timer === undefined\n ? wait - (time - lastCallTime)\n : wait;\n\n lastCallTime = time;\n\n if (isInvoke) {\n // 立即调用,且没有定时器\n if (immediate && timer === undefined) {\n return invokeFunc(time);\n }\n }\n\n // 如果已有定时器,且不是节流方式,清除并重新启动定时器\n if (timer !== undefined && !__throttle__) {\n clearTimeout(timer);\n timer = undefined;\n }\n\n if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n invokeFunc(Date.now());\n }, waitTime);\n }\n\n return result;\n }\n\n function cancel() {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastCallTime = timer = lastArgs = lastThis = undefined;\n }\n\n function flush() {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n\n if (lastArgs) {\n return invokeFunc(Date.now());\n }\n }\n return result;\n }\n\n function pending() {\n return timer !== undefined;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n debounced.pending = pending;\n\n return debounced;\n}\n\nexport default baseDebounce;\n","import { FUNC_ERROR_TEXT } from './internals/helpers';\n\n/**\n * 创建一个断言函数结果取反的函数。\n *\n * @static\n * @alias module:Function.negate\n * @since 1.0.0\n * @param {function} predicate 需要对结果取反的函数。\n * @returns 新的取反函数。\n * @example\n *\n * function isEven(num){\n * return num % 2 === 0;\n * }\n *\n * const nums = [1,2,3,4,5];\n * nums.filter(isEvent); // [2, 4]\n *\n * const ne = negate(isEvent);\n * nums.filter(ne); // [1, 3, 5]\n *\n */\nfunction negate<T extends (...args: any[]) => any>(this: any, predicate: T) {\n if (typeof predicate !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n return (...args: Parameters<T>) => {\n return !predicate.apply(this, args);\n };\n}\n\nexport default negate;\n","import { root } from './native';\n\n// `exports`\nconst freeExports = typeof exports === 'object' && exports && !exports.nodeType && exports;\n\n// @ts-ignore\n// `module`\nconst freeModule = freeExports && typeof module === 'object' && module && !module.nodeType && module;\n\n// `module.exports`\nconst moduleExports = freeModule && freeModule.exports === freeExports;\n\n// `process` from Node.js\nconst freeProcess = moduleExports && root.process;\n\nconst nodeUtil = (function () {\n try {\n const types = freeModule && freeModule.require && freeModule.require('util').types;\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {\n /* empty */\n }\n})();\n\ntype CheckTypeMethod = undefined | ((value: any) => boolean);\n\nexport const nodeIsArrayBuffer: CheckTypeMethod = nodeUtil && nodeUtil.isArrayBuffer;\nexport const nodeIsDate: CheckTypeMethod = nodeUtil && nodeUtil.isDate;\nexport const nodeIsMap: CheckTypeMethod = nodeUtil && nodeUtil.isMap;\nexport const nodeIsRegExp: CheckTypeMethod = nodeUtil && nodeUtil.isRegExp;\nexport const nodeIsSet: CheckTypeMethod = nodeUtil && nodeUtil.isSet;\nexport const nodeIsTypedArray: CheckTypeMethod = nodeUtil && nodeUtil.isTypedArray;\n","/**\n * 检查值是否为 `buffer` 。\n *\n * 非 Node.js 环境,始终返回 `false` 。\n *\n * @static\n * @alias module:Language.isBuffer\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `buffer` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isBuffer(Buffer.alloc(2)); // true\n *\n * isBuffer({}); // false\n *\n * isBuffer('2012'); // false\n *\n */\nfunction isBuffer(value: any): value is Buffer {\n if (typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function') {\n return Buffer.isBuffer(value);\n }\n return false;\n}\n\nexport default isBuffer;\n","import { functionToString, hasOwnProperty, objectCtorString } from './internals/native';\nimport isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为普通对象,即由 `Object` 构造函数创建或 `[[Prototype]]` 为 `null` 的对象。\n *\n * @static\n * @alias module:Language.isPlainObject\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为普通对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * }\n *\n * isPlainObject(new Foo); // false\n *\n * isPlainObject([1,2,3]); // false\n *\n * isPlainObject({ a: 1, b: 2 }); // true\n *\n * isPlainObject(Object.create(null)); // true\n *\n */\nfunction isPlainObject(value: any) {\n if (!isObjectLike(value) || !isType(value, 'Object')) {\n return false;\n }\n const proto = Object.getPrototypeOf(Object(value));\n\n // Object.create(null)\n if (proto === null) {\n return true;\n }\n\n const Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n // 这里如果直接比较 proto.constructor === Object ,iframe 嵌套会导致结果不准确。\n return typeof Ctor === 'function' && Ctor instanceof Ctor && functionToString.call(Ctor) === objectCtorString;\n}\n\nexport default isPlainObject;\n","import isPrototype from './isPrototype';\nimport { hasOwnProperty } from './native';\n\n/**\n * 获取对象的键,忽略 `constructor` 。\n *\n * @private\n * @param value 对象\n * @returns 可枚举的键\n */\nfunction keys(value: object) {\n if (!isPrototype(value)) {\n return Object.keys(value);\n }\n const result = [];\n for (const key in Object(value)) {\n if (hasOwnProperty.call(value, key) && key !== 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default keys;\n","import { objectProto } from './native';\n\n/**\n * 检测值是否为原型对象。\n *\n * @private\n * @param {*} value 要检查的值。\n * @returns {boolean} 是否为原型对象。\n */\nfunction isPrototype(value: any) {\n if (typeof value !== 'object') {\n return false;\n }\n const Ctor = value.constructor;\n const proto = typeof Ctor === 'function' ? Ctor.prototype : objectProto;\n return value === proto;\n}\n\nexport default isPrototype;\n","import isType from './internals/isType';\nimport { nodeIsMap } from './internals/nodeUtil';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Map` 对象。\n *\n * @static\n * @alias module:Language.isMap\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Map` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isMap(new Map); // true\n *\n * isMap(new WeakMap); // false\n *\n */\nfunction isMap(value: any): value is Map<any, any> {\n return nodeIsMap ? nodeIsMap(value) : isObjectLike(value) && isType(value, 'Map');\n}\n\nexport default isMap;\n","import isType from './internals/isType';\nimport { nodeIsSet } from './internals/nodeUtil';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Set` 对象。\n *\n * @static\n * @alias module:Language.isSet\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Set` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSet(new Set); // true\n *\n * isSet(new WeakSet); // false\n *\n */\nfunction isSet(value: any): value is Set<any> {\n return nodeIsSet ? nodeIsSet(value) : isObjectLike(value) && isType(value, 'Set');\n}\n\nexport default isSet;\n","import { objectGetOwnPropertySymbols } from './helpers';\nimport { propertyIsEnumerable } from './native';\n\n/**\n * 创建一个数组,包含自身的可枚举 `symbol` 属性。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {Symbol[]} 自身可枚举的 `symbol` 属性数组\n */\nfunction getSymbols(object: object) {\n if (!objectGetOwnPropertySymbols || object === null) {\n return [];\n }\n\n return objectGetOwnPropertySymbols(object).filter((item) =>\n propertyIsEnumerable.call(object, item)\n );\n}\n\nexport default getSymbols;\n","import getSymbols from './internals/getSymbols';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身的可枚举属性(包含 `Symbol` 属性)。\n *\n * 同 `Object.keys` + `Object.getOwnPropertySymbols`。\n *\n * @static\n * @alias module:Object.allKeys\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {Array<string|symbol>} 对象自身的可枚举属性名(包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * allKeys(new Foo); // ['a', Symbol(b)]\n *\n */\nfunction allKeys<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return (Object.keys(object) as (string | symbol)[]).concat(getSymbols(object));\n}\n\nexport default allKeys;\n","/**\n * 检查值是否为 `undefined` 或 `null` 。\n *\n * @static\n * @alias module:Language.isNil\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `undefined` 或 `null` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNil(undefined); // true\n *\n * isNil(void 0); // true\n *\n * isNil(null); // true\n *\n * isNil(''); // false\n *\n * isNil('a'); // false\n *\n * isNil(1); // false\n */\nfunction isNil(value: any) {\n return value == null;\n}\n\nexport default isNil;\n","import isType from './internals/isType';\nimport { nodeIsTypedArray } from './internals/nodeUtil';\nimport isLength from './isLength';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为类型化数组。\n *\n * @static\n * @alias module:Language.isTypedArray\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Typed_arrays | Typed_arrays}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类型化数组,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isTypedArray(new Uint8Array); // true\n *\n * isTypedArray([]); // false\n *\n */\nfunction isTypedArray(value: any) {\n if (nodeIsTypedArray) {\n return nodeIsTypedArray(value);\n }\n return isObjectLike(value) && isLength(value.length) && isType(value, ['Float32Array', 'Float64Array', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'BigInt64Array', 'BigUint64Array']);\n}\n\nexport default isTypedArray;\n","import allKeys from './allKeys';\nimport eq from './eq';\nimport getTag from './internals/getTag';\nimport { argumentsTag, arrSlice, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, errorTag, hasOwnProperty, mapTag, numberTag, objectTag, regExpTag, setTag, stringTag, symbolTag, symbolValueOf } from './internals/native';\nimport isBuffer from './isBuffer';\nimport isFunction from './isFunction';\nimport isNil from './isNil';\nimport isObjectLike from './isObjectLike';\nimport isTypedArray from './isTypedArray';\nimport orderBy from './orderBy';\n\nfunction mapToArray(map: Map<any, any>) {\n const result: [any, any][] = [];\n map.forEach((value, key) => {\n result.push([key, value]);\n });\n return orderBy(result, [0, 1]);\n}\n\nfunction setToArray(set: Set<any>) {\n const result: any[] = [];\n set.forEach((value) => {\n result.push(value);\n });\n return orderBy(result);\n}\n\nfunction argToArray(arg: IArguments) {\n return arrSlice.call(arg);\n}\n\nfunction toBufferView(bufferSource: any) {\n return new Uint8Array(bufferSource.buffer || bufferSource, bufferSource.byteOffset || 0, bufferSource.byteLength);\n}\n\nfunction isDomNode(obj: any) {\n return isObjectLike(obj) && typeof obj.nodeType === 'number' && typeof obj.nodeName === 'string' && typeof obj.isEqualNode === 'function';\n}\n\ntype Customizer = (objValue: any, othValue: any, key?: number | string | symbol, object?: any, other?: any, valueStack?: any[], otherStack?: any[]) => void | undefined | boolean;\n\nfunction isEqualDeep(value: any, other: any, customizer?: Customizer, strictCheck?: boolean, valueStack?: any[], otherStack?: any[]): boolean {\n // 如果两个值相等,直接返回 true\n if (eq(value, other, strictCheck)) {\n return true;\n }\n\n const valType = typeof value;\n const othType = typeof other;\n\n // 严格比较时,不同类型返回 false\n // 例如,`1` `Object(1)` 不相等\n if (strictCheck && valType !== othType) {\n return false;\n }\n\n // 存在 null 或 undefined 或 都不是对象类型\n if (isNil(value) || isNil(other) || (valType !== 'object' && othType !== 'object')) {\n return false;\n }\n\n // 对象标签\n const tag = getTag(value);\n if (tag !== getTag(other)) {\n return false;\n }\n\n let convert: undefined | ((arg: any) => any);\n\n switch (tag) {\n case numberTag:\n return eq(+value, +other, strictCheck);\n case booleanTag:\n case dateTag:\n // 日期转为毫秒数进行比较,而无效日期转为 `NaN` 。如果是严格比较,无效日期不相等。\n return strictCheck ? +value === +other : eq(+value, +other);\n case stringTag:\n case regExpTag:\n return '' + value === '' + other;\n case symbolTag:\n return symbolValueOf ? symbolValueOf.call(value) === symbolValueOf.call(other) : false;\n case errorTag:\n return value.name == other.name && value.message == other.message;\n case dataViewTag:\n case arrayBufferTag:\n if (value.byteLength !== other.byteLength || (value.byteOffset && value.byteOffset !== other.byteOffset)) {\n return false;\n }\n convert = toBufferView;\n break;\n case mapTag:\n convert = mapToArray;\n break;\n case setTag:\n convert = setToArray;\n break;\n case argumentsTag:\n convert = argToArray;\n break;\n }\n\n if (convert) {\n return isEqualDeep(convert(value), convert(other), customizer, strictCheck, valueStack, otherStack);\n }\n\n // 使用 DOM3 isEqualNode 方法比较 (IE>=9)\n if (isDomNode(value) && isDomNode(other)) {\n return value.isEqualNode(other);\n }\n\n let areArrays = tag === arrayTag;\n if (!areArrays && isTypedArray(value)) {\n if (value.byteLength !== other.byteLength) {\n return false;\n }\n if (value.buffer === other.buffer && value.byteOffset === other.byteOffset) {\n return true;\n }\n areArrays = true;\n }\n\n // Buffer 对象处理\n if (isBuffer(value)) {\n if (!isBuffer(other)) {\n return false;\n }\n areArrays = true;\n }\n\n // 假设循环结构是相等的。\n valueStack = valueStack || [];\n otherStack = otherStack || [];\n let length = valueStack.length;\n\n while (length--) {\n // 遍历对象的堆栈,如果存在循环依赖,立即进行比较。\n if (valueStack[length] === value) {\n return otherStack[length] === other;\n }\n }\n\n // 将对象添加到遍历对象的堆栈中。\n valueStack.push(value);\n otherStack.push(other);\n\n let result = true;\n const hasCustomizer = typeof customizer === 'function';\n\n // 递归比较对象和数组\n if (areArrays) {\n // 比较数组长度\n length = value.length;\n if (length !== other.length) {\n return false;\n }\n // 深度比较数组\n while (length--) {\n if (hasCustomizer) {\n const compared = customizer(value[length], other[length], length, value, other, valueStack, otherStack);\n if (compared !== undefined) {\n if (!compared) {\n return false;\n }\n continue;\n }\n }\n if (!isEqualDeep(value[length], other[length], customizer, strictCheck, valueStack, otherStack)) {\n return false;\n }\n }\n } else if (tag === objectTag) {\n // 深度比较对象\n const keys = allKeys(value);\n length = keys.length;\n if (allKeys(other).length !== length) {\n return false;\n }\n // 跳过构造函数比较\n let skipCtor = false;\n while (length--) {\n const key = keys[length];\n if (hasCustomizer) {\n const compared = customizer(value[key], other[key], key, value, other, valueStack, otherStack);\n if (compared !== undefined) {\n if (!compared) {\n return false;\n }\n continue;\n }\n }\n if (!(hasOwnProperty.call(other, key) && isEqualDeep(value[key], other[key], customizer, strictCheck, valueStack, otherStack))) {\n return false;\n }\n\n // constructor 作为属性,非构建函数时\n if (!skipCtor && key === 'constructor') {\n skipCtor = true;\n }\n }\n\n if (!skipCtor) {\n // 不同构造函数的对象不是等价的。\n const valCtor = value.constructor;\n const othCtor = other.constructor;\n if (valCtor !== othCtor && !(isFunction(valCtor) && valCtor instanceof valCtor && isFunction(othCtor) && othCtor instanceof othCtor) && 'constructor' in value && 'constructor' in other) {\n return false;\n }\n }\n } else {\n result = false;\n }\n\n // 从遍历对象的堆栈中删除\n valueStack.pop();\n otherStack.pop();\n\n return result;\n}\n\n/**\n * 深度比较两个值是否相等。\n *\n * 支持比较 `boolean` `number` `string` `symbol` `array` `array buffer` `date` `error` `map` `object` `regexp` `set` `typed array` 类型。对象只比较自身的属性,不包括继承和不可枚举的属性。\n *\n * 如果 `strictCheck=true` , 以下值不相等:\n *\n * 1. `0` `-0`\n * 2. `typeof` 不同类型,如 `1` `Object(1)`\n * 3. 无效日期对象,如 `new Date('')` `new Date('abc')`\n *\n * @static\n * @alias module:Language.isEqual\n * @since 1.3.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @param {Function} [customizer] 自定义比较。\n * @param {boolean} [strictCheck=false] 严格比较,默认 `false` 。\n * @returns {boolean} 如果两个值相等,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * const value = { a: 1, b: -0 }\n * const other = { a: 1, b: 0 }\n *\n * isEqual(value, other); // true\n * value === other // false\n *\n * // 严格比较\n * isEqual(value, other, undefined, true); // false\n *\n * // 自定义比较\n * function customizer(value, other){\n * if(typeof value === 'string' && typeof other === 'string'){\n * return true;\n * }\n * }\n * isEqual('a', 'b', customizer); // true\n * isEqual(['a'], ['b'], customizer); // true\n * isEqual({foo: 'a'}, {foo: 'b'}, customizer); // true\n *\n */\nfunction isEqual(value: any, other: any, customizer?: Customizer, strictCheck = false) {\n // 自定义比较\n if (typeof customizer === 'function') {\n const result = customizer(value, other);\n if (result !== undefined) {\n return !!result;\n }\n }\n return isEqualDeep(value, other, customizer, strictCheck);\n}\n\nexport default isEqual;\n","import { root } from './internals/native';\nimport { numberIsFinite } from './internals/helpers';\n\n/**\n * 检查值是否为有限数字。\n *\n * 同 `Number.isFinite` 。\n *\n * @static\n * @alias module:Language.isFinite\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为有限数字,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isFinite(1); // true\n *\n * isFinite(Infinity); // false\n *\n * isFinite(Number.MIN_VALUE); // true\n *\n * isFinite('1'); // false\n *\n * isFinite(null); // false\n *\n */\nfunction isFinite(value: any): value is number {\n return numberIsFinite ? numberIsFinite(value) : typeof value === 'number' && root.isFinite(value);\n}\n\nexport default isFinite;\n","import { numberIsInteger } from './internals/helpers';\nimport isFinite from './isFinite';\n\n/**\n * 检查值是否为整数。\n *\n * 同 `Number.isInteger` 。\n *\n * @static\n * @alias module:Language.isInteger\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为整数,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isInteger(1); // true\n *\n * isInteger(Infinity); // false\n *\n * isInteger(Number.MIN_VALUE); // false\n *\n * isInteger('1'); // false\n *\n * isInteger(null); // false\n *\n */\nfunction isInteger(value: any): value is number {\n return numberIsInteger ? numberIsInteger(value) : isFinite(value) && Math.floor(value) === value;\n}\n\nexport default isInteger;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为数字类型或对象。\n *\n * `Infinity` `-Infinity` `NaN` 都归类为数字。如果要排除,请使用 `isFinite` 方法。\n *\n * @static\n * @alias module:Language.isNumber\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为数字类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNumber(1); // true\n *\n * isNumber(Infinity); // true\n *\n * isNumber(Number.MIN_VALUE); // true\n *\n * isNumber(NaN); // true\n *\n * isNumber(new Number(1)); // true\n *\n * isNumber('1'); // false\n *\n * isNumber(null); // false\n *\n */\nfunction isNumber(value: any) {\n return typeof value === 'number' || (isObjectLike(value) && isType(value, 'Number'));\n}\n\nexport default isNumber;\n","import isFinite from '../isFinite';\nimport toInteger from '../toInteger';\nimport toNumber from '../toNumber';\nimport toString from '../toString';\n\n/**\n * 数字调整。\n *\n * @private\n * @param {'floor' | 'ceil' | 'round'} type 调整的类型。\n * @param {number} value 要调整的数字。\n * @param {number} precision 指数(调整基数的10个对数)。\n * @returns {number} 调整后的数字。\n */\nfunction decimalAdjust(type: 'floor' | 'ceil' | 'round', value: number, precision = 0) {\n const func = Math[type];\n\n value = toNumber(value);\n precision = Math.min(toInteger(precision), 292);\n\n if (precision === 0 || !isFinite(value)) {\n return func(value);\n }\n\n // 移动\n let pair = toString(value).split('e');\n value = func(+(pair[0] + 'e' + (pair[1] ? +pair[1] + precision : precision)));\n\n // 向前移\n pair = toString(value).split('e');\n return +(pair[0] + 'e' + (pair[1] ? +pair[1] - precision : -precision));\n}\n\nexport default decimalAdjust;\n","import toNumber from '../toNumber';\n\ntype Comparator = (value: any, other: any) => boolean;\n\nexport function createOperation(comparator: Comparator) {\n return function (value: any, other: any) {\n if (!(typeof value === 'string' && typeof other === 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return comparator(value, other);\n };\n}\n\nexport const baseGt: Comparator = (value, other) => {\n return value > other;\n};\n\nexport const baseGte: Comparator = (value, other) => {\n return value >= other;\n};\n\nexport const baseLt: Comparator = (value, other) => {\n return value < other;\n};\n\nexport const baseLte: Comparator = (value, other) => {\n return value <= other;\n};\n","import { baseGt, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否大于 `other` 。\n *\n * @static\n * @alias module:Util.gt\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 大于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * gt(1, 3); // false\n *\n * gt(3, 3); // false\n *\n * gt(3, 1); // true\n *\n */\nfunction gt(value: any, other: any) {\n return createOperation(baseGt)(value, other);\n}\n\nexport default gt;\n","import isArray from '../isArray';\nimport isSymbol from '../isSymbol';\nimport createIteratee from './createIteratee';\n\nfunction createExtremum<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K,\n comparator: (value: any, other: any) => boolean\n) {\n if (!isArray(array)) {\n return;\n }\n\n let result: T | undefined, computed: number | undefined;\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n\n array.forEach((value) => {\n const current = internalIteratee(value);\n if (\n current != null &&\n (computed === undefined\n ? current === current && !isSymbol(current)\n : comparator(current, computed))\n ) {\n computed = current;\n result = value;\n }\n });\n\n return result;\n}\n\nexport default createExtremum;\n","import { baseLt, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否小于 `other` 。\n *\n * @static\n * @alias module:Util.lt\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 小于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * lt(1, 3); // true\n *\n * lt(3, 3); // false\n *\n * lt(3, 1); // false\n *\n */\nfunction lt(value: any, other: any) {\n return createOperation(baseLt)(value, other);\n}\n\nexport default lt;\n","/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(不包含 `Symbol` 属性)。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {string[]} 对象可枚举的属性\n */\nfunction getKeysIn(object: object) {\n const result: string[] = [];\n for (const key in object) {\n result.push(key);\n }\n return result;\n}\n\nexport default getKeysIn;\n","import getKeysIn from './internals/getKeysIn';\nimport getSymbolsIn from './internals/getSymbolsIn';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(包含 `Symbol` 属性)。\n *\n * 同 `key...in` + 递归原型 `Object.getOwnPropertySymbols`。\n *\n * @static\n * @alias module:Object.allKeysIn\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {Array<string|symbol>} 对象自身及继承的可枚举属性名(包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * allKeysIn(new Foo); // ['a', 'c', Symbol(b), Symbol(d)]\n *\n */\nfunction allKeysIn<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return (getKeysIn(object) as (string | symbol)[]).concat(getSymbolsIn(object));\n}\n\nexport default allKeysIn;\n","import getSymbols from './getSymbols';\n\n/**\n * 创建一个数组,包含自身以及继承的可枚举 `symbol` 属性。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {Symbol[]} 可枚举的 `symbol` 属性数组\n */\nfunction getSymbolsIn(object: object) {\n const result: symbol[] = [];\n\n let o = Object(object);\n\n while (o) {\n getSymbols(o).forEach((item) => {\n if (result.indexOf(item) === -1) {\n result.push(item);\n }\n });\n o = Object.getPrototypeOf(o);\n }\n\n return result;\n}\n\nexport default getSymbolsIn;\n","import allKeysIn from './allKeysIn';\nimport isArray from './isArray';\nimport isObject from './isObject';\nimport isObjectLike from './isObjectLike';\n\ntype Customizer = (objValue: any, srcValue: any, key: string | symbol, object: any, source: any) => any;\n\n// 内部处理合并和循环引用\nfunction baseMerge<TObject, TSource>(object: TObject, source: TSource, customizer?: Customizer, storage = new WeakMap()) {\n const obj = Object(object);\n\n if (!isObject(source) || obj === source) {\n return obj;\n }\n\n const keys = allKeysIn(source as object);\n\n keys.forEach((key) => {\n // @ts-ignore\n const srcValue = source[key];\n let newValue = typeof customizer === 'function' ? customizer(obj[key], srcValue, key, obj, source) : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n\n // 递归处理对象和数组\n if (isObjectLike(newValue) && key in obj && !storage.has(newValue as object)) {\n storage.set(newValue as object, true);\n\n const objValue = obj[key];\n let newObjValue: any;\n\n if (isArray(newValue)) {\n newObjValue = isArray(objValue) ? objValue : [];\n } else {\n newObjValue = isObjectLike(objValue) ? objValue : {};\n }\n\n obj[key] = baseMerge(newObjValue, newValue as any, customizer, storage);\n } else {\n if (newValue !== undefined || (newValue === undefined && !(key in obj))) {\n obj[key] = newValue;\n }\n }\n });\n\n return obj;\n}\n\n/**\n * 递归合并 `source` 来源对象自身和继承的可枚举属性(包含 `Symbol` 属性)到 `object` 目标对象。\n *\n * 如果目标值存在,被解析为 `undefined` 的 `source` 来源对象属性将被跳过。数组和普通对象会递归合并,其他对象和值会被直接分配覆盖。\n *\n * @static\n * @alias module:Object.merge\n * @since 1.0.0\n * @param {Object | Array} object 目标对象。\n * @param {Object | Array} source 来源对象。\n * @param {Function} [customizer] 自定义赋值函数。\n * @returns {Object} 目标对象。\n * @example\n *\n * const object = {\n * a: [{b: 2}, {d: 4}]\n * }\n *\n * const other = {\n * a: [{c: 3},{e: 5}]\n * }\n *\n * merge(object, other); // { a: [{b: 2, c: 3}, {d: 4, e: 5}] }\n *\n */\nfunction merge<TObject, TSource>(object: TObject, source: TSource, customizer?: Customizer): TObject & TSource {\n return baseMerge(object, source, customizer);\n}\n\nexport default merge;\n","import isArray from './isArray';\n\n/**\n * 如果值不是数组,则将其转换为数组。\n *\n * @static\n * @alias module:Util.castArray\n * @since 1.0.0\n * @param {*} [value] 要处理的值。\n * @returns {Array} 转换后的数组。\n * @example\n *\n * castArray('a'); // [\"a\"]\n *\n * castArray(1); // [1]\n *\n * castArray({ a: 1, b: 2}); // [{ a: 1, b: 2}]\n *\n * castArray(); // []\n *\n * castArray(undefined); // [undefined]\n *\n * castArray(null); // [null]\n *\n * const arr = [1, 2, 3];\n * castArray(arr); // [1, 2, 3]\n * console.log(arr === castArray(arr)); // true\n */\nfunction castArray<T>(value?: T | T[]): T[] {\n if (!arguments.length) {\n return [];\n }\n return isArray(value) ? value : [value as T];\n}\n\nexport default castArray;\n","import allKeysIn from './allKeysIn';\n\n/**\n * 创建一个对象,该对象的属性从 `object` 中经 `predicate` (断言函数)判断为真值的属性。\n *\n * `predicate` 调用时会传入 2 个参数 `value` `key` 。\n *\n * @static\n * @alias module:Object.pickBy\n * @since 1.0.0\n * @param {Object} obj 来源对象。\n * @param {Function} [predicate] 调用每一个属性的函数。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * pickBy(obj); // {}\n *\n * pickBy(obj, (value) => typeof value === 'number'); // { age: 18 }\n *\n * pickBy(obj, (value) => value); // { name: \"jeff\", age: 18 }\n *\n */\nfunction pickBy<T extends object>(\n object: T,\n predicate: (value: any, key: any) => any = () => false\n) {\n const result: Partial<T> = {};\n\n if (object === null) {\n return result;\n }\n\n const keys = allKeysIn(object) as (keyof T)[];\n\n keys.forEach((key) => {\n if (predicate(object[key], key)) {\n result[key] = object[key];\n }\n });\n\n return result;\n}\n\nexport default pickBy;\n","const reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * 拆分字符串中的词为数组。\n *\n * @static\n * @alias module:String.words\n * @since 1.0.0\n * @see {@link https://zh.wikipedia.org/wiki/ASCII | ASCII}\n * @param {string} string 要拆分的字符串。\n * @param {RegExp | string} [pattern=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g] 匹配模式。\n * @returns {string[]} 拆分后的数组。\n * @example\n *\n * words('fred, barney, & pebbles'); // ['fred', 'barney', 'pebbles']\n *\n * words('fred, barney, & pebbles', /[^, ]+/g); // ['fred', 'barney', '&', 'pebbles']\n *\n */\nfunction words(string: string, pattern: RegExp | string = reAsciiWord): string[] {\n return string.match(pattern) || [];\n}\n\nexport default words;\n","import toString from '../toString';\nimport words from '../words';\n\n/**\n * 拆分字符串词组。\n *\n * @private\n * @param {string} string 要拆分的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string[]} 拆分后的数组。\n */\nfunction splitCaseWords(string: string, pattern?: RegExp | string) {\n return words(toString(string).replace(/['\\u2019]/g, ''), pattern);\n}\n\nexport default splitCaseWords;\n","import toString from '../toString';\n\n/**\n * 生成一个首个字符串处理的函数。\n *\n * @private\n * @param {string} methodName 首个字符串的大小写方法。\n * @returns {string} 新的大小写函数。\n */\nfunction createCaseFirst(methodName: 'toLowerCase' | 'toUpperCase') {\n return (string: string) => {\n const str = toString(string);\n if (!str) {\n return '';\n }\n return str[0][methodName]() + str.slice(1);\n };\n}\n\nexport default createCaseFirst;\n","import createCaseFirst from './internals/createCaseFirst';\n\n/**\n * 转换字符串第一个字符为大写。\n *\n * @static\n * @alias module:String.upperFirst\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * upperFirst('bar'); // 'Bar'\n *\n * upperFirst('BAR'); // 'BAR'\n *\n */\nfunction upperFirst(string: string) {\n return createCaseFirst('toUpperCase')(string);\n}\n\nexport default upperFirst;\n","import toString from './toString';\n\nconst htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\n\nconst reUnescapedHtml = /[&<>\"']/g;\nconst reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * 转义字符串中的 `&` `<` `>` `\"` `'` 字符为 HTML 实体字符。\n *\n * 注意:不会转义其他字符。如果需要,可以使用第三方库,如 [he](https://github.com/mathiasbynens/he) 。\n *\n * 虽然 \">\" 是对称转义的,字符如 \">\" 和 \"/\" 没有特殊的意义,所以不需要在 HTML 转义。 除非它们是标签的一部分,或者是不带引号的属性值。\n *\n * 当解析 HTML 时,总应该在[属性值上使用引号](http://wonko.com/post/html-escaping)以减少 XSS 的可能性。\n *\n * @static\n * @alias module:String.escape\n * @since 1.0.0\n * @see {@link https://mathiasbynens.be/notes/ambiguous-ampersands | ambiguous-ampersands}\n * @param {string} string 要转义的字符串。\n * @returns {string} 转义后的字符串。\n * @example\n *\n * escape('<script></script>'); // '<script></script>'\n *\n * escape('&'); // '&'\n *\n */\nfunction escape(string: string) {\n string = toString(string);\n return string && reHasUnescapedHtml.test(string)\n ? string.replace(reUnescapedHtml, (chr) => {\n // @ts-ignore\n return htmlEscapes[chr];\n })\n : string || '';\n}\n\nexport default escape;\n","const reRegExpChar = /[\\\\^$.*+?\\-()[\\]{}|]/g;\nconst reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * 转义 `RegExp` 字符串中特殊的字符 `\\\\` `^` `$` `.` `*` `+` `?` `-` `(` `)` `[` `]` `{` `}` `|` 。\n *\n * @static\n * @alias module:String.escapeRegExp\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/multipage/text-processing.html#sec-patterns | syntax characters}\n * @param {string} string 要转义的字符串。\n * @returns {string} 转义后的字符串。\n * @example\n *\n * escapeRegExp('\\\\'); // '\\\\\\\\'\n *\n * escapeRegExp('-+='); // '\\\\-\\\\+='\n *\n * escapeRegExp('[ut2](https://caijf.github.io/ut2/)'); // '\\\\[ut2\\\\]\\\\(https://caijf\\\\.github\\\\.io/ut2/\\\\)'\n *\n */\nfunction escapeRegExp(string: string) {\n return string && reHasRegExpChar.test(string)\n ? string.replace(reRegExpChar, '\\\\$&')\n : string || '';\n}\n\nexport default escapeRegExp;\n","import toString from './toString';\n\nconst htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n};\n\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#(0+)?39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * 转义字符串中的 HTML 实体字符 `&` `<` `"` `'` 为对应的字符。\n *\n * 注意:不会转换其他的 HTML 实体。如果需要,可以使用第三方库,如 [he](https://github.com/mathiasbynens/he) 。\n *\n * @static\n * @alias module:String.unescape\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * unescape('<script></script>'); // '<script></script>'\n *\n * unescape('&'); // '&'\n */\nfunction unescape(string: string) {\n string = toString(string);\n return string && reHasEscapedHtml.test(string)\n ? string.replace(reEscapedHtml, (chr) => {\n // @ts-ignore\n return htmlUnescapes[chr] || \"'\";\n })\n : string || '';\n}\n\nexport default unescape;\n","import allKeys from './allKeys';\n\nfunction conformsTo<T extends object, K extends keyof T>(\n object: T,\n source: Record<K, (value: T[K]) => any>\n): boolean;\nfunction conformsTo<T extends object | null | undefined>(\n object: T,\n source: Record<string | symbol, (value: any) => any>\n): boolean;\n/**\n * 通过调用断言 `source` 的属性与 `object` 的相应属性值,检查 `object` 是否符合 `source` 。\n *\n * @static\n * @alias module:Util.conformsTo\n * @since 1.0.0\n * @param {Object} object 要检查的对象。\n * @param {Object} source 要断言属性是否符合的对象。\n * @returns {boolean} 如果 `object` 符合,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * const object = { a: 1, b: 2 }\n *\n * conformsTo(object, { b: value => value > 1 }); // true\n *\n * conformsTo(object, { b: value => value > 2 }); // false\n *\n */\nfunction conformsTo<T extends object, K extends keyof T>(\n object: T,\n source: Record<K, (value: T[K]) => any>\n) {\n const props = allKeys(source) as unknown as K[];\n const length = props.length;\n\n if (object == null) {\n return !length;\n }\n\n if (length === 0) {\n return true;\n }\n\n for (let i = 0; i < length; i++) {\n const key = props[i];\n const predicate = source[key];\n const value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport default conformsTo;\n","import toString from './toString';\n\n// 计数器\nlet idCounter = 0;\n\n/**\n * 生成唯一ID。如果提供了 `prefix` ,会被添加到ID前缀上。\n *\n * @static\n * @alias module:Util.uniqueId\n * @since 1.0.0\n * @param {string} [prefix] 要添加到ID前缀的值。\n * @returns {string} 唯一ID。\n * @example\n *\n * uniqueId(); // '1'\n *\n * uniqueId(); // '2'\n *\n * uniqueId('abc_'); // 'abc_3'\n *\n */\nfunction uniqueId(prefix = '') {\n const id = ++idCounter;\n return toString(prefix) + id;\n}\n\nexport default uniqueId;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 创建一个函数,当它被调用 `n` 或更多次之后触发 `func` 。\n *\n * @static\n * @alias module:Function.after\n * @since 1.0.0\n * @param {number} n 函数应该在调用多少次后执行。\n * @param {Function} func 用来限定的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * const saves = ['profile', 'settings'];\n * const done = after(saves.length, () => console.log('done saving!'));\n *\n * saves.forEach(item=>{\n * console.log(item);\n * done();\n * });\n * // 'profile'\n * // 'settings'\n * // 'done saving!'\n *\n */\nfunction after<T extends (...args: any[]) => any>(n: number, func: T) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = defaultTo(toNumber(n), 0);\n return function () {\n if (--n < 1) {\n // @ts-ignore\n // eslint-disable-next-line prefer-rest-params\n return func.apply(this, arguments);\n }\n } as T;\n}\n\nexport default after;\n","import splitCaseWords from './internals/splitCaseWords';\nimport upperFirst from './upperFirst';\n\n/**\n * 转换字符串为驼峰写法。\n *\n * @static\n * @alias module:String.camelCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Camel_case | Camel_case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 驼峰写法的字符串。\n * @example\n *\n * camelCase('foo bar'); // 'fooBar'\n *\n * camelCase('foo-bar'); // 'fooBar'\n *\n * camelCase('Foo Bar'); // 'fooBar'\n *\n * camelCase('FOO BAR'); // 'fooBar'\n *\n * camelCase('--FOO-BAR--'); // 'fooBar'\n *\n * camelCase('__FOO_BAR__'); // 'fooBar'\n *\n */\nfunction camelCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => {\n cur = cur.toLowerCase();\n return prev + (index ? upperFirst(cur) : cur);\n }, '');\n}\n\nexport default camelCase;\n","import toString from './toString';\nimport upperFirst from './upperFirst';\n\n/**\n * 转换字符串首字母大写,剩下为小写。\n *\n * @static\n * @alias module:String.capitalize\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 首字母大写的字符串。\n * @example\n *\n * capitalize('bar'); // 'Bar'\n *\n * capitalize('BAR'); // 'Bar'\n *\n */\nfunction capitalize(string: string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nexport default capitalize;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度向上舍入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.ceil\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要向上舍入的值。\n * @param {number} [precision=0] 向上舍入的精度。\n * @returns {number} 向上舍入的值。\n * @example\n *\n * ceil(4.16); // 5\n *\n * ceil(4.16, 1); // 4.2\n *\n * ceil(4160, -2); // 4200\n *\n */\nfunction ceil(number: number, precision?: number) {\n return decimalAdjust('ceil', number, precision);\n}\n\nexport default ceil;\n","import isArray from './isArray';\nimport toLength from './toLength';\n\n/**\n * 将数组拆分成多个 `size` 长度的区块,并将这些区块组成一个新数组。\n *\n * 如果数组无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。\n *\n * @static\n * @alias module:Array.chunk\n * @since 1.0.0\n * @param {Array} array 要处理的数组。\n * @param {number} [size=1] 每个数组区块的长度。\n * @returns {Array} 拆分区块的新数组。\n * @example\n *\n * const array = ['a', 'b', 'c', 'd'];\n *\n * chunk(array, 2); // [['a', 'b'], ['c', 'd']]\n *\n * chunk(array, 3); // [['a', 'b', 'c'], ['d']]\n *\n */\nfunction chunk<T>(array: T[], size = 1) {\n size = toLength(size);\n if (!isArray(array) || size < 1) {\n return [];\n }\n\n const length = array.length;\n const result: T[][] = Array(Math.ceil(length / size));\n let resIndex = 0,\n index = 0;\n\n while (index < length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n\n return result;\n}\n\nexport default chunk;\n","import defaultTo from './defaultTo';\nimport toNumber from './toNumber';\n\nfunction clamp(number: number, upper: number): number;\nfunction clamp(number: number, lower: number, upper: number): number;\n/**\n * 数字限制在 `lower` 和 `upper` 之间的值。\n *\n * @static\n * @alias module:Number.clamp\n * @since 1.0.0\n * @param {number} number 被限制的值。\n * @param {number} [lower] 下限。\n * @param {number} upper 上限。\n * @returns {number} 被限制的值。\n * @example\n *\n * clamp(-10, -5, 5); // -5\n *\n * clamp(-10, 0, 5); // 0\n *\n * clamp(10, -5, 5); // 5\n *\n * // 仅限制上限\n * clamp(10, 5); // 5\n *\n * clamp(-10, 5); // -10\n *\n */\nfunction clamp(number: number, lower?: number, upper?: number) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n\n if (upper !== undefined) {\n upper = defaultTo(toNumber(upper), 0);\n }\n\n if (lower !== undefined) {\n lower = defaultTo(toNumber(lower), 0);\n }\n\n number = toNumber(number);\n\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n\n return number;\n}\n\nexport default clamp;\n","import isArray from './isArray';\n\n/**\n * 创建一个新数组,包含原数组中所有的非假值元素。\n *\n * 例如 `false` `null` `0` `\"\"` `undefined` `NaN` 都被认为是假值。\n *\n * @static\n * @alias module:Array.compact\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy | Falsy}\n * @param {Array} array 待处理的数组。\n * @returns {Array} 过滤掉假值的新数组。\n * @example\n *\n * compact([0, 1, false, '', 2]); // [1, 2]\n *\n */\nfunction compact<T>(array: T[]) {\n return isArray(array) ? array.filter((item) => !!item) : [];\n}\n\nexport default compact;\n","import conformsTo from './conformsTo';\n\n/**\n * 创建一个函数,调用 `source` 的属性名对应的断言函数与传入对象相对应属性名的值进行断言处理。如果都符合返回 `true`,否则返回 `false` 。\n *\n * @static\n * @alias module:Util.conforms\n * @since 1.0.0\n * @param {Object} source 要断言属性是否符合的对象。\n * @returns {Function} 新的函数。\n * @example\n *\n * const objs = [\n * { a: 1, b: 1 },\n * { a: 2, b: 2 }\n * ]\n *\n * objs.filter(conforms({ b: value => value > 1 })); // [{ a: 2: b: 2 }]\n */\nfunction conforms<\n T extends object,\n K extends keyof T,\n S extends object = Record<string, (value: T[K]) => any>\n>(source: S) {\n return function (object: T) {\n return conformsTo(object, source);\n };\n}\n\nexport default conforms;\n","/**\n * 创建一个返回 `value` 的函数。\n *\n * @static\n * @alias module:Util.constant\n * @since 1.0.0\n * @param {*} value 新函数返回的值。\n * @returns {Function} 返回新的常量函数。\n * @example\n *\n * const obj = { a: 1 }\n *\n * const returnObj = constant(obj);\n *\n * console.log(returnObj() === obj); // true\n */\nfunction constant<T>(value: T) {\n return function () {\n return value;\n };\n}\n\nexport default constant;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果,每个 `key` 对应的值是 `iteratee` 返回该 `key` 的次数。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.countBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成集合对象。\n * @example\n *\n * countBy([6, 4, 6]); // {'6': 2, '4': 1}\n *\n * countBy([6.1, 4.2, 6.3], Math.floor); // {'6': 2, '4': 1}\n *\n * countBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': 2, '4': 1}\n *\n * // 迭代函数可以直接写入属性。\n * countBy(['one', 'two', 'three'], 'length'); // {'3': 2, '5': 1}\n *\n */\nfunction countBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, number> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n if (key in result) {\n ++result[key];\n } else {\n result[key] = 1;\n }\n });\n }\n return result;\n}\n\nexport default countBy;\n","import baseDebounce from './internals/baseDebounce';\n\n/**\n * 创建一个防抖动函数,该函数会从上一次被调用后,延迟 `wait` 毫秒数后调用 `func` 方法。\n *\n * 防抖动函数还提供以下方法:\n * 1. `cancel` 方法取消延迟的函数调用。\n * 2. `flush` 方法立即调用。\n * 3. `pending` 方法是否在等待函数执行。\n *\n * @static\n * @alias module:Function.debounce\n * @since 1.0.0\n * @param {Function} func 要防抖动的函数。\n * @param {number} [wait=0] 需要延迟的毫秒数。\n * @param {boolean} [immediate=false] 是否在延迟开始前调用。\n * @returns {Function} 防抖动函数。\n * @example\n *\n * function calculateLayout(e){\n * console.log('calculate layout event: ', e);\n * }\n *\n * // 避免窗口在变动时出现昂贵的计算开销。\n * window.addEventListener('resize', debounce(calculateLayout, 200));\n *\n * const debounced = debounce(()=>{\n * // do something\n * }\n *\n * // 点击按钮立即执行,而后如果在每 300 毫秒内连续点击,将在最后一次点击延迟 300 毫秒后执行。\n * document.querySelector('button').addEventListener('click', debounced, 300, true));\n *\n * // 取消防抖动调用\n * window.addEventListener('popstate', debounced.cancel);\n *\n */\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait = 0, immediate = false) {\n return baseDebounce(func, wait, immediate);\n}\n\nexport default debounce;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 延迟 `wait` 毫秒后调用 `func` 。\n *\n * @static\n * @alias module:Function.delay\n * @since 1.0.0\n * @param {Function} func 要延迟的函数。\n * @param {number} wait 要延迟的毫秒数。\n * @param {...*} [args] 调用函数时传入的参数。\n * @returns {number} 计时器 id 。\n * @example\n *\n * // 延迟 1000 毫秒后执行\n * delay(function(text){\n * console.log(text);\n * }, 1000, 'hello world');\n *\n * // 'hello world'\n *\n */\nfunction delay<T extends (...args: any[]) => any>(func: T, wait: number, ...args: Parameters<T>) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n // @ts-ignore\n const context = this;\n wait = defaultTo(toNumber(wait), 0);\n\n return setTimeout(() => {\n func.apply(context, args);\n }, wait);\n}\n\nexport default delay;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度向下舍入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.floor\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要向下舍入的值。\n * @param {number} [precision=0] 向下舍入的精度。\n * @returns {number} 向下舍入的值。\n * @example\n *\n * floor(4.16); // 4\n *\n * floor(4.16, 1); // 4.1\n *\n * floor(4160, -2); // 4100\n */\nfunction floor(number: number, precision?: number) {\n return decimalAdjust('floor', number, precision);\n}\n\nexport default floor;\n","import isArray from './isArray';\n\nfunction fromPairs<P extends string | number | symbol, V = any>(array: [P, V][]): Record<P, V>;\nfunction fromPairs<P extends string | number | symbol>(array: any[][]): Record<P, any>;\n/**\n * 将键值对数组转为对象。\n *\n * 与 [Object.entries](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/entries) 正好相反。\n *\n * @static\n * @alias module:Array.fromPairs\n * @since 1.0.0\n * @param {Array} array 键值对数组。\n * @returns {Object} 新对象。\n * @example\n *\n * fromPairs([['foo', 'bar'], ['baz', 42]]); // {foo: 'bar', baz: 42}\n *\n */\nfunction fromPairs<P extends string | number | symbol, V>(array: any[][]) {\n // @ts-ignore\n const result: Record<P, V> = {};\n\n if (!isArray(array)) {\n return result;\n }\n\n array.forEach((item) => {\n result[item[0] as P] = item[1];\n });\n\n return result;\n}\n\nexport default fromPairs;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成聚合对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果。分组值的顺序是由他们出现在 `collection` 的顺序确定的。每个键对应的值负责生成 `key` 的元素组成的数组。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.groupBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成聚合对象。\n * @example\n *\n * groupBy([6, 4, 6]); // {'6': [6, 6], '4': [4]}\n *\n * groupBy([6.1, 4.2, 6.3], Math.floor); // {'6': [6.1, 6.3], '4': [4.2]}\n *\n * groupBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': [{n: 6.1}, {n: 6.3}], '4': [{n: 4.2}]}\n *\n * // 迭代函数可以直接写入属性。\n * groupBy(['one', 'two', 'three'], 'length'); // {'3': ['one', 'two'], '5': ['three']}\n *\n */\nfunction groupBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, T[]> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n if (key in result) {\n result[key].push(item);\n } else {\n result[key] = [item];\n }\n });\n }\n return result;\n}\n\nexport default groupBy;\n","import { baseGte, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否大于或等于 `other` 。\n *\n * @static\n * @alias module:Util.gte\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 大于或等于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * gte(1, 3); // false\n *\n * gte(3, 3); // true\n *\n * gte(3, 1); // true\n *\n */\nfunction gte(value: any, other: any) {\n return createOperation(baseGte)(value, other);\n}\n\nexport default gte;\n","import toNumber from './toNumber';\n\n/**\n * 检查数字是否在 `start` 与 `end` 之间,但不包括 `end` 。\n *\n * 如果 `start` 大于 `end` 会自动交换范围参数。\n *\n * @static\n * @alias module:Number.inRange\n * @since 1.0.0\n * @param {number} number 要检查的值。\n * @param {number} start 开始范围。\n * @param {number} [end=0] 结束范围。\n * @returns {number} 如果数字在范围内,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * inRange(3, 2, 4); // true\n *\n * inRange(1, 0, 2); // true\n *\n * inRange(1.2, 0.5, 1.5); // true\n *\n * inRange(2.2, 0.5, 1.5); // false\n *\n * inRange(-2, -2, 4); // true\n *\n * inRange(4, -2, 4); // false\n *\n * // 某个范围为 0 可省略最后一个参数\n * inRange(1, 2); // true\n *\n * inRange(1, -2); // false\n *\n */\nfunction inRange(number: number, start: number, end = 0) {\n number = toNumber(number);\n start = toNumber(start);\n end = toNumber(end);\n return number >= Math.min(start, end) && number < Math.max(start, end);\n}\n\nexport default inRange;\n","import isType from './internals/isType';\nimport { hasOwnProperty, propertyIsEnumerable } from './internals/native';\nimport { supportedArgumentsType, argType } from './internals/helpers';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `arguments` 对象。\n *\n * @static\n * @alias module:Language.isArguments\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `arguments` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArguments(function() { return arguments }()); // true\n *\n * isArguments([1, 2, 3]); // false\n *\n */\nfunction isArguments(value: any) {\n if (supportedArgumentsType) {\n return isObjectLike(value) && isType(value, argType);\n }\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nexport default isArguments;\n","import isType from './internals/isType';\nimport { nodeIsArrayBuffer } from './internals/nodeUtil';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `ArrayBuffer` 对象。\n *\n * @static\n * @alias module:Language.isArrayBuffer\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `ArrayBuffer` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayBuffer(new ArrayBuffer(8)); // true\n *\n * isArrayBuffer({}); // false\n *\n * isArrayBuffer('2012'); // false\n *\n */\nfunction isArrayBuffer(value: any) {\n return nodeIsArrayBuffer ? nodeIsArrayBuffer(value) : isObjectLike(value) && isType(value, 'ArrayBuffer');\n}\n\nexport default isArrayBuffer;\n","import isType from './internals/isType';\nimport { blobExisted } from './internals/native';\n\n/**\n * 检查值是否为 `Blob` 对象。\n *\n * 浏览器环境的 `Blob` 或 `File` 对象,或其他继承自 `Blob` 的实例,都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isBlob\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/Blob | Blob}\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/File | File}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Blob` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isBlob(new Blob(['a'])); // true\n *\n * isBlob({}); // false\n *\n * isBlob('2012'); // false\n *\n */\nfunction isBlob(value: any): value is Blob {\n // instanceof 不支持跨域对象判断,如来自 iframe 的 Blob 对象\n return (blobExisted && value instanceof Blob) || isType(value, ['Blob', 'File']);\n}\n\nexport default isBlob;\n","import isType from './internals/isType';\n\n/**\n * 检查值是否为布尔类型或对象。\n *\n * @static\n * @alias module:Language.isBoolean\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为布尔类型或对象,返回 `true` 否则返回 `false` 。\n * @example\n *\n * isBoolean(false); // true\n *\n * isBoolean(new Boolean(false)); // true\n *\n * isBoolean(Object(false)); // true\n *\n * isBoolean(new Boolean(false)); // true\n *\n * isBoolean(null); // false\n *\n */\nfunction isBoolean(value: any) {\n return value === true || value === false || isType(value, 'Boolean');\n}\n\nexport default isBoolean;\n","import isType from './internals/isType';\n\n/**\n * 检查值是否为 `DataView` 对象。\n *\n * @static\n * @alias module:Language.isDataView\n * @since 1.2.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `DataView` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isDataView(new DataView(new ArrayBuffer(8))); // true\n *\n */\nfunction isDataView(value: any) {\n return isType(value, 'DataView');\n}\n\nexport default isDataView;\n","import isType from './internals/isType';\nimport { nodeIsDate } from './internals/nodeUtil';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Date` 对象。\n *\n * @static\n * @alias module:Language.isDate\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Date` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isDate(new Date); // true\n *\n * isDate('Mon April 23 2012'); // false\n *\n */\nfunction isDate(value: any): value is Date {\n return nodeIsDate ? nodeIsDate(value) : isObjectLike(value) && isType(value, 'Date');\n}\n\nexport default isDate;\n","import isObjectLike from './isObjectLike';\nimport isPlainObject from './isPlainObject';\n\n/**\n * 检查值是否可能为 `DOM` 元素。\n *\n * @static\n * @alias module:Language.isElement\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `DOM` 元素,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isElement(document.body); // true\n *\n * isElement('<body>'); // false\n *\n */\nfunction isElement(value: any) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n}\n\nexport default isElement;\n","import keys from './internals/keys';\nimport isArrayLike from './isArrayLike';\nimport isMap from './isMap';\nimport isObjectLike from './isObjectLike';\nimport isSet from './isSet';\n\n/**\n * 检查值是否为空对象。\n *\n * 类数组的 `length===0`,`Map` `Set` 的 `size === 0` 表示为空。如果对象 `Object.keys` 没有可枚举属性,则被认为是空的。\n *\n * 非上述类型值,都将被认为是空的。\n *\n * @static\n * @alias module:Language.isEmpty\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为空,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isEmpty(null); // true\n *\n * isEmpty(true); // true\n *\n * isEmpty(1); // true\n *\n * isEmpty([]); // true\n *\n * isEmpty({}); // true\n *\n * isEmpty(''); // false\n *\n * isEmpty('abc'); // false\n *\n * isEmpty([1, 2, 3]); // false\n *\n * isEmpty({ a: 1, b: 2 }); // false\n *\n */\nfunction isEmpty(value: any) {\n if (value == null) {\n return true;\n }\n\n if (isMap(value) || isSet(value)) {\n return !value.size;\n }\n\n if (isObjectLike(value)) {\n return !keys(value).length;\n }\n\n if (isArrayLike(value)) {\n return !value.length;\n }\n\n return true;\n}\n\nexport default isEmpty;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Error` 或 `DOMException` 。\n *\n * 继承自 `Error` 的对象,如 `EvalError` `RangeError` `ReferenceError` `SyntaxError` `TypeError` `URIError` `AggregateError`,都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isError\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Error` 或 `DOMException` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isError(new Error); // true\n *\n * isError(Error); // false\n *\n */\nfunction isError(value: any) {\n if (!isObjectLike(value)) {\n return false;\n }\n return value instanceof Error || isType(value, ['Error', 'DOMException']);\n}\n\nexport default isError;\n","import { root } from './internals/native';\nimport isNumber from './isNumber';\n\n/**\n * 检查值是否为 `NaN` 。\n *\n * 和 `Number.isNaN` 区别是 `new Number(NaN)` 也被认为是 `NaN`。\n *\n * @static\n * @alias module:Language.isNaN\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `NaN` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNaN(NaN); // true\n *\n * isNaN(new Number(NaN)); // true\n *\n * isNaN(1); // false\n *\n */\nfunction isNaN(value: any): boolean {\n return isNumber(value) && root.isNaN(value);\n}\n\nexport default isNaN;\n","/**\n * 检查值是否为 `null` 。\n *\n * @static\n * @alias module:Language.isNull\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `null` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNull(null); // true\n *\n * isNull(void 0); // false\n *\n */\nfunction isNull(value: any) {\n return value === null;\n}\n\nexport default isNull;\n","import isObject from './isObject';\n\n/**\n * 检测值是否类似 `Promise` 对象。\n *\n * 如果一个对象包含 `then` 方法,它就是类似 `Promise` 对象。\n *\n * @static\n * @alias module:Language.isPromiseLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值类似 `Promise` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isPromiseLike(Promise.resolve()); // true\n *\n * isPromiseLike({ then: () => { } }); // true\n *\n * isPromiseLike([]); // false\n *\n */\nfunction isPromiseLike(value: any) {\n return isObject(value) && typeof value.then === 'function';\n}\n\nexport default isPromiseLike;\n","import isType from './internals/isType';\nimport { nodeIsRegExp } from './internals/nodeUtil';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `RegExp` 对象。\n *\n * @static\n * @alias module:Language.isRegExp\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `RegExp` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isRegExp(/abc/); // true\n *\n * isRegExp('/abc/'); // false\n *\n */\nfunction isRegExp(value: any) {\n return nodeIsRegExp ? nodeIsRegExp(value) : isObjectLike(value) && isType(value, 'RegExp');\n}\n\nexport default isRegExp;\n","import { MAX_SAFE_INTEGER } from './internals/native';\nimport { numberIsSafeInteger } from './internals/helpers';\nimport isInteger from './isInteger';\n\n/**\n * 检查值是否为安全整数。\n *\n * 同 `Number.isSafeInteger` 。\n *\n * 如果一个整数是一个 `IEEE-754` 双精度数字,它不是四舍五入的不安全整数的结果,那么它就是安全的。安全整数范围为 `-(2^53 - 1)` 到 `2^53 - 1` 之间的整数,包含 `-(2^53 - 1)` 和 `2^53 - 1`。\n *\n * @static\n * @alias module:Language.isSafeInteger\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为安全整数,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSafeInteger(1); // true\n *\n * isSafeInteger(Infinity); // false\n *\n * isSafeInteger(Number.MIN_VALUE); // false\n *\n * isSafeInteger('1'); // false\n *\n * isSafeInteger(null); // false\n *\n */\nfunction isSafeInteger(value: any): value is number {\n return numberIsSafeInteger ? numberIsSafeInteger(value) : isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n\nexport default isSafeInteger;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为字符串类型或对象。\n *\n * @static\n * @alias module:Language.isString\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为字符串类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isString('abc'); // true\n *\n * isString(new String('abc')); // true\n *\n * isString(1); // false\n *\n */\nfunction isString(value: any) {\n return typeof value === 'string' || (isObjectLike(value) && isType(value, 'String'));\n}\n\nexport default isString;\n","/**\n * 检查值是否为 `undefined` 。\n *\n * @static\n * @alias module:Language.isUndefined\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `undefined` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isUndefined(undefined); // true\n *\n * isUndefined(null); // false\n *\n */\nfunction isUndefined(value: any) {\n return value === void 0;\n}\n\nexport default isUndefined;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `WeakMap` 对象。\n *\n * @static\n * @alias module:Language.isWeakMap\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `WeakMap` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isWeakMap(new WeakMap); // true\n *\n * isWeakMap(new Map); // false\n *\n */\nfunction isWeakMap(value: any): value is WeakMap<any, any> {\n return isObjectLike(value) && isType(value, 'WeakMap');\n}\n\nexport default isWeakMap;\n","import isType from './internals/isType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `WeakSet` 对象。\n *\n * @static\n * @alias module:Language.isWeakSet\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `WeakSet` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isWeakSet(new WeakSet); // true\n *\n * isWeakSet(new Set); // false\n *\n */\nfunction isWeakSet(value: any): value is WeakSet<any> {\n return isObjectLike(value) && isType(value, 'WeakSet');\n}\n\nexport default isWeakSet;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为连接符小写。\n *\n * @static\n * @alias module:String.kebabCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Letter_case#Special_case_styles | kebab case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * kebabCase('foo bar'); // 'foo-bar'\n *\n * kebabCase('foo-bar'); // 'foo-bar'\n *\n * kebabCase('Foo Bar'); // 'foo-bar'\n *\n * kebabCase('FOO BAR'); // 'foo-bar'\n *\n * kebabCase('--FOO-BAR--'); // 'foo-bar'\n *\n * kebabCase('__FOO_BAR__'); // 'foo-bar'\n *\n */\nfunction kebabCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? '-' : '') + cur.toLowerCase(), '');\n}\n\nexport default kebabCase;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成聚合对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果。每个 `key` 对应的值是生成 `key` 的最后一个元素。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.keyBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成聚合对象。\n * @example\n *\n * keyBy([6, 4, 6]); // {'6': 6, '4': 4}\n *\n * keyBy([6.1, 4.2, 6.3], Math.floor); // {'6': 6.3, '4': 4.2}\n *\n * keyBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': {n: 6.3}, '4': {n: 4.2}}\n *\n * // 迭代函数可以直接写入属性。\n * keyBy(['one', 'two', 'three'], 'length'); // {'3': 'two', '5': 'three'}\n *\n */\nfunction keyBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, T> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n result[key] = item;\n });\n }\n return result;\n}\n\nexport default keyBy;\n","import getKeysIn from './internals/getKeysIn';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(不包含 `Symbol` 属性)。\n *\n * 同 `key...in` 。\n *\n * @static\n * @alias module:Object.keysIn\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {string[]} 对象自身及继承的可枚举属性名(不包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * keysIn(new Foo); // ['a', 'c']\n *\n */\nfunction keysIn<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return getKeysIn(object);\n}\n\nexport default keysIn;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为空格分隔的小写单词。\n *\n * @static\n * @alias module:String.lowerCase\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 小写字符串。\n * @example\n *\n * lowerCase('foo bar'); // 'foo bar'\n *\n * lowerCase('foo-bar'); // 'foo bar'\n *\n * lowerCase('Foo Bar'); // 'foo bar'\n *\n * lowerCase('FOO BAR'); // 'foo bar'\n *\n * lowerCase('--FOO-BAR--'); // 'foo bar'\n *\n * lowerCase('__FOO_BAR__'); // 'foo bar'\n *\n */\nfunction lowerCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? ' ' : '') + cur.toLowerCase(), '');\n}\n\nexport default lowerCase;\n","import createCaseFirst from './internals/createCaseFirst';\n\n/**\n * 转换字符串第一个字符为小写。\n *\n * @static\n * @alias module:String.lowerFirst\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * lowerFirst('Bar'); // 'bar'\n *\n * lowerFirst('BAR'); // 'bAR'\n *\n */\nfunction lowerFirst(string: string) {\n return createCaseFirst('toLowerCase')(string);\n}\n\nexport default lowerFirst;\n","import { baseLte, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否小于或等于 `other` 。\n *\n * @static\n * @alias module:Util.lte\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 小于或等于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * lte(1, 3); // true\n *\n * lte(3, 3); // true\n *\n * lte(3, 1); // false\n *\n */\nfunction lte(value: any, other: any) {\n return createOperation(baseLte)(value, other);\n}\n\nexport default lte;\n","import gt from './gt';\nimport identity from './identity';\nimport createExtremum from './internals/createExtremum';\n\n/**\n * 调用 `array` 中的每一个元素,来生成其值排序的标准,返回最大的值。\n *\n * `iteratee` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Math.max\n * @since 1.0.0\n * @param {Array} array 要迭代的数组。\n * @param {Function | string} [iteratee=identity] 调用每个元素的迭代函数。\n * @returns {*} 最大的值。\n * @example\n *\n * const array = [1, 2, 3];\n *\n * max(array); // 3\n *\n * const objects = [{n: 1}, {n: 2}];\n *\n * max(objects, item => item.n); // {n: 2}\n *\n * // 迭代函数可以直接写入属性。\n * max(objects, 'n'); // {n: 2};\n *\n */\nfunction max<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K = identity as any\n) {\n return createExtremum(array, iteratee, gt);\n}\n\nexport default max;\n","import identity from './identity';\nimport createExtremum from './internals/createExtremum';\nimport lt from './lt';\n\n/**\n * 调用 `array` 中的每一个元素,来生成其值排序的标准,返回最小的值。\n *\n * `iteratee` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Math.min\n * @since 1.0.0\n * @param {Array} array 要迭代的数组。\n * @param {Function | string} [iteratee=identity] 调用每个元素的迭代函数。\n * @returns {*} 最小的值。\n * @example\n *\n * const array = [1, 2, 3];\n *\n * min(array); // 1\n *\n * const objects = [{n: 1}, {n: 2}];\n *\n * min(objects, item => item.n); // {n: 1}\n *\n * // 迭代函数可以直接写入属性。\n * min(objects, 'n'); // {n: 1};\n */\nfunction min<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K = identity as any\n) {\n return createExtremum(array, iteratee, lt);\n}\n\nexport default min;\n","/**\n * 空函数,返回 `undefined` 。\n *\n * @static\n * @alias module:Util.noop\n * @since 1.0.0\n * @example\n *\n * noop(); // undefined\n *\n */\nfunction noop() {}\n\nexport default noop;\n","import nth from './nth';\n\n/**\n * 创建一个函数,该函数返回第 `n` 个参数。如果 `n` 为负数,则返回从结尾开始的第 `n` 个参数。\n *\n * @static\n * @alias module:Util.nthArg\n * @since 1.0.0\n * @param {number} [n=0] 要返回参数的索引值。\n * @returns 新函数。\n * @example\n *\n * const func1 = nthArg(1);\n *\n * func1('a', 'b', 'c', 'd'); // 'b'\n *\n * const func2 = nthArg(-2);\n *\n * func2('a', 'b', 'c', 'd'); // 'c'\n *\n */\nfunction nthArg(n = 0) {\n return function (...args: any[]) {\n return nth(args, n);\n };\n}\n\nexport default nthArg;\n","import allKeysIn from './allKeysIn';\nimport castArray from './castArray';\n\n/**\n * 创建一个对象,该对象由忽略属性之外的 `object` 自身和继承的可枚举属性组成。与 [`pick`](#.pick) 相反。\n *\n * @static\n * @alias module:Object.omit\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {string | string[]} [fields] 要被忽略的属性。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * // 浅拷贝对象\n * omit(obj); // { name: \"jeff\", age: 18 }\n *\n * // 排除单个属性\n * omit(obj, 'name'); // { age: 18 }\n *\n * // 排除多个属性\n * omit(obj, ['name', 'age']); // {}\n *\n */\nfunction omit<T extends object, K extends keyof T>(object: T, fields: K | K[] = []) {\n const keys = allKeysIn(object) as K[];\n const fieldArr = castArray(fields);\n const result: Record<any, any> = {};\n\n keys.forEach((key) => {\n if (!fieldArr.includes(key)) {\n result[key] = object[key];\n }\n });\n\n return result as Omit<T, K>;\n}\n\nexport default omit;\n","import negate from './negate';\nimport pickBy from './pickBy';\n\n/**\n * 创建一个对象,该对象忽略 `predicate` (断言函数)判断不是真值的属性后,`object` 自身和继承的可枚举属性组成。与 [`pickBy`](#.pickBy) 相反。\n *\n * `predicate` 调用时会传入 2 个参数 `value` `key` 。\n *\n * @static\n * @alias module:Object.omitBy\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {Function} [predicate] 调用每一个属性的函数。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * omitBy(obj); // { name: \"jeff\", age: 18 }\n *\n * omitBy(obj, (value) => typeof value === 'number'); // { name: \"jeff\" }\n *\n * omitBy(obj, (value) => value); // {}\n *\n */\nfunction omitBy<T extends object>(\n object: T,\n predicate: (value: any, key: any) => any = () => false\n) {\n return pickBy(object, negate(predicate));\n}\n\nexport default omitBy;\n","import before from './before';\n\n/**\n * 创建一个只能调用 `func` 一次的函数。重复调用将返回第一次调用 `func` 的结果。\n *\n * @static\n * @alias module:Function.once\n * @since 1.2.0\n * @requires module:Function.before\n * @param {Function} func 限制执行的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * let count = 0;\n *\n * const increment = _.once(()=>{\n * return ++count;\n * });\n *\n * increment(); // 1\n * increment(); // 1\n * increment(); // 1\n *\n */\nfunction once<T extends (...args: any[]) => any>(func: T) {\n return before(2, func);\n}\n\nexport default once;\n","function partial<TS extends any[], R>(func: (...ts: TS) => R): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, R>(\n func: (t1: T1, ...ts: TS) => R,\n arg1: T1\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, R>(\n func: (t1: T1, t2: T2, ...ts: TS) => R,\n t1: T1,\n t2: T2\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, R>(\n func: (t1: T1, t2: T2, t3: T3, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, T9, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>(\n func: (\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9,\n t10: T10,\n ...ts: TS\n ) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9,\n t10: T10\n): (...ts: TS) => R;\n/**\n * 创建一个函数。该函数调用 `func` ,并传入预设的 `args` 参数。\n *\n * @static\n * @alias module:Function.partial\n * @since 1.0.0\n * @param {Function} func 需要预设的函数。\n * @param {...*} [args] 预设的参数。\n * @returns {Function} 预设参数的函数。\n * @example\n *\n * function greet(greeting, name){\n * return greeting + ' ' + name;\n * }\n *\n * const sayHelloTo = partial(greet, 'hello');\n *\n * sayHelloTo('jeff'); // 'hello jeff'\n *\n */\nfunction partial(func: any, ...args: any[]) {\n return function (...remainingArgs: any[]) {\n // @ts-ignore\n return func.apply(this, args.concat(remainingArgs));\n };\n}\n\nexport default partial;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个分成两组的元素数组,第一组包含 `predicate`(断言函数)返回为 [`truthy`](https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy)(真值)的元素,第二组包含 `predicate`(断言函数)返回为 [`falsy`](https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy)(假值)的元素。\n *\n * `predicate` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Collection.partition\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [predicate=identity] 每次迭代调用的断言函数。\n * @returns {Array} 分组后的数组。\n * @example\n *\n * const users = [\n * { user: 'barney', age: 36, active: false },\n * { user: 'fred', age: 40, active: true },\n * { user: 'pebbles', age: 1, active: false }\n * ];\n *\n * partition(users, item => item.active);\n * // [\n * // [{ user: 'fred', age: 40, active: true }],\n * // [{ user: 'barney', age: 36, active: false }, { user: 'pebbles', age: 1, active: false }]\n * // ]\n *\n * // 迭代函数可以直接写入属性。\n * partition(users, 'active');\n * // [\n * // [{ user: 'fred', age: 40, active: true }],\n * // [{ user: 'barney', age: 36, active: false }, { user: 'pebbles', age: 1, active: false }]\n * // ]\n *\n */\nfunction partition<T, F extends (value: T) => any, K extends keyof T>(collection: T[], predicate?: F | K) {\n const result: [T[], T[]] = [[], []];\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(predicate);\n collection.forEach((item) => {\n result[internalIteratee(item) ? 0 : 1].push(item);\n });\n }\n return result;\n}\n\nexport default partition;\n","import castArray from './castArray';\n\n/**\n * 创建一个从 `object` 选中的属性的对象。\n *\n * 允许选取对象的所有属性(包含不可枚举属性)。\n *\n * @static\n * @alias module:Object.pick\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {string | string[]} [fields] 选中的属性。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * pick(obj); // {}\n *\n * // 选取单个属性\n * pick(obj, 'name'); // { name: \"jeff\" }\n *\n * // 选取多个属性\n * pick(obj, ['name', 'age']); // { name: \"jeff\", age: 18 }\n */\nfunction pick<T extends object, K extends keyof T>(object: T, fields: K | K[] = []) {\n const result: Record<any, any> = {};\n const fieldArr = castArray(fields);\n\n fieldArr.forEach((field) => {\n if (field in object) {\n result[field] = object[field];\n }\n });\n\n return result as Pick<T, K>;\n}\n\nexport default pick;\n","import toFinite from './toFinite';\n\n/**\n * 产生一个包含 `lower` 与 `upper` 之间的随机浮点数。\n *\n * 如果 `lower` 大于 `upper` 会自动交换参数。\n *\n * @static\n * @alias module:Number.random\n * @since 1.0.0\n * @param {number} [lower=0] 下限。\n * @param {number} [upper=1] 上限。\n * @returns {number} 随机浮点数。\n * @example\n *\n * random(); // 0 到 1 之间的浮点数\n *\n * random(2, 4); // 2 到 4 之间的浮点数\n *\n * random(4, 2); // 2 到 4 之间的浮点数\n *\n * random(1.2, 2.4); // 1.2 到 2.4 之间的浮点数\n *\n */\nfunction random(lower = 0, upper = 1) {\n lower = toFinite(lower);\n upper = toFinite(upper);\n const min = Math.min(lower, upper);\n const max = Math.max(lower, upper);\n return min + Math.random() * (max - min);\n}\n\nexport default random;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度四舍五入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.round\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要四舍五入的值。\n * @param {number} [precision=0] 四舍五入的精度。\n * @returns {number} 四舍五入的值。\n * @example\n *\n * round(4.16); // 4\n *\n * round(4.16, 1); // 4.2\n *\n * round(4160, -2); // 4200\n */\nfunction round(number: number, precision?: number) {\n return decimalAdjust('round', number, precision);\n}\n\nexport default round;\n","import isArray from './isArray';\nimport randomInt from './randomInt';\n\n/**\n * 创建一个被打乱的数组。使用 [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) 版本。\n *\n * @static\n * @alias module:Array.shuffle\n * @since 1.0.0\n * @param {Array} array 要打乱的数组。\n * @returns {Array} 打乱的数组。\n * @example\n *\n * shuffle([1, 2, 3, 4]); // [2, 4, 3, 1]\n *\n * shuffle([1, 2, 3, 4]); // [3, 2, 1, 4]\n *\n */\nfunction shuffle<T>(array: T[]) {\n if (!isArray(array) || array.length < 1) {\n return [];\n }\n\n const result = array.slice();\n const length = result.length;\n const lastIndex = length - 1;\n let index = -1;\n\n while (++index < length) {\n const rand = randomInt(index, lastIndex);\n const value = result[rand];\n result[rand] = result[index];\n result[index] = value;\n }\n\n return result;\n}\n\nexport default shuffle;\n","/**\n * 异步方法中等待时间后继续执行。\n *\n * @static\n * @alias module:Util.sleep\n * @since 1.0.0\n * @param {number} [ms=1000] 等待时间,单位毫秒。\n * @returns {Promise<void>} 异步对象。\n * @example\n *\n * async ()=>{\n * await sleep();\n * // do something\n * }\n *\n * sleep(300).then(()=>{\n * // do something\n * })\n *\n */\nfunction sleep(ms = 1000): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport default sleep;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为下划线小写。\n *\n * @static\n * @alias module:String.snakeCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Snake_case | snake case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * snakeCase('foo bar'); // 'foo_bar'\n *\n * snakeCase('foo-bar'); // 'foo_bar'\n *\n * snakeCase('Foo Bar'); // 'foo_bar'\n *\n * snakeCase('FOO BAR'); // 'foo_bar'\n *\n * snakeCase('--FOO-BAR--'); // 'foo_bar'\n *\n * snakeCase('__FOO_BAR__'); // 'foo_bar'\n *\n */\nfunction snakeCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? '_' : '') + cur.toLowerCase(), '');\n}\n\nexport default snakeCase;\n","import baseDebounce from './internals/baseDebounce';\n\n/**\n * 创建一个节流函数,该函数在 `wait` 毫秒数内最多执行一次 `func` 方法。\n *\n * 节流函数还提供以下方法:\n * 1. `cancel` 方法取消延迟的函数调用。\n * 2. `flush` 方法立即调用。\n * 3. `pending` 方法是否在等待函数执行。\n *\n * @static\n * @alias module:Function.throttle\n * @since 1.0.0\n * @param {Function} func 要节流的函数。\n * @param {number} [wait=0] 需要节流的毫秒数。\n * @param {boolean} [immediate=true] 是否在节流开始前调用。\n * @returns 节流函数。\n * @example\n *\n * function updatePosition(e){\n * console.log('update position event: ', e);\n * }\n *\n * // 避免在滚动时频繁的更新定位。\n * window.addEventListener('scroll', throttle(updatePosition, 100));\n *\n * const throttled = throttle(()=>{\n * // do something\n * }\n *\n * // 点击按钮, 300 毫秒内最多执行一次。\n * document.querySelector('button').addEventListener('click', throttled, 300));\n *\n * // 取消节流调用。\n * window.addEvenetListener('popstate', throttled.cancel);\n *\n */\nfunction throttle<T extends (...args: any[]) => any>(func: T, wait = 0, immediate = true) {\n return baseDebounce(func, wait, immediate, true);\n}\n\nexport default throttle;\n","import identity from './identity';\nimport { MAX_ARRAY_LENGTH, MAX_SAFE_INTEGER } from './internals/native';\nimport isInteger from './isInteger';\nimport isFinite from './isFinite';\n\nfunction times<T>(n: number, iteratee: (index: number) => T): T[];\nfunction times(n: number): number[];\n/**\n * 调用 `iteratee` `n` 次,每次调用返回的结果存入到数组中。\n *\n * `iteratee` 调用传入 1 个参数 `index` 。\n *\n * @static\n * @alias module:Util.times\n * @since 1.0.0\n * @param {number} n 调用 `iteratee` 的次数。\n * @param {Function} [iteratee=identity] 每次迭代调用的函数。\n * @returns {Array} 调用结果的数组。\n * @example\n *\n * times(3); // [0, 1, 2]\n *\n * times(3, String); // ['0', '1', '2']\n *\n * times(4, () => 0); // [0, 0, 0, 0]\n *\n */\nfunction times<T>(n: number, iteratee = identity): T[] {\n if (n < 1 || n > MAX_SAFE_INTEGER) {\n return [];\n }\n\n let index = 0;\n const length = Math.min(isInteger(n) ? n : Math.floor(isFinite(n) ? n : 0), MAX_ARRAY_LENGTH);\n const result = Array(length);\n const func = typeof iteratee === 'function' ? iteratee : identity;\n\n while (index < length) {\n result[index] = func(index);\n index++;\n }\n\n return result;\n}\n\nexport default times;\n","import { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './internals/native';\nimport toInteger from './toInteger';\n\n/**\n * 转换 `value` 为一个安全整数。\n *\n * @static\n * @alias module:Util.toSafeInteger\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toSafeInteger(3.2); // 3\n *\n * toSafeInteger('3.2'); // 3\n *\n * toSafeInteger(-0); // -0\n *\n * toSafeInteger('-0'); // -0\n *\n * toSafeInteger('0'); // 0\n *\n * toSafeInteger(NaN); // 0\n *\n * toSafeInteger(Infinity); // 9007199254740991\n *\n * toSafeInteger(-Infinity); // -9007199254740991\n *\n */\nfunction toSafeInteger(value: any): number {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toInteger(value);\n if (value > MAX_SAFE_INTEGER) {\n return MAX_SAFE_INTEGER;\n }\n if (value < MIN_SAFE_INTEGER) {\n return MIN_SAFE_INTEGER;\n }\n return value;\n}\n\nexport default toSafeInteger;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为空格分隔的大写单词。\n *\n * @static\n * @alias module:String.upperCase\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 大写字符串。\n * @example\n *\n * upperCase('foo bar'); // 'FOO BAR'\n *\n * upperCase('foo-bar'); // 'FOO BAR'\n *\n * upperCase('Foo Bar'); // 'FOO BAR'\n *\n * upperCase('FOO BAR'); // 'FOO BAR'\n *\n * upperCase('--FOO-BAR--'); // 'FOO BAR'\n *\n * upperCase('__FOO_BAR__'); // 'FOO BAR'\n *\n */\nfunction upperCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? ' ' : '') + cur.toUpperCase(), '');\n}\n\nexport default upperCase;\n","import difference from './difference';\nimport createIteratee from './internals/createIteratee';\nimport intersection from './intersection';\nimport isArray from './isArray';\nimport union from './union';\nimport uniq from './uniq';\n\n/**\n * 创建一个唯一值的数组(并集-交集),该数组包含 2 个数组参数中不相同的元素。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.xor\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} [other=[]] 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 过滤值后的新数组。\n * @example\n *\n * xor([2, 1, 1], [4, 2]); // [1, 4]\n *\n * xor([2.1, 1.2], [4.3, 2.4], Math.floor); // [1.2, 4.3]\n *\n * xor([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * xor([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 2}]\n *\n * xor([-0, 0],[0]); // []\n *\n * xor([-0, 0],[0], undefined, true); // [-0]\n *\n */\nfunction xor<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[] = [], iteratee?: F | K, strickCheck = false) {\n if (!isArray(array) && !isArray(other)) {\n return [];\n }\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n if (!isArray(other)) {\n return uniq(array, internalIteratee, strickCheck);\n }\n if (!isArray(array)) {\n return uniq(other, internalIteratee, strickCheck);\n }\n return difference(\n union(array, other, internalIteratee, strickCheck),\n intersection(array, other, internalIteratee, strickCheck),\n internalIteratee,\n strickCheck\n );\n}\n\nexport default xor;\n","import unzip from './unzip';\n\n/**\n * 创建一个数组,数组的第一个元素包含所有给定数组的第一元素,第二个元素包含了所有给定数组的第二元素,依此类推。\n *\n * @static\n * @alias module:Array.zip\n * @since 1.0.0\n * @param {Array} array 要处理的分组元素数组。\n * @returns {Array} 重组元素的新数组。\n * @example\n *\n * zip(['barney', 'fred'], [36, 40]); // [['barney', 36], ['fred', 40]]\n *\n */\nfunction zip(...arrays: any[][]) {\n return unzip(arrays);\n}\n\nexport default zip;\n"],"names":["isArray","value","Array","freeGlobalThis","globalThis","Object","freeGlobal","global","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","hasOwnProperty","propertyIsEnumerable","functionToString","objectCtorString","call","symbolProto","Symbol","undefined","symbolValueOf","valueOf","symToStringTag","toStringTag","arrayProto","arrSlice","slice","MAX_SAFE_INTEGER","Number","MIN_SAFE_INTEGER","MAX_ARRAY_LENGTH","blobExisted","Blob","toSource","func","e","numberTag","booleanTag","stringTag","dateTag","regExpTag","symbolTag","errorTag","arrayBufferTag","argumentsTag","arrayTag","objectTag","dataViewTag","mapTag","promiseTag","setTag","weakMapTag","dataViewExisted","DataView","mapExisted","Map","promiseExisted","Promise","setExisted","Set","weakMapExisted","WeakMap","initSource","existed","str","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","isObject","type","_getTag","isOwn","tag","unmasked","result","getRawTag","getTag","ArrayBuffer","resolve","Ctor","constructor","ctorString","getTag$1","isType","nativeTypeString","some","item","isObjectLike","isSymbol","reIsBinary","reIsOctal","reIsBadHex","toNumber","NaN","trim","isBinary","test","parseInt","toInteger","Infinity","remainder","toLength","eq","other","strictCheck","createIteratee","iteratee","difference","array","values","internalIteratee","filter","current","findIndex","intersection","caches","includes","push","argType","supportedArgumentsType","arguments","FUNC_ERROR_TEXT","numberIsFinite","isFinite","numberIsInteger","isInteger","numberIsSafeInteger","isSafeInteger","objectGetOwnPropertySymbols","getOwnPropertySymbols","arrayAt","at","isFunction","isLength","isArrayLike","length","nth","n","MAX_VALUE","toFinite","randomInt","lower","upper","min","Math","ceil","max","floor","temp","random","uniq","strickCheck","index","arr","union","concat","isArrayLikeObject","unzip","group","map","identity","baseToString","compareAsc","valueIsSymbol","otherIsSymbol","valueStr","otherStr","compareDesc","orderBy","collection","iteratees","orders","forEach","criteria","sort","a","b","object","objCriteria","othCriteria","order","compareMultiple","defaultTo","defaultValue","before","TypeError","apply","this","baseDebounce","wait","immediate","__throttle__","timer","lastCallTime","lastInvokeTime","lastArgs","lastThis","invokeFunc","time","debounced","args","_i","Date","now","isInvoke","timeSinceLastCall","shouldInvoke","waitTime","clearTimeout","setTimeout","cancel","flush","pending","negate","predicate","_this","freeExports","exports","nodeType","freeModule","module","freeProcess","process","nodeUtil","types","require","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","isBuffer","Buffer","isPlainObject","proto","getPrototypeOf","keys","isPrototype","key","getSymbols","allKeys","isNil","mapToArray","setToArray","set","argToArray","arg","toBufferView","bufferSource","Uint8Array","buffer","byteOffset","byteLength","isDomNode","obj","nodeName","isEqualNode","isEqualDeep","customizer","valueStack","otherStack","valType","othType","convert","name","message","areArrays","hasCustomizer","compared","skipCtor","valCtor","othCtor","pop","isNumber","decimalAdjust","precision","pair","split","createOperation","comparator","baseGt","baseGte","baseLt","baseLte","gt","createExtremum","computed","lt","getKeysIn","allKeysIn","o","indexOf","getSymbolsIn","baseMerge","source","storage","srcValue","newValue","has","objValue","newObjValue","castArray","pickBy","reAsciiWord","words","string","pattern","match","splitCaseWords","replace","createCaseFirst","methodName","upperFirst","htmlEscapes","reUnescapedHtml","reHasUnescapedHtml","RegExp","reRegExpChar","reHasRegExpChar","htmlUnescapes","reEscapedHtml","reHasEscapedHtml","conformsTo","props","i","idCounter","reduce","prev","cur","toLowerCase","number","size","resIndex","internalIteratee_1","context","chr","start","end","Error","isNaN","then","abs","fields","fieldArr","remainingArgs","field","lastIndex","rand","ms","prefix","id","toUpperCase","arrays"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ut2.min.js","sources":["../src/isArray.ts","../src/internals/native.ts","../src/isObject.ts","../src/internals/getTag.ts","../src/internals/checkType.ts","../src/isSymbol.ts","../src/toNumber.ts","../src/toInteger.ts","../src/toLength.ts","../src/eq.ts","../src/internals/createIteratee.ts","../src/difference.ts","../src/intersection.ts","../src/internals/helpers.ts","../src/isFunction.ts","../src/isLength.ts","../src/isArrayLike.ts","../src/nth.ts","../src/toFinite.ts","../src/randomInt.ts","../src/uniq.ts","../src/union.ts","../src/isObjectLike.ts","../src/isArrayLikeObject.ts","../src/unzip.ts","../src/identity.ts","../src/toString.ts","../src/internals/compare.ts","../src/orderBy.ts","../src/defaultTo.ts","../src/before.ts","../src/internals/baseDebounce.ts","../src/negate.ts","../src/internals/nodeUtil.ts","../src/isBuffer.ts","../src/isPlainObject.ts","../src/internals/keys.ts","../src/internals/isPrototype.ts","../src/isMap.ts","../src/isSet.ts","../src/internals/getSymbols.ts","../src/allKeys.ts","../src/isNil.ts","../src/isTypedArray.ts","../src/isEqual.ts","../src/isFinite.ts","../src/isInteger.ts","../src/isMatch.ts","../src/isNumber.ts","../src/internals/decimalAdjust.ts","../src/internals/comparator.ts","../src/gt.ts","../src/internals/createExtremum.ts","../src/lt.ts","../src/internals/getKeysIn.ts","../src/allKeysIn.ts","../src/internals/getSymbolsIn.ts","../src/merge.ts","../src/castArray.ts","../src/pickBy.ts","../src/words.ts","../src/internals/splitCaseWords.ts","../src/internals/createCaseFirst.ts","../src/upperFirst.ts","../src/escape.ts","../src/escapeRegExp.ts","../src/unescape.ts","../src/conformsTo.ts","../src/uniqueId.ts","../src/after.ts","../src/camelCase.ts","../src/capitalize.ts","../src/ceil.ts","../src/chunk.ts","../src/clamp.ts","../src/compact.ts","../src/conforms.ts","../src/constant.ts","../src/countBy.ts","../src/debounce.ts","../src/delay.ts","../src/floor.ts","../src/fromPairs.ts","../src/groupBy.ts","../src/gte.ts","../src/inRange.ts","../src/isArguments.ts","../src/isArrayBuffer.ts","../src/isBlob.ts","../src/isBoolean.ts","../src/isDataView.ts","../src/isDate.ts","../src/isElement.ts","../src/isEmpty.ts","../src/isError.ts","../src/isNaN.ts","../src/isNull.ts","../src/isPromiseLike.ts","../src/isRegExp.ts","../src/isSafeInteger.ts","../src/isString.ts","../src/isUndefined.ts","../src/isWeakMap.ts","../src/isWeakSet.ts","../src/kebabCase.ts","../src/keyBy.ts","../src/keysIn.ts","../src/lowerCase.ts","../src/lowerFirst.ts","../src/lte.ts","../src/max.ts","../src/min.ts","../src/noop.ts","../src/nthArg.ts","../src/omit.ts","../src/omitBy.ts","../src/once.ts","../src/partial.ts","../src/partition.ts","../src/pick.ts","../src/random.ts","../src/round.ts","../src/shuffle.ts","../src/sleep.ts","../src/snakeCase.ts","../src/throttle.ts","../src/times.ts","../src/toSafeInteger.ts","../src/upperCase.ts","../src/xor.ts","../src/zip.ts"],"sourcesContent":["/**\n * 检查值是否为 `Array` 对象。\n *\n * @static\n * @alias module:Language.isArray\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `Array` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArray([1, 2, 3]); // true\n *\n * isArray(document.body.children); // true\n *\n * isArray('abc'); // false\n *\n * isArray(1); // false\n *\n * isArray(()=>{}); // false\n *\n */\nfunction isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\nexport default isArray;\n","const freeGlobalThis = typeof globalThis === 'object' && globalThis && globalThis.Object === Object && globalThis;\nconst freeGlobal = typeof global === 'object' && global && global.Object === Object && global;\nconst freeSelf = typeof self === 'object' && self && self.Object === Object && self;\n\nexport const root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')() || {};\n\nexport const objectProto = Object.prototype;\n\nexport const objectToString = objectProto.toString;\n\nexport const hasOwnProperty = objectProto.hasOwnProperty;\n\nexport const propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\nexport const functionToString = Function.prototype.toString;\n\nexport const objectCtorString = functionToString.call(Object);\n\nexport const symbolProto = Symbol ? Symbol.prototype : undefined;\nexport const symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\nexport const symbolToString = symbolProto ? symbolProto.toString : undefined;\nexport const symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nexport const arrayProto = Array.prototype;\nexport const arrSlice = Array.prototype.slice;\n\n/**\n * 最大安全整数。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER | MAX_SAFE_INTEGER}\n */\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n/**\n * 最小安全整数。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER | MIN_SAFE_INTEGER}\n */\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n\n/**\n * 最大数组长度 `Math.pow(2,32) - 1` 。\n *\n * @static\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/length | length}\n */\nexport const MAX_ARRAY_LENGTH = 4294967295;\n\n// Blob 对象是否存在\nexport const blobExisted = typeof Blob !== 'undefined';\n\nexport function toSource(func: any) {\n if (func !== null) {\n try {\n return functionToString.call(func);\n } catch (e) {\n /* empty */\n }\n try {\n return func + '';\n } catch (e) {\n /* empty */\n }\n }\n return '';\n}\n\nfunction wrapTags(tags: string[]) {\n return tags.map((item) => '[object ' + item + ']');\n}\n\nexport const numberTag = '[object Number]';\nexport const booleanTag = '[object Boolean]';\nexport const stringTag = '[object String]';\nexport const dateTag = '[object Date]';\nexport const regExpTag = '[object RegExp]';\nexport const symbolTag = '[object Symbol]';\nexport const errorTag = '[object Error]';\nexport const arrayBufferTag = '[object ArrayBuffer]';\nexport const argumentsTag = '[object Arguments]';\nexport const arrayTag = '[object Array]';\nexport const typedArrayTags = wrapTags(['Float32Array', 'Float64Array', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'BigInt64Array', 'BigUint64Array']);\nexport const functionTags = wrapTags(['Function', 'AsyncFunction', 'GeneratorFunction', 'Proxy']);\nexport const weakSetTag = '[object WeakSet]';\nexport const blobTag = '[object Blob]';\nexport const fileTag = '[object Blob]';\nexport const domExceptionTag = '[object DOMException]';\n\nexport const objectTag = '[object Object]';\nexport const dataViewTag = '[object DataView]';\nexport const mapTag = '[object Map]';\nexport const promiseTag = '[object Promise]';\nexport const setTag = '[object Set]';\nexport const weakMapTag = '[object WeakMap]';\n\nexport const dataViewExisted = typeof DataView !== 'undefined';\nexport const mapExisted = typeof Map !== 'undefined';\nexport const promiseExisted = typeof Promise !== 'undefined';\nexport const setExisted = typeof Set !== 'undefined';\nexport const weakMapExisted = typeof WeakMap !== 'undefined';\n\nexport const initSource = (existed: boolean, str: string) => (existed ? str : '');\n\nexport const dataViewCtorString = initSource(dataViewExisted, toSource(DataView));\nexport const mapCtorString = initSource(mapExisted, toSource(Map));\nexport const promiseCtorString = initSource(promiseExisted, toSource(Promise));\nexport const setCtorString = initSource(setExisted, toSource(Set));\nexport const weakMapCtorString = initSource(weakMapExisted, toSource(WeakMap));\n","/**\n * 检查值是否为对象。(例如,数组、函数、对象、正则表达式、new Number(0) 和 new String(''))。\n *\n * @static\n * @alias module:Language.isObject\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/#sec-ecmascript-language-types | language type}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isObject({}); // true\n *\n * isObject([1,2,3]); // true\n *\n * isObject(()=>{}); // true\n *\n * isObject(null); // false\n *\n */\nfunction isObject(value: any) {\n const type = typeof value;\n return value != null && (type === 'object' || type === 'function');\n}\n\nexport default isObject;\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n hasOwnProperty,\n objectToString,\n toSource,\n objectTag,\n dataViewTag,\n mapTag,\n promiseTag,\n setTag,\n weakMapTag,\n dataViewExisted,\n mapExisted,\n promiseExisted,\n setExisted,\n weakMapExisted,\n dataViewCtorString,\n mapCtorString,\n promiseCtorString,\n setCtorString,\n weakMapCtorString,\n symToStringTag\n} from './native';\n\n/**\n * 获取值的 `Object.prototype.toString` ,并且忽略 `Symbol.toStringTag` 影响。\n *\n * @private\n * @param value 要查询的值\n * @returns 对象名称\n */\nfunction getRawTag(value: any) {\n const isOwn = hasOwnProperty.call(value, symToStringTag!);\n const tag = value[symToStringTag!];\n let unmasked = false;\n\n try {\n value[symToStringTag!] = undefined;\n unmasked = true;\n } catch (e) {\n /* empty */\n }\n\n const result = objectToString.call(value);\n\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag!] = tag;\n } else {\n delete value[symToStringTag!];\n }\n }\n return result;\n}\n\n/**\n * 获取值的 `Object.prototype.toString` ,忽略 `Symbol.toStringTag` 影响。\n *\n * @private\n * @param value 要查询的值\n * @returns 对象名称\n */\nfunction _getTag(value: any) {\n return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString.call(value);\n}\n\nlet getTag = _getTag;\n\n// 以下数据类型执行 `Object.prototype.toString` 返回错误结果 `[object Object]`:\n// ie11 的 DataView、Map、Set、WeakMap ,node.js 版本 < 6 的 Promise 。\nif (\n (dataViewExisted && objectToString.call(new DataView(new ArrayBuffer(1))) !== dataViewTag) ||\n (mapExisted && objectToString.call(new Map()) !== mapTag) ||\n (promiseExisted && objectToString.call(Promise.resolve()) !== promiseTag) ||\n (setExisted && objectToString.call(new Set()) !== setTag) ||\n (weakMapExisted && objectToString.call(new WeakMap()) !== weakMapTag)\n) {\n getTag = function (value: any) {\n const result = _getTag(value);\n const Ctor = result === objectTag ? value.constructor : undefined;\n const ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString:\n return dataViewTag;\n case mapCtorString:\n return mapTag;\n case promiseCtorString:\n return promiseTag;\n case setCtorString:\n return setTag;\n case weakMapCtorString:\n return weakMapTag;\n }\n }\n\n return result;\n };\n}\n\nexport default getTag;\n","import getTag from './getTag';\n\n// 检测值的 `Object.prototype.toString` 类型。\nexport function checkType(value: any, tag: string) {\n return getTag(value) === tag;\n}\n\n// 检测值的 `Object.prototype.toString` 符合类型之一。\nexport function checkTypes(value: any, tags: string[]) {\n const tag = getTag(value);\n return tags.some((item) => tag === item);\n}\n","import { checkType } from './internals/checkType';\nimport { symbolTag } from './internals/native';\n\n/**\n * 检查值是否为 `Symbol` 类型或对象。\n *\n * @static\n * @alias module:Language.isSymbol\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Symbol` 类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSymbol(Symbol()); // true\n *\n * isSymbol(Symbol.iterator); // true\n *\n * isSymbol(\"abc\"); // false\n *\n */\nfunction isSymbol(value: any) {\n return typeof value === 'symbol' || checkType(value, symbolTag);\n}\n\nexport default isSymbol;\n","import isObject from './isObject';\nimport isSymbol from './isSymbol';\n\nconst reIsBinary = /^0b[01]+$/i;\n\nconst reIsOctal = /^0o[0-7]+$/i;\n\n// Number('-0x1a2b3c') // NaN\n// parseInt('-0x1a2b3c') // -1715004\n// 统一处理为 NaN\nconst reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/**\n * 转换 `value` 为数字。\n *\n * @static\n * @alias module:Util.toNumber\n * @since 1.0.0\n * @param {*} value 要处理的值。\n * @returns {number} 转换后的数字。\n * @example\n *\n * toNumber(3.2); // 3.2\n *\n * toNumber('3.2'); // 3.2\n *\n * toNumber(-0); // -0\n *\n * toNumber('-0'); // -0\n *\n * toNumber('0'); // 0\n *\n * toNumber(NaN); // NaN\n *\n * toNumber(Infinity); // Infinity\n *\n * toNumber(-Infinity); // -Infinity\n *\n */\nfunction toNumber(value: any): number {\n if (typeof value === 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NaN;\n }\n if (isObject(value)) {\n value = Number(value);\n }\n if (typeof value !== 'string') {\n return value === 0 ? value : +value;\n }\n value = value.trim();\n const isBinary = reIsBinary.test(value);\n\n return isBinary || reIsOctal.test(value)\n ? parseInt(value.slice(2), isBinary ? 2 : 8)\n : reIsBadHex.test(value)\n ? NaN\n : +value;\n}\n\nexport default toNumber;\n","import toNumber from './toNumber';\n\n/**\n * 转换 `value` 为一个整数。\n *\n * 注意: 这个方法基于 [ToIntegerOrInfinity](https://tc39.es/ecma262/#sec-tointegerorinfinity) ,区别在于 `-0` 会返回 `-0` 。\n *\n * @static\n * @alias module:Util.toInteger\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toInteger(3.2); // 3\n *\n * toInteger('3.2'); // 3\n *\n * toInteger(-0); // -0\n *\n * toInteger('-0'); // -0\n *\n * toInteger('0'); // 0\n *\n * toInteger(NaN); // 0\n *\n * toInteger(Infinity); // Infinity\n *\n * toInteger(-Infinity); // -Infinity\n *\n */\nfunction toInteger(value: any) {\n const result = toNumber(value);\n\n // NaN -0 +0 0 Infinity -Infinity\n if (!result || result === Infinity || result === -Infinity) {\n return result === result ? result : 0;\n }\n const remainder = result % 1;\n return remainder ? result - remainder : result;\n}\n\nexport default toInteger;\n","import { MAX_ARRAY_LENGTH } from './internals/native';\nimport toInteger from './toInteger';\n\n/**\n * 转换 `value` 为数组对象的长度整数。\n *\n * @static\n * @alias module:Util.toLength\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/length | length}\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toLength(3.2); // 3\n *\n * toLength('3.2'); // 3\n *\n * toLength(-0); // 0\n *\n * toLength('-0'); // 0\n *\n * toLength('0'); // 0\n *\n * toLength(NaN); // 0\n *\n * toLength(Infinity); // 4294967295\n *\n * toLength(-Infinity); // 0\n *\n */\nfunction toLength(value: any): number {\n value = toInteger(value);\n if (!value) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > MAX_ARRAY_LENGTH) {\n return MAX_ARRAY_LENGTH;\n }\n return value;\n}\n\nexport default toLength;\n","/**\n * 检查两个值是否相等。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Util.eq\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness | JavaScript 中的相等性判断}\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {boolean} 如果两个值相等,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * eq(-0, 0); // true\n *\n * eq(1, 1); // true\n *\n * eq(NaN, NaN); // true\n *\n * eq('a', 'a'); // true\n *\n * const object = {a: 1};\n *\n * eq(object, {a: 1}); // false\n *\n * eq(object, object); // true\n *\n * eq(-0, 0, true); // false\n *\n */\nfunction eq(value: any, other: any, strictCheck = false) {\n if (value === other) {\n return strictCheck ? value !== 0 || 1 / value === 1 / other : true;\n }\n return value !== value && other !== other;\n}\n\nexport default eq;\n","import isSymbol from '../isSymbol';\n\n/**\n * 创建迭代函数。\n *\n * @private\n * @param {Function} iteratee 迭代函数或对象属性。\n * @returns {Function} 如果参数为函数,返回该函数,否则包装一个返回对象属性的函数。\n */\nfunction createIteratee<T, F extends (value: T) => any, K extends keyof T>(iteratee?: F | K) {\n if (typeof iteratee === 'function') {\n return iteratee;\n }\n // 属性键值可能为 Symbol, string, number\n if (typeof iteratee === 'string' || typeof iteratee === 'number' || isSymbol(iteratee)) {\n return (value: any) => value[iteratee];\n }\n return (value: any) => value;\n}\n\nexport default createIteratee;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个 `array` 排除 `values` 值的新数组。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.difference\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} values 排除的值。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 过滤值后的新数组。\n * @example\n *\n * difference([3, 1, 2], [4, 2]); // [3, 1]\n *\n * difference([3.1, 2.2, 1.3], [4.4, 2.5], Math.floor); // [3.1, 1.3]\n *\n * difference([{x: 2}, {x: 1}], [{x: 1}], item=>item.x); // [{x: 2}]\n *\n * // 如果迭代元素为对象,迭代函数可以直接写入对象属性。\n * difference([{x: 2}, {x: 1}], [{x: 1}], 'x'); // [{x: 2}]\n *\n * difference([-0, 0], [0]); // []\n *\n * difference([-0, 0], [0], undefined, true); // [-0]\n *\n */\nfunction difference<T, F extends (value: T) => any, K extends keyof T>(array: T[], values: any[], iteratee?: F | K, strictCheck = false) {\n if (!isArray(array)) {\n return [];\n }\n\n if (!isArray(values)) {\n return array;\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n return array.filter((item) => {\n const current = internalIteratee(item);\n // 注意此处不能使用 `find` ,如果值存在 `undefined` 不好处理。\n // 为什么不直接使用 `includes` (includes 比较用的是 sameValueZero),因为要支持 iteratee 。\n return values.findIndex((value) => eq(internalIteratee(value), current, strictCheck)) === -1;\n });\n}\n\nexport default difference;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建唯一值的数组,该数组包含 2 个数组参数都包含的元素(交集)。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.intersection\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} other 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 包含所有传入数组交集元素的新数组。\n * @example\n *\n * intersection([2, 1, 1], [4, 2]); // [2]\n *\n * intersection([2.1, 1.2], [4.3, 2.4], Math.floor); // [2.1]\n *\n * intersection([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 1}]\n *\n * // 迭代函数可以直接写入属性。\n * intersection([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 1}]\n *\n * intersection([-0, 0], [0]); // [-0]\n *\n * intersection([-0, 0], [0], undefined, true); // [0]\n *\n */\nfunction intersection<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[], iteratee?: F | K, strictCheck = false) {\n if (!isArray(array) || !isArray(other)) {\n return [];\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n const caches: any[] = [];\n return array.filter((item) => {\n const current = internalIteratee(item);\n\n if (other.findIndex((value) => eq(internalIteratee(value), current, strictCheck)) !== -1 && !caches.includes(current)) {\n caches.push(current);\n return true;\n }\n return false;\n });\n}\n\nexport default intersection;\n","// 主要是为了便于一些方法测试,比如一些方法要检测是否存在。\n\nimport { checkType } from './checkType';\nimport { argumentsTag, arrayProto } from './native';\n\nexport const argType = 'Arguments';\n\n// @ts-ignore\nexport const supportedArgumentsType = checkType((() => arguments)(), argumentsTag);\n\nexport const FUNC_ERROR_TEXT = 'Expected a function';\n\nexport const numberIsFinite = Number.isFinite;\nexport const numberIsInteger = Number.isInteger;\nexport const numberIsSafeInteger = Number.isSafeInteger;\n\nexport const objectGetOwnPropertySymbols = Object.getOwnPropertySymbols;\n\nexport const arrayAt = arrayProto.at;\n\n/**\n * ut2 版本号。\n *\n * @static\n * @since 1.0.0\n */\nexport const VERSION = BUILD_VERSION;\n","import { checkTypes } from './internals/checkType';\nimport { functionTags } from './internals/native';\nimport isObject from './isObject';\n\n/**\n * 检查值是否为 `Function` 对象 。\n *\n * `Function` `AsyncFunction` `GeneratorFunction` `Proxy` 都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isFunction\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Function` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isFunction(()=>{})); // true\n *\n * isFunction(/x/); // false\n *\n */\nfunction isFunction(value: any) {\n if (!isObject(value)) {\n return false;\n }\n return checkTypes(value, functionTags);\n}\n\nexport default isFunction;\n","import { MAX_SAFE_INTEGER } from './internals/native';\n\n/**\n * 检查值是否为有效的类数组长度。\n *\n * @static\n * @alias module:Language.isLength\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/#sec-tolength | ToLength}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为有效的类数组长度,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isLength(3); // true\n *\n * isLength('3'); // false\n *\n * isLength(Number.Min_VALUE); // false\n *\n * isLength(Number.Infinity); // false\n *\n */\nfunction isLength(value: any): value is number {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction';\nimport isLength from './isLength';\n\n/**\n * 检查值是否为类数组。\n *\n * 如果一个值不是函数并且其 `value.length` 是大于或等于 `0` 且小于或等于 `Number.MAX_SAFE_INTEGER` 的整数,则该值被视为类数组。\n *\n * @static\n * @alias module:Language.isArrayLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类数组,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayLike([1, 2, 3]); // true\n *\n * isArrayLike(document.body.children); // true\n *\n * isArrayLike('abc'); // true\n *\n * isArrayLike(()=>{}); // false\n *\n */\nfunction isArrayLike(value: any) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import { arrayAt } from './internals/helpers';\nimport isArrayLike from './isArrayLike';\n\n/**\n * 获取数组的第 `n` 个元素。如果 `n` 为负数,则返回从数组结尾开始的第 `n` 个元素。\n *\n * 同 `Array.prototype.at` 方法。\n *\n * @static\n * @alias module:Array.nth\n * @since 1.0.0\n * @param {Array} array 要查询的数组。\n * @param {number} [n=0] 要返回元素的索引值。\n * @returns {*} 数组的第 `n` 个元素。\n * @example\n *\n * const arr = ['a', 'b', 'c', 'd'];\n *\n * nth(arr, 1); // 'b'\n *\n * nth(arr, -2); // 'c'\n *\n */\nfunction nth<T = any>(array: T[], n = 0): T {\n if (!isArrayLike(array)) {\n return undefined as any;\n }\n\n if (typeof arrayAt === 'function') {\n return arrayAt.call(array, n);\n }\n const index = n < 0 ? n + array.length : n;\n return array[index];\n}\n\nexport default nth;\n","import toNumber from './toNumber';\n\nconst MAX_VALUE = 1.7976931348623157e308;\n\n/**\n * 转换 `value` 为一个有限数字。\n *\n * @static\n * @alias module:Util.toFinite\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的数字。\n * @example\n *\n * toFinite(3.2); // 3.2\n *\n * toFinite('3.2'); // 3.2\n *\n * toFinite(-0); // -0\n *\n * toFinite('-0'); // -0\n *\n * toFinite('0'); // 0\n *\n * toFinite(NaN); // 0\n *\n * toFinite(Infinity); // 1.7976931348623157e+308\n *\n * toFinite(-Infinity); // -1.7976931348623157e+308\n *\n */\nfunction toFinite(value: any): number {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === Infinity || value === -Infinity) {\n const sign = value < 0 ? -1 : 1;\n return sign * MAX_VALUE;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite';\n\n/**\n * 产生一个包含 `lower` 与 `upper` 之间的随机整数。\n *\n * 如果参数非整数 `lower=Math.ceil(lower)` `upper=Math.floor(upper)` 。如果 `lower` 大于 `upper` 会自动交换参数。\n *\n * @static\n * @alias module:Number.randomInt\n * @since 1.0.0\n * @param {number} [lower=0] 下限。\n * @param {number} [upper=1] 上限。\n * @returns {number} 随机整数。\n * @example\n *\n * randomInt(); // 0 到 1 之间的整数\n *\n * randomInt(2, 4); // 2 到 4 之间的整数\n *\n * randomInt(4, 2); // 2 到 4 之间的整数\n *\n * randomInt(1.2, 2.4); // 2\n *\n */\nfunction randomInt(lower = 0, upper = 1) {\n lower = toFinite(lower);\n upper = toFinite(upper);\n let min = Math.ceil(Math.min(lower, upper) || 0);\n let max = Math.floor(Math.max(lower, upper) || 0);\n\n // 如果两个值都是整数位相同,浮点数不同, 大小值的可能会互换。(如 1.2, 1.3)\n if (min > max) {\n // [min, max] = [max, min]\n const temp = min;\n min = max;\n max = temp;\n }\n\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nexport default randomInt;\n","import eq from './eq';\nimport createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个去重后的数组副本。只有第一次出现的元素才会被保留。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.uniq\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 去重后的新数组。\n * @example\n *\n * uniq([2, 1, 2]); // [2, 1]\n *\n * uniq(['a', NaN, 2, 1, NaN, 'a', 1]); // ['a', NaN, 2, 1]\n *\n * uniq([{x: 1}, {x: 2}, {x: 1}], item=>item.x); // [{x: 1}, {x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * uniq([{x: 1}, {x: 2}, {x: 1}], 'x'); // [{x: 1}, {x: 2}]\n *\n * uniq([-0, 0]); // [-0]\n *\n * uniq([-0, 0], undefined, true); // [-0, 0]\n *\n */\nfunction uniq<T, F extends (value: T) => any, K extends keyof T>(array: T[], iteratee?: F | K, strickCheck = false) {\n if (!isArray(array)) {\n return [];\n }\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n return array.filter((value, index, arr) => {\n const current = internalIteratee(value);\n return arr.findIndex((item) => eq(internalIteratee(item), current, strickCheck)) === index;\n });\n}\n\nexport default uniq;\n","import isArray from './isArray';\nimport uniq from './uniq';\n\n/**\n * 创建一个按顺序排列的唯一值的数组(并集)。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。与 [`uniq`](#.uniq) 相似。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.union\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} [other=[]] 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 新的联合数组。\n * @example\n *\n * union([2], [1, 2]); // [2, 1]\n *\n * union([2.1], [1.2, 2.3], Math.floor); // [2.1, 1.2]\n *\n * union([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 1}, {x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * union([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 1}, {x: 2}]\n *\n * union([-0, 0], [-0]); // [-0]\n *\n * union([-0, 0], [-0], undefined, true); // [-0, 0]\n *\n */\nfunction union<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[] = [], iteratee?: F | K, strickCheck = false) {\n array = isArray(array) ? array : [];\n other = isArray(other) ? other : [];\n return uniq(array.concat(other), iteratee, strickCheck);\n}\n\nexport default union;\n","/**\n * 检查值是否为类对象。\n *\n * 如果一个值不为 `null` 并且 `typeof` 结果为 `object`,则该值是类对象。\n *\n * @static\n * @alias module:Language.isObjectLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isObjectLike({}); // true\n *\n * isObjectLike([1,2,3]); // true\n *\n * isObjectLike(()=>{}); // false\n *\n * isObjectLike(null); // false\n *\n */\nfunction isObjectLike(value: any) {\n return value != null && typeof value === 'object';\n}\n\nexport default isObjectLike;\n","import isArrayLike from './isArrayLike';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为类数组对象。\n *\n * @static\n * @alias module:Language.isArrayLikeObject\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为类数组对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayLikeObject([1, 2, 3]); // true\n *\n * isArrayLikeObject(document.body.children); // true\n *\n * isArrayLikeObject('abc'); // false\n *\n * isArrayLikeObject(()=>{}); // false\n *\n */\nfunction isArrayLikeObject(value: any) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import isArray from './isArray';\nimport isArrayLikeObject from './isArrayLikeObject';\n\n/**\n * 与 [`zip`](#.zip) 类似,除了它接受分组元素的数组,并且创建一个数组,分组元素到打包前的结构。(返回数组的第一个元素包含所有的输入数组的第一元素,第二个元素包含了所有的输入数组的第二元素,依此类推。)。\n *\n * @static\n * @alias module:Array.unzip\n * @since 1.0.0\n * @param {Array} array 要处理的分组元素数组。\n * @returns {Array} 重组元素的新数组。\n * @example\n *\n * unzip([['barney', 'fred'], [36, 40]]); // [['barney', 36], ['fred', 40]]\n *\n * unzip([['barney', 36], ['fred', 40]]); // [['barney', 'fred'], [36, 40]]\n *\n */\nfunction unzip(array: any[][]) {\n if (!isArray(array) || array.length === 0) {\n return [];\n }\n let length = 0;\n array = array.filter((group) => {\n if (isArrayLikeObject(group)) {\n length = Math.max(group.length, length);\n return true;\n }\n return false;\n });\n const result = Array(length);\n let index = -1;\n while (++index < length) {\n const item = array.map((group) => group[index]);\n result[index] = item;\n }\n return result;\n}\n\nexport default unzip;\n","/**\n * 返回第一个参数。\n *\n * @static\n * @alias module:Util.identity\n * @since 1.0.0\n * @param {*} value 任意值。\n * @returns 返回 `value` 。\n * @example\n *\n * const obj = { a: 1, b: 2 };\n *\n * console.log(identity(obj, 1) === obj); // true\n *\n */\n\nfunction identity<T>(value?: T): T;\nfunction identity<T>(value: T, ...args: any[]): T;\nfunction identity<T>(value?: T) {\n return value;\n}\n\nexport default identity;\n","import isArray from './isArray';\nimport isSymbol from './isSymbol';\n\nfunction baseToString(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n if (isArray(value)) {\n return `${value.map(baseToString)}`;\n }\n if (isSymbol(value)) {\n return value.toString();\n }\n const result = '' + value;\n return result == '0' && 1 / value === -Infinity ? '-0' : result;\n}\n\n/**\n * 转换 `value` 为字符串。`null` 和 `undefined` 将返回空字符串。`-0` 将被转换为 `\"-0\"` 。\n *\n * @static\n * @alias module:Util.toString\n * @since 1.0.0\n * @param {*} value 要处理的值。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * toString(null); // ''\n *\n * toString(-0); // '-0'\n *\n * // 数组中的 `null` `undefined` 返回 'null' 'undefined'\n * toString([undefined, null]); // 'undefined,null'\n *\n * toString('a'); // 'a'\n *\n * toString(3); // '3'\n *\n */\nfunction toString(value: any) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isSymbol from '../isSymbol';\nimport toString from '../toString';\n\nexport function compareAsc(value: any, other: any) {\n const valueIsSymbol = isSymbol(value);\n const otherIsSymbol = isSymbol(other);\n const valueStr = toString(value);\n const otherStr = toString(other);\n\n if (!otherIsSymbol && (valueIsSymbol || valueStr > otherStr)) {\n return 1;\n }\n if (!valueIsSymbol && (otherIsSymbol || valueStr < otherStr)) {\n return -1;\n }\n return 0;\n}\n\nexport function compareDesc(value: any, other: any) {\n const valueIsSymbol = isSymbol(value);\n const otherIsSymbol = isSymbol(other);\n const valueStr = toString(value);\n const otherStr = toString(other);\n\n if (!otherIsSymbol && (valueIsSymbol || valueStr > otherStr)) {\n return -1;\n }\n if (!valueIsSymbol && (otherIsSymbol || valueStr < otherStr)) {\n return 1;\n }\n return 0;\n}\n\nexport type OrderData<T> = {\n criteria: any[];\n index: number;\n value: T;\n};\nexport type Order = 'asc' | 'desc' | ((a: any, b: any) => number);\n\nexport function compareMultiple<T>(object: OrderData<T>, other: OrderData<T>, orders: Order[]) {\n const objCriteria = object.criteria;\n const othCriteria = other.criteria;\n const length = objCriteria.length;\n let index = -1;\n\n while (++index < length) {\n const order = orders[index];\n const cmpFn = typeof order === 'function' ? order : order === 'desc' ? compareDesc : compareAsc;\n const result = cmpFn(objCriteria[index], othCriteria[index]);\n if (result) {\n return result;\n }\n }\n\n return object.index - other.index;\n}\n","import identity from './identity';\nimport createIteratee from './internals/createIteratee';\nimport { compareMultiple, Order, OrderData } from './internals/compare';\nimport isArray from './isArray';\n\n/**\n * 创建一个元素数组,以迭代函数处理的结果排序。如果没有指定排序,默认为升序排序。\n *\n * `asc` 升序, `desc` 降序,默认执行稳定排序,也就是说相同元素会保持原始排序。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.orderBy\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort | sort}\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string | Array} [iteratees] 排序的迭代函数。\n * @param {'asc' | 'desc' | Array} [orders] 迭代函数的排序顺序。\n * @returns {Array} 排序后的新数组。\n * @example\n *\n * const array = [2, 1, 3, 5, 4];\n *\n * orderBy(array);; // [1, 2, 3, 4, 5]\n *\n * orderBy(array, item=>item, 'desc');; // [5, 4, 3, 2, 1]\n *\n * const objects = [\n * { a: 'x', b: 3 },\n * { a: 'y', b: 4 },\n * { a: 'x', b: 1 },\n * { a: 'y', b: 2 }\n * ];\n *\n * orderBy(objects, 'b');\n * // [{ a: 'x', b: 1 },{ a: 'y', b: 2 },{ a: 'x', b: 3 },{ a: 'y', b: 4 }]\n *\n * // 迭代函数可以直接写入属性。\n * orderBy(objects, ['a', 'b'], ['asc', 'desc']);\n * // [{ a: 'x', b: 3 },{ a: 'x', b: 1 },{ a: 'y', b: 4 },{ a: 'y', b: 2 }]\n *\n */\nfunction orderBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratees?: F | K | (F | K)[], orders?: Order | Order[]) {\n const result: OrderData<T>[] = [];\n\n iteratees = (isArray(iteratees) ? iteratees : iteratees !== undefined ? [iteratees] : [identity]) as (F | K)[];\n orders = (isArray(orders) ? orders : orders !== undefined ? [orders] : []) as ('asc' | 'desc')[];\n\n if (isArray(collection)) {\n collection.forEach((item, index) => {\n const criteria = (iteratees as (F | K)[]).map((iteratee) => createIteratee<T, F, K>(iteratee)(item));\n result.push({\n criteria,\n index,\n value: item\n });\n });\n }\n\n return result.sort((a, b) => compareMultiple<T>(a, b, orders as Order[])).map((item) => item.value);\n}\n\nexport default orderBy;\n","/**\n * 检查值以确定是否应在其位置返回默认值。如果值为 `NaN` `null` 或 `undefined` ,返回 `defaultValue` 。\n *\n * @static\n * @alias module:Util.defaultTo\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @param {*} defaultValue 默认值。\n * @returns {*} 如果值为 `NaN` `null` 或 `undefined` ,返回 `defaultValue` ,否则返回 `value` 。\n * @example\n *\n * defaultTo(undefined, 1); // 1\n *\n * defaultTo(10, 1); // 10\n *\n * defaultTo(null, undefined); // undefined\n *\n */\n\nfunction defaultTo<T>(value: T | null | undefined, defaultValue: T): T;\nfunction defaultTo<T, D>(value: T | null | undefined, defaultValue: D): T | D;\nfunction defaultTo<T, D>(value: T, defaultValue: D) {\n return value == null || value !== value ? defaultValue : value;\n}\n\nexport default defaultTo;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 创建一个调用 `func` 的函数,调用次数少于 `n` 次。之后再调用这个函数,将返回最后一次调用 `func` 的结果。\n *\n * @static\n * @alias module:Function.before\n * @since 1.0.0\n * @param {number} n 不再调用 `func` 的次数。\n * @param {Function} func 限制执行的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * let count = 0;\n *\n * const increment = before(3, () => {\n * return ++count;\n * });\n *\n * increment(); // 1\n * increment(); // 2\n * increment(); // 2 返回之前的结果\n *\n */\nfunction before<T extends (...args: any[]) => any>(n: number, func: T) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n let result: ReturnType<T>;\n n = defaultTo(toNumber(n), 0);\n return function () {\n if (--n > 0) {\n // @ts-ignore\n // eslint-disable-next-line prefer-rest-params\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n // @ts-ignore\n func = undefined;\n }\n return result;\n } as T;\n}\n\nexport default before;\n","import defaultTo from '../defaultTo';\nimport toNumber from '../toNumber';\nimport { FUNC_ERROR_TEXT } from './helpers';\n\nfunction baseDebounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n immediate: boolean,\n __throttle__ = false\n) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n let timer: any,\n lastCallTime: number | undefined,\n lastInvokeTime: number,\n lastArgs: any[] | undefined,\n lastThis: any,\n result: ReturnType<T>;\n\n wait = defaultTo(toNumber(wait), 0);\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined) {\n return true;\n }\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n return (\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (__throttle__ && timeSinceLastInvoke >= wait)\n );\n }\n\n function invokeFunc(time: number) {\n lastInvokeTime = time;\n result = func.apply(lastThis, lastArgs as any[]);\n lastThis = lastArgs = undefined;\n return result;\n }\n\n function debounced(this: any, ...args: Parameters<T>) {\n lastThis = this;\n lastArgs = args;\n\n const time = Date.now();\n const isInvoke = shouldInvoke(time); // 是否可以立即调用\n\n const waitTime = !__throttle__\n ? wait\n : !isInvoke && lastCallTime !== undefined && timer === undefined\n ? wait - (time - lastCallTime)\n : wait;\n\n lastCallTime = time;\n\n if (isInvoke) {\n // 立即调用,且没有定时器\n if (immediate && timer === undefined) {\n return invokeFunc(time);\n }\n }\n\n // 如果已有定时器,且不是节流方式,清除并重新启动定时器\n if (timer !== undefined && !__throttle__) {\n clearTimeout(timer);\n timer = undefined;\n }\n\n if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n invokeFunc(Date.now());\n }, waitTime);\n }\n\n return result;\n }\n\n function cancel() {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastCallTime = timer = lastArgs = lastThis = undefined;\n }\n\n function flush() {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n\n if (lastArgs) {\n return invokeFunc(Date.now());\n }\n }\n return result;\n }\n\n function pending() {\n return timer !== undefined;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n debounced.pending = pending;\n\n return debounced;\n}\n\nexport default baseDebounce;\n","import { FUNC_ERROR_TEXT } from './internals/helpers';\n\n/**\n * 创建一个断言函数结果取反的函数。\n *\n * @static\n * @alias module:Function.negate\n * @since 1.0.0\n * @param {function} predicate 需要对结果取反的函数。\n * @returns 新的取反函数。\n * @example\n *\n * function isEven(num){\n * return num % 2 === 0;\n * }\n *\n * const nums = [1,2,3,4,5];\n * nums.filter(isEvent); // [2, 4]\n *\n * const ne = negate(isEvent);\n * nums.filter(ne); // [1, 3, 5]\n *\n */\nfunction negate<T extends (...args: any[]) => any>(this: any, predicate: T) {\n if (typeof predicate !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n return (...args: Parameters<T>) => {\n return !predicate.apply(this, args);\n };\n}\n\nexport default negate;\n","import { root } from './native';\n\n// `exports`\nconst freeExports = typeof exports === 'object' && exports && !exports.nodeType && exports;\n\n// @ts-ignore\n// `module`\nconst freeModule = freeExports && typeof module === 'object' && module && !module.nodeType && module;\n\n// `module.exports`\nconst moduleExports = freeModule && freeModule.exports === freeExports;\n\n// `process` from Node.js\nconst freeProcess = moduleExports && root.process;\n\nconst nodeUtil = (function () {\n try {\n const types = freeModule && freeModule.require && freeModule.require('util').types;\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {\n /* empty */\n }\n})();\n\ntype CheckTypeMethod = undefined | ((value: any) => boolean);\n\nexport const nodeIsArrayBuffer: CheckTypeMethod = nodeUtil && nodeUtil.isArrayBuffer;\nexport const nodeIsDate: CheckTypeMethod = nodeUtil && nodeUtil.isDate;\nexport const nodeIsMap: CheckTypeMethod = nodeUtil && nodeUtil.isMap;\nexport const nodeIsRegExp: CheckTypeMethod = nodeUtil && nodeUtil.isRegExp;\nexport const nodeIsSet: CheckTypeMethod = nodeUtil && nodeUtil.isSet;\nexport const nodeIsTypedArray: CheckTypeMethod = nodeUtil && nodeUtil.isTypedArray;\n","/**\n * 检查值是否为 `buffer` 。\n *\n * 非 Node.js 环境,始终返回 `false` 。\n *\n * @static\n * @alias module:Language.isBuffer\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `buffer` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isBuffer(Buffer.alloc(2)); // true\n *\n * isBuffer({}); // false\n *\n * isBuffer('2012'); // false\n *\n */\nfunction isBuffer(value: any): value is Buffer {\n if (typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function') {\n return Buffer.isBuffer(value);\n }\n return false;\n}\n\nexport default isBuffer;\n","import { functionToString, hasOwnProperty, objectCtorString, objectTag } from './internals/native';\nimport { checkType } from './internals/checkType';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为普通对象,即由 `Object` 构造函数创建或 `[[Prototype]]` 为 `null` 的对象。\n *\n * @static\n * @alias module:Language.isPlainObject\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为普通对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * }\n *\n * isPlainObject(new Foo); // false\n *\n * isPlainObject([1,2,3]); // false\n *\n * isPlainObject({ a: 1, b: 2 }); // true\n *\n * isPlainObject(Object.create(null)); // true\n *\n */\nfunction isPlainObject(value: any) {\n if (!isObjectLike(value) || !checkType(value, objectTag)) {\n return false;\n }\n const proto = Object.getPrototypeOf(Object(value));\n\n // Object.create(null)\n if (proto === null) {\n return true;\n }\n\n const Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n // 这里如果直接比较 proto.constructor === Object ,iframe 嵌套会导致结果不准确。\n return typeof Ctor === 'function' && Ctor instanceof Ctor && functionToString.call(Ctor) === objectCtorString;\n}\n\nexport default isPlainObject;\n","import isPrototype from './isPrototype';\nimport { hasOwnProperty } from './native';\n\n/**\n * 获取对象的键,忽略 `constructor` 。\n *\n * @private\n * @param value 对象\n * @returns 可枚举的键\n */\nfunction keys(value: object) {\n if (!isPrototype(value)) {\n return Object.keys(value);\n }\n const result = [];\n for (const key in Object(value)) {\n if (hasOwnProperty.call(value, key) && key !== 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default keys;\n","import { objectProto } from './native';\n\n/**\n * 检测值是否为原型对象。\n *\n * @private\n * @param {*} value 要检查的值。\n * @returns {boolean} 是否为原型对象。\n */\nfunction isPrototype(value: any) {\n if (typeof value !== 'object') {\n return false;\n }\n const Ctor = value.constructor;\n const proto = typeof Ctor === 'function' ? Ctor.prototype : objectProto;\n return value === proto;\n}\n\nexport default isPrototype;\n","import { checkType } from './internals/checkType';\nimport { mapTag } from './internals/native';\nimport { nodeIsMap } from './internals/nodeUtil';\n\n/**\n * 检查值是否为 `Map` 对象。\n *\n * @static\n * @alias module:Language.isMap\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Map` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isMap(new Map); // true\n *\n * isMap(new WeakMap); // false\n *\n */\nfunction isMap(value: any): value is Map<any, any> {\n return nodeIsMap ? nodeIsMap(value) : checkType(value, mapTag);\n}\n\nexport default isMap;\n","import { checkType } from './internals/checkType';\nimport { setTag } from './internals/native';\nimport { nodeIsSet } from './internals/nodeUtil';\n\n/**\n * 检查值是否为 `Set` 对象。\n *\n * @static\n * @alias module:Language.isSet\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Set` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSet(new Set); // true\n *\n * isSet(new WeakSet); // false\n *\n */\nfunction isSet(value: any): value is Set<any> {\n return nodeIsSet ? nodeIsSet(value) : checkType(value, setTag);\n}\n\nexport default isSet;\n","import { objectGetOwnPropertySymbols } from './helpers';\nimport { propertyIsEnumerable } from './native';\n\n/**\n * 创建一个数组,包含自身的可枚举 `symbol` 属性。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {Symbol[]} 自身可枚举的 `symbol` 属性数组\n */\nfunction getSymbols(object: object) {\n if (!objectGetOwnPropertySymbols || object === null) {\n return [];\n }\n\n return objectGetOwnPropertySymbols(object).filter((item) =>\n propertyIsEnumerable.call(object, item)\n );\n}\n\nexport default getSymbols;\n","import getSymbols from './internals/getSymbols';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身的可枚举属性(包含 `Symbol` 属性)。\n *\n * 同 `Object.keys` + `Object.getOwnPropertySymbols`。\n *\n * @static\n * @alias module:Object.allKeys\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {Array<string|symbol>} 对象自身的可枚举属性名(包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * allKeys(new Foo); // ['a', Symbol(b)]\n *\n */\nfunction allKeys<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return (Object.keys(object) as (string | symbol)[]).concat(getSymbols(object));\n}\n\nexport default allKeys;\n","/**\n * 检查值是否为 `undefined` 或 `null` 。\n *\n * @static\n * @alias module:Language.isNil\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `undefined` 或 `null` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNil(undefined); // true\n *\n * isNil(void 0); // true\n *\n * isNil(null); // true\n *\n * isNil(''); // false\n *\n * isNil('a'); // false\n *\n * isNil(1); // false\n */\nfunction isNil(value: any) {\n return value == null;\n}\n\nexport default isNil;\n","import { checkTypes } from './internals/checkType';\nimport { typedArrayTags } from './internals/native';\nimport { nodeIsTypedArray } from './internals/nodeUtil';\nimport isLength from './isLength';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为类型化数组。\n *\n * @static\n * @alias module:Language.isTypedArray\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Typed_arrays | Typed_arrays}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为类型化数组,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isTypedArray(new Uint8Array); // true\n *\n * isTypedArray([]); // false\n *\n */\nfunction isTypedArray(value: any) {\n if (nodeIsTypedArray) {\n return nodeIsTypedArray(value);\n }\n return isObjectLike(value) && isLength(value.length) && checkTypes(value, typedArrayTags);\n}\n\nexport default isTypedArray;\n","import allKeys from './allKeys';\nimport eq from './eq';\nimport getTag from './internals/getTag';\nimport { argumentsTag, arrSlice, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, errorTag, hasOwnProperty, mapTag, numberTag, objectTag, regExpTag, setTag, stringTag, symbolTag, symbolValueOf } from './internals/native';\nimport isBuffer from './isBuffer';\nimport isFunction from './isFunction';\nimport isNil from './isNil';\nimport isObjectLike from './isObjectLike';\nimport isTypedArray from './isTypedArray';\nimport orderBy from './orderBy';\n\nfunction mapToArray(map: Map<any, any>) {\n const result: [any, any][] = [];\n map.forEach((value, key) => {\n result.push([key, value]);\n });\n return orderBy(result, [0, 1]);\n}\n\nfunction setToArray(set: Set<any>) {\n const result: any[] = [];\n set.forEach((value) => {\n result.push(value);\n });\n return orderBy(result);\n}\n\nfunction argToArray(arg: IArguments) {\n return arrSlice.call(arg);\n}\n\nfunction toBufferView(bufferSource: any) {\n return new Uint8Array(bufferSource.buffer || bufferSource, bufferSource.byteOffset || 0, bufferSource.byteLength);\n}\n\nfunction isDomNode(obj: any) {\n return isObjectLike(obj) && typeof obj.nodeType === 'number' && typeof obj.nodeName === 'string' && typeof obj.isEqualNode === 'function';\n}\n\ntype Customizer = (objValue: any, othValue: any, key?: number | string | symbol, object?: any, other?: any, valueStack?: any[], otherStack?: any[]) => void | undefined | boolean;\n\nfunction isEqualDeep(value: any, other: any, customizer?: Customizer, strictCheck?: boolean, valueStack?: any[], otherStack?: any[]): boolean {\n // 如果两个值相等,直接返回 true\n if (eq(value, other, strictCheck)) {\n return true;\n }\n\n const valType = typeof value;\n const othType = typeof other;\n\n // 严格比较时,不同类型返回 false\n // 例如,`1` `Object(1)` 不相等\n if (strictCheck && valType !== othType) {\n return false;\n }\n\n // 存在 null 或 undefined 或 都不是对象类型\n if (isNil(value) || isNil(other) || (valType !== 'object' && othType !== 'object')) {\n return false;\n }\n\n // 对象标签\n const tag = getTag(value);\n if (tag !== getTag(other)) {\n return false;\n }\n\n let convert: undefined | ((arg: any) => any);\n\n switch (tag) {\n case numberTag:\n return eq(+value, +other, strictCheck);\n case booleanTag:\n case dateTag:\n // 日期转为毫秒数进行比较,而无效日期转为 `NaN` 。如果是严格比较,无效日期不相等。\n return strictCheck ? +value === +other : eq(+value, +other);\n case stringTag:\n case regExpTag:\n return '' + value === '' + other;\n case symbolTag:\n return symbolValueOf ? symbolValueOf.call(value) === symbolValueOf.call(other) : false;\n case errorTag:\n return value.name == other.name && value.message == other.message;\n case dataViewTag:\n case arrayBufferTag:\n if (value.byteLength !== other.byteLength || (value.byteOffset && value.byteOffset !== other.byteOffset)) {\n return false;\n }\n convert = toBufferView;\n break;\n case mapTag:\n convert = mapToArray;\n break;\n case setTag:\n convert = setToArray;\n break;\n case argumentsTag:\n convert = argToArray;\n break;\n }\n\n if (convert) {\n return isEqualDeep(convert(value), convert(other), customizer, strictCheck, valueStack, otherStack);\n }\n\n // 使用 DOM3 isEqualNode 方法比较 (IE>=9)\n if (isDomNode(value) && isDomNode(other)) {\n return value.isEqualNode(other);\n }\n\n let areArrays = tag === arrayTag;\n if (!areArrays && isTypedArray(value)) {\n if (value.byteLength !== other.byteLength) {\n return false;\n }\n if (value.buffer === other.buffer && value.byteOffset === other.byteOffset) {\n return true;\n }\n areArrays = true;\n }\n\n // Buffer 对象处理\n if (isBuffer(value)) {\n if (!isBuffer(other)) {\n return false;\n }\n areArrays = true;\n }\n\n // 假设循环结构是相等的。\n valueStack = valueStack || [];\n otherStack = otherStack || [];\n let length = valueStack.length;\n\n while (length--) {\n // 遍历对象的堆栈,如果存在循环依赖,立即进行比较。\n if (valueStack[length] === value) {\n return otherStack[length] === other;\n }\n }\n\n // 将对象添加到遍历对象的堆栈中。\n valueStack.push(value);\n otherStack.push(other);\n\n let result = true;\n const hasCustomizer = typeof customizer === 'function';\n\n // 递归比较对象和数组\n if (areArrays) {\n // 比较数组长度\n length = value.length;\n if (length !== other.length) {\n return false;\n }\n // 深度比较数组\n while (length--) {\n if (hasCustomizer) {\n const compared = customizer(value[length], other[length], length, value, other, valueStack, otherStack);\n if (compared !== undefined) {\n if (!compared) {\n return false;\n }\n continue;\n }\n }\n if (!isEqualDeep(value[length], other[length], customizer, strictCheck, valueStack, otherStack)) {\n return false;\n }\n }\n } else if (tag === objectTag) {\n // 深度比较对象\n const keys = allKeys(value);\n length = keys.length;\n if (allKeys(other).length !== length) {\n return false;\n }\n // 跳过构造函数比较\n let skipCtor = false;\n while (length--) {\n const key = keys[length];\n if (hasCustomizer) {\n const compared = customizer(value[key], other[key], key, value, other, valueStack, otherStack);\n if (compared !== undefined) {\n if (!compared) {\n return false;\n }\n continue;\n }\n }\n if (!(hasOwnProperty.call(other, key) && isEqualDeep(value[key], other[key], customizer, strictCheck, valueStack, otherStack))) {\n return false;\n }\n\n // constructor 作为属性,非构建函数时\n if (!skipCtor && key === 'constructor') {\n skipCtor = true;\n }\n }\n\n if (!skipCtor) {\n // 不同构造函数的对象不是等价的。\n const valCtor = value.constructor;\n const othCtor = other.constructor;\n if (valCtor !== othCtor && !(isFunction(valCtor) && valCtor instanceof valCtor && isFunction(othCtor) && othCtor instanceof othCtor) && 'constructor' in value && 'constructor' in other) {\n return false;\n }\n }\n } else {\n result = false;\n }\n\n // 从遍历对象的堆栈中删除\n valueStack.pop();\n otherStack.pop();\n\n return result;\n}\n\n/**\n * 深度比较两个值是否相等。\n *\n * 支持比较 `boolean` `number` `string` `symbol` `array` `array buffer` `date` `error` `map` `object` `regexp` `set` `typed array` 类型。对象只比较自身的属性,不包括继承和不可枚举的属性。\n *\n * 如果 `strictCheck=true` , 以下值不相等:\n *\n * 1. `0` `-0`\n * 2. `typeof` 不同类型,如 `1` `Object(1)`\n * 3. 无效日期对象,如 `new Date('')` `new Date('abc')`\n *\n * @static\n * @alias module:Language.isEqual\n * @since 1.3.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @param {Function} [customizer] 自定义比较。\n * @param {boolean} [strictCheck=false] 严格比较,默认 `false` 。\n * @returns {boolean} 如果两个值相等,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * const value = { a: 1, b: -0 }\n * const other = { a: 1, b: 0 }\n *\n * isEqual(value, other); // true\n * value === other // false\n *\n * // 严格比较\n * isEqual(value, other, undefined, true); // false\n *\n * // 自定义比较\n * function customizer(value, other){\n * if(typeof value === 'string' && typeof other === 'string'){\n * return true;\n * }\n * }\n * isEqual('a', 'b', customizer); // true\n * isEqual(['a'], ['b'], customizer); // true\n * isEqual({foo: 'a'}, {foo: 'b'}, customizer); // true\n *\n */\nfunction isEqual(value: any, other: any, customizer?: Customizer, strictCheck = false) {\n // 自定义比较\n if (typeof customizer === 'function') {\n const result = customizer(value, other);\n if (result !== undefined) {\n return !!result;\n }\n }\n return isEqualDeep(value, other, customizer, strictCheck);\n}\n\nexport default isEqual;\n","import { root } from './internals/native';\nimport { numberIsFinite } from './internals/helpers';\n\n/**\n * 检查值是否为有限数字。\n *\n * 同 `Number.isFinite` 。\n *\n * @static\n * @alias module:Language.isFinite\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为有限数字,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isFinite(1); // true\n *\n * isFinite(Infinity); // false\n *\n * isFinite(Number.MIN_VALUE); // true\n *\n * isFinite('1'); // false\n *\n * isFinite(null); // false\n *\n */\nfunction isFinite(value: any): value is number {\n return numberIsFinite ? numberIsFinite(value) : typeof value === 'number' && root.isFinite(value);\n}\n\nexport default isFinite;\n","import { numberIsInteger } from './internals/helpers';\nimport isFinite from './isFinite';\n\n/**\n * 检查值是否为整数。\n *\n * 同 `Number.isInteger` 。\n *\n * @static\n * @alias module:Language.isInteger\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为整数,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isInteger(1); // true\n *\n * isInteger(Infinity); // false\n *\n * isInteger(Number.MIN_VALUE); // false\n *\n * isInteger('1'); // false\n *\n * isInteger(null); // false\n *\n */\nfunction isInteger(value: any): value is number {\n return numberIsInteger ? numberIsInteger(value) : isFinite(value) && Math.floor(value) === value;\n}\n\nexport default isInteger;\n","import allKeys from './allKeys';\nimport { checkType } from './internals/checkType';\nimport { objectTag } from './internals/native';\nimport isEqual from './isEqual';\n\n// 是否需要深比较\nfunction isDeepComparable(object: any, source: any) {\n return checkType(object, objectTag) && checkType(source, objectTag);\n}\n\ntype Customizer = (objValue: any, srcValue: any, key?: number | string | symbol, object?: any, source?: any, objStack?: any[], srcStack?: any[]) => void | undefined | boolean;\n\nfunction baseIsMatch(object: Record<string | symbol, any>, source: Record<string | symbol, any>, customizer?: Customizer, strictCheck?: boolean, objStack?: any[], srcStack?: any[]) {\n const hasCustomizer = typeof customizer === 'function';\n\n if (isDeepComparable(object, source)) {\n // 假设循环结构是相等的。\n objStack = objStack || [];\n srcStack = srcStack || [];\n let stackLen = objStack.length;\n\n while (stackLen--) {\n // 遍历对象的堆栈,如果存在循环依赖,立即进行比较。\n // 相等才退出,否则必须匹配。\n if (objStack[stackLen] === object && srcStack[stackLen] === source) {\n return true;\n }\n }\n\n // 将对象添加到遍历对象的堆栈中。\n objStack.push(object);\n srcStack.push(source);\n\n const keys = allKeys(source);\n let length = keys.length;\n\n while (length--) {\n const key = keys[length];\n if (!(key in object)) {\n return false;\n }\n\n let compared: void | undefined | boolean;\n\n if (hasCustomizer) {\n compared = customizer(object[key], source[key], key, object, source, objStack, srcStack);\n }\n\n if (compared !== undefined) {\n if (!compared) {\n return false;\n }\n continue;\n }\n\n // 循环对象\n if (!baseIsMatch(object[key], source[key], customizer, strictCheck, objStack, srcStack)) {\n return false;\n }\n }\n\n // 从遍历对象的堆栈中删除\n objStack.pop();\n srcStack.pop();\n return true;\n }\n\n // 非对象比较\n const result = isEqual(\n object,\n source,\n (objValue, srcValue, k, obj, src) => {\n if (hasCustomizer) {\n const compared = customizer(objValue, srcValue, k, obj, src, objStack, srcStack);\n if (compared !== undefined) {\n return compared;\n }\n }\n if (isDeepComparable(objValue, srcValue)) {\n return baseIsMatch(objValue, srcValue, customizer, strictCheck, objStack, srcStack);\n }\n },\n strictCheck\n );\n\n return result;\n}\n\n/**\n * 执行一个深比较,确定 `object` 是否含有和 `source` 完全相等的属性值。\n *\n * 注意:只有普通对象才会执行部分匹配,函数、数组不会执行部分匹配。\n *\n * 如果 `strictCheck=true` , 以下值不相等:\n *\n * 1. `0` `-0`\n * 2. `typeof` 不同类型,如 `1` `Object(1)`\n * 3. 无效日期对象,如 `new Date('')` `new Date('abc')`\n *\n * @static\n * @alias module:Language.isMatch\n * @since 1.4.0\n * @requires module:Language.isEqual\n * @param {Object} object 要检查的对象。\n * @param {Object} source 属性值相匹配的对象。\n * @param {Function} [customizer] 自定义比较。\n * @param {boolean} [strictCheck=false] 严格比较。\n * @returns {boolean} 如果 `object` 匹配,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * const object = { a: 1, b: -0 }\n *\n * isMatch(object, { a: 1 }); // true\n * isMatch(object, { b: 0 }); // true\n *\n * // 严格比较\n * isMatch(object, { b: 0 }, undefined, true); // false\n *\n * // 自定义比较\n * function customizer(objValue, srcValue){\n * if(typeof objValue === 'string' && typeof srcValue === 'string'){\n * return true;\n * }\n * }\n * isMatch({ foo: 'a' }, { foo: 'b' }, customizer); // true\n * isMatch({ foo: ['a'] }, { foo: ['b'] }, customizer); // true\n * isMatch({ foo: 'a' }, { foo: 'b' }, customizer); // true\n *\n */\nfunction isMatch(object: object, source: object, customizer?: Customizer, strictCheck = false) {\n if (typeof customizer === 'function' && isDeepComparable(object, source)) {\n const compared = customizer(object, source);\n if (compared !== undefined) {\n return !!compared;\n }\n }\n\n return baseIsMatch(object, source, customizer, strictCheck);\n}\n\nexport default isMatch;\n","import { checkType } from './internals/checkType';\nimport { numberTag } from './internals/native';\n\n/**\n * 检查值是否为数字类型或对象。\n *\n * `Infinity` `-Infinity` `NaN` 都归类为数字。如果要排除,请使用 `isFinite` 方法。\n *\n * @static\n * @alias module:Language.isNumber\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为数字类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNumber(1); // true\n *\n * isNumber(Infinity); // true\n *\n * isNumber(Number.MIN_VALUE); // true\n *\n * isNumber(NaN); // true\n *\n * isNumber(new Number(1)); // true\n *\n * isNumber('1'); // false\n *\n * isNumber(null); // false\n *\n */\nfunction isNumber(value: any) {\n return typeof value === 'number' || checkType(value, numberTag);\n}\n\nexport default isNumber;\n","import isFinite from '../isFinite';\nimport toInteger from '../toInteger';\nimport toNumber from '../toNumber';\nimport toString from '../toString';\n\n/**\n * 数字调整。\n *\n * @private\n * @param {'floor' | 'ceil' | 'round'} type 调整的类型。\n * @param {number} value 要调整的数字。\n * @param {number} precision 指数(调整基数的10个对数)。\n * @returns {number} 调整后的数字。\n */\nfunction decimalAdjust(type: 'floor' | 'ceil' | 'round', value: number, precision = 0) {\n const func = Math[type];\n\n value = toNumber(value);\n precision = Math.min(toInteger(precision), 292);\n\n if (precision === 0 || !isFinite(value)) {\n return func(value);\n }\n\n // 移动\n let pair = toString(value).split('e');\n value = func(+(pair[0] + 'e' + (pair[1] ? +pair[1] + precision : precision)));\n\n // 向前移\n pair = toString(value).split('e');\n return +(pair[0] + 'e' + (pair[1] ? +pair[1] - precision : -precision));\n}\n\nexport default decimalAdjust;\n","import toNumber from '../toNumber';\n\ntype Comparator = (value: any, other: any) => boolean;\n\nexport function createOperation(comparator: Comparator) {\n return function (value: any, other: any) {\n if (!(typeof value === 'string' && typeof other === 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return comparator(value, other);\n };\n}\n\nexport const baseGt: Comparator = (value, other) => {\n return value > other;\n};\n\nexport const baseGte: Comparator = (value, other) => {\n return value >= other;\n};\n\nexport const baseLt: Comparator = (value, other) => {\n return value < other;\n};\n\nexport const baseLte: Comparator = (value, other) => {\n return value <= other;\n};\n","import { baseGt, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否大于 `other` 。\n *\n * @static\n * @alias module:Util.gt\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 大于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * gt(1, 3); // false\n *\n * gt(3, 3); // false\n *\n * gt(3, 1); // true\n *\n */\nfunction gt(value: any, other: any) {\n return createOperation(baseGt)(value, other);\n}\n\nexport default gt;\n","import isArray from '../isArray';\nimport isSymbol from '../isSymbol';\nimport createIteratee from './createIteratee';\n\nfunction createExtremum<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K,\n comparator: (value: any, other: any) => boolean\n) {\n if (!isArray(array)) {\n return;\n }\n\n let result: T | undefined, computed: number | undefined;\n\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n\n array.forEach((value) => {\n const current = internalIteratee(value);\n if (\n current != null &&\n (computed === undefined\n ? current === current && !isSymbol(current)\n : comparator(current, computed))\n ) {\n computed = current;\n result = value;\n }\n });\n\n return result;\n}\n\nexport default createExtremum;\n","import { baseLt, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否小于 `other` 。\n *\n * @static\n * @alias module:Util.lt\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 小于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * lt(1, 3); // true\n *\n * lt(3, 3); // false\n *\n * lt(3, 1); // false\n *\n */\nfunction lt(value: any, other: any) {\n return createOperation(baseLt)(value, other);\n}\n\nexport default lt;\n","/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(不包含 `Symbol` 属性)。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {string[]} 对象可枚举的属性\n */\nfunction getKeysIn(object: object) {\n const result: string[] = [];\n for (const key in object) {\n result.push(key);\n }\n return result;\n}\n\nexport default getKeysIn;\n","import getKeysIn from './internals/getKeysIn';\nimport getSymbolsIn from './internals/getSymbolsIn';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(包含 `Symbol` 属性)。\n *\n * 同 `key...in` + 递归原型 `Object.getOwnPropertySymbols`。\n *\n * @static\n * @alias module:Object.allKeysIn\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {Array<string|symbol>} 对象自身及继承的可枚举属性名(包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * allKeysIn(new Foo); // ['a', 'c', Symbol(b), Symbol(d)]\n *\n */\nfunction allKeysIn<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return (getKeysIn(object) as (string | symbol)[]).concat(getSymbolsIn(object));\n}\n\nexport default allKeysIn;\n","import getSymbols from './getSymbols';\n\n/**\n * 创建一个数组,包含自身以及继承的可枚举 `symbol` 属性。\n *\n * @private\n * @param {Object} object 要查询的对象\n * @returns {Symbol[]} 可枚举的 `symbol` 属性数组\n */\nfunction getSymbolsIn(object: object) {\n const result: symbol[] = [];\n\n let o = Object(object);\n\n while (o) {\n getSymbols(o).forEach((item) => {\n if (result.indexOf(item) === -1) {\n result.push(item);\n }\n });\n o = Object.getPrototypeOf(o);\n }\n\n return result;\n}\n\nexport default getSymbolsIn;\n","import allKeysIn from './allKeysIn';\nimport isArray from './isArray';\nimport isObject from './isObject';\nimport isObjectLike from './isObjectLike';\n\ntype Customizer = (objValue: any, srcValue: any, key: string | symbol, object: any, source: any) => any;\n\n// 内部处理合并和循环引用\nfunction baseMerge<TObject, TSource>(object: TObject, source: TSource, customizer?: Customizer, storage = new WeakMap()) {\n const obj = Object(object);\n\n if (!isObject(source) || obj === source) {\n return obj;\n }\n\n const keys = allKeysIn(source as object);\n\n keys.forEach((key) => {\n // @ts-ignore\n const srcValue = source[key];\n let newValue = typeof customizer === 'function' ? customizer(obj[key], srcValue, key, obj, source) : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n\n // 递归处理对象和数组\n if (isObjectLike(newValue) && key in obj && !storage.has(newValue as object)) {\n storage.set(newValue as object, true);\n\n const objValue = obj[key];\n let newObjValue: any;\n\n if (isArray(newValue)) {\n newObjValue = isArray(objValue) ? objValue : [];\n } else {\n newObjValue = isObjectLike(objValue) ? objValue : {};\n }\n\n obj[key] = baseMerge(newObjValue, newValue as any, customizer, storage);\n } else {\n if (newValue !== undefined || (newValue === undefined && !(key in obj))) {\n obj[key] = newValue;\n }\n }\n });\n\n return obj;\n}\n\n/**\n * 递归合并 `source` 来源对象自身和继承的可枚举属性(包含 `Symbol` 属性)到 `object` 目标对象。\n *\n * 如果目标值存在,被解析为 `undefined` 的 `source` 来源对象属性将被跳过。数组和普通对象会递归合并,其他对象和值会被直接分配覆盖。\n *\n * @static\n * @alias module:Object.merge\n * @since 1.0.0\n * @param {Object | Array} object 目标对象。\n * @param {Object | Array} source 来源对象。\n * @param {Function} [customizer] 自定义赋值函数。\n * @returns {Object} 目标对象。\n * @example\n *\n * const object = {\n * a: [{b: 2}, {d: 4}]\n * }\n *\n * const other = {\n * a: [{c: 3},{e: 5}]\n * }\n *\n * merge(object, other); // { a: [{b: 2, c: 3}, {d: 4, e: 5}] }\n *\n */\nfunction merge<TObject, TSource>(object: TObject, source: TSource, customizer?: Customizer): TObject & TSource {\n return baseMerge(object, source, customizer);\n}\n\nexport default merge;\n","import isArray from './isArray';\n\n/**\n * 如果值不是数组,则将其转换为数组。\n *\n * @static\n * @alias module:Util.castArray\n * @since 1.0.0\n * @param {*} [value] 要处理的值。\n * @returns {Array} 转换后的数组。\n * @example\n *\n * castArray('a'); // [\"a\"]\n *\n * castArray(1); // [1]\n *\n * castArray({ a: 1, b: 2}); // [{ a: 1, b: 2}]\n *\n * castArray(); // []\n *\n * castArray(undefined); // [undefined]\n *\n * castArray(null); // [null]\n *\n * const arr = [1, 2, 3];\n * castArray(arr); // [1, 2, 3]\n * console.log(arr === castArray(arr)); // true\n */\nfunction castArray<T>(value?: T | T[]): T[] {\n if (!arguments.length) {\n return [];\n }\n return isArray(value) ? value : [value as T];\n}\n\nexport default castArray;\n","import allKeysIn from './allKeysIn';\n\n/**\n * 创建一个对象,该对象的属性从 `object` 中经 `predicate` (断言函数)判断为真值的属性。\n *\n * `predicate` 调用时会传入 2 个参数 `value` `key` 。\n *\n * @static\n * @alias module:Object.pickBy\n * @since 1.0.0\n * @param {Object} obj 来源对象。\n * @param {Function} [predicate] 调用每一个属性的函数。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * pickBy(obj); // {}\n *\n * pickBy(obj, (value) => typeof value === 'number'); // { age: 18 }\n *\n * pickBy(obj, (value) => value); // { name: \"jeff\", age: 18 }\n *\n */\nfunction pickBy<T extends object>(\n object: T,\n predicate: (value: any, key: any) => any = () => false\n) {\n const result: Partial<T> = {};\n\n if (object === null) {\n return result;\n }\n\n const keys = allKeysIn(object) as (keyof T)[];\n\n keys.forEach((key) => {\n if (predicate(object[key], key)) {\n result[key] = object[key];\n }\n });\n\n return result;\n}\n\nexport default pickBy;\n","const reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * 拆分字符串中的词为数组。\n *\n * @static\n * @alias module:String.words\n * @since 1.0.0\n * @see {@link https://zh.wikipedia.org/wiki/ASCII | ASCII}\n * @param {string} string 要拆分的字符串。\n * @param {RegExp | string} [pattern=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g] 匹配模式。\n * @returns {string[]} 拆分后的数组。\n * @example\n *\n * words('fred, barney, & pebbles'); // ['fred', 'barney', 'pebbles']\n *\n * words('fred, barney, & pebbles', /[^, ]+/g); // ['fred', 'barney', '&', 'pebbles']\n *\n */\nfunction words(string: string, pattern: RegExp | string = reAsciiWord): string[] {\n return string.match(pattern) || [];\n}\n\nexport default words;\n","import toString from '../toString';\nimport words from '../words';\n\n/**\n * 拆分字符串词组。\n *\n * @private\n * @param {string} string 要拆分的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string[]} 拆分后的数组。\n */\nfunction splitCaseWords(string: string, pattern?: RegExp | string) {\n return words(toString(string).replace(/['\\u2019]/g, ''), pattern);\n}\n\nexport default splitCaseWords;\n","import toString from '../toString';\n\n/**\n * 生成一个首个字符串处理的函数。\n *\n * @private\n * @param {string} methodName 首个字符串的大小写方法。\n * @returns {string} 新的大小写函数。\n */\nfunction createCaseFirst(methodName: 'toLowerCase' | 'toUpperCase') {\n return (string: string) => {\n const str = toString(string);\n if (!str) {\n return '';\n }\n return str[0][methodName]() + str.slice(1);\n };\n}\n\nexport default createCaseFirst;\n","import createCaseFirst from './internals/createCaseFirst';\n\n/**\n * 转换字符串第一个字符为大写。\n *\n * @static\n * @alias module:String.upperFirst\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * upperFirst('bar'); // 'Bar'\n *\n * upperFirst('BAR'); // 'BAR'\n *\n */\nfunction upperFirst(string: string) {\n return createCaseFirst('toUpperCase')(string);\n}\n\nexport default upperFirst;\n","import toString from './toString';\n\nconst htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\n\nconst reUnescapedHtml = /[&<>\"']/g;\nconst reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * 转义字符串中的 `&` `<` `>` `\"` `'` 字符为 HTML 实体字符。\n *\n * 注意:不会转义其他字符。如果需要,可以使用第三方库,如 [he](https://github.com/mathiasbynens/he) 。\n *\n * 虽然 \">\" 是对称转义的,字符如 \">\" 和 \"/\" 没有特殊的意义,所以不需要在 HTML 转义。 除非它们是标签的一部分,或者是不带引号的属性值。\n *\n * 当解析 HTML 时,总应该在[属性值上使用引号](http://wonko.com/post/html-escaping)以减少 XSS 的可能性。\n *\n * @static\n * @alias module:String.escape\n * @since 1.0.0\n * @see {@link https://mathiasbynens.be/notes/ambiguous-ampersands | ambiguous-ampersands}\n * @param {string} string 要转义的字符串。\n * @returns {string} 转义后的字符串。\n * @example\n *\n * escape('<script></script>'); // '<script></script>'\n *\n * escape('&'); // '&'\n *\n */\nfunction escape(string: string) {\n string = toString(string);\n return string && reHasUnescapedHtml.test(string)\n ? string.replace(reUnescapedHtml, (chr) => {\n // @ts-ignore\n return htmlEscapes[chr];\n })\n : string || '';\n}\n\nexport default escape;\n","const reRegExpChar = /[\\\\^$.*+?\\-()[\\]{}|]/g;\nconst reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * 转义 `RegExp` 字符串中特殊的字符 `\\\\` `^` `$` `.` `*` `+` `?` `-` `(` `)` `[` `]` `{` `}` `|` 。\n *\n * @static\n * @alias module:String.escapeRegExp\n * @since 1.0.0\n * @see {@link https://tc39.es/ecma262/multipage/text-processing.html#sec-patterns | syntax characters}\n * @param {string} string 要转义的字符串。\n * @returns {string} 转义后的字符串。\n * @example\n *\n * escapeRegExp('\\\\'); // '\\\\\\\\'\n *\n * escapeRegExp('-+='); // '\\\\-\\\\+='\n *\n * escapeRegExp('[ut2](https://caijf.github.io/ut2/)'); // '\\\\[ut2\\\\]\\\\(https://caijf\\\\.github\\\\.io/ut2/\\\\)'\n *\n */\nfunction escapeRegExp(string: string) {\n return string && reHasRegExpChar.test(string)\n ? string.replace(reRegExpChar, '\\\\$&')\n : string || '';\n}\n\nexport default escapeRegExp;\n","import toString from './toString';\n\nconst htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n};\n\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#(0+)?39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * 转义字符串中的 HTML 实体字符 `&` `<` `"` `'` 为对应的字符。\n *\n * 注意:不会转换其他的 HTML 实体。如果需要,可以使用第三方库,如 [he](https://github.com/mathiasbynens/he) 。\n *\n * @static\n * @alias module:String.unescape\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * unescape('<script></script>'); // '<script></script>'\n *\n * unescape('&'); // '&'\n */\nfunction unescape(string: string) {\n string = toString(string);\n return string && reHasEscapedHtml.test(string)\n ? string.replace(reEscapedHtml, (chr) => {\n // @ts-ignore\n return htmlUnescapes[chr] || \"'\";\n })\n : string || '';\n}\n\nexport default unescape;\n","import allKeys from './allKeys';\n\nfunction conformsTo<T extends object, K extends keyof T>(\n object: T,\n source: Record<K, (value: T[K]) => any>\n): boolean;\nfunction conformsTo<T extends object | null | undefined>(\n object: T,\n source: Record<string | symbol, (value: any) => any>\n): boolean;\n/**\n * 通过调用断言 `source` 的属性与 `object` 的相应属性值,检查 `object` 是否符合 `source` 。\n *\n * @static\n * @alias module:Util.conformsTo\n * @since 1.0.0\n * @param {Object} object 要检查的对象。\n * @param {Object} source 要断言属性是否符合的对象。\n * @returns {boolean} 如果 `object` 符合,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * const object = { a: 1, b: 2 }\n *\n * conformsTo(object, { b: value => value > 1 }); // true\n *\n * conformsTo(object, { b: value => value > 2 }); // false\n *\n */\nfunction conformsTo<T extends object, K extends keyof T>(\n object: T,\n source: Record<K, (value: T[K]) => any>\n) {\n const props = allKeys(source) as unknown as K[];\n const length = props.length;\n\n if (object == null) {\n return !length;\n }\n\n if (length === 0) {\n return true;\n }\n\n for (let i = 0; i < length; i++) {\n const key = props[i];\n const predicate = source[key];\n const value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport default conformsTo;\n","import toString from './toString';\n\n// 计数器\nlet idCounter = 0;\n\n/**\n * 生成唯一ID。如果提供了 `prefix` ,会被添加到ID前缀上。\n *\n * @static\n * @alias module:Util.uniqueId\n * @since 1.0.0\n * @param {string} [prefix] 要添加到ID前缀的值。\n * @returns {string} 唯一ID。\n * @example\n *\n * uniqueId(); // '1'\n *\n * uniqueId(); // '2'\n *\n * uniqueId('abc_'); // 'abc_3'\n *\n */\nfunction uniqueId(prefix = '') {\n const id = ++idCounter;\n return toString(prefix) + id;\n}\n\nexport default uniqueId;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 创建一个函数,当它被调用 `n` 或更多次之后触发 `func` 。\n *\n * @static\n * @alias module:Function.after\n * @since 1.0.0\n * @param {number} n 函数应该在调用多少次后执行。\n * @param {Function} func 用来限定的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * const saves = ['profile', 'settings'];\n * const done = after(saves.length, () => console.log('done saving!'));\n *\n * saves.forEach(item=>{\n * console.log(item);\n * done();\n * });\n * // 'profile'\n * // 'settings'\n * // 'done saving!'\n *\n */\nfunction after<T extends (...args: any[]) => any>(n: number, func: T) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = defaultTo(toNumber(n), 0);\n return function () {\n if (--n < 1) {\n // @ts-ignore\n // eslint-disable-next-line prefer-rest-params\n return func.apply(this, arguments);\n }\n } as T;\n}\n\nexport default after;\n","import splitCaseWords from './internals/splitCaseWords';\nimport upperFirst from './upperFirst';\n\n/**\n * 转换字符串为驼峰写法。\n *\n * @static\n * @alias module:String.camelCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Camel_case | Camel_case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 驼峰写法的字符串。\n * @example\n *\n * camelCase('foo bar'); // 'fooBar'\n *\n * camelCase('foo-bar'); // 'fooBar'\n *\n * camelCase('Foo Bar'); // 'fooBar'\n *\n * camelCase('FOO BAR'); // 'fooBar'\n *\n * camelCase('--FOO-BAR--'); // 'fooBar'\n *\n * camelCase('__FOO_BAR__'); // 'fooBar'\n *\n */\nfunction camelCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => {\n cur = cur.toLowerCase();\n return prev + (index ? upperFirst(cur) : cur);\n }, '');\n}\n\nexport default camelCase;\n","import toString from './toString';\nimport upperFirst from './upperFirst';\n\n/**\n * 转换字符串首字母大写,剩下为小写。\n *\n * @static\n * @alias module:String.capitalize\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 首字母大写的字符串。\n * @example\n *\n * capitalize('bar'); // 'Bar'\n *\n * capitalize('BAR'); // 'Bar'\n *\n */\nfunction capitalize(string: string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nexport default capitalize;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度向上舍入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.ceil\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要向上舍入的值。\n * @param {number} [precision=0] 向上舍入的精度。\n * @returns {number} 向上舍入的值。\n * @example\n *\n * ceil(4.16); // 5\n *\n * ceil(4.16, 1); // 4.2\n *\n * ceil(4160, -2); // 4200\n *\n */\nfunction ceil(number: number, precision?: number) {\n return decimalAdjust('ceil', number, precision);\n}\n\nexport default ceil;\n","import isArray from './isArray';\nimport toLength from './toLength';\n\n/**\n * 将数组拆分成多个 `size` 长度的区块,并将这些区块组成一个新数组。\n *\n * 如果数组无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。\n *\n * @static\n * @alias module:Array.chunk\n * @since 1.0.0\n * @param {Array} array 要处理的数组。\n * @param {number} [size=1] 每个数组区块的长度。\n * @returns {Array} 拆分区块的新数组。\n * @example\n *\n * const array = ['a', 'b', 'c', 'd'];\n *\n * chunk(array, 2); // [['a', 'b'], ['c', 'd']]\n *\n * chunk(array, 3); // [['a', 'b', 'c'], ['d']]\n *\n */\nfunction chunk<T>(array: T[], size = 1) {\n size = toLength(size);\n if (!isArray(array) || size < 1) {\n return [];\n }\n\n const length = array.length;\n const result: T[][] = Array(Math.ceil(length / size));\n let resIndex = 0,\n index = 0;\n\n while (index < length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n\n return result;\n}\n\nexport default chunk;\n","import defaultTo from './defaultTo';\nimport toNumber from './toNumber';\n\nfunction clamp(number: number, upper: number): number;\nfunction clamp(number: number, lower: number, upper: number): number;\n/**\n * 数字限制在 `lower` 和 `upper` 之间的值。\n *\n * @static\n * @alias module:Number.clamp\n * @since 1.0.0\n * @param {number} number 被限制的值。\n * @param {number} [lower] 下限。\n * @param {number} upper 上限。\n * @returns {number} 被限制的值。\n * @example\n *\n * clamp(-10, -5, 5); // -5\n *\n * clamp(-10, 0, 5); // 0\n *\n * clamp(10, -5, 5); // 5\n *\n * // 仅限制上限\n * clamp(10, 5); // 5\n *\n * clamp(-10, 5); // -10\n *\n */\nfunction clamp(number: number, lower?: number, upper?: number) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n\n if (upper !== undefined) {\n upper = defaultTo(toNumber(upper), 0);\n }\n\n if (lower !== undefined) {\n lower = defaultTo(toNumber(lower), 0);\n }\n\n number = toNumber(number);\n\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n\n return number;\n}\n\nexport default clamp;\n","import isArray from './isArray';\n\n/**\n * 创建一个新数组,包含原数组中所有的非假值元素。\n *\n * 例如 `false` `null` `0` `\"\"` `undefined` `NaN` 都被认为是假值。\n *\n * @static\n * @alias module:Array.compact\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy | Falsy}\n * @param {Array} array 待处理的数组。\n * @returns {Array} 过滤掉假值的新数组。\n * @example\n *\n * compact([0, 1, false, '', 2]); // [1, 2]\n *\n */\nfunction compact<T>(array: T[]) {\n return isArray(array) ? array.filter((item) => !!item) : [];\n}\n\nexport default compact;\n","import conformsTo from './conformsTo';\n\n/**\n * 创建一个函数,调用 `source` 的属性名对应的断言函数与传入对象相对应属性名的值进行断言处理。如果都符合返回 `true`,否则返回 `false` 。\n *\n * @static\n * @alias module:Util.conforms\n * @since 1.0.0\n * @param {Object} source 要断言属性是否符合的对象。\n * @returns {Function} 新的函数。\n * @example\n *\n * const objs = [\n * { a: 1, b: 1 },\n * { a: 2, b: 2 }\n * ]\n *\n * objs.filter(conforms({ b: value => value > 1 })); // [{ a: 2: b: 2 }]\n */\nfunction conforms<\n T extends object,\n K extends keyof T,\n S extends object = Record<string, (value: T[K]) => any>\n>(source: S) {\n return function (object: T) {\n return conformsTo(object, source);\n };\n}\n\nexport default conforms;\n","/**\n * 创建一个返回 `value` 的函数。\n *\n * @static\n * @alias module:Util.constant\n * @since 1.0.0\n * @param {*} value 新函数返回的值。\n * @returns {Function} 返回新的常量函数。\n * @example\n *\n * const obj = { a: 1 }\n *\n * const returnObj = constant(obj);\n *\n * console.log(returnObj() === obj); // true\n */\nfunction constant<T>(value: T) {\n return function () {\n return value;\n };\n}\n\nexport default constant;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果,每个 `key` 对应的值是 `iteratee` 返回该 `key` 的次数。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.countBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成集合对象。\n * @example\n *\n * countBy([6, 4, 6]); // {'6': 2, '4': 1}\n *\n * countBy([6.1, 4.2, 6.3], Math.floor); // {'6': 2, '4': 1}\n *\n * countBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': 2, '4': 1}\n *\n * // 迭代函数可以直接写入属性。\n * countBy(['one', 'two', 'three'], 'length'); // {'3': 2, '5': 1}\n *\n */\nfunction countBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, number> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n if (key in result) {\n ++result[key];\n } else {\n result[key] = 1;\n }\n });\n }\n return result;\n}\n\nexport default countBy;\n","import baseDebounce from './internals/baseDebounce';\n\n/**\n * 创建一个防抖动函数,该函数会从上一次被调用后,延迟 `wait` 毫秒数后调用 `func` 方法。\n *\n * 防抖动函数还提供以下方法:\n * 1. `cancel` 方法取消延迟的函数调用。\n * 2. `flush` 方法立即调用。\n * 3. `pending` 方法是否在等待函数执行。\n *\n * @static\n * @alias module:Function.debounce\n * @since 1.0.0\n * @param {Function} func 要防抖动的函数。\n * @param {number} [wait=0] 需要延迟的毫秒数。\n * @param {boolean} [immediate=false] 是否在延迟开始前调用。\n * @returns {Function} 防抖动函数。\n * @example\n *\n * function calculateLayout(e){\n * console.log('calculate layout event: ', e);\n * }\n *\n * // 避免窗口在变动时出现昂贵的计算开销。\n * window.addEventListener('resize', debounce(calculateLayout, 200));\n *\n * const debounced = debounce(()=>{\n * // do something\n * }\n *\n * // 点击按钮立即执行,而后如果在每 300 毫秒内连续点击,将在最后一次点击延迟 300 毫秒后执行。\n * document.querySelector('button').addEventListener('click', debounced, 300, true));\n *\n * // 取消防抖动调用\n * window.addEventListener('popstate', debounced.cancel);\n *\n */\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait = 0, immediate = false) {\n return baseDebounce(func, wait, immediate);\n}\n\nexport default debounce;\n","import defaultTo from './defaultTo';\nimport { FUNC_ERROR_TEXT } from './internals/helpers';\nimport toNumber from './toNumber';\n\n/**\n * 延迟 `wait` 毫秒后调用 `func` 。\n *\n * @static\n * @alias module:Function.delay\n * @since 1.0.0\n * @param {Function} func 要延迟的函数。\n * @param {number} wait 要延迟的毫秒数。\n * @param {...*} [args] 调用函数时传入的参数。\n * @returns {number} 计时器 id 。\n * @example\n *\n * // 延迟 1000 毫秒后执行\n * delay(function(text){\n * console.log(text);\n * }, 1000, 'hello world');\n *\n * // 'hello world'\n *\n */\nfunction delay<T extends (...args: any[]) => any>(func: T, wait: number, ...args: Parameters<T>) {\n if (typeof func !== 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n // @ts-ignore\n const context = this;\n wait = defaultTo(toNumber(wait), 0);\n\n return setTimeout(() => {\n func.apply(context, args);\n }, wait);\n}\n\nexport default delay;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度向下舍入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.floor\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要向下舍入的值。\n * @param {number} [precision=0] 向下舍入的精度。\n * @returns {number} 向下舍入的值。\n * @example\n *\n * floor(4.16); // 4\n *\n * floor(4.16, 1); // 4.1\n *\n * floor(4160, -2); // 4100\n */\nfunction floor(number: number, precision?: number) {\n return decimalAdjust('floor', number, precision);\n}\n\nexport default floor;\n","import isArray from './isArray';\n\nfunction fromPairs<P extends string | number | symbol, V = any>(array: [P, V][]): Record<P, V>;\nfunction fromPairs<P extends string | number | symbol>(array: any[][]): Record<P, any>;\n/**\n * 将键值对数组转为对象。\n *\n * 与 [Object.entries](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/entries) 正好相反。\n *\n * @static\n * @alias module:Array.fromPairs\n * @since 1.0.0\n * @param {Array} array 键值对数组。\n * @returns {Object} 新对象。\n * @example\n *\n * fromPairs([['foo', 'bar'], ['baz', 42]]); // {foo: 'bar', baz: 42}\n *\n */\nfunction fromPairs<P extends string | number | symbol, V>(array: any[][]) {\n // @ts-ignore\n const result: Record<P, V> = {};\n\n if (!isArray(array)) {\n return result;\n }\n\n array.forEach((item) => {\n result[item[0] as P] = item[1];\n });\n\n return result;\n}\n\nexport default fromPairs;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成聚合对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果。分组值的顺序是由他们出现在 `collection` 的顺序确定的。每个键对应的值负责生成 `key` 的元素组成的数组。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.groupBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成聚合对象。\n * @example\n *\n * groupBy([6, 4, 6]); // {'6': [6, 6], '4': [4]}\n *\n * groupBy([6.1, 4.2, 6.3], Math.floor); // {'6': [6.1, 6.3], '4': [4.2]}\n *\n * groupBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': [{n: 6.1}, {n: 6.3}], '4': [{n: 4.2}]}\n *\n * // 迭代函数可以直接写入属性。\n * groupBy(['one', 'two', 'three'], 'length'); // {'3': ['one', 'two'], '5': ['three']}\n *\n */\nfunction groupBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, T[]> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n if (key in result) {\n result[key].push(item);\n } else {\n result[key] = [item];\n }\n });\n }\n return result;\n}\n\nexport default groupBy;\n","import { baseGte, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否大于或等于 `other` 。\n *\n * @static\n * @alias module:Util.gte\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 大于或等于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * gte(1, 3); // false\n *\n * gte(3, 3); // true\n *\n * gte(3, 1); // true\n *\n */\nfunction gte(value: any, other: any) {\n return createOperation(baseGte)(value, other);\n}\n\nexport default gte;\n","import toNumber from './toNumber';\n\n/**\n * 检查数字是否在 `start` 与 `end` 之间,但不包括 `end` 。\n *\n * 如果 `start` 大于 `end` 会自动交换范围参数。\n *\n * @static\n * @alias module:Number.inRange\n * @since 1.0.0\n * @param {number} number 要检查的值。\n * @param {number} start 开始范围。\n * @param {number} [end=0] 结束范围。\n * @returns {number} 如果数字在范围内,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * inRange(3, 2, 4); // true\n *\n * inRange(1, 0, 2); // true\n *\n * inRange(1.2, 0.5, 1.5); // true\n *\n * inRange(2.2, 0.5, 1.5); // false\n *\n * inRange(-2, -2, 4); // true\n *\n * inRange(4, -2, 4); // false\n *\n * // 某个范围为 0 可省略最后一个参数\n * inRange(1, 2); // true\n *\n * inRange(1, -2); // false\n *\n */\nfunction inRange(number: number, start: number, end = 0) {\n number = toNumber(number);\n start = toNumber(start);\n end = toNumber(end);\n return number >= Math.min(start, end) && number < Math.max(start, end);\n}\n\nexport default inRange;\n","import { argumentsTag, hasOwnProperty, propertyIsEnumerable } from './internals/native';\nimport { supportedArgumentsType } from './internals/helpers';\nimport isObjectLike from './isObjectLike';\nimport { checkType } from './internals/checkType';\n\n/**\n * 检查值是否为 `arguments` 对象。\n *\n * @static\n * @alias module:Language.isArguments\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `arguments` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArguments(function() { return arguments }()); // true\n *\n * isArguments([1, 2, 3]); // false\n *\n */\nfunction isArguments(value: any) {\n if (supportedArgumentsType) {\n return checkType(value, argumentsTag);\n }\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nexport default isArguments;\n","import { checkType } from './internals/checkType';\nimport { arrayBufferTag } from './internals/native';\nimport { nodeIsArrayBuffer } from './internals/nodeUtil';\n\n/**\n * 检查值是否为 `ArrayBuffer` 对象。\n *\n * @static\n * @alias module:Language.isArrayBuffer\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `ArrayBuffer` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isArrayBuffer(new ArrayBuffer(8)); // true\n *\n * isArrayBuffer({}); // false\n *\n * isArrayBuffer('2012'); // false\n *\n */\nfunction isArrayBuffer(value: any) {\n return nodeIsArrayBuffer ? nodeIsArrayBuffer(value) : checkType(value, arrayBufferTag);\n}\n\nexport default isArrayBuffer;\n","import { checkTypes } from './internals/checkType';\nimport { blobExisted, blobTag, fileTag } from './internals/native';\n\n/**\n * 检查值是否为 `Blob` 对象。\n *\n * 浏览器环境的 `Blob` 或 `File` 对象,或其他继承自 `Blob` 的实例,都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isBlob\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/Blob | Blob}\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/File | File}\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Blob` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isBlob(new Blob(['a'])); // true\n *\n * isBlob({}); // false\n *\n * isBlob('2012'); // false\n *\n */\nfunction isBlob(value: any): value is Blob {\n // instanceof 不支持跨域对象判断,如来自 iframe 的 Blob 对象\n return (blobExisted && value instanceof Blob) || checkTypes(value, [blobTag, fileTag]);\n}\n\nexport default isBlob;\n","import { checkType } from './internals/checkType';\nimport { booleanTag } from './internals/native';\n\n/**\n * 检查值是否为布尔类型或对象。\n *\n * @static\n * @alias module:Language.isBoolean\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为布尔类型或对象,返回 `true` 否则返回 `false` 。\n * @example\n *\n * isBoolean(false); // true\n *\n * isBoolean(new Boolean(false)); // true\n *\n * isBoolean(Object(false)); // true\n *\n * isBoolean(new Boolean(false)); // true\n *\n * isBoolean(null); // false\n *\n */\nfunction isBoolean(value: any) {\n return value === true || value === false || checkType(value, booleanTag);\n}\n\nexport default isBoolean;\n","import { checkType } from './internals/checkType';\nimport { dataViewTag } from './internals/native';\n\n/**\n * 检查值是否为 `DataView` 对象。\n *\n * @static\n * @alias module:Language.isDataView\n * @since 1.2.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `DataView` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isDataView(new DataView(new ArrayBuffer(8))); // true\n *\n */\nfunction isDataView(value: any) {\n return checkType(value, dataViewTag);\n}\n\nexport default isDataView;\n","import { checkType } from './internals/checkType';\nimport { dateTag } from './internals/native';\nimport { nodeIsDate } from './internals/nodeUtil';\n\n/**\n * 检查值是否为 `Date` 对象。\n *\n * @static\n * @alias module:Language.isDate\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Date` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isDate(new Date); // true\n *\n * isDate('Mon April 23 2012'); // false\n *\n */\nfunction isDate(value: any): value is Date {\n return nodeIsDate ? nodeIsDate(value) : checkType(value, dateTag);\n}\n\nexport default isDate;\n","import isObjectLike from './isObjectLike';\nimport isPlainObject from './isPlainObject';\n\n/**\n * 检查值是否可能为 `DOM` 元素。\n *\n * @static\n * @alias module:Language.isElement\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `DOM` 元素,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isElement(document.body); // true\n *\n * isElement('<body>'); // false\n *\n */\nfunction isElement(value: any) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n}\n\nexport default isElement;\n","import keys from './internals/keys';\nimport isArrayLike from './isArrayLike';\nimport isMap from './isMap';\nimport isObjectLike from './isObjectLike';\nimport isSet from './isSet';\n\n/**\n * 检查值是否为空对象。\n *\n * 类数组的 `length===0`,`Map` `Set` 的 `size === 0` 表示为空。如果对象 `Object.keys` 没有可枚举属性,则被认为是空的。\n *\n * 非上述类型值,都将被认为是空的。\n *\n * @static\n * @alias module:Language.isEmpty\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为空,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isEmpty(null); // true\n *\n * isEmpty(true); // true\n *\n * isEmpty(1); // true\n *\n * isEmpty([]); // true\n *\n * isEmpty({}); // true\n *\n * isEmpty(''); // false\n *\n * isEmpty('abc'); // false\n *\n * isEmpty([1, 2, 3]); // false\n *\n * isEmpty({ a: 1, b: 2 }); // false\n *\n */\nfunction isEmpty(value: any) {\n if (value == null) {\n return true;\n }\n\n if (isMap(value) || isSet(value)) {\n return !value.size;\n }\n\n if (isObjectLike(value)) {\n return !keys(value).length;\n }\n\n if (isArrayLike(value)) {\n return !value.length;\n }\n\n return true;\n}\n\nexport default isEmpty;\n","import { checkTypes } from './internals/checkType';\nimport { domExceptionTag, errorTag } from './internals/native';\nimport isObjectLike from './isObjectLike';\n\n/**\n * 检查值是否为 `Error` 或 `DOMException` 。\n *\n * 继承自 `Error` 的对象,如 `EvalError` `RangeError` `ReferenceError` `SyntaxError` `TypeError` `URIError` `AggregateError`,都将返回 `true` 。\n *\n * @static\n * @alias module:Language.isError\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `Error` 或 `DOMException` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isError(new Error); // true\n *\n * isError(Error); // false\n *\n */\nfunction isError(value: any) {\n return isObjectLike(value) && (value instanceof Error || checkTypes(value, [errorTag, domExceptionTag]));\n}\n\nexport default isError;\n","import { root } from './internals/native';\nimport isNumber from './isNumber';\n\n/**\n * 检查值是否为 `NaN` 。\n *\n * 和 `Number.isNaN` 区别是 `new Number(NaN)` 也被认为是 `NaN`。\n *\n * @static\n * @alias module:Language.isNaN\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `NaN` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNaN(NaN); // true\n *\n * isNaN(new Number(NaN)); // true\n *\n * isNaN(1); // false\n *\n */\nfunction isNaN(value: any): boolean {\n return isNumber(value) && root.isNaN(value);\n}\n\nexport default isNaN;\n","/**\n * 检查值是否为 `null` 。\n *\n * @static\n * @alias module:Language.isNull\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `null` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isNull(null); // true\n *\n * isNull(void 0); // false\n *\n */\nfunction isNull(value: any) {\n return value === null;\n}\n\nexport default isNull;\n","import isObject from './isObject';\n\n/**\n * 检测值是否类似 `Promise` 对象。\n *\n * 如果一个对象包含 `then` 方法,它就是类似 `Promise` 对象。\n *\n * @static\n * @alias module:Language.isPromiseLike\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值类似 `Promise` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isPromiseLike(Promise.resolve()); // true\n *\n * isPromiseLike({ then: () => { } }); // true\n *\n * isPromiseLike([]); // false\n *\n */\nfunction isPromiseLike(value: any) {\n return isObject(value) && typeof value.then === 'function';\n}\n\nexport default isPromiseLike;\n","import { checkType } from './internals/checkType';\nimport { regExpTag } from './internals/native';\nimport { nodeIsRegExp } from './internals/nodeUtil';\n\n/**\n * 检查值是否为 `RegExp` 对象。\n *\n * @static\n * @alias module:Language.isRegExp\n * @since 1.0.0\n * @param {*} value 要检查的值\n * @returns {boolean} 如果值为 `RegExp` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isRegExp(/abc/); // true\n *\n * isRegExp('/abc/'); // false\n *\n */\nfunction isRegExp(value: any) {\n return nodeIsRegExp ? nodeIsRegExp(value) : checkType(value, regExpTag);\n}\n\nexport default isRegExp;\n","import { MAX_SAFE_INTEGER } from './internals/native';\nimport { numberIsSafeInteger } from './internals/helpers';\nimport isInteger from './isInteger';\n\n/**\n * 检查值是否为安全整数。\n *\n * 同 `Number.isSafeInteger` 。\n *\n * 如果一个整数是一个 `IEEE-754` 双精度数字,它不是四舍五入的不安全整数的结果,那么它就是安全的。安全整数范围为 `-(2^53 - 1)` 到 `2^53 - 1` 之间的整数,包含 `-(2^53 - 1)` 和 `2^53 - 1`。\n *\n * @static\n * @alias module:Language.isSafeInteger\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为安全整数,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isSafeInteger(1); // true\n *\n * isSafeInteger(Infinity); // false\n *\n * isSafeInteger(Number.MIN_VALUE); // false\n *\n * isSafeInteger('1'); // false\n *\n * isSafeInteger(null); // false\n *\n */\nfunction isSafeInteger(value: any): value is number {\n return numberIsSafeInteger ? numberIsSafeInteger(value) : isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n\nexport default isSafeInteger;\n","import { checkType } from './internals/checkType';\nimport { stringTag } from './internals/native';\n\n/**\n * 检查值是否为字符串类型或对象。\n *\n * @static\n * @alias module:Language.isString\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为字符串类型或对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isString('abc'); // true\n *\n * isString(new String('abc')); // true\n *\n * isString(1); // false\n *\n */\nfunction isString(value: any) {\n return typeof value === 'string' || checkType(value, stringTag);\n}\n\nexport default isString;\n","/**\n * 检查值是否为 `undefined` 。\n *\n * @static\n * @alias module:Language.isUndefined\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `undefined` ,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isUndefined(undefined); // true\n *\n * isUndefined(null); // false\n *\n */\nfunction isUndefined(value: any) {\n return value === void 0;\n}\n\nexport default isUndefined;\n","import { checkType } from './internals/checkType';\nimport { weakMapTag } from './internals/native';\n\n/**\n * 检查值是否为 `WeakMap` 对象。\n *\n * @static\n * @alias module:Language.isWeakMap\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `WeakMap` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isWeakMap(new WeakMap); // true\n *\n * isWeakMap(new Map); // false\n *\n */\nfunction isWeakMap(value: any): value is WeakMap<any, any> {\n return checkType(value, weakMapTag);\n}\n\nexport default isWeakMap;\n","import { checkType } from './internals/checkType';\nimport { weakSetTag } from './internals/native';\n\n/**\n * 检查值是否为 `WeakSet` 对象。\n *\n * @static\n * @alias module:Language.isWeakSet\n * @since 1.0.0\n * @param {*} value 要检查的值。\n * @returns {boolean} 如果值为 `WeakSet` 对象,返回 `true` ,否则返回 `false` 。\n * @example\n *\n * isWeakSet(new WeakSet); // true\n *\n * isWeakSet(new Set); // false\n *\n */\nfunction isWeakSet(value: any): value is WeakSet<any> {\n return checkType(value, weakSetTag);\n}\n\nexport default isWeakSet;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为连接符小写。\n *\n * @static\n * @alias module:String.kebabCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Letter_case#Special_case_styles | kebab case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * kebabCase('foo bar'); // 'foo-bar'\n *\n * kebabCase('foo-bar'); // 'foo-bar'\n *\n * kebabCase('Foo Bar'); // 'foo-bar'\n *\n * kebabCase('FOO BAR'); // 'foo-bar'\n *\n * kebabCase('--FOO-BAR--'); // 'foo-bar'\n *\n * kebabCase('__FOO_BAR__'); // 'foo-bar'\n *\n */\nfunction kebabCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? '-' : '') + cur.toLowerCase(), '');\n}\n\nexport default kebabCase;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个组成聚合对象, `key` 是经过 `iteratee` 执行处理 `collection` 中每个元素后返回的结果。每个 `key` 对应的值是生成 `key` 的最后一个元素。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * @static\n * @alias module:Collection.keyBy\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [iteratee] 迭代函数,用来转换键。\n * @returns {Object} 组成聚合对象。\n * @example\n *\n * keyBy([6, 4, 6]); // {'6': 6, '4': 4}\n *\n * keyBy([6.1, 4.2, 6.3], Math.floor); // {'6': 6.3, '4': 4.2}\n *\n * keyBy([{n: 6.1}, {n: 4.2}, {n: 6.3}], item=>Math.floor(item.n)); // {'6': {n: 6.3}, '4': {n: 4.2}}\n *\n * // 迭代函数可以直接写入属性。\n * keyBy(['one', 'two', 'three'], 'length'); // {'3': 'two', '5': 'three'}\n *\n */\nfunction keyBy<T, F extends (value: T) => any, K extends keyof T>(collection: T[], iteratee?: F | K) {\n const result: Record<string | number | symbol, T> = {};\n\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n collection.forEach((item) => {\n const key = internalIteratee(item);\n result[key] = item;\n });\n }\n return result;\n}\n\nexport default keyBy;\n","import getKeysIn from './internals/getKeysIn';\nimport isObject from './isObject';\n\n/**\n * 创建一个数组,包含对象自身及继承的可枚举属性(不包含 `Symbol` 属性)。\n *\n * 同 `key...in` 。\n *\n * @static\n * @alias module:Object.keysIn\n * @since 1.1.0\n * @param {Object} object 要查询的对象。\n * @returns {string[]} 对象自身及继承的可枚举属性名(不包含 `Symbol` 属性)数组。\n * @example\n *\n * function Foo(){\n * this.a = 1;\n * this[Symbol.for('b')] = 2;\n * }\n * Foo.prototype.c = 3;\n * Foo.prototype[Symbol.for('d')] = 4;\n *\n * keysIn(new Foo); // ['a', 'c']\n *\n */\nfunction keysIn<T extends object>(object: T) {\n if (!isObject(object)) {\n return [];\n }\n return getKeysIn(object);\n}\n\nexport default keysIn;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为空格分隔的小写单词。\n *\n * @static\n * @alias module:String.lowerCase\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 小写字符串。\n * @example\n *\n * lowerCase('foo bar'); // 'foo bar'\n *\n * lowerCase('foo-bar'); // 'foo bar'\n *\n * lowerCase('Foo Bar'); // 'foo bar'\n *\n * lowerCase('FOO BAR'); // 'foo bar'\n *\n * lowerCase('--FOO-BAR--'); // 'foo bar'\n *\n * lowerCase('__FOO_BAR__'); // 'foo bar'\n *\n */\nfunction lowerCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? ' ' : '') + cur.toLowerCase(), '');\n}\n\nexport default lowerCase;\n","import createCaseFirst from './internals/createCaseFirst';\n\n/**\n * 转换字符串第一个字符为小写。\n *\n * @static\n * @alias module:String.lowerFirst\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * lowerFirst('Bar'); // 'bar'\n *\n * lowerFirst('BAR'); // 'bAR'\n *\n */\nfunction lowerFirst(string: string) {\n return createCaseFirst('toLowerCase')(string);\n}\n\nexport default lowerFirst;\n","import { baseLte, createOperation } from './internals/comparator';\n\n/**\n * 检查 `value` 是否小于或等于 `other` 。\n *\n * @static\n * @alias module:Util.lte\n * @since 1.0.0\n * @param {*} value 要比较的值。\n * @param {*} other 另一个要比较的值。\n * @returns {boolean} 如果 `value` 小于或等于 `other` 返回 `true` ,否则返回 `false` 。\n * @example\n *\n * lte(1, 3); // true\n *\n * lte(3, 3); // true\n *\n * lte(3, 1); // false\n *\n */\nfunction lte(value: any, other: any) {\n return createOperation(baseLte)(value, other);\n}\n\nexport default lte;\n","import gt from './gt';\nimport identity from './identity';\nimport createExtremum from './internals/createExtremum';\n\n/**\n * 调用 `array` 中的每一个元素,来生成其值排序的标准,返回最大的值。\n *\n * `iteratee` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Math.max\n * @since 1.0.0\n * @param {Array} array 要迭代的数组。\n * @param {Function | string} [iteratee=identity] 调用每个元素的迭代函数。\n * @returns {*} 最大的值。\n * @example\n *\n * const array = [1, 2, 3];\n *\n * max(array); // 3\n *\n * const objects = [{n: 1}, {n: 2}];\n *\n * max(objects, item => item.n); // {n: 2}\n *\n * // 迭代函数可以直接写入属性。\n * max(objects, 'n'); // {n: 2};\n *\n */\nfunction max<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K = identity as any\n) {\n return createExtremum(array, iteratee, gt);\n}\n\nexport default max;\n","import identity from './identity';\nimport createExtremum from './internals/createExtremum';\nimport lt from './lt';\n\n/**\n * 调用 `array` 中的每一个元素,来生成其值排序的标准,返回最小的值。\n *\n * `iteratee` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Math.min\n * @since 1.0.0\n * @param {Array} array 要迭代的数组。\n * @param {Function | string} [iteratee=identity] 调用每个元素的迭代函数。\n * @returns {*} 最小的值。\n * @example\n *\n * const array = [1, 2, 3];\n *\n * min(array); // 1\n *\n * const objects = [{n: 1}, {n: 2}];\n *\n * min(objects, item => item.n); // {n: 1}\n *\n * // 迭代函数可以直接写入属性。\n * min(objects, 'n'); // {n: 1};\n */\nfunction min<T, F extends (item: T) => any, K extends keyof T>(\n array: T[],\n iteratee: F | K = identity as any\n) {\n return createExtremum(array, iteratee, lt);\n}\n\nexport default min;\n","/**\n * 空函数,返回 `undefined` 。\n *\n * @static\n * @alias module:Util.noop\n * @since 1.0.0\n * @example\n *\n * noop(); // undefined\n *\n */\nfunction noop() {}\n\nexport default noop;\n","import nth from './nth';\n\n/**\n * 创建一个函数,该函数返回第 `n` 个参数。如果 `n` 为负数,则返回从结尾开始的第 `n` 个参数。\n *\n * @static\n * @alias module:Util.nthArg\n * @since 1.0.0\n * @param {number} [n=0] 要返回参数的索引值。\n * @returns 新函数。\n * @example\n *\n * const func1 = nthArg(1);\n *\n * func1('a', 'b', 'c', 'd'); // 'b'\n *\n * const func2 = nthArg(-2);\n *\n * func2('a', 'b', 'c', 'd'); // 'c'\n *\n */\nfunction nthArg(n = 0) {\n return function (...args: any[]) {\n return nth(args, n);\n };\n}\n\nexport default nthArg;\n","import allKeysIn from './allKeysIn';\nimport castArray from './castArray';\n\n/**\n * 创建一个对象,该对象由忽略属性之外的 `object` 自身和继承的可枚举属性组成。与 [`pick`](#.pick) 相反。\n *\n * @static\n * @alias module:Object.omit\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {string | string[]} [fields] 要被忽略的属性。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * // 浅拷贝对象\n * omit(obj); // { name: \"jeff\", age: 18 }\n *\n * // 排除单个属性\n * omit(obj, 'name'); // { age: 18 }\n *\n * // 排除多个属性\n * omit(obj, ['name', 'age']); // {}\n *\n */\nfunction omit<T extends object, K extends keyof T>(object: T, fields: K | K[] = []) {\n const keys = allKeysIn(object) as K[];\n const fieldArr = castArray(fields);\n const result: Record<any, any> = {};\n\n keys.forEach((key) => {\n if (!fieldArr.includes(key)) {\n result[key] = object[key];\n }\n });\n\n return result as Omit<T, K>;\n}\n\nexport default omit;\n","import negate from './negate';\nimport pickBy from './pickBy';\n\n/**\n * 创建一个对象,该对象忽略 `predicate` (断言函数)判断不是真值的属性后,`object` 自身和继承的可枚举属性组成。与 [`pickBy`](#.pickBy) 相反。\n *\n * `predicate` 调用时会传入 2 个参数 `value` `key` 。\n *\n * @static\n * @alias module:Object.omitBy\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {Function} [predicate] 调用每一个属性的函数。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * omitBy(obj); // { name: \"jeff\", age: 18 }\n *\n * omitBy(obj, (value) => typeof value === 'number'); // { name: \"jeff\" }\n *\n * omitBy(obj, (value) => value); // {}\n *\n */\nfunction omitBy<T extends object>(\n object: T,\n predicate: (value: any, key: any) => any = () => false\n) {\n return pickBy(object, negate(predicate));\n}\n\nexport default omitBy;\n","import before from './before';\n\n/**\n * 创建一个只能调用 `func` 一次的函数。重复调用将返回第一次调用 `func` 的结果。\n *\n * @static\n * @alias module:Function.once\n * @since 1.2.0\n * @requires module:Function.before\n * @param {Function} func 限制执行的函数。\n * @returns {Function} 新的限定函数。\n * @example\n *\n * let count = 0;\n *\n * const increment = _.once(()=>{\n * return ++count;\n * });\n *\n * increment(); // 1\n * increment(); // 1\n * increment(); // 1\n *\n */\nfunction once<T extends (...args: any[]) => any>(func: T) {\n return before(2, func);\n}\n\nexport default once;\n","function partial<TS extends any[], R>(func: (...ts: TS) => R): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, R>(\n func: (t1: T1, ...ts: TS) => R,\n arg1: T1\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, R>(\n func: (t1: T1, t2: T2, ...ts: TS) => R,\n t1: T1,\n t2: T2\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, R>(\n func: (t1: T1, t2: T2, t3: T3, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, T9, R>(\n func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, ...ts: TS) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9\n): (...ts: TS) => R;\nfunction partial<TS extends any[], T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>(\n func: (\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9,\n t10: T10,\n ...ts: TS\n ) => R,\n t1: T1,\n t2: T2,\n t3: T3,\n t4: T4,\n t5: T5,\n t6: T6,\n t7: T7,\n t8: T8,\n t9: T9,\n t10: T10\n): (...ts: TS) => R;\n/**\n * 创建一个函数。该函数调用 `func` ,并传入预设的 `args` 参数。\n *\n * @static\n * @alias module:Function.partial\n * @since 1.0.0\n * @param {Function} func 需要预设的函数。\n * @param {...*} [args] 预设的参数。\n * @returns {Function} 预设参数的函数。\n * @example\n *\n * function greet(greeting, name){\n * return greeting + ' ' + name;\n * }\n *\n * const sayHelloTo = partial(greet, 'hello');\n *\n * sayHelloTo('jeff'); // 'hello jeff'\n *\n */\nfunction partial(func: any, ...args: any[]) {\n return function (...remainingArgs: any[]) {\n // @ts-ignore\n return func.apply(this, args.concat(remainingArgs));\n };\n}\n\nexport default partial;\n","import createIteratee from './internals/createIteratee';\nimport isArray from './isArray';\n\n/**\n * 创建一个分成两组的元素数组,第一组包含 `predicate`(断言函数)返回为 [`truthy`](https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy)(真值)的元素,第二组包含 `predicate`(断言函数)返回为 [`falsy`](https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy)(假值)的元素。\n *\n * `predicate` 调用时会传入 1 个参数 `value`。\n *\n * @static\n * @alias module:Collection.partition\n * @since 1.0.0\n * @param {Array} collection 一个用来迭代的集合。\n * @param {Function | string} [predicate=identity] 每次迭代调用的断言函数。\n * @returns {Array} 分组后的数组。\n * @example\n *\n * const users = [\n * { user: 'barney', age: 36, active: false },\n * { user: 'fred', age: 40, active: true },\n * { user: 'pebbles', age: 1, active: false }\n * ];\n *\n * partition(users, item => item.active);\n * // [\n * // [{ user: 'fred', age: 40, active: true }],\n * // [{ user: 'barney', age: 36, active: false }, { user: 'pebbles', age: 1, active: false }]\n * // ]\n *\n * // 迭代函数可以直接写入属性。\n * partition(users, 'active');\n * // [\n * // [{ user: 'fred', age: 40, active: true }],\n * // [{ user: 'barney', age: 36, active: false }, { user: 'pebbles', age: 1, active: false }]\n * // ]\n *\n */\nfunction partition<T, F extends (value: T) => any, K extends keyof T>(collection: T[], predicate?: F | K) {\n const result: [T[], T[]] = [[], []];\n if (isArray(collection)) {\n const internalIteratee = createIteratee<T, F, K>(predicate);\n collection.forEach((item) => {\n result[internalIteratee(item) ? 0 : 1].push(item);\n });\n }\n return result;\n}\n\nexport default partition;\n","import castArray from './castArray';\n\n/**\n * 创建一个从 `object` 选中的属性的对象。\n *\n * 允许选取对象的所有属性(包含不可枚举属性)。\n *\n * @static\n * @alias module:Object.pick\n * @since 1.0.0\n * @param {Object} object 来源对象。\n * @param {string | string[]} [fields] 选中的属性。\n * @returns {Object} 新对象。\n * @example\n *\n * const obj = { name: \"jeff\", age: 18 };\n *\n * pick(obj); // {}\n *\n * // 选取单个属性\n * pick(obj, 'name'); // { name: \"jeff\" }\n *\n * // 选取多个属性\n * pick(obj, ['name', 'age']); // { name: \"jeff\", age: 18 }\n */\nfunction pick<T extends object, K extends keyof T>(object: T, fields: K | K[] = []) {\n const result: Record<any, any> = {};\n const fieldArr = castArray(fields);\n\n fieldArr.forEach((field) => {\n if (field in object) {\n result[field] = object[field];\n }\n });\n\n return result as Pick<T, K>;\n}\n\nexport default pick;\n","import toFinite from './toFinite';\n\n/**\n * 产生一个包含 `lower` 与 `upper` 之间的随机浮点数。\n *\n * 如果 `lower` 大于 `upper` 会自动交换参数。\n *\n * @static\n * @alias module:Number.random\n * @since 1.0.0\n * @param {number} [lower=0] 下限。\n * @param {number} [upper=1] 上限。\n * @returns {number} 随机浮点数。\n * @example\n *\n * random(); // 0 到 1 之间的浮点数\n *\n * random(2, 4); // 2 到 4 之间的浮点数\n *\n * random(4, 2); // 2 到 4 之间的浮点数\n *\n * random(1.2, 2.4); // 1.2 到 2.4 之间的浮点数\n *\n */\nfunction random(lower = 0, upper = 1) {\n lower = toFinite(lower);\n upper = toFinite(upper);\n const min = Math.min(lower, upper);\n const max = Math.max(lower, upper);\n return min + Math.random() * (max - min);\n}\n\nexport default random;\n","import decimalAdjust from './internals/decimalAdjust';\n\n/**\n * 根据精度四舍五入 `number` 。\n *\n * 注:精度可以理解为保留几位小数。\n *\n * @static\n * @alias module:Math.round\n * @since 1.0.0\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round#小数舍入 | 小数舍入}\n * @param {number} number 要四舍五入的值。\n * @param {number} [precision=0] 四舍五入的精度。\n * @returns {number} 四舍五入的值。\n * @example\n *\n * round(4.16); // 4\n *\n * round(4.16, 1); // 4.2\n *\n * round(4160, -2); // 4200\n */\nfunction round(number: number, precision?: number) {\n return decimalAdjust('round', number, precision);\n}\n\nexport default round;\n","import isArray from './isArray';\nimport randomInt from './randomInt';\n\n/**\n * 创建一个被打乱的数组。使用 [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) 版本。\n *\n * @static\n * @alias module:Array.shuffle\n * @since 1.0.0\n * @param {Array} array 要打乱的数组。\n * @returns {Array} 打乱的数组。\n * @example\n *\n * shuffle([1, 2, 3, 4]); // [2, 4, 3, 1]\n *\n * shuffle([1, 2, 3, 4]); // [3, 2, 1, 4]\n *\n */\nfunction shuffle<T>(array: T[]) {\n if (!isArray(array) || array.length < 1) {\n return [];\n }\n\n const result = array.slice();\n const length = result.length;\n const lastIndex = length - 1;\n let index = -1;\n\n while (++index < length) {\n const rand = randomInt(index, lastIndex);\n const value = result[rand];\n result[rand] = result[index];\n result[index] = value;\n }\n\n return result;\n}\n\nexport default shuffle;\n","/**\n * 异步方法中等待时间后继续执行。\n *\n * @static\n * @alias module:Util.sleep\n * @since 1.0.0\n * @param {number} [ms=1000] 等待时间,单位毫秒。\n * @returns {Promise<void>} 异步对象。\n * @example\n *\n * async ()=>{\n * await sleep();\n * // do something\n * }\n *\n * sleep(300).then(()=>{\n * // do something\n * })\n *\n */\nfunction sleep(ms = 1000): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport default sleep;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为下划线小写。\n *\n * @static\n * @alias module:String.snakeCase\n * @since 1.0.0\n * @see {@link https://en.wikipedia.org/wiki/Snake_case | snake case}\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 转换后的字符串。\n * @example\n *\n * snakeCase('foo bar'); // 'foo_bar'\n *\n * snakeCase('foo-bar'); // 'foo_bar'\n *\n * snakeCase('Foo Bar'); // 'foo_bar'\n *\n * snakeCase('FOO BAR'); // 'foo_bar'\n *\n * snakeCase('--FOO-BAR--'); // 'foo_bar'\n *\n * snakeCase('__FOO_BAR__'); // 'foo_bar'\n *\n */\nfunction snakeCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? '_' : '') + cur.toLowerCase(), '');\n}\n\nexport default snakeCase;\n","import baseDebounce from './internals/baseDebounce';\n\n/**\n * 创建一个节流函数,该函数在 `wait` 毫秒数内最多执行一次 `func` 方法。\n *\n * 节流函数还提供以下方法:\n * 1. `cancel` 方法取消延迟的函数调用。\n * 2. `flush` 方法立即调用。\n * 3. `pending` 方法是否在等待函数执行。\n *\n * @static\n * @alias module:Function.throttle\n * @since 1.0.0\n * @param {Function} func 要节流的函数。\n * @param {number} [wait=0] 需要节流的毫秒数。\n * @param {boolean} [immediate=true] 是否在节流开始前调用。\n * @returns 节流函数。\n * @example\n *\n * function updatePosition(e){\n * console.log('update position event: ', e);\n * }\n *\n * // 避免在滚动时频繁的更新定位。\n * window.addEventListener('scroll', throttle(updatePosition, 100));\n *\n * const throttled = throttle(()=>{\n * // do something\n * }\n *\n * // 点击按钮, 300 毫秒内最多执行一次。\n * document.querySelector('button').addEventListener('click', throttled, 300));\n *\n * // 取消节流调用。\n * window.addEvenetListener('popstate', throttled.cancel);\n *\n */\nfunction throttle<T extends (...args: any[]) => any>(func: T, wait = 0, immediate = true) {\n return baseDebounce(func, wait, immediate, true);\n}\n\nexport default throttle;\n","import identity from './identity';\nimport { MAX_ARRAY_LENGTH, MAX_SAFE_INTEGER } from './internals/native';\nimport isInteger from './isInteger';\nimport isFinite from './isFinite';\n\nfunction times<T>(n: number, iteratee: (index: number) => T): T[];\nfunction times(n: number): number[];\n/**\n * 调用 `iteratee` `n` 次,每次调用返回的结果存入到数组中。\n *\n * `iteratee` 调用传入 1 个参数 `index` 。\n *\n * @static\n * @alias module:Util.times\n * @since 1.0.0\n * @param {number} n 调用 `iteratee` 的次数。\n * @param {Function} [iteratee=identity] 每次迭代调用的函数。\n * @returns {Array} 调用结果的数组。\n * @example\n *\n * times(3); // [0, 1, 2]\n *\n * times(3, String); // ['0', '1', '2']\n *\n * times(4, () => 0); // [0, 0, 0, 0]\n *\n */\nfunction times<T>(n: number, iteratee = identity): T[] {\n if (n < 1 || n > MAX_SAFE_INTEGER) {\n return [];\n }\n\n let index = 0;\n const length = Math.min(isInteger(n) ? n : Math.floor(isFinite(n) ? n : 0), MAX_ARRAY_LENGTH);\n const result = Array(length);\n const func = typeof iteratee === 'function' ? iteratee : identity;\n\n while (index < length) {\n result[index] = func(index);\n index++;\n }\n\n return result;\n}\n\nexport default times;\n","import { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './internals/native';\nimport toInteger from './toInteger';\n\n/**\n * 转换 `value` 为一个安全整数。\n *\n * @static\n * @alias module:Util.toSafeInteger\n * @since 1.0.0\n * @param {*} value 要转换的值。\n * @returns {number} 转换后的整数。\n * @example\n *\n * toSafeInteger(3.2); // 3\n *\n * toSafeInteger('3.2'); // 3\n *\n * toSafeInteger(-0); // -0\n *\n * toSafeInteger('-0'); // -0\n *\n * toSafeInteger('0'); // 0\n *\n * toSafeInteger(NaN); // 0\n *\n * toSafeInteger(Infinity); // 9007199254740991\n *\n * toSafeInteger(-Infinity); // -9007199254740991\n *\n */\nfunction toSafeInteger(value: any): number {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toInteger(value);\n if (value > MAX_SAFE_INTEGER) {\n return MAX_SAFE_INTEGER;\n }\n if (value < MIN_SAFE_INTEGER) {\n return MIN_SAFE_INTEGER;\n }\n return value;\n}\n\nexport default toSafeInteger;\n","import splitCaseWords from './internals/splitCaseWords';\n\n/**\n * 转换字符串为空格分隔的大写单词。\n *\n * @static\n * @alias module:String.upperCase\n * @since 1.0.0\n * @param {string} string 要转换的字符串。\n * @param {RegExp | string} [pattern] 拆分词组的匹配模式。\n * @returns {string} 大写字符串。\n * @example\n *\n * upperCase('foo bar'); // 'FOO BAR'\n *\n * upperCase('foo-bar'); // 'FOO BAR'\n *\n * upperCase('Foo Bar'); // 'FOO BAR'\n *\n * upperCase('FOO BAR'); // 'FOO BAR'\n *\n * upperCase('--FOO-BAR--'); // 'FOO BAR'\n *\n * upperCase('__FOO_BAR__'); // 'FOO BAR'\n *\n */\nfunction upperCase(string: string, pattern?: RegExp | string) {\n return splitCaseWords(string, pattern).reduce((prev, cur, index) => prev + (index ? ' ' : '') + cur.toUpperCase(), '');\n}\n\nexport default upperCase;\n","import difference from './difference';\nimport createIteratee from './internals/createIteratee';\nimport intersection from './intersection';\nimport isArray from './isArray';\nimport union from './union';\nimport uniq from './uniq';\n\n/**\n * 创建一个唯一值的数组(并集-交集),该数组包含 2 个数组参数中不相同的元素。如果传入迭代函数,会调用数组的每个元素以产生唯一性计算的标准。\n *\n * `iteratee` 调用时会传入 1 个参数 `value` 。\n *\n * 默认使用了 [`SameValueZero`](https://tc39.es/ecma262/#sec-samevaluezero) 做等值比较。如果 `strictCheck=true` 将使用 [`SameValue`](https://tc39.es/ecma262/#sec-samevalue) 做等值比较。\n *\n * @static\n * @alias module:Array.xor\n * @since 1.0.0\n * @param {Array} array 要检查的数组。\n * @param {Array} [other=[]] 另一个要检查的数组。\n * @param {Function | string} [iteratee] 迭代函数,调用每个元素。\n * @param {boolean} [strictCheck=false] 严格比较,区分 `0` `-0`,默认 `false` 。\n * @returns {Array} 过滤值后的新数组。\n * @example\n *\n * xor([2, 1, 1], [4, 2]); // [1, 4]\n *\n * xor([2.1, 1.2], [4.3, 2.4], Math.floor); // [1.2, 4.3]\n *\n * xor([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], item=>item.x); // [{x: 2}]\n *\n * // 迭代函数可以直接写入属性。\n * xor([{x: 1}, {x: 1}, {x: 2}, {x: 2}], [{x: 1}], 'x'); // [{x: 2}]\n *\n * xor([-0, 0],[0]); // []\n *\n * xor([-0, 0],[0], undefined, true); // [-0]\n *\n */\nfunction xor<T, F extends (value: T) => any, K extends keyof T>(array: T[], other: T[] = [], iteratee?: F | K, strickCheck = false) {\n if (!isArray(array) && !isArray(other)) {\n return [];\n }\n const internalIteratee = createIteratee<T, F, K>(iteratee);\n if (!isArray(other)) {\n return uniq(array, internalIteratee, strickCheck);\n }\n if (!isArray(array)) {\n return uniq(other, internalIteratee, strickCheck);\n }\n return difference(\n union(array, other, internalIteratee, strickCheck),\n intersection(array, other, internalIteratee, strickCheck),\n internalIteratee,\n strickCheck\n );\n}\n\nexport default xor;\n","import unzip from './unzip';\n\n/**\n * 创建一个数组,数组的第一个元素包含所有给定数组的第一元素,第二个元素包含了所有给定数组的第二元素,依此类推。\n *\n * @static\n * @alias module:Array.zip\n * @since 1.0.0\n * @param {Array} array 要处理的分组元素数组。\n * @returns {Array} 重组元素的新数组。\n * @example\n *\n * zip(['barney', 'fred'], [36, 40]); // [['barney', 36], ['fred', 40]]\n *\n */\nfunction zip(...arrays: any[][]) {\n return unzip(arrays);\n}\n\nexport default zip;\n"],"names":["isArray","value","Array","freeGlobalThis","globalThis","Object","freeGlobal","global","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","hasOwnProperty","propertyIsEnumerable","functionToString","objectCtorString","call","symbolProto","Symbol","undefined","symbolValueOf","valueOf","symToStringTag","toStringTag","arrayProto","arrSlice","slice","MAX_SAFE_INTEGER","Number","MIN_SAFE_INTEGER","MAX_ARRAY_LENGTH","blobExisted","Blob","toSource","func","e","wrapTags","tags","map","item","numberTag","booleanTag","stringTag","dateTag","regExpTag","symbolTag","errorTag","arrayBufferTag","argumentsTag","arrayTag","typedArrayTags","functionTags","objectTag","dataViewTag","mapTag","promiseTag","setTag","weakMapTag","dataViewExisted","DataView","mapExisted","Map","promiseExisted","Promise","setExisted","Set","weakMapExisted","WeakMap","initSource","existed","str","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","isObject","type","_getTag","isOwn","tag","unmasked","result","getRawTag","getTag","ArrayBuffer","resolve","Ctor","constructor","ctorString","getTag$1","checkType","checkTypes","some","isSymbol","reIsBinary","reIsOctal","reIsBadHex","toNumber","NaN","trim","isBinary","test","parseInt","toInteger","Infinity","remainder","toLength","eq","other","strictCheck","createIteratee","iteratee","difference","array","values","internalIteratee","filter","current","findIndex","intersection","caches","includes","push","supportedArgumentsType","arguments","FUNC_ERROR_TEXT","numberIsFinite","isFinite","numberIsInteger","isInteger","numberIsSafeInteger","isSafeInteger","objectGetOwnPropertySymbols","getOwnPropertySymbols","arrayAt","at","isFunction","isLength","isArrayLike","length","nth","n","MAX_VALUE","toFinite","randomInt","lower","upper","min","Math","ceil","max","floor","temp","random","uniq","strickCheck","index","arr","union","concat","isObjectLike","isArrayLikeObject","unzip","group","identity","baseToString","compareAsc","valueIsSymbol","otherIsSymbol","valueStr","otherStr","compareDesc","orderBy","collection","iteratees","orders","forEach","criteria","sort","a","b","object","objCriteria","othCriteria","order","compareMultiple","defaultTo","defaultValue","before","TypeError","apply","this","baseDebounce","wait","immediate","__throttle__","timer","lastCallTime","lastInvokeTime","lastArgs","lastThis","invokeFunc","time","debounced","args","_i","Date","now","isInvoke","timeSinceLastCall","shouldInvoke","waitTime","clearTimeout","setTimeout","cancel","flush","pending","negate","predicate","_this","freeExports","exports","nodeType","freeModule","module","freeProcess","process","nodeUtil","types","require","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","isBuffer","Buffer","isPlainObject","proto","getPrototypeOf","keys","isPrototype","key","getSymbols","allKeys","isNil","mapToArray","setToArray","set","argToArray","arg","toBufferView","bufferSource","Uint8Array","buffer","byteOffset","byteLength","isDomNode","obj","nodeName","isEqualNode","isEqualDeep","customizer","valueStack","otherStack","valType","othType","convert","name","message","areArrays","hasCustomizer","compared","skipCtor","valCtor","othCtor","pop","isEqual","isDeepComparable","source","baseIsMatch","objStack","srcStack","stackLen","length_1","objValue","srcValue","k","src","isNumber","decimalAdjust","precision","pair","split","createOperation","comparator","baseGt","baseGte","baseLt","baseLte","gt","createExtremum","computed","lt","getKeysIn","allKeysIn","o","indexOf","getSymbolsIn","baseMerge","storage","newValue","has","newObjValue","castArray","pickBy","reAsciiWord","words","string","pattern","match","splitCaseWords","replace","createCaseFirst","methodName","upperFirst","htmlEscapes","reUnescapedHtml","reHasUnescapedHtml","RegExp","reRegExpChar","reHasRegExpChar","htmlUnescapes","reEscapedHtml","reHasEscapedHtml","conformsTo","props","i","idCounter","reduce","prev","cur","toLowerCase","number","size","resIndex","internalIteratee_1","context","chr","start","end","Error","isNaN","then","abs","fields","fieldArr","remainingArgs","field","lastIndex","rand","ms","prefix","id","toUpperCase","arrays"],"mappings":"2OAqBA,SAASA,EAAQC,GACf,OAAOC,MAAMF,QAAQC,EACvB,CCvBA,IAAME,EAAuC,iBAAfC,YAA2BA,YAAcA,WAAWC,SAAWA,QAAUD,WACjGE,EAA+B,iBAAXC,QAAuBA,QAAUA,OAAOF,SAAWA,QAAUE,OACjFC,EAA2B,iBAATC,MAAqBA,MAAQA,KAAKJ,SAAWA,QAAUI,KAElEC,EAAOP,GAAkBG,GAAcE,GAAYG,SAAS,cAATA,IAA6B,GAEhFC,EAAcP,OAAOQ,UAErBC,EAAiBF,EAAYG,SAE7BC,EAAiBJ,EAAYI,eAE7BC,EAAuBL,EAAYK,qBAEnCC,EAAmBP,SAASE,UAAUE,SAEtCI,EAAmBD,EAAiBE,KAAKf,QAEzCgB,EAAcC,OAASA,OAAOT,eAAYU,EAC1CC,EAAgBH,EAAcA,EAAYI,aAAUF,EACnCF,GAAcA,EAAYN,SACjD,IAAMW,EAAiBJ,OAASA,OAAOK,iBAAcJ,EAE/CK,EAAa1B,MAAMW,UACnBgB,EAAW3B,MAAMW,UAAUiB,MAS3BC,EAAmBC,OAAOD,kBAAoB,iBAS9CE,EAAmBD,OAAOC,mBAAqB,iBAS/CC,EAAmB,WAGnBC,EAA8B,oBAATC,KAE5B,SAAUC,EAASC,GACvB,GAAa,OAATA,EAAe,CACjB,IACE,OAAOpB,EAAiBE,KAAKkB,EAC9B,CAAC,MAAOC,GAER,CACD,IACE,OAAOD,EAAO,EACf,CAAC,MAAOC,GAER,CACF,CACD,MAAO,EACT,CAEA,SAASC,EAASC,GAChB,OAAOA,EAAKC,KAAI,SAACC,GAAS,MAAA,WAAaA,EAAO,GAApB,GAC5B,CAEO,IAAMC,EAAY,kBACZC,EAAa,mBACbC,EAAY,kBACZC,EAAU,gBACVC,EAAY,kBACZC,EAAY,kBACZC,EAAW,iBACXC,EAAiB,uBACjBC,EAAe,qBACfC,EAAW,iBACXC,EAAiBd,EAAS,CAAC,eAAgB,eAAgB,YAAa,aAAc,aAAc,aAAc,oBAAqB,cAAe,cAAe,gBAAiB,mBACtLe,EAAef,EAAS,CAAC,WAAY,gBAAiB,oBAAqB,UAM3EgB,EAAY,kBACZC,EAAc,oBACdC,EAAS,eACTC,EAAa,mBACbC,EAAS,eACTC,EAAa,mBAEbC,EAAsC,oBAAbC,SACzBC,EAA4B,oBAARC,IACpBC,EAAoC,oBAAZC,QACxBC,EAA4B,oBAARC,IACpBC,EAAoC,oBAAZC,QAExBC,EAAa,SAACC,EAAkBC,GAAgB,OAACD,EAAUC,EAAM,IAEjEC,EAAqBH,EAAWV,EAAiBzB,EAAS0B,WAC1Da,EAAgBJ,EAAWR,EAAY3B,EAAS4B,MAChDY,EAAoBL,EAAWN,EAAgB7B,EAAS8B,UACxDW,EAAgBN,EAAWJ,EAAY/B,EAASgC,MAChDU,EAAoBP,EAAWF,EAAgBjC,EAASkC,UC5FrE,SAASS,EAAS/E,GAChB,IAAMgF,SAAchF,EACpB,OAAgB,MAATA,IAA2B,WAATgF,GAA8B,aAATA,EAChD,CCuCA,SAASC,EAAQjF,GACf,OAAOyB,GAAkBA,KAAkBrB,OAAOJ,GAhCpD,SAAmBA,GACjB,IAAMkF,EAAQnE,EAAeI,KAAKnB,EAAOyB,GACnC0D,EAAMnF,EAAMyB,GACd2D,GAAW,EAEf,IACEpF,EAAMyB,QAAmBH,EACzB8D,GAAW,CACZ,CAAC,MAAO9C,GAER,CAED,IAAM+C,EAASxE,EAAeM,KAAKnB,GASnC,OAPIoF,IACEF,EACFlF,EAAMyB,GAAmB0D,SAElBnF,EAAMyB,IAGV4D,CACT,CAU6DC,CAAUtF,GAASa,EAAeM,KAAKnB,EACpG,CAEA,IAAIuF,GAASN,GAKVpB,GAAmBhD,EAAeM,KAAK,IAAI2C,SAAS,IAAI0B,YAAY,OAAShC,GAC7EO,GAAclD,EAAeM,KAAK,IAAI6C,OAAWP,GACjDQ,GAAkBpD,EAAeM,KAAK+C,QAAQuB,aAAe/B,GAC7DS,GAActD,EAAeM,KAAK,IAAIiD,OAAWT,GACjDU,GAAkBxD,EAAeM,KAAK,IAAImD,WAAeV,KAE1D2B,GAAS,SAAUvF,GACjB,IAAMqF,EAASJ,EAAQjF,GACjB0F,EAAOL,IAAW9B,EAAYvD,EAAM2F,iBAAcrE,EAClDsE,EAAaF,EAAOtD,EAASsD,GAAQ,GAE3C,GAAIE,EACF,OAAQA,GACN,KAAKlB,EACH,OAAOlB,EACT,KAAKmB,EACH,OAAOlB,EACT,KAAKmB,EACH,OAAOlB,EACT,KAAKmB,EACH,OAAOlB,EACT,KAAKmB,EACH,OAAOlB,EAIb,OAAOyB,CACT,GAGF,IAAAQ,GAAeN,GClGC,SAAAO,GAAU9F,EAAYmF,GACpC,OAAOI,GAAOvF,KAAWmF,CAC3B,CAGgB,SAAAY,GAAW/F,EAAYwC,GACrC,IAAM2C,EAAMI,GAAOvF,GACnB,OAAOwC,EAAKwD,MAAK,SAACtD,GAAS,OAAAyC,IAAQzC,CAAR,GAC7B,CCSA,SAASuD,GAASjG,GAChB,MAAwB,iBAAVA,GAAsB8F,GAAU9F,EAAOgD,EACvD,CCnBA,IAAMkD,GAAa,aAEbC,GAAY,cAKZC,GAAa,qBA6BnB,SAASC,GAASrG,GAChB,GAAqB,iBAAVA,EACT,OAAOA,EAET,GAAIiG,GAASjG,GACX,OAAOsG,IAKT,GAHIvB,EAAS/E,KACXA,EAAQ+B,OAAO/B,IAEI,iBAAVA,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQA,EAAMuG,OACd,IAAMC,EAAWN,GAAWO,KAAKzG,GAEjC,OAAOwG,GAAYL,GAAUM,KAAKzG,GAC9B0G,SAAS1G,EAAM6B,MAAM,GAAI2E,EAAW,EAAI,GACxCJ,GAAWK,KAAKzG,GAChBsG,KACCtG,CACP,CC7BA,SAAS2G,GAAU3G,GACjB,IAAMqF,EAASgB,GAASrG,GAGxB,IAAKqF,GAAUA,IAAWuB,KAAYvB,KAAYuB,IAChD,OAAOvB,GAAWA,EAASA,EAAS,EAEtC,IAAMwB,EAAYxB,EAAS,EAC3B,OAAOwB,EAAYxB,EAASwB,EAAYxB,CAC1C,CCTA,SAASyB,GAAS9G,GAEhB,OADAA,EAAQ2G,GAAU3G,IAIdA,EAAQ,EACH,EAELA,EAAQiC,EACHA,EAEFjC,EARE,CASX,CCXA,SAAS+G,GAAG/G,EAAYgH,EAAYC,GAClC,YADkC,IAAAA,IAAAA,GAAmB,GACjDjH,IAAUgH,GACLC,IAAwB,IAAVjH,GAAe,EAAIA,GAAU,EAAIgH,GAEjDhH,GAAUA,GAASgH,GAAUA,CACtC,CC5BA,SAASE,GAAkEC,GACzE,MAAwB,mBAAbA,EACFA,EAGe,iBAAbA,GAA6C,iBAAbA,GAAyBlB,GAASkB,GACpE,SAACnH,GAAe,OAAAA,EAAMmH,EAAN,EAElB,SAACnH,GAAe,OAAAA,CAAK,CAC9B,CCiBA,SAASoH,GAA8DC,EAAYC,EAAeH,EAAkBF,GAClH,QADkH,IAAAA,IAAAA,GAAmB,IAChIlH,EAAQsH,GACX,MAAO,GAGT,IAAKtH,EAAQuH,GACX,OAAOD,EAGT,IAAME,EAAmBL,GAAwBC,GACjD,OAAOE,EAAMG,QAAO,SAAC9E,GACnB,IAAM+E,EAAUF,EAAiB7E,GAGjC,OAA2F,IAApF4E,EAAOI,WAAU,SAAC1H,GAAU,OAAA+G,GAAGQ,EAAiBvH,GAAQyH,EAASR,EAArC,GACrC,GACF,CChBA,SAASU,GAAgEN,EAAYL,EAAYG,EAAkBF,GACjH,QADiH,IAAAA,IAAAA,GAAmB,IAC/HlH,EAAQsH,KAAWtH,EAAQiH,GAC9B,MAAO,GAGT,IAAMO,EAAmBL,GAAwBC,GAC3CS,EAAgB,GACtB,OAAOP,EAAMG,QAAO,SAAC9E,GACnB,IAAM+E,EAAUF,EAAiB7E,GAEjC,OAAuF,IAAnFsE,EAAMU,WAAU,SAAC1H,GAAU,OAAA+G,GAAGQ,EAAiBvH,GAAQyH,EAASR,EAAY,MAAaW,EAAOC,SAASJ,KAC3GG,EAAOE,KAAKL,IACL,EAGX,GACF,CC3CO,IAAMM,GAAyBjC,GAAU,WAAO,OAAAkC,SAAS,CAAhB,GAAqB7E,GAExD8E,GAAkB,sBAElBC,GAAiBnG,OAAOoG,SACxBC,GAAkBrG,OAAOsG,UACzBC,GAAsBvG,OAAOwG,cAE7BC,GAA8BpI,OAAOqI,sBAErCC,GAAU/G,EAAWgH,GCGlC,SAASC,GAAW5I,GAClB,QAAK+E,EAAS/E,IAGP+F,GAAW/F,EAAOsD,EAC3B,CCJA,SAASuF,GAAS7I,GAChB,MAAwB,iBAAVA,GAAsBA,GAAS,GAAKA,EAAQ,GAAM,GAAKA,GAAS8B,CAChF,CCAA,SAASgH,GAAY9I,GACnB,OAAgB,MAATA,GAAiB6I,GAAS7I,EAAM+I,UAAYH,GAAW5I,EAChE,CCHA,SAASgJ,GAAa3B,EAAY4B,GAChC,QADgC,IAAAA,IAAAA,EAAK,GAChCH,GAAYzB,GAIjB,MAAuB,mBAAZqB,GACFA,GAAQvH,KAAKkG,EAAO4B,GAGtB5B,EADO4B,EAAI,EAAIA,EAAI5B,EAAM0B,OAASE,EAE3C,CC/BA,IAAMC,GAAY,sBA6BlB,SAASC,GAASnJ,GAChB,OAAKA,GAGLA,EAAQqG,GAASrG,MACH4G,KAAY5G,KAAW4G,KACtB5G,EAAQ,GAAK,EAAI,GAChBkJ,GAETlJ,GAAUA,EAAQA,EAAQ,EAPd,IAAVA,EAAcA,EAAQ,CAQjC,CCjBA,SAASoJ,GAAUC,EAAWC,QAAX,IAAAD,IAAAA,EAAS,QAAE,IAAAC,IAAAA,EAAS,GACrCD,EAAQF,GAASE,GACjBC,EAAQH,GAASG,GACjB,IAAIC,EAAMC,KAAKC,KAAKD,KAAKD,IAAIF,EAAOC,IAAU,GAC1CI,EAAMF,KAAKG,MAAMH,KAAKE,IAAIL,EAAOC,IAAU,GAG/C,GAAIC,EAAMG,EAAK,CAEb,IAAME,EAAOL,EACbA,EAAMG,EACNA,EAAME,CACP,CAED,OAAOJ,KAAKG,MAAMJ,EAAMC,KAAKK,UAAYH,EAAMH,EAAM,GACvD,CCLA,SAASO,GAAwDzC,EAAYF,EAAkB4C,GAC7F,QAD6F,IAAAA,IAAAA,GAAmB,IAC3GhK,EAAQsH,GACX,MAAO,GAGT,IAAME,EAAmBL,GAAwBC,GACjD,OAAOE,EAAMG,QAAO,SAACxH,EAAOgK,EAAOC,GACjC,IAAMxC,EAAUF,EAAiBvH,GACjC,OAAOiK,EAAIvC,WAAU,SAAChF,GAAS,OAAAqE,GAAGQ,EAAiB7E,GAAO+E,EAASsC,EAAY,MAAMC,CACvF,GACF,CCVA,SAASE,GAAyD7C,EAAYL,EAAiBG,EAAkB4C,GAG/G,YAH4E,IAAA/C,IAAAA,EAAe,SAAoB,IAAA+C,IAAAA,GAAmB,GAClI1C,EAAQtH,EAAQsH,GAASA,EAAQ,GACjCL,EAAQjH,EAAQiH,GAASA,EAAQ,GAC1B8C,GAAKzC,EAAM8C,OAAOnD,GAAQG,EAAU4C,EAC7C,CCjBA,SAASK,GAAapK,GACpB,OAAgB,MAATA,GAAkC,iBAAVA,CACjC,CCDA,SAASqK,GAAkBrK,GACzB,OAAOoK,GAAapK,IAAU8I,GAAY9I,EAC5C,CCNA,SAASsK,GAAMjD,GACb,IAAKtH,EAAQsH,IAA2B,IAAjBA,EAAM0B,OAC3B,MAAO,GAET,IAAIA,EAAS,EACb1B,EAAQA,EAAMG,QAAO,SAAC+C,GACpB,QAAIF,GAAkBE,KACpBxB,EAASS,KAAKE,IAAIa,EAAMxB,OAAQA,IACzB,EAGX,IAGA,IAFA,IAAM1D,EAASpF,MAAM8I,GACjBiB,GAAS,IACJA,EAAQjB,GAAQ,CACvB,IAAMrG,EAAO2E,EAAM5E,KAAI,SAAC8H,GAAU,OAAAA,EAAMP,EAAN,IAClC3E,EAAO2E,GAAStH,CACjB,CACD,OAAO2C,CACT,CCnBA,SAASmF,GAAYxK,GACnB,OAAOA,CACT,CCjBA,SAASyK,GAAazK,GACpB,GAAqB,iBAAVA,EACT,OAAOA,EAET,GAAID,EAAQC,GACV,MAAO,GAAAmK,OAAGnK,EAAMyC,IAAIgI,KAEtB,GAAIxE,GAASjG,GACX,OAAOA,EAAMc,WAEf,IAAMuE,EAAS,GAAKrF,EACpB,MAAiB,KAAVqF,GAAiB,EAAIrF,IAAW4G,IAAW,KAAOvB,CAC3D,CAwBA,SAASvE,GAASd,GAChB,OAAgB,MAATA,EAAgB,GAAKyK,GAAazK,EAC3C,CCtCgB,SAAA0K,GAAW1K,EAAYgH,GACrC,IAAM2D,EAAgB1E,GAASjG,GACzB4K,EAAgB3E,GAASe,GACzB6D,EAAW/J,GAASd,GACpB8K,EAAWhK,GAASkG,GAE1B,OAAK4D,IAAkBD,GAAiBE,EAAWC,GAC1C,GAEJH,IAAkBC,GAAiBC,EAAWC,IACzC,EAEH,CACT,CAEgB,SAAAC,GAAY/K,EAAYgH,GACtC,IAAM2D,EAAgB1E,GAASjG,GACzB4K,EAAgB3E,GAASe,GACzB6D,EAAW/J,GAASd,GACpB8K,EAAWhK,GAASkG,GAE1B,OAAK4D,IAAkBD,GAAiBE,EAAWC,IACzC,GAELH,IAAkBC,GAAiBC,EAAWC,GAC1C,EAEF,CACT,CCYA,SAASE,GAA2DC,EAAiBC,EAA+BC,GAClH,IAAM9F,EAAyB,GAgB/B,OAdA6F,EAAanL,EAAQmL,GAAaA,OAA0B5J,IAAd4J,EAA0B,CAACA,GAAa,CAACV,IACvFW,EAAUpL,EAAQoL,GAAUA,OAAoB7J,IAAX6J,EAAuB,CAACA,GAAU,GAEnEpL,EAAQkL,IACVA,EAAWG,SAAQ,SAAC1I,EAAMsH,GACxB,IAAMqB,EAAYH,EAAwBzI,KAAI,SAAC0E,GAAa,OAAAD,GAAwBC,EAAxBD,CAAkCxE,EAAK,IACnG2C,EAAOyC,KAAK,CACVuD,SAAQA,EACRrB,MAAKA,EACLhK,MAAO0C,GAEX,IAGK2C,EAAOiG,MAAK,SAACC,EAAGC,GAAM,gBDpBIC,EAAsBzE,EAAqBmE,GAM5E,IALA,IAAMO,EAAcD,EAAOJ,SACrBM,EAAc3E,EAAMqE,SACpBtC,EAAS2C,EAAY3C,OACvBiB,GAAS,IAEJA,EAAQjB,GAAQ,CACvB,IAAM6C,EAAQT,EAAOnB,GAEf3E,GADyB,mBAAVuG,EAAuBA,EAAkB,SAAVA,EAAmBb,GAAcL,IAChEgB,EAAY1B,GAAQ2B,EAAY3B,IACrD,GAAI3E,EACF,OAAOA,CAEV,CAED,OAAOoG,EAAOzB,MAAQhD,EAAMgD,KAC9B,CCI+B6B,CAAmBN,EAAGC,EAAGL,EAAkB,IAAE1I,KAAI,SAACC,GAAS,OAAAA,EAAK1C,KAAL,GAC1F,CCxCA,SAAS8L,GAAgB9L,EAAU+L,GACjC,OAAgB,MAAT/L,GAAiBA,GAAUA,EAAQ+L,EAAe/L,CAC3D,CCGA,SAASgM,GAA0C/C,EAAW5G,GAC5D,GAAoB,mBAATA,EACT,MAAM,IAAI4J,UAAUhE,IAGtB,IAAI5C,EAEJ,OADA4D,EAAI6C,GAAUzF,GAAS4C,GAAI,GACpB,WAUL,QATMA,EAAI,IAGR5D,EAAShD,EAAK6J,MAAMC,KAAMnE,YAExBiB,GAAK,IAEP5G,OAAOf,GAEF+D,CACT,CACF,CCzCA,SAAS+G,GACP/J,EACAgK,EACAC,EACAC,GAEA,QAFA,IAAAA,IAAAA,GAAoB,GAEA,mBAATlK,EACT,MAAM,IAAI4J,UAAUhE,IAGtB,IAAIuE,EACFC,EACAC,EACAC,EACAC,EACAvH,EAiBF,SAASwH,EAAWC,GAIlB,OAHAJ,EAAiBI,EACjBzH,EAAShD,EAAK6J,MAAMU,EAAUD,GAC9BC,EAAWD,OAAWrL,EACf+D,CACR,CAED,SAAS0H,QAAqB,IAAsBC,EAAA,GAAAC,EAAA,EAAtBA,EAAsBjF,UAAAe,OAAtBkE,IAAAD,EAAsBC,GAAAjF,UAAAiF,GAClDL,EAAWT,KACXQ,EAAWK,EAEX,IAAMF,EAAOI,KAAKC,MACZC,EAzBR,SAAsBN,GACpB,QAAqBxL,IAAjBmL,EACF,OAAO,EAET,IAAMY,EAAoBP,EAAOL,EAEjC,OACEY,GAAqBhB,GACrBgB,EAAoB,GACnBd,GAJyBO,EAAOJ,GAIOL,CAE3C,CAckBiB,CAAaR,GAExBS,EAAYhB,EAEba,QAA6B9L,IAAjBmL,QAAwCnL,IAAVkL,EAE3CH,EADAA,GAAQS,EAAOL,GAFfJ,EAOJ,OAFAI,EAAeK,EAEXM,GAEEd,QAAuBhL,IAAVkL,EACRK,EAAWC,SAKRxL,IAAVkL,GAAwBD,IAC1BiB,aAAahB,GACbA,OAAQlL,QAGIA,IAAVkL,IACFA,EAAQiB,YAAW,WACjBjB,OAAQlL,EACRuL,EAAWK,KAAKC,MACjB,GAAEI,IAGElI,EACR,CA8BD,OAxFAgH,EAAOP,GAAUzF,GAASgG,GAAO,GAoFjCU,EAAUW,OAxBV,gBACgBpM,IAAVkL,IACFgB,aAAahB,GACbA,OAAQlL,GAEVmL,EAAeD,EAAQG,EAAWC,OAAWtL,CAC9C,EAmBDyL,EAAUY,MAjBV,WACE,YAAcrM,IAAVkL,IACFgB,aAAahB,GACbA,OAAQlL,EAEJqL,GACKE,EAAWK,KAAKC,OAGpB9H,CACR,EAQD0H,EAAUa,QANV,WACE,YAAiBtM,IAAVkL,CACR,EAMMO,CACT,CCvFA,SAASc,GAAqDC,GAA9D,IAQCC,EAAA5B,KAPC,GAAyB,mBAAd2B,EACT,MAAM,IAAI7B,UAAUhE,IAGtB,OAAO,eAAC,IAAsB+E,EAAA,GAAAC,EAAA,EAAtBA,EAAsBjF,UAAAe,OAAtBkE,IAAAD,EAAsBC,GAAAjF,UAAAiF,GAC5B,OAAQa,EAAU5B,MAAM6B,EAAMf,EAChC,CACF,CC5BA,IAAMgB,GAAiC,iBAAZC,GAAwBA,IAAYA,EAAQC,UAAYD,EAI7EE,GAAaH,IAAiC,iBAAXI,QAAuBA,SAAWA,OAAOF,UAAYE,OAMxFC,GAHgBF,IAAcA,GAAWF,UAAYD,IAGtBvN,EAAK6N,QAEpCC,GAAW,WACf,IACE,IAAMC,EAAQL,IAAcA,GAAWM,SAAWN,GAAWM,QAAQ,QAAQD,MAC7E,OAAIA,GAKGH,IAAeA,GAAYK,SAAWL,GAAYK,QAAQ,OAClE,CAAC,MAAOpM,GAER,CACF,CAZgB,GAgBJqM,GAAqCJ,IAAYA,GAASK,cAC1DC,GAA8BN,IAAYA,GAASO,OACnDC,GAA6BR,IAAYA,GAASS,MAClDC,GAAgCV,IAAYA,GAASW,SACrDC,GAA6BZ,IAAYA,GAASa,MAClDC,GAAoCd,IAAYA,GAASe,aCjBtE,SAASC,GAASvP,GAChB,MAAsB,mBAAXwP,QAAoD,mBAApBA,OAAOD,UACzCC,OAAOD,SAASvP,EAG3B,CCGA,SAASyP,GAAczP,GACrB,IAAKoK,GAAapK,KAAW8F,GAAU9F,EAAOuD,GAC5C,OAAO,EAET,IAAMmM,EAAQtP,OAAOuP,eAAevP,OAAOJ,IAG3C,GAAc,OAAV0P,EACF,OAAO,EAGT,IAAMhK,EAAO3E,EAAeI,KAAKuO,EAAO,gBAAkBA,EAAM/J,YAEhE,MAAuB,mBAATD,GAAuBA,aAAgBA,GAAQzE,EAAiBE,KAAKuE,KAAUxE,CAC/F,CC/BA,SAAS0O,GAAK5P,GACZ,ICFF,SAAqBA,GACnB,GAAqB,iBAAVA,EACT,OAAO,EAET,IAAM0F,EAAO1F,EAAM2F,YAEnB,OAAO3F,KADuB,mBAAT0F,EAAsBA,EAAK9E,UAAYD,EAE9D,CDLOkP,CAAY7P,GACf,OAAOI,OAAOwP,KAAK5P,GAErB,IAAMqF,EAAS,GACf,IAAK,IAAMyK,KAAO1P,OAAOJ,GACnBe,EAAeI,KAAKnB,EAAO8P,IAAgB,gBAARA,GACrCzK,EAAOyC,KAAKgI,GAGhB,OAAOzK,CACT,CEFA,SAAS2J,GAAMhP,GACb,OAAO+O,GAAYA,GAAU/O,GAAS8F,GAAU9F,EAAOyD,EACzD,CCFA,SAAS2L,GAAMpP,GACb,OAAOmP,GAAYA,GAAUnP,GAAS8F,GAAU9F,EAAO2D,EACzD,CCXA,SAASoM,GAAWtE,GAClB,OAAKjD,IAA0C,OAAXiD,EAI7BjD,GAA4BiD,GAAQjE,QAAO,SAAC9E,GACjD,OAAA1B,EAAqBG,KAAKsK,EAAQ/I,EAAlC,IAJO,EAMX,CCOA,SAASsN,GAA0BvE,GACjC,OAAK1G,EAAS0G,GAGNrL,OAAOwP,KAAKnE,GAAgCtB,OAAO4F,GAAWtE,IAF7D,EAGX,CCRA,SAASwE,GAAMjQ,GACb,OAAgB,MAATA,CACT,CCFA,SAASsP,GAAatP,GACpB,OAAIqP,GACKA,GAAiBrP,GAEnBoK,GAAapK,IAAU6I,GAAS7I,EAAM+I,SAAWhD,GAAW/F,EAAOqD,EAC5E,CChBA,SAAS6M,GAAWzN,GAClB,IAAM4C,EAAuB,GAI7B,OAHA5C,EAAI2I,SAAQ,SAACpL,EAAO8P,GAClBzK,EAAOyC,KAAK,CAACgI,EAAK9P,GACpB,IACOgL,GAAQ3F,EAAQ,CAAC,EAAG,GAC7B,CAEA,SAAS8K,GAAWC,GAClB,IAAM/K,EAAgB,GAItB,OAHA+K,EAAIhF,SAAQ,SAACpL,GACXqF,EAAOyC,KAAK9H,EACd,IACOgL,GAAQ3F,EACjB,CAEA,SAASgL,GAAWC,GAClB,OAAO1O,EAAST,KAAKmP,EACvB,CAEA,SAASC,GAAaC,GACpB,OAAO,IAAIC,WAAWD,EAAaE,QAAUF,EAAcA,EAAaG,YAAc,EAAGH,EAAaI,WACxG,CAEA,SAASC,GAAUC,GACjB,OAAO1G,GAAa0G,IAAgC,iBAAjBA,EAAI5C,UAAiD,iBAAjB4C,EAAIC,UAAoD,mBAApBD,EAAIE,WACjH,CAIA,SAASC,GAAYjR,EAAYgH,EAAYkK,EAAyBjK,EAAuBkK,EAAoBC,GAE/G,GAAIrK,GAAG/G,EAAOgH,EAAOC,GACnB,OAAO,EAGT,IAAMoK,SAAiBrR,EACjBsR,SAAiBtK,EAIvB,GAAIC,GAAeoK,IAAYC,EAC7B,OAAO,EAIT,GAAIrB,GAAMjQ,IAAUiQ,GAAMjJ,IAAuB,WAAZqK,GAAoC,WAAZC,EAC3D,OAAO,EAIT,IAKIC,EALEpM,EAAMI,GAAOvF,GACnB,GAAImF,IAAQI,GAAOyB,GACjB,OAAO,EAKT,OAAQ7B,GACN,KAAKxC,EACH,OAAOoE,IAAI/G,GAAQgH,EAAOC,GAC5B,KAAKrE,EACL,KAAKE,EAEH,OAAOmE,GAAejH,IAAWgH,EAAQD,IAAI/G,GAAQgH,GACvD,KAAKnE,EACL,KAAKE,EACH,MAAO,GAAK/C,GAAU,GAAKgH,EAC7B,KAAKhE,EACH,QAAOzB,GAAgBA,EAAcJ,KAAKnB,KAAWuB,EAAcJ,KAAK6F,GAC1E,KAAK/D,EACH,OAAOjD,EAAMwR,MAAQxK,EAAMwK,MAAQxR,EAAMyR,SAAWzK,EAAMyK,QAC5D,KAAKjO,EACL,KAAKN,EACH,GAAIlD,EAAM4Q,aAAe5J,EAAM4J,YAAe5Q,EAAM2Q,YAAc3Q,EAAM2Q,aAAe3J,EAAM2J,WAC3F,OAAO,EAETY,EAAUhB,GACV,MACF,KAAK9M,EACH8N,EAAUrB,GACV,MACF,KAAKvM,EACH4N,EAAUpB,GACV,MACF,KAAKhN,EACHoO,EAAUlB,GAId,GAAIkB,EACF,OAAON,GAAYM,EAAQvR,GAAQuR,EAAQvK,GAAQkK,EAAYjK,EAAakK,EAAYC,GAI1F,GAAIP,GAAU7Q,IAAU6Q,GAAU7J,GAChC,OAAOhH,EAAMgR,YAAYhK,GAG3B,IAAI0K,EAAYvM,IAAQ/B,EACxB,IAAKsO,GAAapC,GAAatP,GAAQ,CACrC,GAAIA,EAAM4Q,aAAe5J,EAAM4J,WAC7B,OAAO,EAET,GAAI5Q,EAAM0Q,SAAW1J,EAAM0J,QAAU1Q,EAAM2Q,aAAe3J,EAAM2J,WAC9D,OAAO,EAETe,GAAY,CACb,CAGD,GAAInC,GAASvP,GAAQ,CACnB,IAAKuP,GAASvI,GACZ,OAAO,EAET0K,GAAY,CACb,CAIDN,EAAaA,GAAc,GAG3B,IAFA,IAAIrI,GAFJoI,EAAaA,GAAc,IAEHpI,OAEjBA,KAEL,GAAIoI,EAAWpI,KAAY/I,EACzB,OAAOoR,EAAWrI,KAAY/B,EAKlCmK,EAAWrJ,KAAK9H,GAChBoR,EAAWtJ,KAAKd,GAEhB,IAAI3B,GAAS,EACPsM,EAAsC,mBAAfT,EAG7B,GAAIQ,EAAW,CAGb,IADA3I,EAAS/I,EAAM+I,UACA/B,EAAM+B,OACnB,OAAO,EAGT,KAAOA,KAAU,CACf,GAAI4I,EAEF,QAAiBrQ,KADXsQ,EAAWV,EAAWlR,EAAM+I,GAAS/B,EAAM+B,GAASA,EAAQ/I,EAAOgH,EAAOmK,EAAYC,IAChE,CAC1B,IAAKQ,EACH,OAAO,EAET,QACD,CAEH,IAAKX,GAAYjR,EAAM+I,GAAS/B,EAAM+B,GAASmI,EAAYjK,EAAakK,EAAYC,GAClF,OAAO,CAEV,CACF,MAAM,GAAIjM,IAAQ5B,EAAW,CAE5B,IAAMqM,EAAOI,GAAQhQ,GAErB,GADA+I,EAAS6G,EAAK7G,OACViH,GAAQhJ,GAAO+B,SAAWA,EAC5B,OAAO,EAIT,IADA,IAAI8I,GAAW,EACR9I,KAAU,CACf,IAEQ6I,EAFF9B,EAAMF,EAAK7G,GACjB,GAAI4I,EAEF,QAAiBrQ,KADXsQ,EAAWV,EAAWlR,EAAM8P,GAAM9I,EAAM8I,GAAMA,EAAK9P,EAAOgH,EAAOmK,EAAYC,IACvD,CAC1B,IAAKQ,EACH,OAAO,EAET,QACD,CAEH,IAAM7Q,EAAeI,KAAK6F,EAAO8I,KAAQmB,GAAYjR,EAAM8P,GAAM9I,EAAM8I,GAAMoB,EAAYjK,EAAakK,EAAYC,GAChH,OAAO,EAIJS,GAAoB,gBAAR/B,IACf+B,GAAW,EAEd,CAED,IAAKA,EAAU,CAEb,IAAMC,EAAU9R,EAAM2F,YAChBoM,EAAU/K,EAAMrB,YACtB,GAAImM,IAAYC,KAAanJ,GAAWkJ,IAAYA,aAAmBA,GAAWlJ,GAAWmJ,IAAYA,aAAmBA,IAAY,gBAAiB/R,GAAS,gBAAiBgH,EACjL,OAAO,CAEV,CACF,MACC3B,GAAS,EAOX,OAHA8L,EAAWa,MACXZ,EAAWY,MAEJ3M,CACT,CA2CA,SAAS4M,GAAQjS,EAAYgH,EAAYkK,EAAyBjK,GAEhE,QAFgE,IAAAA,IAAAA,GAAmB,GAEzD,mBAAfiK,EAA2B,CACpC,IAAM7L,EAAS6L,EAAWlR,EAAOgH,GACjC,QAAe1F,IAAX+D,EACF,QAASA,CAEZ,CACD,OAAO4L,GAAYjR,EAAOgH,EAAOkK,EAAYjK,EAC/C,CCnPA,SAASkB,GAASnI,GAChB,OAAOkI,GAAiBA,GAAelI,GAA0B,iBAAVA,GAAsBS,EAAK0H,SAASnI,EAC7F,CCFA,SAASqI,GAAUrI,GACjB,OAAOoI,GAAkBA,GAAgBpI,GAASmI,GAASnI,IAAUwJ,KAAKG,MAAM3J,KAAWA,CAC7F,CCtBA,SAASkS,GAAiBzG,EAAa0G,GACrC,OAAOrM,GAAU2F,EAAQlI,IAAcuC,GAAUqM,EAAQ5O,EAC3D,CAIA,SAAS6O,GAAY3G,EAAsC0G,EAAsCjB,EAAyBjK,EAAuBoL,EAAkBC,GACjK,IAAMX,EAAsC,mBAAfT,EAE7B,GAAIgB,GAAiBzG,EAAQ0G,GAAS,CAGpCG,EAAWA,GAAY,GAGvB,IAFA,IAAIC,GAFJF,EAAWA,GAAY,IAECtJ,OAEjBwJ,KAGL,GAAIF,EAASE,KAAc9G,GAAU6G,EAASC,KAAcJ,EAC1D,OAAO,EAKXE,EAASvK,KAAK2D,GACd6G,EAASxK,KAAKqK,GAKd,IAHA,IAAMvC,EAAOI,GAAQmC,GACjBK,EAAS5C,EAAK7G,OAEXyJ,KAAU,CACf,IAAM1C,EAAMF,EAAK4C,GACjB,KAAM1C,KAAOrE,GACX,OAAO,EAGT,IAAImG,SAMJ,GAJID,IACFC,EAAWV,EAAWzF,EAAOqE,GAAMqC,EAAOrC,GAAMA,EAAKrE,EAAQ0G,EAAQE,EAAUC,SAGhEhR,IAAbsQ,GAQJ,IAAKQ,GAAY3G,EAAOqE,GAAMqC,EAAOrC,GAAMoB,EAAYjK,EAAaoL,EAAUC,GAC5E,OAAO,OARP,IAAKV,EACH,OAAO,CASZ,CAKD,OAFAS,EAASL,MACTM,EAASN,OACF,CACR,CAGD,IAAM3M,EAAS4M,GACbxG,EACA0G,GACA,SAACM,EAAUC,EAAUC,EAAG7B,EAAK8B,GAC3B,GAAIjB,EAAe,CACjB,IAAMC,EAAWV,EAAWuB,EAAUC,EAAUC,EAAG7B,EAAK8B,EAAKP,EAAUC,GACvE,QAAiBhR,IAAbsQ,EACF,OAAOA,CAEV,CACD,GAAIM,GAAiBO,EAAUC,GAC7B,OAAON,GAAYK,EAAUC,EAAUxB,EAAYjK,EAAaoL,EAAUC,EAE7E,GACDrL,GAGF,OAAO5B,CACT,CCxDA,SAASwN,GAAS7S,GAChB,MAAwB,iBAAVA,GAAsB8F,GAAU9F,EAAO2C,EACvD,CClBA,SAASmQ,GAAc9N,EAAkChF,EAAe+S,QAAA,IAAAA,IAAAA,EAAa,GACnF,IAAM1Q,EAAOmH,KAAKxE,GAKlB,GAHAhF,EAAQqG,GAASrG,GAGC,KAFlB+S,EAAYvJ,KAAKD,IAAI5C,GAAUoM,GAAY,QAEnB5K,GAASnI,GAC/B,OAAOqC,EAAKrC,GAId,IAAIgT,EAAOlS,GAASd,GAAOiT,MAAM,KAKjC,SADAD,EAAOlS,GAHPd,EAAQqC,IAAO2Q,EAAK,GAAK,KAAOA,EAAK,IAAMA,EAAK,GAAKD,EAAYA,MAG1CE,MAAM,MACf,GAAK,KAAOD,EAAK,IAAMA,EAAK,GAAKD,GAAaA,GAC9D,CC3BM,SAAUG,GAAgBC,GAC9B,OAAO,SAAUnT,EAAYgH,GAK3B,MAJuB,iBAAVhH,GAAuC,iBAAVgH,IACxChH,EAAQqG,GAASrG,GACjBgH,EAAQX,GAASW,IAEZmM,EAAWnT,EAAOgH,EAC3B,CACF,CAEO,IAAMoM,GAAqB,SAACpT,EAAOgH,GACxC,OAAOhH,EAAQgH,CACjB,EAEaqM,GAAsB,SAACrT,EAAOgH,GACzC,OAAOhH,GAASgH,CAClB,EAEasM,GAAqB,SAACtT,EAAOgH,GACxC,OAAOhH,EAAQgH,CACjB,EAEauM,GAAsB,SAACvT,EAAOgH,GACzC,OAAOhH,GAASgH,CAClB,ECRA,SAASwM,GAAGxT,EAAYgH,GACtB,OAAOkM,GAAgBE,GAAhBF,CAAwBlT,EAAOgH,EACxC,CClBA,SAASyM,GACPpM,EACAF,EACAgM,GAEA,GAAKpT,EAAQsH,GAAb,CAIA,IAAIhC,EAAuBqO,EAErBnM,EAAmBL,GAAwBC,GAejD,OAbAE,EAAM+D,SAAQ,SAACpL,GACb,IAAMyH,EAAUF,EAAiBvH,GAEpB,MAAXyH,SACcnG,IAAboS,EACGjM,GAAYA,IAAYxB,GAASwB,GACjC0L,EAAW1L,EAASiM,MAExBA,EAAWjM,EACXpC,EAASrF,EAEb,IAEOqF,CAnBN,CAoBH,CCXA,SAASsO,GAAG3T,EAAYgH,GACtB,OAAOkM,GAAgBI,GAAhBJ,CAAwBlT,EAAOgH,EACxC,CCfA,SAAS4M,GAAUnI,GACjB,IAAMpG,EAAmB,GACzB,IAAK,IAAMyK,KAAOrE,EAChBpG,EAAOyC,KAAKgI,GAEd,OAAOzK,CACT,CCaA,SAASwO,GAA4BpI,GACnC,OAAK1G,EAAS0G,GAGNmI,GAAUnI,GAAgCtB,OCrBpD,SAAsBsB,GAKpB,IAJA,IAAMpG,EAAmB,GAErByO,EAAI1T,OAAOqL,GAERqI,GACL/D,GAAW+D,GAAG1I,SAAQ,SAAC1I,IACS,IAA1B2C,EAAO0O,QAAQrR,IACjB2C,EAAOyC,KAAKpF,EAEhB,IACAoR,EAAI1T,OAAOuP,eAAemE,GAG5B,OAAOzO,CACT,CDM2D2O,CAAavI,IAF7D,EAGX,CEvBA,SAASwI,GAA4BxI,EAAiB0G,EAAiBjB,EAAyBgD,QAAA,IAAAA,IAAAA,EAAc,IAAA5P,SAC5G,IAAMwM,EAAM1Q,OAAOqL,GAEnB,OAAK1G,EAASoN,IAAWrB,IAAQqB,GAIpB0B,GAAU1B,GAElB/G,SAAQ,SAAC0E,GAEZ,IAAM4C,EAAWP,EAAOrC,GACpBqE,EAAiC,mBAAfjD,EAA4BA,EAAWJ,EAAIhB,GAAM4C,EAAU5C,EAAKgB,EAAKqB,QAAU7Q,EAOrG,QALiBA,IAAb6S,IACFA,EAAWzB,GAITtI,GAAa+J,IAAarE,KAAOgB,IAAQoD,EAAQE,IAAID,GAAqB,CAC5ED,EAAQ9D,IAAI+D,GAAoB,GAEhC,IAAM1B,EAAW3B,EAAIhB,GACjBuE,SAGFA,EADEtU,EAAQoU,GACIpU,EAAQ0S,GAAYA,EAAW,GAE/BrI,GAAaqI,GAAYA,EAAW,CAAA,EAGpD3B,EAAIhB,GAAOmE,GAAUI,EAAaF,EAAiBjD,EAAYgD,EAChE,WACkB5S,IAAb6S,QAAwC7S,IAAb6S,KAA4BrE,KAAOgB,MAChEA,EAAIhB,GAAOqE,EAGjB,IAEOrD,GAnCEA,CAoCX,CCpBA,SAASwD,GAAatU,GACpB,OAAKgI,UAAUe,OAGRhJ,EAAQC,GAASA,EAAQ,CAACA,GAFxB,EAGX,CCTA,SAASuU,GACP9I,EACAqC,QAAA,IAAAA,IAAAA,EAAA,WAAiD,OAAA,IAEjD,IAAMzI,EAAqB,CAAA,EAE3B,OAAe,OAAXoG,GAISoI,GAAUpI,GAElBL,SAAQ,SAAC0E,GACRhC,EAAUrC,EAAOqE,GAAMA,KACzBzK,EAAOyK,GAAOrE,EAAOqE,GAEzB,IATSzK,CAYX,CC3CA,IAAMmP,GAAc,4CAmBpB,SAASC,GAAMC,EAAgBC,GAC7B,YAD6B,IAAAA,IAAAA,EAAsCH,IAC5DE,EAAOE,MAAMD,IAAY,EAClC,CCVA,SAASE,GAAeH,EAAgBC,GACtC,OAAOF,GAAM3T,GAAS4T,GAAQI,QAAQ,aAAc,IAAKH,EAC3D,CCJA,SAASI,GAAgBC,GACvB,OAAO,SAACN,GACN,IAAMjQ,EAAM3D,GAAS4T,GACrB,OAAKjQ,EAGEA,EAAI,GAAGuQ,KAAgBvQ,EAAI5C,MAAM,GAF/B,EAGX,CACF,CCAA,SAASoT,GAAWP,GAClB,OAAOK,GAAgB,cAAhBA,CAA+BL,EACxC,CCjBA,IAAMQ,GAAc,CAClB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SAGDC,GAAkB,WAClBC,GAAqBC,OAAOF,GAAgBhD,QCXlD,IAAMmD,GAAe,wBACfC,GAAkBF,OAAOC,GAAanD,QCC5C,IAAMqD,GAAgB,CACpB,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,QAAS,KAGLC,GAAgB,iCAChBC,GAAmBL,OAAOI,GAActD,QCiB9C,SAASwD,GACPlK,EACA0G,GAEA,IAAMyD,EAAQ5F,GAAQmC,GAChBpJ,EAAS6M,EAAM7M,OAErB,GAAc,MAAV0C,EACF,OAAQ1C,EAGV,GAAe,IAAXA,EACF,OAAO,EAGT,IAAK,IAAI8M,EAAI,EAAGA,EAAI9M,EAAQ8M,IAAK,CAC/B,IAAM/F,EAAM8F,EAAMC,GACZ/H,EAAYqE,EAAOrC,GACnB9P,EAAQyL,EAAOqE,GAErB,QAAexO,IAAVtB,KAAyB8P,KAAOrE,KAAaqC,EAAU9N,GAC1D,OAAO,CAEV,CAED,OAAO,CACT,CCnDA,IAAI8V,GAAY,2EvDuBO,gBwDCvB,SAAkD7M,EAAW5G,GAC3D,GAAoB,mBAATA,EACT,MAAM,IAAI4J,UAAUhE,IAGtB,OADAgB,EAAI6C,GAAUzF,GAAS4C,GAAI,GACpB,WACL,KAAMA,EAAI,EAGR,OAAO5G,EAAK6J,MAAMC,KAAMnE,UAE5B,CACF,sDCXA,SAAmB0M,EAAgBC,GACjC,OAAOE,GAAeH,EAAQC,GAASoB,QAAO,SAACC,EAAMC,EAAKjM,GAExD,OADAiM,EAAMA,EAAIC,cACHF,GAAQhM,EAAQiL,GAAWgB,GAAOA,EAC1C,GAAE,GACL,eCfA,SAAoBvB,GAClB,OAAOO,GAAWnU,GAAS4T,GAAQwB,cACrC,wBCGA,SAAcC,EAAgBpD,GAC5B,OAAOD,GAAc,OAAQqD,EAAQpD,EACvC,UCFA,SAAkB1L,EAAY+O,GAE5B,QAF4B,IAAAA,IAAAA,EAAQ,GACpCA,EAAOtP,GAASsP,IACXrW,EAAQsH,IAAU+O,EAAO,EAC5B,MAAO,GAQT,IALA,IAAMrN,EAAS1B,EAAM0B,OACf1D,EAAgBpF,MAAMuJ,KAAKC,KAAKV,EAASqN,IAC3CC,EAAW,EACbrM,EAAQ,EAEHA,EAAQjB,GACb1D,EAAOgR,KAAchP,EAAMxF,MAAMmI,EAAQA,GAASoM,GAGpD,OAAO/Q,CACT,UCVA,SAAe8Q,EAAgB9M,EAAgBC,GAyB7C,YAxBchI,IAAVgI,IACFA,EAAQD,EACRA,OAAQ/H,QAGIA,IAAVgI,IACFA,EAAQwC,GAAUzF,GAASiD,GAAQ,SAGvBhI,IAAV+H,IACFA,EAAQyC,GAAUzF,GAASgD,GAAQ,KAGrC8M,EAAS9P,GAAS8P,KAEHA,SACC7U,IAAVgI,IACF6M,EAASA,GAAU7M,EAAQ6M,EAAS7M,QAExBhI,IAAV+H,IACF8M,EAASA,GAAU9M,EAAQ8M,EAAS9M,IAIjC8M,CACT,YCrCA,SAAoB9O,GAClB,OAAOtH,EAAQsH,GAASA,EAAMG,QAAO,SAAC9E,GAAS,QAAEA,CAAI,IAAI,EAC3D,aCDA,SAIEyP,GACA,OAAO,SAAU1G,GACf,OAAOkK,GAAWlK,EAAQ0G,EAC5B,CACF,6BCXA,SAAqBnS,GACnB,OAAO,WACL,OAAOA,CACT,CACF,YCMA,SAAoEiL,EAAiB9D,GACnF,IAAM9B,EAAmD,CAAA,EAEzD,GAAItF,EAAQkL,GAAa,CACvB,IAAMqL,EAAmBpP,GAAwBC,GACjD8D,EAAWG,SAAQ,SAAC1I,GAClB,IAAMoN,EAAMwG,EAAiB5T,GACzBoN,KAAOzK,IACPA,EAAOyK,GAETzK,EAAOyK,GAAO,CAElB,GACD,CACD,OAAOzK,CACT,aCJA,SAAqDhD,EAASgK,EAAUC,GACtE,YAD4D,IAAAD,IAAAA,EAAQ,QAAE,IAAAC,IAAAA,GAAiB,GAChFF,GAAa/J,EAAMgK,EAAMC,EAClC,yBCfA,SAAkDjK,EAASgK,OAAc,IAAsBW,EAAA,GAAAC,EAAA,EAAtBA,EAAsBjF,UAAAe,OAAtBkE,IAAAD,EAAsBC,EAAA,GAAAjF,UAAAiF,GAC7F,GAAoB,mBAAT5K,EACT,MAAM,IAAI4J,UAAUhE,IAItB,IAAMsO,EAAUpK,KAGhB,OAFAE,EAAOP,GAAUzF,GAASgG,GAAO,GAE1BoB,YAAW,WAChBpL,EAAK6J,MAAMqK,EAASvJ,EACrB,GAAEX,EACL,mChBDA,SAAgBqI,GAEd,OADAA,EAAS5T,GAAS4T,KACDU,GAAmB3O,KAAKiO,GACrCA,EAAOI,QAAQK,IAAiB,SAACqB,GAE/B,OAAOtB,GAAYsB,EACrB,IACA9B,GAAU,EAChB,iBCtBA,SAAsBA,GACpB,OAAOA,GAAUa,GAAgB9O,KAAKiO,GAClCA,EAAOI,QAAQQ,GAAc,QAC7BZ,GAAU,EAChB,UgBHA,SAAeyB,EAAgBpD,GAC7B,OAAOD,GAAc,QAASqD,EAAQpD,EACxC,cCLA,SAA0D1L,GAExD,IAAMhC,EAAuB,CAAA,EAE7B,OAAKtF,EAAQsH,IAIbA,EAAM+D,SAAQ,SAAC1I,GACb2C,EAAO3C,EAAK,IAAWA,EAAK,EAC9B,IAEO2C,GAPEA,CAQX,YCNA,SAAoE4F,EAAiB9D,GACnF,IAAM9B,EAAgD,CAAA,EAEtD,GAAItF,EAAQkL,GAAa,CACvB,IAAMqL,EAAmBpP,GAAwBC,GACjD8D,EAAWG,SAAQ,SAAC1I,GAClB,IAAMoN,EAAMwG,EAAiB5T,GACzBoN,KAAOzK,EACTA,EAAOyK,GAAKhI,KAAKpF,GAEjB2C,EAAOyK,GAAO,CAACpN,EAEnB,GACD,CACD,OAAO2C,CACT,gBCrBA,SAAarF,EAAYgH,GACvB,OAAOkM,GAAgBG,GAAhBH,CAAyBlT,EAAOgH,EACzC,0BCYA,SAAiBmP,EAAgBM,EAAeC,GAI9C,YAJ8C,IAAAA,IAAAA,EAAO,GACrDP,EAAS9P,GAAS8P,GAClBM,EAAQpQ,GAASoQ,GACjBC,EAAMrQ,GAASqQ,GACRP,GAAU3M,KAAKD,IAAIkN,EAAOC,IAAQP,EAAS3M,KAAKE,IAAI+M,EAAOC,EACpE,kCCnBA,SAAqB1W,GACnB,OAAI+H,GACKjC,GAAU9F,EAAOmD,GAEnBiH,GAAapK,IAAUe,EAAeI,KAAKnB,EAAO,YAAcgB,EAAqBG,KAAKnB,EAAO,SAC1G,8BCJA,SAAuBA,GACrB,OAAO2O,GAAoBA,GAAkB3O,GAAS8F,GAAU9F,EAAOkD,EACzE,mDCCA,SAAgBlD,GAEd,OAAQkC,GAAelC,aAAiBmC,MAAS4D,GAAW/F,EAAO,CvF+D9C,gBACA,iBuF/DvB,cCHA,SAAmBA,GACjB,OAAiB,IAAVA,IAA4B,IAAVA,GAAmB8F,GAAU9F,EAAO4C,EAC/D,6BCVA,SAAoB5C,GAClB,OAAO8F,GAAU9F,EAAOwD,EAC1B,WCCA,SAAgBxD,GACd,OAAO6O,GAAaA,GAAW7O,GAAS8F,GAAU9F,EAAO8C,EAC3D,cCHA,SAAmB9C,GACjB,OAAOoK,GAAapK,IAA6B,IAAnBA,EAAMkO,WAAmBuB,GAAczP,EACvE,YCmBA,SAAiBA,GACf,OAAa,MAATA,IAIAgP,GAAMhP,IAAUoP,GAAMpP,IAChBA,EAAMoW,KAGZhM,GAAapK,IACP4P,GAAK5P,GAAO+I,QAGlBD,GAAY9I,KACNA,EAAM+I,OAIlB,yBCpCA,SAAiB/I,GACf,OAAOoK,GAAapK,KAAWA,aAAiB2W,OAAS5Q,GAAW/F,EAAO,CAACiD,E7FqE/C,0B6FpE/B,kF/C0GA,SAAiBwI,EAAgB0G,EAAgBjB,EAAyBjK,GACxE,QADwE,IAAAA,IAAAA,GAAmB,GACjE,mBAAfiK,GAA6BgB,GAAiBzG,EAAQ0G,GAAS,CACxE,IAAMP,EAAWV,EAAWzF,EAAQ0G,GACpC,QAAiB7Q,IAAbsQ,EACF,QAASA,CAEZ,CAED,OAAOQ,GAAY3G,EAAQ0G,EAAQjB,EAAYjK,EACjD,UgDpHA,SAAejH,GACb,OAAO6S,GAAS7S,IAAUS,EAAKmW,MAAM5W,EACvC,sBCTA,SAAgBA,GACd,OAAiB,OAAVA,CACT,kFCIA,SAAuBA,GACrB,OAAO+E,EAAS/E,IAAgC,mBAAfA,EAAM6W,IACzC,aCJA,SAAkB7W,GAChB,OAAOiP,GAAeA,GAAajP,GAAS8F,GAAU9F,EAAO+C,EAC/D,kBCQA,SAAuB/C,GACrB,OAAOsI,GAAsBA,GAAoBtI,GAASqI,GAAUrI,IAAUwJ,KAAKsN,IAAI9W,IAAU8B,CACnG,wBCXA,SAAkB9B,GAChB,MAAwB,iBAAVA,GAAsB8F,GAAU9F,EAAO6C,EACvD,gDCPA,SAAqB7C,GACnB,YAAiB,IAAVA,CACT,cCCA,SAAmBA,GACjB,OAAO8F,GAAU9F,EAAO4D,EAC1B,cCFA,SAAmB5D,GACjB,OAAO8F,GAAU9F,EtGqEO,mBsGpE1B,cCOA,SAAmB0U,EAAgBC,GACjC,OAAOE,GAAeH,EAAQC,GAASoB,QAAO,SAACC,EAAMC,EAAKjM,GAAU,OAAAgM,GAAQhM,EAAQ,IAAM,IAAMiM,EAAIC,gBAAe,GACrH,UCHA,SAAkEjL,EAAiB9D,GACjF,IAAM9B,EAA8C,CAAA,EAEpD,GAAItF,EAAQkL,GAAa,CACvB,IAAMqL,EAAmBpP,GAAwBC,GACjD8D,EAAWG,SAAQ,SAAC1I,GAClB,IAAMoN,EAAMwG,EAAiB5T,GAC7B2C,EAAOyK,GAAOpN,CAChB,GACD,CACD,OAAO2C,CACT,WCZA,SAAkCoG,GAChC,OAAK1G,EAAS0G,GAGPmI,GAAUnI,GAFR,EAGX,cCJA,SAAmBiJ,EAAgBC,GACjC,OAAOE,GAAeH,EAAQC,GAASoB,QAAO,SAACC,EAAMC,EAAKjM,GAAU,OAAAgM,GAAQhM,EAAQ,IAAM,IAAMiM,EAAIC,gBAAe,GACrH,eCXA,SAAoBxB,GAClB,OAAOK,GAAgB,cAAhBA,CAA+BL,EACxC,gBCCA,SAAa1U,EAAYgH,GACvB,OAAOkM,GAAgBK,GAAhBL,CAAyBlT,EAAOgH,EACzC,QCOA,SACEK,EACAF,GAEA,YAFA,IAAAA,IAAAA,EAAkBqD,IAEXiJ,GAAepM,EAAOF,EAAUqM,GACzC,UrDyCA,SAAiC/H,EAAiB0G,EAAiBjB,GACjE,OAAO+C,GAAUxI,EAAQ0G,EAAQjB,EACnC,QsDjDA,SACE7J,EACAF,GAEA,YAFA,IAAAA,IAAAA,EAAkBqD,IAEXiJ,GAAepM,EAAOF,EAAUwM,GACzC,qBCtBA,+BCUA,SAAgB1K,GACd,YADc,IAAAA,IAAAA,EAAK,GACZ,eAAU,IAAc+D,EAAA,GAAAC,EAAA,EAAdA,EAAcjF,UAAAe,OAAdkE,IAAAD,EAAcC,GAAAjF,UAAAiF,GAC7B,OAAOjE,GAAIgE,EAAM/D,EACnB,CACF,SCCA,SAAmDwC,EAAWsL,QAAA,IAAAA,IAAAA,EAAoB,IAChF,IAAMnH,EAAOiE,GAAUpI,GACjBuL,EAAW1C,GAAUyC,GACrB1R,EAA2B,CAAA,EAQjC,OANAuK,EAAKxE,SAAQ,SAAC0E,GACPkH,EAASnP,SAASiI,KACrBzK,EAAOyK,GAAOrE,EAAOqE,GAEzB,IAEOzK,CACT,WCbA,SACEoG,EACAqC,GAEA,YAFA,IAAAA,IAAAA,EAAA,WAAiD,OAAA,IAE1CyG,GAAO9I,EAAQoC,GAAOC,GAC/B,SCNA,SAAiDzL,GAC/C,OAAO2J,GAAO,EAAG3J,EACnB,yBC4FA,SAAiBA,OAAW,IAAc2K,EAAA,GAAAC,EAAA,EAAdA,EAAcjF,UAAAe,OAAdkE,IAAAD,EAAcC,EAAA,GAAAjF,UAAAiF,GACxC,OAAO,eAAU,IAAuBgK,EAAA,GAAAhK,EAAA,EAAvBA,EAAuBjF,UAAAe,OAAvBkE,IAAAgK,EAAuBhK,GAAAjF,UAAAiF,GAEtC,OAAO5K,EAAK6J,MAAMC,KAAMa,EAAK7C,OAAO8M,GACtC,CACF,cCvFA,SAAsEhM,EAAiB6C,GACrF,IAAMzI,EAAqB,CAAC,GAAI,IAChC,GAAItF,EAAQkL,GAAa,CACvB,IAAMqL,EAAmBpP,GAAwB4G,GACjD7C,EAAWG,SAAQ,SAAC1I,GAClB2C,EAAOiR,EAAiB5T,GAAQ,EAAI,GAAGoF,KAAKpF,EAC9C,GACD,CACD,OAAO2C,CACT,SCpBA,SAAmDoG,EAAWsL,QAAA,IAAAA,IAAAA,EAAoB,IAChF,IAAM1R,EAA2B,CAAA,EASjC,OARiBiP,GAAUyC,GAElB3L,SAAQ,SAAC8L,GACZA,KAASzL,IACXpG,EAAO6R,GAASzL,EAAOyL,GAE3B,IAEO7R,CACT,uBCZA,SAAgBgE,EAAWC,QAAX,IAAAD,IAAAA,EAAS,QAAE,IAAAC,IAAAA,EAAS,GAClCD,EAAQF,GAASE,GACjBC,EAAQH,GAASG,GACjB,IAAMC,EAAMC,KAAKD,IAAIF,EAAOC,GACtBI,EAAMF,KAAKE,IAAIL,EAAOC,GAC5B,OAAOC,EAAMC,KAAKK,UAAYH,EAAMH,EACtC,yBCRA,SAAe4M,EAAgBpD,GAC7B,OAAOD,GAAc,QAASqD,EAAQpD,EACxC,YCNA,SAAoB1L,GAClB,IAAKtH,EAAQsH,IAAUA,EAAM0B,OAAS,EACpC,MAAO,GAQT,IALA,IAAM1D,EAASgC,EAAMxF,QACfkH,EAAS1D,EAAO0D,OAChBoO,EAAYpO,EAAS,EACvBiB,GAAS,IAEJA,EAAQjB,GAAQ,CACvB,IAAMqO,EAAOhO,GAAUY,EAAOmN,GACxBnX,EAAQqF,EAAO+R,GACrB/R,EAAO+R,GAAQ/R,EAAO2E,GACtB3E,EAAO2E,GAAShK,CACjB,CAED,OAAOqF,CACT,UChBA,SAAegS,GACb,YADa,IAAAA,IAAAA,EAAS,KACf,IAAInT,SAAQ,SAACuB,GAClBgI,WAAWhI,EAAS4R,EACtB,GACF,cCGA,SAAmB3C,EAAgBC,GACjC,OAAOE,GAAeH,EAAQC,GAASoB,QAAO,SAACC,EAAMC,EAAKjM,GAAU,OAAAgM,GAAQhM,EAAQ,IAAM,IAAMiM,EAAIC,gBAAe,GACrH,aCQA,SAAqD7T,EAASgK,EAAUC,GACtE,YAD4D,IAAAD,IAAAA,EAAQ,QAAE,IAAAC,IAAAA,GAAgB,GAC/EF,GAAa/J,EAAMgK,EAAMC,GAAW,EAC7C,UCZA,SAAkBrD,EAAW9B,GAC3B,QAD2B,IAAAA,IAAAA,EAAmBqD,IAC1CvB,EAAI,GAAKA,EAAInH,EACf,MAAO,GAQT,IALA,IAAIkI,EAAQ,EACNjB,EAASS,KAAKD,IAAIlB,GAAUY,GAAKA,EAAIO,KAAKG,MAAMxB,GAASc,GAAKA,EAAI,GAAIhH,GACtEoD,EAASpF,MAAM8I,GACf1G,EAA2B,mBAAb8E,EAA0BA,EAAWqD,GAElDR,EAAQjB,GACb1D,EAAO2E,GAAS3H,EAAK2H,GACrBA,IAGF,OAAO3E,CACT,2ECbA,SAAuBrF,GACrB,OAAKA,GAGLA,EAAQ2G,GAAU3G,IACN8B,EACHA,EAEL9B,EAAQgC,EACHA,EAEFhC,EATY,IAAVA,EAAcA,EAAQ,CAUjC,2B7DbA,SAAkB0U,GAEhB,OADAA,EAAS5T,GAAS4T,KACDgB,GAAiBjP,KAAKiO,GACnCA,EAAOI,QAAQW,IAAe,SAACe,GAE7B,OAAOhB,GAAcgB,IAAQ,GAC/B,IACA9B,GAAU,EAChB,kCEfA,SAAkB4C,QAAA,IAAAA,IAAAA,EAAW,IAC3B,IAAMC,IAAOzB,GACb,OAAOhV,GAASwW,GAAUC,CAC5B,yB4DCA,SAAmB7C,EAAgBC,GACjC,OAAOE,GAAeH,EAAQC,GAASoB,QAAO,SAACC,EAAMC,EAAKjM,GAAU,OAAAgM,GAAQhM,EAAQ,IAAM,IAAMiM,EAAIuB,gBAAe,GACrH,mCCUA,SAAgEnQ,EAAYL,EAAiBG,EAAkB4C,GAC7G,QAD0E,IAAA/C,IAAAA,EAAe,SAAoB,IAAA+C,IAAAA,GAAmB,IAC3HhK,EAAQsH,KAAWtH,EAAQiH,GAC9B,MAAO,GAET,IAAMO,EAAmBL,GAAwBC,GACjD,OAAKpH,EAAQiH,GAGRjH,EAAQsH,GAGND,GACL8C,GAAM7C,EAAOL,EAAOO,EAAkBwC,GACtCpC,GAAaN,EAAOL,EAAOO,EAAkBwC,GAC7CxC,EACAwC,GANOD,GAAK9C,EAAOO,EAAkBwC,GAH9BD,GAAKzC,EAAOE,EAAkBwC,EAWzC,QCxCA,eAAa,IAAkB0N,EAAA,GAAAxK,EAAA,EAAlBA,EAAkBjF,UAAAe,OAAlBkE,IAAAwK,EAAkBxK,GAAAjF,UAAAiF,GAC7B,OAAO3C,GAAMmN,EACf"}
|