{"ScriptPreparationCode":"var data = [\r\n {\r\n description: \u0022equal numbers\u0022,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n },\r\n {\r\n description: \u0022not equal numbers\u0022,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n },\r\n {\r\n description: \u0022number and array are not equal\u0022,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n },\r\n {\r\n description: \u00220 and null are not equal\u0022,\r\n value1: 0,\r\n value2: null,\r\n equal: false,\r\n },\r\n {\r\n description: \u0022equal strings\u0022,\r\n value1: \u0022a\u0022,\r\n value2: \u0022a\u0022,\r\n equal: true,\r\n },\r\n {\r\n description: \u0022big object\u0022,\r\n value1: {\r\n prop1: \u0022value1\u0022,\r\n prop2: \u0022value2\u0022,\r\n prop3: \u0022value3\u0022,\r\n prop4: {\r\n subProp1: \u0022sub value1\u0022,\r\n subProp2: {\r\n subSubProp1: \u0022sub sub value1\u0022,\r\n subSubProp2: [1, 2, { prop2: 1, prop: 2 }, 4, 5],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0022value3\u0022,\r\n prop1: \u0022value1\u0022,\r\n prop2: \u0022value2\u0022,\r\n prop6: new Date(\u00222016/03/10\u0022),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0022sub sub value1\u0022,\r\n subSubProp2: [1, 2, { prop2: 1, prop: 2 }, 4, 5],\r\n },\r\n subProp1: \u0022sub value1\u0022,\r\n },\r\n },\r\n equal: true,\r\n },\r\n];\r\n\r\n// https://unpkg.com/lodash.isequal@4.5.0/index.js\r\n\r\n/**\r\n * Lodash (Custom Build) \u003Chttps://lodash.com/\u003E\r\n * Build: \u0060lodash modularize exports=\u0022npm\u0022 -o ./\u0060\r\n * Copyright JS Foundation and other contributors \u003Chttps://js.foundation/\u003E\r\n * Released under MIT license \u003Chttps://lodash.com/license\u003E\r\n * Based on Underscore.js 1.8.3 \u003Chttp://underscorejs.org/LICENSE\u003E\r\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters \u0026 Editors\r\n */\r\n\r\n/** Used as the size to enable large array optimizations. */\r\nvar LARGE_ARRAY_SIZE = 200;\r\n\r\n/** Used to stand-in for \u0060undefined\u0060 hash values. */\r\nvar HASH_UNDEFINED = \u0022__lodash_hash_undefined__\u0022;\r\n\r\n/** Used to compose bitmasks for value comparisons. */\r\nvar COMPARE_PARTIAL_FLAG = 1,\r\n COMPARE_UNORDERED_FLAG = 2;\r\n\r\n/** Used as references for various \u0060Number\u0060 constants. */\r\nvar MAX_SAFE_INTEGER = 9007199254740991;\r\n\r\n/** \u0060Object#toString\u0060 result references. */\r\nvar argsTag = \u0022[object Arguments]\u0022,\r\n arrayTag = \u0022[object Array]\u0022,\r\n asyncTag = \u0022[object AsyncFunction]\u0022,\r\n boolTag = \u0022[object Boolean]\u0022,\r\n dateTag = \u0022[object Date]\u0022,\r\n errorTag = \u0022[object Error]\u0022,\r\n funcTag = \u0022[object Function]\u0022,\r\n genTag = \u0022[object GeneratorFunction]\u0022,\r\n mapTag = \u0022[object Map]\u0022,\r\n numberTag = \u0022[object Number]\u0022,\r\n nullTag = \u0022[object Null]\u0022,\r\n objectTag = \u0022[object Object]\u0022,\r\n promiseTag = \u0022[object Promise]\u0022,\r\n proxyTag = \u0022[object Proxy]\u0022,\r\n regexpTag = \u0022[object RegExp]\u0022,\r\n setTag = \u0022[object Set]\u0022,\r\n stringTag = \u0022[object String]\u0022,\r\n symbolTag = \u0022[object Symbol]\u0022,\r\n undefinedTag = \u0022[object Undefined]\u0022,\r\n weakMapTag = \u0022[object WeakMap]\u0022;\r\n\r\nvar arrayBufferTag = \u0022[object ArrayBuffer]\u0022,\r\n dataViewTag = \u0022[object DataView]\u0022,\r\n float32Tag = \u0022[object Float32Array]\u0022,\r\n float64Tag = \u0022[object Float64Array]\u0022,\r\n int8Tag = \u0022[object Int8Array]\u0022,\r\n int16Tag = \u0022[object Int16Array]\u0022,\r\n int32Tag = \u0022[object Int32Array]\u0022,\r\n uint8Tag = \u0022[object Uint8Array]\u0022,\r\n uint8ClampedTag = \u0022[object Uint8ClampedArray]\u0022,\r\n uint16Tag = \u0022[object Uint16Array]\u0022,\r\n uint32Tag = \u0022[object Uint32Array]\u0022;\r\n\r\n/**\r\n * Used to match \u0060RegExp\u0060\r\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\r\n */\r\nvar reRegExpChar = /[\\\\^$.*\u002B?()[\\]{}|]/g;\r\n\r\n/** Used to detect host constructors (Safari). */\r\nvar reIsHostCtor = /^\\[object .\u002B?Constructor\\]$/;\r\n\r\n/** Used to detect unsigned integer values. */\r\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\r\n\r\n/** Used to identify \u0060toStringTag\u0060 values of typed arrays. */\r\nvar typedArrayTags = {};\r\ntypedArrayTags[float32Tag] =\r\n typedArrayTags[float64Tag] =\r\n typedArrayTags[int8Tag] =\r\n typedArrayTags[int16Tag] =\r\n typedArrayTags[int32Tag] =\r\n typedArrayTags[uint8Tag] =\r\n typedArrayTags[uint8ClampedTag] =\r\n typedArrayTags[uint16Tag] =\r\n typedArrayTags[uint32Tag] =\r\n true;\r\ntypedArrayTags[argsTag] =\r\n typedArrayTags[arrayTag] =\r\n typedArrayTags[arrayBufferTag] =\r\n typedArrayTags[boolTag] =\r\n typedArrayTags[dataViewTag] =\r\n typedArrayTags[dateTag] =\r\n typedArrayTags[errorTag] =\r\n typedArrayTags[funcTag] =\r\n typedArrayTags[mapTag] =\r\n typedArrayTags[numberTag] =\r\n typedArrayTags[objectTag] =\r\n typedArrayTags[regexpTag] =\r\n typedArrayTags[setTag] =\r\n typedArrayTags[stringTag] =\r\n typedArrayTags[weakMapTag] =\r\n false;\r\n\r\n/** Detect free variable \u0060global\u0060 from Node.js. */\r\nvar freeGlobal =\r\n typeof global == \u0022object\u0022 \u0026\u0026 global \u0026\u0026 global.Object === Object \u0026\u0026 global;\r\n\r\n/** Detect free variable \u0060self\u0060. */\r\nvar freeSelf =\r\n typeof self == \u0022object\u0022 \u0026\u0026 self \u0026\u0026 self.Object === Object \u0026\u0026 self;\r\n\r\n/** Used as a reference to the global object. */\r\nvar root = freeGlobal || freeSelf || Function(\u0022return this\u0022)();\r\n\r\n/** Detect free variable \u0060exports\u0060. */\r\nvar freeExports =\r\n typeof exports == \u0022object\u0022 \u0026\u0026 exports \u0026\u0026 !exports.nodeType \u0026\u0026 exports;\r\n\r\n/** Detect free variable \u0060module\u0060. */\r\nvar freeModule =\r\n freeExports \u0026\u0026\r\n typeof module == \u0022object\u0022 \u0026\u0026\r\n module \u0026\u0026\r\n !module.nodeType \u0026\u0026\r\n module;\r\n\r\n/** Detect the popular CommonJS extension \u0060module.exports\u0060. */\r\nvar moduleExports = freeModule \u0026\u0026 freeModule.exports === freeExports;\r\n\r\n/** Detect free variable \u0060process\u0060 from Node.js. */\r\nvar freeProcess = moduleExports \u0026\u0026 freeGlobal.process;\r\n\r\n/** Used to access faster Node.js helpers. */\r\nvar nodeUtil = (function () {\r\n try {\r\n return freeProcess \u0026\u0026 freeProcess.binding \u0026\u0026 freeProcess.binding(\u0022util\u0022);\r\n } catch (e) {}\r\n})();\r\n\r\n/* Node.js helper references. */\r\nvar nodeIsTypedArray = nodeUtil \u0026\u0026 nodeUtil.isTypedArray;\r\n\r\n/**\r\n * A specialized version of \u0060_.filter\u0060 for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {Array} Returns the new filtered array.\r\n */\r\nfunction arrayFilter(array, predicate) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length,\r\n resIndex = 0,\r\n result = [];\r\n\r\n while (\u002B\u002Bindex \u003C length) {\r\n var value = array[index];\r\n if (predicate(value, index, array)) {\r\n result[resIndex\u002B\u002B] = value;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Appends the elements of \u0060values\u0060 to \u0060array\u0060.\r\n *\r\n * @private\r\n * @param {Array} array The array to modify.\r\n * @param {Array} values The values to append.\r\n * @returns {Array} Returns \u0060array\u0060.\r\n */\r\nfunction arrayPush(array, values) {\r\n var index = -1,\r\n length = values.length,\r\n offset = array.length;\r\n\r\n while (\u002B\u002Bindex \u003C length) {\r\n array[offset \u002B index] = values[index];\r\n }\r\n return array;\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060_.some\u0060 for arrays without support for iteratee\r\n * shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @returns {boolean} Returns \u0060true\u0060 if any element passes the predicate check,\r\n * else \u0060false\u0060.\r\n */\r\nfunction arraySome(array, predicate) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (\u002B\u002Bindex \u003C length) {\r\n if (predicate(array[index], index, array)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.times\u0060 without support for iteratee shorthands\r\n * or max array length checks.\r\n *\r\n * @private\r\n * @param {number} n The number of times to invoke \u0060iteratee\u0060.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the array of results.\r\n */\r\nfunction baseTimes(n, iteratee) {\r\n var index = -1,\r\n result = Array(n);\r\n\r\n while (\u002B\u002Bindex \u003C n) {\r\n result[index] = iteratee(index);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.unary\u0060 without support for storing metadata.\r\n *\r\n * @private\r\n * @param {Function} func The function to cap arguments for.\r\n * @returns {Function} Returns the new capped function.\r\n */\r\nfunction baseUnary(func) {\r\n return function (value) {\r\n return func(value);\r\n };\r\n}\r\n\r\n/**\r\n * Checks if a \u0060cache\u0060 value for \u0060key\u0060 exists.\r\n *\r\n * @private\r\n * @param {Object} cache The cache to query.\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if an entry for \u0060key\u0060 exists, else \u0060false\u0060.\r\n */\r\nfunction cacheHas(cache, key) {\r\n return cache.has(key);\r\n}\r\n\r\n/**\r\n * Gets the value at \u0060key\u0060 of \u0060object\u0060.\r\n *\r\n * @private\r\n * @param {Object} [object] The object to query.\r\n * @param {string} key The key of the property to get.\r\n * @returns {*} Returns the property value.\r\n */\r\nfunction getValue(object, key) {\r\n return object == null ? undefined : object[key];\r\n}\r\n\r\n/**\r\n * Converts \u0060map\u0060 to its key-value pairs.\r\n *\r\n * @private\r\n * @param {Object} map The map to convert.\r\n * @returns {Array} Returns the key-value pairs.\r\n */\r\nfunction mapToArray(map) {\r\n var index = -1,\r\n result = Array(map.size);\r\n\r\n map.forEach(function (value, key) {\r\n result[\u002B\u002Bindex] = [key, value];\r\n });\r\n return result;\r\n}\r\n\r\n/**\r\n * Creates a unary function that invokes \u0060func\u0060 with its argument transformed.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {Function} transform The argument transform.\r\n * @returns {Function} Returns the new function.\r\n */\r\nfunction overArg(func, transform) {\r\n return function (arg) {\r\n return func(transform(arg));\r\n };\r\n}\r\n\r\n/**\r\n * Converts \u0060set\u0060 to an array of its values.\r\n *\r\n * @private\r\n * @param {Object} set The set to convert.\r\n * @returns {Array} Returns the values.\r\n */\r\nfunction setToArray(set) {\r\n var index = -1,\r\n result = Array(set.size);\r\n\r\n set.forEach(function (value) {\r\n result[\u002B\u002Bindex] = value;\r\n });\r\n return result;\r\n}\r\n\r\n/** Used for built-in method references. */\r\nvar arrayProto = Array.prototype,\r\n funcProto = Function.prototype,\r\n objectProto = Object.prototype;\r\n\r\n/** Used to detect overreaching core-js shims. */\r\nvar coreJsData = root[\u0022__core-js_shared__\u0022];\r\n\r\n/** Used to resolve the decompiled source of functions. */\r\nvar funcToString = funcProto.toString;\r\n\r\n/** Used to check objects for own properties. */\r\nvar hasOwnProperty = objectProto.hasOwnProperty;\r\n\r\n/** Used to detect methods masquerading as native. */\r\nvar maskSrcKey = (function () {\r\n var uid = /[^.]\u002B$/.exec(\r\n (coreJsData \u0026\u0026 coreJsData.keys \u0026\u0026 coreJsData.keys.IE_PROTO) || \u0022\u0022\r\n );\r\n return uid ? \u0022Symbol(src)_1.\u0022 \u002B uid : \u0022\u0022;\r\n})();\r\n\r\n/**\r\n * Used to resolve the\r\n * [\u0060toStringTag\u0060](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\r\n * of values.\r\n */\r\nvar nativeObjectToString = objectProto.toString;\r\n\r\n/** Used to detect if a method is native. */\r\nvar reIsNative = RegExp(\r\n \u0022^\u0022 \u002B\r\n funcToString\r\n .call(hasOwnProperty)\r\n .replace(reRegExpChar, \u0022\\\\$\u0026\u0022)\r\n .replace(\r\n /hasOwnProperty|(function).*?(?=\\\\\\()| for .\u002B?(?=\\\\\\])/g,\r\n \u0022$1.*?\u0022\r\n ) \u002B\r\n \u0022$\u0022\r\n);\r\n\r\n/** Built-in value references. */\r\nvar Buffer = moduleExports ? root.Buffer : undefined,\r\n Symbol = root.Symbol,\r\n Uint8Array = root.Uint8Array,\r\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\r\n splice = arrayProto.splice,\r\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\r\n\r\n/* Built-in method references for those with the same name as other \u0060lodash\u0060 methods. */\r\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\r\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\r\n nativeKeys = overArg(Object.keys, Object);\r\n\r\n/* Built-in method references that are verified to be native. */\r\nvar DataView = getNative(root, \u0022DataView\u0022),\r\n Map = getNative(root, \u0022Map\u0022),\r\n Promise = getNative(root, \u0022Promise\u0022),\r\n Set = getNative(root, \u0022Set\u0022),\r\n WeakMap = getNative(root, \u0022WeakMap\u0022),\r\n nativeCreate = getNative(Object, \u0022create\u0022);\r\n\r\n/** Used to detect maps, sets, and weakmaps. */\r\nvar dataViewCtorString = toSource(DataView),\r\n mapCtorString = toSource(Map),\r\n promiseCtorString = toSource(Promise),\r\n setCtorString = toSource(Set),\r\n weakMapCtorString = toSource(WeakMap);\r\n\r\n/** Used to convert symbols to primitives and strings. */\r\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\r\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\r\n\r\n/**\r\n * Creates a hash object.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\nfunction Hash(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (\u002B\u002Bindex \u003C length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes all key-value entries from the hash.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf Hash\r\n */\r\nfunction hashClear() {\r\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\r\n this.size = 0;\r\n}\r\n\r\n/**\r\n * Removes \u0060key\u0060 and its value from the hash.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf Hash\r\n * @param {Object} hash The hash to modify.\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns \u0060true\u0060 if the entry was removed, else \u0060false\u0060.\r\n */\r\nfunction hashDelete(key) {\r\n var result = this.has(key) \u0026\u0026 delete this.__data__[key];\r\n this.size -= result ? 1 : 0;\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets the hash value for \u0060key\u0060.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf Hash\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\nfunction hashGet(key) {\r\n var data = this.__data__;\r\n if (nativeCreate) {\r\n var result = data[key];\r\n return result === HASH_UNDEFINED ? undefined : result;\r\n }\r\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\r\n}\r\n\r\n/**\r\n * Checks if a hash value for \u0060key\u0060 exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf Hash\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if an entry for \u0060key\u0060 exists, else \u0060false\u0060.\r\n */\r\nfunction hashHas(key) {\r\n var data = this.__data__;\r\n return nativeCreate\r\n ? data[key] !== undefined\r\n : hasOwnProperty.call(data, key);\r\n}\r\n\r\n/**\r\n * Sets the hash \u0060key\u0060 to \u0060value\u0060.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf Hash\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the hash instance.\r\n */\r\nfunction hashSet(key, value) {\r\n var data = this.__data__;\r\n this.size \u002B= this.has(key) ? 0 : 1;\r\n data[key] = nativeCreate \u0026\u0026 value === undefined ? HASH_UNDEFINED : value;\r\n return this;\r\n}\r\n\r\n// Add methods to \u0060Hash\u0060.\r\nHash.prototype.clear = hashClear;\r\nHash.prototype[\u0022delete\u0022] = hashDelete;\r\nHash.prototype.get = hashGet;\r\nHash.prototype.has = hashHas;\r\nHash.prototype.set = hashSet;\r\n\r\n/**\r\n * Creates an list cache object.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\nfunction ListCache(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (\u002B\u002Bindex \u003C length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes all key-value entries from the list cache.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf ListCache\r\n */\r\nfunction listCacheClear() {\r\n this.__data__ = [];\r\n this.size = 0;\r\n}\r\n\r\n/**\r\n * Removes \u0060key\u0060 and its value from the list cache.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns \u0060true\u0060 if the entry was removed, else \u0060false\u0060.\r\n */\r\nfunction listCacheDelete(key) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n if (index \u003C 0) {\r\n return false;\r\n }\r\n var lastIndex = data.length - 1;\r\n if (index == lastIndex) {\r\n data.pop();\r\n } else {\r\n splice.call(data, index, 1);\r\n }\r\n --this.size;\r\n return true;\r\n}\r\n\r\n/**\r\n * Gets the list cache value for \u0060key\u0060.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\nfunction listCacheGet(key) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n return index \u003C 0 ? undefined : data[index][1];\r\n}\r\n\r\n/**\r\n * Checks if a list cache value for \u0060key\u0060 exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf ListCache\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if an entry for \u0060key\u0060 exists, else \u0060false\u0060.\r\n */\r\nfunction listCacheHas(key) {\r\n return assocIndexOf(this.__data__, key) \u003E -1;\r\n}\r\n\r\n/**\r\n * Sets the list cache \u0060key\u0060 to \u0060value\u0060.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf ListCache\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the list cache instance.\r\n */\r\nfunction listCacheSet(key, value) {\r\n var data = this.__data__,\r\n index = assocIndexOf(data, key);\r\n\r\n if (index \u003C 0) {\r\n \u002B\u002Bthis.size;\r\n data.push([key, value]);\r\n } else {\r\n data[index][1] = value;\r\n }\r\n return this;\r\n}\r\n\r\n// Add methods to \u0060ListCache\u0060.\r\nListCache.prototype.clear = listCacheClear;\r\nListCache.prototype[\u0022delete\u0022] = listCacheDelete;\r\nListCache.prototype.get = listCacheGet;\r\nListCache.prototype.has = listCacheHas;\r\nListCache.prototype.set = listCacheSet;\r\n\r\n/**\r\n * Creates a map cache object to store key-value pairs.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\nfunction MapCache(entries) {\r\n var index = -1,\r\n length = entries == null ? 0 : entries.length;\r\n\r\n this.clear();\r\n while (\u002B\u002Bindex \u003C length) {\r\n var entry = entries[index];\r\n this.set(entry[0], entry[1]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes all key-value entries from the map.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf MapCache\r\n */\r\nfunction mapCacheClear() {\r\n this.size = 0;\r\n this.__data__ = {\r\n hash: new Hash(),\r\n map: new (Map || ListCache)(),\r\n string: new Hash(),\r\n };\r\n}\r\n\r\n/**\r\n * Removes \u0060key\u0060 and its value from the map.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns \u0060true\u0060 if the entry was removed, else \u0060false\u0060.\r\n */\r\nfunction mapCacheDelete(key) {\r\n var result = getMapData(this, key)[\u0022delete\u0022](key);\r\n this.size -= result ? 1 : 0;\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets the map value for \u0060key\u0060.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\nfunction mapCacheGet(key) {\r\n return getMapData(this, key).get(key);\r\n}\r\n\r\n/**\r\n * Checks if a map value for \u0060key\u0060 exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf MapCache\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if an entry for \u0060key\u0060 exists, else \u0060false\u0060.\r\n */\r\nfunction mapCacheHas(key) {\r\n return getMapData(this, key).has(key);\r\n}\r\n\r\n/**\r\n * Sets the map \u0060key\u0060 to \u0060value\u0060.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf MapCache\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the map cache instance.\r\n */\r\nfunction mapCacheSet(key, value) {\r\n var data = getMapData(this, key),\r\n size = data.size;\r\n\r\n data.set(key, value);\r\n this.size \u002B= data.size == size ? 0 : 1;\r\n return this;\r\n}\r\n\r\n// Add methods to \u0060MapCache\u0060.\r\nMapCache.prototype.clear = mapCacheClear;\r\nMapCache.prototype[\u0022delete\u0022] = mapCacheDelete;\r\nMapCache.prototype.get = mapCacheGet;\r\nMapCache.prototype.has = mapCacheHas;\r\nMapCache.prototype.set = mapCacheSet;\r\n\r\n/**\r\n *\r\n * Creates an array cache object to store unique values.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [values] The values to cache.\r\n */\r\nfunction SetCache(values) {\r\n var index = -1,\r\n length = values == null ? 0 : values.length;\r\n\r\n this.__data__ = new MapCache();\r\n while (\u002B\u002Bindex \u003C length) {\r\n this.add(values[index]);\r\n }\r\n}\r\n\r\n/**\r\n * Adds \u0060value\u0060 to the array cache.\r\n *\r\n * @private\r\n * @name add\r\n * @memberOf SetCache\r\n * @alias push\r\n * @param {*} value The value to cache.\r\n * @returns {Object} Returns the cache instance.\r\n */\r\nfunction setCacheAdd(value) {\r\n this.__data__.set(value, HASH_UNDEFINED);\r\n return this;\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is in the array cache.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf SetCache\r\n * @param {*} value The value to search for.\r\n * @returns {number} Returns \u0060true\u0060 if \u0060value\u0060 is found, else \u0060false\u0060.\r\n */\r\nfunction setCacheHas(value) {\r\n return this.__data__.has(value);\r\n}\r\n\r\n// Add methods to \u0060SetCache\u0060.\r\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\r\nSetCache.prototype.has = setCacheHas;\r\n\r\n/**\r\n * Creates a stack cache object to store key-value pairs.\r\n *\r\n * @private\r\n * @constructor\r\n * @param {Array} [entries] The key-value pairs to cache.\r\n */\r\nfunction Stack(entries) {\r\n var data = (this.__data__ = new ListCache(entries));\r\n this.size = data.size;\r\n}\r\n\r\n/**\r\n * Removes all key-value entries from the stack.\r\n *\r\n * @private\r\n * @name clear\r\n * @memberOf Stack\r\n */\r\nfunction stackClear() {\r\n this.__data__ = new ListCache();\r\n this.size = 0;\r\n}\r\n\r\n/**\r\n * Removes \u0060key\u0060 and its value from the stack.\r\n *\r\n * @private\r\n * @name delete\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to remove.\r\n * @returns {boolean} Returns \u0060true\u0060 if the entry was removed, else \u0060false\u0060.\r\n */\r\nfunction stackDelete(key) {\r\n var data = this.__data__,\r\n result = data[\u0022delete\u0022](key);\r\n\r\n this.size = data.size;\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets the stack value for \u0060key\u0060.\r\n *\r\n * @private\r\n * @name get\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to get.\r\n * @returns {*} Returns the entry value.\r\n */\r\nfunction stackGet(key) {\r\n return this.__data__.get(key);\r\n}\r\n\r\n/**\r\n * Checks if a stack value for \u0060key\u0060 exists.\r\n *\r\n * @private\r\n * @name has\r\n * @memberOf Stack\r\n * @param {string} key The key of the entry to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if an entry for \u0060key\u0060 exists, else \u0060false\u0060.\r\n */\r\nfunction stackHas(key) {\r\n return this.__data__.has(key);\r\n}\r\n\r\n/**\r\n * Sets the stack \u0060key\u0060 to \u0060value\u0060.\r\n *\r\n * @private\r\n * @name set\r\n * @memberOf Stack\r\n * @param {string} key The key of the value to set.\r\n * @param {*} value The value to set.\r\n * @returns {Object} Returns the stack cache instance.\r\n */\r\nfunction stackSet(key, value) {\r\n var data = this.__data__;\r\n if (data instanceof ListCache) {\r\n var pairs = data.__data__;\r\n if (!Map || pairs.length \u003C LARGE_ARRAY_SIZE - 1) {\r\n pairs.push([key, value]);\r\n this.size = \u002B\u002Bdata.size;\r\n return this;\r\n }\r\n data = this.__data__ = new MapCache(pairs);\r\n }\r\n data.set(key, value);\r\n this.size = data.size;\r\n return this;\r\n}\r\n\r\n// Add methods to \u0060Stack\u0060.\r\nStack.prototype.clear = stackClear;\r\nStack.prototype[\u0022delete\u0022] = stackDelete;\r\nStack.prototype.get = stackGet;\r\nStack.prototype.has = stackHas;\r\nStack.prototype.set = stackSet;\r\n\r\n/**\r\n * Creates an array of the enumerable property names of the array-like \u0060value\u0060.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @param {boolean} inherited Specify returning inherited property names.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\nfunction arrayLikeKeys(value, inherited) {\r\n var isArr = isArray(value),\r\n isArg = !isArr \u0026\u0026 isArguments(value),\r\n isBuff = !isArr \u0026\u0026 !isArg \u0026\u0026 isBuffer(value),\r\n isType = !isArr \u0026\u0026 !isArg \u0026\u0026 !isBuff \u0026\u0026 isTypedArray(value),\r\n skipIndexes = isArr || isArg || isBuff || isType,\r\n result = skipIndexes ? baseTimes(value.length, String) : [],\r\n length = result.length;\r\n\r\n for (var key in value) {\r\n if (\r\n (inherited || hasOwnProperty.call(value, key)) \u0026\u0026\r\n !(\r\n skipIndexes \u0026\u0026\r\n // Safari 9 has enumerable \u0060arguments.length\u0060 in strict mode.\r\n (key == \u0022length\u0022 ||\r\n // Node.js 0.10 has enumerable non-index properties on buffers.\r\n (isBuff \u0026\u0026 (key == \u0022offset\u0022 || key == \u0022parent\u0022)) ||\r\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\r\n (isType \u0026\u0026\r\n (key == \u0022buffer\u0022 || key == \u0022byteLength\u0022 || key == \u0022byteOffset\u0022)) ||\r\n // Skip index properties.\r\n isIndex(key, length))\r\n )\r\n ) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets the index at which the \u0060key\u0060 is found in \u0060array\u0060 of key-value pairs.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} key The key to search for.\r\n * @returns {number} Returns the index of the matched value, else \u0060-1\u0060.\r\n */\r\nfunction assocIndexOf(array, key) {\r\n var length = array.length;\r\n while (length--) {\r\n if (eq(array[length][0], key)) {\r\n return length;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060getAllKeys\u0060 and \u0060getAllKeysIn\u0060 which uses\r\n * \u0060keysFunc\u0060 and \u0060symbolsFunc\u0060 to get the enumerable property names and\r\n * symbols of \u0060object\u0060.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {Function} keysFunc The function to get the keys of \u0060object\u0060.\r\n * @param {Function} symbolsFunc The function to get the symbols of \u0060object\u0060.\r\n * @returns {Array} Returns the array of property names and symbols.\r\n */\r\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\r\n var result = keysFunc(object);\r\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060getTag\u0060 without fallbacks for buggy environments.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the \u0060toStringTag\u0060.\r\n */\r\nfunction baseGetTag(value) {\r\n if (value == null) {\r\n return value === undefined ? undefinedTag : nullTag;\r\n }\r\n return symToStringTag \u0026\u0026 symToStringTag in Object(value)\r\n ? getRawTag(value)\r\n : objectToString(value);\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.isArguments\u0060.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is an \u0060arguments\u0060 object,\r\n */\r\nfunction baseIsArguments(value) {\r\n return isObjectLike(value) \u0026\u0026 baseGetTag(value) == argsTag;\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.isEqual\u0060 which supports partial comparisons\r\n * and tracks traversed objects.\r\n *\r\n * @private\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @param {boolean} bitmask The bitmask flags.\r\n * 1 - Unordered comparison\r\n * 2 - Partial comparison\r\n * @param {Function} [customizer] The function to customize comparisons.\r\n * @param {Object} [stack] Tracks traversed \u0060value\u0060 and \u0060other\u0060 objects.\r\n * @returns {boolean} Returns \u0060true\u0060 if the values are equivalent, else \u0060false\u0060.\r\n */\r\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\r\n if (value === other) {\r\n return true;\r\n }\r\n if (\r\n value == null ||\r\n other == null ||\r\n (!isObjectLike(value) \u0026\u0026 !isObjectLike(other))\r\n ) {\r\n return value !== value \u0026\u0026 other !== other;\r\n }\r\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060baseIsEqual\u0060 for arrays and objects which performs\r\n * deep comparisons and tracks traversed objects enabling objects with circular\r\n * references to be compared.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {number} bitmask The bitmask flags. See \u0060baseIsEqual\u0060 for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} [stack] Tracks traversed \u0060object\u0060 and \u0060other\u0060 objects.\r\n * @returns {boolean} Returns \u0060true\u0060 if the objects are equivalent, else \u0060false\u0060.\r\n */\r\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\r\n var objIsArr = isArray(object),\r\n othIsArr = isArray(other),\r\n objTag = objIsArr ? arrayTag : getTag(object),\r\n othTag = othIsArr ? arrayTag : getTag(other);\r\n\r\n objTag = objTag == argsTag ? objectTag : objTag;\r\n othTag = othTag == argsTag ? objectTag : othTag;\r\n\r\n var objIsObj = objTag == objectTag,\r\n othIsObj = othTag == objectTag,\r\n isSameTag = objTag == othTag;\r\n\r\n if (isSameTag \u0026\u0026 isBuffer(object)) {\r\n if (!isBuffer(other)) {\r\n return false;\r\n }\r\n objIsArr = true;\r\n objIsObj = false;\r\n }\r\n if (isSameTag \u0026\u0026 !objIsObj) {\r\n stack || (stack = new Stack());\r\n return objIsArr || isTypedArray(object)\r\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\r\n : equalByTag(\r\n object,\r\n other,\r\n objTag,\r\n bitmask,\r\n customizer,\r\n equalFunc,\r\n stack\r\n );\r\n }\r\n if (!(bitmask \u0026 COMPARE_PARTIAL_FLAG)) {\r\n var objIsWrapped = objIsObj \u0026\u0026 hasOwnProperty.call(object, \u0022__wrapped__\u0022),\r\n othIsWrapped = othIsObj \u0026\u0026 hasOwnProperty.call(other, \u0022__wrapped__\u0022);\r\n\r\n if (objIsWrapped || othIsWrapped) {\r\n var objUnwrapped = objIsWrapped ? object.value() : object,\r\n othUnwrapped = othIsWrapped ? other.value() : other;\r\n\r\n stack || (stack = new Stack());\r\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\r\n }\r\n }\r\n if (!isSameTag) {\r\n return false;\r\n }\r\n stack || (stack = new Stack());\r\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.isNative\u0060 without bad shim checks.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a native function,\r\n * else \u0060false\u0060.\r\n */\r\nfunction baseIsNative(value) {\r\n if (!isObject(value) || isMasked(value)) {\r\n return false;\r\n }\r\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\r\n return pattern.test(toSource(value));\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.isTypedArray\u0060 without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a typed array, else \u0060false\u0060.\r\n */\r\nfunction baseIsTypedArray(value) {\r\n return (\r\n isObjectLike(value) \u0026\u0026\r\n isLength(value.length) \u0026\u0026\r\n !!typedArrayTags[baseGetTag(value)]\r\n );\r\n}\r\n\r\n/**\r\n * The base implementation of \u0060_.keys\u0060 which doesn\u0027t treat sparse arrays as dense.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\nfunction baseKeys(object) {\r\n if (!isPrototype(object)) {\r\n return nativeKeys(object);\r\n }\r\n var result = [];\r\n for (var key in Object(object)) {\r\n if (hasOwnProperty.call(object, key) \u0026\u0026 key != \u0022constructor\u0022) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060baseIsEqualDeep\u0060 for arrays with support for\r\n * partial deep comparisons.\r\n *\r\n * @private\r\n * @param {Array} array The array to compare.\r\n * @param {Array} other The other array to compare.\r\n * @param {number} bitmask The bitmask flags. See \u0060baseIsEqual\u0060 for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed \u0060array\u0060 and \u0060other\u0060 objects.\r\n * @returns {boolean} Returns \u0060true\u0060 if the arrays are equivalent, else \u0060false\u0060.\r\n */\r\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\r\n var isPartial = bitmask \u0026 COMPARE_PARTIAL_FLAG,\r\n arrLength = array.length,\r\n othLength = other.length;\r\n\r\n if (arrLength != othLength \u0026\u0026 !(isPartial \u0026\u0026 othLength \u003E arrLength)) {\r\n return false;\r\n }\r\n // Assume cyclic values are equal.\r\n var stacked = stack.get(array);\r\n if (stacked \u0026\u0026 stack.get(other)) {\r\n return stacked == other;\r\n }\r\n var index = -1,\r\n result = true,\r\n seen = bitmask \u0026 COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\r\n\r\n stack.set(array, other);\r\n stack.set(other, array);\r\n\r\n // Ignore non-index properties.\r\n while (\u002B\u002Bindex \u003C arrLength) {\r\n var arrValue = array[index],\r\n othValue = other[index];\r\n\r\n if (customizer) {\r\n var compared = isPartial\r\n ? customizer(othValue, arrValue, index, other, array, stack)\r\n : customizer(arrValue, othValue, index, array, other, stack);\r\n }\r\n if (compared !== undefined) {\r\n if (compared) {\r\n continue;\r\n }\r\n result = false;\r\n break;\r\n }\r\n // Recursively compare arrays (susceptible to call stack limits).\r\n if (seen) {\r\n if (\r\n !arraySome(other, function (othValue, othIndex) {\r\n if (\r\n !cacheHas(seen, othIndex) \u0026\u0026\r\n (arrValue === othValue ||\r\n equalFunc(arrValue, othValue, bitmask, customizer, stack))\r\n ) {\r\n return seen.push(othIndex);\r\n }\r\n })\r\n ) {\r\n result = false;\r\n break;\r\n }\r\n } else if (\r\n !(\r\n arrValue === othValue ||\r\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\r\n )\r\n ) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n stack[\u0022delete\u0022](array);\r\n stack[\u0022delete\u0022](other);\r\n return result;\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060baseIsEqualDeep\u0060 for comparing objects of\r\n * the same \u0060toStringTag\u0060.\r\n *\r\n * **Note:** This function only supports comparing values with tags of\r\n * \u0060Boolean\u0060, \u0060Date\u0060, \u0060Error\u0060, \u0060Number\u0060, \u0060RegExp\u0060, or \u0060String\u0060.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {string} tag The \u0060toStringTag\u0060 of the objects to compare.\r\n * @param {number} bitmask The bitmask flags. See \u0060baseIsEqual\u0060 for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed \u0060object\u0060 and \u0060other\u0060 objects.\r\n * @returns {boolean} Returns \u0060true\u0060 if the objects are equivalent, else \u0060false\u0060.\r\n */\r\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\r\n switch (tag) {\r\n case dataViewTag:\r\n if (\r\n object.byteLength != other.byteLength ||\r\n object.byteOffset != other.byteOffset\r\n ) {\r\n return false;\r\n }\r\n object = object.buffer;\r\n other = other.buffer;\r\n\r\n case arrayBufferTag:\r\n if (\r\n object.byteLength != other.byteLength ||\r\n !equalFunc(new Uint8Array(object), new Uint8Array(other))\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n\r\n case boolTag:\r\n case dateTag:\r\n case numberTag:\r\n // Coerce booleans to \u00601\u0060 or \u00600\u0060 and dates to milliseconds.\r\n // Invalid dates are coerced to \u0060NaN\u0060.\r\n return eq(\u002Bobject, \u002Bother);\r\n\r\n case errorTag:\r\n return object.name == other.name \u0026\u0026 object.message == other.message;\r\n\r\n case regexpTag:\r\n case stringTag:\r\n // Coerce regexes to strings and treat strings, primitives and objects,\r\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\r\n // for more details.\r\n return object == other \u002B \u0022\u0022;\r\n\r\n case mapTag:\r\n var convert = mapToArray;\r\n\r\n case setTag:\r\n var isPartial = bitmask \u0026 COMPARE_PARTIAL_FLAG;\r\n convert || (convert = setToArray);\r\n\r\n if (object.size != other.size \u0026\u0026 !isPartial) {\r\n return false;\r\n }\r\n // Assume cyclic values are equal.\r\n var stacked = stack.get(object);\r\n if (stacked) {\r\n return stacked == other;\r\n }\r\n bitmask |= COMPARE_UNORDERED_FLAG;\r\n\r\n // Recursively compare objects (susceptible to call stack limits).\r\n stack.set(object, other);\r\n var result = equalArrays(\r\n convert(object),\r\n convert(other),\r\n bitmask,\r\n customizer,\r\n equalFunc,\r\n stack\r\n );\r\n stack[\u0022delete\u0022](object);\r\n return result;\r\n\r\n case symbolTag:\r\n if (symbolValueOf) {\r\n return symbolValueOf.call(object) == symbolValueOf.call(other);\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060baseIsEqualDeep\u0060 for objects with support for\r\n * partial deep comparisons.\r\n *\r\n * @private\r\n * @param {Object} object The object to compare.\r\n * @param {Object} other The other object to compare.\r\n * @param {number} bitmask The bitmask flags. See \u0060baseIsEqual\u0060 for more details.\r\n * @param {Function} customizer The function to customize comparisons.\r\n * @param {Function} equalFunc The function to determine equivalents of values.\r\n * @param {Object} stack Tracks traversed \u0060object\u0060 and \u0060other\u0060 objects.\r\n * @returns {boolean} Returns \u0060true\u0060 if the objects are equivalent, else \u0060false\u0060.\r\n */\r\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\r\n var isPartial = bitmask \u0026 COMPARE_PARTIAL_FLAG,\r\n objProps = getAllKeys(object),\r\n objLength = objProps.length,\r\n othProps = getAllKeys(other),\r\n othLength = othProps.length;\r\n\r\n if (objLength != othLength \u0026\u0026 !isPartial) {\r\n return false;\r\n }\r\n var index = objLength;\r\n while (index--) {\r\n var key = objProps[index];\r\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\r\n return false;\r\n }\r\n }\r\n // Assume cyclic values are equal.\r\n var stacked = stack.get(object);\r\n if (stacked \u0026\u0026 stack.get(other)) {\r\n return stacked == other;\r\n }\r\n var result = true;\r\n stack.set(object, other);\r\n stack.set(other, object);\r\n\r\n var skipCtor = isPartial;\r\n while (\u002B\u002Bindex \u003C objLength) {\r\n key = objProps[index];\r\n var objValue = object[key],\r\n othValue = other[key];\r\n\r\n if (customizer) {\r\n var compared = isPartial\r\n ? customizer(othValue, objValue, key, other, object, stack)\r\n : customizer(objValue, othValue, key, object, other, stack);\r\n }\r\n // Recursively compare objects (susceptible to call stack limits).\r\n if (\r\n !(compared === undefined\r\n ? objValue === othValue ||\r\n equalFunc(objValue, othValue, bitmask, customizer, stack)\r\n : compared)\r\n ) {\r\n result = false;\r\n break;\r\n }\r\n skipCtor || (skipCtor = key == \u0022constructor\u0022);\r\n }\r\n if (result \u0026\u0026 !skipCtor) {\r\n var objCtor = object.constructor,\r\n othCtor = other.constructor;\r\n\r\n // Non \u0060Object\u0060 object instances with different constructors are not equal.\r\n if (\r\n objCtor != othCtor \u0026\u0026\r\n \u0022constructor\u0022 in object \u0026\u0026\r\n \u0022constructor\u0022 in other \u0026\u0026\r\n !(\r\n typeof objCtor == \u0022function\u0022 \u0026\u0026\r\n objCtor instanceof objCtor \u0026\u0026\r\n typeof othCtor == \u0022function\u0022 \u0026\u0026\r\n othCtor instanceof othCtor\r\n )\r\n ) {\r\n result = false;\r\n }\r\n }\r\n stack[\u0022delete\u0022](object);\r\n stack[\u0022delete\u0022](other);\r\n return result;\r\n}\r\n\r\n/**\r\n * Creates an array of own enumerable property names and symbols of \u0060object\u0060.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names and symbols.\r\n */\r\nfunction getAllKeys(object) {\r\n return baseGetAllKeys(object, keys, getSymbols);\r\n}\r\n\r\n/**\r\n * Gets the data for \u0060map\u0060.\r\n *\r\n * @private\r\n * @param {Object} map The map to query.\r\n * @param {string} key The reference key.\r\n * @returns {*} Returns the map data.\r\n */\r\nfunction getMapData(map, key) {\r\n var data = map.__data__;\r\n return isKeyable(key)\r\n ? data[typeof key == \u0022string\u0022 ? \u0022string\u0022 : \u0022hash\u0022]\r\n : data.map;\r\n}\r\n\r\n/**\r\n * Gets the native function at \u0060key\u0060 of \u0060object\u0060.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @param {string} key The key of the method to get.\r\n * @returns {*} Returns the function if it\u0027s native, else \u0060undefined\u0060.\r\n */\r\nfunction getNative(object, key) {\r\n var value = getValue(object, key);\r\n return baseIsNative(value) ? value : undefined;\r\n}\r\n\r\n/**\r\n * A specialized version of \u0060baseGetTag\u0060 which ignores \u0060Symbol.toStringTag\u0060 values.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the raw \u0060toStringTag\u0060.\r\n */\r\nfunction getRawTag(value) {\r\n var isOwn = hasOwnProperty.call(value, symToStringTag),\r\n tag = value[symToStringTag];\r\n\r\n try {\r\n value[symToStringTag] = undefined;\r\n var unmasked = true;\r\n } catch (e) {}\r\n\r\n var result = nativeObjectToString.call(value);\r\n if (unmasked) {\r\n if (isOwn) {\r\n value[symToStringTag] = tag;\r\n } else {\r\n delete value[symToStringTag];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Creates an array of the own enumerable symbols of \u0060object\u0060.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of symbols.\r\n */\r\nvar getSymbols = !nativeGetSymbols\r\n ? stubArray\r\n : function (object) {\r\n if (object == null) {\r\n return [];\r\n }\r\n object = Object(object);\r\n return arrayFilter(nativeGetSymbols(object), function (symbol) {\r\n return propertyIsEnumerable.call(object, symbol);\r\n });\r\n };\r\n\r\n/**\r\n * Gets the \u0060toStringTag\u0060 of \u0060value\u0060.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the \u0060toStringTag\u0060.\r\n */\r\nvar getTag = baseGetTag;\r\n\r\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js \u003C 6.\r\nif (\r\n (DataView \u0026\u0026 getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\r\n (Map \u0026\u0026 getTag(new Map()) != mapTag) ||\r\n (Promise \u0026\u0026 getTag(Promise.resolve()) != promiseTag) ||\r\n (Set \u0026\u0026 getTag(new Set()) != setTag) ||\r\n (WeakMap \u0026\u0026 getTag(new WeakMap()) != weakMapTag)\r\n) {\r\n getTag = function (value) {\r\n var result = baseGetTag(value),\r\n Ctor = result == objectTag ? value.constructor : undefined,\r\n ctorString = Ctor ? toSource(Ctor) : \u0022\u0022;\r\n\r\n if (ctorString) {\r\n switch (ctorString) {\r\n case dataViewCtorString:\r\n return dataViewTag;\r\n case mapCtorString:\r\n return mapTag;\r\n case promiseCtorString:\r\n return promiseTag;\r\n case setCtorString:\r\n return setTag;\r\n case weakMapCtorString:\r\n return weakMapTag;\r\n }\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is a valid array-like index.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a valid index, else \u0060false\u0060.\r\n */\r\nfunction isIndex(value, length) {\r\n length = length == null ? MAX_SAFE_INTEGER : length;\r\n return (\r\n !!length \u0026\u0026\r\n (typeof value == \u0022number\u0022 || reIsUint.test(value)) \u0026\u0026\r\n value \u003E -1 \u0026\u0026\r\n value % 1 == 0 \u0026\u0026\r\n value \u003C length\r\n );\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is suitable for use as unique object key.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is suitable, else \u0060false\u0060.\r\n */\r\nfunction isKeyable(value) {\r\n var type = typeof value;\r\n return type == \u0022string\u0022 ||\r\n type == \u0022number\u0022 ||\r\n type == \u0022symbol\u0022 ||\r\n type == \u0022boolean\u0022\r\n ? value !== \u0022__proto__\u0022\r\n : value === null;\r\n}\r\n\r\n/**\r\n * Checks if \u0060func\u0060 has its source masked.\r\n *\r\n * @private\r\n * @param {Function} func The function to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060func\u0060 is masked, else \u0060false\u0060.\r\n */\r\nfunction isMasked(func) {\r\n return !!maskSrcKey \u0026\u0026 maskSrcKey in func;\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is likely a prototype object.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a prototype, else \u0060false\u0060.\r\n */\r\nfunction isPrototype(value) {\r\n var Ctor = value \u0026\u0026 value.constructor,\r\n proto = (typeof Ctor == \u0022function\u0022 \u0026\u0026 Ctor.prototype) || objectProto;\r\n\r\n return value === proto;\r\n}\r\n\r\n/**\r\n * Converts \u0060value\u0060 to a string using \u0060Object.prototype.toString\u0060.\r\n *\r\n * @private\r\n * @param {*} value The value to convert.\r\n * @returns {string} Returns the converted string.\r\n */\r\nfunction objectToString(value) {\r\n return nativeObjectToString.call(value);\r\n}\r\n\r\n/**\r\n * Converts \u0060func\u0060 to its source code.\r\n *\r\n * @private\r\n * @param {Function} func The function to convert.\r\n * @returns {string} Returns the source code.\r\n */\r\nfunction toSource(func) {\r\n if (func != null) {\r\n try {\r\n return funcToString.call(func);\r\n } catch (e) {}\r\n try {\r\n return func \u002B \u0022\u0022;\r\n } catch (e) {}\r\n }\r\n return \u0022\u0022;\r\n}\r\n\r\n/**\r\n * Performs a\r\n * [\u0060SameValueZero\u0060](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * comparison between two values to determine if they are equivalent.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns \u0060true\u0060 if the values are equivalent, else \u0060false\u0060.\r\n * @example\r\n *\r\n * var object = { \u0027a\u0027: 1 };\r\n * var other = { \u0027a\u0027: 1 };\r\n *\r\n * _.eq(object, object);\r\n * // =\u003E true\r\n *\r\n * _.eq(object, other);\r\n * // =\u003E false\r\n *\r\n * _.eq(\u0027a\u0027, \u0027a\u0027);\r\n * // =\u003E true\r\n *\r\n * _.eq(\u0027a\u0027, Object(\u0027a\u0027));\r\n * // =\u003E false\r\n *\r\n * _.eq(NaN, NaN);\r\n * // =\u003E true\r\n */\r\nfunction eq(value, other) {\r\n return value === other || (value !== value \u0026\u0026 other !== other);\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is likely an \u0060arguments\u0060 object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is an \u0060arguments\u0060 object,\r\n * else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isArguments(function() { return arguments; }());\r\n * // =\u003E true\r\n *\r\n * _.isArguments([1, 2, 3]);\r\n * // =\u003E false\r\n */\r\nvar isArguments = baseIsArguments(\r\n (function () {\r\n return arguments;\r\n })()\r\n)\r\n ? baseIsArguments\r\n : function (value) {\r\n return (\r\n isObjectLike(value) \u0026\u0026\r\n hasOwnProperty.call(value, \u0022callee\u0022) \u0026\u0026\r\n !propertyIsEnumerable.call(value, \u0022callee\u0022)\r\n );\r\n };\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is classified as an \u0060Array\u0060 object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is an array, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isArray([1, 2, 3]);\r\n * // =\u003E true\r\n *\r\n * _.isArray(document.body.children);\r\n * // =\u003E false\r\n *\r\n * _.isArray(\u0027abc\u0027);\r\n * // =\u003E false\r\n *\r\n * _.isArray(_.noop);\r\n * // =\u003E false\r\n */\r\nvar isArray = Array.isArray;\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is array-like. A value is considered array-like if it\u0027s\r\n * not a function and has a \u0060value.length\u0060 that\u0027s an integer greater than or\r\n * equal to \u00600\u0060 and less than or equal to \u0060Number.MAX_SAFE_INTEGER\u0060.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is array-like, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isArrayLike([1, 2, 3]);\r\n * // =\u003E true\r\n *\r\n * _.isArrayLike(document.body.children);\r\n * // =\u003E true\r\n *\r\n * _.isArrayLike(\u0027abc\u0027);\r\n * // =\u003E true\r\n *\r\n * _.isArrayLike(_.noop);\r\n * // =\u003E false\r\n */\r\nfunction isArrayLike(value) {\r\n return value != null \u0026\u0026 isLength(value.length) \u0026\u0026 !isFunction(value);\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is a buffer.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a buffer, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isBuffer(new Buffer(2));\r\n * // =\u003E true\r\n *\r\n * _.isBuffer(new Uint8Array(2));\r\n * // =\u003E false\r\n */\r\nvar isBuffer = nativeIsBuffer || stubFalse;\r\n\r\n/**\r\n * Performs a deep comparison between two values to determine if they are\r\n * equivalent.\r\n *\r\n * **Note:** This method supports comparing arrays, array buffers, booleans,\r\n * date objects, error objects, maps, numbers, \u0060Object\u0060 objects, regexes,\r\n * sets, strings, symbols, and typed arrays. \u0060Object\u0060 objects are compared\r\n * by their own, not inherited, enumerable properties. Functions and DOM\r\n * nodes are compared by strict equality, i.e. \u0060===\u0060.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to compare.\r\n * @param {*} other The other value to compare.\r\n * @returns {boolean} Returns \u0060true\u0060 if the values are equivalent, else \u0060false\u0060.\r\n * @example\r\n *\r\n * var object = { \u0027a\u0027: 1 };\r\n * var other = { \u0027a\u0027: 1 };\r\n *\r\n * _.isEqual(object, other);\r\n * // =\u003E true\r\n *\r\n * object === other;\r\n * // =\u003E false\r\n */\r\nfunction isEqual(value, other) {\r\n return baseIsEqual(value, other);\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is classified as a \u0060Function\u0060 object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a function, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isFunction(_);\r\n * // =\u003E true\r\n *\r\n * _.isFunction(/abc/);\r\n * // =\u003E false\r\n */\r\nfunction isFunction(value) {\r\n if (!isObject(value)) {\r\n return false;\r\n }\r\n // The use of \u0060Object#toString\u0060 avoids issues with the \u0060typeof\u0060 operator\r\n // in Safari 9 which returns \u0027object\u0027 for typed arrays and other constructors.\r\n var tag = baseGetTag(value);\r\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is a valid array-like length.\r\n *\r\n * **Note:** This method is loosely based on\r\n * [\u0060ToLength\u0060](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a valid length, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isLength(3);\r\n * // =\u003E true\r\n *\r\n * _.isLength(Number.MIN_VALUE);\r\n * // =\u003E false\r\n *\r\n * _.isLength(Infinity);\r\n * // =\u003E false\r\n *\r\n * _.isLength(\u00273\u0027);\r\n * // =\u003E false\r\n */\r\nfunction isLength(value) {\r\n return (\r\n typeof value == \u0022number\u0022 \u0026\u0026\r\n value \u003E -1 \u0026\u0026\r\n value % 1 == 0 \u0026\u0026\r\n value \u003C= MAX_SAFE_INTEGER\r\n );\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is the\r\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\r\n * of \u0060Object\u0060. (e.g. arrays, functions, objects, regexes, \u0060new Number(0)\u0060, and \u0060new String(\u0027\u0027)\u0060)\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is an object, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isObject({});\r\n * // =\u003E true\r\n *\r\n * _.isObject([1, 2, 3]);\r\n * // =\u003E true\r\n *\r\n * _.isObject(_.noop);\r\n * // =\u003E true\r\n *\r\n * _.isObject(null);\r\n * // =\u003E false\r\n */\r\nfunction isObject(value) {\r\n var type = typeof value;\r\n return value != null \u0026\u0026 (type == \u0022object\u0022 || type == \u0022function\u0022);\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is object-like. A value is object-like if it\u0027s not \u0060null\u0060\r\n * and has a \u0060typeof\u0060 result of \u0022object\u0022.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is object-like, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isObjectLike({});\r\n * // =\u003E true\r\n *\r\n * _.isObjectLike([1, 2, 3]);\r\n * // =\u003E true\r\n *\r\n * _.isObjectLike(_.noop);\r\n * // =\u003E false\r\n *\r\n * _.isObjectLike(null);\r\n * // =\u003E false\r\n */\r\nfunction isObjectLike(value) {\r\n return value != null \u0026\u0026 typeof value == \u0022object\u0022;\r\n}\r\n\r\n/**\r\n * Checks if \u0060value\u0060 is classified as a typed array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns \u0060true\u0060 if \u0060value\u0060 is a typed array, else \u0060false\u0060.\r\n * @example\r\n *\r\n * _.isTypedArray(new Uint8Array);\r\n * // =\u003E true\r\n *\r\n * _.isTypedArray([]);\r\n * // =\u003E false\r\n */\r\nvar isTypedArray = nodeIsTypedArray\r\n ? baseUnary(nodeIsTypedArray)\r\n : baseIsTypedArray;\r\n\r\n/**\r\n * Creates an array of the own enumerable property names of \u0060object\u0060.\r\n *\r\n * **Note:** Non-object values are coerced to objects. See the\r\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\r\n * for more details.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.keys(new Foo);\r\n * // =\u003E [\u0027a\u0027, \u0027b\u0027] (iteration order is not guaranteed)\r\n *\r\n * _.keys(\u0027hi\u0027);\r\n * // =\u003E [\u00270\u0027, \u00271\u0027]\r\n */\r\nfunction keys(object) {\r\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\r\n}\r\n\r\n/**\r\n * This method returns a new empty array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.13.0\r\n * @category Util\r\n * @returns {Array} Returns the new empty array.\r\n * @example\r\n *\r\n * var arrays = _.times(2, _.stubArray);\r\n *\r\n * console.log(arrays);\r\n * // =\u003E [[], []]\r\n *\r\n * console.log(arrays[0] === arrays[1]);\r\n * // =\u003E false\r\n */\r\nfunction stubArray() {\r\n return [];\r\n}\r\n\r\n/**\r\n * This method returns \u0060false\u0060.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.13.0\r\n * @category Util\r\n * @returns {boolean} Returns \u0060false\u0060.\r\n * @example\r\n *\r\n * _.times(2, _.stubFalse);\r\n * // =\u003E [false, false]\r\n */\r\nfunction stubFalse() {\r\n return false;\r\n}\r\n\r\n// https://unpkg.com/browse/fast-deep-equal@3.1.3/index.js\r\n\r\nfunction fastDeepEqual(a, b) {\r\n if (a === b) return true;\r\n\r\n if (a \u0026\u0026 b \u0026\u0026 typeof a == \u0022object\u0022 \u0026\u0026 typeof b == \u0022object\u0022) {\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n var length, i, keys;\r\n if (Array.isArray(a)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0; )\r\n if (!fastDeepEqual(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n if (a.constructor === RegExp)\r\n return a.source === b.source \u0026\u0026 a.flags === b.flags;\r\n if (a.valueOf !== Object.prototype.valueOf)\r\n return a.valueOf() === b.valueOf();\r\n if (a.toString !== Object.prototype.toString)\r\n return a.toString() === b.toString();\r\n\r\n keys = Object.keys(a);\r\n length = keys.length;\r\n if (length !== Object.keys(b).length) return false;\r\n\r\n for (i = length; i-- !== 0; )\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = length; i-- !== 0; ) {\r\n var key = keys[i];\r\n\r\n if (!fastDeepEqual(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // true if both NaN, false otherwise\r\n return a !== a \u0026\u0026 b !== b;\r\n}\r\n","TestCases":[{"Name":"lodash.isEqual","Code":"data.forEach((item) =\u003E isEqual(item.value1, item.value2));","IsDeferred":false},{"Name":"fast-deep-equal","Code":"data.forEach((item) =\u003E fastDeepEqual(item.value1, item.value2));","IsDeferred":false}]}