@fileverse-dev/formulajs 4.4.11-mod-34 → 4.4.11-mod-35

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.
@@ -1 +1 @@
1
- {"version":3,"file":"formula.min.js","sources":["../../src/utils/error.js","../../src/utils/date.js","../../src/utils/criteria-eval.js","../../src/utils/common.js","../../src/information.js","../../node_modules/jstat/dist/jstat.js","../../src/lookup-reference.js","../../src/text.js","../../src/statistical.js","../../src/math-trig.js","../../src/utils/symbol.js","../../src/date-time.js","../../node_modules/bessel/bessel.js","../../src/engineering.js","../../src/compatibility.js","../../src/database.js","../../src/financial.js","../../src/utils/constants.js","../../src/crypto-constants.js","../../src/utils/from-timestamp-to-block.js","../../src/utils/toTimestamp.js","../../src/utils/is-address.js","../../src/utils/from-ens-name-to-address.js","../../src/utils/handle-explorer-request.js","../../src/crypto.js","../../src/index.js","../../src/logical.js"],"sourcesContent":["export const nil = new Error('#NULL!')\nexport const div0 = new Error('#DIV/0!')\nexport const value = new Error('#VALUE!')\nexport const ref = new Error('#REF!')\nexport const name = new Error('#NAME?')\nexport const num = new Error('#NUM!')\nexport const na = new Error('#N/A')\nexport const error = new Error('#ERROR!')\nexport const data = new Error('#GETTING_DATA')\n","export let returnSerial = false\n\nconst d1900 = new Date(Date.UTC(1900, 0, 1))\n\nexport function useSerial() {\n returnSerial = true\n}\n\nexport function useDate() {\n returnSerial = false\n}\n\nexport function serialToDate(serial) {\n if (serial < 60) {\n serial += 1\n }\n\n const utc_days = Math.floor(serial - 25569)\n const utc_value = utc_days * 86400\n const date_info = new Date(utc_value * 1000)\n const fractional_day = serial - Math.floor(serial) + 0.0000001\n\n let total_seconds = Math.floor(86400 * fractional_day)\n\n const seconds = total_seconds % 60\n\n total_seconds -= seconds\n\n const hours = Math.floor(total_seconds / (60 * 60))\n const minutes = Math.floor(total_seconds / 60) % 60\n let days = date_info.getUTCDate()\n let month = date_info.getUTCMonth()\n\n if (serial >= 60 && serial < 61) {\n days = 29\n month = 1\n }\n\n return new Date(date_info.getUTCFullYear(), month, days, hours, minutes, seconds)\n}\n\nexport function dateToSerial(date) {\n const addOn = date > -2203891200000 ? 2 : 1\n\n return Math.ceil((date - d1900) / 86400000) + addOn\n}\n\nexport function formatDate(date) {\n const day = String(date.getDate()).padStart(2, '0')\n const month = String(date.getMonth() + 1).padStart(2, '0') // Months are 0-indexed\n const year = date.getFullYear()\n return `${day}/${month}/${year}`\n}\n","const defaultOperator = '='\nconst validSymbols = ['>', '>=', '<', '<=', '=', '<>']\nconst _TOKEN_TYPE_OPERATOR = 'operator'\nconst _TOKEN_TYPE_LITERAL = 'literal'\nconst SUPPORTED_TOKENS = [_TOKEN_TYPE_OPERATOR, _TOKEN_TYPE_LITERAL]\n\nexport const TOKEN_TYPE_OPERATOR = _TOKEN_TYPE_OPERATOR\nexport const TOKEN_TYPE_LITERAL = _TOKEN_TYPE_LITERAL\n\n/**\n * Create token which describe passed symbol/value.\n *\n * @param {String} value Value/Symbol to describe.\n * @param {String} type Type of the token 'operator' or 'literal'.\n * @return {Object}\n */\nexport function createToken(value, type) {\n if (SUPPORTED_TOKENS.indexOf(type) === -1) {\n throw new Error('Unsupported token type: ' + type)\n }\n\n return {\n value: value,\n type: type\n }\n}\n\n/**\n * Tries to cast numeric values to their type passed as a string.\n *\n * @param {*} value\n * @return {*}\n */\nfunction castValueToCorrectType(value) {\n if (typeof value !== 'string') {\n return value\n }\n\n if (/^\\d+(\\.\\d+)?$/.test(value)) {\n value = value.indexOf('.') === -1 ? parseInt(value, 10) : parseFloat(value)\n }\n\n return value\n}\n\n/**\n * Generate stream of tokens from passed expression.\n *\n * @param {String} expression\n * @return {String[]}\n */\nfunction tokenizeExpression(expression) {\n const expressionLength = expression.length\n const tokens = []\n let cursorIndex = 0\n let processedValue = ''\n let processedSymbol = ''\n\n while (cursorIndex < expressionLength) {\n const char = expression.charAt(cursorIndex)\n\n switch (char) {\n case '>':\n case '<':\n case '=':\n processedSymbol = processedSymbol + char\n\n if (processedValue.length > 0) {\n tokens.push(processedValue)\n processedValue = ''\n }\n\n break\n default:\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol)\n processedSymbol = ''\n }\n\n processedValue = processedValue + char\n break\n }\n\n cursorIndex++\n }\n\n if (processedValue.length > 0) {\n tokens.push(processedValue)\n }\n\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol)\n }\n\n return tokens\n}\n\n/**\n * Analyze and convert tokens to an object which describes their meaning.\n *\n * @param {String[]} tokens\n * @return {Object[]}\n */\nfunction analyzeTokens(tokens) {\n let literalValue = ''\n const analyzedTokens = []\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n\n if (i === 0 && validSymbols.indexOf(token) >= 0) {\n analyzedTokens.push(createToken(token, TOKEN_TYPE_OPERATOR))\n } else {\n literalValue += token\n }\n }\n\n if (literalValue.length > 0) {\n analyzedTokens.push(createToken(castValueToCorrectType(literalValue), TOKEN_TYPE_LITERAL))\n }\n\n if (analyzedTokens.length > 0 && analyzedTokens[0].type !== TOKEN_TYPE_OPERATOR) {\n analyzedTokens.unshift(createToken(defaultOperator, TOKEN_TYPE_OPERATOR))\n }\n\n return analyzedTokens\n}\n\n/**\n * Compute/Evaluate an expression passed as an array of tokens.\n *\n * @param {Object[]} tokens\n * @return {Boolean}\n */\nfunction computeExpression(tokens) {\n const values = []\n let operator\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n\n switch (token.type) {\n case TOKEN_TYPE_OPERATOR:\n operator = token.value\n break\n case TOKEN_TYPE_LITERAL:\n values.push(token.value)\n break\n }\n }\n\n return evaluate(values, operator)\n}\n\n/**\n * Evaluate values based on passed math operator.\n *\n * @param {*} values\n * @param {String} operator\n * @return {Boolean}\n */\nfunction evaluate(values, operator) {\n let result = false\n\n switch (operator) {\n case '>':\n result = values[0] > values[1]\n break\n case '>=':\n result = values[0] >= values[1]\n break\n case '<':\n result = values[0] < values[1]\n break\n case '<=':\n result = values[0] <= values[1]\n break\n case '=':\n result = values[0] == values[1]\n break\n case '<>':\n result = values[0] != values[1]\n break\n }\n\n return result\n}\n\nexport function parse(expression) {\n return analyzeTokens(tokenizeExpression(expression))\n}\n\nexport const compute = computeExpression\n","import * as error from './error.js'\nimport * as evalExpression from './criteria-eval.js'\nimport { serialToDate } from './date.js'\n\n// Arrays\nexport function argsToArray(args) {\n const result = []\n\n arrayEach(args, (value) => {\n result.push(value)\n })\n\n return result\n}\n\nexport function arrayEach(array, iteratee) {\n let index = -1\n const length = array.length\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break\n }\n }\n\n return array\n}\n\nexport function arrayValuesToNumbers(arr) {\n let n = arr.length\n let el\n\n while (n--) {\n el = arr[n]\n\n if (typeof el === 'number') {\n continue\n }\n\n if (el === true) {\n arr[n] = 1\n continue\n }\n\n if (el === false) {\n arr[n] = 0\n continue\n }\n\n if (typeof el === 'string') {\n const number = parseNumber(el)\n\n arr[n] = number instanceof Error ? 0 : number\n }\n }\n\n return arr\n}\n\nexport function fillMatrix(matrix, fill_value) {\n if (!matrix) {\n return error.value\n }\n\n if (!matrix.every((el) => Array.isArray(el)) || matrix.length === 0) {\n matrix = [[...matrix]]\n }\n\n matrix.map((arr, i) => {\n arr.map((a, j) => {\n if (!a) {\n matrix[i][j] = 0\n }\n })\n })\n\n const longestArrayIndex = matrix.reduce((acc, arr, i) => (arr.length > matrix[acc].length ? i : acc), 0)\n const longestArrayLength = matrix[longestArrayIndex].length\n\n return matrix.map((el) => [...el, ...Array(longestArrayLength - el.length).fill(fill_value ? fill_value : 0)])\n}\n\nexport function flatten() {\n let result\n\n if (arguments.length === 1) {\n const argument = arguments[0]\n result = isArrayLike(argument) ? argsToArray.apply(null, arguments) : [argument]\n } else {\n result = Array.from(arguments)\n }\n\n while (!isFlat(result)) {\n result = flattenShallow(result)\n }\n\n return result\n}\n\nexport function flattenShallow(array) {\n if (!array || !array.reduce) {\n return [array]\n }\n\n return array.reduce((a, b) => {\n const aIsArray = Array.isArray(a)\n const bIsArray = Array.isArray(b)\n\n if (aIsArray && bIsArray) {\n return a.concat(b)\n }\n\n if (aIsArray) {\n a.push(b)\n\n return a\n }\n\n if (bIsArray) {\n return [a].concat(b)\n }\n\n return [a, b]\n })\n}\n\nexport function initial(array, idx) {\n idx = idx || 1\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(0, array.length - idx)\n}\n\nexport function isArrayLike(a) {\n return a != null && typeof a.length === 'number' && typeof a !== 'string'\n}\n\nexport function isFlat(array) {\n if (!array) {\n return false\n }\n\n for (let i = 0; i < array.length; ++i) {\n if (Array.isArray(array[i])) {\n return false\n }\n }\n\n return true\n}\n\nexport function rest(array, idx) {\n idx = idx || 1\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(idx)\n}\n\nexport function transpose(matrix) {\n if (!matrix) {\n return error.value\n }\n\n return matrix[0].map((col, i) => matrix.map((row) => row[i]))\n}\n\n// Databases\nexport function findField(database, title) {\n let index = null\n\n arrayEach(database, (value, i) => {\n if (value[0] === title) {\n index = i\n\n return false\n }\n })\n\n // Return error if the input field title is incorrect\n if (index == null) {\n return error.value\n }\n\n return index\n}\n\n// Errors\nexport function anyError() {\n for (let n = 0; n < arguments.length; n++) {\n if (arguments[n] instanceof Error) {\n return arguments[n]\n }\n }\n\n return undefined\n}\n\nexport function anyIsError() {\n let n = arguments.length\n\n while (n--) {\n if (arguments[n] instanceof Error) {\n return true\n }\n }\n\n return false\n}\n\n// Numbers\nexport function cleanFloat(number) {\n const power = 1e14\n\n return Math.round(number * power) / power\n}\n\nexport function numbers() {\n const possibleNumbers = flatten.apply(null, arguments)\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\n// Parsers\nexport function parseBool(bool) {\n if (typeof bool === 'boolean') {\n return bool\n }\n\n if (bool instanceof Error) {\n return bool\n }\n\n if (typeof bool === 'number') {\n return bool !== 0\n }\n\n if (typeof bool === 'string') {\n const up = bool.toUpperCase()\n\n if (up === 'TRUE') {\n return true\n }\n\n if (up === 'FALSE') {\n return false\n }\n }\n\n if (bool instanceof Date && !isNaN(bool)) {\n return true\n }\n\n return error.value\n}\n\nexport function parseDate(date) {\n if (!isNaN(date)) {\n if (date instanceof Date) {\n return new Date(date)\n }\n\n const d = parseFloat(date)\n\n if (d < 0 || d >= 2958466) {\n return error.num\n }\n\n return serialToDate(d)\n }\n\n if (typeof date === 'string') {\n // Check for YYYY-MM-DD (ISO format)\n if (/^\\d{4}-\\d{1,2}-\\d{1,2}$/.test(date)) {\n return new Date(date + 'T00:00:00.000')\n }\n\n // Check for DD/MM/YYYY\n const match = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(date)\n if (match) {\n const [, day, month, year] = match.map(Number)\n const d = new Date(year, month - 1, day)\n if (!isNaN(d)) {\n return d\n }\n }\n\n // Handle time-only string (HH:MM[:SS])\n if (/^\\d{1,2}:\\d{2}(:\\d{2})?$/.test(date)) {\n const [h, m, s = '0'] = date.split(':').map(Number)\n const now = new Date()\n now.setHours(h, m, s, 0)\n return now\n }\n\n // Handle AM/PM time format (e.g., \"2:15 PM\")\n const ampmMatch = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i.exec(date)\n if (ampmMatch) {\n let [, hour, minute, meridian] = ampmMatch\n hour = parseInt(hour)\n minute = parseInt(minute)\n if (meridian.toUpperCase() === 'PM' && hour !== 12) hour += 12\n if (meridian.toUpperCase() === 'AM' && hour === 12) hour = 0\n const now = new Date()\n now.setHours(hour, minute, 0, 0)\n return now\n }\n\n // Fallback for other date strings\n const parsed = new Date(date)\n if (!isNaN(parsed)) {\n return parsed\n }\n }\n\n return error.value\n}\n\nexport function parseDateArray(arr) {\n let len = arr.length\n let parsed\n\n while (len--) {\n parsed = parseDate(arr[len])\n\n if (parsed === error.value) {\n return parsed\n }\n\n arr[len] = parsed\n }\n\n return arr\n}\n\nexport function parseMatrix(matrix) {\n if (!matrix || (matrix.length && matrix.length === 0)) {\n return error.value\n }\n\n let pnarr\n\n for (let i = 0; i < matrix.length; i++) {\n pnarr = parseNumberArray(matrix[i])\n matrix[i] = pnarr\n\n if (pnarr instanceof Error) {\n return pnarr\n }\n }\n\n return matrix\n}\n\nexport function parseNumber(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return 0\n }\n\n if (typeof string === 'boolean') {\n string = +string\n }\n\n if (!isNaN(string) && string !== '') {\n return parseFloat(string)\n }\n\n return error.value\n}\n\nexport function parseNumberArray(arr) {\n let len\n\n if (!arr || (len = arr.length) === 0) {\n return error.value\n }\n\n let parsed\n\n while (len--) {\n if (arr[len] instanceof Error) {\n return arr[len]\n }\n\n parsed = parseNumber(arr[len])\n\n if (parsed instanceof Error) {\n return parsed\n }\n\n arr[len] = parsed\n }\n\n return arr\n}\n\nexport function parseString(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return ''\n }\n\n return string.toString()\n}\n\n// Strings\nexport function anyIsString() {\n let n = arguments.length\n\n while (n--) {\n if (typeof arguments[n] === 'string') {\n return true\n }\n }\n\n return false\n}\n\n// Misc\n//Filters values from a given range based on multiple criteria.\n//Returns an array containing the values that satisfy all the specified criteria.\nexport function applyCriteria() {\n const args = argsToArray(arguments)\n const range = parseNumberArray(flatten(args.shift()))\n if (range instanceof Error) {\n return range\n }\n\n const criterias = args\n const criteriaLength = criterias.length / 2\n\n for (let i = 0; i < criteriaLength; i++) {\n criterias[i * 2] = flatten(criterias[i * 2])\n }\n\n let values = []\n\n for (let i = 0; i < range.length; i++) {\n let isMetCondition = false\n\n for (let j = 0; j < criteriaLength; j++) {\n const valueToTest = criterias[j * 2][i]\n const criteria = criterias[j * 2 + 1]\n const isWildcard = criteria === void 0 || criteria === '*'\n let computedResult = false\n\n if (isWildcard) {\n computedResult = true\n } else {\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n const tokens = [evalExpression.createToken(valueToTest, evalExpression.TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n )\n\n computedResult = evalExpression.compute(tokens)\n }\n\n // Criterias are calculated as AND so any `false` breaks the loop as unmeet condition\n if (!computedResult) {\n isMetCondition = false\n break\n }\n\n isMetCondition = true\n }\n\n if (isMetCondition) {\n values.push(range[i])\n }\n }\n return values\n}\n\nexport function isDefined(arg) {\n return arg !== undefined && arg !== null\n}\n","import * as error from './utils/error.js'\n\nexport const ERROR = {}\n\nERROR.TYPE = (error_val) => {\n switch (error_val) {\n case error.nil:\n return 1\n case error.div0:\n return 2\n case error.value:\n return 3\n case error.ref:\n return 4\n case error.name:\n return 5\n case error.num:\n return 6\n case error.na:\n return 7\n case error.data:\n return 8\n }\n\n return error.na\n}\n\n/**\n * Returns TRUE if the value is blank.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISBLANK(value) {\n return value === null\n}\n\n/**\n * Returns TRUE if the value is any error value except #N/A.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISERR(value) {\n return (\n [error.value, error.ref, error.div0, error.num, error.name, error.nil].indexOf(value) >= 0 ||\n (typeof value === 'number' && (isNaN(value) || !isFinite(value)))\n )\n}\n\n/**\n * Returns TRUE if the value is any error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISERROR(value) {\n return ISERR(value) || value === error.na\n}\n\n/**\n * Returns TRUE if the number is even.\n *\n * Category: Information\n *\n * @param {*} number The value to test. If number is not an integer, it is truncated.\n * @returns\n */\nexport function ISEVEN(number) {\n return !(Math.floor(Math.abs(number)) & 1)\n}\n\n/**\n * Returns TRUE if the value is a logical value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISLOGICAL(value) {\n return value === true || value === false\n}\n\n/**\n * Returns TRUE if the value is the #N/A error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNA(value) {\n return value === error.na\n}\n\n/**\n * Returns TRUE if the value is not text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNONTEXT(value) {\n return typeof value !== 'string'\n}\n\n/**\n * Returns TRUE if the value is a number.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNUMBER(value) {\n return typeof value === 'number' && !isNaN(value) && isFinite(value)\n}\n\n/**\n * Returns TRUE if the number is odd.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISODD(value) {\n return !!(Math.floor(Math.abs(value)) & 1)\n}\n\n/**\n * Returns TRUE if the value is text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISTEXT(value) {\n return typeof value === 'string'\n}\n\n/**\n * Returns a value converted to a number.\n *\n * Category: Information\n *\n * @param {*} value The value you want converted. N converts values listed in the following table.\n * @returns\n */\nexport function N(value) {\n if (ISNUMBER(value)) {\n return value\n }\n\n if (value instanceof Date) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n\n if (value === false) {\n return 0\n }\n\n if (ISERROR(value)) {\n return value\n }\n\n return 0\n}\n\n/**\n * Returns the error value #N/A.\n *\n * Category: Information\n *\n * @returns\n */\nexport function NA() {\n return error.na\n}\n\n/**\n * Returns a number indicating the data type of a value.\n *\n * Category: Information\n *\n * @param {*} value Can be any Microsoft Excel value, such as a number, text, logical value, and so on.\n * @returns\n */\nexport function TYPE(value) {\n if (ISNUMBER(value)) {\n return 1\n }\n\n if (ISTEXT(value)) {\n return 2\n }\n\n if (ISLOGICAL(value)) {\n return 4\n }\n\n if (ISERROR(value)) {\n return 16\n }\n\n if (Array.isArray(value)) {\n return 64\n }\n}\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,\n // and comes from his hypergeometric test calculator at\n // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i<arguments.length;i++){\n var array = [1];\n matrixRows[i]= array.concat(arguments[i]);\n }\n return jStat(matrixRows);\n\n },\n\n builddxmatrix: function builddxmatrix() {\n //Paramters will be passed in as such\n //([array1,array2,...]\n var matrixRows = new Array(arguments[0].length);\n for(var i=0;i<arguments[0].length;i++){\n var array = [1]\n matrixRows[i]= array.concat(arguments[0][i]);\n }\n return jStat(matrixRows);\n\n },\n\n buildjxmatrix: function buildjxmatrix(jMat) {\n //Builds from jStat Matrix\n var pass = new Array(jMat.length)\n for(var i=0;i<jMat.length;i++){\n pass[i] = jMat[i];\n }\n return jStat.builddxmatrix(pass);\n\n },\n\n buildymatrix: function buildymatrix(array){\n return jStat(array).transpose();\n },\n\n buildjymatrix: function buildjymatrix(jMat){\n return jMat.transpose();\n },\n\n matrixmult: function matrixmult(A,B){\n var i, j, k, result, sum;\n if (A.cols() == B.rows()) {\n if(B.rows()>1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i<beta.length;i++){\n sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i]));\n ts= Math.abs(beta[i] / sds);\n ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides);\n\n compile.stats[i]=[beta[i], sds, ts, ps];\n }\n\n compile.regress = beta;\n return compile;\n },\n\n xtranspx: function xtranspx(jMatX){\n return jStat.matrixmult(jMatX.transpose(),jMatX);\n },\n\n\n xtranspxinv: function xtranspxinv(jMatX){\n var inner = jStat.matrixmult(jMatX.transpose(),jMatX);\n var innerinv = jStat.inv(inner);\n return innerinv;\n },\n\n jMatYBar: function jMatYBar(jMatX, beta) {\n var yBar = jStat.matrixmult(jMatX, beta);\n return new jStat(yBar);\n },\n\n residuals: function residuals(jMatY, jMatYBar) {\n return jStat.matrixsubtract(jMatY, jMatYBar);\n },\n\n ssr: function ssr(jMatYBar, yAverage) {\n var ssr = 0;\n for(var i = 0; i < jMatYBar.length; i++) {\n ssr += Math.pow(jMatYBar[i] - yAverage, 2);\n }\n return ssr;\n },\n\n sse: function sse(jMatY, jMatYBar) {\n var sse = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sse += Math.pow(jMatY[i] - jMatYBar[i], 2);\n }\n return sse;\n },\n\n sst: function sst(jMatY, yAverage) {\n var sst = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sst += Math.pow(jMatY[i] - yAverage, 2);\n }\n return sst;\n },\n\n matrixsubtract: function matrixsubtract(A,B){\n var ans = new Array(A.length);\n for(var i=0;i<A.length;i++){\n ans[i] = new Array(A[i].length);\n for(var j=0;j<A[i].length;j++){\n ans[i][j]=A[i][j]-B[i][j];\n }\n }\n return jStat(ans);\n }\n});\n // Make it compatible with previous version.\n jStat.jStat = jStat;\n\n return jStat;\n});\n","import jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\n\n/**\n * Chooses a value from a list of values.\n *\n * Category: Lookup and reference\n *\n * @param {*} index_num Specifies which value argument is selected. Index_num must be a number between 1 and 254, or a formula or reference to a value containing a number between 1 and 254. If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on. If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value. If index_num is a fraction, it is truncated to the lowest integer before being used.\n - If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on.\n - If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value.\n - If index_num is a fraction, it is truncated to the lowest integer before being used.\n * @param {*} args value1, value2, ... Value 1 is required, subsequent values are optional. 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on index_num. The arguments can be numbers, value references, defined names, formulas, functions, or text.\n * @returns\n */\nexport function CHOOSE() {\n if (arguments.length < 2) {\n return error.na\n }\n\n const index = arguments[0]\n\n if (index < 1 || index > 254) {\n return error.value\n }\n\n if (arguments.length < index + 1) {\n return error.value\n }\n\n return arguments[index]\n}\n\n/**\n * Returns the column number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want to return the column number.\n * @param {*} index\n * @returns\n */\nexport function COLUMN(reference, index) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (index < 0) {\n return error.num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return error.value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.col(reference, index)\n}\n\n/**\n * Returns the number of columns in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or array formula, or a reference to a range of values for which you want the number of columns.\n * @returns\n */\nexport function COLUMNS(array) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (!(array instanceof Array)) {\n return error.value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.cols(array)\n}\n\n/**\n * Looks in the top row of an array and returns the value of the indicated value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} row_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nexport function HLOOKUP(lookup_value, table_array, row_index_num, range_lookup) {\n return VLOOKUP(lookup_value, utils.transpose(table_array), row_index_num, range_lookup)\n}\n\n/**\n * Uses an index to choose a value from a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array A range of values or an array constant.\n - If array contains only one row or column, the corresponding row_num or column_num argument is optional.\n - If array has more than one row and more than one column, and only row_num or column_num is used, INDEX returns an array of the entire row or column in array.\n * @param {*} row_num Required, unless column_num is present. Selects the row in array from which to return a value. If row_num is omitted, column_num is required.\n * @param {*} column_num Optional. Selects the column in array from which to return a value. If column_num is omitted, row_num is required.\n * @returns\n */\nexport function INDEX(array, row_num, column_num) {\n const someError = utils.anyError(array, row_num, column_num)\n\n if (someError) {\n return someError\n }\n\n if (!Array.isArray(array)) {\n return error.value\n }\n\n const isOneDimensionRange = array.length > 0 && !Array.isArray(array[0])\n\n if (isOneDimensionRange && !column_num) {\n column_num = row_num\n row_num = 1\n } else {\n column_num = column_num || 1\n row_num = row_num || 1\n }\n\n if (column_num < 0 || row_num < 0) {\n return error.value\n }\n\n if (isOneDimensionRange && row_num === 1 && column_num <= array.length) {\n return array[column_num - 1]\n } else if (row_num <= array.length && column_num <= array[row_num - 1].length) {\n return array[row_num - 1][column_num - 1]\n }\n\n return error.ref\n}\n\n/**\n * Looks up values in a vector or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value A value that LOOKUP searches for in an array. The lookup_value argument can be a number, text, a logical value, or a name or reference that refers to a value.\n - If LOOKUP can't find the value of lookup_value, it uses the largest value in the array that is less than or equal to lookup_value.\n - If the value of lookup_value is smaller than the smallest value in the first row or column (depending on the array dimensions), LOOKUP returns the #N/A error value.\n * @param {*} array A range of values that contains text, numbers, or logical values that you want to compare with lookup_value. The array form of LOOKUP is very similar to the HLOOKUP and VLOOKUP functions. The difference is that HLOOKUP searches for the value of lookup_value in the first row, VLOOKUP searches in the first column, and LOOKUP searches according to the dimensions of array.\n* @param {*} result_array Optional. A range that contains only one row or column. The result_array argument must be the same size as lookup_value. It has to be the same size.\n * @returns\n */\nexport function LOOKUP(lookup_value, array, result_array) {\n array = utils.flatten(array)\n result_array = result_array ? utils.flatten(result_array) : array\n\n const isNumberLookup = typeof lookup_value === 'number'\n let result = error.na\n\n for (let i = 0; i < array.length; i++) {\n if (array[i] === lookup_value) {\n return result_array[i]\n } else if (\n (isNumberLookup && array[i] <= lookup_value) ||\n (typeof array[i] === 'string' && array[i].localeCompare(lookup_value) < 0)\n ) {\n result = result_array[i]\n } else if (isNumberLookup && array[i] > lookup_value) {\n return result\n }\n }\n\n return result\n}\n\n/**\n * Looks up values in a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value that you want to match in lookup_array. For example, when you look up someone's number in a telephone book, you are using the person's name as the lookup value, but the telephone number is the value you want.The lookup_value argument can be a value (number, text, or logical value) or a value reference to a number, text, or logical value.\n * @param {*} lookup_array The range of values being searched.\n * @param {*} match_type Optional. The number -1, 0, or 1. The match_type argument specifies how Excel matches lookup_value with values in lookup_array. The default value for this argument is 1.\n * @returns\n */\nexport function MATCH(lookup_value, lookup_array, match_type) {\n if ((!lookup_value && lookup_value !== 0) || !lookup_array) {\n return error.na\n }\n\n if (arguments.length === 2) {\n match_type = 1\n }\n\n lookup_array = utils.flatten(lookup_array)\n\n if (!(lookup_array instanceof Array)) {\n return error.na\n }\n\n if (match_type !== -1 && match_type !== 0 && match_type !== 1) {\n return error.na\n }\n\n let index\n let indexValue\n\n for (let idx = 0; idx < lookup_array.length; idx++) {\n if (match_type === 1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] < lookup_value) {\n if (!indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n } else if (lookup_array[idx] > indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n }\n }\n } else if (match_type === 0) {\n if (typeof lookup_value === 'string' && typeof lookup_array[idx] === 'string') {\n const lookupValueStr = lookup_value\n .toLowerCase()\n .replace(/\\?/g, '.')\n .replace(/\\*/g, '.*')\n .replace(/~/g, '\\\\')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n\n const regex = new RegExp('^' + lookupValueStr + '$')\n\n if (regex.test(lookup_array[idx].toLowerCase())) {\n return idx + 1\n }\n } else {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n }\n }\n } else if (match_type === -1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] > lookup_value) {\n if (!indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n } else if (lookup_array[idx] < indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n }\n }\n }\n }\n\n return index || error.na\n}\n\n/**\n * Returns the number of rows in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array, an array formula, or a reference to a range of values for which you want the number of rows.\n * @returns\n */\nexport function ROWS(array) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (!(array instanceof Array)) {\n return error.value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.rows(array)\n}\n/**\n * Returns a sorted array of the elements in an array. The returned array is the same shape as the provided array argument.\n *\n * Category: Lookup and reference\n *\n * @param {*} array Array to sort\n * @param {*} sort_index Optional. A number indicating the row or column to sort by\n * @param {*} sort_order Optional. A number indicating the desired sort order; 1 for ascending order (default), -1 for descending order\n * @param {*} by_col Optional. A logical value indicating the desired sort direction; FALSE to sort by row (default), TRUE to sort by column\n * @returns\n */\nexport function SORT(array, sort_index = 1, sort_order = 1, by_col = false) {\n if (!array || !Array.isArray(array)) {\n return error.na\n }\n\n if (array.length === 0) {\n return 0\n }\n\n sort_index = utils.parseNumber(sort_index)\n if (!sort_index || sort_index < 1) {\n return error.value\n }\n\n sort_order = utils.parseNumber(sort_order)\n if (sort_order !== 1 && sort_order !== -1) {\n return error.value\n }\n\n by_col = utils.parseBool(by_col)\n if (typeof by_col !== 'boolean') {\n return error.name\n }\n\n const sortArray = (arr) =>\n arr.sort((a, b) => {\n a = utils.parseString(a[sort_index - 1])\n b = utils.parseString(b[sort_index - 1])\n\n return sort_order === 1 ? (a < b ? sort_order * -1 : sort_order) : a > b ? sort_order : sort_order * -1\n })\n\n const matrix = utils.fillMatrix(array)\n const result = by_col ? utils.transpose(matrix) : matrix\n\n return sort_index >= 1 && sort_index <= result[0].length\n ? by_col\n ? utils.transpose(sortArray(result))\n : sortArray(result)\n : error.value\n}\n\n/**\n * Returns the transpose of an array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or range of values on a worksheet that you want to transpose. The transpose of an array is created by using the first row of the array as the first column of the new array, the second row of the array as the second column of the new array, and so on. If you're not sure of how to enter an array formula, see Create an array formula.\n * @returns\n */\nexport function TRANSPOSE(array) {\n if (!array) {\n return error.na\n }\n\n const matrix = utils.fillMatrix(array)\n\n return utils.transpose(matrix)\n}\n\n/**\n * Returns a list of unique values in a list or range.\n *\n * Category: Lookup and reference\n *\n * @returns\n */\nexport function UNIQUE() {\n const result = []\n\n for (let i = 0; i < arguments.length; ++i) {\n let hasElement = false\n const element = arguments[i]\n\n // Check if we've already seen this element.\n\n for (let j = 0; j < result.length; ++j) {\n hasElement = result[j] === element\n\n if (hasElement) {\n break\n }\n }\n\n // If we did not find it, add it to the result.\n if (!hasElement) {\n result.push(element)\n }\n }\n\n return result\n}\n\n/**\n * Looks in the first column of an array and moves across the row to return the value of a value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} col_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nexport function VLOOKUP(lookup_value, table_array, col_index_num, range_lookup) {\n if (!table_array || !col_index_num) {\n return error.na\n }\n\n range_lookup = !(range_lookup === 0 || range_lookup === false)\n\n let result = error.na\n let exactMatchOnly = false\n\n const isNumberLookup = typeof lookup_value === 'number'\n const lookupValue = typeof lookup_value === 'string' ? lookup_value.toLowerCase() : lookup_value\n\n for (let i = 0; i < table_array.length; i++) {\n const row = table_array[i]\n const rowValue = typeof row[0] === 'string' ? row[0].toLowerCase() : row[0]\n\n if (rowValue === lookupValue) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : error.ref\n break\n } else if (\n !exactMatchOnly &&\n ((isNumberLookup && range_lookup && rowValue <= lookup_value) ||\n (range_lookup && typeof rowValue === 'string' && rowValue.localeCompare(lookup_value) < 0))\n ) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : error.ref\n }\n\n if (isNumberLookup && rowValue > lookup_value) {\n exactMatchOnly = true\n }\n }\n\n return result\n}\n","import * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\nimport { ROUND } from './math-trig.js'\n\n/**\n * Returns the character specified by the code number.\n *\n * Category: Text\n *\n * @param {*} number A number between 1 and 255 specifying which character you want. The character is from the character set used by your computer. Note: Excel for the web supports only CHAR(9), CHAR(10), CHAR(13), and CHAR(32) and above.\n * @returns\n */\nexport function CHAR(number) {\n number = utils.parseNumber(number)\n\n if (number === 0) {\n return error.value\n }\n\n if (number instanceof Error) {\n return number\n }\n\n return String.fromCharCode(number)\n}\n\n/**\n * Removes all nonprintable characters from text.\n *\n * Category: Text\n *\n * @param {*} text Any worksheet information from which you want to remove nonprintable characters.\n * @returns\n */\nexport function CLEAN(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n text = text || ''\n const re = /[\\0-\\x1F]/g\n\n return text.replace(re, '')\n}\n\n/**\n * Returns a numeric code for the first character in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text for which you want the code of the first character.\n * @returns\n */\nexport function CODE(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n text = text || ''\n let result = text.charCodeAt(0)\n\n if (isNaN(result)) {\n result = error.value\n }\n\n return result\n}\n\n/**\n * Joins several text items into one text item.\n *\n * Category: Text\n *\n * @returns\n */\nexport function CONCATENATE() {\n const args = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, args)\n\n if (someError) {\n return someError\n }\n\n let trueFound = 0\n\n while ((trueFound = args.indexOf(true)) > -1) {\n args[trueFound] = 'TRUE'\n }\n\n let falseFound = 0\n\n while ((falseFound = args.indexOf(false)) > -1) {\n args[falseFound] = 'FALSE'\n }\n\n return args.join('')\n}\n\nexport const CONCAT = CONCATENATE\n\n/**\n * Converts a number to text, using the $ (dollar) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number, a reference to a value containing a number, or a formula that evaluates to a number.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point. If this is negative, the number is rounded to the left of the decimal point. If you omit decimals, it is assumed to be 2.\n * @returns\n */\nexport function DOLLAR(number, decimals = 2) {\n number = utils.parseNumber(number)\n if (isNaN(number)) {\n return error.value\n }\n\n number = ROUND(number, decimals)\n\n const options = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals >= 0 ? decimals : 0,\n maximumFractionDigits: decimals >= 0 ? decimals : 0\n }\n\n const formattedNumber = number.toLocaleString('en-US', options)\n\n if (number < 0) {\n return '$(' + formattedNumber.slice(2) + ')'\n }\n\n return formattedNumber\n}\n\n/**\n * Checks to see if two text values are identical.\n *\n * Category: Text\n *\n * @param {*} text1 The first text string.\n * @param {*} text2 The second text string.\n * @returns\n */\nexport function EXACT(text1, text2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n const someError = utils.anyError(text1, text2)\n\n if (someError) {\n return someError\n }\n\n text1 = utils.parseString(text1)\n text2 = utils.parseString(text2)\n\n return text1 === text2\n}\n\n/**\n * Locate one text string within a second text string, and return the number of the starting position of the first text string from the first character of the second text string.\n *\n * Category: Text\n *\n * @param {*} find_text The text you want to find.\n * @param {*} within_text The text containing the text you want to find.\n * @param {*} start_num Optional. Specifies the character at which to start the search. The first character in within_text is character number 1. If you omit start_num, it is assumed to be 1.\n * @returns\n */\nexport function FIND(find_text, within_text, start_num) {\n if (arguments.length < 2) {\n return error.na\n }\n\n find_text = utils.parseString(find_text)\n within_text = utils.parseString(within_text)\n start_num = start_num === undefined ? 0 : start_num\n const found_index = within_text.indexOf(find_text, start_num - 1)\n\n if (found_index === -1) {\n return error.value\n }\n\n return found_index + 1\n}\n\n/**\n * Formats a number as text with a fixed number of decimals.\n *\n * Category: Text\n *\n * @param {*} number The number you want to round and convert to text.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point.\n * @param {*} no_commas Optional. A logical value that, if TRUE, prevents FIXED from including commas in the returned text.\n * @returns\n */\nexport function FIXED(number, decimals = 2, no_commas = false) {\n number = utils.parseNumber(number)\n if (isNaN(number)) {\n return error.value\n }\n\n decimals = utils.parseNumber(decimals)\n if (isNaN(decimals)) {\n return error.value\n }\n\n if (decimals < 0) {\n const factor = Math.pow(10, -decimals)\n number = Math.round(number / factor) * factor\n } else {\n number = number.toFixed(decimals)\n }\n\n if (no_commas) {\n number = number.toString().replace(/,/g, '')\n } else {\n const parts = number.toString().split('.')\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+$)/g, ',')\n number = parts.join('.')\n }\n\n return number\n}\n\n/**\n * Returns the leftmost characters from a text value.\n *\n * Category: Text\n *\n * @param {*} text The text string that contains the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want LEFT to extract.\n * @returns\n */\nexport function LEFT(text, num_chars) {\n const someError = utils.anyError(text, num_chars)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n num_chars = num_chars === undefined ? 1 : num_chars\n num_chars = utils.parseNumber(num_chars)\n\n if (num_chars instanceof Error || typeof text !== 'string') {\n return error.value\n }\n\n return text.substring(0, num_chars)\n}\n\n/**\n * Returns the number of characters in a text string\n *\n * Category: Text\n *\n * @param {*} text The text whose length you want to find. Spaces count as characters.\n * @returns\n */\nexport function LEN(text) {\n if (arguments.length === 0) {\n return error.error\n }\n\n if (text instanceof Error) {\n return text\n }\n\n if (Array.isArray(text)) {\n return error.value\n }\n\n const textAsString = utils.parseString(text)\n\n return textAsString.length\n}\n\n/**\n * Converts text to lowercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want to convert to lowercase. LOWER does not change characters in text that are not letters.\n * @returns\n */\nexport function LOWER(text) {\n if (arguments.length !== 1) {\n return error.value\n }\n\n text = utils.parseString(text)\n\n if (utils.anyIsError(text)) {\n return text\n }\n\n return text.toLowerCase()\n}\n\n/**\n * Returns a specific number of characters from a text string starting at the position you specify\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} start_num The position of the first character you want to extract in text. The first character in text has start_num 1, and so on.\n * @param {*} num_chars Specifies the number of characters you want MID to return from text.\n * @returns\n */\nexport function MID(text, start_num, num_chars) {\n if (start_num === undefined || start_num === null) {\n return error.value\n }\n\n start_num = utils.parseNumber(start_num)\n num_chars = utils.parseNumber(num_chars)\n\n if (utils.anyIsError(start_num, num_chars) || typeof text !== 'string') {\n return num_chars\n }\n\n const begin = start_num - 1\n const end = begin + num_chars\n\n return text.substring(begin, end)\n}\n\n// TODO\n/**\n * Converts text to number in a locale-independent manner.\n *\n * Category: Text\n *\n * @param {*} text The text to convert to a number.\n * @param {*} decimal_separator Optional. The character used to separate the integer and fractional part of the result.\n * @param {*} group_separator Optional. The character used to separate groupings of numbers, such as thousands from hundreds and millions from thousands.\n * @returns\n */\nexport function NUMBERVALUE(text, decimal_separator, group_separator) {\n text = utils.isDefined(text) ? text : ''\n\n if (typeof text === 'number') {\n return text\n }\n\n if (typeof text !== 'string') {\n return error.na\n }\n\n decimal_separator = typeof decimal_separator === 'undefined' ? '.' : decimal_separator\n group_separator = typeof group_separator === 'undefined' ? ',' : group_separator\n\n return Number(text.replace(decimal_separator, '.').replace(group_separator, ''))\n}\n\n/**\n * Capitalizes the first letter in each word of a text value.\n *\n * Category: Text\n *\n * @param {*} text Text enclosed in quotation marks, a formula that returns text, or a reference to a value containing the text you want to partially capitalize.\n * @returns\n */\nexport function PROPER(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n if (isNaN(text) && typeof text === 'number') {\n return error.value\n }\n\n text = utils.parseString(text)\n\n return text.replace(/\\w\\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())\n}\n\n/**\n * Replaces characters within text\n *\n * Category: Text\n *\n * @param {*} old_text Text in which you want to replace some characters.\n * @param {*} num_chars The number of characters in old_text that you want REPLACE to replace with new_text.\n * @param {*} length he number of characters in old_text that you want REPLACEB to replace with new_text.\n * @param {*} new_text he text that will replace characters in old_text.\n * @returns\n */\nexport function REPLACE(old_text, num_chars, length, new_text) {\n num_chars = utils.parseNumber(num_chars)\n length = utils.parseNumber(length)\n\n if (utils.anyIsError(num_chars, length) || typeof old_text !== 'string' || typeof new_text !== 'string') {\n return error.value\n }\n\n return old_text.substr(0, num_chars - 1) + new_text + old_text.substr(num_chars - 1 + length)\n}\n\n/**\n * Repeats text a given number of times.\n *\n * Category: Text\n *\n * @param {*} text The text you want to repeat.\n * @param {*} number_times A positive number specifying the number of times to repeat text.\n * @returns\n */\nexport function REPT(text, number_times) {\n const someError = utils.anyError(text, number_times)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n number_times = utils.parseNumber(number_times)\n\n if (number_times instanceof Error) {\n return number_times\n }\n\n return new Array(number_times + 1).join(text)\n}\n\n/**\n * Returns the rightmost characters from a text value\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want RIGHT to extract.\n * @returns\n */\nexport function RIGHT(text, num_chars) {\n const someError = utils.anyError(text, num_chars)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n num_chars = num_chars === undefined ? 1 : num_chars\n num_chars = utils.parseNumber(num_chars)\n\n if (num_chars instanceof Error) {\n return num_chars\n }\n\n return text.substring(text.length - num_chars)\n}\n\n/**\n * Finds one text value within another (not case-sensitive)\n *\n * Category: Text\n *\n * @param {*} find_text The text that you want to find.\n * @param {*} within_text The text in which you want to search for the value of the find_text argument.\n * @param {*} start_num Optional. The character number in the within_text argument at which you want to start searching.\n * @returns\n */\nexport function SEARCH(find_text, within_text, start_num) {\n let foundAt\n\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\n return error.value\n }\n\n start_num = start_num === undefined ? 0 : start_num\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1\n\n return foundAt === 0 ? error.value : foundAt\n}\n\n/**\n * Substitutes new text for old text in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text or the reference to a value containing text for which you want to substitute characters.\n * @param {*} old_text The text you want to replace.\n * @param {*} new_text The text you want to replace old_text with.\n * @param {*} instance_num Optional. Specifies which occurrence of old_text you want to replace with new_text. If you specify instance_num, only that instance of old_text is replaced. Otherwise, every occurrence of old_text in text is changed to new_text.\n * @returns\n */\nexport function SUBSTITUTE(text, old_text, new_text, instance_num) {\n if (arguments.length < 3) {\n return error.na\n }\n\n if (!text || !old_text) {\n return text\n } else if (instance_num === undefined) {\n return text.split(old_text).join(new_text)\n } else {\n instance_num = Math.floor(Number(instance_num))\n\n if (Number.isNaN(instance_num) || instance_num <= 0) {\n return error.value\n }\n\n let index = 0\n let i = 0\n\n while (index > -1 && text.indexOf(old_text, index) > -1) {\n index = text.indexOf(old_text, index + 1)\n i++\n\n if (index > -1 && i === instance_num) {\n return text.substring(0, index) + new_text + text.substring(index + old_text.length)\n }\n }\n\n return text\n }\n}\n\n/**\n * Converts its arguments to text.\n *\n * Category: Text\n *\n * @param {*} value The value you want to test.\n * @returns\n */\nexport function T(value) {\n if (value instanceof Error) {\n return value\n }\n\n return typeof value === 'string' ? value : ''\n}\n\n/**\n * Formats a number and converts it to text.\n *\n * Category: Text\n *\n * @param {*} value A numeric value that you want to be converted into text.\n * @param {*} format_text A text string that defines the formatting that you want to be applied to the supplied value.\n * @returns\n */\nexport function TEXT(value, format_text) {\n if (value === undefined || value instanceof Error || format_text instanceof Error) {\n return error.na\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10)\n }\n\n if (format_text === undefined || format_text === null) {\n return ''\n }\n\n if (typeof format_text === 'number') {\n return String(format_text)\n }\n\n if (typeof format_text !== 'string') {\n return error.value\n }\n\n const currencySymbol = format_text.startsWith('$') ? '$' : ''\n const isPercent = format_text.endsWith('%')\n format_text = format_text.replace(/%/g, '').replace(/\\$/g, '')\n\n // count all 0s after the decimal point\n const decimalPlaces = format_text.includes('.') ? format_text.split('.')[1].match(/0/g).length : 0\n\n const noCommas = !format_text.includes(',')\n\n if (isPercent) {\n value = value * 100\n }\n\n value = FIXED(value, decimalPlaces, noCommas)\n\n if (value.startsWith('-')) {\n value = value.replace('-', '')\n value = '-' + currencySymbol + value\n } else {\n value = currencySymbol + value\n }\n\n if (isPercent) {\n value = value + '%'\n }\n\n return value\n}\n\n/**\n * Combines the text from multiple ranges and/or strings.\n *\n * Category: Text\n * @param {*} delimiter A text string, either empty, or one or more characters enclosed by double quotes, or a reference to a valid text string. If a number is supplied, it will be treated as text.\n * @param {*} ignore_empty If TRUE, ignores empty values.\n * @param {*} args Text item to be joined. A text string, or array of strings, such as a range of values.\n * @returns\n */\nexport function TEXTJOIN(delimiter, ignore_empty, ...args) {\n if (typeof ignore_empty !== 'boolean') {\n ignore_empty = utils.parseBool(ignore_empty)\n }\n\n if (arguments.length < 3) {\n return error.na\n }\n\n delimiter = delimiter !== null && delimiter !== undefined ? delimiter : ''\n\n let flatArgs = utils.flatten(args)\n let textToJoin = ignore_empty ? flatArgs.filter((text) => text) : flatArgs\n\n if (Array.isArray(delimiter)) {\n delimiter = utils.flatten(delimiter)\n\n let chunks = textToJoin.map((item) => [item])\n let index = 0\n\n for (let i = 0; i < chunks.length - 1; i++) {\n chunks[i].push(delimiter[index])\n index++\n\n if (index === delimiter.length) {\n index = 0\n }\n }\n\n textToJoin = utils.flatten(chunks)\n\n return textToJoin.join('')\n }\n\n return textToJoin.join(delimiter)\n}\n\n/**\n * Removes spaces from text.\n *\n * Category: Text\n *\n * @param {*} text The text from which you want spaces removed.\n * @returns\n */\nexport function TRIM(text) {\n text = utils.parseString(text)\n\n if (text instanceof Error) {\n return text\n }\n\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nexport const UNICHAR = CHAR\n\nexport const UNICODE = CODE\n\n/**\n * Converts text to uppercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want converted to uppercase. Text can be a reference or text string.\n * @returns\n */\nexport function UPPER(text) {\n text = utils.parseString(text)\n\n if (text instanceof Error) {\n return text\n }\n\n return text.toUpperCase()\n}\n\n/**\n * Converts a text argument to a number.\n *\n * Category: Text\n *\n * @param {*} text The text enclosed in quotation marks or a reference to a value containing the text you want to convert.\n * @returns\n */\nexport function VALUE(text) {\n const anyError = utils.anyError(text)\n\n if (anyError) {\n return anyError\n }\n\n if (typeof text === 'number') {\n return text\n }\n\n if (!utils.isDefined(text)) {\n text = ''\n }\n\n if (typeof text !== 'string') {\n return error.value\n }\n\n const isPercent = /(%)$/.test(text) || /^(%)/.test(text)\n text = text.replace(/^[^0-9-]{0,3}/, '')\n text = text.replace(/[^0-9]{0,3}$/, '')\n text = text.replace(/[ ,]/g, '')\n\n if (text === '') {\n return 0\n }\n\n let output = Number(text)\n\n if (isNaN(output)) {\n return error.value\n }\n\n output = output || 0\n\n if (isPercent) {\n output = output * 0.01\n }\n\n return output\n}\n","import jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as mathTrig from './math-trig.js'\nimport * as lookup from './lookup-reference.js'\nimport * as utils from './utils/common.js'\n\nimport { T } from './text.js'\n\nconst SQRT2PI = 2.5066282746310002\n\n/**\n * Returns the average of the absolute deviations of data points from their mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the average of the absolute deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function AVEDEV() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.num\n }\n\n const range = utils.parseNumberArray(flatArgumentsDefined)\n\n if (range instanceof Error) {\n return range\n }\n\n return jStat.sum(jStat(range).subtract(jStat.mean(range)).abs()[0]) / range.length\n}\n\n/**\n * Returns the average of its arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ...Numbers, value references or ranges for which you want the average.\n * @returns\n */\nexport function AVERAGE() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.div0\n }\n\n const someError = utils.anyError.apply(undefined, flatArgumentsDefined)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArgumentsDefined)\n const n = range.length\n\n let sum = 0\n let count = 0\n let result\n\n for (let i = 0; i < n; i++) {\n sum += range[i]\n count += 1\n }\n\n result = sum / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the average of its arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values, ranges of values, or values for which you want the average.\n * @returns\n */\nexport function AVERAGEA() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.div0\n }\n\n const someError = utils.anyError.apply(undefined, flatArgumentsDefined)\n\n if (someError) {\n return someError\n }\n\n const range = flatArgumentsDefined\n const n = range.length\n\n let sum = 0\n let count = 0\n let result\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sum += el\n }\n\n if (el === true) {\n sum++\n }\n\n if (el !== null) {\n count++\n }\n }\n\n result = sum / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the average (arithmetic mean) of all the values in a range that meet a given criteria.\n *\n * Category: Statistical\n *\n * @param {*} range One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @param {*} criteria The criteria in the form of a number, expression, value reference, or text that defines which values are averaged.\n * @param {*} average_range Optional. The actual set of values to average. If omitted, range is used.\n * @returns\n */\nexport function AVERAGEIF(range, criteria, average_range) {\n if (arguments.length <= 1) {\n return error.na\n }\n\n average_range = average_range || range\n\n const flatAverageRange = utils.flatten(average_range)\n const flatAverageRangeDefined = flatAverageRange.filter(utils.isDefined)\n\n average_range = utils.parseNumberArray(flatAverageRangeDefined)\n range = utils.flatten(range)\n\n if (average_range instanceof Error) {\n return average_range\n }\n\n let average_count = 0\n let result = 0\n\n const isWildcard = criteria === void 0 || criteria === '*'\n const tokenizedCriteria = isWildcard ? null : evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n\n if (isWildcard) {\n result += average_range[i]\n average_count++\n } else {\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n if (evalExpression.compute(tokens)) {\n result += average_range[i]\n average_count++\n }\n }\n }\n\n return result / average_count\n}\n\n/**\n * Returns the average (arithmetic mean) of all values that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @returns\n */\nexport function AVERAGEIFS() {\n // Does not work with multi dimensional ranges yet!\n // http://office.microsoft.com/en-001/excel-help/averageifs-function-HA010047493.aspx\n const values = utils.applyCriteria(...arguments)\n const result = values.reduce((acc, value) => acc + value, 0)\n const average = result / values.length\n\n return isNaN(average) ? 0 : average\n}\n\nexport const BETA = {}\n\n/**\n * Returns the beta cumulative distribution function.\n *\n * Category: Statistical\n *\n * @param {*} x The value between A and B at which to evaluate the function\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, BETA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.DIST = function (x, alpha, beta, cumulative, a, b) {\n if (arguments.length < 4) {\n return error.value\n }\n\n a = a === undefined ? 0 : a\n b = b === undefined ? 1 : b\n\n x = utils.parseNumber(x)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n a = utils.parseNumber(a)\n b = utils.parseNumber(b)\n\n if (utils.anyIsError(x, alpha, beta, a, b)) {\n return error.value\n }\n\n x = (x - a) / (b - a)\n\n return cumulative ? jStat.beta.cdf(x, alpha, beta) : jStat.beta.pdf(x, alpha, beta)\n}\n\n/**\n * Returns the inverse of the cumulative distribution function for a specified beta distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the beta distribution.\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter the distribution.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.INV = (probability, alpha, beta, a, b) => {\n a = a === undefined ? 0 : a\n b = b === undefined ? 1 : b\n probability = utils.parseNumber(probability)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n a = utils.parseNumber(a)\n b = utils.parseNumber(b)\n\n if (utils.anyIsError(probability, alpha, beta, a, b)) {\n return error.value\n }\n\n return jStat.beta.inv(probability, alpha, beta) * (b - a) + a\n}\n\nexport const BINOM = {}\n\n/**\n * Returns the individual term binomial distribution probability.\n *\n * Category: Statistical\n *\n * @param {*} number_s The number of successes in trials.\n * @param {*} trials The number of independent trials.\n * @param {*} probability_s The probability of success on each trial.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then BINOM.DIST returns the cumulative distribution function, which is the probability that there are at most number_s successes; if FALSE, it returns the probability mass function, which is the probability that there are number_s successes.\n * @returns\n */\nBINOM.DIST = (number_s, trials, probability_s, cumulative) => {\n number_s = utils.parseNumber(number_s)\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n cumulative = utils.parseNumber(cumulative)\n\n if (utils.anyIsError(number_s, trials, probability_s, cumulative)) {\n return error.value\n }\n\n return cumulative\n ? jStat.binomial.cdf(number_s, trials, probability_s)\n : jStat.binomial.pdf(number_s, trials, probability_s)\n}\n\n/**\n * Returns the probability of a trial result using a binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of independent trials. Must be greater than or equal to 0.\n * @param {*} probability_s The probability of success in each trial. Must be greater than or equal to 0 and less than or equal to 1.\n * @param {*} number_s The number of successes in trials. Must be greater than or equal to 0 and less than or equal to Trials.\n * @param {*} number_s2 Optional. If provided, returns the probability that the number of successful trials will fall between Number_s and number_s2. Must be greater than or equal to Number_s and less than or equal to Trials.\n * @returns\n */\nBINOM.DIST.RANGE = (trials, probability_s, number_s, number_s2) => {\n number_s2 = number_s2 === undefined ? number_s : number_s2\n\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n number_s = utils.parseNumber(number_s)\n number_s2 = utils.parseNumber(number_s2)\n\n if (utils.anyIsError(trials, probability_s, number_s, number_s2)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = number_s; i <= number_s2; i++) {\n result += mathTrig.COMBIN(trials, i) * Math.pow(probability_s, i) * Math.pow(1 - probability_s, trials - i)\n }\n\n return result\n}\n\n/**\n * Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of Bernoulli trials.\n * @param {*} probability_s The probability of a success on each trial.\n * @param {*} alpha The criterion value.\n * @returns\n */\nBINOM.INV = (trials, probability_s, alpha) => {\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n alpha = utils.parseNumber(alpha)\n\n if (utils.anyIsError(trials, probability_s, alpha)) {\n return error.value\n }\n\n let x = 0\n\n while (x <= trials) {\n if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\n return x\n }\n\n x++\n }\n}\n\nexport const CHISQ = {}\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, CHISQ.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nCHISQ.DIST = (x, deg_freedom, cumulative) => {\n x = utils.parseNumber(x)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(x, deg_freedom)) {\n return error.value\n }\n\n return cumulative ? jStat.chisquare.cdf(x, deg_freedom) : jStat.chisquare.pdf(x, deg_freedom)\n}\n\n/**\n * Returns the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.DIST.RT = (x, deg_freedom) => {\n if (!x | !deg_freedom) {\n return error.na\n }\n\n if (x < 1 || deg_freedom > Math.pow(10, 10)) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return 1 - jStat.chisquare.cdf(x, deg_freedom)\n}\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return jStat.chisquare.inv(probability, deg_freedom)\n}\n\n/**\n * Returns the inverse of the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV.RT = (probability, deg_freedom) => {\n if (!probability | !deg_freedom) {\n return error.na\n }\n\n if (probability < 0 || probability > 1 || deg_freedom < 1 || deg_freedom > Math.pow(10, 10)) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return jStat.chisquare.inv(1.0 - probability, deg_freedom)\n}\n\n/**\n * Returns the test for independence.\n *\n * Category: Statistical\n *\n * @param {*} actual_range The range of data that contains observations to test against expected values.\n * @param {*} expected_range The range of data that contains the ratio of the product of row totals and column totals to the grand total.\n * @returns\n */\nCHISQ.TEST = function (actual_range, expected_range) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (!(actual_range instanceof Array) || !(expected_range instanceof Array)) {\n return error.value\n }\n\n if (actual_range.length !== expected_range.length) {\n return error.value\n }\n\n if (actual_range[0] && expected_range[0] && actual_range[0].length !== expected_range[0].length) {\n return error.value\n }\n\n const row = actual_range.length\n\n let tmp, i, j\n\n // Convert single-dimension array into two-dimension array\n\n for (i = 0; i < row; i++) {\n if (!(actual_range[i] instanceof Array)) {\n tmp = actual_range[i]\n\n actual_range[i] = []\n actual_range[i].push(tmp)\n }\n\n if (!(expected_range[i] instanceof Array)) {\n tmp = expected_range[i]\n\n expected_range[i] = []\n expected_range[i].push(tmp)\n }\n }\n\n const col = actual_range[0].length\n const dof = col === 1 ? row - 1 : (row - 1) * (col - 1)\n\n let xsqr = 0\n\n const Pi = Math.PI\n\n for (i = 0; i < row; i++) {\n for (j = 0; j < col; j++) {\n xsqr += Math.pow(actual_range[i][j] - expected_range[i][j], 2) / expected_range[i][j]\n }\n }\n\n // Get independency by X square and its degree of freedom\n function ChiSq(xsqr, dof) {\n let p = Math.exp(-0.5 * xsqr)\n\n if (dof % 2 === 1) {\n p = p * Math.sqrt((2 * xsqr) / Pi)\n }\n\n let k = dof\n\n while (k >= 2) {\n p = (p * xsqr) / k\n k = k - 2\n }\n\n let t = p\n let a = dof\n\n while (t > 0.0000000001 * p) {\n a = a + 2\n t = (t * xsqr) / a\n p = p + t\n }\n\n return 1 - p\n }\n\n return Math.round(ChiSq(xsqr, dof) * 1000000) / 1000000\n}\n\nexport const CONFIDENCE = {}\n\n/**\n * Returns the confidence interval for a population mean.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.NORM = (alpha, standard_dev, size) => {\n alpha = utils.parseNumber(alpha)\n standard_dev = utils.parseNumber(standard_dev)\n size = utils.parseNumber(size)\n\n if (utils.anyIsError(alpha, standard_dev, size)) {\n return error.value\n }\n\n return jStat.normalci(1, alpha, standard_dev, size)[1] - 1\n}\n\n/**\n * Returns the confidence interval for a population mean, using a Student's t distribution.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.T = (alpha, standard_dev, size) => {\n alpha = utils.parseNumber(alpha)\n standard_dev = utils.parseNumber(standard_dev)\n size = utils.parseNumber(size)\n\n if (utils.anyIsError(alpha, standard_dev, size)) {\n return error.value\n }\n\n return jStat.tci(1, alpha, standard_dev, size)[1] - 1\n}\n\n/**\n * Returns the correlation coefficient between two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 A range of value values.\n * @param {*} array2 A second range of value values.\n * @returns\n */\nexport function CORREL(array1, array2) {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n return jStat.corrcoeff(array1, array2)\n}\n\n/**\n * Counts how many numbers are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Cell reference, or range within which you want to count numbers.count numbers.\n * @returns\n */\nexport function COUNT() {\n const flatArguments = utils.flatten(arguments)\n\n return utils.numbers(flatArguments).length\n}\n\n/**\n * Counts how many values are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Arguments representing the values that you want to count.\n * @returns\n */\nexport function COUNTA() {\n const flatArguments = utils.flatten(arguments)\n\n return flatArguments.length - COUNTBLANK(flatArguments)\n}\n\n/**\n * Counts the number of blank values within a range.\n *\n * Category: Statistical\n *\n * @param {*} args The range from which you want to count the blank values.\n * @returns\n */\nexport function COUNTBLANK() {\n const range = utils.flatten(arguments)\n\n let blanks = 0\n let element\n\n for (let i = 0; i < range.length; i++) {\n element = range[i]\n\n if (element === undefined || element === null || element === '') {\n blanks++\n }\n }\n\n return blanks\n}\n\n/**\n * Counts the number of values within a range that meet the given criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function COUNTIF(range, criteria) {\n range = utils.flatten(range)\n\n const isWildcard = criteria === void 0 || criteria === '*'\n\n if (isWildcard) {\n return range.length\n }\n\n let matches = 0\n\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n if (evalExpression.compute(tokens)) {\n matches++\n }\n }\n\n return matches\n}\n\n/**\n * Counts the number of values within a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args Range in which to evaluate the associated criteria.\n * @returns\n */\nexport function COUNTIFS() {\n const args = utils.argsToArray(arguments)\n const results = new Array(utils.flatten(args[0]).length)\n\n for (let i = 0; i < results.length; i++) {\n results[i] = true\n }\n\n for (let i = 0; i < args.length; i += 2) {\n const range = utils.flatten(args[i])\n const criteria = args[i + 1]\n const isWildcard = criteria === void 0 || criteria === '*'\n\n if (!isWildcard) {\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n\n for (let j = 0; j < range.length; j++) {\n const value = range[j]\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n results[j] = results[j] && evalExpression.compute(tokens)\n }\n }\n }\n\n let result = 0\n\n for (let i = 0; i < results.length; i++) {\n if (results[i]) {\n result++\n }\n }\n\n return result\n}\n\nexport const COVARIANCE = {}\n\n/**\n * Returns covariance, the average of the products of paired deviations.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.P = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n const mean1 = jStat.mean(array1)\n const mean2 = jStat.mean(array2)\n\n let result = 0\n\n const n = array1.length\n\n for (let i = 0; i < n; i++) {\n result += (array1[i] - mean1) * (array2[i] - mean2)\n }\n\n return result / n\n}\n\n/**\n * Returns the sample covariance, the average of the products deviations for each data point pair in two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.S = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n return jStat.covariance(array1, array2)\n}\n\n/**\n * Returns the sum of squares of deviations.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the sum of squared deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function DEVSQ() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n\n let result = 0\n\n for (let i = 0; i < range.length; i++) {\n result += Math.pow(range[i] - mean, 2)\n }\n\n return result\n}\n\nexport const EXPON = {}\n\n/**\n * Returns the exponential distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value of the function.\n * @param {*} lambda The parameter value.\n * @param {*} cumulative A logical value that indicates which form of the exponential function to provide. If cumulative is TRUE, EXPON.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nEXPON.DIST = (x, lambda, cumulative) => {\n x = utils.parseNumber(x)\n lambda = utils.parseNumber(lambda)\n\n if (utils.anyIsError(x, lambda)) {\n return error.value\n }\n\n return cumulative ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda)\n}\n\nexport const F = {}\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, F.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nF.DIST = (x, deg_freedom1, deg_freedom2, cumulative) => {\n x = utils.parseNumber(x)\n deg_freedom1 = utils.parseNumber(deg_freedom1)\n deg_freedom2 = utils.parseNumber(deg_freedom2)\n\n if (utils.anyIsError(x, deg_freedom1, deg_freedom2)) {\n return error.value\n }\n\n return cumulative\n ? jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n : jStat.centralF.pdf(x, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.DIST.RT = function (x, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (x < 0 || deg_freedom1 < 1 || deg_freedom2 < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return error.value\n }\n\n return 1 - jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV = (probability, deg_freedom1, deg_freedom2) => {\n probability = utils.parseNumber(probability)\n deg_freedom1 = utils.parseNumber(deg_freedom1)\n deg_freedom2 = utils.parseNumber(deg_freedom2)\n\n if (utils.anyIsError(probability, deg_freedom1, deg_freedom2)) {\n return error.value\n }\n\n if (probability <= 0.0 || probability > 1.0) {\n return error.num\n }\n\n return jStat.centralF.inv(probability, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV.RT = function (probability, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (\n probability < 0 ||\n probability > 1 ||\n deg_freedom1 < 1 ||\n deg_freedom1 > Math.pow(10, 10) ||\n deg_freedom2 < 1 ||\n deg_freedom2 > Math.pow(10, 10)\n ) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return error.value\n }\n\n return jStat.centralF.inv(1.0 - probability, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the result of an F-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first array or range of data.\n * @param {*} array2 The second array or range of data.\n * @returns\n */\nF.TEST = (array1, array2) => {\n if (!array1 || !array2) {\n return error.na\n }\n\n if (!(array1 instanceof Array) || !(array2 instanceof Array)) {\n return error.na\n }\n\n if (array1.length < 2 || array2.length < 2) {\n return error.div0\n }\n\n const sumOfSquares = (values, x1) => {\n let sum = 0\n\n for (let i = 0; i < values.length; i++) {\n sum += Math.pow(values[i] - x1, 2)\n }\n\n return sum\n }\n\n const x1 = mathTrig.SUM(array1) / array1.length\n const x2 = mathTrig.SUM(array2) / array2.length\n const sum1 = sumOfSquares(array1, x1) / (array1.length - 1)\n const sum2 = sumOfSquares(array2, x2) / (array2.length - 1)\n\n return sum1 / sum2\n}\n\n/**\n * Returns the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} x A numeric value for which you want the transformation.\n * @returns\n */\nexport function FISHER(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return x\n }\n\n return Math.log((1 + x) / (1 - x)) / 2\n}\n\n/**\n * Returns the inverse of the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} y The value for which you want to perform the inverse of the transformation.\n * @returns\n */\nexport function FISHERINV(y) {\n y = utils.parseNumber(y)\n\n if (y instanceof Error) {\n return y\n }\n\n const e2y = Math.exp(2 * y)\n\n return (e2y - 1) / (e2y + 1)\n}\n\n/**\n * Returns a value along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} x The data point for which you want to predict a value.\n * @param {*} known_ys The dependent array or range of data.\n * @param {*} known_xs The independent array or range of data.\n * @returns\n */\nexport function FORECAST(x, known_ys, known_xs) {\n x = utils.parseNumber(x)\n known_ys = utils.parseNumberArray(utils.flatten(known_ys))\n known_xs = utils.parseNumberArray(utils.flatten(known_xs))\n\n if (utils.anyIsError(x, known_ys, known_xs)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_xs)\n const ymean = jStat.mean(known_ys)\n\n const n = known_xs.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_xs[i] - xmean) * (known_ys[i] - ymean)\n den += Math.pow(known_xs[i] - xmean, 2)\n }\n\n const b = num / den\n const a = ymean - b * xmean\n\n return a + b * x\n}\n\n/**\n * Returns a frequency distribution as a vertical array.\n *\n * Category: Statistical\n *\n * @param {*} data_array An array of or reference to a set of values for which you want to count frequencies. If data_array contains no values, FREQUENCY returns an array of zeros.\n * @param {*} bins_array An array of or reference to intervals into which you want to group the values in data_array. If bins_array contains no values, FREQUENCY returns the number of elements in data_array.\n * @returns\n */\nexport function FREQUENCY(data_array, bins_array) {\n data_array = utils.parseNumberArray(utils.flatten(data_array))\n bins_array = utils.parseNumberArray(utils.flatten(bins_array))\n\n if (utils.anyIsError(data_array, bins_array)) {\n return error.value\n }\n\n const n = data_array.length\n const b = bins_array.length\n const r = []\n\n for (let i = 0; i <= b; i++) {\n r[i] = 0\n\n for (let j = 0; j < n; j++) {\n if (i === 0) {\n if (data_array[j] <= bins_array[0]) {\n r[0] += 1\n }\n } else if (i < b) {\n if (data_array[j] > bins_array[i - 1] && data_array[j] <= bins_array[i]) {\n r[i] += 1\n }\n } else if (i === b) {\n if (data_array[j] > bins_array[b - 1]) {\n r[b] += 1\n }\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the Gamma function value.\n *\n * Category: Statistical\n *\n * @param {*} number Returns a number.\n * @returns\n */\nexport function GAMMA(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n if (parseInt(number, 10) === number && number < 0) {\n return error.num\n }\n\n return jStat.gammafn(number)\n}\n\n/**\n * Returns the gamma distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.DIST returns the standard gamma distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, GAMMA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nGAMMA.DIST = function (value, alpha, beta, cumulative) {\n if (arguments.length !== 4) {\n return error.na\n }\n\n if (value < 0 || alpha <= 0 || beta <= 0) {\n return error.value\n }\n\n if (typeof value !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return error.value\n }\n\n return cumulative ? jStat.gamma.cdf(value, alpha, beta, true) : jStat.gamma.pdf(value, alpha, beta, false)\n}\n\n/**\n * Returns the inverse of the gamma cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the gamma distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.INV returns the standard gamma distribution.\n * @returns\n */\nGAMMA.INV = function (probability, alpha, beta) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (probability < 0 || probability > 1 || alpha <= 0 || beta <= 0) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return error.value\n }\n\n return jStat.gamma.inv(probability, alpha, beta)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.\n * @returns\n */\nexport function GAMMALN(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return x\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.PRECISE.\n * @returns\n */\nGAMMALN.PRECISE = function (x) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (x <= 0) {\n return error.num\n }\n\n if (typeof x !== 'number') {\n return error.value\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns 0.5 less than the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z Returns a number.\n * @returns\n */\nexport function GAUSS(z) {\n z = utils.parseNumber(z)\n\n if (z instanceof Error) {\n return z\n }\n\n return jStat.normal.cdf(z, 0, 1) - 0.5\n}\n\n/**\n * Returns the geometric mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function GEOMEAN() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n return jStat.geomean(args)\n}\n\n/**\n * Returns values along an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n - If any of the numbers in known_y's is 0 or negative, GROWTH returns the #NUM! error value.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} new_x Optional. Are new x-values for which you want GROWTH to return corresponding y-values.\n - new_x's must include a column (or row) for each independent variable, just as known_x's does. So, if known_y's is in a single column, known_x's and new_x's must have the same number of columns. If known_y's is in a single row, known_x's and new_x's must have the same number of rows.\n - If new_x's is omitted, it is assumed to be the same as known_x's.\n - If both known_x's and new_x's are omitted, they are assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} use_const Optional. A logical value specifying whether to force the constant b to equal 1. If const is TRUE or omitted, b is calculated normally. If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n - If const is TRUE or omitted, b is calculated normally.\n - If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n * @returns\n */\nexport function GROWTH(known_y, known_x, new_x, use_const) {\n // Credits: Ilmari Karonen (http://stackoverflow.com/questions/14161990/how-to-implement-growth-function-in-javascript)\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n\n if (known_y instanceof Error) {\n return known_y\n }\n\n // Default values for optional parameters:\n let i\n\n if (known_x === undefined) {\n known_x = []\n\n for (i = 1; i <= known_y.length; i++) {\n known_x.push(i)\n }\n }\n\n if (new_x === undefined) {\n new_x = known_x\n }\n\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n new_x = utils.parseNumberArray(utils.flatten(new_x))\n\n if (utils.anyIsError(known_x, new_x)) {\n return error.value\n }\n\n if (use_const === undefined) {\n use_const = true\n }\n\n // Calculate sums over the data:\n const n = known_y.length\n\n let avg_x = 0\n let avg_y = 0\n let avg_xy = 0\n let avg_xx = 0\n\n for (i = 0; i < n; i++) {\n const x = known_x[i]\n const y = Math.log(known_y[i])\n\n avg_x += x\n avg_y += y\n avg_xy += x * y\n avg_xx += x * x\n }\n\n avg_x /= n\n avg_y /= n\n avg_xy /= n\n avg_xx /= n\n\n // Compute linear regression coefficients:\n let beta\n let alpha\n\n if (use_const) {\n beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x)\n alpha = avg_y - beta * avg_x\n } else {\n beta = avg_xy / avg_xx\n alpha = 0\n }\n\n // Compute and return result array:\n const new_y = []\n\n for (i = 0; i < new_x.length; i++) {\n new_y.push(Math.exp(alpha + beta * new_x[i]))\n }\n\n return new_y\n}\n\n/**\n * Returns the harmonic mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function HARMEAN() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n\n let den = 0\n\n for (let i = 0; i < n; i++) {\n den += 1 / range[i]\n }\n\n return n / den\n}\n\nexport const HYPGEOM = {}\n\n/**\n * Returns the hypergeometric distribution.\n *\n * Category: Statistical\n *\n * @param {*} sample_s The number of successes in the sample.\n * @param {*} number_sample The size of the sample.\n * @param {*} population_s The number of successes in the population.\n * @param {*} number_pop The population size.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then HYPGEOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nHYPGEOM.DIST = (sample_s, number_sample, population_s, number_pop, cumulative) => {\n sample_s = utils.parseNumber(sample_s)\n number_sample = utils.parseNumber(number_sample)\n population_s = utils.parseNumber(population_s)\n number_pop = utils.parseNumber(number_pop)\n\n if (utils.anyIsError(sample_s, number_sample, population_s, number_pop)) {\n return error.value\n }\n\n function pdf(x, n, M, N) {\n return (mathTrig.COMBIN(M, x) * mathTrig.COMBIN(N - M, n - x)) / mathTrig.COMBIN(N, n)\n }\n\n function cdf(x, n, M, N) {\n let result = 0\n\n for (let i = 0; i <= x; i++) {\n result += pdf(i, n, M, N)\n }\n\n return result\n }\n\n return cumulative\n ? cdf(sample_s, number_sample, population_s, number_pop)\n : pdf(sample_s, number_sample, population_s, number_pop)\n}\n\n/**\n * Returns the intercept of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y The dependent set of observations or data.\n * @param {*} known_x The independent set of observations or data.\n * @returns\n */\nexport function INTERCEPT(known_y, known_x) {\n known_y = utils.parseNumberArray(known_y)\n known_x = utils.parseNumberArray(known_x)\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n if (known_y.length !== known_x.length) {\n return error.na\n }\n\n return FORECAST(0, known_y, known_x)\n}\n\n/**\n * Returns the kurtosis of a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate kurtosis. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function KURT() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let sigma = 0\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 4)\n }\n\n sigma = sigma / Math.pow(jStat.stdev(range, true), 4)\n\n return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - (3 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))\n}\n\n/**\n * Returns the k-th largest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data for which you want to determine the k-th largest value.\n * @param {*} k The position (from the largest) in the array or value range of data to return.\n * @returns\n */\nexport function LARGE(array, k) {\n const someError = utils.anyError.apply(undefined, array)\n\n if (someError) {\n return someError\n }\n\n if (utils.anyIsError(k)) {\n return k\n }\n\n array = utils.numbers(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (k < 0 || array.length < k) {\n return error.value\n }\n\n return array.sort((a, b) => b - a)[k - 1]\n}\n\n/**\n * Returns the parameters of a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values that you already know in the relationship y = mx + b.\n - If the range of known_y's is in a single column, each column of known_x's is interpreted as a separate variable.\n - If the range of known_y's is contained in a single row, each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. A set of x-values that you may already know in the relationship y = mx + b.\n - The range of known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nexport function LINEST(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const ymean = jStat.mean(known_y)\n const xmean = jStat.mean(known_x)\n const n = known_x.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n const m = num / den\n const b = ymean - m * xmean\n\n return [m, b]\n}\n\n// According to Microsoft:\n// http://office.microsoft.com/en-us/starter-help/logest-function-HP010342665.aspx\n// LOGEST returns are based on the following linear model:\n// ln y = x1 ln m1 + ... + xn ln mn + ln b\n/**\n * Returns the parameters of an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a range of values with a height of one row or a width of one column (which is also known as a vector).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nexport function LOGEST(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n if (known_y.length !== known_x.length) {\n return error.value\n }\n\n for (let i = 0; i < known_y.length; i++) {\n known_y[i] = Math.log(known_y[i])\n }\n\n const result = LINEST(known_y, known_x)\n\n result[0] = Math.round(Math.exp(result[0]) * 1000000) / 1000000\n result[1] = Math.round(Math.exp(result[1]) * 1000000) / 1000000\n\n return result\n}\n\nexport const LOGNORM = {}\n\n/**\n * Returns the cumulative lognormal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, LOGNORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nLOGNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n return cumulative ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev)\n}\n\n/**\n * Returns the inverse of the lognormal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the lognormal distribution.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @returns\n */\nLOGNORM.INV = (probability, mean, standard_dev) => {\n probability = utils.parseNumber(probability)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(probability, mean, standard_dev)) {\n return error.value\n }\n\n return jStat.lognormal.inv(probability, mean, standard_dev)\n}\n\n/**\n * Returns the maximum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want to find the maximum value.\n * @returns\n */\nexport function MAX() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArguments)\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2,... Number arguments 2 to 255 for which you want to find the largest value.\n * @returns\n */\nexport function MAXA() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n let range = utils.arrayValuesToNumbers(flatArguments)\n\n range = range.map((value) => (value === undefined || value === null ? 0 : value))\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum of all values in a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function MAXIFS() {\n const values = utils.applyCriteria(...arguments)\n\n return values.length === 0 ? 0 : Math.max.apply(Math, values)\n}\n\n/**\n * Returns the median of the given numbers.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want the median.\n * @returns\n */\nexport function MEDIAN() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.arrayValuesToNumbers(flatArguments)\n\n let result = jStat.median(range)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the minimum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is optional, subsequent numbers are optional. 1 to 255 numbers for which you want to find the minimum value.\n * @returns\n */\nexport function MIN() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArguments)\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the smallest value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values for which you want to find the smallest value.\n * @returns\n */\nexport function MINA() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n let range = utils.arrayValuesToNumbers(flatArguments)\n\n range = range.map((value) => (value === undefined || value === null ? 0 : value))\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the minimum of all values in a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function MINIFS() {\n const values = utils.applyCriteria(...arguments)\n\n return values.length === 0 ? 0 : Math.min.apply(Math, values)\n}\n\nexport const MODE = {}\n\n/**\n * Returns a vertical array of the most frequently occurring, or repetitive values in an array or range of data.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.MULT = function () {\n // Credits: Roönaän\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n const count = {}\n\n let maxItems = []\n let max = 0\n let currentItem\n\n for (let i = 0; i < n; i++) {\n currentItem = range[i]\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1\n\n if (count[currentItem] > max) {\n max = count[currentItem]\n maxItems = []\n }\n\n if (count[currentItem] === max) {\n maxItems[maxItems.length] = currentItem\n }\n }\n\n return maxItems\n}\n\n/**\n * Returns the most common value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.SNGL = function () {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n return MODE.MULT(range).sort((a, b) => a - b)[0]\n}\n\nexport const NEGBINOM = {}\n\n/**\n * Returns the negative binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} number_f The number of failures.\n * @param {*} number_s The threshold number of successes.\n * @param {*} probability_s The probability of a success.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NEGBINOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNEGBINOM.DIST = (number_f, number_s, probability_s, cumulative) => {\n number_f = utils.parseNumber(number_f)\n number_s = utils.parseNumber(number_s)\n probability_s = utils.parseNumber(probability_s)\n\n if (utils.anyIsError(number_f, number_s, probability_s)) {\n return error.value\n }\n\n return cumulative\n ? jStat.negbin.cdf(number_f, number_s, probability_s)\n : jStat.negbin.pdf(number_f, number_s, probability_s)\n}\n\nexport const NORM = {}\n\n/**\n * Returns the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want the distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n if (standard_dev <= 0) {\n return error.num\n }\n\n // Return normal distribution computed by jStat [http://jstat.org]\n return cumulative ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev)\n}\n\n/**\n * Returns the inverse of the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nNORM.INV = (probability, mean, standard_dev) => {\n probability = utils.parseNumber(probability)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(probability, mean, standard_dev)) {\n return error.value\n }\n\n return jStat.normal.inv(probability, mean, standard_dev)\n}\n\nNORM.S = {}\n\n/**\n * Returns the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z The value for which you want the distribution.\n * @param {*} cumulative Cumulative is a logical value that determines the form of the function. If cumulative is TRUE, NORMS.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nNORM.S.DIST = (z, cumulative) => {\n z = utils.parseNumber(z)\n\n if (z instanceof Error) {\n return error.value\n }\n\n return cumulative ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1)\n}\n\n/**\n * Returns the inverse of the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @returns\n */\nNORM.S.INV = (probability) => {\n probability = utils.parseNumber(probability)\n\n if (probability instanceof Error) {\n return error.value\n }\n\n return jStat.normal.inv(probability, 0, 1)\n}\n\n/**\n * Returns the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} array1 A set of independent values.\n * @param {*} array2 A set of dependent values.\n * @returns\n */\nexport function PEARSON(array1, array2) {\n array2 = utils.parseNumberArray(utils.flatten(array2))\n array1 = utils.parseNumberArray(utils.flatten(array1))\n\n if (utils.anyIsError(array2, array1)) {\n return error.value\n }\n\n const xmean = jStat.mean(array1)\n const ymean = jStat.mean(array2)\n const n = array1.length\n\n let num = 0\n let den1 = 0\n let den2 = 0\n\n for (let i = 0; i < n; i++) {\n num += (array1[i] - xmean) * (array2[i] - ymean)\n den1 += Math.pow(array1[i] - xmean, 2)\n den2 += Math.pow(array2[i] - ymean, 2)\n }\n\n return num / Math.sqrt(den1 * den2)\n}\n\nexport const PERCENTILE = {}\n\n/**\n * Returns the k-th percentile of values in a range, where k is in the range 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @returns\n */\nPERCENTILE.EXC = (array, k) => {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const n = array.length\n\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\n return error.num\n }\n\n const l = k * (n + 1) - 1\n const fl = Math.floor(l)\n\n return utils.cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n}\n\n/**\n * Returns the k-th percentile of values in a range.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data that defines relative standing.\n * @param {*} k The percentile value in the range 0..1, inclusive.\n * @returns\n */\nPERCENTILE.INC = (array, k) => {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const n = array.length\n const l = k * (n - 1)\n const fl = Math.floor(l)\n\n return utils.cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n}\n\nexport const PERCENTRANK = {}\n\n/**\n * Returns the rank of a value in a data set as a percentage (0..1, exclusive) of the data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.EXC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.EXC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n significance = utils.parseNumber(significance)\n\n if (utils.anyIsError(array, x, significance)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const uniques = lookup.UNIQUE.apply(null, array)\n const n = array.length\n const m = uniques.length\n const power = Math.pow(10, significance)\n\n let result = 0\n let match = false\n let i = 0\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = (array.indexOf(uniques[i]) + 1) / (n + 1)\n match = true\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1)\n match = true\n }\n\n i++\n }\n\n return Math.floor(result * power) / power\n}\n\n/**\n * Returns the percentage rank of a value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing.\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.INC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.INC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n significance = utils.parseNumber(significance)\n\n if (utils.anyIsError(array, x, significance)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const uniques = lookup.UNIQUE.apply(null, array)\n const n = array.length\n const m = uniques.length\n const power = Math.pow(10, significance)\n\n let result = 0\n let match = false\n let i = 0\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = array.indexOf(uniques[i]) / (n - 1)\n match = true\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1)\n match = true\n }\n\n i++\n }\n\n return Math.floor(result * power) / power\n}\n\n/**\n * Returns the number of permutations for a given number of objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nexport function PERMUT(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n\n if (utils.anyIsError(number, number_chosen)) {\n return error.value\n }\n\n return mathTrig.FACT(number) / mathTrig.FACT(number - number_chosen)\n}\n\n/**\n * Returns the number of permutations for a given number of objects (with repetitions) that can be selected from the total objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the total number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nexport function PERMUTATIONA(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n\n if (utils.anyIsError(number, number_chosen)) {\n return error.value\n }\n\n return Math.pow(number, number_chosen)\n}\n\n/**\n * Returns the value of the density function for a standard normal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x X is the number for which you want the density of the standard normal distribution.\n * @returns\n */\nexport function PHI(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return error.value\n }\n\n return Math.exp(-0.5 * x * x) / SQRT2PI\n}\n\nexport const POISSON = {}\n\n/**\n * Returns the Poisson distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The number of events.\n * @param {*} mean The expected numeric value.\n * @param {*} cumulative A logical value that determines the form of the probability distribution returned. If cumulative is TRUE, POISSON.DIST returns the cumulative Poisson probability that the number of random events occurring will be between zero and x inclusive; if FALSE, it returns the Poisson probability mass function that the number of events occurring will be exactly x.\n * @returns\n */\nPOISSON.DIST = (x, mean, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n\n if (utils.anyIsError(x, mean)) {\n return error.value\n }\n\n return cumulative ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean)\n}\n\n/**\n * Returns the probability that values in a range are between two limits.\n *\n * Category: Statistical\n *\n * @param {*} x_range The range of numeric values of x with which there are associated probabilities.\n * @param {*} prob_range A set of probabilities associated with values in x_range.\n * @param {*} lower_limit Optional. The lower bound on the value for which you want a probability.\n * @param {*} upper_limit Optional. The optional upper bound on the value for which you want a probability.\n * @returns\n */\nexport function PROB(x_range, prob_range, lower_limit, upper_limit) {\n if (lower_limit === undefined) {\n return 0\n }\n\n upper_limit = upper_limit === undefined ? lower_limit : upper_limit\n\n x_range = utils.parseNumberArray(utils.flatten(x_range))\n prob_range = utils.parseNumberArray(utils.flatten(prob_range))\n lower_limit = utils.parseNumber(lower_limit)\n upper_limit = utils.parseNumber(upper_limit)\n\n if (utils.anyIsError(x_range, prob_range, lower_limit, upper_limit)) {\n return error.value\n }\n\n if (lower_limit === upper_limit) {\n return x_range.indexOf(lower_limit) >= 0 ? prob_range[x_range.indexOf(lower_limit)] : 0\n }\n\n const sorted = x_range.sort((a, b) => a - b)\n const n = sorted.length\n\n let result = 0\n\n for (let i = 0; i < n; i++) {\n if (sorted[i] >= lower_limit && sorted[i] <= upper_limit) {\n result += prob_range[x_range.indexOf(sorted[i])]\n }\n }\n\n return result\n}\n\nexport const QUARTILE = {}\n\n/**\n * Returns the quartile of the data set, based on percentile values from 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.EXC = (range, quart) => {\n range = utils.parseNumberArray(utils.numbers(utils.flatten(range)))\n quart = utils.parseNumber(quart)\n\n if (utils.anyIsError(range, quart)) {\n return error.value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.EXC(range, 0.25)\n case 2:\n return PERCENTILE.EXC(range, 0.5)\n case 3:\n return PERCENTILE.EXC(range, 0.75)\n default:\n return error.num\n }\n}\n\n/**\n * Returns the quartile of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.INC = (range, quart) => {\n range = utils.parseNumberArray(utils.numbers(utils.flatten(range)))\n quart = utils.parseNumber(quart)\n\n if (utils.anyIsError(range, quart)) {\n return error.value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.INC(range, 0.25)\n case 2:\n return PERCENTILE.INC(range, 0.5)\n case 3:\n return PERCENTILE.INC(range, 0.75)\n default:\n return error.num\n }\n}\n\nexport const RANK = {}\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Nonnumeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.AVG = (number, ref, order) => {\n number = utils.parseNumber(number)\n ref = utils.parseNumberArray(utils.flatten(ref))\n\n if (utils.anyIsError(number, ref)) {\n return error.value\n }\n\n ref = utils.flatten(ref)\n order = order || false\n\n const sort = order ? (a, b) => a - b : (a, b) => b - a\n\n ref = ref.sort(sort)\n\n const length = ref.length\n\n let count = 0\n\n for (let i = 0; i < length; i++) {\n if (ref[i] === number) {\n count++\n }\n }\n\n return count > 1 ? (2 * ref.indexOf(number) + count + 1) / 2 : ref.indexOf(number) + 1\n}\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Non-numeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.EQ = (number, ref, order) => {\n number = utils.parseNumber(number)\n ref = utils.parseNumberArray(utils.flatten(ref))\n\n if (utils.anyIsError(number, ref)) {\n return error.value\n }\n\n order = order || false\n\n const sort = order ? (a, b) => a - b : (a, b) => b - a\n\n ref = ref.sort(sort)\n\n return ref.indexOf(number) + 1\n}\n\n/**\n * Returns the row number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want the row number.\n * @param {*} index\n * @returns\n */\nexport function ROW(reference, index) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (index < 0) {\n return error.num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return error.value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.row(reference, index)\n}\n\n/**\n * Returns the square of the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of data points.\n * @param {*} known_x An array or range of data points.\n * @returns\n */\nexport function RSQ(known_y, known_x) {\n // no need to flatten here, PEARSON will take care of that\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n return Math.pow(PEARSON(known_y, known_x), 2)\n}\n\n/**\n * Returns the skewness of a distribution.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate skewness. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function SKEW() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let sigma = 0\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 3)\n }\n\n return (n * sigma) / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(range, true), 3))\n}\n\n/**\n * Returns the skewness of a distribution based on a population.\n *\n * Category: Statistical\n *\n * @returns\n */\nSKEW.P = function () {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let m2 = 0\n let m3 = 0\n\n for (let i = 0; i < n; i++) {\n m3 += Math.pow(range[i] - mean, 3)\n m2 += Math.pow(range[i] - mean, 2)\n }\n\n m3 = m3 / n\n m2 = m2 / n\n\n return m3 / Math.pow(m2, 3 / 2)\n}\n\n/**\n * Returns the slope of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or value range of numeric dependent data points.\n * @param {*} known_x The set of independent data points.\n * @returns\n */\nexport function SLOPE(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_x)\n const ymean = jStat.mean(known_y)\n const n = known_x.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n return num / den\n}\n\n/**\n * Returns the k-th smallest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array An array or range of numerical data for which you want to determine the k-th smallest value.\n * @param {*} k The position (from the smallest) in the array or range of data to return.\n * @returns\n */\nexport function SMALL(array, k) {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return array\n }\n\n return array.sort((a, b) => a - b)[k - 1]\n}\n\n/**\n * Returns a normalized value.\n *\n * Category: Statistical\n *\n * @param {*} x The value you want to normalize.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nexport function STANDARDIZE(x, mean, standard_dev) {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n return (x - mean) / standard_dev\n}\n\nexport const STDEV = {}\n\n/**\n * Calculates standard deviation based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.P = function () {\n const v = VAR.P.apply(this, arguments)\n\n let result = Math.sqrt(v)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Estimates standard deviation based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.S = function () {\n const v = VAR.S.apply(this, arguments)\n const result = Math.sqrt(v)\n\n return result\n}\n\n/**\n * Estimates standard deviation based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function STDEVA() {\n const v = VARA.apply(this, arguments)\n const result = Math.sqrt(v)\n\n return result\n}\n\n/**\n * Calculates standard deviation based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function STDEVPA() {\n const v = VARPA.apply(this, arguments)\n\n let result = Math.sqrt(v)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the standard error of the predicted y-value for each x in the regression.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of dependent data points.\n * @param {*} known_x An array or range of independent data points.\n * @returns\n */\nexport function STEYX(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_x)\n const ymean = jStat.mean(known_y)\n const n = known_x.length\n\n let lft = 0\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n lft += Math.pow(known_y[i] - ymean, 2)\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n return Math.sqrt((lft - (num * num) / den) / (n - 2))\n}\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nT.DIST = (x, deg_freedom, cumulative) => {\n if (cumulative !== 1 && cumulative !== 2) {\n return error.num\n }\n\n return cumulative === 1 ? T.DIST.RT(x, deg_freedom) : T.DIST['2T'](x, deg_freedom)\n}\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT.DIST['2T'] = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return (1 - jStat.studentt.cdf(x, deg_freedom)) * 2\n}\n\n/**\n * Returns the Student's t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT.DIST.RT = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return 1 - jStat.studentt.cdf(x, deg_freedom)\n}\n\n/**\n * Returns the t-value of the Student's t-distribution as a function of the probability and the degrees of freedom.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT.INV = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return jStat.studentt.inv(probability, deg_freedom)\n}\n\n/**\n * Returns the inverse of the Student's t-distribution\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT.INV['2T'] = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (probability <= 0 || probability > 1 || deg_freedom < 1) {\n return error.num\n }\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom))\n}\n\n// The algorithm can be found here:\n// http://www.chem.uoa.gr/applets/AppletTtest/Appl_Ttest2.html\n/**\n * Returns the probability associated with a Student's t-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first data set.\n * @param {*} array2 The second data set.\n * @returns\n */\nT.TEST = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n const mean_x = jStat.mean(array1)\n const mean_y = jStat.mean(array2)\n\n let s_x = 0\n let s_y = 0\n let i\n\n for (i = 0; i < array1.length; i++) {\n s_x += Math.pow(array1[i] - mean_x, 2)\n }\n\n for (i = 0; i < array2.length; i++) {\n s_y += Math.pow(array2[i] - mean_y, 2)\n }\n\n s_x = s_x / (array1.length - 1)\n s_y = s_y / (array2.length - 1)\n\n const t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / array1.length + s_y / array2.length)\n\n return T.DIST['2T'](t, array1.length + array2.length - 2)\n}\n\n// Re-export T with statistical methods\nexport { T }\n\n/**\n * Returns values along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_ys The set of y-values you already know in the relationship y = mx + b\n * @param {*} known_xs An optional set of x-values that you may already know in the relationship y = mx + b\n * @param {*} new_xs Optional. New x-values for which you want TREND to return corresponding y-values.\n * @returns\n */\nexport function TREND(known_ys, known_xs, new_xs) {\n known_ys = utils.parseNumberArray(utils.flatten(known_ys))\n known_xs = utils.parseNumberArray(utils.flatten(known_xs))\n new_xs = utils.parseNumberArray(utils.flatten(new_xs))\n\n if (utils.anyIsError(known_ys, known_xs, new_xs)) {\n return error.value\n }\n\n const linest = LINEST(known_ys, known_xs)\n const m = linest[0]\n const b = linest[1]\n const result = []\n\n new_xs.forEach((x) => {\n result.push(m * x + b)\n })\n\n return result\n}\n\n/**\n * Returns the mean of the interior of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of values to trim and average.\n * @param {*} percent The fractional number of data points to exclude from the calculation. For example, if percent = 0.2, 4 points are trimmed from a data set of 20 points (20 x 0.2): 2 from the top and 2 from the bottom of the set.\n * @returns\n */\nexport function TRIMMEAN(range, percent) {\n range = utils.parseNumberArray(utils.flatten(range))\n percent = utils.parseNumber(percent)\n\n if (utils.anyIsError(range, percent)) {\n return error.value\n }\n\n const trim = mathTrig.FLOOR(range.length * percent, 2) / 2\n\n return jStat.mean(\n utils.initial(\n utils.rest(\n range.sort((a, b) => a - b),\n trim\n ),\n trim\n )\n )\n}\n\nexport const VAR = {}\n\n/**\n * Calculates variance based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population.\n * @returns\n */\nVAR.P = function () {\n const range = utils.numbers(utils.flatten(arguments))\n const n = range.length\n\n let sigma = 0\n\n const mean = AVERAGE(range)\n\n let result\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2)\n }\n\n result = sigma / n\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Estimates variance based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population.\n * @returns\n */\nVAR.S = function () {\n const range = utils.numbers(utils.flatten(arguments))\n const n = range.length\n\n let sigma = 0\n\n const mean = AVERAGE(range)\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2)\n }\n\n return sigma / (n - 1)\n}\n\n/**\n * Estimates variance based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a sample of a population.\n * @returns\n */\nexport function VARA() {\n const range = utils.flatten(arguments)\n const n = range.length\n\n let sigma = 0\n let count = 0\n\n const mean = AVERAGEA(range)\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2)\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2)\n } else {\n sigma += Math.pow(0 - mean, 2)\n }\n\n if (el !== null) {\n count++\n }\n }\n\n return sigma / (count - 1)\n}\n\n/**\n * Calculates variance based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a population.\n * @returns\n */\nexport function VARPA() {\n const range = utils.flatten(arguments)\n const n = range.length\n\n let sigma = 0\n let count = 0\n\n const mean = AVERAGEA(range)\n\n let result\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2)\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2)\n } else {\n sigma += Math.pow(0 - mean, 2)\n }\n\n if (el !== null) {\n count++\n }\n }\n\n result = sigma / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\nexport const WEIBULL = {}\n\n/**\n * Returns the Weibull distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution.\n * @param {*} cumulative Determines the form of the function.\n * @returns\n */\nWEIBULL.DIST = (x, alpha, beta, cumulative) => {\n x = utils.parseNumber(x)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n\n if (utils.anyIsError(x, alpha, beta)) {\n return error.value\n }\n\n return cumulative\n ? 1 - Math.exp(-Math.pow(x / beta, alpha))\n : (Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha) / Math.pow(beta, alpha)\n}\n\nexport const Z = {}\n\n/**\n * Returns the one-tailed probability-value of a z-test.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data against which to test x.\n * @param {*} x The value to test.\n * @param {*} sigma Optional. The population (known) standard deviation. If omitted, the sample standard deviation is used.\n * @returns\n */\nZ.TEST = (array, x, sigma) => {\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n\n if (utils.anyIsError(array, x)) {\n return error.value\n }\n\n sigma = sigma || STDEV.S(array)\n\n const n = array.length\n\n return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)\n}\n","import * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as information from './information.js'\nimport * as statistical from './statistical.js'\nimport * as utils from './utils/common.js'\n\n\n\n\n\nexport function PNL() {\n const [A, B] = utils.argsToArray(arguments);\n\n const toNumberOrThrow = (val) => {\n const num = Number(val);\n if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);\n return num;\n };\n\n // Single numbers\n if (typeof A === \"number\" && typeof B === \"number\") {\n return A - B;\n }\n\n // 1D arrays\n if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== \"object\") {\n const maxLen = Math.max(A.length, B.length);\n let total = 0;\n for (let i = 0; i < maxLen; i++) {\n const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;\n const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;\n total += aVal - bVal;\n }\n return total;\n }\n\n // 2D arrays\n if (Array.isArray(A[0]) && typeof A[0][0] !== \"object\") {\n let total = 0;\n const maxRows = Math.max(A.length, B.length);\n for (let i = 0; i < maxRows; i++) {\n const rowA = A[i] || [];\n const rowB = B[i] || [];\n const maxCols = Math.max(rowA.length, rowB.length);\n for (let j = 0; j < maxCols; j++) {\n const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;\n const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;\n total += aVal - bVal;\n }\n }\n return total;\n }\n\n // 3D arrays\n if (Array.isArray(A[0][0])) {\n let total = 0;\n const maxX = Math.max(A.length, B.length);\n for (let i = 0; i < maxX; i++) {\n const matA = A[i] || [];\n const matB = B[i] || [];\n const maxY = Math.max(matA.length, matB.length);\n for (let j = 0; j < maxY; j++) {\n const rowA = matA[j] || [];\n const rowB = matB[j] || [];\n const maxZ = Math.max(rowA.length, rowB.length);\n for (let k = 0; k < maxZ; k++) {\n const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;\n const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;\n total += aVal - bVal;\n }\n }\n }\n return total;\n }\n\n throw new Error(\"Unsupported or mismatched structure\");\n}\n\n\n/**\n * Returns the absolute value of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number of which you want the absolute value.\n * @returns\n */\nexport function ABS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.abs(number)\n\n return result\n}\n\n/**\n * Returns the arccosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The cosine of the angle you want and must be from -1 to 1.\n * @returns\n */\nexport function ACOS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.acos(number)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number equal to or greater than 1.\n * @returns\n */\nexport function ACOSH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log(number + Math.sqrt(number * number - 1))\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Number is the cotangent of the angle you want. This must be a real number.\n * @returns\n */\nexport function ACOT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.atan(1 / number)\n\n return result\n}\n\n/**\n * Returns the hyperbolic arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The absolute value of Number must be greater than 1.\n * @returns\n */\nexport function ACOTH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = 0.5 * Math.log((number + 1) / (number - 1))\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n// TODO: use options\n/**\n * Returns an aggregate in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num A number 1 to 19 that specifies which function to use.\n * @param {*} options A numerical value that determines which values to ignore in the evaluation range for the function. Note: The function will not ignore hidden rows, nested subtotals or nested aggregates if the array argument includes a calculation, for example: =AGGREGATE(14,3,A1:A100*(A1:A100>0),1)\n * @param {*} ref1 The first numeric argument for functions that take multiple numeric arguments for which you want the aggregate value.\n * @param {*} ref2 Optional. Numeric arguments 2 to 253 for which you want the aggregate value. For functions that take an array, ref1 is an array, an array formula, or a reference to a range of values for which you want the aggregate value. Ref2 is a second argument that is required for certain functions.\n * @returns\n */\nexport function AGGREGATE(function_num, options, ref1, ref2) {\n function_num = utils.parseNumber(function_num)\n options = utils.parseNumber(function_num)\n\n if (utils.anyIsError(function_num, options)) {\n return error.value\n }\n\n switch (function_num) {\n case 1:\n return statistical.AVERAGE(ref1)\n case 2:\n return statistical.COUNT(ref1)\n case 3:\n return statistical.COUNTA(ref1)\n case 4:\n return statistical.MAX(ref1)\n case 5:\n return statistical.MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return statistical.STDEV.S(ref1)\n case 8:\n return statistical.STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return statistical.VAR.S(ref1)\n case 11:\n return statistical.VAR.P(ref1)\n case 12:\n return statistical.MEDIAN(ref1)\n case 13:\n return statistical.MODE.SNGL(ref1)\n case 14:\n return statistical.LARGE(ref1, ref2)\n case 15:\n return statistical.SMALL(ref1, ref2)\n case 16:\n return statistical.PERCENTILE.INC(ref1, ref2)\n case 17:\n return statistical.QUARTILE.INC(ref1, ref2)\n case 18:\n return statistical.PERCENTILE.EXC(ref1, ref2)\n case 19:\n return statistical.QUARTILE.EXC(ref1, ref2)\n }\n}\n\n/**\n * Converts a Roman number to Arabic, as a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text A string enclosed in quotation marks, an empty string (\"\"), or a reference to a value containing text.\n * @returns\n */\nexport function ARABIC(text) {\n if (text === undefined || text === null) {\n return 0\n }\n\n if (text instanceof Error) {\n return text\n }\n\n // Credits: Rafa? Kukawski\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\n return error.value\n }\n\n let r = 0\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, (i) => {\n r += {\n M: 1000,\n CM: 900,\n D: 500,\n CD: 400,\n C: 100,\n XC: 90,\n L: 50,\n XL: 40,\n X: 10,\n IX: 9,\n V: 5,\n IV: 4,\n I: 1\n }[i]\n })\n\n return r\n}\n\n/**\n * Returns the arcsine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The sine of the angle you want and must be from -1 to 1.\n * @returns\n */\nexport function ASIN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.asin(number)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function ASINH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.log(number + Math.sqrt(number * number + 1))\n}\n\n/**\n * Returns the arctangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The tangent of the angle you want.\n * @returns\n */\nexport function ATAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.atan(number)\n}\n\n/**\n * Returns the arctangent from x- and y-coordinates.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x_num The x-coordinate of the point.\n * @param {*} y_num The y-coordinate of the point.\n * @returns\n */\nexport function ATAN2(x_num, y_num) {\n x_num = utils.parseNumber(x_num)\n y_num = utils.parseNumber(y_num)\n const anyError = utils.anyError(x_num, y_num)\n\n if (anyError) {\n return anyError\n }\n\n return Math.atan2(x_num, y_num)\n}\n\n/**\n * Returns the inverse hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number between 1 and -1.\n * @returns\n */\nexport function ATANH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log((1 + number) / (1 - number)) / 2\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Converts a number into a text representation with the given radix (base).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to convert. Must be an integer greater than or equal to 0 and less than 2^53.\n * @param {*} radix The base radix that you want to convert the number into. Must be an integer greater than or equal to 2 and less than or equal to 36.\n * @param {*} min_length Optional. The minimum length of the returned string. Must be an integer greater than or equal to 0.\n * @returns\n */\nexport function BASE(number, radix, min_length) {\n number = utils.parseNumber(number)\n radix = utils.parseNumber(radix)\n min_length = utils.parseNumber(min_length)\n const anyError = utils.anyError(number, radix, min_length)\n\n if (anyError) {\n return anyError\n }\n\n if (radix === 0) {\n return error.num\n }\n\n const result = number.toString(radix)\n\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result\n}\n\n/**\n * Rounds a number to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nexport function CEILING(number, significance) {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n\n const anyError = utils.anyError(number, significance)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n if (number > 0 && significance < 0) {\n return error.num\n }\n\n return Math.ceil(number / significance) * significance\n}\n\n/**\n * Rounds a number up, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance Optional. This is the number of significant digits after the decimal point to which number is to be rounded.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nCEILING.MATH = (number, significance, mode = 0) => {\n if (significance === undefined) {\n significance = number > 0 ? 1 : -1\n }\n\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n mode = utils.parseNumber(mode)\n\n const anyError = utils.anyError(number, significance, mode)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance)\n\n if (mode === 0) {\n return Math.ceil(number / significance) * significance\n } else {\n return number > 0\n ? Math.ceil(number / significance) * significance\n : Math.floor(number / significance) * significance\n }\n}\n\n/**\n * Rounds a number up, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance Optional. This is the number of significant digits after the decimal point to which number is to be rounded.\n * @returns\n */\nCEILING.PRECISE = (number, significance) => {\n return CEILING.MATH(number, significance)\n}\n\n/**\n * Returns the number of combinations for a given number of objects.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number of items.\n * @param {*} number_chosen The number of items in each combination.\n * @returns\n */\nexport function COMBIN(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n const anyError = utils.anyError(number, number_chosen)\n\n if (anyError) {\n return anyError\n }\n\n if (number < number_chosen) {\n return error.num\n }\n\n return FACT(number) / (FACT(number_chosen) * FACT(number - number_chosen))\n}\n\n/**\n * Returns the number of combinations with repetitions for a given number of items.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Must be greater than or equal to 0, and greater than or equal to Number_chosen. Non-integer values are truncated.\n * @param {*} number_chosen Must be greater than or equal to 0. Non-integer values are truncated.\n * @returns\n */\nexport function COMBINA(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n const anyError = utils.anyError(number, number_chosen)\n\n if (anyError) {\n return anyError\n }\n\n if (number < number_chosen) {\n return error.num\n }\n\n return number === 0 && number_chosen === 0 ? 1 : COMBIN(number + number_chosen - 1, number - 1)\n}\n\n/**\n * Returns the cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cosine.\n * @returns\n */\nexport function COS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number for which you want to find the hyperbolic cosine.\n * @returns\n */\nexport function COSH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) + Math.exp(-number)) / 2\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cotangent.\n * @returns\n */\nexport function COT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 1 / Math.tan(number)\n}\n\n/**\n * Returns the cotangent of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function COTH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n const e2 = Math.exp(2 * number)\n\n return (e2 + 1) / (e2 - 1)\n}\n\n/**\n * Returns the cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function CSC(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 1 / Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function CSCH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 2 / (Math.exp(number) - Math.exp(-number))\n}\n\n/**\n * Converts a text representation of a number in a given base into a decimal number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text\n * @param {*} radix Radix must be an integer.\n * @returns\n */\nexport function DECIMAL(text, radix) {\n if (arguments.length < 2) {\n return error.na\n }\n\n text = text || '0'\n radix = utils.parseNumber(radix)\n const anyError = utils.anyError(text, radix)\n\n if (anyError) {\n return anyError\n }\n\n if (radix === 0) {\n return error.num\n }\n\n const result = parseInt(text, radix)\n\n if (isNaN(result)) {\n return error.num\n }\n\n return result\n}\n\n/**\n * Converts radians to degrees.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle The angle in radians that you want to convert.\n * @returns\n */\nexport function DEGREES(angle) {\n angle = utils.parseNumber(angle)\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * 180) / Math.PI\n}\n\n/**\n * Rounds a number up to the nearest even integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @returns\n */\nexport function EVEN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return CEILING.MATH(number, -2, -1)\n}\n\n/**\n * Returns e raised to the power of a given number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The exponent applied to the base e.\n * @returns\n */\nexport function EXP(number) {\n if (arguments.length < 1) {\n return error.na\n }\n\n if (arguments.length > 1) {\n return error.error\n }\n\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n number = Math.exp(number)\n\n return number\n}\n\nconst MEMOIZED_FACT = []\n/**\n * Returns the factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The nonnegative number for which you want the factorial. If number is not an integer, it is truncated.\n * @returns\n */\nexport function FACT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number)\n\n if (n === 0 || n === 1) {\n return 1\n } else if (MEMOIZED_FACT[n] > 0) {\n return MEMOIZED_FACT[n]\n } else {\n MEMOIZED_FACT[n] = FACT(n - 1) * n\n\n return MEMOIZED_FACT[n]\n }\n}\n\n/**\n * Returns the double factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value for which to return the double factorial. If number is not an integer, it is truncated.\n * @returns\n */\nexport function FACTDOUBLE(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number)\n\n return n <= 0 ? 1 : n * FACTDOUBLE(n - 2)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The numeric value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @returns\n */\nexport function FLOOR(number, significance) {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n\n const anyError = utils.anyError(number, significance)\n\n if (anyError) {\n return anyError\n }\n\n if (!significance) {\n return error.div0\n }\n\n if (number > 0 && significance < 0) {\n return error.num\n }\n\n return Math.floor(number / significance) * significance\n}\n\n// TODO: Verify\n\n/**\n * Rounds a number down, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number to be rounded down.\n * @param {*} significance Optional. The multiple to which you want to round.\n * @param {*} mode Optional. The direction (toward or away from 0) to round negative numbers.\n * @returns\n */\nFLOOR.MATH = (number, significance = 1, mode = 0) => {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n mode = utils.parseNumber(mode)\n\n const anyError = utils.anyError(number, significance, mode)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance)\n\n if (mode === 0) {\n return Math.floor(number / significance) * significance\n } else {\n return number > 0\n ? Math.floor(number / significance) * significance\n : Math.ceil(number / significance) * significance\n }\n}\n\n// Deprecated\n\n/**\n * Rounds a number the nearest integer or to the nearest multiple of significance. Regardless of the sign of the number, the number is rounded up.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to be rounded.\n * @param {*} significance Optional. The multiple to which number is to be rounded. If significance is omitted, its default value is 1.\n * @returns\n */\nFLOOR.PRECISE = (number, significance) => {\n return FLOOR.MATH(number, significance)\n}\n\n// adapted http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript\n/**\n * Returns the greatest common divisor.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values. If any value is not an integer, it is truncated.\n * @returns\n */\nexport function GCD() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n const r0 = range[0]\n let x = r0 < 0 ? -r0 : r0\n\n for (let i = 1; i < n; i++) {\n const ri = range[i]\n let y = ri < 0 ? -ri : ri\n\n while (x && y) {\n if (x > y) {\n x %= y\n } else {\n y %= x\n }\n }\n\n x += y\n }\n\n return x\n}\n\n/**\n * Rounds a number down to the nearest integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number you want to round down to an integer.\n * @returns\n */\nexport function INT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.floor(number)\n}\n\n// TODO: verify\nexport const ISO = {\n CEILING: CEILING\n}\n\n/**\n * Returns the least common multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2,... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the least common multiple. If value is not an integer, it is truncated.\n * @returns\n */\nexport function LCM() {\n // Credits: Jonas Raoni Soares Silva\n const o = utils.parseNumberArray(utils.flatten(arguments))\n\n if (o instanceof Error) {\n return o\n }\n\n for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined; ) {\n if (n === 0) {\n return 0\n }\n\n while (n > 1) {\n if (n % 2) {\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\n // empty\n }\n\n d = i <= j ? i : n\n } else {\n d = 2\n }\n\n for (n /= d, r *= d, i = o.length; i; o[--i] % d === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\n // empty\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the natural logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the natural logarithm.\n * @returns\n */\nexport function LN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n return Math.log(number)\n}\n\n/**\n * Returns the logarithm of a number to a specified base.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the logarithm.\n * @param {*} base Optional. The base of the logarithm. If base is omitted, it is assumed to be 10.\n * @returns\n */\nexport function LOG(number, base) {\n number = utils.parseNumber(number)\n base = base ? utils.parseNumber(base) : 10\n const anyError = utils.anyError(number, base)\n if (anyError) {\n return anyError\n }\n\n if (number === 0 || base === 0) {\n return error.num\n }\n\n return Math.log(number) / Math.log(base)\n}\n\n/**\n * Returns the base-10 logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the base-10 logarithm.\n * @returns\n */\nexport function LOG10(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n return Math.log(number) / Math.log(10)\n}\n\n/**\n * Returns the matrix product of two arrays. The result is an array with the same number of rows as array1 and the same number of columns as array2.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array1 Required. 1st array you want to multiply.\n * @param {*} array2 Required. 2nd array you want to multiply.\n * @returns\n */\nexport function MMULT(array1, array2) {\n if (\n //Arguments are not arrays\n !Array.isArray(array1) ||\n !Array.isArray(array2) ||\n // There are empty arrays\n array1.some((el) => !el.length) ||\n array2.some((el) => !el.length) ||\n // Not all array elements are numbers\n utils.flattenShallow(array1).some((el) => typeof el !== 'number') ||\n utils.flattenShallow(array2).some((el) => typeof el !== 'number') ||\n // Number of columns in array1 is different from the number of rows in array2\n array1[0].length !== array2.length\n ) {\n return error.value\n }\n\n const matrix = Array(array1.length)\n .fill(0)\n .map(() => Array(array2[0].length).fill(0))\n\n return matrix.map((row, i) => row.map((_, j) => array1[i].reduce((sum, el, k) => sum + el * array2[k][j], 0)))\n}\n\n/**\n * Returns the remainder from division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want to find the remainder.\n * @param {*} divisor The number by which you want to divide number.\n * @returns\n */\nexport function MOD(number, divisor) {\n number = utils.parseNumber(number)\n divisor = utils.parseNumber(divisor)\n const anyError = utils.anyError(number, divisor)\n\n if (anyError) {\n return anyError\n }\n\n if (divisor === 0) {\n return error.div0\n }\n\n let modulus = Math.abs(number % divisor)\n modulus = number < 0 ? divisor - modulus : modulus\n\n return divisor > 0 ? modulus : -modulus\n}\n\n/**\n * Returns a number rounded to the desired multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @param {*} multiple The multiple to which you want to round number.\n * @returns\n */\nexport function MROUND(number, multiple) {\n number = utils.parseNumber(number)\n multiple = utils.parseNumber(multiple)\n const anyError = utils.anyError(number, multiple)\n\n if (anyError) {\n return anyError\n }\n\n if (number * multiple === 0) {\n return 0\n }\n\n if (number * multiple < 0) {\n return error.num\n }\n\n return Math.round(number / multiple) * multiple\n}\n\n/**\n * Returns the multinomial of a set of numbers.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the multinomial.\n * @returns\n */\nexport function MULTINOMIAL() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n let sum = 0\n let divisor = 1\n\n for (let i = 0; i < args.length; i++) {\n sum += args[i]\n divisor *= FACT(args[i])\n }\n\n return FACT(sum) / divisor\n}\n\n/**\n * Returns the unit matrix for the specified dimension.\n *\n * Category: Math and trigonometry\n *\n * @param {*} dimension Required. Dimension is an integer specifying the dimension of the unit matrix that you want to return. It returns an array. The dimension has to be greater than zero.\n * @returns\n */\nexport function MUNIT(dimension) {\n if (arguments.length > 1) {\n return error.na\n }\n\n dimension = parseInt(dimension)\n\n if (!dimension || dimension <= 0) {\n return error.value\n }\n\n return Array(dimension)\n .fill(0)\n .map(() => Array(dimension).fill(0))\n .map((el, i) => {\n el[i] = 1\n return el\n })\n}\n\n/**\n * Rounds a number up to the nearest odd integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number: The value to round.\n * @returns\n */\nexport function ODD(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let temp = Math.ceil(Math.abs(number))\n temp = temp & 1 ? temp : temp + 1\n\n return number >= 0 ? temp : -temp\n}\n\n/**\n * Returns the value of pi.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function PI() {\n return Math.PI\n}\n\n/**\n * Returns the result of a number raised to a power.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The base number. It can be any real number.\n * @param {*} power The exponent to which the base number is raised.\n * @returns\n */\nexport function POWER(number, power) {\n number = utils.parseNumber(number)\n power = utils.parseNumber(power)\n const anyError = utils.anyError(number, power)\n\n if (anyError) {\n return anyError\n }\n\n if (number === 0 && power === 0) {\n return error.num\n }\n\n const result = Math.pow(number, power)\n\n if (isNaN(result)) {\n return error.num\n }\n\n return result\n}\n\n/**\n * Multiplies its arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number1 The first number or range that you want to multiply.\n * @param {*} args number2, ... Optional. Additional numbers or ranges that you want to multiply, up to a maximum of 255 arguments.\n * @returns\n */\nexport function PRODUCT() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter((arg) => arg !== undefined && arg !== null)\n\n if (flatArgumentsDefined.length === 0) {\n return 0\n }\n\n const args = utils.parseNumberArray(flatArgumentsDefined)\n\n if (args instanceof Error) {\n return args\n }\n\n let result = 1\n\n for (let i = 0; i < args.length; i++) {\n result *= args[i]\n }\n\n return result\n}\n\n/**\n * Returns the integer portion of a division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} numerator The dividend.\n * @param {*} denominator The divisor.\n * @returns\n */\nexport function QUOTIENT(numerator, denominator) {\n numerator = utils.parseNumber(numerator)\n denominator = utils.parseNumber(denominator)\n const anyError = utils.anyError(numerator, denominator)\n\n if (anyError) {\n return anyError\n }\n\n return parseInt(numerator / denominator, 10)\n}\n\n/**\n * Converts degrees to radians.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle An angle in degrees that you want to convert.\n * @returns\n */\nexport function RADIANS(angle) {\n angle = utils.parseNumber(angle)\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * Math.PI) / 180\n}\n\n/**\n * Returns a random number between 0 and 1.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function RAND() {\n return Math.random()\n}\n\n/**\n * Returns a random number between the numbers you specify.\n *\n * Category: Math and trigonometry\n *\n * @param {*} bottom The smallest integer RANDBETWEEN will return.\n * @param {*} top The largest integer RANDBETWEEN will return.\n * @returns\n */\nexport function RANDBETWEEN(bottom, top) {\n bottom = utils.parseNumber(bottom)\n top = utils.parseNumber(top)\n const anyError = utils.anyError(bottom, top)\n\n if (anyError) {\n return anyError\n }\n // Creative Commons Attribution 3.0 License\n // Copyright (c) 2012 eqcode\n\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1\n}\n\n// TODO\n/**\n * Converts an arabic numeral to roman, as text.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The Arabic numeral you want converted.\n * @returns\n */\nexport function ROMAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // The MIT License\n // Copyright (c) 2008 Steven Levithan\n const digits = String(number).split('')\n const key = [\n '',\n 'C',\n 'CC',\n 'CCC',\n 'CD',\n 'D',\n 'DC',\n 'DCC',\n 'DCCC',\n 'CM',\n '',\n 'X',\n 'XX',\n 'XXX',\n 'XL',\n 'L',\n 'LX',\n 'LXX',\n 'LXXX',\n 'XC',\n '',\n 'I',\n 'II',\n 'III',\n 'IV',\n 'V',\n 'VI',\n 'VII',\n 'VIII',\n 'IX'\n ]\n let roman = ''\n let i = 3\n\n while (i--) {\n roman = (key[+digits.pop() + i * 10] || '') + roman\n }\n\n return new Array(+digits.join('') + 1).join('M') + roman\n}\n\n/**\n * Rounds a number to a specified number of digits.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to round.\n * @param {*} num_digits The number of digits to which you want to round the number argument.\n * @returns\n */\nexport function ROUND(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n return Number(Math.round(Number(number + 'e' + num_digits)) + 'e' + num_digits * -1)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded down.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nexport function ROUNDDOWN(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Rounds a number up, away from zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded up.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nexport function ROUNDUP(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.ceil(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Returns the secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the secant.\n * @returns\n */\nexport function SEC(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return 1 / Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the hyperbolic secant.\n * @returns\n */\nexport function SECH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return 2 / (Math.exp(number) + Math.exp(-number))\n}\n\n/**\n * Returns the sum of a power series based on the formula.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x The input value to the power series.\n * @param {*} n The initial power to which you want to raise x.\n * @param {*} m The step by which to increase n for each term in the series.\n * @param {*} coefficients A set of coefficients by which each successive power of x is multiplied. The number of values in coefficients determines the number of terms in the power series. For example, if there are three values in coefficients, then there will be three terms in the power series.\n * @returns\n */\nexport function SERIESSUM(x, n, m, coefficients) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n m = utils.parseNumber(m)\n coefficients = utils.parseNumberArray(coefficients)\n\n if (utils.anyIsError(x, n, m, coefficients)) {\n return error.value\n }\n\n let result = coefficients[0] * Math.pow(x, n)\n\n for (let i = 1; i < coefficients.length; i++) {\n result += coefficients[i] * Math.pow(x, n + i * m)\n }\n\n return result\n}\n\n/**\n * Returns the sign of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function SIGN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return -1\n } else if (number === 0) {\n return 0\n } else {\n return 1\n }\n}\n\n/**\n * Returns the sine of the given angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the sine.\n * @returns\n */\nexport function SIN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function SINH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) - Math.exp(-number)) / 2\n}\n\n/**\n * Returns a positive square root.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want the square root.\n * @returns\n */\nexport function SQRT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return error.num\n }\n\n return Math.sqrt(number)\n}\n\n/**\n * Returns the square root of (number * pi).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number by which pi is multiplied.\n * @returns\n */\nexport function SQRTPI(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sqrt(number * Math.PI)\n}\n\n/**\n * Returns a subtotal in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num The number 1-11 or 101-111 that specifies the function to use for the subtotal. 1-11 includes manually-hidden rows, while 101-111 excludes them; filtered-out values are always excluded.\n * @param {*} ref1 The first named range or reference for which you want the subtotal.\n * @returns\n */\nexport function SUBTOTAL(function_num, ref1) {\n function_num = utils.parseNumber(function_num)\n\n if (function_num instanceof Error) {\n return function_num\n }\n\n switch (function_num) {\n case 1:\n return statistical.AVERAGE(ref1)\n case 2:\n return statistical.COUNT(ref1)\n case 3:\n return statistical.COUNTA(ref1)\n case 4:\n return statistical.MAX(ref1)\n case 5:\n return statistical.MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return statistical.STDEV.S(ref1)\n case 8:\n return statistical.STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return statistical.VAR.S(ref1)\n case 11:\n return statistical.VAR.P(ref1)\n // no hidden values for us\n case 101:\n return statistical.AVERAGE(ref1)\n case 102:\n return statistical.COUNT(ref1)\n case 103:\n return statistical.COUNTA(ref1)\n case 104:\n return statistical.MAX(ref1)\n case 105:\n return statistical.MIN(ref1)\n case 106:\n return PRODUCT(ref1)\n case 107:\n return statistical.STDEV.S(ref1)\n case 108:\n return statistical.STDEV.P(ref1)\n case 109:\n return SUM(ref1)\n case 110:\n return statistical.VAR.S(ref1)\n case 111:\n return statistical.VAR.P(ref1)\n }\n}\n\n/**\n * Adds its arguments.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUM() {\n let result = 0\n\n utils.arrayEach(utils.argsToArray(arguments), (value) => {\n if (result instanceof Error) {\n return false\n } else if (value instanceof Error) {\n result = value\n } else if (typeof value === 'number') {\n result += value\n } else if (typeof value === 'string') {\n const parsed = parseFloat(value)\n\n !isNaN(parsed) && (result += parsed)\n } else if (Array.isArray(value)) {\n const inner_result = SUM.apply(null, value)\n\n if (inner_result instanceof Error) {\n result = inner_result\n } else {\n result += inner_result\n }\n }\n })\n\n return result\n}\n\n/**\n * Adds the values specified by a given criteria.\n *\n * Category: Math and trigonometry\n *\n * @param {*} range The range of values that you want evaluated by criteria. Cells in each range must be numbers or names, arrays, or references that contain numbers. Blank and text values are ignored.\n * @param {*} criteria The criteria in the form of a number, expression, a value reference, text, or a function that defines which values will be added.\n * @param {*} sum_range Optional. The actual values to add, if you want to add values other than those specified in the range argument. If the sum_range argument is omitted, Excel adds the values that are specified in the range argument (the same values to which the criteria is applied). Sum_range should be the same size and shape as range. If it isn't, performance may suffer, and the formula will sum a range of values that starts with the first value in sum_range but has the same dimensions as range.\n * @returns\n */\nexport function SUMIF(range, criteria, sum_range) {\n range = utils.flatten(range)\n\n sum_range = sum_range ? utils.flatten(sum_range) : range\n\n if (range instanceof Error) {\n return range\n }\n\n if (criteria === undefined || criteria === null || criteria instanceof Error) {\n return 0\n }\n\n let result = 0\n const isWildcard = criteria === '*'\n const tokenizedCriteria = isWildcard ? null : evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n const sumValue = sum_range[i]\n\n if (isWildcard) {\n result += value\n } else {\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n result += evalExpression.compute(tokens) ? sumValue : 0\n }\n }\n\n return result\n}\n\n/**\n * Adds the values in a range that meet multiple criteria.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUMIFS() {\n const values = utils.applyCriteria(...arguments)\n return SUM(values)\n}\n\n/**\n * Returns the sum of the products of corresponding array components.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUMPRODUCT() {\n if (!arguments || arguments.length === 0) {\n return error.value\n }\n\n const arrays = arguments.length + 1\n let result = 0\n let product\n let k\n let _i\n let _ij\n\n for (let i = 0; i < arguments[0].length; i++) {\n if (!(arguments[0][i] instanceof Array)) {\n product = 1\n\n for (k = 1; k < arrays; k++) {\n const _i_arg = arguments[k - 1][i]\n\n if (_i_arg instanceof Error) {\n return _i_arg\n }\n\n _i = utils.parseNumber(_i_arg)\n\n if (_i instanceof Error) {\n return _i\n }\n\n product *= _i\n }\n\n result += product\n } else {\n for (let j = 0; j < arguments[0][i].length; j++) {\n product = 1\n\n for (k = 1; k < arrays; k++) {\n const _ij_arg = arguments[k - 1][i][j]\n\n if (_ij_arg instanceof Error) {\n return _ij_arg\n }\n\n _ij = utils.parseNumber(_ij_arg)\n\n if (_ij instanceof Error) {\n return _ij\n }\n\n product *= _ij\n }\n\n result += product\n }\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the squares of the arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the sum of the squares. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function SUMSQ() {\n const numbers = utils.parseNumberArray(utils.flatten(arguments))\n\n if (numbers instanceof Error) {\n return numbers\n }\n\n let result = 0\n const length = numbers.length\n\n for (let i = 0; i < length; i++) {\n result += information.ISNUMBER(numbers[i]) ? numbers[i] * numbers[i] : 0\n }\n\n return result\n}\n\n/**\n * Returns the sum of the difference of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMX2MY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i]\n }\n\n return result\n}\n\n/**\n * Returns the sum of the sum of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMX2PY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i]\n }\n\n return result\n}\n\n/**\n * Returns the sum of squares of differences of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMXMY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n array_x = utils.flatten(array_x)\n array_y = utils.flatten(array_y)\n\n for (let i = 0; i < array_x.length; i++) {\n result += Math.pow(array_x[i] - array_y[i], 2)\n }\n\n return result\n}\n\n/**\n * Returns the tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the tangent.\n * @returns\n */\nexport function TAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.tan(number)\n}\n\n/**\n * Returns the hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function TANH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const e2 = Math.exp(2 * number)\n\n return (e2 - 1) / (e2 + 1)\n}\n\n/**\n * Truncates a number to an integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number you want to truncate.\n * @param {*} num_digits Optional. A number specifying the precision of the truncation. The default value for num_digits is 0 (zero).\n * @returns\n */\nexport function TRUNC(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}","import * as error from './error.js'\nimport * as utils from './common.js'\n\nimport { POWER } from './../math-trig.js'\n\n/**\n * Following functions are part of Formula.js only and not found in Excel.\n * Purpose of these functions is to implement an Excel like behaviour for fundamental math symbols such as +, -, /, *, etc.\n */\n\n/**\n * Formula.js only.\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function ADD(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 + num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} dividend\n * @param {*} divisor\n * @returns\n */\nexport function DIVIDE(dividend, divisor) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n dividend = utils.parseNumber(dividend)\n divisor = utils.parseNumber(divisor)\n const anyError = utils.anyError(dividend, divisor)\n\n if (anyError) {\n return anyError\n }\n\n if (divisor === 0) {\n return error.div0\n }\n\n return dividend / divisor\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nexport function EQ(value1, value2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined\n }\n\n if (value2 === null) {\n value2 = undefined\n }\n\n return value1 === value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function GT(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (num1 instanceof Error) {\n return num1\n }\n\n if (num2 instanceof Error) {\n return num2\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 > num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function GTE(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 >= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function LT(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 < num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function LTE(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 <= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function MINUS(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 - num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} factor1\n * @param {*} factor2\n * @returns\n */\nexport function MULTIPLY(factor1, factor2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n factor1 = utils.parseNumber(factor1)\n factor2 = utils.parseNumber(factor2)\n const anyError = utils.anyError(factor1, factor2)\n\n if (anyError) {\n return anyError\n }\n\n return factor1 * factor2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nexport function NE(value1, value2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined\n }\n\n if (value2 === null) {\n value2 = undefined\n }\n\n return value1 !== value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} base\n * @param {*} exponent\n * @returns\n */\nexport function POW(base, exponent) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n return POWER(base, exponent)\n}\n","import * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\nimport { dateToSerial, formatDate, returnSerial } from './utils/date.js'\n\nconst WEEK_STARTS = [\n undefined,\n 0,\n 1,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 0\n]\nconst WEEK_TYPES = [\n [],\n [1, 2, 3, 4, 5, 6, 7],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 0, 1, 2, 3, 4, 5],\n [],\n [],\n [],\n [],\n [],\n [],\n [],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 7, 1, 2, 3, 4, 5],\n [5, 6, 7, 1, 2, 3, 4],\n [4, 5, 6, 7, 1, 2, 3],\n [3, 4, 5, 6, 7, 1, 2],\n [2, 3, 4, 5, 6, 7, 1],\n [1, 2, 3, 4, 5, 6, 7]\n]\nconst WEEKEND_TYPES = [\n [],\n [6, 0],\n [0, 1],\n [1, 2],\n [2, 3],\n [3, 4],\n [4, 5],\n [5, 6],\n undefined,\n undefined,\n undefined,\n [0, 0],\n [1, 1],\n [2, 2],\n [3, 3],\n [4, 4],\n [5, 5],\n [6, 6]\n]\n\n/**\n * Returns the serial number of a particular date.\n *\n * Category: Date and time\n *\n * @param {*} year Year\n * @param {*} month Month\n * @param {*} day Day\n * @returns\n */\nexport function DATE(year, month, day) {\n let result\n\n year = utils.parseNumber(year)\n month = utils.parseNumber(month)\n day = utils.parseNumber(day)\n\n if (utils.anyIsError(year, month, day)) {\n result = error.value\n } else {\n result = new Date(year, month - 1, day)\n\n if (result.getFullYear() < 0) {\n result = error.num\n }\n }\n\n return returnSerial ? dateToSerial(result) : result\n}\n\n/**\n * Calculates the number of days, months, or years between two dates. This function is useful in formulas where you need to calculate an age.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the first, or starting date of a given period.\n * @param {*} end_date A date that represents the last, or ending, date of the period.\n * @param {*} unit The type of information that you want returned, where:\n - \"Y\": The number of complete years in the period.\n - \"M\": The number of complete months in the period.\n - \"D\": The number of days in the period.\n - \"MD\": The difference between the days in start_date and end_date. The months and years of the dates are ignored.\n - \"YM\": The difference between the months in start_date and end_date. The days and years of the dates are ignored\n - \"YD\": The difference between the days of start_date and end_date. The years of the dates are ignored.\n * @returns\n */\nexport function DATEDIF(start_date, end_date, unit) {\n unit = unit.toUpperCase()\n start_date = utils.parseDate(start_date)\n end_date = utils.parseDate(end_date)\n\n const start_date_year = start_date.getFullYear()\n const start_date_month = start_date.getMonth()\n const start_date_day = start_date.getDate()\n const end_date_year = end_date.getFullYear()\n const end_date_month = end_date.getMonth()\n const end_date_day = end_date.getDate()\n\n let result\n\n switch (unit) {\n case 'Y':\n result = Math.floor(YEARFRAC(start_date, end_date))\n break\n case 'D':\n result = DAYS(end_date, start_date)\n break\n case 'M':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year)\n\n if (end_date_day < start_date_day) {\n result--\n }\n\n break\n case 'MD':\n if (start_date_day <= end_date_day) {\n result = end_date_day - start_date_day\n } else {\n if (end_date_month === 0) {\n start_date.setFullYear(end_date_year - 1)\n start_date.setMonth(12)\n } else {\n start_date.setFullYear(end_date_year)\n start_date.setMonth(end_date_month - 1)\n }\n\n result = DAYS(end_date, start_date)\n }\n\n break\n case 'YM':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year)\n\n if (end_date_day < start_date_day) {\n result--\n }\n\n result = result % 12\n break\n case 'YD':\n if (end_date_month > start_date_month || (end_date_month === start_date_month && end_date_day < start_date_day)) {\n start_date.setFullYear(end_date_year)\n } else {\n start_date.setFullYear(end_date_year - 1)\n }\n\n result = DAYS(end_date, start_date)\n break\n }\n\n return result\n}\n\n/**\n * Converts a date in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} date_text Text that represents a date in an Excel date format, or a reference to a value that contains text that represents a date in an Excel date format.\n * @returns\n */\nexport function DATEVALUE(date_text) {\n if (typeof date_text !== 'string') {\n return error.value\n }\n\n const date = Date.parse(date_text)\n\n if (isNaN(date)) {\n return error.value\n }\n\n const dateValue = new Date(date_text)\n\n return returnSerial ? dateToSerial(dateValue) : dateValue\n}\n\n/**\n * Converts a serial number to a day of the month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the day you are trying to find.\n * @returns\n */\nexport function DAY(serial_number) {\n const date = utils.parseDate(serial_number)\n\n if (date instanceof Error) {\n return date\n }\n\n return date.getDate()\n}\n\nfunction startOfDay(date) {\n const newDate = new Date(date)\n newDate.setHours(0, 0, 0, 0)\n\n return newDate\n}\n\n/**\n * Returns the number of days between two dates.\n *\n * Category: Date and time\n *\n * @param {*} end_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @param {*} start_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @returns\n */\nexport function DAYS(end_date, start_date) {\n end_date = utils.parseDate(end_date)\n start_date = utils.parseDate(start_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n const diffMs = startOfDay(end_date).getTime() - startOfDay(start_date).getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Calculates the number of days between two dates based on a 360-day year.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date. If start_date occurs after end_date, the DAYS360 function returns a negative number.\n * @param {*} end_date A date that represents the end date.\n * @param {*} method Optional. A logical value that specifies whether to use the U.S. or European method in the calculation.\n * @returns\n */\nexport function DAYS360(start_date, end_date, method) {\n method = utils.parseBool(method || 'false')\n start_date = utils.parseDate(start_date)\n end_date = utils.parseDate(end_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (method instanceof Error) {\n return method\n }\n\n const sm = start_date.getMonth()\n let em = end_date.getMonth()\n let sd, ed\n\n if (method) {\n sd = start_date.getDate() === 31 ? 30 : start_date.getDate()\n ed = end_date.getDate() === 31 ? 30 : end_date.getDate()\n } else {\n const smd = new Date(start_date.getFullYear(), sm + 1, 0).getDate()\n const emd = new Date(end_date.getFullYear(), em + 1, 0).getDate()\n sd = start_date.getDate() === smd ? 30 : start_date.getDate()\n\n if (end_date.getDate() === emd) {\n if (sd < 30) {\n em++\n ed = 1\n } else {\n ed = 30\n }\n } else {\n ed = end_date.getDate()\n }\n }\n\n return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)\n}\n\n/**\n * Returns the serial number of the date that is the indicated number of months before or after the start date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nexport function EDATE(start_date, months) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return error.value\n }\n\n // store the day and temporarily set to 1, which is safe\n let storedDay = start_date.getDate()\n start_date.setDate(1)\n\n months = parseInt(months, 10)\n start_date.setMonth(start_date.getMonth() + months)\n\n let targetMonth = start_date.getMonth()\n\n // if storedDay > 28 then we need to check end-of-month scenarios\n if (storedDay > 28) {\n let daysInTargetMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][targetMonth]\n\n // if target month is February, check for a leap year\n let targetYear = start_date.getFullYear()\n if (targetMonth === 1 && ((targetYear % 4 === 0 && targetYear % 100 !== 0) || targetYear % 400 === 0)) {\n daysInTargetMonth = 29\n }\n storedDay = Math.min(storedDay, daysInTargetMonth)\n }\n\n start_date.setDate(storedDay)\n\n return returnSerial ? dateToSerial(start_date) : start_date\n}\n\n/**\n * Returns the serial number of the last day of the month before or after a specified number of months.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the starting date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nexport function EOMONTH(start_date, months) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return error.value\n }\n\n months = parseInt(months, 10)\n\n const eoMonth = new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0)\n\n return returnSerial ? dateToSerial(eoMonth) : eoMonth\n}\n\n/**\n * Converts a serial number to an hour.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the hour you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function HOUR(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getHours()\n}\n\n/**\n * Returns the number of the ISO week number of the year for a given date.\n *\n * Category: Date and time\n *\n * @param {*} date Date is the date-time code used by Excel for date and time calculation.\n * @returns\n */\nexport function ISOWEEKNUM(date) {\n date = utils.parseDate(date)\n\n if (date instanceof Error) {\n return date\n }\n\n date = startOfDay(date)\n date.setDate(date.getDate() + 4 - (date.getDay() || 7))\n const yearStart = new Date(date.getFullYear(), 0, 1)\n\n return Math.ceil(((date - yearStart) / 86400000 + 1) / 7)\n}\n\n/**\n * Converts a serial number to a minute.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the minute you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function MINUTE(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMinutes()\n}\n\n/**\n * Converts a serial number to a month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the month you are trying to find.\n * @returns\n */\nexport function MONTH(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMonth() + 1\n}\n\n/**\n * Returns the number of whole workdays between two dates.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} holidays Optional. An optional range of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contains the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nexport function NETWORKDAYS(start_date, end_date, holidays) {\n return NETWORKDAYS.INTL(start_date, end_date, 1, holidays)\n}\n\n/**\n * Returns the number of whole workdays between two dates using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The date for from which the difference is to be computed. The start_date can be earlier than, the same as, or later than the end_date.\n * @param {*} end_date The date for to which the difference is to be computed.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not included in the number of whole working days between start_date and end_date. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nNETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = utils.parseDate(end_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n let isMask = false\n const maskDays = []\n const maskIndex = [1, 2, 3, 4, 5, 6, 0]\n const maskRegex = new RegExp('^[0|1]{7}$')\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1]\n } else if (typeof weekend === 'string' && maskRegex.test(weekend)) {\n isMask = true\n weekend = weekend.split('')\n\n for (let i = 0; i < weekend.length; i++) {\n if (weekend[i] === '1') {\n maskDays.push(maskIndex[i])\n }\n }\n } else {\n weekend = WEEKEND_TYPES[weekend]\n }\n\n if (!(weekend instanceof Array)) {\n return error.value\n }\n\n if (holidays === undefined) {\n holidays = []\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays]\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = utils.parseDate(holidays[i])\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h\n }\n\n const days = Math.round((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1\n let total = days\n const day = start_date\n\n for (let i = 0; i < days; i++) {\n const d = new Date().getTimezoneOffset() > 0 ? day.getUTCDay() : day.getDay()\n let dec = isMask ? maskDays.includes(d) : d === weekend[0] || d === weekend[1]\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j]\n\n if (\n holiday.getDate() === day.getDate() &&\n holiday.getMonth() === day.getMonth() &&\n holiday.getFullYear() === day.getFullYear()\n ) {\n dec = true\n break\n }\n }\n\n if (dec) {\n total--\n }\n\n day.setDate(day.getDate() + 1)\n }\n\n return total\n}\n\nexport const NETWORKDAYS_INTL = NETWORKDAYS.INTL\n\n/**\n * Returns the serial number of the current date and time.\n *\n * Category: Date and time\n *\n * @returns\n */\nexport function NOW() {\n return returnSerial ? dateToSerial(new Date()) : new Date()\n}\n\n/**\n * Converts a serial number to a second.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the seconds you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function SECOND(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getSeconds()\n}\n\n/**\n * Returns the serial number of a particular time.\n *\n * Category: Date and time\n *\n * @param {*} hour A number from 0 (zero) to 32767 representing the hour. Any value greater than 23 will be divided by 24 and the remainder will be treated as the hour value. For example, TIME(27,0,0) = TIME(3,0,0) = .125 or 3:00 AM.\n * @param {*} minute A number from 0 to 32767 representing the minute. Any value greater than 59 will be converted to hours and minutes. For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.\n * @param {*} second A number from 0 to 32767 representing the second. Any value greater than 59 will be converted to hours, minutes, and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 or 12:33:20 AM\n * @returns\n */\nexport function TIME(hour, minute, second) {\n hour = utils.parseNumber(hour)\n minute = utils.parseNumber(minute)\n second = utils.parseNumber(second)\n\n if (utils.anyIsError(hour, minute, second)) {\n return error.value\n }\n\n if (hour < 0 || minute < 0 || second < 0) {\n return error.num\n }\n\n const hh = String(hour).padStart(2, '0')\n const mm = String(minute).padStart(2, '0')\n const ss = String(second).padStart(2, '0')\n\n return `${hh}:${mm}:${ss}`\n}\n\n\n/**\n * Converts a time in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} time_text A text string that represents a time in any one of the Microsoft Excel time formats; for example, \"6:45 PM\" and \"18:45\" text strings within quotation marks that represent time.\n * @returns\n */\nexport function TIMEVALUE(time_text) {\n time_text = utils.parseDate(time_text)\n\n if (time_text instanceof Error) {\n return time_text\n }\n\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400\n}\n\n/**\n * Returns the serial number of today's date.\n *\n * Category: Date and time\n *\n * @returns\n */\nexport function TODAY() {\n const today = startOfDay(new Date())\n return formatDate(today)\n}\n\n/**\n * Converts a serial number to a day of the week.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A sequential number that represents the date of the day you are trying to find.\n * @param {*} return_type Optional. A number that determines the type of return value.\n * @returns\n */\nexport function WEEKDAY(serial_number, return_type) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1\n }\n\n const day = serial_number.getDay()\n\n return WEEK_TYPES[return_type][day]\n}\n\n/**\n * Converts a serial number to a number representing where the week falls numerically with a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A date within the week.\n * @param {*} return_type Optional. A number that determines on which day the week begins. The default is 1.\n * @returns\n */\nexport function WEEKNUM(serial_number, return_type) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1\n }\n\n if (return_type === 21) {\n return ISOWEEKNUM(serial_number)\n }\n\n const week_start = WEEK_STARTS[return_type]\n let jan = new Date(serial_number.getFullYear(), 0, 1)\n const inc = jan.getDay() < week_start ? 1 : 0\n jan -= Math.abs(jan.getDay() - week_start) * 24 * 60 * 60 * 1000\n\n return Math.floor((serial_number - jan) / (1000 * 60 * 60 * 24) / 7 + 1) + inc\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} days The number of nonweekend and nonholiday days before or after start_date. A positive value for days yields a future date; a negative value yields a past date.\n * @param {*} holidays Optional. An optional list of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contain the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nexport function WORKDAY(start_date, days, holidays) {\n return WORKDAY.INTL(start_date, days, 1, holidays)\n}\n\nexport function ISDATE(value) {\n const parsed = utils.parseDate(value)\n return !(parsed instanceof Error)\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The start date, truncated to integer.\n * @param {*} days The number of workdays before or after the start_date. A positive value yields a future date; a negative value yields a past date; a zero value yields the start_date. Day-offset is truncated to an integer.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not considered working days. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. Holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nWORKDAY.INTL = (start_date, days, weekend, holidays) => {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n days = utils.parseNumber(days)\n\n if (days instanceof Error) {\n return days\n }\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1]\n } else {\n weekend = WEEKEND_TYPES[weekend]\n }\n\n if (!(weekend instanceof Array)) {\n return error.value\n }\n\n if (holidays === undefined) {\n holidays = []\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays]\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = utils.parseDate(holidays[i])\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h\n }\n\n let d = 0\n\n const sign = Math.sign(days)\n\n while (d < days * sign) {\n start_date.setDate(start_date.getDate() + sign)\n\n const day = start_date.getDay()\n\n if (day === weekend[0] || day === weekend[1]) {\n continue\n }\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j]\n\n if (\n holiday.getDate() === start_date.getDate() &&\n holiday.getMonth() === start_date.getMonth() &&\n holiday.getFullYear() === start_date.getFullYear()\n ) {\n d--\n break\n }\n }\n\n d++\n }\n\n // EXCEL does not recognize dates before 1900.\n if (start_date.getFullYear() < 1900) {\n return error.value\n }\n\n return formatDate(start_date)\n}\n\nexport const WORKDAY_INTL = WORKDAY.INTL\n\n/**\n * Converts a serial number to a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the year you want to find.\n * @returns\n */\nexport function YEAR(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getFullYear()\n}\n\nfunction isLeapYear(year) {\n return new Date(year, 1, 29).getMonth() === 1\n}\n\n// TODO : Use DAYS ?\nfunction daysBetween(start_date, end_date) {\n return Math.ceil((end_date - start_date) / 1000 / 60 / 60 / 24)\n}\n\n/**\n * Returns the year fraction representing the number of whole days between start_date and end_date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function YEARFRAC(start_date, end_date, basis) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = utils.parseDate(end_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n basis = basis || 0\n let sd = start_date.getDate()\n const sm = start_date.getMonth() + 1\n const sy = start_date.getFullYear()\n let ed = end_date.getDate()\n const em = end_date.getMonth() + 1\n const ey = end_date.getFullYear()\n\n switch (basis) {\n case 0:\n // US (NASD) 30/360\n if (sd === 31 && ed === 31) {\n sd = 30\n ed = 30\n } else if (sd === 31) {\n sd = 30\n } else if (sd === 30 && ed === 31) {\n ed = 30\n }\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n case 1: {\n // Actual/actual\n const feb29Between = (date1, date2) => {\n const year1 = date1.getFullYear()\n const mar1year1 = new Date(year1, 2, 1)\n\n if (isLeapYear(year1) && date1 < mar1year1 && date2 >= mar1year1) {\n return true\n }\n\n const year2 = date2.getFullYear()\n const mar1year2 = new Date(year2, 2, 1)\n\n return isLeapYear(year2) && date2 >= mar1year2 && date1 < mar1year2\n }\n\n let ylength = 365\n\n if (sy === ey || (sy + 1 === ey && (sm > em || (sm === em && sd >= ed)))) {\n if ((sy === ey && isLeapYear(sy)) || feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\n ylength = 366\n }\n\n return daysBetween(start_date, end_date) / ylength\n }\n\n const years = ey - sy + 1\n const days = (new Date(ey + 1, 0, 1) - new Date(sy, 0, 1)) / 1000 / 60 / 60 / 24\n const average = days / years\n\n return daysBetween(start_date, end_date) / average\n }\n\n case 2:\n // Actual/360\n\n return daysBetween(start_date, end_date) / 360\n case 3:\n // Actual/365\n\n return daysBetween(start_date, end_date) / 365\n case 4:\n // European 30/360\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n }\n}\n","/* bessel.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported BESSEL */\nvar BESSEL;\n(function (factory) {\n /*jshint ignore:start */\n if(typeof DO_NOT_EXPORT_BESSEL === 'undefined') {\n if('object' === typeof exports) {\n factory(exports);\n } else if ('function' === typeof define && define.amd) {\n define(function () {\n var module = {};\n factory(module);\n return module;\n });\n } else {\n factory(BESSEL = {});\n }\n } else {\n factory(BESSEL = {});\n }\n /*jshint ignore:end */\n}(function(BESSEL) {\nBESSEL.version = '1.0.2';\nvar M = Math;\n\nfunction _horner(arr, v) { for(var i = 0, z = 0; i < arr.length; ++i) z = v * z + arr[i]; return z; }\nfunction _bessel_iter(x, n, f0, f1, sign) {\n if(n === 0) return f0;\n if(n === 1) return f1;\n var tdx = 2 / x, f2 = f1;\n for(var o = 1; o < n; ++o) {\n f2 = f1 * o * tdx + sign * f0;\n f0 = f1; f1 = f2;\n }\n return f2;\n}\nfunction _bessel_wrap(bessel0, bessel1, name, nonzero, sign) {\n return function bessel(x,n) {\n if(nonzero) {\n if(x === 0) return (nonzero == 1 ? -Infinity : Infinity);\n else if(x < 0) return NaN;\n }\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n n|=0;\n var b0 = bessel0(x), b1 = bessel1(x);\n return _bessel_iter(x, n, b0, b1, sign);\n };\n}\nvar besselj = (function() {\n var W = 0.636619772; // 2 / Math.PI\n\n var b0_a1a = [57568490574.0, -13362590354.0, 651619640.7, -11214424.18, 77392.33017, -184.9052456].reverse();\n var b0_a2a = [57568490411.0, 1029532985.0, 9494680.718, 59272.64853, 267.8532712, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934935152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1 / a2;\n } else {\n var xx = x - 0.785398164;\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.cos(xx)*a1-M.sin(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [72362614232.0, -7895059235.0, 242396853.1, -2972611.439, 15704.48260, -30.16036606].reverse();\n var b1_a2a = [144725228442.0, 2300535178.0, 18583304.74, 99447.43394, 376.9991397, 1.0].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = M.abs(x) - 2.356194491;\n if(Math.abs(x)< 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1 / a2;\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/M.abs(x))*(M.cos(xx)*a1-M.sin(xx)*a2*8/M.abs(x));\n if(x < 0) a = -a;\n }\n return a;\n }\n\n return function besselj(x, n) {\n n = Math.round(n);\n if(!isFinite(x)) return isNaN(x) ? x : 0;\n if(n < 0) return ((n%2)?-1:1)*besselj(x, -n);\n if(x < 0) return ((n%2)?-1:1)*besselj(-x, n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(x === 0) return 0;\n\n var ret=0.0;\n if(x > n) {\n ret = _bessel_iter(x, n, bessel0(x), bessel1(x),-1);\n } else {\n var m=2*M.floor((n+M.floor(M.sqrt(40*n)))/2);\n var jsum=false;\n var bjp=0.0, sum=0.0;\n var bj=1.0, bjm = 0.0;\n var tox = 2 / x;\n for (var j=m;j>0;j--) {\n bjm=j*tox*bj-bjp;\n bjp=bj;\n bj=bjm;\n if (M.abs(bj) > 1E10) {\n bj *= 1E-10;\n bjp *= 1E-10;\n ret *= 1E-10;\n sum *= 1E-10;\n }\n if (jsum) sum += bj;\n jsum=!jsum;\n if (j == n) ret=bjp;\n }\n sum=2.0*sum-bj;\n ret /= sum;\n }\n return ret;\n };\n})();\nvar bessely = (function() {\n var W = 0.636619772;\n\n var b0_a1a = [-2957821389.0, 7062834065.0, -512359803.6, 10879881.29, -86327.92757, 228.4622733].reverse();\n var b0_a2a = [40076544269.0, 745249964.8, 7189466.438, 47447.26470, 226.1030244, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934945152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x, xx = x - 0.785398164;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1/a2 + W * besselj(x,0) * M.log(x);\n } else {\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [-0.4900604943e13, 0.1275274390e13, -0.5153438139e11, 0.7349264551e9, -0.4237922726e7, 0.8511937935e4].reverse();\n var b1_a2a = [0.2499580570e14, 0.4244419664e12, 0.3733650367e10, 0.2245904002e8, 0.1020426050e6, 0.3549632885e3, 1].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = x - 2.356194491;\n if(x < 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1/a2 + W * (besselj(x,1) * M.log(x) - 1 / x);\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELY', 1, -1);\n})();\nvar besseli = (function() {\n var b0_a = [1.0, 3.5156229, 3.0899424, 1.2067492, 0.2659732, 0.360768e-1, 0.45813e-2].reverse();\n var b0_b = [0.39894228, 0.1328592e-1, 0.225319e-2, -0.157565e-2, 0.916281e-2, -0.2057706e-1, 0.2635537e-1, -0.1647633e-1, 0.392377e-2].reverse();\n\n function bessel0(x) {\n if(x <= 3.75) return _horner(b0_a, x*x/(3.75*3.75));\n return M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b0_b, 3.75/M.abs(x));\n }\n\n var b1_a = [0.5, 0.87890594, 0.51498869, 0.15084934, 0.2658733e-1, 0.301532e-2, 0.32411e-3].reverse();\n var b1_b = [0.39894228, -0.3988024e-1, -0.362018e-2, 0.163801e-2, -0.1031555e-1, 0.2282967e-1, -0.2895312e-1, 0.1787654e-1, -0.420059e-2].reverse();\n\n function bessel1(x) {\n if(x < 3.75) return x * _horner(b1_a, x*x/(3.75*3.75));\n return (x < 0 ? -1 : 1) * M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b1_b, 3.75/M.abs(x));\n }\n\n return function besseli(x, n) {\n n = Math.round(n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n if(M.abs(x) === 0) return 0;\n if(x == Infinity) return Infinity;\n\n var ret = 0.0, j, tox = 2 / M.abs(x), bip = 0.0, bi=1.0, bim=0.0;\n var m=2*M.round((n+M.round(M.sqrt(40*n)))/2);\n for (j=m;j>0;j--) {\n bim=j*tox*bi + bip;\n bip=bi; bi=bim;\n if (M.abs(bi) > 1E10) {\n bi *= 1E-10;\n bip *= 1E-10;\n ret *= 1E-10;\n }\n if(j == n) ret = bip;\n }\n ret *= besseli(x, 0) / bi;\n return x < 0 && (n%2) ? -ret : ret;\n };\n\n})();\n\nvar besselk = (function() {\n var b0_a = [-0.57721566, 0.42278420, 0.23069756, 0.3488590e-1, 0.262698e-2, 0.10750e-3, 0.74e-5].reverse();\n var b0_b = [1.25331414, -0.7832358e-1, 0.2189568e-1, -0.1062446e-1, 0.587872e-2, -0.251540e-2, 0.53208e-3].reverse();\n\n function bessel0(x) {\n if(x <= 2) return -M.log(x/2) * besseli(x,0) + _horner(b0_a, x*x/4);\n return M.exp(-x) / M.sqrt(x) * _horner(b0_b, 2/x);\n }\n\n var b1_a = [1.0, 0.15443144, -0.67278579, -0.18156897, -0.1919402e-1, -0.110404e-2, -0.4686e-4].reverse();\n var b1_b = [1.25331414, 0.23498619, -0.3655620e-1, 0.1504268e-1, -0.780353e-2, 0.325614e-2, -0.68245e-3].reverse();\n\n function bessel1(x) {\n if(x <= 2) return M.log(x/2) * besseli(x,1) + (1/x) * _horner(b1_a, x*x/4);\n return M.exp(-x)/M.sqrt(x)*_horner(b1_b, 2/x);\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELK', 2, 1);\n})();\nBESSEL.besselj = besselj;\nBESSEL.bessely = bessely;\nBESSEL.besseli = besseli;\nBESSEL.besselk = besselk;\n}));\n","import bessel from 'bessel'\nimport jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as text from './text.js'\nimport * as utils from './utils/common.js'\n\nfunction isValidBinaryNumber(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns the modified Bessel function In(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELI(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besseli(x, n)\n}\n\n/**\n * Returns the Bessel function Jn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELJ(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besselj(x, n)\n}\n\n/**\n * Returns the modified Bessel function Kn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELK(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besselk(x, n)\n}\n\n/**\n * Returns the Bessel function Yn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELY(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.bessely(x, n)\n}\n\n/**\n * Converts a binary number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function BIN2DEC(number) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Convert binary number to decimal\n const result = parseInt(number, 2)\n\n // Handle negative numbers\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return parseInt(stringified.substring(1), 2) - 512\n } else {\n return result\n }\n}\n\n/**\n * Converts a binary number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function BIN2HEX(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16)\n }\n\n // Convert binary number to hexadecimal\n const result = parseInt(number, 2).toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a binary number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function BIN2OCT(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8)\n }\n\n // Convert binary number to octal\n const result = parseInt(number, 2).toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Returns a 'Bitwise And' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nexport function BITAND(number1, number2) {\n // Return error if either number is a non-numeric value\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise AND of two numbers\n return number1 & number2\n}\n\n/**\n * Returns a value number shifted left by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Number must be an integer greater than or equal to 0.\n * @param {*} shift_amount Shift_amount must be an integer.\n * @returns\n */\nexport function BITLSHIFT(number, shift_amount) {\n number = utils.parseNumber(number)\n shift_amount = utils.parseNumber(shift_amount)\n\n if (utils.anyIsError(number, shift_amount)) {\n return error.value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return error.num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return error.num\n }\n\n // Return number shifted by shift bits to the left or to the right if shift is negative\n return shift_amount >= 0 ? number << shift_amount : number >> -shift_amount\n}\n\n/**\n * Returns a bitwise OR of 2 numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nexport function BITOR(number1, number2) {\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise OR of two numbers\n return number1 | number2\n}\n\n/**\n * Returns a value number shifted right by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Must be an integer greater than or equal to 0.\n * @param {*} shift_amount Must be an integer.\n * @returns\n */\nexport function BITRSHIFT(number, shift_amount) {\n number = utils.parseNumber(number)\n shift_amount = utils.parseNumber(shift_amount)\n\n if (utils.anyIsError(number, shift_amount)) {\n return error.value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return error.num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return error.num\n }\n\n // Return number shifted by shift bits to the right or to the left if shift is negative\n return shift_amount >= 0 ? number >> shift_amount : number << -shift_amount\n}\n\n/**\n * Returns a bitwise 'Exclusive Or' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be greater than or equal to 0.\n * @param {*} number2 Must be greater than or equal to 0.\n * @returns\n */\nexport function BITXOR(number1, number2) {\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise XOR of two numbers\n return number1 ^ number2\n}\n\n/**\n * Converts real and imaginary coefficients into a complex number.\n *\n * Category: Engineering\n *\n * @param {*} real_num The real coefficient of the complex number.\n * @param {*} i_num The imaginary coefficient of the complex number.\n * @param {*} suffix Optional. The suffix for the imaginary component of the complex number. If omitted, suffix is assumed to be \"i\".\n * @returns\n */\nexport function COMPLEX(real_num, i_num, suffix) {\n real_num = utils.parseNumber(real_num)\n i_num = utils.parseNumber(i_num)\n\n if (utils.anyIsError(real_num, i_num)) {\n return real_num\n }\n\n // Set suffix\n suffix = suffix === undefined ? 'i' : suffix\n\n // Return error if suffix is neither \"i\" nor \"j\"\n if (suffix !== 'i' && suffix !== 'j') {\n return error.value\n }\n\n // Return complex number\n if (real_num === 0 && i_num === 0) {\n return 0\n } else if (real_num === 0) {\n return i_num === 1 ? suffix : i_num.toString() + suffix\n } else if (i_num === 0) {\n return real_num.toString()\n } else {\n const sign = i_num > 0 ? '+' : ''\n return real_num.toString() + sign + (i_num === 1 ? suffix : i_num.toString() + suffix)\n }\n}\n\n/**\n * Converts a number from one measurement system to another.\n *\n * Category: Engineering\n *\n * @param {*} number is the value in from_units to convert.\n * @param {*} from_unit is the units for number.\n * @param {*} to_unit is the units for the result. CONVERT accepts the following text values (in quotation marks) for from_unit and to_unit.\n * @returns\n */\nexport function CONVERT(number, from_unit, to_unit) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // List of units supported by CONVERT and units defined by the International System of Units\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion ratio]\n const units = [\n ['a.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['a.u. of charge', 'e', null, 'electric_charge', false, false, 1.60217653141414e-19],\n ['a.u. of energy', 'Eh', null, 'energy', false, false, 4.35974417757576e-18],\n ['a.u. of length', 'a?', null, 'length', false, false, 5.29177210818182e-11],\n ['a.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['a.u. of time', '?/Eh', null, 'time', false, false, 2.41888432650516e-17],\n ['admiralty knot', 'admkn', null, 'speed', false, true, 0.514773333],\n ['ampere', 'A', null, 'electric_current', true, false, 1],\n ['ampere per meter', 'A/m', null, 'magnetic_field_intensity', true, false, 1],\n ['ångström', 'Å', ['ang'], 'length', false, true, 1e-10],\n ['are', 'ar', null, 'area', false, true, 100],\n ['astronomical unit', 'ua', null, 'length', false, false, 1.49597870691667e-11],\n ['bar', 'bar', null, 'pressure', false, false, 100000],\n ['barn', 'b', null, 'area', false, false, 1e-28],\n ['becquerel', 'Bq', null, 'radioactivity', true, false, 1],\n ['bit', 'bit', ['b'], 'information', false, true, 1],\n ['btu', 'BTU', ['btu'], 'energy', false, true, 1055.05585262],\n ['byte', 'byte', null, 'information', false, true, 8],\n ['candela', 'cd', null, 'luminous_intensity', true, false, 1],\n ['candela per square metre', 'cd/m?', null, 'luminance', true, false, 1],\n ['coulomb', 'C', null, 'electric_charge', true, false, 1],\n ['cubic ångström', 'ang3', ['ang^3'], 'volume', false, true, 1e-30],\n ['cubic foot', 'ft3', ['ft^3'], 'volume', false, true, 0.028316846592],\n ['cubic inch', 'in3', ['in^3'], 'volume', false, true, 0.000016387064],\n ['cubic light-year', 'ly3', ['ly^3'], 'volume', false, true, 8.46786664623715e-47],\n ['cubic metre', 'm3', ['m^3'], 'volume', true, true, 1],\n ['cubic mile', 'mi3', ['mi^3'], 'volume', false, true, 4168181825.44058],\n ['cubic nautical mile', 'Nmi3', ['Nmi^3'], 'volume', false, true, 6352182208],\n ['cubic Pica', 'Pica3', ['Picapt3', 'Pica^3', 'Picapt^3'], 'volume', false, true, 7.58660370370369e-8],\n ['cubic yard', 'yd3', ['yd^3'], 'volume', false, true, 0.764554857984],\n ['cup', 'cup', null, 'volume', false, true, 0.0002365882365],\n ['dalton', 'Da', ['u'], 'mass', false, false, 1.66053886282828e-27],\n ['day', 'd', ['day'], 'time', false, true, 86400],\n ['degree', '°', null, 'angle', false, false, 0.0174532925199433],\n ['degrees Rankine', 'Rank', null, 'temperature', false, true, 0.555555555555556],\n ['dyne', 'dyn', ['dy'], 'force', false, true, 0.00001],\n ['electronvolt', 'eV', ['ev'], 'energy', false, true, 1.60217656514141],\n ['ell', 'ell', null, 'length', false, true, 1.143],\n ['erg', 'erg', ['e'], 'energy', false, true, 1e-7],\n ['farad', 'F', null, 'electric_capacitance', true, false, 1],\n ['fluid ounce', 'oz', null, 'volume', false, true, 0.0000295735295625],\n ['foot', 'ft', null, 'length', false, true, 0.3048],\n ['foot-pound', 'flb', null, 'energy', false, true, 1.3558179483314],\n ['gal', 'Gal', null, 'acceleration', false, false, 0.01],\n ['gallon', 'gal', null, 'volume', false, true, 0.003785411784],\n ['gauss', 'G', ['ga'], 'magnetic_flux_density', false, true, 1],\n ['grain', 'grain', null, 'mass', false, true, 0.0000647989],\n ['gram', 'g', null, 'mass', false, true, 0.001],\n ['gray', 'Gy', null, 'absorbed_dose', true, false, 1],\n ['gross registered ton', 'GRT', ['regton'], 'volume', false, true, 2.8316846592],\n ['hectare', 'ha', null, 'area', false, true, 10000],\n ['henry', 'H', null, 'inductance', true, false, 1],\n ['hertz', 'Hz', null, 'frequency', true, false, 1],\n ['horsepower', 'HP', ['h'], 'power', false, true, 745.69987158227],\n ['horsepower-hour', 'HPh', ['hh', 'hph'], 'energy', false, true, 2684519.538],\n ['hour', 'h', ['hr'], 'time', false, true, 3600],\n ['imperial gallon (U.K.)', 'uk_gal', null, 'volume', false, true, 0.00454609],\n ['imperial hundredweight', 'lcwt', ['uk_cwt', 'hweight'], 'mass', false, true, 50.802345],\n ['imperial quart (U.K)', 'uk_qt', null, 'volume', false, true, 0.0011365225],\n ['imperial ton', 'brton', ['uk_ton', 'LTON'], 'mass', false, true, 1016.046909],\n ['inch', 'in', null, 'length', false, true, 0.0254],\n ['international acre', 'uk_acre', null, 'area', false, true, 4046.8564224],\n ['IT calorie', 'cal', null, 'energy', false, true, 4.1868],\n ['joule', 'J', null, 'energy', true, true, 1],\n ['katal', 'kat', null, 'catalytic_activity', true, false, 1],\n ['kelvin', 'K', ['kel'], 'temperature', true, true, 1],\n ['kilogram', 'kg', null, 'mass', true, true, 1],\n ['knot', 'kn', null, 'speed', false, true, 0.514444444444444],\n ['light-year', 'ly', null, 'length', false, true, 9460730472580800],\n ['litre', 'L', ['l', 'lt'], 'volume', false, true, 0.001],\n ['lumen', 'lm', null, 'luminous_flux', true, false, 1],\n ['lux', 'lx', null, 'illuminance', true, false, 1],\n ['maxwell', 'Mx', null, 'magnetic_flux', false, false, 1e-18],\n ['measurement ton', 'MTON', null, 'volume', false, true, 1.13267386368],\n ['meter per hour', 'm/h', ['m/hr'], 'speed', false, true, 0.00027777777777778],\n ['meter per second', 'm/s', ['m/sec'], 'speed', true, true, 1],\n ['meter per second squared', 'm?s??', null, 'acceleration', true, false, 1],\n ['parsec', 'pc', ['parsec'], 'length', false, true, 30856775814671900],\n ['meter squared per second', 'm?/s', null, 'kinematic_viscosity', true, false, 1],\n ['metre', 'm', null, 'length', true, true, 1],\n ['miles per hour', 'mph', null, 'speed', false, true, 0.44704],\n ['millimetre of mercury', 'mmHg', null, 'pressure', false, false, 133.322],\n ['minute', '?', null, 'angle', false, false, 0.000290888208665722],\n ['minute', 'min', ['mn'], 'time', false, true, 60],\n ['modern teaspoon', 'tspm', null, 'volume', false, true, 0.000005],\n ['mole', 'mol', null, 'amount_of_substance', true, false, 1],\n ['morgen', 'Morgen', null, 'area', false, true, 2500],\n ['n.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['n.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['n.u. of speed', 'c?', null, 'speed', false, false, 299792458],\n ['n.u. of time', '?/(me?c??)', null, 'time', false, false, 1.28808866778687e-21],\n ['nautical mile', 'M', ['Nmi'], 'length', false, true, 1852],\n ['newton', 'N', null, 'force', true, true, 1],\n ['œrsted', 'Oe ', null, 'magnetic_field_intensity', false, false, 79.5774715459477],\n ['ohm', 'Ω', null, 'electric_resistance', true, false, 1],\n ['ounce mass', 'ozm', null, 'mass', false, true, 0.028349523125],\n ['pascal', 'Pa', null, 'pressure', true, false, 1],\n ['pascal second', 'Pa?s', null, 'dynamic_viscosity', true, false, 1],\n ['pferdestärke', 'PS', null, 'power', false, true, 735.49875],\n ['phot', 'ph', null, 'illuminance', false, false, 0.0001],\n ['pica (1/6 inch)', 'pica', null, 'length', false, true, 0.00035277777777778],\n ['pica (1/72 inch)', 'Pica', ['Picapt'], 'length', false, true, 0.00423333333333333],\n ['poise', 'P', null, 'dynamic_viscosity', false, false, 0.1],\n ['pond', 'pond', null, 'force', false, true, 0.00980665],\n ['pound force', 'lbf', null, 'force', false, true, 4.4482216152605],\n ['pound mass', 'lbm', null, 'mass', false, true, 0.45359237],\n ['quart', 'qt', null, 'volume', false, true, 0.000946352946],\n ['radian', 'rad', null, 'angle', true, false, 1],\n ['second', '?', null, 'angle', false, false, 0.00000484813681109536],\n ['second', 's', ['sec'], 'time', true, true, 1],\n ['short hundredweight', 'cwt', ['shweight'], 'mass', false, true, 45.359237],\n ['siemens', 'S', null, 'electrical_conductance', true, false, 1],\n ['sievert', 'Sv', null, 'equivalent_dose', true, false, 1],\n ['slug', 'sg', null, 'mass', false, true, 14.59390294],\n ['square ångström', 'ang2', ['ang^2'], 'area', false, true, 1e-20],\n ['square foot', 'ft2', ['ft^2'], 'area', false, true, 0.09290304],\n ['square inch', 'in2', ['in^2'], 'area', false, true, 0.00064516],\n ['square light-year', 'ly2', ['ly^2'], 'area', false, true, 8.95054210748189e31],\n ['square meter', 'm?', null, 'area', true, true, 1],\n ['square mile', 'mi2', ['mi^2'], 'area', false, true, 2589988.110336],\n ['square nautical mile', 'Nmi2', ['Nmi^2'], 'area', false, true, 3429904],\n ['square Pica', 'Pica2', ['Picapt2', 'Pica^2', 'Picapt^2'], 'area', false, true, 0.00001792111111111],\n ['square yard', 'yd2', ['yd^2'], 'area', false, true, 0.83612736],\n ['statute mile', 'mi', null, 'length', false, true, 1609.344],\n ['steradian', 'sr', null, 'solid_angle', true, false, 1],\n ['stilb', 'sb', null, 'luminance', false, false, 0.0001],\n ['stokes', 'St', null, 'kinematic_viscosity', false, false, 0.0001],\n ['stone', 'stone', null, 'mass', false, true, 6.35029318],\n ['tablespoon', 'tbs', null, 'volume', false, true, 0.0000147868],\n ['teaspoon', 'tsp', null, 'volume', false, true, 0.00000492892],\n ['tesla', 'T', null, 'magnetic_flux_density', true, true, 1],\n ['thermodynamic calorie', 'c', null, 'energy', false, true, 4.184],\n ['ton', 'ton', null, 'mass', false, true, 907.18474],\n ['tonne', 't', null, 'mass', false, false, 1000],\n ['U.K. pint', 'uk_pt', null, 'volume', false, true, 0.00056826125],\n ['U.S. bushel', 'bushel', null, 'volume', false, true, 0.03523907],\n ['U.S. oil barrel', 'barrel', null, 'volume', false, true, 0.158987295],\n ['U.S. pint', 'pt', ['us_pt'], 'volume', false, true, 0.000473176473],\n ['U.S. survey mile', 'survey_mi', null, 'length', false, true, 1609.347219],\n ['U.S. survey/statute acre', 'us_acre', null, 'area', false, true, 4046.87261],\n ['volt', 'V', null, 'voltage', true, false, 1],\n ['watt', 'W', null, 'power', true, true, 1],\n ['watt-hour', 'Wh', ['wh'], 'energy', false, true, 3600],\n ['weber', 'Wb', null, 'magnetic_flux', true, false, 1],\n ['yard', 'yd', null, 'length', false, true, 0.9144],\n ['year', 'yr', null, 'time', false, true, 31557600]\n ]\n\n // Binary prefixes\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived from]\n const binary_prefixes = {\n Yi: ['yobi', 80, 1208925819614629174706176, 'Yi', 'yotta'],\n Zi: ['zebi', 70, 1180591620717411303424, 'Zi', 'zetta'],\n Ei: ['exbi', 60, 1152921504606846976, 'Ei', 'exa'],\n Pi: ['pebi', 50, 1125899906842624, 'Pi', 'peta'],\n Ti: ['tebi', 40, 1099511627776, 'Ti', 'tera'],\n Gi: ['gibi', 30, 1073741824, 'Gi', 'giga'],\n Mi: ['mebi', 20, 1048576, 'Mi', 'mega'],\n ki: ['kibi', 10, 1024, 'ki', 'kilo']\n }\n\n // Unit prefixes\n // [Name, Multiplier, Abbreviation]\n const unit_prefixes = {\n Y: ['yotta', 1e24, 'Y'],\n Z: ['zetta', 1e21, 'Z'],\n E: ['exa', 1e18, 'E'],\n P: ['peta', 1e15, 'P'],\n T: ['tera', 1e12, 'T'],\n G: ['giga', 1e9, 'G'],\n M: ['mega', 1e6, 'M'],\n k: ['kilo', 1e3, 'k'],\n h: ['hecto', 1e2, 'h'],\n e: ['dekao', 1e1, 'e'],\n d: ['deci', 1e-1, 'd'],\n c: ['centi', 1e-2, 'c'],\n m: ['milli', 1e-3, 'm'],\n u: ['micro', 1e-6, 'u'],\n n: ['nano', 1e-9, 'n'],\n p: ['pico', 1e-12, 'p'],\n f: ['femto', 1e-15, 'f'],\n a: ['atto', 1e-18, 'a'],\n z: ['zepto', 1e-21, 'z'],\n y: ['yocto', 1e-24, 'y']\n }\n\n // Initialize units and multipliers\n let from = null\n let to = null\n let base_from_unit = from_unit\n let base_to_unit = to_unit\n let from_multiplier = 1\n let to_multiplier = 1\n let alt\n\n // Lookup from and to units\n for (let i = 0; i < units.length; i++) {\n alt = units[i][2] === null ? [] : units[i][2]\n\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[i]\n }\n\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[i]\n }\n }\n\n // Lookup from prefix\n if (from === null) {\n const from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)]\n let from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)]\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (from_unit.substring(0, 2) === 'da') {\n from_unit_prefix = ['dekao', 1e1, 'da']\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (from_binary_prefix) {\n from_multiplier = from_binary_prefix[2]\n base_from_unit = from_unit.substring(2)\n } else if (from_unit_prefix) {\n from_multiplier = from_unit_prefix[1]\n base_from_unit = from_unit.substring(from_unit_prefix[2].length)\n }\n\n // Lookup from unit\n for (let j = 0; j < units.length; j++) {\n alt = units[j][2] === null ? [] : units[j][2]\n\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[j]\n }\n }\n }\n\n // Lookup to prefix\n if (to === null) {\n const to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)]\n let to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)]\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (to_unit.substring(0, 2) === 'da') {\n to_unit_prefix = ['dekao', 1e1, 'da']\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (to_binary_prefix) {\n to_multiplier = to_binary_prefix[2]\n base_to_unit = to_unit.substring(2)\n } else if (to_unit_prefix) {\n to_multiplier = to_unit_prefix[1]\n base_to_unit = to_unit.substring(to_unit_prefix[2].length)\n }\n\n // Lookup to unit\n for (let k = 0; k < units.length; k++) {\n alt = units[k][2] === null ? [] : units[k][2]\n\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[k]\n }\n }\n }\n\n // Return error if a unit does not exist\n if (from === null || to === null) {\n return error.na\n }\n\n // Return error if units represent different quantities\n if (from[3] !== to[3]) {\n return error.na\n }\n\n // Return converted number\n return (number * from[6] * from_multiplier) / (to[6] * to_multiplier)\n}\n\n/**\n * Converts a decimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, valid place values are ignored and DEC2BIN returns a 10-character (10-bit) binary number in which the most significant bit is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2BIN(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -512, or is greater than 511\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (number < 0) {\n return '1' + text.REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2)\n }\n\n // Convert decimal number to binary\n const result = parseInt(number, 10).toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a decimal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2HEX returns a 10-character (40-bit) hexadecimal number in which the most significant bit is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2HEX(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\n return error.num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n if (number < 0) {\n return (1099511627776 + number).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = parseInt(number, 10).toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a decimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2OCT returns a 10-character (30-bit) octal number in which the most significant bit is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2OCT(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (number < 0) {\n return (1073741824 + number).toString(8)\n }\n\n // Convert decimal number to octal\n const result = parseInt(number, 10).toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Tests whether two values are equal.\n *\n * Category: Engineering\n *\n * @param {*} number1 The first number.\n * @param {*} number2 Optional. The second number. If omitted, number2 is assumed to be zero.\n * @returns\n */\nexport function DELTA(number1, number2) {\n // Set number2 to zero if undefined\n number2 = number2 === undefined ? 0 : number2\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return delta\n return number1 === number2 ? 1 : 0\n}\n\n// TODO: why is upper_bound not used ? The excel documentation has no examples with upper_bound\n/**\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} lower_limit The lower bound for integrating ERF.\n * @param {*} upper_limit Optional. The upper bound for integrating ERF. If omitted, ERF integrates between zero and lower_limit.\n * @returns\n */\nexport function ERF(lower_limit, upper_limit) {\n // Set number2 to zero if undefined\n upper_limit = upper_limit === undefined ? 0 : upper_limit\n\n lower_limit = utils.parseNumber(lower_limit)\n upper_limit = utils.parseNumber(upper_limit)\n\n if (utils.anyIsError(lower_limit, upper_limit)) {\n return error.value\n }\n\n return jStat.erf(lower_limit)\n}\n\n/**\n * Returns the complementary error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.\n * @returns\n */\nexport function ERFC(x) {\n // Return error if x is not a number\n if (isNaN(x)) {\n return error.value\n }\n\n return jStat.erfc(x)\n}\n\n/**\n * Tests whether a number is greater than a threshold value.\n *\n * Category: Engineering\n *\n * @param {*} number The value to test against step.\n * @param {*} step Optional. The threshold value. If you omit a value for step, GESTEP uses zero.\n * @returns\n */\nexport function GESTEP(number, step) {\n step = step || 0\n number = utils.parseNumber(number)\n\n if (utils.anyIsError(step, number)) {\n return number\n }\n\n // Return delta\n return number >= step ? 1 : 0\n}\n\n/**\n * Converts a hexadecimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit (40th bit from the right). The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function HEX2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1).toLowerCase() === 'f')\n\n // Convert hexadecimal number to decimal\n const decimal = negative ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16)\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + text.REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a hexadecimal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters (40 bits). The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function HEX2DEC(number) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16)\n\n // Return decimal number\n return decimal >= 549755813888 ? decimal - 1099511627776 : decimal\n}\n\n/**\n * Converts a hexadecimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function HEX2OCT(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16)\n\n // Return error if number is positive and greater than 0x1fffffff (536870911)\n if (decimal > 536870911 && decimal < 1098974756864) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 1098974756864) {\n return (decimal - 1098437885952).toString(8)\n }\n\n // Convert decimal number to octal\n const result = decimal.toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Returns the absolute value (modulus) of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the absolute value.\n * @returns\n */\nexport function IMABS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return absolute value of complex number\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n}\n\n/**\n * Returns the imaginary coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the imaginary coefficient.\n * @returns\n */\nexport function IMAGINARY(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', 'j'].indexOf(inumber) >= 0) {\n return 1\n }\n\n // Force string type\n inumber = inumber + ''\n\n // Normalize imaginary coefficient\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j')\n\n // Lookup sign\n let plus = inumber.indexOf('+')\n let minus = inumber.indexOf('-')\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1)\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1)\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length)\n const unit = last === 'i' || last === 'j'\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num\n }\n\n // Return imaginary coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(plus + 1, inumber.length - 1))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? error.num\n : -Number(inumber.substring(minus + 1, inumber.length - 1))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? error.num : inumber.substring(0, inumber.length - 1)\n } else {\n return isNaN(inumber) ? error.num : 0\n }\n }\n}\n\n/**\n * Returns the argument theta, an angle expressed in radians.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the argument .\n * @returns\n */\nexport function IMARGUMENT(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return error if inumber is equal to zero\n if (x === 0 && y === 0) {\n return error.div0\n }\n\n // Return PI/2 if x is equal to zero and y is positive\n if (x === 0 && y > 0) {\n return Math.PI / 2\n }\n\n // Return -PI/2 if x is equal to zero and y is negative\n if (x === 0 && y < 0) {\n return -Math.PI / 2\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x > 0) {\n return 0\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x < 0) {\n return -Math.PI\n }\n\n // Return argument of complex number\n if (x > 0) {\n return Math.atan(y / x)\n } else if (x < 0 && y >= 0) {\n return Math.atan(y / x) + Math.PI\n } else {\n return Math.atan(y / x) - Math.PI\n }\n}\n\n/**\n * Returns the complex conjugate of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the conjugate.\n * @returns\n */\nexport function IMCONJUGATE(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return conjugate of complex number\n return y !== 0 ? COMPLEX(x, -y, unit) : inumber\n}\n\n/**\n * Returns the cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosine.\n * @returns\n */\nexport function IMCOS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return cosine of complex number\n return COMPLEX(\n (Math.cos(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (-Math.sin(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosine.\n * @returns\n */\nexport function IMCOSH(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return hyperbolic cosine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the cotangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cotangent.\n * @returns\n */\nexport function IMCOT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return cotangent of complex number\n return IMDIV(IMCOS(inumber), IMSIN(inumber))\n}\n\n/**\n * Returns the quotient of two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex numerator or dividend.\n * @param {*} inumber2 The complex denominator or divisor.\n * @returns\n */\nexport function IMDIV(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1)\n const b = IMAGINARY(inumber1)\n const c = IMREAL(inumber2)\n const d = IMAGINARY(inumber2)\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1)\n const unit2 = inumber2.substring(inumber2.length - 1)\n let unit = 'i'\n\n if (unit1 === 'j') {\n unit = 'j'\n } else if (unit2 === 'j') {\n unit = 'j'\n }\n\n // Return error if inumber2 is null\n if (c === 0 && d === 0) {\n return error.num\n }\n\n // Return exponential of complex number\n const den = c * c + d * d\n return COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit)\n}\n\n/**\n * Returns the exponential of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the exponential.\n * @returns\n */\nexport function IMEXP(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n const e = Math.exp(x)\n return COMPLEX(e * Math.cos(y), e * Math.sin(y), unit)\n}\n\n/**\n * Returns the natural logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the natural logarithm.\n * @returns\n */\nexport function IMLN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit)\n}\n\n/**\n * Returns the base-10 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the common logarithm.\n * @returns\n */\nexport function IMLOG10(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit)\n}\n\n/**\n * Returns the base-2 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the base-2 logarithm.\n * @returns\n */\nexport function IMLOG2(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit)\n}\n\n/**\n * Returns a complex number raised to an integer power.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number you want to raise to a power.\n * @param {*} number The power to which you want to raise the complex number.\n * @returns\n */\nexport function IMPOWER(inumber, number) {\n number = utils.parseNumber(number)\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(number, x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Calculate power of modulus\n const p = Math.pow(IMABS(inumber), number)\n\n // Calculate argument\n const t = IMARGUMENT(inumber)\n\n // Return exponential of complex number\n return COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit)\n}\n\n/**\n * Returns the product of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], … Inumber1 is required, subsequent inumbers are not. 1 to 255 complex numbers to multiply.\n * @returns\n */\nexport function IMPRODUCT() {\n // Initialize result\n let result = arguments[0]\n\n if (!arguments.length) {\n return error.value\n }\n\n // Loop on all numbers\n for (let i = 1; i < arguments.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result)\n const b = IMAGINARY(result)\n const c = IMREAL(arguments[i])\n const d = IMAGINARY(arguments[i])\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a * c - b * d, a * d + b * c)\n }\n\n // Return product of complex numbers\n return result\n}\n\n/**\n * Returns the real coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the real coefficient.\n * @returns\n */\nexport function IMREAL(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\n return 0\n }\n\n // Force String type\n inumber = inumber + ''\n\n // Lookup sign\n let plus = inumber.indexOf('+')\n let minus = inumber.indexOf('-')\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1)\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1)\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length)\n const unit = last === 'i' || last === 'j'\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num\n }\n\n // Return real coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(0, plus))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(0, minus))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? error.num : 0\n } else {\n return isNaN(inumber) ? error.num : inumber\n }\n }\n}\n\n/**\n * Returns the secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the secant.\n * @returns\n */\nexport function IMSEC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return secant of complex number\n return IMDIV('1', IMCOS(inumber))\n}\n\n/**\n * Returns the hyperbolic secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic secant.\n * @returns\n */\nexport function IMSECH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return hyperbolic secant of complex number\n return IMDIV('1', IMCOSH(inumber))\n}\n\n/**\n * Returns the sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the sine.\n * @returns\n */\nexport function IMSIN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return sine of complex number\n return COMPLEX(\n (Math.sin(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (Math.cos(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic sine.\n * @returns\n */\nexport function IMSINH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return hyperbolic sine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the square root of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the square root.\n * @returns\n */\nexport function IMSQRT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Calculate power of modulus\n const s = Math.sqrt(IMABS(inumber))\n\n // Calculate argument\n const t = IMARGUMENT(inumber)\n\n // Return exponential of complex number\n return COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit)\n}\n\n/**\n * Returns the cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosecant.\n * @returns\n */\nexport function IMCSC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num\n }\n\n // Return cosecant of complex number\n return IMDIV('1', IMSIN(inumber))\n}\n\n/**\n * Returns the hyperbolic cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosecant.\n * @returns\n */\nexport function IMCSCH(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num\n }\n\n // Return hyperbolic cosecant of complex number\n return IMDIV('1', IMSINH(inumber))\n}\n\n/**\n * Returns the difference between two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex number from which to subtract inumber2.\n * @param {*} inumber2 The complex number to subtract from inumber1.\n * @returns\n */\nexport function IMSUB(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1)\n const b = IMAGINARY(inumber1)\n const c = IMREAL(inumber2)\n const d = IMAGINARY(inumber2)\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1)\n const unit2 = inumber2.substring(inumber2.length - 1)\n let unit = 'i'\n\n if (unit1 === 'j') {\n unit = 'j'\n } else if (unit2 === 'j') {\n unit = 'j'\n }\n\n // Return _ of two complex numbers\n return COMPLEX(a - c, b - d, unit)\n}\n\n/**\n * Returns the sum of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], ... Inumber1 is required, subsequent numbers are not. 1 to 255 complex numbers to add.\n * @returns\n */\nexport function IMSUM() {\n if (!arguments.length) {\n return error.value\n }\n\n const args = utils.flatten(arguments)\n\n // Initialize result\n let result = args[0]\n\n // Loop on all numbers\n for (let i = 1; i < args.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result)\n const b = IMAGINARY(result)\n const c = IMREAL(args[i])\n const d = IMAGINARY(args[i])\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a + c, b + d)\n }\n\n // Return sum of complex numbers\n return result\n}\n\n/**\n * Returns the tangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the tangent.\n * @returns\n */\nexport function IMTAN(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return tangent of complex number\n return IMDIV(IMSIN(inumber), IMCOS(inumber))\n}\n\n/**\n * Converts an octal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function OCT2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1) === '7')\n\n // Convert octal number to decimal\n const decimal = negative ? parseInt(number, 8) - 1073741824 : parseInt(number, 8)\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + text.REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts an octal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function OCT2DEC(number) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8)\n\n // Return decimal number\n return decimal >= 536870912 ? decimal - 1073741824 : decimal\n}\n\n/**\n * Converts an octal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function OCT2HEX(number, places) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8)\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 536870912) {\n return 'ff' + (decimal + 3221225472).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = decimal.toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n","import * as dateTime from './date-time.js'\nimport * as engineering from './engineering.js'\nimport * as mathTrig from './math-trig.js'\nimport * as statistical from './statistical.js'\n\nexport const BETADIST = statistical.BETA.DIST\nexport const BETAINV = statistical.BETA.INV\nexport const BINOMDIST = statistical.BINOM.DIST\nexport const CEILINGMATH = mathTrig.CEILING.MATH\nexport const CEILINGPRECISE = mathTrig.CEILING.PRECISE\nexport const CHIDIST = statistical.CHISQ.DIST\nexport const CHIDISTRT = statistical.CHISQ.DIST.RT\nexport const CHIINV = statistical.CHISQ.INV\nexport const CHIINVRT = statistical.CHISQ.INV.RT\nexport const CHITEST = statistical.CHISQ.TEST\nexport const COVAR = statistical.COVARIANCE.P\nexport const COVARIANCEP = statistical.COVARIANCE.P\nexport const COVARIANCES = statistical.COVARIANCE.S\nexport const CRITBINOM = statistical.BINOM.INV\nexport const ERFCPRECISE = engineering.ERFC.PRECISE\nexport const ERFPRECISE = engineering.ERF.PRECISE\nexport const EXPONDIST = statistical.EXPON.DIST\nexport const FDIST = statistical.F.DIST\nexport const FDISTRT = statistical.F.DIST.RT\nexport const FINV = statistical.F.INV\nexport const FINVRT = statistical.F.INV.RT\nexport const FLOORMATH = mathTrig.FLOOR.MATH\nexport const FLOORPRECISE = mathTrig.FLOOR.PRECISE\nexport const FTEST = statistical.F.TEST\nexport const GAMMADIST = statistical.GAMMA.DIST\nexport const GAMMAINV = statistical.GAMMA.INV\nexport const GAMMALNPRECISE = statistical.GAMMALN.PRECISE\nexport const HYPGEOMDIST = statistical.HYPGEOM.DIST\nexport const LOGINV = statistical.LOGNORM.INV\nexport const LOGNORMDIST = statistical.LOGNORM.DIST\nexport const LOGNORMINV = statistical.LOGNORM.INV\nexport const MODEMULT = statistical.MODE.MULT\nexport const MODESNGL = statistical.MODE.SNGL\nexport const NEGBINOMDIST = statistical.NEGBINOM.DIST\nexport const NETWORKDAYSINTL = dateTime.NETWORKDAYS.INTL\nexport const NORMDIST = statistical.NORM.DIST\nexport const NORMINV = statistical.NORM.INV\nexport const NORMSDIST = statistical.NORM.S.DIST\nexport const NORMSINV = statistical.NORM.S.INV\nexport const PERCENTILEEXC = statistical.PERCENTILE.EXC\nexport const PERCENTILEINC = statistical.PERCENTILE.INC\nexport const PERCENTRANKEXC = statistical.PERCENTRANK.EXC\nexport const PERCENTRANKINC = statistical.PERCENTRANK.INC\nexport const POISSONDIST = statistical.POISSON.DIST\nexport const QUARTILEEXC = statistical.QUARTILE.EXC\nexport const QUARTILEINC = statistical.QUARTILE.INC\nexport const RANKAVG = statistical.RANK.AVG\nexport const RANKEQ = statistical.RANK.EQ\nexport const SKEWP = statistical.SKEW.P\nexport const STDEVP = statistical.STDEV.P\nexport const STDEVS = statistical.STDEV.S\nexport const TDIST = statistical.T.DIST\nexport const TDISTRT = statistical.T.DIST.RT\nexport const TINV = statistical.T.INV\nexport const TTEST = statistical.T.TEST\nexport const VARP = statistical.VAR.P\nexport const VARS = statistical.VAR.S\nexport const WEIBULLDIST = statistical.WEIBULL.DIST\nexport const WORKDAYINTL = dateTime.WORKDAY.INTL\nexport const ZTEST = statistical.Z.TEST\n","import * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as maths from './math-trig.js'\nimport * as stats from './statistical.js'\nimport * as utils from './utils/common.js'\n\nfunction compact(array) {\n const result = []\n\n utils.arrayEach(array, (value) => {\n if (value) {\n result.push(value)\n }\n })\n\n return result\n}\n\nfunction findResultIndex(database, criterias) {\n const matches = {}\n\n for (let i = 1; i < database[0].length; ++i) {\n matches[i] = true\n }\n\n let maxCriteriaLength = criterias[0].length\n\n for (let i = 1; i < criterias.length; ++i) {\n if (criterias[i].length > maxCriteriaLength) {\n maxCriteriaLength = criterias[i].length\n }\n }\n\n for (let k = 1; k < database.length; ++k) {\n for (let l = 1; l < database[k].length; ++l) {\n let currentCriteriaResult = false\n let hasMatchingCriteria = false\n\n for (let j = 0; j < criterias.length; ++j) {\n const criteria = criterias[j]\n\n if (criteria.length < maxCriteriaLength) {\n continue\n }\n\n const criteriaField = criteria[0]\n\n if (database[k][0] !== criteriaField) {\n continue\n }\n\n hasMatchingCriteria = true\n\n for (let p = 1; p < criteria.length; ++p) {\n if (!currentCriteriaResult) {\n const isWildcard = criteria[p] === void 0 || criteria[p] === '*'\n\n if (isWildcard) {\n currentCriteriaResult = true\n } else {\n const tokenizedCriteria = evalExpression.parse(criteria[p] + '')\n const tokens = [evalExpression.createToken(database[k][l], evalExpression.TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n )\n\n currentCriteriaResult = evalExpression.compute(tokens)\n }\n }\n }\n }\n\n if (hasMatchingCriteria) {\n matches[l] = matches[l] && currentCriteriaResult\n }\n }\n }\n\n const result = []\n\n for (let n = 0; n < database[0].length; ++n) {\n if (matches[n]) {\n result.push(n - 1)\n }\n }\n\n return result\n}\n\n// Database functions\n/**\n * Returns the average of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database Range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Range of values that contains the conditions you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DAVERAGE(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let sum = 0\n\n utils.arrayEach(resultIndexes, (value) => {\n sum += targetFields[value]\n })\n\n return resultIndexes.length === 0 ? error.div0 : sum / resultIndexes.length\n}\n\n/**\n * Counts the values that contain numbers in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as the argument includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DCOUNT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.COUNT(targetValues)\n}\n\n/**\n * Counts nonblank values in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Optional. Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DCOUNTA(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.COUNTA(targetValues)\n}\n\n/**\n * Extracts from a database a single record that matches the specified criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DGET(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n // Return error if no record meets the criteria\n if (resultIndexes.length === 0) {\n return error.value\n }\n // Returns the #NUM! error value because more than one record meets the\n // criteria\n if (resultIndexes.length > 1) {\n return error.num\n }\n\n return targetFields[resultIndexes[0]]\n}\n\n/**\n * Returns the maximum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DMAX(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let maxValue = targetFields[resultIndexes[0]]\n\n utils.arrayEach(resultIndexes, (value) => {\n if (maxValue < targetFields[value]) {\n maxValue = targetFields[value]\n }\n })\n\n return maxValue\n}\n\n/**\n * Returns the minimum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DMIN(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let minValue = targetFields[resultIndexes[0]]\n\n utils.arrayEach(resultIndexes, (value) => {\n if (minValue > targetFields[value]) {\n minValue = targetFields[value]\n }\n })\n\n return minValue\n}\n\n/**\n * Multiplies the values in a particular field of records that match the criteria in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DPRODUCT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n targetValues = compact(targetValues)\n\n let result = 1\n\n utils.arrayEach(targetValues, (value) => {\n result *= value\n })\n\n return result\n}\n\n/**\n * Estimates the standard deviation based on a sample of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSTDEV(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n targetValues = compact(targetValues)\n\n return stats.STDEV.S(targetValues)\n}\n\n/**\n * Calculates the standard deviation based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSTDEVP(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n targetValues = compact(targetValues)\n\n return stats.STDEV.P(targetValues)\n}\n\n/**\n * Adds the numbers in the field column of records in the database that match the criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Is the range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSUM(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return maths.SUM(targetValues)\n}\n\n/**\n * Estimates variance based on a sample from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DVAR(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.VAR.S(targetValues)\n}\n\n/**\n * Calculates variance based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DVARP(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.VAR.P(targetValues)\n}\n","import * as error from './utils/error.js'\nimport * as dateTime from './date-time.js'\nimport * as utils from './utils/common.js'\n\nfunction validDate(d) {\n return d && d.getTime && !isNaN(d.getTime())\n}\n\nfunction ensureDate(d) {\n return d instanceof Date ? d : new Date(d)\n}\n\n// Calculate last coupon date before settlement\nfunction lastCoupDateBeforeSettlement(settlement, maturity, frequency) {\n let date = utils.parseDate(maturity)\n date.setFullYear(settlement.getFullYear())\n\n if (date < settlement) {\n date.setFullYear(date.getFullYear() + 1)\n }\n\n // Adjust the date based on the coupon frequency until date is later than settlement\n while (date > settlement) {\n date.setMonth(date.getMonth() + -12 / frequency)\n }\n\n return date\n}\n\nfunction validateFrequency(frequency) {\n frequency = utils.parseNumber(frequency)\n\n // Return error if frequency is neither 1, 2, or 4\n if ([1, 2, 4].indexOf(frequency) === -1) {\n return error.num\n }\n\n return frequency\n}\n\nfunction validateBasis(basis) {\n basis = utils.parseNumber(basis)\n\n // Return error if basis is neither 0, 1, 2, 3, or 4\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\n return error.num\n }\n\n return basis\n}\n\n/**\n * Returns the accrued interest for a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} first_interest The security's first interest date.\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINT uses $1,000.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @param {*} calc_method Optional. Not implemented in formulajs. A logical value that specifies the way to calculate the total accrued interest when the date of settlement is later than the date of first_interest. A value of TRUE (1) returns the total accrued interest from issue to settlement. A value of FALSE (0) returns the accrued interest from first_interest to settlement. If you do not enter the argument, it defaults to TRUE.\n * @returns\n */\nexport function ACCRINT(issue, first_interest, settlement, rate, par, frequency, basis) {\n // Return error if either date is invalid\n issue = ensureDate(issue)\n first_interest = ensureDate(first_interest)\n settlement = ensureDate(settlement)\n frequency = validateFrequency(frequency)\n basis = validateBasis(basis)\n\n if (utils.anyError(frequency, basis)) {\n return error.num\n }\n\n if (!validDate(issue) || !validDate(first_interest) || !validDate(settlement)) {\n return error.value\n }\n\n // Return error if either rate or par are lower than or equal to zero\n if (rate <= 0 || par <= 0) {\n return error.num\n }\n\n // Return error if settlement is before or equal to issue\n if (settlement <= issue) {\n return error.num\n }\n\n // Set default values\n par = par || 0\n basis = basis || 0\n\n // Compute accrued interest\n return par * rate * dateTime.YEARFRAC(issue, settlement, basis)\n}\n\n/**\n *\n * Returns the number of days in the coupon period that contains the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function COUPDAYS(settlement, maturity, frequency, basis) {\n basis = validateBasis(basis)\n frequency = validateFrequency(frequency)\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n\n if (utils.anyError(settlement, maturity)) {\n return error.value\n }\n\n if (utils.anyError(frequency, basis) || settlement >= maturity) {\n return error.num\n }\n\n if (basis === 1) {\n let date = lastCoupDateBeforeSettlement(settlement, maturity, frequency)\n let nextDate = utils.parseDate(date)\n\n // Set month of the nextDate to the next coupon month\n nextDate.setMonth(nextDate.getMonth() + 12 / frequency)\n\n return dateTime.DATEDIF(date, nextDate, 'D')\n }\n\n let numOfDays\n\n switch (basis) {\n case 0:\n case 2:\n case 4:\n numOfDays = 360\n break\n case 3:\n numOfDays = 365\n break\n default:\n return error.num\n }\n\n return numOfDays / frequency\n}\n\n/**\n * Returns the cumulative interest paid between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nexport function CUMIPMT(rate, nper, pv, start_period, end_period, type) {\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, nper, pv)) {\n return error.value\n }\n\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return error.num\n }\n\n if (start_period < 1 || end_period < 1 || start_period > end_period) {\n return error.num\n }\n\n if (type !== 0 && type !== 1) {\n return error.num\n }\n\n const payment = PMT(rate, nper, pv, 0, type)\n let interest = 0\n\n if (start_period === 1) {\n if (type === 0) {\n interest = -pv\n }\n\n start_period++\n }\n\n for (let i = start_period; i <= end_period; i++) {\n interest += type === 1 ? FV(rate, i - 2, payment, pv, 1) - payment : FV(rate, i - 1, payment, pv, 0)\n }\n\n interest *= rate\n\n return interest\n}\n\n/**\n * Returns the cumulative principal paid on a loan between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nexport function CUMPRINC(rate, nper, pv, start_period, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and variable names\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, nper, pv)) {\n return error.value\n }\n\n // Return error if either rate, nper, or value are lower than or equal to zero\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return error.num\n }\n\n // Return error if start < 1, end < 1, or start > end\n if (start_period < 1 || end < 1 || start_period > end) {\n return error.num\n }\n\n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return error.num\n }\n\n // Compute cumulative principal\n const payment = PMT(rate, nper, pv, 0, type)\n let principal = 0\n\n if (start_period === 1) {\n principal = type === 0 ? payment + pv * rate : payment\n\n start_period++\n }\n\n for (let i = start_period; i <= end; i++) {\n principal +=\n type > 0\n ? payment - (FV(rate, i - 2, payment, pv, 1) - payment) * rate\n : payment - FV(rate, i - 1, payment, pv, 0) * rate\n }\n\n // Return cumulative principal\n return principal\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the fixed-declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} month Optional. The number of months in the first year. If month is omitted, it is assumed to be 12.\n * @returns\n */\nexport function DB(cost, salvage, life, period, month) {\n // Initialize month\n month = month === undefined ? 12 : month\n\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n period = utils.parseNumber(period)\n month = utils.parseNumber(month)\n\n if (utils.anyIsError(cost, salvage, life, period, month)) {\n return error.value\n }\n\n // Return error if any of the parameters is negative\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\n return error.num\n }\n\n // Return error if month is not an integer between 1 and 12\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\n return error.num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return error.num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Rate is rounded to three decimals places\n const rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3)\n\n // Compute initial depreciation\n const initial = (cost * rate * month) / 12\n\n // Compute total depreciation\n let total = initial\n let current = 0\n const ceiling = period === life ? life - 1 : period\n\n for (let i = 2; i <= ceiling; i++) {\n current = (cost - total) * rate\n total += current\n }\n\n // Depreciation for the first and last periods are special cases\n if (period === 1) {\n // First period\n return initial\n } else if (period === life) {\n // Last period\n\n return (cost - total) * rate\n } else {\n return current\n }\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method).\n * @returns\n */\nexport function DDB(cost, salvage, life, period, factor) {\n // Initialize factor\n factor = factor === undefined ? 2 : factor\n\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n period = utils.parseNumber(period)\n factor = utils.parseNumber(factor)\n\n if (utils.anyIsError(cost, salvage, life, period, factor)) {\n return error.value\n }\n\n // Return error if any of the parameters is negative or if factor is null\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\n return error.num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return error.num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Compute depreciation\n let total = 0\n let current = 0\n\n for (let i = 1; i <= period; i++) {\n current = Math.min((cost - total) * (factor / life), cost - salvage - total)\n total += current\n }\n\n // Return depreciation\n return current\n}\n\n/**\n * Returns the discount rate for a security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function DISC(settlement, maturity, pr, redemption, basis) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n pr = utils.parseNumber(pr)\n redemption = utils.parseNumber(redemption)\n basis = utils.parseNumber(basis)\n\n basis = basis || 0\n\n if (utils.anyIsError(settlement, maturity, pr, redemption, basis)) {\n return error.value\n }\n\n if (pr <= 0 || redemption <= 0) {\n return error.num\n }\n\n if (settlement >= maturity) {\n return error.value\n }\n\n let basisVal, diff\n switch (basis) {\n case 0:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, false)\n break\n case 1:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 2:\n basisVal = 360\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 3:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 4:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, true)\n break\n default:\n return error.num\n }\n\n return (((redemption - pr) / redemption) * basisVal) / diff\n}\n\n/**\n * Converts a dollar price, expressed as a fraction, into a dollar price, expressed as a decimal number.\n *\n * Category: Financial\n *\n * @param {*} fractional_dollar A number expressed as an integer part and a fraction part, separated by a decimal symbol.\n * @param {*} fraction The integer to use in the denominator of the fraction.\n * @returns\n */\nexport function DOLLARDE(fractional_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n fractional_dollar = utils.parseNumber(fractional_dollar)\n fraction = utils.parseNumber(fraction)\n\n if (utils.anyIsError(fractional_dollar, fraction)) {\n return error.value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10)\n\n // Compute integer part\n let result = parseInt(fractional_dollar, 10)\n\n // Add decimal part\n result += ((fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10))) / fraction\n\n // Round result\n const power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1)\n result = Math.round(result * power) / power\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Converts a dollar price, expressed as a decimal number, into a dollar price, expressed as a fraction.\n *\n * Category: Financial\n *\n * @param {*} decimal_dollar A decimal number.\n * @param {*} fraction The integer to use in the denominator of a fraction.\n * @returns\n */\nexport function DOLLARFR(decimal_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n decimal_dollar = utils.parseNumber(decimal_dollar)\n fraction = utils.parseNumber(fraction)\n\n if (utils.anyIsError(decimal_dollar, fraction)) {\n return error.value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10)\n\n // Compute integer part\n let result = parseInt(decimal_dollar, 10)\n\n // Add decimal part\n result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Returns the effective annual interest rate.\n *\n * Category: Financial\n *\n * @param {*} nominal_rate The nominal interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nexport function EFFECT(nominal_rate, npery) {\n nominal_rate = utils.parseNumber(nominal_rate)\n npery = utils.parseNumber(npery)\n\n if (utils.anyIsError(nominal_rate, npery)) {\n return error.value\n }\n\n // Return error if rate <=0 or periods < 1\n if (nominal_rate <= 0 || npery < 1) {\n return error.num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10)\n\n // Return effective annual interest rate\n return Math.pow(1 + nominal_rate / npery, npery) - 1\n}\n\n/**\n * Returns the future value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes. If pmt is omitted, you must include the pv argument.\n * @param {*} pv Optional. The present value, or the lump-sum amount that a series of future payments is worth right now. If pv is omitted, it is assumed to be 0 (zero), and you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nexport function FV(rate, nper, payment, value, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n value = value || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n payment = utils.parseNumber(payment)\n value = utils.parseNumber(value)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, payment, value, type)) {\n return error.value\n }\n\n // Return future value\n let result\n\n if (rate === 0) {\n result = value + payment * nper\n } else {\n const term = Math.pow(1 + rate, nper)\n\n result =\n type === 1\n ? value * term + (payment * (1 + rate) * (term - 1)) / rate\n : value * term + (payment * (term - 1)) / rate\n }\n\n return -result\n}\n\n/**\n * Returns the future value of an initial principal after applying a series of compound interest rates.\n *\n * Category: Financial\n *\n * @param {*} principal The present value.\n * @param {*} schedule An array of interest rates to apply.\n * @returns\n */\nexport function FVSCHEDULE(principal, schedule) {\n principal = utils.parseNumber(principal)\n schedule = utils.parseNumberArray(utils.flatten(schedule))\n\n if (utils.anyIsError(principal, schedule)) {\n return error.value\n }\n\n const n = schedule.length\n let future = principal\n\n // Apply all interests in schedule\n\n for (let i = 0; i < n; i++) {\n // Apply scheduled interest\n future *= 1 + schedule[i]\n }\n\n // Return future value\n return future\n}\n\n/**\n * Returns the interest payment for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per The period for which you want to find the interest and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nexport function IPMT(rate, per, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, per, nper, pv, fv, type)) {\n return error.value\n }\n\n // Compute payment\n const payment = PMT(rate, nper, pv, fv, type)\n\n // Compute interest\n let interest =\n per === 1\n ? type === 1\n ? 0\n : -pv\n : type === 1\n ? FV(rate, per - 2, payment, pv, 1) - payment\n : FV(rate, per - 1, payment, pv, 0)\n\n // Return interest\n return interest * rate\n}\n\n/**\n * Returns the internal rate of return for a series of cash flows.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers for which you want to calculate the internal rate of return.\n - Values must contain at least one positive value and one negative value to calculate the internal rate of return.\n - IRR uses the order of values to interpret the order of cash flows. Be sure to enter your payment and income values in the sequence you want.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored.\n * @param {*} guess Optional. A number that you guess is close to the result of IRR.\n - Microsoft Excel uses an iterative technique for calculating IRR. Starting with guess, IRR cycles through the calculation until the result is accurate within 0.00001 percent. If IRR can't find a result that works after 20 tries, the #NUM! error value is returned.\n - In most cases you do not need to provide guess for the IRR calculation. If guess is omitted, it is assumed to be 0.1 (10 percent).\n - If IRR gives the #NUM! error value, or if the result is not close to what you expected, try again with a different value for guess.\n * @returns\n */\nexport function IRR(values, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n guess = typeof guess === 'number' ? guess : typeof guess === 'undefined' ? 0.1 : utils.parseNumber(guess)\n\n values = utils.parseNumberArray(utils.flatten(values))\n\n if (utils.anyIsError(values, guess)) {\n return error.value\n }\n\n // Use Float64Array for better performance with numeric operations\n const cashFlows = new Float64Array(values.length)\n\n let positive = false\n let negative = false\n // Single-pass processing of input values\n for (let i = 0; i < values.length; i++) {\n cashFlows[i] = values[i]\n\n if (cashFlows[i] > 0) positive = true\n if (cashFlows[i] < 0) negative = true\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return error.num\n }\n\n // Calculates the npv amount\n const npv = (rate) => {\n if (rate <= -1) rate = -0.999999999\n\n let result = cashFlows[0]\n const r = 1 + rate\n\n // Avoid repeated Math.pow calls by using manual exponentiation\n let factor = 1\n for (let i = 1; i < cashFlows.length; i++) {\n factor *= r\n result += cashFlows[i] / factor\n }\n\n return result\n }\n\n // Memoized NPV to avoid recalculating for the same rates\n const npvCache = new Map()\n const cachedNpv = function (rate) {\n const roundedRate = Math.round(rate * 1e10) / 1e10 // Round to 10 decimal places for caching\n\n if (npvCache.has(roundedRate)) {\n return npvCache.get(roundedRate)\n }\n\n const result = npv(roundedRate)\n npvCache.set(roundedRate, result)\n return result\n }\n // Combined method: Start with Newton-Raphson for speed, then switch to bisection for reliability\n const combinedMethod = function () {\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10\n const maxIterations = 1000\n\n // Phase 1: Newton-Raphson with adaptive step for faster convergence\n let rate = guess\n let prevRate = rate\n let iteration = 0\n\n // Try Newton-Raphson until it shows signs of instability\n while (iteration < maxIterations) {\n // Limit Newton-Raphson attempts\n const currentNpv = cachedNpv(rate)\n\n // Exit early if we're already close enough\n if (Math.abs(currentNpv) < epsMax) {\n return rate\n }\n\n // Check if we're stabilizing\n if (iteration > 0 && Math.abs(rate - prevRate) < epsMax * 10) {\n break\n }\n\n // Calculate approximate derivative using secant method (faster than calculating exact derivative)\n const delta = Math.max(0.0001, Math.abs(rate * 0.0001))\n const derivNpv = (cachedNpv(rate + delta) - currentNpv) / delta\n\n // Exit if derivative is too small (to avoid division by near-zero)\n if (Math.abs(derivNpv) < epsMax) {\n break\n }\n\n // Calculate next rate using Newton step\n prevRate = rate\n const newtonStep = currentNpv / derivNpv\n\n // Limit step size for stability\n const maxStep = Math.max(0.1, Math.abs(rate) * 0.5)\n if (Math.abs(newtonStep) > maxStep) {\n rate -= Math.sign(newtonStep) * maxStep\n } else {\n rate -= newtonStep\n }\n\n // Constrain rate to reasonable values\n if (rate <= -1) rate = -0.99999999\n if (rate > 1000) rate = 1000\n\n iteration++\n }\n\n // Phase 2: Bisection method for reliability\n // Use current Newton result as a starting point\n let npvAtRate = cachedNpv(rate)\n\n // If Newton's method gave a good answer, return it\n if (Math.abs(npvAtRate) < epsMax) {\n return rate\n }\n\n // Otherwise, set up bisection\n let a, b\n\n // Find boundaries where NPV changes sign\n if (npvAtRate > 0) {\n a = rate\n // Find b where npv(b) < 0\n b = rate + 0.1\n while (cachedNpv(b) > 0 && b < 1000) {\n b = b * 2 + 0.1\n }\n if (b >= 1000) return rate // Couldn't find sign change\n } else {\n b = rate\n // Find a where npv(a) > 0\n a = Math.max(-0.99999999, rate - 0.1)\n while (cachedNpv(a) < 0 && a > -0.99999999) {\n a = Math.max(-0.99999999, a - 0.1)\n }\n if (a <= -0.99999999) return rate // Couldn't find sign change\n }\n\n // Perform bisection\n let c\n for (let i = 0; i < maxIterations; i++) {\n c = (a + b) / 2\n const npvC = cachedNpv(c)\n\n if (Math.abs(npvC) < epsMax || Math.abs(b - a) < epsMax) {\n return c\n }\n\n if (npvC * cachedNpv(a) < 0) {\n b = c\n } else {\n a = c\n }\n }\n\n return c\n }\n\n // Execute optimized combined method\n return combinedMethod()\n}\n\n/**\n * Calculates the interest paid during a specific period of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the investment.\n * @param {*} per The period for which you want to find the interest, and must be between 1 and Nper.\n * @param {*} nper The total number of payment periods for the investment.\n * @param {*} pv The present value of the investment. For a loan, Pv is the loan amount.\n *\n * @returns\n */\nexport function ISPMT(rate, per, nper, pv) {\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, per, nper, pv)) {\n return error.value\n }\n\n // Return interest\n return pv * rate * (per / nper - 1)\n}\n\n/**\n * Returns the internal rate of return where positive and negative cash flows are financed at different rates.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers. These numbers represent a series of payments (negative values) and income (positive values) occurring at regular periods.\n - Values must contain at least one positive value and one negative value to calculate the modified internal rate of return. Otherwise, MIRR returns the #DIV/0! error value.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored; however, values with the value zero are included.\n * @param {*} finance_rate The interest rate you pay on the money used in the cash flows.\n * @param {*} reinvest_rate The interest rate you receive on the cash flows as you reinvest them.\n * @returns\n */\nexport function MIRR(values, finance_rate, reinvest_rate) {\n values = utils.parseNumberArray(utils.flatten(values))\n finance_rate = utils.parseNumber(finance_rate)\n reinvest_rate = utils.parseNumber(reinvest_rate)\n\n if (utils.anyIsError(values, finance_rate, reinvest_rate)) {\n return error.value\n }\n\n // Initialize number of values\n const n = values.length\n\n // Lookup payments (negative values) and incomes (positive values)\n const payments = []\n const incomes = []\n\n for (let i = 0; i < n; i++) {\n if (values[i] < 0) {\n payments.push(values[i])\n } else {\n incomes.push(values[i])\n }\n }\n\n // Return modified internal rate of return\n const num = -NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1)\n const den = NPV(finance_rate, payments) * (1 + finance_rate)\n\n return Math.pow(num / den, 1 / (n - 1)) - 1\n}\n\n/**\n * Returns the annual nominal interest rate.\n *\n * Category: Financial\n *\n * @param {*} effect_rate The effective interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nexport function NOMINAL(effect_rate, npery) {\n effect_rate = utils.parseNumber(effect_rate)\n npery = utils.parseNumber(npery)\n\n if (utils.anyIsError(effect_rate, npery)) {\n return error.value\n }\n\n // Return error if rate <=0 or periods < 1\n if (effect_rate <= 0 || npery < 1) {\n return error.num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10)\n\n // Return nominal annual interest rate\n return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery\n}\n\n/**\n * Returns the number of periods for an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function NPER(rate, pmt, pv, fv, type) {\n type = type === undefined ? 0 : type\n fv = fv === undefined ? 0 : fv\n\n rate = utils.parseNumber(rate)\n pmt = utils.parseNumber(pmt)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, pmt, pv, fv, type)) {\n return error.value\n }\n\n if (rate === 0) {\n return -(pv + fv) / pmt\n } else {\n const num = pmt * (1 + rate * type) - fv * rate\n const den = pv * rate + pmt * (1 + rate * type)\n\n return Math.log(num / den) / Math.log(1 + rate)\n }\n}\n\n/**\n * Returns the net present value of an investment based on a series of periodic cash flows and a discount rate.\n *\n * Category: Financial\n *\n * @param {*} rate The rate of discount over the length of one period.\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 254 arguments representing the payments and income.\n - value1, value2, ... must be equally spaced in time and occur at the end of each period.\n - NPV uses the order of value1, value2, ... to interpret the order of cash flows. Be sure to enter your payment and income values in the correct sequence.\n - Arguments that are empty values, logical values, or text representations of numbers, error values, or text that cannot be translated into numbers are ignored.\n - If an argument is an array or reference, only numbers in that array or reference are counted. Empty values, logical values, text, or error values in the array or reference are ignored.\n * @returns\n */\nexport function NPV() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n // Lookup rate\n const rate = args[0]\n\n // Initialize net present value\n let value = 0\n\n // Loop on all values\n for (let j = 1; j < args.length; j++) {\n value += args[j] / Math.pow(1 + rate, j)\n }\n\n // Return net present value\n return value\n}\n\n/**\n * Returns the number of periods required by an investment to reach a specified value.\n *\n * Category: Financial\n *\n * @param {*} rate Rate is the interest rate per period.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the desired future value of the investment.\n * @returns\n */\nexport function PDURATION(rate, pv, fv) {\n rate = utils.parseNumber(rate)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n\n if (utils.anyIsError(rate, pv, fv)) {\n return error.value\n }\n\n // Return error if rate <=0\n if (rate <= 0) {\n return error.num\n }\n\n // Return number of periods\n return (Math.log(fv) - Math.log(pv)) / Math.log(1 + rate)\n}\n\n/**\n * Returns the periodic payment for an annuity.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the loan.\n * @param {*} nper The total number of payments for the loan.\n * @param {*} pv The present value, or the total amount that a series of future payments is worth now; also known as the principal.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 (zero) or 1 and indicates when payments are due.\n * @returns\n */\nexport function PMT(rate, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, pv, fv, type)) {\n return error.value\n }\n\n // Return payment\n let result\n\n if (rate === 0) {\n result = (pv + fv) / nper\n } else {\n const term = Math.pow(1 + rate, nper)\n\n result =\n type === 1\n ? ((fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)) / (1 + rate)\n : (fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)\n }\n\n return -result\n}\n\n/**\n * Returns the payment on the principal for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per Specifies the period and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function PPMT(rate, per, nper, pv, fv, type) {\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, pv, fv, type)) {\n return error.value\n }\n\n return PMT(rate, nper, pv, fv, type) - IPMT(rate, per, nper, pv, fv, type)\n}\n\n/**\n * Returns the price per $100 face value of a discounted security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} discount The security's discount rate.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function PRICEDISC(settlement, maturity, discount, redemption, basis) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n redemption = utils.parseNumber(redemption)\n basis = utils.parseNumber(basis)\n\n basis = basis || 0\n\n if (utils.anyIsError(settlement, maturity, discount, redemption, basis)) {\n return error.value\n }\n\n if (discount <= 0 || redemption <= 0) {\n return error.num\n }\n\n if (settlement >= maturity) {\n return error.value\n }\n\n let basisVal, diff\n switch (basis) {\n case 0:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, false)\n break\n case 1:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 2:\n basisVal = 360\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 3:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 4:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, true)\n break\n default:\n return error.num\n }\n\n return redemption - (discount * redemption * diff) / basisVal\n}\n\n/**\n * Returns the present value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period. For example, if you obtain an automobile loan at a 10 percent annual interest rate and make monthly payments, your interest rate per month is 10%/12, or 0.83%. You would enter 10%/12, or 0.83%, or 0.0083, into the formula as the rate.\n * @param {*} nper The total number of payment periods in an annuity. For example, if you get a four-year car loan and make monthly payments, your loan has 4*12 (or 48) periods. You would enter 48 into the formula for nper.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. For example, the monthly payments on a $10,000, four-year car loan at 12 percent are $263.33. You would enter -263.33 into the formula as the pmt. If pmt is omitted, you must include the fv argument.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). For example, if you want to save $50,000 to pay for a special project in 18 years, then $50,000 is the future value. You could then make a conservative guess at an interest rate and determine how much you must save each month. If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function PV(rate, per, pmt, fv, type) {\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n pmt = utils.parseNumber(pmt)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, per, pmt, fv, type)) {\n return error.value\n }\n\n // Return present value\n return rate === 0\n ? -pmt * per - fv\n : (((1 - Math.pow(1 + rate, per)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, per)\n}\n\n/**\n * Returns the interest rate per period of an annuity.\n *\n * Category: Financial\n *\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. If pmt is omitted, you must include the fv argument.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @param {*} guess Optional. Your guess for what the rate will be. If you omit guess, it is assumed to be 10 percent. If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n - If you omit guess, it is assumed to be 10 percent.\n - If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n * @returns\n */\nexport function RATE(nper, pmt, pv, fv, type, guess) {\n guess = guess === undefined ? 0.1 : guess\n fv = fv === undefined ? 0 : fv\n type = type === undefined ? 0 : type\n\n nper = utils.parseNumber(nper)\n pmt = utils.parseNumber(pmt)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n guess = utils.parseNumber(guess)\n\n if (utils.anyIsError(nper, pmt, pv, fv, type, guess)) {\n return error.value\n }\n\n const epsMax = 1e-10\n const iterMax = 100\n let rate = guess\n\n type = type ? 1 : 0\n\n for (let i = 0; i < iterMax; i++) {\n if (rate <= -1) {\n return error.num\n }\n\n let y, f\n\n if (Math.abs(rate) < epsMax) {\n y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv\n } else {\n f = Math.pow(1 + rate, nper)\n y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv\n }\n\n if (Math.abs(y) < epsMax) {\n return rate\n }\n\n let dy\n\n if (Math.abs(rate) < epsMax) {\n dy = pv * nper + pmt * type * nper\n } else {\n f = Math.pow(1 + rate, nper)\n const df = nper * Math.pow(1 + rate, nper - 1)\n dy = pv * df + pmt * (1 / rate + type) * df + pmt * (-1 / (rate * rate)) * (f - 1)\n }\n\n rate -= y / dy\n }\n\n return rate\n}\n\n/**\n * Returns an equivalent interest rate for the growth of an investment.\n *\n * Category: Financial\n *\n * @param {*} nper Nper is the number of periods for the investment.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the future value of the investment.\n * @returns\n */\nexport function RRI(nper, pv, fv) {\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n\n if (utils.anyIsError(nper, pv, fv)) {\n return error.value\n }\n\n // Return error if nper or present is equal to 0 (zero)\n if (nper === 0 || pv === 0) {\n return error.num\n }\n\n // Return equivalent interest rate\n return Math.pow(fv / pv, 1 / nper) - 1\n}\n\n/**\n * Returns the straight-line depreciation of an asset for one period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @returns\n */\nexport function SLN(cost, salvage, life) {\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n\n if (utils.anyIsError(cost, salvage, life)) {\n return error.value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num\n }\n\n // Return straight-line depreciation\n return (cost - salvage) / life\n}\n\n/**\n * Returns the sum-of-years' digits depreciation of an asset for a specified period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} per The period and must use the same units as life.\n * @returns\n */\nexport function SYD(cost, salvage, life, per) {\n // Return error if any of the parameters is not a number\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n per = utils.parseNumber(per)\n\n if (utils.anyIsError(cost, salvage, life, per)) {\n return error.value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num\n }\n\n // Return error if period is lower than 1 or greater than life\n if (per < 1 || per > life) {\n return error.num\n }\n\n // Truncate period if it is not an integer\n per = parseInt(per, 10)\n\n // Return straight-line depreciation\n return ((cost - salvage) * (life - per + 1) * 2) / (life * (life + 1))\n}\n\n/**\n * Returns the bond-equivalent yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nexport function TBILLEQ(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return (365 * discount) / (360 - discount * dateTime.DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the price per $100 face value for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nexport function TBILLPRICE(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return 100 * (1 - (discount * dateTime.DAYS360(settlement, maturity, false)) / 360)\n}\n\n/**\n * Returns the yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} pr The Treasury bill's price per $100 face value.\n * @returns\n */\nexport function TBILLYIELD(settlement, maturity, pr) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n pr = utils.parseNumber(pr)\n\n if (utils.anyIsError(settlement, maturity, pr)) {\n return error.value\n }\n\n // Return error if price is lower than or equal to zero\n if (pr <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return ((100 - pr) * 360) / (pr * dateTime.DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. Dates may occur in any order. Dates should be entered by using the DATE function, or as results of other formulas or functions. For example, use DATE(2008,5,23) for the 23rd day of May, 2008. Problems can occur if dates are entered as text. .\n * @param {*} guess Optional. A number that you guess is close to the result of XIRR.\n * @returns\n */\nexport function XIRR(values, dates, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n values = utils.parseNumberArray(utils.flatten(values))\n dates = utils.parseDateArray(utils.flatten(dates))\n guess = utils.parseNumber(guess)\n\n if (utils.anyIsError(values, dates, guess)) {\n return error.value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1\n let result = values[0]\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, dateTime.DAYS(dates[i], dates[0]) / 365)\n }\n\n return result\n }\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1\n let result = 0\n\n for (let i = 1; i < values.length; i++) {\n const frac = dateTime.DAYS(dates[i], dates[0]) / 365\n result -= (frac * values[i]) / Math.pow(r, frac + 1)\n }\n\n return result\n }\n\n // Check that values contains at least one positive value and one negative value\n let positive = false\n let negative = false\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > 0) {\n positive = true\n }\n\n if (values[i] < 0) {\n negative = true\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return error.num\n }\n\n // Initialize guess and resultRate\n guess = guess || 0.1\n let resultRate = guess\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10\n\n // Implement Newton's method\n let newRate, epsRate, resultValue\n let contLoop = true\n\n do {\n resultValue = irrResult(values, dates, resultRate)\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate)\n epsRate = Math.abs(newRate - resultRate)\n resultRate = newRate\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Returns the net present value for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} rate The discount rate to apply to the cash flows.\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they may occur in any order.\n * @returns\n */\nexport function XNPV(rate, values, dates) {\n rate = utils.parseNumber(rate)\n values = utils.parseNumberArray(utils.flatten(values))\n dates = utils.parseDateArray(utils.flatten(dates))\n\n if (utils.anyIsError(rate, values, dates)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = 0; i < values.length; i++) {\n result += values[i] / Math.pow(1 + rate, dateTime.DAYS(dates[i], dates[0]) / 365)\n }\n\n return result\n}\n"," export const CHAIN_ID_MAP = {\n ethereum: 1,\n gnosis: 100,\n base: 8453,\n };\n\n export const BLOCKSCOUT_CHAINS_MAP = {\n ethereum: 'https://eth.blockscout.com',\n gnosis: 'https://gnosis.blockscout.com',\n arbitrum: 'https://arbitrum.blockscout.com',\n optimism: 'https://optimism.blockscout.com',\n soneium: 'https://soneium.blockscout.com',\n unichain: 'https://unichain.blockscout.com'\n}\n\nexport const SAFE_CHAIN_MAP = {\n ethereum: 'eth',\n gnosis: 'gno',\n};\n\nexport const ERROR_MESSAGES_FLAG = {\n INVALID_API_KEY: '_INVALID_KEY',\n RATE_LIMIT: '_RATE_LIMIT_REACHED',\n DEFAULT: 'FETCH_ERROR',\n MISSING_KEY: '_MISSING',\n INVALID_CHAIN: '_INVALID_CHAIN',\n INVALID_TYPE: '_INVALID_TYPE',\n INVALID_ADDRESS: '_INVALID_ADDRESS',\n INVALID_PARAM: '_INVALID_PARAM'\n}\n\nexport const UTILITY = {\n ALCHEMY_API_KEY: 'ALCHEMY_API_KEY'\n}","export const SERVICE_API_KEY = {\n Etherscan: \"ETHERSCAN_API_KEY\",\n Coingecko: \"COINGECKO_API_KEY\",\n Safe: \"SAFE_API_KEY\",\n Basescan: \"BASESCAN_API_KEY\",\n Gnosisscan: \"GNOSIS_API_KEY\",\n Firefly: \"FIRE_FLY_API_KEY\",\n GnosisPay: 'GNOSIS_API_KEY'\n}\n\nexport const FUNCTION_LOCALE = [\n{\n API_KEY: SERVICE_API_KEY.Firefly,\n LOGO: \"https://firefly.social/android-chrome-192x192.png\",\n BRAND_COLOR: \"#f8f5fc\",\n BRAND_SECONDARY_COLOR: \"#855dcd\",\n n: \"FIREFLY\",\n t: 20,\n d: \"Fetches content from Farcaster or Lens.\",\n a: \"Retrieves posts, replies, or channels from Farcaster and Lens by usernames, IDs, or hashes.\",\n p: [\n {\n name: \"platform\",\n detail: \"The social platform to query. Supports 'farcaster' or 'lens'.\",\n example: `\"farcaster\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"contentType\",\n detail: \"Type of content to fetch. Supports 'posts', 'replies', and 'channels' (channels only for 'farcaster').\",\n example: `\"posts\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"identifier\",\n detail: \"Comma-separated usernames, IDs, or post hashes depending on platform and contentType.\",\n example: `\"toka,miroyato\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"start\",\n detail: \"Pagination start index (default is 0).\",\n example: `0`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"end\",\n detail: \"Pagination end index (default is 10).\",\n example: `10`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n\n {\n API_KEY: SERVICE_API_KEY.Neynar,\n LOGO: \"https://framerusercontent.com/images/OS5YeZ2Y7DmszAxL6Zf06pXtKzc.svg\",\n BRAND_COLOR: \"##e8e6ff\",\n BRAND_SECONDARY_COLOR: \"#28204A\",\n n: \"NEYNAR\",\n t: 20,\n d: \"Fetches followers for a given Farcaster FID using Neynar's API.\",\n a: \"Retrieves followers of a Farcaster user, with support for sorting, pagination, and optional viewer context.\",\n p: [\n {\n name: \"fid\",\n detail: \"The Farcaster FID of the user whose followers should be fetched.\",\n example: `123`,\n require: \"m\",\n type: \"number\"\n },\n {\n name: \"viewerFid\",\n detail: \"FID of the viewer, to include contextual info like mutual follows (optional).\",\n example: `456`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"sortType\",\n detail: \"Sorting type: either 'desc_chron' (default) or 'algorithmic'.\",\n example: `\"desc_chron\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"limit\",\n detail: \"Number of followers to return (max 100).\",\n example: `20`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"cursor\",\n detail: \"Cursor string for paginating the result set.\",\n example: `\"eyJvZmZzZXQiOjIwLCJsYXN0SWQiOjEyMzQ1Nn0=\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Basescan,\n LOGO: \"https://2064089921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FevP3L0cUvP9xmRefuzCm%2Fuploads%2F2K1pvFsE7JAfcI3LAxYl%2Fbase-logo-in-blue.webp?alt=media&token=32c80439-dbdc-432a-b199-220e012efc3c\",\n BRAND_COLOR: \"#f1f5ff\",\n BRAND_SECONDARY_COLOR: \"#2752ff\",\n n: \"BASESCAN\",\n t: 20,\n d: \"Fetches Base network data via Basescan: native txns, ERC-20 transfers, ERC-721 transfers, and gas metrics.\",\n a: \"Pulls on-chain activity for Base (chainid 8453) using Basescan’s API — supports full tx history, token/NFT transfers, gas prices, and pagination.\",\n p: [\n {\n name: \"type\",\n detail: \"Data category: 'all-txns' | 'token-txns' | 'nft-txns' | 'gas'.\",\n example: `\"token-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"Must be 'base'.\",\n example: `\"base\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"Target wallet address (only required for txns, token, and nft queries). Not needed for 'gas'.\",\n example: `\"0x7FD624f3f97A7dd36195E8379F28dB6147C270ff\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Start date (used to resolve block range). Optional, only applies to txns.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"End date (used to resolve block range). Optional, only applies to txns.\",\n example: `\"07/07/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"page\",\n detail: \"Page number for paginated results. Only applies to txns/token/nft queries.\",\n example: `1`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Number of items per page (limit). Only applies to txns/token/nft queries.\",\n example: `2`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n{\n API_KEY: SERVICE_API_KEY.Gnosisscan,\n LOGO: \"https://gnosisscan.io/assets/generic/html/favicon-light.ico\",\n BRAND_COLOR: \"#f6f7f6\",\n BRAND_SECONDARY_COLOR: \"#133629\",\n n: \"GNOSISSCAN\",\n t: 20,\n d: \"Fetches Gnosis Chain data via Gnosisscan: native transactions, ERC-20 token transfers, ERC-721 NFT transfers, and gas metrics.\",\n a: \"Queries Gnosis Chain (chainid 100) through Gnosisscan’s API to return transaction history, token/NFT transfers, or gas price information. Supports pagination and time-based filtering for transaction types.\",\n p: [\n {\n name: \"type\",\n detail: \"Data category to fetch. Options: 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"nft-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"Must be 'gnosis'.\",\n example: `\"gnosis\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"Wallet address to query. Required for all types except 'gas'.\",\n example: `\"0x90830Ed558f12D826370DC52E9D87947A7F18De9\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to resolve starting block for txns.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to resolve ending block for txns.\",\n example: `\"14/06/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"page\",\n detail: \"Page number for paginated transaction results. Applies only to 'txns', 'token-txns', and 'nft-txns'.\",\n example: `\"1\"`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Number of results per page (limit). Applies only to 'txns', 'token-txns', and 'nft-txns'.\",\n example: `\"50\"`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n {\n LOGO: 'https://cdn.prod.website-files.com/65f94dfd53db8b337c808067/68485baa72714ae58f350ce2_bs-logo.png',\n BRAND_COLOR: '#f8f8fd',\n BRAND_SECONDARY_COLOR: '#5353D3',\n n: 'BLOCKSCOUT',\n t: 20,\n d: 'Returns the onchain information about an address on a provided blockchain. By default on Ethereum mainnet.',\n a: 'Returns the onchain information about an address on a provided blockchain. By default on Ethereum mainnet.',\n p: [\n {\n name: 'address',\n detail: 'The address string representing the addresses to check for balance',\n example: `\"vitalik.eth\"`,\n require: 'm',\n type: 'string'\n },\n {\n name: 'type',\n detail: 'The type of data to query.',\n example: `\"txns\"`,\n require: 'm',\n type: 'string'\n },\n {\n name: 'chain',\n detail: 'The blockchain to query. By default on Ethereum mainnet.',\n example: `\"ethereum\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'startTimestamp',\n detail: 'Start date marking the start of the transaction search range. Work with type === \"txns\"',\n example: `\"01/01/2023\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'endTimestamp',\n detail: 'End date marking the end of the transaction search range. Work with type === \"txns\"',\n example: `\"01/05/2024\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'page',\n detail: 'The page number to return. Work with type === \"txns\"',\n example: '1',\n require: 'o',\n repeat: 'n',\n type: 'rangenumber'\n },\n {\n name: 'offset',\n detail: 'The number of transactions to return per page. Work with type === \"txns\"',\n example: '2',\n require: 'o',\n repeat: 'n',\n type: 'rangenumber'\n }\n ]\n },\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://etherscan.io/images/favicon3.ico\",\n BRAND_COLOR: \"#F6F7F8\",\n BRAND_SECONDARY_COLOR: \"#21325B\",\n n: \"ETHERSCAN\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://etherscan.io/images/favicon3.ico\",\n BRAND_COLOR: \"#F6F7F8\",\n BRAND_SECONDARY_COLOR: \"#21325B\",\n n: \"EOA\",\n t: 20,\n d: \"Fetches address data like transactions, balances, or portfolio info from multiple supported chains.\",\n a: \"Dynamically queries blockchain data such as transactions and balances by resolving time ranges to block ranges and supporting pagination.\",\n p: [\n {\n name: \"addresses\",\n detail: \"One or more addresses (comma-separated) to query.\",\n example: `\"vitalik.eth\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"categories\",\n detail: `Type of data to fetch. Supported values: \"txns\", \"balance\".`,\n example: `\"txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: `Blockchain network(s) to query. Supported values: \"ethereum\", \"gnosis\", \"base\". Accepts comma-separated values.`,\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"startTime\",\n detail: \"Used to calculate starting block for transaction queries.\",\n example: \"01/01/2024\",\n require: \"m\",\n type: \"rangenumber\"\n },\n {\n name: \"endTime\",\n detail: \"Used to calculate ending block for transaction queries.\",\n example: \"01/06/2024\",\n require: \"m\",\n type: \"rangenumber\"\n },\n {\n name: \"page\",\n detail: \"The page number for paginated transaction results. Only used when category is 'txns'. Default is 1\",\n example: \"1\",\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"The number of results to return per page (limit). Only used when category is 'txns'. Default is 10\",\n example: \"10\",\n require: \"o\",\n type: \"number\"\n }\n ],\n}\n,\n{\n LOGO: 'https://files.readme.io/06394e687778e238a6cd43de6e1d7d339043aa50054703f64606369352ef1864-VariantCG-Symbol-Color.png',\n BRAND_COLOR: '#f8fdf8',\n BRAND_SECONDARY_COLOR: '#4bc63d',\n n: 'COINGECKO',\n t: 20,\n API_KEY: SERVICE_API_KEY.Coingecko,\n d: 'Query crypto prices, ecosystem market data, stablecoins, or derivatives from CoinGecko.',\n a: 'Supports querying: \"price\" for specific tokens \"market\" for ecosystem categories (ETH, BASE, SOL, GNOSIS, HYPERLIQUID, BITCOIN, PUMP)\\n- \"stablecoins\" for stablecoin categories like \"crypto-backed-stablecoin\"\\n- \"derivatives\" globally or per exchange.\\nPagination is supported for all except single-exchange derivatives.',\n p: [\n {\n name: 'category',\n detail: 'Query type: \"price\", \"market\", \"stablecoins\", or \"derivatives\".',\n example: `\"stablecoins\"`,\n require: 'm'\n },\n {\n name: 'param1',\n detail: `For \"price\": coin ID(s). \nFor \"market\": one of [\"eth\", \"base\", \"sol\", \"gnosis\", \"hyperliquid\", \"bitcoin\", \"pump\", \"aiagents\", \"meme\"]. \nFor \"stablecoins\": one of [\"all\", \"crypto-backed-stablecoin\", \"yield-bearing-stablecoins\", etc.]. \nFor \"derivatives\": exchange name (e.g., \"binance_futures\").`,\n example: `\"yield-bearing-stablecoins\"`,\n require: 'o'\n },\n {\n name: 'param2',\n detail: `For \"price\": target currency(ies) (e.g. \"usd\"). \nFor \"market\" and \"stablecoins\": comma-separated price trend keys (e.g. 1h,24h,7d).`,\n example: `\"1h,24h,7d\"`,\n require: 'o'\n },\n {\n name: 'page',\n detail: 'Page number for pagination (applies to \"market\", \"stablecoins\", and global \"derivatives\").',\n example: `1`,\n require: 'o'\n },\n {\n name: 'per_page',\n detail: 'Number of items per page (applies to \"market\", \"stablecoins\", and global \"derivatives\").',\n example: `2`,\n require: 'o'\n }\n ]\n},\n\n // {\n // n: \"FLVURL\",\n // t: 20,\n // d: \"Query the prices of one or more coins by using their unique Coin API IDs, symbols, or names.\",\n // a: \"Query the prices of one or more coins by using their unique Coin API IDs, symbols, or names.\",\n // p: [\n // {\n // name: \"token\",\n // detail:\n // \"coins' IDs, comma-separated if querying more than 1 coin.\",\n // example: `\"bitcoin\"`,\n // require: \"m\",\n // },\n // {\n // name: \"vs_currency\",\n // detail: \"target currency of coins, comma-separated if querying more than 1 currency\",\n // example: `\"usd\"`,\n // require: \"m\",\n // },\n // ],\n // },\n {\n API_KEY: SERVICE_API_KEY.Safe,\n LOGO: \"https://safe-transaction-mainnet.safe.global/static/safe/favicon.png\",\n BRAND_COLOR: \"#ebf9f3\",\n BRAND_SECONDARY_COLOR: \"#00B460\",\n n: \"SAFE\",\n t: 20,\n d: \"Query the list of transactions performed by a Safe address, with optional pagination.\",\n a: \"Query the list of transactions performed by a Safe address, with optional pagination.\",\n p: [\n {\n name: \"address\",\n detail: \"The address to query, in hexadecimal format.\",\n example: `\"0xe9A6378d8FD4983C2999DB0735f258397E8C2253\"`,\n require: \"m\",\n },\n {\n name: \"utility\",\n detail: \"The utility to query, supported values: 'txns'.\",\n example: `\"txns\"`,\n require: \"m\",\n },\n {\n name: \"chain\",\n detail: \"The chain to query, supported values: 'ethereum', 'gnosis'.\",\n example: `\"gnosis\"`,\n require: \"m\",\n },\n {\n name: \"limit\",\n detail: \"The number of transactions to return, default is 100.\",\n example: `10`,\n require: \"o\",\n repeat: \"n\",\n },\n {\n name: \"offset\",\n detail: \"The number of transactions to skip, default is 0.\",\n example: `0`,\n require: \"o\",\n repeat: \"n\",\n },\n ],\n },\n {\n n: \"PNL\",\n t: 20,\n d: \"Subtract each element from A column from B column and return the total sum.\",\n a: \"Returns the total of A - B element-wise subtraction across two ranges.\",\n p: [\n {\n name: \"A\",\n detail:\n \"The column or array of values to subtract from B (e.g. cost).\",\n example: \"A1:A10\",\n require: \"m\",\n repeat: \"n\",\n type: \"range\",\n },\n {\n name: \"B\",\n detail:\n \"The column or array of values to subtract A from (e.g. revenue).\",\n example: \"B1:B10\",\n require: \"m\",\n repeat: \"n\",\n type: \"range\",\n },\n ],\n },\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://app.uniswap.org/favicon.png\",\n BRAND_COLOR: \"#fef5fc\",\n BRAND_SECONDARY_COLOR: \"#f50db4\",\n n: \"UNISWAP\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n \n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://avatars.githubusercontent.com/u/47617460?s=200&v=4\",\n BRAND_COLOR: \"#f7f7ff\",\n BRAND_SECONDARY_COLOR: \"#9896ff\",\n n: \"AAVE\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://www.pendle.finance/uploads/wp-content/uploads/2021/12/cropped-Pendle-Logo-quite-small.png\",\n BRAND_COLOR: \"#eafffb\",\n BRAND_SECONDARY_COLOR: \"#47e2c2\",\n n: \"PENDLE\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n\n\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://aerodrome.finance/images/AERO/favicon.ico\",\n BRAND_COLOR: \"#edf3ff\",\n BRAND_SECONDARY_COLOR: \"#2966f0\",\n n: \"AERODROME\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://cdn.prod.website-files.com/6760e87b474d412dfa9a7a68/6760e8ebe8faad5fb985c89a_Frame%201321316795.png\",\n BRAND_COLOR: \"#f6f4ff\",\n BRAND_SECONDARY_COLOR: \"#684ff8\",\n n: \"ARTEMIS\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://aerodrome.finance/images/AERO/favicon.ico\",\n BRAND_COLOR: \"#effdfb\",\n BRAND_SECONDARY_COLOR: \"#5eead4\",\n n: \"KAITO\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n\n{\n API_KEY: SERVICE_API_KEY.GnosisPay,\n LOGO: \"https://gnosisscan.io/assets/generic/html/favicon-light.ico\",\n BRAND_COLOR: \"#f6f7f6\",\n BRAND_SECONDARY_COLOR: \"#133629\",\n n: \"GNOSISPAY\",\n t: 20,\n d: \"Fetches Gnosis Pay card transaction history, including merchant, amount, and currency info.\",\n a: \"Retrieves card transactions from Gnosis Pay’s API for a specific card ID, filtered by date range and paginated via limit/offset.\",\n p: [\n {\n name: \"cardId\",\n detail: \"The Gnosis Pay card ID to fetch transactions for.\",\n example: `\"card_9f8f8b3a56\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Filters transactions created after this date.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Filters transactions created before this date.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"limit\",\n detail: \"Number of transactions to return per page.\",\n example: `\"20\"`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Offset for pagination (i.e., how many records to skip).\",\n example: `\"0\"`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://avatars.githubusercontent.com/u/129790008?s=48&v=4\",\n BRAND_COLOR: \"#f1f7fc\",\n BRAND_SECONDARY_COLOR: \"#5098d6\",\n n: \"OTTERSCAN\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://www.tally.xyz/favicon.ico\",\n BRAND_COLOR: \"#f9f8ff\",\n BRAND_SECONDARY_COLOR: \"#725bff\",\n n: \"TALLY\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"rangenumber\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"rangenumber\"\n }\n ]\n},\n \n]\n\nexport * from './utils/constants'","import {CHAIN_ID_MAP} from './constants'\n \n export const fromTimeStampToBlock = async (timestamp, chain, apiKey) => {\nif(!timestamp || !chain || !apiKey) return \n const chainId = CHAIN_ID_MAP[chain];\n const url = `https://api.etherscan.io/v2/api?module=block&action=getblocknobytime&timestamp=${timestamp}&closest=before&apikey=${apiKey}&chainId=${chainId}`;\n const res = await fetch(url);\n const json = await res.json();\n return parseInt(json.result);\n\n };","export function toTimestamp(dateStr) {\n // Expecting format: \"DD/MM/YYYY\"\n const [day, month, year] = dateStr.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n return Math.floor(date.getTime() / 1000); // Unix timestamp in seconds\n}","export const isAddress = (input) => {\n return (/^0x[a-fA-F0-9]{40}$/.test(input)) \n}","import {UTILITY} from './constants'\n\n\nexport async function fromEnsNameToAddress(name) {\n if (typeof ethers === \"undefined\") {\n await new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://cdn.jsdelivr.net/npm/ethers@6.10.0/dist/ethers.umd.min.js\";\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n }\n\n const ALCHEMY_KEY = window.localStorage.getItem(UTILITY.ALCHEMY_API_KEY);\n if(!ALCHEMY_KEY){\n console.error(\"alchemy api key missing\")\n return null\n }\n const provider = new ethers.AlchemyProvider(\"mainnet\", ALCHEMY_KEY);\n\n try {\n const resolved = await provider.resolveName(name); // ENS ➝ address\n return resolved || null;\n } catch (err) {\n console.error(\"ENS resolution failed:\", err.message);\n return null;\n }\n}","import {fromTimeStampToBlock} from './from-timestamp-to-block'\nimport {CHAIN_ID_MAP, ERROR_MESSAGES_FLAG} from './constants'\nimport {SERVICE_API_KEY} from '../crypto-constants'\nimport {toTimestamp} from './toTimestamp'\nimport { isAddress } from './is-address';\nimport { fromEnsNameToAddress } from './from-ens-name-to-address';\n\n\n\nexport async function handleScanRequest({\n scanKey,\n baseUrl,\n type,\n chain,\n address,\n startDate,\n endDate,\n page = 1,\n offset = 10,\n}) {\n const API_KEY = window.localStorage.getItem(scanKey);\n if (!API_KEY) return `${scanKey}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n if (API_KEY === 'xxxx') return `${scanKey}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n\n let chainId = CHAIN_ID_MAP[chain?.toLowerCase()];\n if (!chainId) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_CHAIN}`;\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const ACTION_MAP = {\n 'all-txns': 'txlist',\n 'token-txns': 'tokentx',\n 'nft-txns': 'tokennfttx',\n 'gas': 'gastracker',\n };\n\n const action = ACTION_MAP[type];\n if (!action) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_TYPE}`;\n\n\n if (scanKey === SERVICE_API_KEY.Basescan) chainId = 'base';\nif (scanKey === SERVICE_API_KEY.Gnosisscan) chainId = 'gnosis';\n\n let url = `${baseUrl}?chainid=${chainId}&module=account&action=${action}&apikey=${API_KEY}`;\n\n if (['all-txns', 'token-txns', 'nft-txns'].includes(type)) {\n if (!address) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_ADDRESS}`;\n url += `&address=${address}&startblock=0&endblock=99999999&sort=asc`;\n\n if (!isNaN(startDate) && !isNaN(endDate)) {\n const [startBlock, endBlock] = await Promise.all([\n fromTimeStampToBlock(toTimestamp(startDate), chain, API_KEY),\n fromTimeStampToBlock(toTimestamp(endDate), chain, API_KEY),\n ]);\n url += `&startblock=${startBlock}&endblock=${endBlock}`;\n }\n url += `&page=${page}&offset=${offset}`;\n }\n\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP error: ${res.status}`);\n const json = await res.json();\n\n if (typeof json.result === 'string') {\n if (json.result.includes('Invalid API Key')) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n if (json.result.includes('Max rate limit reached')) return `${scanKey}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n }\n\n return json.result;\n } catch (err) {\n console.error(`[${scanKey}]`, err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n","import { SERVICE_API_KEY } from \"./crypto-constants\";\nimport {fromTimeStampToBlock} from './utils/from-timestamp-to-block'\nimport {CHAIN_ID_MAP, BLOCKSCOUT_CHAINS_MAP, SAFE_CHAIN_MAP, ERROR_MESSAGES_FLAG} from './utils/constants'\nimport { handleScanRequest } from \"./utils/handle-explorer-request\";\nimport {toTimestamp} from './utils/toTimestamp'\nimport {isAddress} from './utils/is-address'\nimport { fromEnsNameToAddress } from \"./utils/from-ens-name-to-address\";\n\n\n\n\nexport async function FIREFLY(platform, contentType, identifier, start = 0, end = 10) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Firefly);\n if (!API_KEY) return `${SERVICE_API_KEY.Firefly}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const baseUrl = \"https://openapi.firefly.land/v1/fileverse/fetch\";\n const headers = { \"x-api-key\": API_KEY };\n\n const typeMap = {\n farcaster: {\n posts: \"farcasterid\",\n replies: \"farcasterpostid\",\n channels: \"farcasterchannels\",\n },\n lens: {\n posts: \"lensid\",\n replies: \"lenspostid\",\n }\n };\n\n const platformType = typeMap[platform]?.[contentType];\n if (!platformType) return `${SERVICE_API_KEY.Firefly}${ERROR_MESSAGES_FLAG.INVALID_TYPE}`;\n\n const query = identifier\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n .join(\",\");\n\n const url = new URL(baseUrl);\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"type\", platformType);\n url.searchParams.set(\"start\", String(start));\n url.searchParams.set(\"end\", String(end));\n\n try {\n const res = await fetch(url.toString(), { headers });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const json = await res.json();\n if (!Array.isArray(json?.data)) return [];\n\n return json.data.map(item => {\n const flat = {};\n for (const [key, value] of Object.entries(item)) {\n if (typeof value !== \"object\" || value === null) {\n flat[key] = value;\n }\n }\n flat.platform = platform;\n return flat;\n });\n\n } catch (err) {\n console.error(\"FIREFLY fetch error:\", err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\n\n\nexport async function BLOCKSCOUT(address, type, chain, startTimestamp, endTimestamp, page, offset) {\n if (!chain) {\n chain = 'ethereum'\n }\n\n if (!type) {\n return 'TYPE_MISSING'\n }\n\n if (!startTimestamp) {\n const currentTimestamp = Date.now()\n startTimestamp = currentTimestamp - 30 * 24 * 60 * 60 * 1000\n startTimestamp = Math.floor(startTimestamp / 1000)\n }\n\n if(isNaN(startTimestamp)){\n startTimestamp = toTimestamp(startTimestamp)\n }\n\n\n if(isNaN(endTimestamp) && endTimestamp){\n endTimestamp = toTimestamp(endTimestamp)\n }\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const hostname = BLOCKSCOUT_CHAINS_MAP[chain]\n\n let requestUrl\n\n switch (type) {\n case 'stat':\n requestUrl = `${hostname}/api/v2/addresses/${address}/counters`\n break\n case 'txns':\n requestUrl = `${hostname}/api?module=account&action=txlist&address=${address}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}&page=${page}&offset=${offset}&sort=asc`\n break\n case 'tokens':\n requestUrl = `${hostname}/api?module=account&action=tokenlist&address=${address}`\n break\n default:\n return 'INVALID_TYPE'\n }\n try {\n const response = await fetch(requestUrl)\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`)\n }\n const json = await response.json()\n\n console.log(json)\n if (json?.result?.includes('Invalid parameter(s)')) {\n return `INVALID_REQUEST_PARAMS`\n }\n if (json?.result?.includes('Not found')) {\n return `ADDRESS_NOT_FOUND`\n }\n\n if (type === 'stat') {\n /*\n For type === \"stat\"\n [{transactions_count: \"2940\",token_transfers_count: \"8346015\",gas_usage_count: \"91296738\",validations_count: \"0\"}]\n */\n return [json]\n }\n\n /*\n For type === \"tokens\"\n [{balance: \"287933140055877783279\",contractAddress: \"0x0000019226b5a2e87714daebde6a21e67fa88787\",decimals: \"18\",name: \"Doge King\",symbol: \"DOGEK\",type: \"ERC-20\"}]\n\n For type === \"txns\"\n [{blockNumber: '65204', timeStamp: '1439232889', blockHash: '0x3c3c3c3c', nonce: '0',....}]\n */\n return json.result\n } catch (error) {\n return 'ERROR IN FETCHING'\n }\n}\n\nexport async function BASESCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Basescan,\n baseUrl: 'https://api.basescan.org/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page,\n offset:limit\n });\n}\nexport async function GNOSISSCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Gnosisscan,\n baseUrl: 'https://api.gnosisscan.io/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page, \n offset:limit\n });\n}\n\nexport async function NEYNAR( \n fid, \n viewerFid, \n sortType, \n limit, \n cursor \n) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Neynar);\n if (!API_KEY) return `${SERVICE_API_KEY.Neynar}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n\n const url = new URL('https://api.neynar.com/v2/farcaster/followers');\n url.searchParams.set('fid', fid.toString());\n url.searchParams.set('sort_type', sortType);\n url.searchParams.set('limit', limit.toString());\n if (viewerFid !== null) url.searchParams.set('viewer_fid', viewerFid.toString());\n if (cursor) url.searchParams.set('cursor', cursor);\n\n try {\n const response = await fetch(url.toString(), {\n headers: {\n 'x-api-key': API_KEY,\n 'x-neynar-experimental': 'false'\n }\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const json = await response.json();\n if (!json?.users?.length) return [];\n\n return json.users.map(({ user }) => ({\n username: user.username,\n custody_address: user.custody_address,\n follower_count: user.follower_count,\n country: user.profile?.location?.address?.country || '',\n city: user.profile?.location?.address?.city || ''\n }));\n } catch (err) {\n console.error('NEYNAR_FETCH_FOLLOWERS error:', err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\nexport async function GNOSISPAY({\n cardId,\n startDate,\n endDate,\n limit = 20,\n offset = 0,\n}) {\n const apiKeyKey = SERVICE_API_KEY.GnosisPay\n const API_KEY = window.localStorage.getItem(apiKeyKey);\n if (!API_KEY) return `${apiKeyKey}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n if (!cardId) return `${apiKeyKey}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n\n const url = new URL(`https://api.gnosispay.com/cards/${cardId}/transactions`);\n url.searchParams.set('limit', limit.toString());\n url.searchParams.set('offset', offset.toString());\n\n if (!isNaN(toTimestamp(startDate))) {\n url.searchParams.set('startDate', new Date(startDate * 1000).toISOString());\n }\n\n if (!isNaN(toTimestamp(endDate))) {\n url.searchParams.set('endDate', new Date(endDate * 1000).toISOString());\n }\n\n try {\n const res = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${API_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`);\n\n const json = await res.json();\n\n if (!Array.isArray(json)) return [];\n\n return json.map(tx => ({\n createdAt: tx.createdAt,\n clearedAt: tx.clearedAt,\n country: tx.country,\n merchant: tx.merchant,\n billingAmount: tx.billingAmount,\n billingCurrency: tx.billingCurrency,\n transactionAmount: tx.transactionAmount,\n transactionCurrency: tx.transactionCurrency,\n transactionType: tx.transactionType,\n kind: tx.kind,\n status: tx.status || null,\n mcc: tx.mcc,\n }));\n } catch (err) {\n console.error('GNOSISPAY_CARD_TXNS error:', err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\nexport async function ETHERSCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Etherscan,\n baseUrl: 'https://api.etherscan.io/v2/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page, \n offset:limit\n });\n}\n\n\nexport async function COINGECKO(category, param1, param2, page = 1, perPage = 2) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Coingecko);\n if (!API_KEY) return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const headers = {\n accept: 'application/json',\n 'x-cg-demo-api-key': API_KEY,\n };\n\n let url = '';\n const lowerCategory = (category || '').toLowerCase();\n\n switch (lowerCategory) {\n case 'price': {\n const token = param1;\n const vsCurrencies = param2;\n if (!token || !vsCurrencies) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n }\n url = `https://api.coingecko.com/api/v3/simple/price?vs_currencies=${vsCurrencies}&ids=${token}`;\n break;\n }\n\n case 'market': {\n const ecosystemMap = {\n eth: 'ethereum-ecosystem',\n base: 'base-ecosystem',\n sol: 'solana-ecosystem',\n gnosis: 'gnosis-chain',\n hyperliquid: 'hyperliquid',\n bitcoin: 'bitcoin-ecosystem',\n pump: 'pump-ecosystem',\n aiagents: 'ai-agents',\n meme: 'meme-token',\n };\n\n const key = param1?.toLowerCase();\n const categoryVal = ecosystemMap[key] || '';\n const trend = param2 ? `&price_change_percentage=${param2}` : '';\n\n url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&include_tokens=top&page=${page}&per_page=${perPage}`;\n if (key && !categoryVal) return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n if (categoryVal) url += `&category=${categoryVal}`;\n if (trend) url += trend;\n break;\n }\n\n case 'stablecoins': {\n const category = !param1 || param1.toLowerCase() === 'all'\n ? 'stablecoins'\n : param1.toLowerCase();\n\n const trend = param2 ? `&price_change_percentage=${param2}` : '';\n url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&category=${category}&order=market_cap_desc&page=${page}&per_page=${perPage}${trend}`;\n break;\n }\n\n case 'derivatives': {\n const exchange = param1;\n if (exchange) {\n url = `https://api.coingecko.com/api/v3/derivatives/exchanges/${exchange}?include_tickers=all`;\n } else {\n url = `https://api.coingecko.com/api/v3/derivatives?page=${page}&per_page=${perPage}`;\n }\n break;\n }\n\n default:\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAMS}`;\n }\n\n try {\n const response = await fetch(url, { method: 'GET', headers });\n const json = await response.json();\n\n if (!response.ok) {\n const message = json?.status?.error_message || '';\n if (message.includes('API Key Missing')) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n }\n if (response.status === 429) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n }\n }\n\n if (lowerCategory === 'price') {\n const output = {};\n for (const [token, prices] of Object.entries(json)) {\n for (const [currency, value] of Object.entries(prices)) {\n const key = `${token.charAt(0).toUpperCase() + token.slice(1)}_${currency.toUpperCase()}`;\n output[key] = value;\n }\n }\n return [output];\n }\n\n const flatArray = Array.isArray(json) ? json : [json];\n return flatArray.map(item => {\n const flat = {};\n for (const [key, value] of Object.entries(item)) {\n if (typeof value !== 'object' || value === null) {\n flat[key] = value;\n }\n }\n return flat;\n });\n } catch (error) {\n console.error(error);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\n\nexport async function EOA(\n addresses,\n category,\n chains,\n startTime,\n endTime,\n page = 1,\n offset = 10,\n) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Etherscan);\n if (!API_KEY) return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const INPUTS = addresses.split(\",\").map(a => a.trim()).filter(Boolean);\n const CHAINS = chains.split(\",\").map(c => c.trim()).filter(Boolean);\n const out = [];\n\n // Map: finalAddress => ENS name (if applicable)\n const ADDRESS_MAP = {};\n\n for (const input of INPUTS) {\n if (isAddress(input)) {\n ADDRESS_MAP[input.toLowerCase()] = null; // it's a direct address\n } else {\n try {\n const resolved = await fromEnsNameToAddress(input); // ENS -> address\n if (resolved) ADDRESS_MAP[resolved.toLowerCase()] = input;\n } catch {\n return `${input}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n }\n }\n }\n\n const ADDRS = Object.keys(ADDRESS_MAP);\n\n for (const chain of CHAINS) {\n const chainId = CHAIN_ID_MAP[chain];\n if (!chainId) return ERROR_MESSAGES_FLAG.UNSUPPORTED_CHAIN;\n\n if (category === \"balance\") {\n for (let i = 0; i < ADDRS.length; i += 20) {\n const slice = ADDRS.slice(i, i + 20).join(\",\");\n const action = ADDRS.length > 1 ? \"balancemulti\" : \"balance\";\n\n const url =\n `https://api.etherscan.io/v2/api?chainid=${chainId}` +\n `&module=account&action=${action}&address=${slice}` +\n `&tag=latest&apikey=${API_KEY}`;\n\n const data = await fetchJSON(url);\n if (typeof data === \"string\") return data;\n\n (Array.isArray(data) ? data : [data]).forEach(r =>\n out.push({\n chain,\n ...r,\n name: ADDRESS_MAP[(r.account || r.address || \"\").toLowerCase()] || null,\n }),\n );\n }\n continue;\n }\n\n if (category === \"txns\") {\n const startBlock = await fromTimeStampToBlock(toTimestamp(startTime), chain, API_KEY);\n const endBlock = await fromTimeStampToBlock(toTimestamp(endTime), chain, API_KEY);\n\n for (const addr of ADDRS) {\n const url =\n `https://api.etherscan.io/v2/api?chainid=${chainId}` +\n `&module=account&action=txlist&address=${addr}` +\n `&startblock=${startBlock}&endblock=${endBlock}` +\n `&page=${page}&offset=${offset}&sort=asc&apikey=${API_KEY}`;\n\n const data = await fetchJSON(url);\n if (typeof data === \"string\") return data;\n\n data.forEach(tx =>\n out.push({\n chain,\n address: addr,\n name: ADDRESS_MAP[addr],\n ...tx,\n }),\n );\n }\n continue;\n }\n\n return ERROR_MESSAGES_FLAG.INVALID_CATEGORY;\n }\n\n return out;\n\n async function fetchJSON(url) {\n try {\n const res = await fetch(url);\n if (!res.ok) return `HTTP_${res.status}`;\n\n const json = await res.json();\n\n if (json.result?.includes?.(\"Invalid API Key\"))\n return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n\n if (json.result?.includes?.(\"Max rate limit reached\"))\n return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n\n if (json.status === \"0\" && json.message !== \"No transactions found\")\n return ERROR_MESSAGES_FLAG.DEFAULT;\n\n return json.result;\n } catch {\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n }\n}\n\nexport async function FLVURL(token, vs_currencies) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve([{ \"Yoo\": \"gotcha\" }]);\n }, 10000);\n });\n}\n\nexport async function SAFE(address, utility, chain, limit, offset) {\n\n if (typeof limit !== 'number' || limit < 0) return 'INVALID_LIMIT';\n if (typeof offset !== 'number' || offset < 0) return 'INVALID_OFFSET';\n if (utility !== 'txns') return 'UTILITY IS NOT SUPPORTED';\n\n const apiKey = window.localStorage.getItem(SERVICE_API_KEY.Safe);\n const chainIdentifier = SAFE_CHAIN_MAP[chain];\n\n if (!apiKey) return `${SERVICE_API_KEY.Safe}_MISSING`;\n if (!chainIdentifier) return 'CHAIN IS NOT SUPPORTED';\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const url = `https://api.safe.global/tx-service/${chainIdentifier}/api/v2/safes/${address}/multisig-transactions?limit=${limit}&offset=${offset}`;\n try {\n const response = await fetch(url,\n {\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n },\n }\n );\n if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`);\n const json = await response.json();\n if (!Array.isArray(json.results)) {\n return \"INVALID API RESPONSE\";\n }\n // remove nested structure from the response\n return json.results.map(({ confirmations, dataDecoded, ...rest }) => rest);\n } catch (e) {\n console.log(e);\n return \"ERROR IN FETCHING\";\n }\n}","import * as errors from './utils/error.js'\nimport * as date from './utils/date.js'\nimport * as symbols from './utils/symbol.js'\n\nexport * from './compatibility.js'\nexport * from './database.js'\nexport * from './date-time.js'\nexport * from './engineering.js'\nexport * from './financial.js'\nexport * from './information.js'\nexport * from './logical.js'\nexport * from './lookup-reference.js'\nexport * from './math-trig.js'\nexport * from './statistical.js'\nexport * from './text.js'\nexport * from \"./crypto.js\"\n\nexport const utils = { errors, symbols, date }\n","import * as error from './utils/error.js'\nimport * as information from './information.js'\nimport * as utils from './utils/common.js'\n\n/**\n * Returns TRUE if all of its arguments are TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function AND() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = true\n }\n\n if (!args[i]) {\n result = false\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value FALSE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function FALSE() {\n return false\n}\n\n/**\n * Specifies a logical test to perform.\n *\n * Category: Logical\n *\n * @param {*} logical_test\n * @param {*} value_if_true\n * @param {*} value_if_false\n *\n * @returns\n */\nexport function IF(logical_test, value_if_true, value_if_false) {\n if (logical_test instanceof Error) {\n return logical_test\n }\n\n value_if_true = arguments.length >= 2 ? value_if_true : true\n\n if (value_if_true === undefined || value_if_true === null) {\n value_if_true = 0\n }\n\n value_if_false = arguments.length === 3 ? value_if_false : false\n\n if (value_if_false === undefined || value_if_false === null) {\n value_if_false = 0\n }\n\n return logical_test ? value_if_true : value_if_false\n}\n\n/**\n * Checks whether one or more conditions are met and returns a value that corresponds to the first TRUE condition.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function IFS() {\n for (let i = 0; i < arguments.length / 2; i++) {\n if (arguments[i * 2]) {\n return arguments[i * 2 + 1]\n }\n }\n\n return error.na\n}\n\n/**\n * Returns a value you specify if a formula evaluates to an error; otherwise, returns the result of the formula.\n *\n * Category: Logical\n *\n * @param {*} value The argument that is checked for an error.\n * @param {*} value_if_error The value to return if the formula evaluates to an error. The following error types are evaluated: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, or #NULL!.\n * @returns\n */\nexport function IFERROR(value, value_if_error) {\n if (information.ISERROR(value)) {\n return value_if_error\n }\n\n return value\n}\n\n/**\n * Returns the value you specify if the expression resolves to #N/A, otherwise returns the result of the expression.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function IFNA(value, value_if_na) {\n return value === error.na ? value_if_na : value\n}\n\n/**\n * Reverses the logic of its argument.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function NOT(logical) {\n if (typeof logical === 'string') {\n return error.value\n }\n\n if (logical instanceof Error) {\n return logical\n }\n\n return !logical\n}\n\n/**\n * Returns TRUE if any argument is TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function OR() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = false\n }\n\n if (args[i]) {\n result = true\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function TRUE() {\n return true\n}\n\n/**\n * Returns a logical exclusive OR of all arguments.\n *\n * Category: Logical\n *\n * @param {*} args logical1, logical2,… Logical 1 is required, subsequent logical values are optional. 1 to 254 conditions you want to test that can be either TRUE or FALSE, and can be logical values, arrays, or references.\n * @returns\n */\nexport function XOR() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = 0\n }\n\n if (args[i]) {\n result++\n }\n }\n\n if (result === error.value) {\n return result\n }\n\n return !!(Math.floor(Math.abs(result)) & 1)\n}\n\n/**\n * Evaluates an expression against a list of values and returns the result corresponding to the first matching value. If there is no match, an optional default value may be returned.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function SWITCH() {\n let result\n\n if (arguments.length > 0) {\n const targetValue = arguments[0]\n const argc = arguments.length - 1\n const switchCount = Math.floor(argc / 2)\n let switchSatisfied = false\n const hasDefaultClause = argc % 2 !== 0\n const defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1]\n\n if (switchCount) {\n for (let index = 0; index < switchCount; index++) {\n if (targetValue === arguments[index * 2 + 1]) {\n result = arguments[index * 2 + 2]\n switchSatisfied = true\n break\n }\n }\n }\n\n if (!switchSatisfied) {\n result = hasDefaultClause ? defaultClause : error.na\n }\n } else {\n result = error.value\n }\n\n return result\n}\n"],"names":["nil","Error","div0","value","ref","name","num","na","error","data","returnSerial","d1900","Date","UTC","serialToDate","serial","utc_days","Math","floor","date_info","fractional_day","total_seconds","seconds","hours","minutes","days","getUTCDate","month","getUTCMonth","getUTCFullYear","dateToSerial","date","addOn","ceil","formatDate","day","String","getDate","padStart","getMonth","year","getFullYear","concat","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","createToken","type","indexOf","analyzeTokens","tokens","literalValue","analyzedTokens","i","length","token","push","test","parseInt","parseFloat","castValueToCorrectType","unshift","parse","expression","expressionLength","cursorIndex","processedValue","processedSymbol","char","charAt","tokenizeExpression","compute","operator","values","result","evaluate","argsToArray","args","arrayEach","array","iteratee","index","arrayValuesToNumbers","arr","el","n","number","parseNumber","fillMatrix","matrix","fill_value","error.value","every","Array","isArray","_toConsumableArray","map","a","j","longestArrayIndex","reduce","acc","longestArrayLength","fill","flatten","arguments","argument","apply","from","isFlat","flattenShallow","b","aIsArray","bIsArray","rest","idx","slice","transpose","col","row","findField","database","title","anyError","anyIsError","cleanFloat","power","round","numbers","filter","parseBool","bool","up","toUpperCase","isNaN","parseDate","d","error.num","match","exec","_match$map2","_slicedToArray","Number","_date$split$map2","split","h","m","_date$split$map2$","s","now","setHours","ampmMatch","_ampmMatch","hour","minute","meridian","parsed","parseDateArray","len","string","parseNumberArray","parseString","toString","anyIsString","applyCriteria","range","shift","criterias","criteriaLength","isMetCondition","valueToTest","criteria","computedResult","tokenizedCriteria","evalExpression.parse","evalExpression.createToken","evalExpression.TOKEN_TYPE_LITERAL","evalExpression.compute","isDefined","arg","ERROR","ISERR","error.ref","error.div0","error.name","error.nil","isFinite","ISERROR","error.na","ISLOGICAL","ISNUMBER","ISTEXT","TYPE","error_val","error.data","module","exports","jStat","undefined","prototype","Object","calcRdx","val","pow","log","LOG10E","call","isFunction","isNumber","toVector","_init","retZero","retOne","retIdent","fn","this","seq","toArray","constructor","utils","_random_fn","random","setRandom","TypeError","extend","obj","rows","cols","dimensions","rowa","submat","arange","forEach","ind","column","cola","diag","nrow","res","antidiag","objArr","func","toAlter","ncol","cumreduce","alter","create","zeros","ones","rand","identity","symmetric","size","clear","min","max","cnt","hival","step","current","start","end","rl","_slice","list","copy","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","t","jProto","sort","splice","funcs","passfunc","results","self","setTimeout","ascNum","clip","sum","sumsqrd","sumsqerr","tmp","mean","sumrow","product","prod","low","high","unique","hash","_arr","meansqerr","geomean","logs","meanOfLogs","exp","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","count","mode","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","samples","deviation","dev","stdev","sqrt","pooledstdev","meandev","abs","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","p","aleph","k","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","frac","percentileOfScore","score","kind","counter","strict","histogram","binCnt","first","binWidth","bins","covariance","arr1","arr2","u","v","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","x","xx","y","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","z","yi","q","fact","xden","xnum","Infinity","sin","gammap","lowRegGamma","an","aln","ap","del","c","ITMAX","NaN","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","a1","EPS","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","a2","oalph","betinc","eps","c9","a0","b0","m9","laplaceSign","tukeyWprob","rr","cc","nleg","ihalf","C1","C2","C3","bb","wlar","wincr1","wincr2","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","tukeyQinv","p0","q0","p1","q1","p2","q2","p3","q3","p4","q4","c1","c2","c4","c5","vmax","ps","f","_a","_b","_c","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","lognormal","noncentralt","ncp","tol","studentt","min_iterations","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","negbin","r","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","l","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","cos","laplace","tukey","nmeans","df","nlegq","ihalfq","eps1","eps2","dhaf","dquar","deigh","dlarg","ulen1","ulen2","ulen3","ulen4","xlegq","alegq","ulen","f2","f2lf","f21","ff4","ans","otsum","twa1","t1","maxiter","x1","valx0","valx1","iter","isUsable","add","subtract","divide","multiply","nrescols","rescols","outer","dot","left","right","norm","nnorm","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","sign","gauss_elimination","maug","pivot","temp","y2","maxrow","triaUpSolve","parts","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","qr2","lstsq","R_I","I","Aj","cAi","Ij","cIi","qr_solve","array_mode","Q","attrs","Q1","RI","Q2","jacobi","maxim","theta","condition","e","ev","rungekutta","t_j","u_j","order","k1","k2","k3","romberg","h1","g","richardson","X","pos","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","D","temp2","Y","Bt","C","Vt","differenceOfProportions","n1","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","sub_regress","exog","var_count","endog_index","exog_index","ols","endog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","model","subModelList","sigmaHat","seBetaHat","mod","tStatistic","pValue","leftppf","interval95","se","F_test","F_statistic","ols_wrap","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","inner","matrixsubtract","factory","UNIQUE","hasElement","element","VLOOKUP","lookup_value","table_array","col_index_num","range_lookup","exactMatchOnly","isNumberLookup","lookupValue","toLowerCase","rowValue","localeCompare","CHAR","utils.parseNumber","fromCharCode","CODE","text","utils.anyIsError","charCodeAt","CONCATENATE","utils.flatten","someError","utils.anyError","trueFound","falseFound","join","CONCAT","FIXED","decimals","no_commas","toFixed","replace","REPT","number_times","utils.parseString","UNICHAR","UNICODE","AVERAGE","flatArgumentsDefined","utils.isDefined","utils.numbers","AVERAGEA","BETA","cumulative","probability","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","mathTrig.COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","xsqr","Pi","ChiSq","CONFIDENCE","COUNT","COUNTA","flatArguments","COUNTBLANK","blanks","NORM","standard_dev","COVARIANCE","P","array1","array2","utils.parseNumberArray","S","EXPON","lambda","FORECAST","known_ys","known_xs","xmean","ymean","den","GAMMA","GAMMALN","deg_freedom1","deg_freedom2","sumOfSquares","mathTrig.SUM","PRECISE","HYPGEOM","LARGE","LINEST","known_y","known_x","sample_s","number_sample","population_s","number_pop","M","LOGNORM","MAX","MEDIAN","utils.arrayValuesToNumbers","MIN","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","fl","utils.cleanFloat","PERCENTRANK","EXC","significance","uniques","lookup.UNIQUE","INC","POISSON","QUARTILE","quart","RANK","SKEW","SMALL","AVG","EQ","m3","STDEV","VAR","mean_x","mean_y","s_x","s_y","VARA","VARPA","WEIBULL","Z","CEILING","COMBIN","number_chosen","FACT","MATH","MEMOIZED_FACT","FLOOR","ISO","POWER","PRODUCT","ROUND","num_digits","SUM","utils.arrayEach","utils.argsToArray","inner_result","num1","num2","dividend","divisor","value1","value2","utils.anyIsString","factor1","factor2","base","exponent","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","utils.parseDate","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","startOfDay","newDate","getTime","DAYS360","method","utils.parseBool","ed","sm","em","smd","emd","ISOWEEKNUM","setDate","getDay","yearStart","NETWORKDAYS","holidays","INTL","weekend","isMask","maskDays","maskIndex","maskRegex","RegExp","total","getTimezoneOffset","getUTCDay","dec","includes","holiday","NETWORKDAYS_INTL","WORKDAY","WORKDAY_INTL","isLeapYear","daysBetween","basis","sy","ey","ylength","date1","date2","year1","mar1year1","year2","mar1year2","feb29Between","years","average","BESSEL","version","_horner","_bessel_iter","f0","f1","tdx","o","_bessel_wrap","bessel0","bessel1","nonzero","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","besselj","reverse","ret","jsum","bjp","bj","bjm","tox","bessely","besseli","bip","bi","bim","besselk","DO_NOT_EXPORT_BESSEL","isValidBinaryNumber","COMPLEX","real_num","i_num","suffix","ERF","lower_limit","upper_limit","ERFC","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","substring","IMARGUMENT","IMCOS","IMCOSH","IMDIV","inumber1","inumber2","unit1","unit2","IMSIN","IMSINH","BETADIST","statistical.BETA","BETAINV","BINOMDIST","statistical.BINOM","CEILINGMATH","mathTrig.CEILING","CEILINGPRECISE","CHIDIST","statistical.CHISQ","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","statistical.COVARIANCE","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","engineering.ERFC","ERFPRECISE","engineering.ERF","EXPONDIST","statistical.EXPON","FDIST","statistical.F","FDISTRT","FINV","FINVRT","FLOORMATH","mathTrig.FLOOR","FLOORPRECISE","FTEST","GAMMADIST","statistical.GAMMA","GAMMAINV","GAMMALNPRECISE","statistical.GAMMALN","HYPGEOMDIST","statistical.HYPGEOM","LOGINV","statistical.LOGNORM","LOGNORMDIST","LOGNORMINV","MODEMULT","statistical.MODE","MODESNGL","SNGL","NEGBINOMDIST","statistical.NEGBINOM","NETWORKDAYSINTL","dateTime.NETWORKDAYS","NORMDIST","statistical.NORM","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","statistical.PERCENTILE","PERCENTILEINC","PERCENTRANKEXC","statistical.PERCENTRANK","PERCENTRANKINC","POISSONDIST","statistical.POISSON","QUARTILEEXC","statistical.QUARTILE","QUARTILEINC","RANKAVG","statistical.RANK","RANKEQ","SKEWP","statistical.SKEW","STDEVP","statistical.STDEV","STDEVS","TDIST","statistical.T","TDISTRT","TINV","TTEST","VARP","statistical.VAR","VARS","WEIBULLDIST","statistical.WEIBULL","WORKDAYINTL","dateTime.WORKDAY","ZTEST","statistical.Z","compact","findResultIndex","matches","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","validDate","ensureDate","validateFrequency","frequency","validateBasis","FV","nper","payment","term","IPMT","per","pv","fv","PMT","NPV","CHAIN_ID_MAP","ethereum","gnosis","BLOCKSCOUT_CHAINS_MAP","arbitrum","optimism","soneium","unichain","SAFE_CHAIN_MAP","ERROR_MESSAGES_FLAG","INVALID_API_KEY","RATE_LIMIT","DEFAULT","MISSING_KEY","INVALID_CHAIN","INVALID_TYPE","INVALID_ADDRESS","INVALID_PARAM","UTILITY","SERVICE_API_KEY","Etherscan","Coingecko","Safe","Basescan","Gnosisscan","Firefly","GnosisPay","fromTimeStampToBlock","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","timestamp","chain","apiKey","chainId","url","json","wrap","_callee$","_context","prev","abrupt","fetch","sent","stop","_x","_x2","_x3","toTimestamp","dateStr","_dateStr$split$map2","isAddress","input","fromEnsNameToAddress","_x4","_fromEnsNameToAddress","_callee2","ALCHEMY_KEY","provider","resolved","_context2","ethers","Promise","resolve","reject","script","document","createElement","src","onload","onerror","head","appendChild","window","localStorage","getItem","console","AlchemyProvider","resolveName","t0","message","handleScanRequest","_x5","_handleScanRequest","_callee3","_ref2","scanKey","baseUrl","address","startDate","endDate","_ref2$page","page","_ref2$offset","offset","API_KEY","action","_yield$Promise$all","_yield$Promise$all2","startBlock","endBlock","_context3","gas","all","ok","status","_FIREFLY","_callee4","platform","contentType","identifier","_typeMap$platform","headers","platformType","query","_args4","_callee4$","_context4","farcaster","posts","replies","channels","lens","trim","Boolean","URL","searchParams","set","item","flat","_i10","_Object$entries","entries","_Object$entries$_i","key","_typeof","_BLOCKSCOUT","_callee5","startTimestamp","endTimestamp","currentTimestamp","hostname","requestUrl","_json$result","_json$result2","response","_callee5$","_context5","_BASESCAN","_callee6","_len2","_key2","limit","_args6","_context6","_GNOSISSCAN","_callee7","_len3","_key3","_args7","_context7","_NEYNAR","_callee8","fid","viewerFid","sortType","cursor","_json$users","_callee8$","_context8","Neynar","users","_ref4","_user$profile","_user$profile2","user","username","custody_address","follower_count","country","profile","location","city","_GNOSISPAY","_callee9","_ref3","cardId","_ref3$limit","_ref3$offset","apiKeyKey","_context9","toISOString","Authorization","tx","createdAt","clearedAt","merchant","billingAmount","billingCurrency","transactionAmount","transactionCurrency","transactionType","mcc","_ETHERSCAN","_callee0","_len4","_key4","_args0","_callee0$","_context0","_COINGECKO","_callee1","category","param1","param2","perPage","lowerCategory","vsCurrencies","ecosystemMap","categoryVal","trend","_category","_trend","exchange","_json$status","output","_i11","_Object$entries2","_Object$entries2$_i","_token","prices","_i12","_Object$entries3","_Object$entries3$_i","currency","_value6","_key5","flatArray","_args1","_context1","accept","eth","sol","hyperliquid","bitcoin","pump","aiagents","meme","INVALID_PARAMS","error_message","_i13","_Object$entries4","_Object$entries4$_i","_EOA","_callee11","addresses","chains","startTime","endTime","INPUTS","CHAINS","out","ADDRESS_MAP","_iterator","_step","ADDRS","_iterator2","_step2","_loop","_ret","fetchJSON","_fetchJSON","_args13","_callee11$","_context13","_fetchJSON3","_callee10","_json$result3","_json$result3$include","_json$result4","_json$result4$include","_callee10$","_context12","_fetchJSON2","_x35","_createForOfIteratorHelper","done","finish","keys","_data","_loop2","_ret2","_i14","_ADDRS","_loop$","_context11","UNSUPPORTED_CHAIN","_objectSpread","account","addr","_context10","delegateYield","INVALID_CATEGORY","t2","t3","_FLVURL","_callee12","vs_currencies","_context14","Yoo","_SAFE","_callee13","utility","chainIdentifier","_context15","_ref5","confirmations","dataDecoded","_objectWithoutProperties","_excluded","errors","symbols","issue","first_interest","settlement","par","dateTime.YEARFRAC","function_num","options","ref1","ref2","statistical.AVERAGE","statistical.COUNT","statistical.COUNTA","statistical.MAX","statistical.MIN","statistical.MEDIAN","statistical.LARGE","statistical.SMALL","CM","CD","XC","XL","IX","IV","x_num","y_num","atan2","average_range","average_count","isWildcard","utils.applyCriteria","radix","min_length","bessel","stringified","places","text.REPT","number1","number2","shift_amount","_x9","_x0","_x1","_x10","_x11","_x12","_x13","_x20","_x21","_x22","reference","from_unit","to_unit","alt","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","E","G","to","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","e2","maturity","lastCoupDateBeforeSettlement","nextDate","dateTime.DATEDIF","numOfDays","start_period","end_period","interest","principal","date_text","dateValue","field","resultIndexes","targetFields","utils.findField","utils.rest","serial_number","cost","salvage","life","period","initial","ceiling","targetValues","stats.COUNT","stats.COUNTA","pr","redemption","basisVal","dateTime.DAYS360","maxValue","minValue","style","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","fractional_dollar","fraction","LN10","LN2","decimal_dollar","stats.STDEV","maths.SUM","stats.VAR","months","storedDay","targetMonth","daysInTargetMonth","targetYear","nominal_rate","npery","_x23","_x24","_x25","_x26","_x27","eoMonth","text1","text2","error.error","FACTDOUBLE","find_text","within_text","start_num","found_index","_x6","_x7","_x8","e2y","_x28","_x29","data_array","bins_array","schedule","future","r0","ri","_x19","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","negative","decimal","row_index_num","utils.transpose","getHours","logical_test","value_if_true","value_if_false","value_if_error","information.ISERROR","value_if_na","row_num","column_num","isOneDimensionRange","guess","cashFlows","Float64Array","positive","npvCache","Map","cachedNpv","roundedRate","has","get","npv","epsMax","prevRate","iteration","currentNpv","delta","derivNpv","newtonStep","maxStep","npvAtRate","npvC","combinedMethod","pop","num_chars","result_array","lookup_array","match_type","indexValue","lookupValueStr","begin","getMinutes","finance_rate","reinvest_rate","payments","incomes","some","utils.flattenShallow","_","modulus","multiple","dimension","_x14","_x15","_x16","_x17","_x18","effect_rate","logical","pmt","decimal_separator","group_separator","mathTrig.FACT","_argsToArray2","toNumberOrThrow","maxLen","maxRows","rowA","rowB","maxCols","maxX","matA","matB","maxY","maxZ","discount","x_range","prob_range","sorted","txt","substr","numerator","denominator","bottom","top","dy","old_text","new_text","digits","roman","_x30","_x31","_x32","_x33","_x34","foundAt","getSeconds","coefficients","sort_index","sort_order","by_col","sortArray","utils.fillMatrix","lft","instance_num","sum_range","sumValue","_i","_ij","_ij_arg","_i_arg","information.ISNUMBER","array_x","array_y","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","format_text","currencySymbol","startsWith","isPercent","endsWith","delimiter","ignore_empty","_len","_key","flatArgs","textToJoin","chunks","second","hh","mm","ss","time_text","new_xs","linest","percent","return_type","week_start","jan","inc","dates","utils.parseDateArray","irrResult","dateTime.DAYS","irrResultDeriv","newRate","epsRate","resultValue","resultRate","contLoop"],"mappings":"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","x_google_ignoreList":[5,12]}
1
+ {"version":3,"file":"formula.min.js","sources":["../../src/utils/error.js","../../src/utils/date.js","../../src/utils/criteria-eval.js","../../src/utils/common.js","../../src/information.js","../../node_modules/jstat/dist/jstat.js","../../src/lookup-reference.js","../../src/text.js","../../src/statistical.js","../../src/math-trig.js","../../src/utils/symbol.js","../../src/date-time.js","../../node_modules/bessel/bessel.js","../../src/engineering.js","../../src/compatibility.js","../../src/database.js","../../src/financial.js","../../src/utils/constants.js","../../src/crypto-constants.js","../../src/utils/from-timestamp-to-block.js","../../src/utils/toTimestamp.js","../../src/utils/is-address.js","../../src/utils/from-ens-name-to-address.js","../../src/utils/handle-explorer-request.js","../../src/crypto.js","../../src/index.js","../../src/logical.js"],"sourcesContent":["export const nil = new Error('#NULL!')\nexport const div0 = new Error('#DIV/0!')\nexport const value = new Error('#VALUE!')\nexport const ref = new Error('#REF!')\nexport const name = new Error('#NAME?')\nexport const num = new Error('#NUM!')\nexport const na = new Error('#N/A')\nexport const error = new Error('#ERROR!')\nexport const data = new Error('#GETTING_DATA')\n","export let returnSerial = false\n\nconst d1900 = new Date(Date.UTC(1900, 0, 1))\n\nexport function useSerial() {\n returnSerial = true\n}\n\nexport function useDate() {\n returnSerial = false\n}\n\nexport function serialToDate(serial) {\n if (serial < 60) {\n serial += 1\n }\n\n const utc_days = Math.floor(serial - 25569)\n const utc_value = utc_days * 86400\n const date_info = new Date(utc_value * 1000)\n const fractional_day = serial - Math.floor(serial) + 0.0000001\n\n let total_seconds = Math.floor(86400 * fractional_day)\n\n const seconds = total_seconds % 60\n\n total_seconds -= seconds\n\n const hours = Math.floor(total_seconds / (60 * 60))\n const minutes = Math.floor(total_seconds / 60) % 60\n let days = date_info.getUTCDate()\n let month = date_info.getUTCMonth()\n\n if (serial >= 60 && serial < 61) {\n days = 29\n month = 1\n }\n\n return new Date(date_info.getUTCFullYear(), month, days, hours, minutes, seconds)\n}\n\nexport function dateToSerial(date) {\n const addOn = date > -2203891200000 ? 2 : 1\n\n return Math.ceil((date - d1900) / 86400000) + addOn\n}\n\nexport function formatDate(date) {\n const day = String(date.getDate()).padStart(2, '0')\n const month = String(date.getMonth() + 1).padStart(2, '0') // Months are 0-indexed\n const year = date.getFullYear()\n return `${day}/${month}/${year}`\n}\n","const defaultOperator = '='\nconst validSymbols = ['>', '>=', '<', '<=', '=', '<>']\nconst _TOKEN_TYPE_OPERATOR = 'operator'\nconst _TOKEN_TYPE_LITERAL = 'literal'\nconst SUPPORTED_TOKENS = [_TOKEN_TYPE_OPERATOR, _TOKEN_TYPE_LITERAL]\n\nexport const TOKEN_TYPE_OPERATOR = _TOKEN_TYPE_OPERATOR\nexport const TOKEN_TYPE_LITERAL = _TOKEN_TYPE_LITERAL\n\n/**\n * Create token which describe passed symbol/value.\n *\n * @param {String} value Value/Symbol to describe.\n * @param {String} type Type of the token 'operator' or 'literal'.\n * @return {Object}\n */\nexport function createToken(value, type) {\n if (SUPPORTED_TOKENS.indexOf(type) === -1) {\n throw new Error('Unsupported token type: ' + type)\n }\n\n return {\n value: value,\n type: type\n }\n}\n\n/**\n * Tries to cast numeric values to their type passed as a string.\n *\n * @param {*} value\n * @return {*}\n */\nfunction castValueToCorrectType(value) {\n if (typeof value !== 'string') {\n return value\n }\n\n if (/^\\d+(\\.\\d+)?$/.test(value)) {\n value = value.indexOf('.') === -1 ? parseInt(value, 10) : parseFloat(value)\n }\n\n return value\n}\n\n/**\n * Generate stream of tokens from passed expression.\n *\n * @param {String} expression\n * @return {String[]}\n */\nfunction tokenizeExpression(expression) {\n const expressionLength = expression.length\n const tokens = []\n let cursorIndex = 0\n let processedValue = ''\n let processedSymbol = ''\n\n while (cursorIndex < expressionLength) {\n const char = expression.charAt(cursorIndex)\n\n switch (char) {\n case '>':\n case '<':\n case '=':\n processedSymbol = processedSymbol + char\n\n if (processedValue.length > 0) {\n tokens.push(processedValue)\n processedValue = ''\n }\n\n break\n default:\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol)\n processedSymbol = ''\n }\n\n processedValue = processedValue + char\n break\n }\n\n cursorIndex++\n }\n\n if (processedValue.length > 0) {\n tokens.push(processedValue)\n }\n\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol)\n }\n\n return tokens\n}\n\n/**\n * Analyze and convert tokens to an object which describes their meaning.\n *\n * @param {String[]} tokens\n * @return {Object[]}\n */\nfunction analyzeTokens(tokens) {\n let literalValue = ''\n const analyzedTokens = []\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n\n if (i === 0 && validSymbols.indexOf(token) >= 0) {\n analyzedTokens.push(createToken(token, TOKEN_TYPE_OPERATOR))\n } else {\n literalValue += token\n }\n }\n\n if (literalValue.length > 0) {\n analyzedTokens.push(createToken(castValueToCorrectType(literalValue), TOKEN_TYPE_LITERAL))\n }\n\n if (analyzedTokens.length > 0 && analyzedTokens[0].type !== TOKEN_TYPE_OPERATOR) {\n analyzedTokens.unshift(createToken(defaultOperator, TOKEN_TYPE_OPERATOR))\n }\n\n return analyzedTokens\n}\n\n/**\n * Compute/Evaluate an expression passed as an array of tokens.\n *\n * @param {Object[]} tokens\n * @return {Boolean}\n */\nfunction computeExpression(tokens) {\n const values = []\n let operator\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n\n switch (token.type) {\n case TOKEN_TYPE_OPERATOR:\n operator = token.value\n break\n case TOKEN_TYPE_LITERAL:\n values.push(token.value)\n break\n }\n }\n\n return evaluate(values, operator)\n}\n\n/**\n * Evaluate values based on passed math operator.\n *\n * @param {*} values\n * @param {String} operator\n * @return {Boolean}\n */\nfunction evaluate(values, operator) {\n let result = false\n\n switch (operator) {\n case '>':\n result = values[0] > values[1]\n break\n case '>=':\n result = values[0] >= values[1]\n break\n case '<':\n result = values[0] < values[1]\n break\n case '<=':\n result = values[0] <= values[1]\n break\n case '=':\n result = values[0] == values[1]\n break\n case '<>':\n result = values[0] != values[1]\n break\n }\n\n return result\n}\n\nexport function parse(expression) {\n return analyzeTokens(tokenizeExpression(expression))\n}\n\nexport const compute = computeExpression\n","import * as error from './error.js'\nimport * as evalExpression from './criteria-eval.js'\nimport { serialToDate } from './date.js'\n\n// Arrays\nexport function argsToArray(args) {\n const result = []\n\n arrayEach(args, (value) => {\n result.push(value)\n })\n\n return result\n}\n\nexport function arrayEach(array, iteratee) {\n let index = -1\n const length = array.length\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break\n }\n }\n\n return array\n}\n\nexport function arrayValuesToNumbers(arr) {\n let n = arr.length\n let el\n\n while (n--) {\n el = arr[n]\n\n if (typeof el === 'number') {\n continue\n }\n\n if (el === true) {\n arr[n] = 1\n continue\n }\n\n if (el === false) {\n arr[n] = 0\n continue\n }\n\n if (typeof el === 'string') {\n const number = parseNumber(el)\n\n arr[n] = number instanceof Error ? 0 : number\n }\n }\n\n return arr\n}\n\nexport function fillMatrix(matrix, fill_value) {\n if (!matrix) {\n return error.value\n }\n\n if (!matrix.every((el) => Array.isArray(el)) || matrix.length === 0) {\n matrix = [[...matrix]]\n }\n\n matrix.map((arr, i) => {\n arr.map((a, j) => {\n if (!a) {\n matrix[i][j] = 0\n }\n })\n })\n\n const longestArrayIndex = matrix.reduce((acc, arr, i) => (arr.length > matrix[acc].length ? i : acc), 0)\n const longestArrayLength = matrix[longestArrayIndex].length\n\n return matrix.map((el) => [...el, ...Array(longestArrayLength - el.length).fill(fill_value ? fill_value : 0)])\n}\n\nexport function flatten() {\n let result\n\n if (arguments.length === 1) {\n const argument = arguments[0]\n result = isArrayLike(argument) ? argsToArray.apply(null, arguments) : [argument]\n } else {\n result = Array.from(arguments)\n }\n\n while (!isFlat(result)) {\n result = flattenShallow(result)\n }\n\n return result\n}\n\nexport function flattenShallow(array) {\n if (!array || !array.reduce) {\n return [array]\n }\n\n return array.reduce((a, b) => {\n const aIsArray = Array.isArray(a)\n const bIsArray = Array.isArray(b)\n\n if (aIsArray && bIsArray) {\n return a.concat(b)\n }\n\n if (aIsArray) {\n a.push(b)\n\n return a\n }\n\n if (bIsArray) {\n return [a].concat(b)\n }\n\n return [a, b]\n })\n}\n\nexport function initial(array, idx) {\n idx = idx || 1\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(0, array.length - idx)\n}\n\nexport function isArrayLike(a) {\n return a != null && typeof a.length === 'number' && typeof a !== 'string'\n}\n\nexport function isFlat(array) {\n if (!array) {\n return false\n }\n\n for (let i = 0; i < array.length; ++i) {\n if (Array.isArray(array[i])) {\n return false\n }\n }\n\n return true\n}\n\nexport function rest(array, idx) {\n idx = idx || 1\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(idx)\n}\n\nexport function transpose(matrix) {\n if (!matrix) {\n return error.value\n }\n\n return matrix[0].map((col, i) => matrix.map((row) => row[i]))\n}\n\n// Databases\nexport function findField(database, title) {\n let index = null\n\n arrayEach(database, (value, i) => {\n if (value[0] === title) {\n index = i\n\n return false\n }\n })\n\n // Return error if the input field title is incorrect\n if (index == null) {\n return error.value\n }\n\n return index\n}\n\n// Errors\nexport function anyError() {\n for (let n = 0; n < arguments.length; n++) {\n if (arguments[n] instanceof Error) {\n return arguments[n]\n }\n }\n\n return undefined\n}\n\nexport function anyIsError() {\n let n = arguments.length\n\n while (n--) {\n if (arguments[n] instanceof Error) {\n return true\n }\n }\n\n return false\n}\n\n// Numbers\nexport function cleanFloat(number) {\n const power = 1e14\n\n return Math.round(number * power) / power\n}\n\nexport function numbers() {\n const possibleNumbers = flatten.apply(null, arguments)\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\n// Parsers\nexport function parseBool(bool) {\n if (typeof bool === 'boolean') {\n return bool\n }\n\n if (bool instanceof Error) {\n return bool\n }\n\n if (typeof bool === 'number') {\n return bool !== 0\n }\n\n if (typeof bool === 'string') {\n const up = bool.toUpperCase()\n\n if (up === 'TRUE') {\n return true\n }\n\n if (up === 'FALSE') {\n return false\n }\n }\n\n if (bool instanceof Date && !isNaN(bool)) {\n return true\n }\n\n return error.value\n}\n\nexport function parseDate(date) {\n if (!isNaN(date)) {\n if (date instanceof Date) {\n return new Date(date)\n }\n\n const d = parseFloat(date)\n\n if (d < 0 || d >= 2958466) {\n return error.num\n }\n\n return serialToDate(d)\n }\n\n if (typeof date === 'string') {\n // Check for YYYY-MM-DD (ISO format)\n if (/^\\d{4}-\\d{1,2}-\\d{1,2}$/.test(date)) {\n return new Date(date + 'T00:00:00.000')\n }\n\n // Check for DD/MM/YYYY\n const match = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(date)\n if (match) {\n const [, day, month, year] = match.map(Number)\n const d = new Date(year, month - 1, day)\n if (!isNaN(d)) {\n return d\n }\n }\n\n // Handle time-only string (HH:MM[:SS])\n if (/^\\d{1,2}:\\d{2}(:\\d{2})?$/.test(date)) {\n const [h, m, s = '0'] = date.split(':').map(Number)\n const now = new Date()\n now.setHours(h, m, s, 0)\n return now\n }\n\n // Handle AM/PM time format (e.g., \"2:15 PM\")\n const ampmMatch = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i.exec(date)\n if (ampmMatch) {\n let [, hour, minute, meridian] = ampmMatch\n hour = parseInt(hour)\n minute = parseInt(minute)\n if (meridian.toUpperCase() === 'PM' && hour !== 12) hour += 12\n if (meridian.toUpperCase() === 'AM' && hour === 12) hour = 0\n const now = new Date()\n now.setHours(hour, minute, 0, 0)\n return now\n }\n\n // Fallback for other date strings\n const parsed = new Date(date)\n if (!isNaN(parsed)) {\n return parsed\n }\n }\n\n return error.value\n}\n\nexport function parseDateArray(arr) {\n let len = arr.length\n let parsed\n\n while (len--) {\n parsed = parseDate(arr[len])\n\n if (parsed === error.value) {\n return parsed\n }\n\n arr[len] = parsed\n }\n\n return arr\n}\n\nexport function parseMatrix(matrix) {\n if (!matrix || (matrix.length && matrix.length === 0)) {\n return error.value\n }\n\n let pnarr\n\n for (let i = 0; i < matrix.length; i++) {\n pnarr = parseNumberArray(matrix[i])\n matrix[i] = pnarr\n\n if (pnarr instanceof Error) {\n return pnarr\n }\n }\n\n return matrix\n}\n\nexport function parseNumber(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return 0\n }\n\n if (typeof string === 'boolean') {\n string = +string\n }\n\n if (!isNaN(string) && string !== '') {\n return parseFloat(string)\n }\n\n return error.value\n}\n\nexport function parseNumberArray(arr) {\n let len\n\n if (!arr || (len = arr.length) === 0) {\n return error.value\n }\n\n let parsed\n\n while (len--) {\n if (arr[len] instanceof Error) {\n return arr[len]\n }\n\n parsed = parseNumber(arr[len])\n\n if (parsed instanceof Error) {\n return parsed\n }\n\n arr[len] = parsed\n }\n\n return arr\n}\n\nexport function parseString(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return ''\n }\n\n return string.toString()\n}\n\n// Strings\nexport function anyIsString() {\n let n = arguments.length\n\n while (n--) {\n if (typeof arguments[n] === 'string') {\n return true\n }\n }\n\n return false\n}\n\n// Misc\n//Filters values from a given range based on multiple criteria.\n//Returns an array containing the values that satisfy all the specified criteria.\nexport function applyCriteria() {\n const args = argsToArray(arguments)\n const range = parseNumberArray(flatten(args.shift()))\n if (range instanceof Error) {\n return range\n }\n\n const criterias = args\n const criteriaLength = criterias.length / 2\n\n for (let i = 0; i < criteriaLength; i++) {\n criterias[i * 2] = flatten(criterias[i * 2])\n }\n\n let values = []\n\n for (let i = 0; i < range.length; i++) {\n let isMetCondition = false\n\n for (let j = 0; j < criteriaLength; j++) {\n const valueToTest = criterias[j * 2][i]\n const criteria = criterias[j * 2 + 1]\n const isWildcard = criteria === void 0 || criteria === '*'\n let computedResult = false\n\n if (isWildcard) {\n computedResult = true\n } else {\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n const tokens = [evalExpression.createToken(valueToTest, evalExpression.TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n )\n\n computedResult = evalExpression.compute(tokens)\n }\n\n // Criterias are calculated as AND so any `false` breaks the loop as unmeet condition\n if (!computedResult) {\n isMetCondition = false\n break\n }\n\n isMetCondition = true\n }\n\n if (isMetCondition) {\n values.push(range[i])\n }\n }\n return values\n}\n\nexport function isDefined(arg) {\n return arg !== undefined && arg !== null\n}\n","import * as error from './utils/error.js'\n\nexport const ERROR = {}\n\nERROR.TYPE = (error_val) => {\n switch (error_val) {\n case error.nil:\n return 1\n case error.div0:\n return 2\n case error.value:\n return 3\n case error.ref:\n return 4\n case error.name:\n return 5\n case error.num:\n return 6\n case error.na:\n return 7\n case error.data:\n return 8\n }\n\n return error.na\n}\n\n/**\n * Returns TRUE if the value is blank.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISBLANK(value) {\n return value === null\n}\n\n/**\n * Returns TRUE if the value is any error value except #N/A.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISERR(value) {\n return (\n [error.value, error.ref, error.div0, error.num, error.name, error.nil].indexOf(value) >= 0 ||\n (typeof value === 'number' && (isNaN(value) || !isFinite(value)))\n )\n}\n\n/**\n * Returns TRUE if the value is any error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISERROR(value) {\n return ISERR(value) || value === error.na\n}\n\n/**\n * Returns TRUE if the number is even.\n *\n * Category: Information\n *\n * @param {*} number The value to test. If number is not an integer, it is truncated.\n * @returns\n */\nexport function ISEVEN(number) {\n return !(Math.floor(Math.abs(number)) & 1)\n}\n\n/**\n * Returns TRUE if the value is a logical value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISLOGICAL(value) {\n return value === true || value === false\n}\n\n/**\n * Returns TRUE if the value is the #N/A error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNA(value) {\n return value === error.na\n}\n\n/**\n * Returns TRUE if the value is not text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNONTEXT(value) {\n return typeof value !== 'string'\n}\n\n/**\n * Returns TRUE if the value is a number.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISNUMBER(value) {\n return typeof value === 'number' && !isNaN(value) && isFinite(value)\n}\n\n/**\n * Returns TRUE if the number is odd.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISODD(value) {\n return !!(Math.floor(Math.abs(value)) & 1)\n}\n\n/**\n * Returns TRUE if the value is text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nexport function ISTEXT(value) {\n return typeof value === 'string'\n}\n\n/**\n * Returns a value converted to a number.\n *\n * Category: Information\n *\n * @param {*} value The value you want converted. N converts values listed in the following table.\n * @returns\n */\nexport function N(value) {\n if (ISNUMBER(value)) {\n return value\n }\n\n if (value instanceof Date) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n\n if (value === false) {\n return 0\n }\n\n if (ISERROR(value)) {\n return value\n }\n\n return 0\n}\n\n/**\n * Returns the error value #N/A.\n *\n * Category: Information\n *\n * @returns\n */\nexport function NA() {\n return error.na\n}\n\n/**\n * Returns a number indicating the data type of a value.\n *\n * Category: Information\n *\n * @param {*} value Can be any Microsoft Excel value, such as a number, text, logical value, and so on.\n * @returns\n */\nexport function TYPE(value) {\n if (ISNUMBER(value)) {\n return 1\n }\n\n if (ISTEXT(value)) {\n return 2\n }\n\n if (ISLOGICAL(value)) {\n return 4\n }\n\n if (ISERROR(value)) {\n return 16\n }\n\n if (Array.isArray(value)) {\n return 64\n }\n}\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,\n // and comes from his hypergeometric test calculator at\n // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i<arguments.length;i++){\n var array = [1];\n matrixRows[i]= array.concat(arguments[i]);\n }\n return jStat(matrixRows);\n\n },\n\n builddxmatrix: function builddxmatrix() {\n //Paramters will be passed in as such\n //([array1,array2,...]\n var matrixRows = new Array(arguments[0].length);\n for(var i=0;i<arguments[0].length;i++){\n var array = [1]\n matrixRows[i]= array.concat(arguments[0][i]);\n }\n return jStat(matrixRows);\n\n },\n\n buildjxmatrix: function buildjxmatrix(jMat) {\n //Builds from jStat Matrix\n var pass = new Array(jMat.length)\n for(var i=0;i<jMat.length;i++){\n pass[i] = jMat[i];\n }\n return jStat.builddxmatrix(pass);\n\n },\n\n buildymatrix: function buildymatrix(array){\n return jStat(array).transpose();\n },\n\n buildjymatrix: function buildjymatrix(jMat){\n return jMat.transpose();\n },\n\n matrixmult: function matrixmult(A,B){\n var i, j, k, result, sum;\n if (A.cols() == B.rows()) {\n if(B.rows()>1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i<beta.length;i++){\n sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i]));\n ts= Math.abs(beta[i] / sds);\n ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides);\n\n compile.stats[i]=[beta[i], sds, ts, ps];\n }\n\n compile.regress = beta;\n return compile;\n },\n\n xtranspx: function xtranspx(jMatX){\n return jStat.matrixmult(jMatX.transpose(),jMatX);\n },\n\n\n xtranspxinv: function xtranspxinv(jMatX){\n var inner = jStat.matrixmult(jMatX.transpose(),jMatX);\n var innerinv = jStat.inv(inner);\n return innerinv;\n },\n\n jMatYBar: function jMatYBar(jMatX, beta) {\n var yBar = jStat.matrixmult(jMatX, beta);\n return new jStat(yBar);\n },\n\n residuals: function residuals(jMatY, jMatYBar) {\n return jStat.matrixsubtract(jMatY, jMatYBar);\n },\n\n ssr: function ssr(jMatYBar, yAverage) {\n var ssr = 0;\n for(var i = 0; i < jMatYBar.length; i++) {\n ssr += Math.pow(jMatYBar[i] - yAverage, 2);\n }\n return ssr;\n },\n\n sse: function sse(jMatY, jMatYBar) {\n var sse = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sse += Math.pow(jMatY[i] - jMatYBar[i], 2);\n }\n return sse;\n },\n\n sst: function sst(jMatY, yAverage) {\n var sst = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sst += Math.pow(jMatY[i] - yAverage, 2);\n }\n return sst;\n },\n\n matrixsubtract: function matrixsubtract(A,B){\n var ans = new Array(A.length);\n for(var i=0;i<A.length;i++){\n ans[i] = new Array(A[i].length);\n for(var j=0;j<A[i].length;j++){\n ans[i][j]=A[i][j]-B[i][j];\n }\n }\n return jStat(ans);\n }\n});\n // Make it compatible with previous version.\n jStat.jStat = jStat;\n\n return jStat;\n});\n","import jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\n\n/**\n * Chooses a value from a list of values.\n *\n * Category: Lookup and reference\n *\n * @param {*} index_num Specifies which value argument is selected. Index_num must be a number between 1 and 254, or a formula or reference to a value containing a number between 1 and 254. If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on. If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value. If index_num is a fraction, it is truncated to the lowest integer before being used.\n - If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on.\n - If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value.\n - If index_num is a fraction, it is truncated to the lowest integer before being used.\n * @param {*} args value1, value2, ... Value 1 is required, subsequent values are optional. 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on index_num. The arguments can be numbers, value references, defined names, formulas, functions, or text.\n * @returns\n */\nexport function CHOOSE() {\n if (arguments.length < 2) {\n return error.na\n }\n\n const index = arguments[0]\n\n if (index < 1 || index > 254) {\n return error.value\n }\n\n if (arguments.length < index + 1) {\n return error.value\n }\n\n return arguments[index]\n}\n\n/**\n * Returns the column number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want to return the column number.\n * @param {*} index\n * @returns\n */\nexport function COLUMN(reference, index) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (index < 0) {\n return error.num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return error.value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.col(reference, index)\n}\n\n/**\n * Returns the number of columns in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or array formula, or a reference to a range of values for which you want the number of columns.\n * @returns\n */\nexport function COLUMNS(array) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (!(array instanceof Array)) {\n return error.value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.cols(array)\n}\n\n/**\n * Looks in the top row of an array and returns the value of the indicated value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} row_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nexport function HLOOKUP(lookup_value, table_array, row_index_num, range_lookup) {\n return VLOOKUP(lookup_value, utils.transpose(table_array), row_index_num, range_lookup)\n}\n\n/**\n * Uses an index to choose a value from a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array A range of values or an array constant.\n - If array contains only one row or column, the corresponding row_num or column_num argument is optional.\n - If array has more than one row and more than one column, and only row_num or column_num is used, INDEX returns an array of the entire row or column in array.\n * @param {*} row_num Required, unless column_num is present. Selects the row in array from which to return a value. If row_num is omitted, column_num is required.\n * @param {*} column_num Optional. Selects the column in array from which to return a value. If column_num is omitted, row_num is required.\n * @returns\n */\nexport function INDEX(array, row_num, column_num) {\n const someError = utils.anyError(array, row_num, column_num)\n\n if (someError) {\n return someError\n }\n\n if (!Array.isArray(array)) {\n return error.value\n }\n\n const isOneDimensionRange = array.length > 0 && !Array.isArray(array[0])\n\n if (isOneDimensionRange && !column_num) {\n column_num = row_num\n row_num = 1\n } else {\n column_num = column_num || 1\n row_num = row_num || 1\n }\n\n if (column_num < 0 || row_num < 0) {\n return error.value\n }\n\n if (isOneDimensionRange && row_num === 1 && column_num <= array.length) {\n return array[column_num - 1]\n } else if (row_num <= array.length && column_num <= array[row_num - 1].length) {\n return array[row_num - 1][column_num - 1]\n }\n\n return error.ref\n}\n\n/**\n * Looks up values in a vector or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value A value that LOOKUP searches for in an array. The lookup_value argument can be a number, text, a logical value, or a name or reference that refers to a value.\n - If LOOKUP can't find the value of lookup_value, it uses the largest value in the array that is less than or equal to lookup_value.\n - If the value of lookup_value is smaller than the smallest value in the first row or column (depending on the array dimensions), LOOKUP returns the #N/A error value.\n * @param {*} array A range of values that contains text, numbers, or logical values that you want to compare with lookup_value. The array form of LOOKUP is very similar to the HLOOKUP and VLOOKUP functions. The difference is that HLOOKUP searches for the value of lookup_value in the first row, VLOOKUP searches in the first column, and LOOKUP searches according to the dimensions of array.\n* @param {*} result_array Optional. A range that contains only one row or column. The result_array argument must be the same size as lookup_value. It has to be the same size.\n * @returns\n */\nexport function LOOKUP(lookup_value, array, result_array) {\n array = utils.flatten(array)\n result_array = result_array ? utils.flatten(result_array) : array\n\n const isNumberLookup = typeof lookup_value === 'number'\n let result = error.na\n\n for (let i = 0; i < array.length; i++) {\n if (array[i] === lookup_value) {\n return result_array[i]\n } else if (\n (isNumberLookup && array[i] <= lookup_value) ||\n (typeof array[i] === 'string' && array[i].localeCompare(lookup_value) < 0)\n ) {\n result = result_array[i]\n } else if (isNumberLookup && array[i] > lookup_value) {\n return result\n }\n }\n\n return result\n}\n\n/**\n * Looks up values in a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value that you want to match in lookup_array. For example, when you look up someone's number in a telephone book, you are using the person's name as the lookup value, but the telephone number is the value you want.The lookup_value argument can be a value (number, text, or logical value) or a value reference to a number, text, or logical value.\n * @param {*} lookup_array The range of values being searched.\n * @param {*} match_type Optional. The number -1, 0, or 1. The match_type argument specifies how Excel matches lookup_value with values in lookup_array. The default value for this argument is 1.\n * @returns\n */\nexport function MATCH(lookup_value, lookup_array, match_type) {\n if ((!lookup_value && lookup_value !== 0) || !lookup_array) {\n return error.na\n }\n\n if (arguments.length === 2) {\n match_type = 1\n }\n\n lookup_array = utils.flatten(lookup_array)\n\n if (!(lookup_array instanceof Array)) {\n return error.na\n }\n\n if (match_type !== -1 && match_type !== 0 && match_type !== 1) {\n return error.na\n }\n\n let index\n let indexValue\n\n for (let idx = 0; idx < lookup_array.length; idx++) {\n if (match_type === 1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] < lookup_value) {\n if (!indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n } else if (lookup_array[idx] > indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n }\n }\n } else if (match_type === 0) {\n if (typeof lookup_value === 'string' && typeof lookup_array[idx] === 'string') {\n const lookupValueStr = lookup_value\n .toLowerCase()\n .replace(/\\?/g, '.')\n .replace(/\\*/g, '.*')\n .replace(/~/g, '\\\\')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n\n const regex = new RegExp('^' + lookupValueStr + '$')\n\n if (regex.test(lookup_array[idx].toLowerCase())) {\n return idx + 1\n }\n } else {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n }\n }\n } else if (match_type === -1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] > lookup_value) {\n if (!indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n } else if (lookup_array[idx] < indexValue) {\n index = idx + 1\n indexValue = lookup_array[idx]\n }\n }\n }\n }\n\n return index || error.na\n}\n\n/**\n * Returns the number of rows in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array, an array formula, or a reference to a range of values for which you want the number of rows.\n * @returns\n */\nexport function ROWS(array) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (!(array instanceof Array)) {\n return error.value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.rows(array)\n}\n/**\n * Returns a sorted array of the elements in an array. The returned array is the same shape as the provided array argument.\n *\n * Category: Lookup and reference\n *\n * @param {*} array Array to sort\n * @param {*} sort_index Optional. A number indicating the row or column to sort by\n * @param {*} sort_order Optional. A number indicating the desired sort order; 1 for ascending order (default), -1 for descending order\n * @param {*} by_col Optional. A logical value indicating the desired sort direction; FALSE to sort by row (default), TRUE to sort by column\n * @returns\n */\nexport function SORT(array, sort_index = 1, sort_order = 1, by_col = false) {\n if (!array || !Array.isArray(array)) {\n return error.na\n }\n\n if (array.length === 0) {\n return 0\n }\n\n sort_index = utils.parseNumber(sort_index)\n if (!sort_index || sort_index < 1) {\n return error.value\n }\n\n sort_order = utils.parseNumber(sort_order)\n if (sort_order !== 1 && sort_order !== -1) {\n return error.value\n }\n\n by_col = utils.parseBool(by_col)\n if (typeof by_col !== 'boolean') {\n return error.name\n }\n\n const sortArray = (arr) =>\n arr.sort((a, b) => {\n a = utils.parseString(a[sort_index - 1])\n b = utils.parseString(b[sort_index - 1])\n\n return sort_order === 1 ? (a < b ? sort_order * -1 : sort_order) : a > b ? sort_order : sort_order * -1\n })\n\n const matrix = utils.fillMatrix(array)\n const result = by_col ? utils.transpose(matrix) : matrix\n\n return sort_index >= 1 && sort_index <= result[0].length\n ? by_col\n ? utils.transpose(sortArray(result))\n : sortArray(result)\n : error.value\n}\n\n/**\n * Returns the transpose of an array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or range of values on a worksheet that you want to transpose. The transpose of an array is created by using the first row of the array as the first column of the new array, the second row of the array as the second column of the new array, and so on. If you're not sure of how to enter an array formula, see Create an array formula.\n * @returns\n */\nexport function TRANSPOSE(array) {\n if (!array) {\n return error.na\n }\n\n const matrix = utils.fillMatrix(array)\n\n return utils.transpose(matrix)\n}\n\n/**\n * Returns a list of unique values in a list or range.\n *\n * Category: Lookup and reference\n *\n * @returns\n */\nexport function UNIQUE() {\n const result = []\n\n for (let i = 0; i < arguments.length; ++i) {\n let hasElement = false\n const element = arguments[i]\n\n // Check if we've already seen this element.\n\n for (let j = 0; j < result.length; ++j) {\n hasElement = result[j] === element\n\n if (hasElement) {\n break\n }\n }\n\n // If we did not find it, add it to the result.\n if (!hasElement) {\n result.push(element)\n }\n }\n\n return result\n}\n\n/**\n * Looks in the first column of an array and moves across the row to return the value of a value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} col_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nexport function VLOOKUP(lookup_value, table_array, col_index_num, range_lookup) {\n if (!table_array || !col_index_num) {\n return error.na\n }\n\n range_lookup = !(range_lookup === 0 || range_lookup === false)\n\n let result = error.na\n let exactMatchOnly = false\n\n const isNumberLookup = typeof lookup_value === 'number'\n const lookupValue = typeof lookup_value === 'string' ? lookup_value.toLowerCase() : lookup_value\n\n for (let i = 0; i < table_array.length; i++) {\n const row = table_array[i]\n const rowValue = typeof row[0] === 'string' ? row[0].toLowerCase() : row[0]\n\n if (rowValue === lookupValue) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : error.ref\n break\n } else if (\n !exactMatchOnly &&\n ((isNumberLookup && range_lookup && rowValue <= lookup_value) ||\n (range_lookup && typeof rowValue === 'string' && rowValue.localeCompare(lookup_value) < 0))\n ) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : error.ref\n }\n\n if (isNumberLookup && rowValue > lookup_value) {\n exactMatchOnly = true\n }\n }\n\n return result\n}\n","import * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\nimport { ROUND } from './math-trig.js'\n\n/**\n * Returns the character specified by the code number.\n *\n * Category: Text\n *\n * @param {*} number A number between 1 and 255 specifying which character you want. The character is from the character set used by your computer. Note: Excel for the web supports only CHAR(9), CHAR(10), CHAR(13), and CHAR(32) and above.\n * @returns\n */\nexport function CHAR(number) {\n number = utils.parseNumber(number)\n\n if (number === 0) {\n return error.value\n }\n\n if (number instanceof Error) {\n return number\n }\n\n return String.fromCharCode(number)\n}\n\n/**\n * Removes all nonprintable characters from text.\n *\n * Category: Text\n *\n * @param {*} text Any worksheet information from which you want to remove nonprintable characters.\n * @returns\n */\nexport function CLEAN(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n text = text || ''\n const re = /[\\0-\\x1F]/g\n\n return text.replace(re, '')\n}\n\n/**\n * Returns a numeric code for the first character in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text for which you want the code of the first character.\n * @returns\n */\nexport function CODE(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n text = text || ''\n let result = text.charCodeAt(0)\n\n if (isNaN(result)) {\n result = error.value\n }\n\n return result\n}\n\n/**\n * Joins several text items into one text item.\n *\n * Category: Text\n *\n * @returns\n */\nexport function CONCATENATE() {\n const args = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, args)\n\n if (someError) {\n return someError\n }\n\n let trueFound = 0\n\n while ((trueFound = args.indexOf(true)) > -1) {\n args[trueFound] = 'TRUE'\n }\n\n let falseFound = 0\n\n while ((falseFound = args.indexOf(false)) > -1) {\n args[falseFound] = 'FALSE'\n }\n\n return args.join('')\n}\n\nexport const CONCAT = CONCATENATE\n\n/**\n * Converts a number to text, using the $ (dollar) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number, a reference to a value containing a number, or a formula that evaluates to a number.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point. If this is negative, the number is rounded to the left of the decimal point. If you omit decimals, it is assumed to be 2.\n * @returns\n */\nexport function DOLLAR(number, decimals = 2) {\n number = utils.parseNumber(number)\n if (isNaN(number)) {\n return error.value\n }\n\n number = ROUND(number, decimals)\n\n const options = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals >= 0 ? decimals : 0,\n maximumFractionDigits: decimals >= 0 ? decimals : 0\n }\n\n const formattedNumber = number.toLocaleString('en-US', options)\n\n if (number < 0) {\n return '$(' + formattedNumber.slice(2) + ')'\n }\n\n return formattedNumber\n}\n\n/**\n * Checks to see if two text values are identical.\n *\n * Category: Text\n *\n * @param {*} text1 The first text string.\n * @param {*} text2 The second text string.\n * @returns\n */\nexport function EXACT(text1, text2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n const someError = utils.anyError(text1, text2)\n\n if (someError) {\n return someError\n }\n\n text1 = utils.parseString(text1)\n text2 = utils.parseString(text2)\n\n return text1 === text2\n}\n\n/**\n * Locate one text string within a second text string, and return the number of the starting position of the first text string from the first character of the second text string.\n *\n * Category: Text\n *\n * @param {*} find_text The text you want to find.\n * @param {*} within_text The text containing the text you want to find.\n * @param {*} start_num Optional. Specifies the character at which to start the search. The first character in within_text is character number 1. If you omit start_num, it is assumed to be 1.\n * @returns\n */\nexport function FIND(find_text, within_text, start_num) {\n if (arguments.length < 2) {\n return error.na\n }\n\n find_text = utils.parseString(find_text)\n within_text = utils.parseString(within_text)\n start_num = start_num === undefined ? 0 : start_num\n const found_index = within_text.indexOf(find_text, start_num - 1)\n\n if (found_index === -1) {\n return error.value\n }\n\n return found_index + 1\n}\n\n/**\n * Formats a number as text with a fixed number of decimals.\n *\n * Category: Text\n *\n * @param {*} number The number you want to round and convert to text.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point.\n * @param {*} no_commas Optional. A logical value that, if TRUE, prevents FIXED from including commas in the returned text.\n * @returns\n */\nexport function FIXED(number, decimals = 2, no_commas = false) {\n number = utils.parseNumber(number)\n if (isNaN(number)) {\n return error.value\n }\n\n decimals = utils.parseNumber(decimals)\n if (isNaN(decimals)) {\n return error.value\n }\n\n if (decimals < 0) {\n const factor = Math.pow(10, -decimals)\n number = Math.round(number / factor) * factor\n } else {\n number = number.toFixed(decimals)\n }\n\n if (no_commas) {\n number = number.toString().replace(/,/g, '')\n } else {\n const parts = number.toString().split('.')\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+$)/g, ',')\n number = parts.join('.')\n }\n\n return number\n}\n\n/**\n * Returns the leftmost characters from a text value.\n *\n * Category: Text\n *\n * @param {*} text The text string that contains the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want LEFT to extract.\n * @returns\n */\nexport function LEFT(text, num_chars) {\n const someError = utils.anyError(text, num_chars)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n num_chars = num_chars === undefined ? 1 : num_chars\n num_chars = utils.parseNumber(num_chars)\n\n if (num_chars instanceof Error || typeof text !== 'string') {\n return error.value\n }\n\n return text.substring(0, num_chars)\n}\n\n/**\n * Returns the number of characters in a text string\n *\n * Category: Text\n *\n * @param {*} text The text whose length you want to find. Spaces count as characters.\n * @returns\n */\nexport function LEN(text) {\n if (arguments.length === 0) {\n return error.error\n }\n\n if (text instanceof Error) {\n return text\n }\n\n if (Array.isArray(text)) {\n return error.value\n }\n\n const textAsString = utils.parseString(text)\n\n return textAsString.length\n}\n\n/**\n * Converts text to lowercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want to convert to lowercase. LOWER does not change characters in text that are not letters.\n * @returns\n */\nexport function LOWER(text) {\n if (arguments.length !== 1) {\n return error.value\n }\n\n text = utils.parseString(text)\n\n if (utils.anyIsError(text)) {\n return text\n }\n\n return text.toLowerCase()\n}\n\n/**\n * Returns a specific number of characters from a text string starting at the position you specify\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} start_num The position of the first character you want to extract in text. The first character in text has start_num 1, and so on.\n * @param {*} num_chars Specifies the number of characters you want MID to return from text.\n * @returns\n */\nexport function MID(text, start_num, num_chars) {\n if (start_num === undefined || start_num === null) {\n return error.value\n }\n\n start_num = utils.parseNumber(start_num)\n num_chars = utils.parseNumber(num_chars)\n\n if (utils.anyIsError(start_num, num_chars) || typeof text !== 'string') {\n return num_chars\n }\n\n const begin = start_num - 1\n const end = begin + num_chars\n\n return text.substring(begin, end)\n}\n\n// TODO\n/**\n * Converts text to number in a locale-independent manner.\n *\n * Category: Text\n *\n * @param {*} text The text to convert to a number.\n * @param {*} decimal_separator Optional. The character used to separate the integer and fractional part of the result.\n * @param {*} group_separator Optional. The character used to separate groupings of numbers, such as thousands from hundreds and millions from thousands.\n * @returns\n */\nexport function NUMBERVALUE(text, decimal_separator, group_separator) {\n text = utils.isDefined(text) ? text : ''\n\n if (typeof text === 'number') {\n return text\n }\n\n if (typeof text !== 'string') {\n return error.na\n }\n\n decimal_separator = typeof decimal_separator === 'undefined' ? '.' : decimal_separator\n group_separator = typeof group_separator === 'undefined' ? ',' : group_separator\n\n return Number(text.replace(decimal_separator, '.').replace(group_separator, ''))\n}\n\n/**\n * Capitalizes the first letter in each word of a text value.\n *\n * Category: Text\n *\n * @param {*} text Text enclosed in quotation marks, a formula that returns text, or a reference to a value containing the text you want to partially capitalize.\n * @returns\n */\nexport function PROPER(text) {\n if (utils.anyIsError(text)) {\n return text\n }\n\n if (isNaN(text) && typeof text === 'number') {\n return error.value\n }\n\n text = utils.parseString(text)\n\n return text.replace(/\\w\\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())\n}\n\n/**\n * Replaces characters within text\n *\n * Category: Text\n *\n * @param {*} old_text Text in which you want to replace some characters.\n * @param {*} num_chars The number of characters in old_text that you want REPLACE to replace with new_text.\n * @param {*} length he number of characters in old_text that you want REPLACEB to replace with new_text.\n * @param {*} new_text he text that will replace characters in old_text.\n * @returns\n */\nexport function REPLACE(old_text, num_chars, length, new_text) {\n num_chars = utils.parseNumber(num_chars)\n length = utils.parseNumber(length)\n\n if (utils.anyIsError(num_chars, length) || typeof old_text !== 'string' || typeof new_text !== 'string') {\n return error.value\n }\n\n return old_text.substr(0, num_chars - 1) + new_text + old_text.substr(num_chars - 1 + length)\n}\n\n/**\n * Repeats text a given number of times.\n *\n * Category: Text\n *\n * @param {*} text The text you want to repeat.\n * @param {*} number_times A positive number specifying the number of times to repeat text.\n * @returns\n */\nexport function REPT(text, number_times) {\n const someError = utils.anyError(text, number_times)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n number_times = utils.parseNumber(number_times)\n\n if (number_times instanceof Error) {\n return number_times\n }\n\n return new Array(number_times + 1).join(text)\n}\n\n/**\n * Returns the rightmost characters from a text value\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want RIGHT to extract.\n * @returns\n */\nexport function RIGHT(text, num_chars) {\n const someError = utils.anyError(text, num_chars)\n\n if (someError) {\n return someError\n }\n\n text = utils.parseString(text)\n num_chars = num_chars === undefined ? 1 : num_chars\n num_chars = utils.parseNumber(num_chars)\n\n if (num_chars instanceof Error) {\n return num_chars\n }\n\n return text.substring(text.length - num_chars)\n}\n\n/**\n * Finds one text value within another (not case-sensitive)\n *\n * Category: Text\n *\n * @param {*} find_text The text that you want to find.\n * @param {*} within_text The text in which you want to search for the value of the find_text argument.\n * @param {*} start_num Optional. The character number in the within_text argument at which you want to start searching.\n * @returns\n */\nexport function SEARCH(find_text, within_text, start_num) {\n let foundAt\n\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\n return error.value\n }\n\n start_num = start_num === undefined ? 0 : start_num\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1\n\n return foundAt === 0 ? error.value : foundAt\n}\n\n/**\n * Substitutes new text for old text in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text or the reference to a value containing text for which you want to substitute characters.\n * @param {*} old_text The text you want to replace.\n * @param {*} new_text The text you want to replace old_text with.\n * @param {*} instance_num Optional. Specifies which occurrence of old_text you want to replace with new_text. If you specify instance_num, only that instance of old_text is replaced. Otherwise, every occurrence of old_text in text is changed to new_text.\n * @returns\n */\nexport function SUBSTITUTE(text, old_text, new_text, instance_num) {\n if (arguments.length < 3) {\n return error.na\n }\n\n if (!text || !old_text) {\n return text\n } else if (instance_num === undefined) {\n return text.split(old_text).join(new_text)\n } else {\n instance_num = Math.floor(Number(instance_num))\n\n if (Number.isNaN(instance_num) || instance_num <= 0) {\n return error.value\n }\n\n let index = 0\n let i = 0\n\n while (index > -1 && text.indexOf(old_text, index) > -1) {\n index = text.indexOf(old_text, index + 1)\n i++\n\n if (index > -1 && i === instance_num) {\n return text.substring(0, index) + new_text + text.substring(index + old_text.length)\n }\n }\n\n return text\n }\n}\n\n/**\n * Converts its arguments to text.\n *\n * Category: Text\n *\n * @param {*} value The value you want to test.\n * @returns\n */\nexport function T(value) {\n if (value instanceof Error) {\n return value\n }\n\n return typeof value === 'string' ? value : ''\n}\n\n/**\n * Formats a number and converts it to text.\n *\n * Category: Text\n *\n * @param {*} value A numeric value that you want to be converted into text.\n * @param {*} format_text A text string that defines the formatting that you want to be applied to the supplied value.\n * @returns\n */\nexport function TEXT(value, format_text) {\n if (value === undefined || value instanceof Error || format_text instanceof Error) {\n return error.na\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10)\n }\n\n if (format_text === undefined || format_text === null) {\n return ''\n }\n\n if (typeof format_text === 'number') {\n return String(format_text)\n }\n\n if (typeof format_text !== 'string') {\n return error.value\n }\n\n const currencySymbol = format_text.startsWith('$') ? '$' : ''\n const isPercent = format_text.endsWith('%')\n format_text = format_text.replace(/%/g, '').replace(/\\$/g, '')\n\n // count all 0s after the decimal point\n const decimalPlaces = format_text.includes('.') ? format_text.split('.')[1].match(/0/g).length : 0\n\n const noCommas = !format_text.includes(',')\n\n if (isPercent) {\n value = value * 100\n }\n\n value = FIXED(value, decimalPlaces, noCommas)\n\n if (value.startsWith('-')) {\n value = value.replace('-', '')\n value = '-' + currencySymbol + value\n } else {\n value = currencySymbol + value\n }\n\n if (isPercent) {\n value = value + '%'\n }\n\n return value\n}\n\n/**\n * Combines the text from multiple ranges and/or strings.\n *\n * Category: Text\n * @param {*} delimiter A text string, either empty, or one or more characters enclosed by double quotes, or a reference to a valid text string. If a number is supplied, it will be treated as text.\n * @param {*} ignore_empty If TRUE, ignores empty values.\n * @param {*} args Text item to be joined. A text string, or array of strings, such as a range of values.\n * @returns\n */\nexport function TEXTJOIN(delimiter, ignore_empty, ...args) {\n if (typeof ignore_empty !== 'boolean') {\n ignore_empty = utils.parseBool(ignore_empty)\n }\n\n if (arguments.length < 3) {\n return error.na\n }\n\n delimiter = delimiter !== null && delimiter !== undefined ? delimiter : ''\n\n let flatArgs = utils.flatten(args)\n let textToJoin = ignore_empty ? flatArgs.filter((text) => text) : flatArgs\n\n if (Array.isArray(delimiter)) {\n delimiter = utils.flatten(delimiter)\n\n let chunks = textToJoin.map((item) => [item])\n let index = 0\n\n for (let i = 0; i < chunks.length - 1; i++) {\n chunks[i].push(delimiter[index])\n index++\n\n if (index === delimiter.length) {\n index = 0\n }\n }\n\n textToJoin = utils.flatten(chunks)\n\n return textToJoin.join('')\n }\n\n return textToJoin.join(delimiter)\n}\n\n/**\n * Removes spaces from text.\n *\n * Category: Text\n *\n * @param {*} text The text from which you want spaces removed.\n * @returns\n */\nexport function TRIM(text) {\n text = utils.parseString(text)\n\n if (text instanceof Error) {\n return text\n }\n\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nexport const UNICHAR = CHAR\n\nexport const UNICODE = CODE\n\n/**\n * Converts text to uppercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want converted to uppercase. Text can be a reference or text string.\n * @returns\n */\nexport function UPPER(text) {\n text = utils.parseString(text)\n\n if (text instanceof Error) {\n return text\n }\n\n return text.toUpperCase()\n}\n\n/**\n * Converts a text argument to a number.\n *\n * Category: Text\n *\n * @param {*} text The text enclosed in quotation marks or a reference to a value containing the text you want to convert.\n * @returns\n */\nexport function VALUE(text) {\n const anyError = utils.anyError(text)\n\n if (anyError) {\n return anyError\n }\n\n if (typeof text === 'number') {\n return text\n }\n\n if (!utils.isDefined(text)) {\n text = ''\n }\n\n if (typeof text !== 'string') {\n return error.value\n }\n\n const isPercent = /(%)$/.test(text) || /^(%)/.test(text)\n text = text.replace(/^[^0-9-]{0,3}/, '')\n text = text.replace(/[^0-9]{0,3}$/, '')\n text = text.replace(/[ ,]/g, '')\n\n if (text === '') {\n return 0\n }\n\n let output = Number(text)\n\n if (isNaN(output)) {\n return error.value\n }\n\n output = output || 0\n\n if (isPercent) {\n output = output * 0.01\n }\n\n return output\n}\n","import jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as mathTrig from './math-trig.js'\nimport * as lookup from './lookup-reference.js'\nimport * as utils from './utils/common.js'\n\nimport { T } from './text.js'\n\nconst SQRT2PI = 2.5066282746310002\n\n/**\n * Returns the average of the absolute deviations of data points from their mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the average of the absolute deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function AVEDEV() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.num\n }\n\n const range = utils.parseNumberArray(flatArgumentsDefined)\n\n if (range instanceof Error) {\n return range\n }\n\n return jStat.sum(jStat(range).subtract(jStat.mean(range)).abs()[0]) / range.length\n}\n\n/**\n * Returns the average of its arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ...Numbers, value references or ranges for which you want the average.\n * @returns\n */\nexport function AVERAGE() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.div0\n }\n\n const someError = utils.anyError.apply(undefined, flatArgumentsDefined)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArgumentsDefined)\n const n = range.length\n\n let sum = 0\n let count = 0\n let result\n\n for (let i = 0; i < n; i++) {\n sum += range[i]\n count += 1\n }\n\n result = sum / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the average of its arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values, ranges of values, or values for which you want the average.\n * @returns\n */\nexport function AVERAGEA() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter(utils.isDefined)\n\n if (flatArgumentsDefined.length === 0) {\n return error.div0\n }\n\n const someError = utils.anyError.apply(undefined, flatArgumentsDefined)\n\n if (someError) {\n return someError\n }\n\n const range = flatArgumentsDefined\n const n = range.length\n\n let sum = 0\n let count = 0\n let result\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sum += el\n }\n\n if (el === true) {\n sum++\n }\n\n if (el !== null) {\n count++\n }\n }\n\n result = sum / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the average (arithmetic mean) of all the values in a range that meet a given criteria.\n *\n * Category: Statistical\n *\n * @param {*} range One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @param {*} criteria The criteria in the form of a number, expression, value reference, or text that defines which values are averaged.\n * @param {*} average_range Optional. The actual set of values to average. If omitted, range is used.\n * @returns\n */\nexport function AVERAGEIF(range, criteria, average_range) {\n if (arguments.length <= 1) {\n return error.na\n }\n\n average_range = average_range || range\n\n const flatAverageRange = utils.flatten(average_range)\n const flatAverageRangeDefined = flatAverageRange.filter(utils.isDefined)\n\n average_range = utils.parseNumberArray(flatAverageRangeDefined)\n range = utils.flatten(range)\n\n if (average_range instanceof Error) {\n return average_range\n }\n\n let average_count = 0\n let result = 0\n\n const isWildcard = criteria === void 0 || criteria === '*'\n const tokenizedCriteria = isWildcard ? null : evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n\n if (isWildcard) {\n result += average_range[i]\n average_count++\n } else {\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n if (evalExpression.compute(tokens)) {\n result += average_range[i]\n average_count++\n }\n }\n }\n\n return result / average_count\n}\n\n/**\n * Returns the average (arithmetic mean) of all values that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @returns\n */\nexport function AVERAGEIFS() {\n // Does not work with multi dimensional ranges yet!\n // http://office.microsoft.com/en-001/excel-help/averageifs-function-HA010047493.aspx\n const values = utils.applyCriteria(...arguments)\n const result = values.reduce((acc, value) => acc + value, 0)\n const average = result / values.length\n\n return isNaN(average) ? 0 : average\n}\n\nexport const BETA = {}\n\n/**\n * Returns the beta cumulative distribution function.\n *\n * Category: Statistical\n *\n * @param {*} x The value between A and B at which to evaluate the function\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, BETA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.DIST = function (x, alpha, beta, cumulative, a, b) {\n if (arguments.length < 4) {\n return error.value\n }\n\n a = a === undefined ? 0 : a\n b = b === undefined ? 1 : b\n\n x = utils.parseNumber(x)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n a = utils.parseNumber(a)\n b = utils.parseNumber(b)\n\n if (utils.anyIsError(x, alpha, beta, a, b)) {\n return error.value\n }\n\n x = (x - a) / (b - a)\n\n return cumulative ? jStat.beta.cdf(x, alpha, beta) : jStat.beta.pdf(x, alpha, beta)\n}\n\n/**\n * Returns the inverse of the cumulative distribution function for a specified beta distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the beta distribution.\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter the distribution.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.INV = (probability, alpha, beta, a, b) => {\n a = a === undefined ? 0 : a\n b = b === undefined ? 1 : b\n probability = utils.parseNumber(probability)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n a = utils.parseNumber(a)\n b = utils.parseNumber(b)\n\n if (utils.anyIsError(probability, alpha, beta, a, b)) {\n return error.value\n }\n\n return jStat.beta.inv(probability, alpha, beta) * (b - a) + a\n}\n\nexport const BINOM = {}\n\n/**\n * Returns the individual term binomial distribution probability.\n *\n * Category: Statistical\n *\n * @param {*} number_s The number of successes in trials.\n * @param {*} trials The number of independent trials.\n * @param {*} probability_s The probability of success on each trial.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then BINOM.DIST returns the cumulative distribution function, which is the probability that there are at most number_s successes; if FALSE, it returns the probability mass function, which is the probability that there are number_s successes.\n * @returns\n */\nBINOM.DIST = (number_s, trials, probability_s, cumulative) => {\n number_s = utils.parseNumber(number_s)\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n cumulative = utils.parseNumber(cumulative)\n\n if (utils.anyIsError(number_s, trials, probability_s, cumulative)) {\n return error.value\n }\n\n return cumulative\n ? jStat.binomial.cdf(number_s, trials, probability_s)\n : jStat.binomial.pdf(number_s, trials, probability_s)\n}\n\n/**\n * Returns the probability of a trial result using a binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of independent trials. Must be greater than or equal to 0.\n * @param {*} probability_s The probability of success in each trial. Must be greater than or equal to 0 and less than or equal to 1.\n * @param {*} number_s The number of successes in trials. Must be greater than or equal to 0 and less than or equal to Trials.\n * @param {*} number_s2 Optional. If provided, returns the probability that the number of successful trials will fall between Number_s and number_s2. Must be greater than or equal to Number_s and less than or equal to Trials.\n * @returns\n */\nBINOM.DIST.RANGE = (trials, probability_s, number_s, number_s2) => {\n number_s2 = number_s2 === undefined ? number_s : number_s2\n\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n number_s = utils.parseNumber(number_s)\n number_s2 = utils.parseNumber(number_s2)\n\n if (utils.anyIsError(trials, probability_s, number_s, number_s2)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = number_s; i <= number_s2; i++) {\n result += mathTrig.COMBIN(trials, i) * Math.pow(probability_s, i) * Math.pow(1 - probability_s, trials - i)\n }\n\n return result\n}\n\n/**\n * Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of Bernoulli trials.\n * @param {*} probability_s The probability of a success on each trial.\n * @param {*} alpha The criterion value.\n * @returns\n */\nBINOM.INV = (trials, probability_s, alpha) => {\n trials = utils.parseNumber(trials)\n probability_s = utils.parseNumber(probability_s)\n alpha = utils.parseNumber(alpha)\n\n if (utils.anyIsError(trials, probability_s, alpha)) {\n return error.value\n }\n\n let x = 0\n\n while (x <= trials) {\n if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\n return x\n }\n\n x++\n }\n}\n\nexport const CHISQ = {}\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, CHISQ.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nCHISQ.DIST = (x, deg_freedom, cumulative) => {\n x = utils.parseNumber(x)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(x, deg_freedom)) {\n return error.value\n }\n\n return cumulative ? jStat.chisquare.cdf(x, deg_freedom) : jStat.chisquare.pdf(x, deg_freedom)\n}\n\n/**\n * Returns the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.DIST.RT = (x, deg_freedom) => {\n if (!x | !deg_freedom) {\n return error.na\n }\n\n if (x < 1 || deg_freedom > Math.pow(10, 10)) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return 1 - jStat.chisquare.cdf(x, deg_freedom)\n}\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return jStat.chisquare.inv(probability, deg_freedom)\n}\n\n/**\n * Returns the inverse of the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV.RT = (probability, deg_freedom) => {\n if (!probability | !deg_freedom) {\n return error.na\n }\n\n if (probability < 0 || probability > 1 || deg_freedom < 1 || deg_freedom > Math.pow(10, 10)) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return jStat.chisquare.inv(1.0 - probability, deg_freedom)\n}\n\n/**\n * Returns the test for independence.\n *\n * Category: Statistical\n *\n * @param {*} actual_range The range of data that contains observations to test against expected values.\n * @param {*} expected_range The range of data that contains the ratio of the product of row totals and column totals to the grand total.\n * @returns\n */\nCHISQ.TEST = function (actual_range, expected_range) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (!(actual_range instanceof Array) || !(expected_range instanceof Array)) {\n return error.value\n }\n\n if (actual_range.length !== expected_range.length) {\n return error.value\n }\n\n if (actual_range[0] && expected_range[0] && actual_range[0].length !== expected_range[0].length) {\n return error.value\n }\n\n const row = actual_range.length\n\n let tmp, i, j\n\n // Convert single-dimension array into two-dimension array\n\n for (i = 0; i < row; i++) {\n if (!(actual_range[i] instanceof Array)) {\n tmp = actual_range[i]\n\n actual_range[i] = []\n actual_range[i].push(tmp)\n }\n\n if (!(expected_range[i] instanceof Array)) {\n tmp = expected_range[i]\n\n expected_range[i] = []\n expected_range[i].push(tmp)\n }\n }\n\n const col = actual_range[0].length\n const dof = col === 1 ? row - 1 : (row - 1) * (col - 1)\n\n let xsqr = 0\n\n const Pi = Math.PI\n\n for (i = 0; i < row; i++) {\n for (j = 0; j < col; j++) {\n xsqr += Math.pow(actual_range[i][j] - expected_range[i][j], 2) / expected_range[i][j]\n }\n }\n\n // Get independency by X square and its degree of freedom\n function ChiSq(xsqr, dof) {\n let p = Math.exp(-0.5 * xsqr)\n\n if (dof % 2 === 1) {\n p = p * Math.sqrt((2 * xsqr) / Pi)\n }\n\n let k = dof\n\n while (k >= 2) {\n p = (p * xsqr) / k\n k = k - 2\n }\n\n let t = p\n let a = dof\n\n while (t > 0.0000000001 * p) {\n a = a + 2\n t = (t * xsqr) / a\n p = p + t\n }\n\n return 1 - p\n }\n\n return Math.round(ChiSq(xsqr, dof) * 1000000) / 1000000\n}\n\nexport const CONFIDENCE = {}\n\n/**\n * Returns the confidence interval for a population mean.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.NORM = (alpha, standard_dev, size) => {\n alpha = utils.parseNumber(alpha)\n standard_dev = utils.parseNumber(standard_dev)\n size = utils.parseNumber(size)\n\n if (utils.anyIsError(alpha, standard_dev, size)) {\n return error.value\n }\n\n return jStat.normalci(1, alpha, standard_dev, size)[1] - 1\n}\n\n/**\n * Returns the confidence interval for a population mean, using a Student's t distribution.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.T = (alpha, standard_dev, size) => {\n alpha = utils.parseNumber(alpha)\n standard_dev = utils.parseNumber(standard_dev)\n size = utils.parseNumber(size)\n\n if (utils.anyIsError(alpha, standard_dev, size)) {\n return error.value\n }\n\n return jStat.tci(1, alpha, standard_dev, size)[1] - 1\n}\n\n/**\n * Returns the correlation coefficient between two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 A range of value values.\n * @param {*} array2 A second range of value values.\n * @returns\n */\nexport function CORREL(array1, array2) {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n return jStat.corrcoeff(array1, array2)\n}\n\n/**\n * Counts how many numbers are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Cell reference, or range within which you want to count numbers.count numbers.\n * @returns\n */\nexport function COUNT() {\n const flatArguments = utils.flatten(arguments)\n\n return utils.numbers(flatArguments).length\n}\n\n/**\n * Counts how many values are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Arguments representing the values that you want to count.\n * @returns\n */\nexport function COUNTA() {\n const flatArguments = utils.flatten(arguments)\n\n return flatArguments.length - COUNTBLANK(flatArguments)\n}\n\n/**\n * Counts the number of blank values within a range.\n *\n * Category: Statistical\n *\n * @param {*} args The range from which you want to count the blank values.\n * @returns\n */\nexport function COUNTBLANK() {\n const range = utils.flatten(arguments)\n\n let blanks = 0\n let element\n\n for (let i = 0; i < range.length; i++) {\n element = range[i]\n\n if (element === undefined || element === null || element === '') {\n blanks++\n }\n }\n\n return blanks\n}\n\n/**\n * Counts the number of values within a range that meet the given criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function COUNTIF(range, criteria) {\n range = utils.flatten(range)\n\n const isWildcard = criteria === void 0 || criteria === '*'\n\n if (isWildcard) {\n return range.length\n }\n\n let matches = 0\n\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n if (evalExpression.compute(tokens)) {\n matches++\n }\n }\n\n return matches\n}\n\n/**\n * Counts the number of values within a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args Range in which to evaluate the associated criteria.\n * @returns\n */\nexport function COUNTIFS() {\n const args = utils.argsToArray(arguments)\n const results = new Array(utils.flatten(args[0]).length)\n\n for (let i = 0; i < results.length; i++) {\n results[i] = true\n }\n\n for (let i = 0; i < args.length; i += 2) {\n const range = utils.flatten(args[i])\n const criteria = args[i + 1]\n const isWildcard = criteria === void 0 || criteria === '*'\n\n if (!isWildcard) {\n const tokenizedCriteria = evalExpression.parse(criteria + '')\n\n for (let j = 0; j < range.length; j++) {\n const value = range[j]\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n results[j] = results[j] && evalExpression.compute(tokens)\n }\n }\n }\n\n let result = 0\n\n for (let i = 0; i < results.length; i++) {\n if (results[i]) {\n result++\n }\n }\n\n return result\n}\n\nexport const COVARIANCE = {}\n\n/**\n * Returns covariance, the average of the products of paired deviations.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.P = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n const mean1 = jStat.mean(array1)\n const mean2 = jStat.mean(array2)\n\n let result = 0\n\n const n = array1.length\n\n for (let i = 0; i < n; i++) {\n result += (array1[i] - mean1) * (array2[i] - mean2)\n }\n\n return result / n\n}\n\n/**\n * Returns the sample covariance, the average of the products deviations for each data point pair in two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.S = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n return jStat.covariance(array1, array2)\n}\n\n/**\n * Returns the sum of squares of deviations.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the sum of squared deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function DEVSQ() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n\n let result = 0\n\n for (let i = 0; i < range.length; i++) {\n result += Math.pow(range[i] - mean, 2)\n }\n\n return result\n}\n\nexport const EXPON = {}\n\n/**\n * Returns the exponential distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value of the function.\n * @param {*} lambda The parameter value.\n * @param {*} cumulative A logical value that indicates which form of the exponential function to provide. If cumulative is TRUE, EXPON.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nEXPON.DIST = (x, lambda, cumulative) => {\n x = utils.parseNumber(x)\n lambda = utils.parseNumber(lambda)\n\n if (utils.anyIsError(x, lambda)) {\n return error.value\n }\n\n return cumulative ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda)\n}\n\nexport const F = {}\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, F.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nF.DIST = (x, deg_freedom1, deg_freedom2, cumulative) => {\n x = utils.parseNumber(x)\n deg_freedom1 = utils.parseNumber(deg_freedom1)\n deg_freedom2 = utils.parseNumber(deg_freedom2)\n\n if (utils.anyIsError(x, deg_freedom1, deg_freedom2)) {\n return error.value\n }\n\n return cumulative\n ? jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n : jStat.centralF.pdf(x, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.DIST.RT = function (x, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (x < 0 || deg_freedom1 < 1 || deg_freedom2 < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return error.value\n }\n\n return 1 - jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV = (probability, deg_freedom1, deg_freedom2) => {\n probability = utils.parseNumber(probability)\n deg_freedom1 = utils.parseNumber(deg_freedom1)\n deg_freedom2 = utils.parseNumber(deg_freedom2)\n\n if (utils.anyIsError(probability, deg_freedom1, deg_freedom2)) {\n return error.value\n }\n\n if (probability <= 0.0 || probability > 1.0) {\n return error.num\n }\n\n return jStat.centralF.inv(probability, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV.RT = function (probability, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (\n probability < 0 ||\n probability > 1 ||\n deg_freedom1 < 1 ||\n deg_freedom1 > Math.pow(10, 10) ||\n deg_freedom2 < 1 ||\n deg_freedom2 > Math.pow(10, 10)\n ) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return error.value\n }\n\n return jStat.centralF.inv(1.0 - probability, deg_freedom1, deg_freedom2)\n}\n\n/**\n * Returns the result of an F-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first array or range of data.\n * @param {*} array2 The second array or range of data.\n * @returns\n */\nF.TEST = (array1, array2) => {\n if (!array1 || !array2) {\n return error.na\n }\n\n if (!(array1 instanceof Array) || !(array2 instanceof Array)) {\n return error.na\n }\n\n if (array1.length < 2 || array2.length < 2) {\n return error.div0\n }\n\n const sumOfSquares = (values, x1) => {\n let sum = 0\n\n for (let i = 0; i < values.length; i++) {\n sum += Math.pow(values[i] - x1, 2)\n }\n\n return sum\n }\n\n const x1 = mathTrig.SUM(array1) / array1.length\n const x2 = mathTrig.SUM(array2) / array2.length\n const sum1 = sumOfSquares(array1, x1) / (array1.length - 1)\n const sum2 = sumOfSquares(array2, x2) / (array2.length - 1)\n\n return sum1 / sum2\n}\n\n/**\n * Returns the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} x A numeric value for which you want the transformation.\n * @returns\n */\nexport function FISHER(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return x\n }\n\n return Math.log((1 + x) / (1 - x)) / 2\n}\n\n/**\n * Returns the inverse of the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} y The value for which you want to perform the inverse of the transformation.\n * @returns\n */\nexport function FISHERINV(y) {\n y = utils.parseNumber(y)\n\n if (y instanceof Error) {\n return y\n }\n\n const e2y = Math.exp(2 * y)\n\n return (e2y - 1) / (e2y + 1)\n}\n\n/**\n * Returns a value along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} x The data point for which you want to predict a value.\n * @param {*} known_ys The dependent array or range of data.\n * @param {*} known_xs The independent array or range of data.\n * @returns\n */\nexport function FORECAST(x, known_ys, known_xs) {\n x = utils.parseNumber(x)\n known_ys = utils.parseNumberArray(utils.flatten(known_ys))\n known_xs = utils.parseNumberArray(utils.flatten(known_xs))\n\n if (utils.anyIsError(x, known_ys, known_xs)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_xs)\n const ymean = jStat.mean(known_ys)\n\n const n = known_xs.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_xs[i] - xmean) * (known_ys[i] - ymean)\n den += Math.pow(known_xs[i] - xmean, 2)\n }\n\n const b = num / den\n const a = ymean - b * xmean\n\n return a + b * x\n}\n\n/**\n * Returns a frequency distribution as a vertical array.\n *\n * Category: Statistical\n *\n * @param {*} data_array An array of or reference to a set of values for which you want to count frequencies. If data_array contains no values, FREQUENCY returns an array of zeros.\n * @param {*} bins_array An array of or reference to intervals into which you want to group the values in data_array. If bins_array contains no values, FREQUENCY returns the number of elements in data_array.\n * @returns\n */\nexport function FREQUENCY(data_array, bins_array) {\n data_array = utils.parseNumberArray(utils.flatten(data_array))\n bins_array = utils.parseNumberArray(utils.flatten(bins_array))\n\n if (utils.anyIsError(data_array, bins_array)) {\n return error.value\n }\n\n const n = data_array.length\n const b = bins_array.length\n const r = []\n\n for (let i = 0; i <= b; i++) {\n r[i] = 0\n\n for (let j = 0; j < n; j++) {\n if (i === 0) {\n if (data_array[j] <= bins_array[0]) {\n r[0] += 1\n }\n } else if (i < b) {\n if (data_array[j] > bins_array[i - 1] && data_array[j] <= bins_array[i]) {\n r[i] += 1\n }\n } else if (i === b) {\n if (data_array[j] > bins_array[b - 1]) {\n r[b] += 1\n }\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the Gamma function value.\n *\n * Category: Statistical\n *\n * @param {*} number Returns a number.\n * @returns\n */\nexport function GAMMA(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n if (parseInt(number, 10) === number && number < 0) {\n return error.num\n }\n\n return jStat.gammafn(number)\n}\n\n/**\n * Returns the gamma distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.DIST returns the standard gamma distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, GAMMA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nGAMMA.DIST = function (value, alpha, beta, cumulative) {\n if (arguments.length !== 4) {\n return error.na\n }\n\n if (value < 0 || alpha <= 0 || beta <= 0) {\n return error.value\n }\n\n if (typeof value !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return error.value\n }\n\n return cumulative ? jStat.gamma.cdf(value, alpha, beta, true) : jStat.gamma.pdf(value, alpha, beta, false)\n}\n\n/**\n * Returns the inverse of the gamma cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the gamma distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.INV returns the standard gamma distribution.\n * @returns\n */\nGAMMA.INV = function (probability, alpha, beta) {\n if (arguments.length !== 3) {\n return error.na\n }\n\n if (probability < 0 || probability > 1 || alpha <= 0 || beta <= 0) {\n return error.num\n }\n\n if (typeof probability !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return error.value\n }\n\n return jStat.gamma.inv(probability, alpha, beta)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.\n * @returns\n */\nexport function GAMMALN(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return x\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.PRECISE.\n * @returns\n */\nGAMMALN.PRECISE = function (x) {\n if (arguments.length !== 1) {\n return error.na\n }\n\n if (x <= 0) {\n return error.num\n }\n\n if (typeof x !== 'number') {\n return error.value\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns 0.5 less than the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z Returns a number.\n * @returns\n */\nexport function GAUSS(z) {\n z = utils.parseNumber(z)\n\n if (z instanceof Error) {\n return z\n }\n\n return jStat.normal.cdf(z, 0, 1) - 0.5\n}\n\n/**\n * Returns the geometric mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function GEOMEAN() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n return jStat.geomean(args)\n}\n\n/**\n * Returns values along an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n - If any of the numbers in known_y's is 0 or negative, GROWTH returns the #NUM! error value.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} new_x Optional. Are new x-values for which you want GROWTH to return corresponding y-values.\n - new_x's must include a column (or row) for each independent variable, just as known_x's does. So, if known_y's is in a single column, known_x's and new_x's must have the same number of columns. If known_y's is in a single row, known_x's and new_x's must have the same number of rows.\n - If new_x's is omitted, it is assumed to be the same as known_x's.\n - If both known_x's and new_x's are omitted, they are assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} use_const Optional. A logical value specifying whether to force the constant b to equal 1. If const is TRUE or omitted, b is calculated normally. If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n - If const is TRUE or omitted, b is calculated normally.\n - If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n * @returns\n */\nexport function GROWTH(known_y, known_x, new_x, use_const) {\n // Credits: Ilmari Karonen (http://stackoverflow.com/questions/14161990/how-to-implement-growth-function-in-javascript)\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n\n if (known_y instanceof Error) {\n return known_y\n }\n\n // Default values for optional parameters:\n let i\n\n if (known_x === undefined) {\n known_x = []\n\n for (i = 1; i <= known_y.length; i++) {\n known_x.push(i)\n }\n }\n\n if (new_x === undefined) {\n new_x = known_x\n }\n\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n new_x = utils.parseNumberArray(utils.flatten(new_x))\n\n if (utils.anyIsError(known_x, new_x)) {\n return error.value\n }\n\n if (use_const === undefined) {\n use_const = true\n }\n\n // Calculate sums over the data:\n const n = known_y.length\n\n let avg_x = 0\n let avg_y = 0\n let avg_xy = 0\n let avg_xx = 0\n\n for (i = 0; i < n; i++) {\n const x = known_x[i]\n const y = Math.log(known_y[i])\n\n avg_x += x\n avg_y += y\n avg_xy += x * y\n avg_xx += x * x\n }\n\n avg_x /= n\n avg_y /= n\n avg_xy /= n\n avg_xx /= n\n\n // Compute linear regression coefficients:\n let beta\n let alpha\n\n if (use_const) {\n beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x)\n alpha = avg_y - beta * avg_x\n } else {\n beta = avg_xy / avg_xx\n alpha = 0\n }\n\n // Compute and return result array:\n const new_y = []\n\n for (i = 0; i < new_x.length; i++) {\n new_y.push(Math.exp(alpha + beta * new_x[i]))\n }\n\n return new_y\n}\n\n/**\n * Returns the harmonic mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function HARMEAN() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n\n let den = 0\n\n for (let i = 0; i < n; i++) {\n den += 1 / range[i]\n }\n\n return n / den\n}\n\nexport const HYPGEOM = {}\n\n/**\n * Returns the hypergeometric distribution.\n *\n * Category: Statistical\n *\n * @param {*} sample_s The number of successes in the sample.\n * @param {*} number_sample The size of the sample.\n * @param {*} population_s The number of successes in the population.\n * @param {*} number_pop The population size.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then HYPGEOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nHYPGEOM.DIST = (sample_s, number_sample, population_s, number_pop, cumulative) => {\n sample_s = utils.parseNumber(sample_s)\n number_sample = utils.parseNumber(number_sample)\n population_s = utils.parseNumber(population_s)\n number_pop = utils.parseNumber(number_pop)\n\n if (utils.anyIsError(sample_s, number_sample, population_s, number_pop)) {\n return error.value\n }\n\n function pdf(x, n, M, N) {\n return (mathTrig.COMBIN(M, x) * mathTrig.COMBIN(N - M, n - x)) / mathTrig.COMBIN(N, n)\n }\n\n function cdf(x, n, M, N) {\n let result = 0\n\n for (let i = 0; i <= x; i++) {\n result += pdf(i, n, M, N)\n }\n\n return result\n }\n\n return cumulative\n ? cdf(sample_s, number_sample, population_s, number_pop)\n : pdf(sample_s, number_sample, population_s, number_pop)\n}\n\n/**\n * Returns the intercept of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y The dependent set of observations or data.\n * @param {*} known_x The independent set of observations or data.\n * @returns\n */\nexport function INTERCEPT(known_y, known_x) {\n known_y = utils.parseNumberArray(known_y)\n known_x = utils.parseNumberArray(known_x)\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n if (known_y.length !== known_x.length) {\n return error.na\n }\n\n return FORECAST(0, known_y, known_x)\n}\n\n/**\n * Returns the kurtosis of a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate kurtosis. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function KURT() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let sigma = 0\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 4)\n }\n\n sigma = sigma / Math.pow(jStat.stdev(range, true), 4)\n\n return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - (3 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))\n}\n\n/**\n * Returns the k-th largest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data for which you want to determine the k-th largest value.\n * @param {*} k The position (from the largest) in the array or value range of data to return.\n * @returns\n */\nexport function LARGE(array, k) {\n const someError = utils.anyError.apply(undefined, array)\n\n if (someError) {\n return someError\n }\n\n if (utils.anyIsError(k)) {\n return k\n }\n\n array = utils.numbers(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (k < 0 || array.length < k) {\n return error.value\n }\n\n return array.sort((a, b) => b - a)[k - 1]\n}\n\n/**\n * Returns the parameters of a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values that you already know in the relationship y = mx + b.\n - If the range of known_y's is in a single column, each column of known_x's is interpreted as a separate variable.\n - If the range of known_y's is contained in a single row, each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. A set of x-values that you may already know in the relationship y = mx + b.\n - The range of known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nexport function LINEST(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const ymean = jStat.mean(known_y)\n const xmean = jStat.mean(known_x)\n const n = known_x.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n const m = num / den\n const b = ymean - m * xmean\n\n return [m, b]\n}\n\n// According to Microsoft:\n// http://office.microsoft.com/en-us/starter-help/logest-function-HP010342665.aspx\n// LOGEST returns are based on the following linear model:\n// ln y = x1 ln m1 + ... + xn ln mn + ln b\n/**\n * Returns the parameters of an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a range of values with a height of one row or a width of one column (which is also known as a vector).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nexport function LOGEST(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n if (known_y.length !== known_x.length) {\n return error.value\n }\n\n for (let i = 0; i < known_y.length; i++) {\n known_y[i] = Math.log(known_y[i])\n }\n\n const result = LINEST(known_y, known_x)\n\n result[0] = Math.round(Math.exp(result[0]) * 1000000) / 1000000\n result[1] = Math.round(Math.exp(result[1]) * 1000000) / 1000000\n\n return result\n}\n\nexport const LOGNORM = {}\n\n/**\n * Returns the cumulative lognormal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, LOGNORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nLOGNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n return cumulative ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev)\n}\n\n/**\n * Returns the inverse of the lognormal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the lognormal distribution.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @returns\n */\nLOGNORM.INV = (probability, mean, standard_dev) => {\n probability = utils.parseNumber(probability)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(probability, mean, standard_dev)) {\n return error.value\n }\n\n return jStat.lognormal.inv(probability, mean, standard_dev)\n}\n\n/**\n * Returns the maximum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want to find the maximum value.\n * @returns\n */\nexport function MAX() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArguments)\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2,... Number arguments 2 to 255 for which you want to find the largest value.\n * @returns\n */\nexport function MAXA() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n let range = utils.arrayValuesToNumbers(flatArguments)\n\n range = range.map((value) => (value === undefined || value === null ? 0 : value))\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum of all values in a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function MAXIFS() {\n const values = utils.applyCriteria(...arguments)\n\n return values.length === 0 ? 0 : Math.max.apply(Math, values)\n}\n\n/**\n * Returns the median of the given numbers.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want the median.\n * @returns\n */\nexport function MEDIAN() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.arrayValuesToNumbers(flatArguments)\n\n let result = jStat.median(range)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the minimum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is optional, subsequent numbers are optional. 1 to 255 numbers for which you want to find the minimum value.\n * @returns\n */\nexport function MIN() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n const range = utils.numbers(flatArguments)\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the smallest value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values for which you want to find the smallest value.\n * @returns\n */\nexport function MINA() {\n const flatArguments = utils.flatten(arguments)\n const someError = utils.anyError.apply(undefined, flatArguments)\n\n if (someError) {\n return someError\n }\n\n let range = utils.arrayValuesToNumbers(flatArguments)\n\n range = range.map((value) => (value === undefined || value === null ? 0 : value))\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the minimum of all values in a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nexport function MINIFS() {\n const values = utils.applyCriteria(...arguments)\n\n return values.length === 0 ? 0 : Math.min.apply(Math, values)\n}\n\nexport const MODE = {}\n\n/**\n * Returns a vertical array of the most frequently occurring, or repetitive values in an array or range of data.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.MULT = function () {\n // Credits: Roönaän\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n const count = {}\n\n let maxItems = []\n let max = 0\n let currentItem\n\n for (let i = 0; i < n; i++) {\n currentItem = range[i]\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1\n\n if (count[currentItem] > max) {\n max = count[currentItem]\n maxItems = []\n }\n\n if (count[currentItem] === max) {\n maxItems[maxItems.length] = currentItem\n }\n }\n\n return maxItems\n}\n\n/**\n * Returns the most common value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.SNGL = function () {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n return MODE.MULT(range).sort((a, b) => a - b)[0]\n}\n\nexport const NEGBINOM = {}\n\n/**\n * Returns the negative binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} number_f The number of failures.\n * @param {*} number_s The threshold number of successes.\n * @param {*} probability_s The probability of a success.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NEGBINOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNEGBINOM.DIST = (number_f, number_s, probability_s, cumulative) => {\n number_f = utils.parseNumber(number_f)\n number_s = utils.parseNumber(number_s)\n probability_s = utils.parseNumber(probability_s)\n\n if (utils.anyIsError(number_f, number_s, probability_s)) {\n return error.value\n }\n\n return cumulative\n ? jStat.negbin.cdf(number_f, number_s, probability_s)\n : jStat.negbin.pdf(number_f, number_s, probability_s)\n}\n\nexport const NORM = {}\n\n/**\n * Returns the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want the distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n if (standard_dev <= 0) {\n return error.num\n }\n\n // Return normal distribution computed by jStat [http://jstat.org]\n return cumulative ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev)\n}\n\n/**\n * Returns the inverse of the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nNORM.INV = (probability, mean, standard_dev) => {\n probability = utils.parseNumber(probability)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(probability, mean, standard_dev)) {\n return error.value\n }\n\n return jStat.normal.inv(probability, mean, standard_dev)\n}\n\nNORM.S = {}\n\n/**\n * Returns the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z The value for which you want the distribution.\n * @param {*} cumulative Cumulative is a logical value that determines the form of the function. If cumulative is TRUE, NORMS.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nNORM.S.DIST = (z, cumulative) => {\n z = utils.parseNumber(z)\n\n if (z instanceof Error) {\n return error.value\n }\n\n return cumulative ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1)\n}\n\n/**\n * Returns the inverse of the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @returns\n */\nNORM.S.INV = (probability) => {\n probability = utils.parseNumber(probability)\n\n if (probability instanceof Error) {\n return error.value\n }\n\n return jStat.normal.inv(probability, 0, 1)\n}\n\n/**\n * Returns the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} array1 A set of independent values.\n * @param {*} array2 A set of dependent values.\n * @returns\n */\nexport function PEARSON(array1, array2) {\n array2 = utils.parseNumberArray(utils.flatten(array2))\n array1 = utils.parseNumberArray(utils.flatten(array1))\n\n if (utils.anyIsError(array2, array1)) {\n return error.value\n }\n\n const xmean = jStat.mean(array1)\n const ymean = jStat.mean(array2)\n const n = array1.length\n\n let num = 0\n let den1 = 0\n let den2 = 0\n\n for (let i = 0; i < n; i++) {\n num += (array1[i] - xmean) * (array2[i] - ymean)\n den1 += Math.pow(array1[i] - xmean, 2)\n den2 += Math.pow(array2[i] - ymean, 2)\n }\n\n return num / Math.sqrt(den1 * den2)\n}\n\nexport const PERCENTILE = {}\n\n/**\n * Returns the k-th percentile of values in a range, where k is in the range 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @returns\n */\nPERCENTILE.EXC = (array, k) => {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const n = array.length\n\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\n return error.num\n }\n\n const l = k * (n + 1) - 1\n const fl = Math.floor(l)\n\n return utils.cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n}\n\n/**\n * Returns the k-th percentile of values in a range.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data that defines relative standing.\n * @param {*} k The percentile value in the range 0..1, inclusive.\n * @returns\n */\nPERCENTILE.INC = (array, k) => {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const n = array.length\n const l = k * (n - 1)\n const fl = Math.floor(l)\n\n return utils.cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n}\n\nexport const PERCENTRANK = {}\n\n/**\n * Returns the rank of a value in a data set as a percentage (0..1, exclusive) of the data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.EXC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.EXC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n significance = utils.parseNumber(significance)\n\n if (utils.anyIsError(array, x, significance)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const uniques = lookup.UNIQUE.apply(null, array)\n const n = array.length\n const m = uniques.length\n const power = Math.pow(10, significance)\n\n let result = 0\n let match = false\n let i = 0\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = (array.indexOf(uniques[i]) + 1) / (n + 1)\n match = true\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1)\n match = true\n }\n\n i++\n }\n\n return Math.floor(result * power) / power\n}\n\n/**\n * Returns the percentage rank of a value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing.\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.INC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.INC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n significance = utils.parseNumber(significance)\n\n if (utils.anyIsError(array, x, significance)) {\n return error.value\n }\n\n array = array.sort((a, b) => a - b)\n\n const uniques = lookup.UNIQUE.apply(null, array)\n const n = array.length\n const m = uniques.length\n const power = Math.pow(10, significance)\n\n let result = 0\n let match = false\n let i = 0\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = array.indexOf(uniques[i]) / (n - 1)\n match = true\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1)\n match = true\n }\n\n i++\n }\n\n return Math.floor(result * power) / power\n}\n\n/**\n * Returns the number of permutations for a given number of objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nexport function PERMUT(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n\n if (utils.anyIsError(number, number_chosen)) {\n return error.value\n }\n\n return mathTrig.FACT(number) / mathTrig.FACT(number - number_chosen)\n}\n\n/**\n * Returns the number of permutations for a given number of objects (with repetitions) that can be selected from the total objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the total number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nexport function PERMUTATIONA(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n\n if (utils.anyIsError(number, number_chosen)) {\n return error.value\n }\n\n return Math.pow(number, number_chosen)\n}\n\n/**\n * Returns the value of the density function for a standard normal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x X is the number for which you want the density of the standard normal distribution.\n * @returns\n */\nexport function PHI(x) {\n x = utils.parseNumber(x)\n\n if (x instanceof Error) {\n return error.value\n }\n\n return Math.exp(-0.5 * x * x) / SQRT2PI\n}\n\nexport const POISSON = {}\n\n/**\n * Returns the Poisson distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The number of events.\n * @param {*} mean The expected numeric value.\n * @param {*} cumulative A logical value that determines the form of the probability distribution returned. If cumulative is TRUE, POISSON.DIST returns the cumulative Poisson probability that the number of random events occurring will be between zero and x inclusive; if FALSE, it returns the Poisson probability mass function that the number of events occurring will be exactly x.\n * @returns\n */\nPOISSON.DIST = (x, mean, cumulative) => {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n\n if (utils.anyIsError(x, mean)) {\n return error.value\n }\n\n return cumulative ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean)\n}\n\n/**\n * Returns the probability that values in a range are between two limits.\n *\n * Category: Statistical\n *\n * @param {*} x_range The range of numeric values of x with which there are associated probabilities.\n * @param {*} prob_range A set of probabilities associated with values in x_range.\n * @param {*} lower_limit Optional. The lower bound on the value for which you want a probability.\n * @param {*} upper_limit Optional. The optional upper bound on the value for which you want a probability.\n * @returns\n */\nexport function PROB(x_range, prob_range, lower_limit, upper_limit) {\n if (lower_limit === undefined) {\n return 0\n }\n\n upper_limit = upper_limit === undefined ? lower_limit : upper_limit\n\n x_range = utils.parseNumberArray(utils.flatten(x_range))\n prob_range = utils.parseNumberArray(utils.flatten(prob_range))\n lower_limit = utils.parseNumber(lower_limit)\n upper_limit = utils.parseNumber(upper_limit)\n\n if (utils.anyIsError(x_range, prob_range, lower_limit, upper_limit)) {\n return error.value\n }\n\n if (lower_limit === upper_limit) {\n return x_range.indexOf(lower_limit) >= 0 ? prob_range[x_range.indexOf(lower_limit)] : 0\n }\n\n const sorted = x_range.sort((a, b) => a - b)\n const n = sorted.length\n\n let result = 0\n\n for (let i = 0; i < n; i++) {\n if (sorted[i] >= lower_limit && sorted[i] <= upper_limit) {\n result += prob_range[x_range.indexOf(sorted[i])]\n }\n }\n\n return result\n}\n\nexport const QUARTILE = {}\n\n/**\n * Returns the quartile of the data set, based on percentile values from 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.EXC = (range, quart) => {\n range = utils.parseNumberArray(utils.numbers(utils.flatten(range)))\n quart = utils.parseNumber(quart)\n\n if (utils.anyIsError(range, quart)) {\n return error.value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.EXC(range, 0.25)\n case 2:\n return PERCENTILE.EXC(range, 0.5)\n case 3:\n return PERCENTILE.EXC(range, 0.75)\n default:\n return error.num\n }\n}\n\n/**\n * Returns the quartile of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.INC = (range, quart) => {\n range = utils.parseNumberArray(utils.numbers(utils.flatten(range)))\n quart = utils.parseNumber(quart)\n\n if (utils.anyIsError(range, quart)) {\n return error.value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.INC(range, 0.25)\n case 2:\n return PERCENTILE.INC(range, 0.5)\n case 3:\n return PERCENTILE.INC(range, 0.75)\n default:\n return error.num\n }\n}\n\nexport const RANK = {}\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Nonnumeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.AVG = (number, ref, order) => {\n number = utils.parseNumber(number)\n ref = utils.parseNumberArray(utils.flatten(ref))\n\n if (utils.anyIsError(number, ref)) {\n return error.value\n }\n\n ref = utils.flatten(ref)\n order = order || false\n\n const sort = order ? (a, b) => a - b : (a, b) => b - a\n\n ref = ref.sort(sort)\n\n const length = ref.length\n\n let count = 0\n\n for (let i = 0; i < length; i++) {\n if (ref[i] === number) {\n count++\n }\n }\n\n return count > 1 ? (2 * ref.indexOf(number) + count + 1) / 2 : ref.indexOf(number) + 1\n}\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Non-numeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.EQ = (number, ref, order) => {\n number = utils.parseNumber(number)\n ref = utils.parseNumberArray(utils.flatten(ref))\n\n if (utils.anyIsError(number, ref)) {\n return error.value\n }\n\n order = order || false\n\n const sort = order ? (a, b) => a - b : (a, b) => b - a\n\n ref = ref.sort(sort)\n\n return ref.indexOf(number) + 1\n}\n\n/**\n * Returns the row number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want the row number.\n * @param {*} index\n * @returns\n */\nexport function ROW(reference, index) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (index < 0) {\n return error.num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return error.value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.row(reference, index)\n}\n\n/**\n * Returns the square of the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of data points.\n * @param {*} known_x An array or range of data points.\n * @returns\n */\nexport function RSQ(known_y, known_x) {\n // no need to flatten here, PEARSON will take care of that\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n return Math.pow(PEARSON(known_y, known_x), 2)\n}\n\n/**\n * Returns the skewness of a distribution.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate skewness. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function SKEW() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let sigma = 0\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 3)\n }\n\n return (n * sigma) / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(range, true), 3))\n}\n\n/**\n * Returns the skewness of a distribution based on a population.\n *\n * Category: Statistical\n *\n * @returns\n */\nSKEW.P = function () {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range)\n const n = range.length\n\n let m2 = 0\n let m3 = 0\n\n for (let i = 0; i < n; i++) {\n m3 += Math.pow(range[i] - mean, 3)\n m2 += Math.pow(range[i] - mean, 2)\n }\n\n m3 = m3 / n\n m2 = m2 / n\n\n return m3 / Math.pow(m2, 3 / 2)\n}\n\n/**\n * Returns the slope of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or value range of numeric dependent data points.\n * @param {*} known_x The set of independent data points.\n * @returns\n */\nexport function SLOPE(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_x)\n const ymean = jStat.mean(known_y)\n const n = known_x.length\n\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n return num / den\n}\n\n/**\n * Returns the k-th smallest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array An array or range of numerical data for which you want to determine the k-th smallest value.\n * @param {*} k The position (from the smallest) in the array or range of data to return.\n * @returns\n */\nexport function SMALL(array, k) {\n array = utils.parseNumberArray(utils.flatten(array))\n k = utils.parseNumber(k)\n\n if (utils.anyIsError(array, k)) {\n return array\n }\n\n return array.sort((a, b) => a - b)[k - 1]\n}\n\n/**\n * Returns a normalized value.\n *\n * Category: Statistical\n *\n * @param {*} x The value you want to normalize.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nexport function STANDARDIZE(x, mean, standard_dev) {\n x = utils.parseNumber(x)\n mean = utils.parseNumber(mean)\n standard_dev = utils.parseNumber(standard_dev)\n\n if (utils.anyIsError(x, mean, standard_dev)) {\n return error.value\n }\n\n return (x - mean) / standard_dev\n}\n\nexport const STDEV = {}\n\n/**\n * Calculates standard deviation based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.P = function () {\n const v = VAR.P.apply(this, arguments)\n\n let result = Math.sqrt(v)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Estimates standard deviation based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.S = function () {\n const v = VAR.S.apply(this, arguments)\n const result = Math.sqrt(v)\n\n return result\n}\n\n/**\n * Estimates standard deviation based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function STDEVA() {\n const v = VARA.apply(this, arguments)\n const result = Math.sqrt(v)\n\n return result\n}\n\n/**\n * Calculates standard deviation based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function STDEVPA() {\n const v = VARPA.apply(this, arguments)\n\n let result = Math.sqrt(v)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the standard error of the predicted y-value for each x in the regression.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of dependent data points.\n * @param {*} known_x An array or range of independent data points.\n * @returns\n */\nexport function STEYX(known_y, known_x) {\n known_y = utils.parseNumberArray(utils.flatten(known_y))\n known_x = utils.parseNumberArray(utils.flatten(known_x))\n\n if (utils.anyIsError(known_y, known_x)) {\n return error.value\n }\n\n const xmean = jStat.mean(known_x)\n const ymean = jStat.mean(known_y)\n const n = known_x.length\n\n let lft = 0\n let num = 0\n let den = 0\n\n for (let i = 0; i < n; i++) {\n lft += Math.pow(known_y[i] - ymean, 2)\n num += (known_x[i] - xmean) * (known_y[i] - ymean)\n den += Math.pow(known_x[i] - xmean, 2)\n }\n\n return Math.sqrt((lft - (num * num) / den) / (n - 2))\n}\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nT.DIST = (x, deg_freedom, cumulative) => {\n if (cumulative !== 1 && cumulative !== 2) {\n return error.num\n }\n\n return cumulative === 1 ? T.DIST.RT(x, deg_freedom) : T.DIST['2T'](x, deg_freedom)\n}\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT.DIST['2T'] = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return (1 - jStat.studentt.cdf(x, deg_freedom)) * 2\n}\n\n/**\n * Returns the Student's t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT.DIST.RT = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return error.num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return error.value\n }\n\n return 1 - jStat.studentt.cdf(x, deg_freedom)\n}\n\n/**\n * Returns the t-value of the Student's t-distribution as a function of the probability and the degrees of freedom.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT.INV = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return jStat.studentt.inv(probability, deg_freedom)\n}\n\n/**\n * Returns the inverse of the Student's t-distribution\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT.INV['2T'] = (probability, deg_freedom) => {\n probability = utils.parseNumber(probability)\n deg_freedom = utils.parseNumber(deg_freedom)\n\n if (probability <= 0 || probability > 1 || deg_freedom < 1) {\n return error.num\n }\n\n if (utils.anyIsError(probability, deg_freedom)) {\n return error.value\n }\n\n return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom))\n}\n\n// The algorithm can be found here:\n// http://www.chem.uoa.gr/applets/AppletTtest/Appl_Ttest2.html\n/**\n * Returns the probability associated with a Student's t-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first data set.\n * @param {*} array2 The second data set.\n * @returns\n */\nT.TEST = (array1, array2) => {\n array1 = utils.parseNumberArray(utils.flatten(array1))\n array2 = utils.parseNumberArray(utils.flatten(array2))\n\n if (utils.anyIsError(array1, array2)) {\n return error.value\n }\n\n const mean_x = jStat.mean(array1)\n const mean_y = jStat.mean(array2)\n\n let s_x = 0\n let s_y = 0\n let i\n\n for (i = 0; i < array1.length; i++) {\n s_x += Math.pow(array1[i] - mean_x, 2)\n }\n\n for (i = 0; i < array2.length; i++) {\n s_y += Math.pow(array2[i] - mean_y, 2)\n }\n\n s_x = s_x / (array1.length - 1)\n s_y = s_y / (array2.length - 1)\n\n const t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / array1.length + s_y / array2.length)\n\n return T.DIST['2T'](t, array1.length + array2.length - 2)\n}\n\n// Re-export T with statistical methods\nexport { T }\n\n/**\n * Returns values along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_ys The set of y-values you already know in the relationship y = mx + b\n * @param {*} known_xs An optional set of x-values that you may already know in the relationship y = mx + b\n * @param {*} new_xs Optional. New x-values for which you want TREND to return corresponding y-values.\n * @returns\n */\nexport function TREND(known_ys, known_xs, new_xs) {\n known_ys = utils.parseNumberArray(utils.flatten(known_ys))\n known_xs = utils.parseNumberArray(utils.flatten(known_xs))\n new_xs = utils.parseNumberArray(utils.flatten(new_xs))\n\n if (utils.anyIsError(known_ys, known_xs, new_xs)) {\n return error.value\n }\n\n const linest = LINEST(known_ys, known_xs)\n const m = linest[0]\n const b = linest[1]\n const result = []\n\n new_xs.forEach((x) => {\n result.push(m * x + b)\n })\n\n return result\n}\n\n/**\n * Returns the mean of the interior of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of values to trim and average.\n * @param {*} percent The fractional number of data points to exclude from the calculation. For example, if percent = 0.2, 4 points are trimmed from a data set of 20 points (20 x 0.2): 2 from the top and 2 from the bottom of the set.\n * @returns\n */\nexport function TRIMMEAN(range, percent) {\n range = utils.parseNumberArray(utils.flatten(range))\n percent = utils.parseNumber(percent)\n\n if (utils.anyIsError(range, percent)) {\n return error.value\n }\n\n const trim = mathTrig.FLOOR(range.length * percent, 2) / 2\n\n return jStat.mean(\n utils.initial(\n utils.rest(\n range.sort((a, b) => a - b),\n trim\n ),\n trim\n )\n )\n}\n\nexport const VAR = {}\n\n/**\n * Calculates variance based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population.\n * @returns\n */\nVAR.P = function () {\n const range = utils.numbers(utils.flatten(arguments))\n const n = range.length\n\n let sigma = 0\n\n const mean = AVERAGE(range)\n\n let result\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2)\n }\n\n result = sigma / n\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Estimates variance based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population.\n * @returns\n */\nVAR.S = function () {\n const range = utils.numbers(utils.flatten(arguments))\n const n = range.length\n\n let sigma = 0\n\n const mean = AVERAGE(range)\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2)\n }\n\n return sigma / (n - 1)\n}\n\n/**\n * Estimates variance based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a sample of a population.\n * @returns\n */\nexport function VARA() {\n const range = utils.flatten(arguments)\n const n = range.length\n\n let sigma = 0\n let count = 0\n\n const mean = AVERAGEA(range)\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2)\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2)\n } else {\n sigma += Math.pow(0 - mean, 2)\n }\n\n if (el !== null) {\n count++\n }\n }\n\n return sigma / (count - 1)\n}\n\n/**\n * Calculates variance based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a population.\n * @returns\n */\nexport function VARPA() {\n const range = utils.flatten(arguments)\n const n = range.length\n\n let sigma = 0\n let count = 0\n\n const mean = AVERAGEA(range)\n\n let result\n\n for (let i = 0; i < n; i++) {\n const el = range[i]\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2)\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2)\n } else {\n sigma += Math.pow(0 - mean, 2)\n }\n\n if (el !== null) {\n count++\n }\n }\n\n result = sigma / count\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\nexport const WEIBULL = {}\n\n/**\n * Returns the Weibull distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution.\n * @param {*} cumulative Determines the form of the function.\n * @returns\n */\nWEIBULL.DIST = (x, alpha, beta, cumulative) => {\n x = utils.parseNumber(x)\n alpha = utils.parseNumber(alpha)\n beta = utils.parseNumber(beta)\n\n if (utils.anyIsError(x, alpha, beta)) {\n return error.value\n }\n\n return cumulative\n ? 1 - Math.exp(-Math.pow(x / beta, alpha))\n : (Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha) / Math.pow(beta, alpha)\n}\n\nexport const Z = {}\n\n/**\n * Returns the one-tailed probability-value of a z-test.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data against which to test x.\n * @param {*} x The value to test.\n * @param {*} sigma Optional. The population (known) standard deviation. If omitted, the sample standard deviation is used.\n * @returns\n */\nZ.TEST = (array, x, sigma) => {\n array = utils.parseNumberArray(utils.flatten(array))\n x = utils.parseNumber(x)\n\n if (utils.anyIsError(array, x)) {\n return error.value\n }\n\n sigma = sigma || STDEV.S(array)\n\n const n = array.length\n\n return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)\n}\n","import * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as information from './information.js'\nimport * as statistical from './statistical.js'\nimport * as utils from './utils/common.js'\n\n\n\n\n\nexport function PNL() {\n const [A, B] = utils.argsToArray(arguments);\n\n const toNumberOrThrow = (val) => {\n const num = Number(val);\n if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);\n return num;\n };\n\n // Single numbers\n if (typeof A === \"number\" && typeof B === \"number\") {\n return A - B;\n }\n\n // 1D arrays\n if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== \"object\") {\n const maxLen = Math.max(A.length, B.length);\n let total = 0;\n for (let i = 0; i < maxLen; i++) {\n const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;\n const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;\n total += aVal - bVal;\n }\n return total;\n }\n\n // 2D arrays\n if (Array.isArray(A[0]) && typeof A[0][0] !== \"object\") {\n let total = 0;\n const maxRows = Math.max(A.length, B.length);\n for (let i = 0; i < maxRows; i++) {\n const rowA = A[i] || [];\n const rowB = B[i] || [];\n const maxCols = Math.max(rowA.length, rowB.length);\n for (let j = 0; j < maxCols; j++) {\n const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;\n const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;\n total += aVal - bVal;\n }\n }\n return total;\n }\n\n // 3D arrays\n if (Array.isArray(A[0][0])) {\n let total = 0;\n const maxX = Math.max(A.length, B.length);\n for (let i = 0; i < maxX; i++) {\n const matA = A[i] || [];\n const matB = B[i] || [];\n const maxY = Math.max(matA.length, matB.length);\n for (let j = 0; j < maxY; j++) {\n const rowA = matA[j] || [];\n const rowB = matB[j] || [];\n const maxZ = Math.max(rowA.length, rowB.length);\n for (let k = 0; k < maxZ; k++) {\n const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;\n const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;\n total += aVal - bVal;\n }\n }\n }\n return total;\n }\n\n throw new Error(\"Unsupported or mismatched structure\");\n}\n\n\n/**\n * Returns the absolute value of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number of which you want the absolute value.\n * @returns\n */\nexport function ABS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.abs(number)\n\n return result\n}\n\n/**\n * Returns the arccosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The cosine of the angle you want and must be from -1 to 1.\n * @returns\n */\nexport function ACOS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.acos(number)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number equal to or greater than 1.\n * @returns\n */\nexport function ACOSH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log(number + Math.sqrt(number * number - 1))\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Number is the cotangent of the angle you want. This must be a real number.\n * @returns\n */\nexport function ACOT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.atan(1 / number)\n\n return result\n}\n\n/**\n * Returns the hyperbolic arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The absolute value of Number must be greater than 1.\n * @returns\n */\nexport function ACOTH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = 0.5 * Math.log((number + 1) / (number - 1))\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n// TODO: use options\n/**\n * Returns an aggregate in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num A number 1 to 19 that specifies which function to use.\n * @param {*} options A numerical value that determines which values to ignore in the evaluation range for the function. Note: The function will not ignore hidden rows, nested subtotals or nested aggregates if the array argument includes a calculation, for example: =AGGREGATE(14,3,A1:A100*(A1:A100>0),1)\n * @param {*} ref1 The first numeric argument for functions that take multiple numeric arguments for which you want the aggregate value.\n * @param {*} ref2 Optional. Numeric arguments 2 to 253 for which you want the aggregate value. For functions that take an array, ref1 is an array, an array formula, or a reference to a range of values for which you want the aggregate value. Ref2 is a second argument that is required for certain functions.\n * @returns\n */\nexport function AGGREGATE(function_num, options, ref1, ref2) {\n function_num = utils.parseNumber(function_num)\n options = utils.parseNumber(function_num)\n\n if (utils.anyIsError(function_num, options)) {\n return error.value\n }\n\n switch (function_num) {\n case 1:\n return statistical.AVERAGE(ref1)\n case 2:\n return statistical.COUNT(ref1)\n case 3:\n return statistical.COUNTA(ref1)\n case 4:\n return statistical.MAX(ref1)\n case 5:\n return statistical.MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return statistical.STDEV.S(ref1)\n case 8:\n return statistical.STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return statistical.VAR.S(ref1)\n case 11:\n return statistical.VAR.P(ref1)\n case 12:\n return statistical.MEDIAN(ref1)\n case 13:\n return statistical.MODE.SNGL(ref1)\n case 14:\n return statistical.LARGE(ref1, ref2)\n case 15:\n return statistical.SMALL(ref1, ref2)\n case 16:\n return statistical.PERCENTILE.INC(ref1, ref2)\n case 17:\n return statistical.QUARTILE.INC(ref1, ref2)\n case 18:\n return statistical.PERCENTILE.EXC(ref1, ref2)\n case 19:\n return statistical.QUARTILE.EXC(ref1, ref2)\n }\n}\n\n/**\n * Converts a Roman number to Arabic, as a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text A string enclosed in quotation marks, an empty string (\"\"), or a reference to a value containing text.\n * @returns\n */\nexport function ARABIC(text) {\n if (text === undefined || text === null) {\n return 0\n }\n\n if (text instanceof Error) {\n return text\n }\n\n // Credits: Rafa? Kukawski\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\n return error.value\n }\n\n let r = 0\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, (i) => {\n r += {\n M: 1000,\n CM: 900,\n D: 500,\n CD: 400,\n C: 100,\n XC: 90,\n L: 50,\n XL: 40,\n X: 10,\n IX: 9,\n V: 5,\n IV: 4,\n I: 1\n }[i]\n })\n\n return r\n}\n\n/**\n * Returns the arcsine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The sine of the angle you want and must be from -1 to 1.\n * @returns\n */\nexport function ASIN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.asin(number)\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function ASINH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.log(number + Math.sqrt(number * number + 1))\n}\n\n/**\n * Returns the arctangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The tangent of the angle you want.\n * @returns\n */\nexport function ATAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.atan(number)\n}\n\n/**\n * Returns the arctangent from x- and y-coordinates.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x_num The x-coordinate of the point.\n * @param {*} y_num The y-coordinate of the point.\n * @returns\n */\nexport function ATAN2(x_num, y_num) {\n x_num = utils.parseNumber(x_num)\n y_num = utils.parseNumber(y_num)\n const anyError = utils.anyError(x_num, y_num)\n\n if (anyError) {\n return anyError\n }\n\n return Math.atan2(x_num, y_num)\n}\n\n/**\n * Returns the inverse hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number between 1 and -1.\n * @returns\n */\nexport function ATANH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log((1 + number) / (1 - number)) / 2\n\n if (isNaN(result)) {\n result = error.num\n }\n\n return result\n}\n\n/**\n * Converts a number into a text representation with the given radix (base).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to convert. Must be an integer greater than or equal to 0 and less than 2^53.\n * @param {*} radix The base radix that you want to convert the number into. Must be an integer greater than or equal to 2 and less than or equal to 36.\n * @param {*} min_length Optional. The minimum length of the returned string. Must be an integer greater than or equal to 0.\n * @returns\n */\nexport function BASE(number, radix, min_length) {\n number = utils.parseNumber(number)\n radix = utils.parseNumber(radix)\n min_length = utils.parseNumber(min_length)\n const anyError = utils.anyError(number, radix, min_length)\n\n if (anyError) {\n return anyError\n }\n\n if (radix === 0) {\n return error.num\n }\n\n const result = number.toString(radix)\n\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result\n}\n\n/**\n * Rounds a number to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nexport function CEILING(number, significance) {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n\n const anyError = utils.anyError(number, significance)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n if (number > 0 && significance < 0) {\n return error.num\n }\n\n return Math.ceil(number / significance) * significance\n}\n\n/**\n * Rounds a number up, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance Optional. This is the number of significant digits after the decimal point to which number is to be rounded.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nCEILING.MATH = (number, significance, mode = 0) => {\n if (significance === undefined) {\n significance = number > 0 ? 1 : -1\n }\n\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n mode = utils.parseNumber(mode)\n\n const anyError = utils.anyError(number, significance, mode)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance)\n\n if (mode === 0) {\n return Math.ceil(number / significance) * significance\n } else {\n return number > 0\n ? Math.ceil(number / significance) * significance\n : Math.floor(number / significance) * significance\n }\n}\n\n/**\n * Rounds a number up, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance Optional. This is the number of significant digits after the decimal point to which number is to be rounded.\n * @returns\n */\nCEILING.PRECISE = (number, significance) => {\n return CEILING.MATH(number, significance)\n}\n\n/**\n * Returns the number of combinations for a given number of objects.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number of items.\n * @param {*} number_chosen The number of items in each combination.\n * @returns\n */\nexport function COMBIN(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n const anyError = utils.anyError(number, number_chosen)\n\n if (anyError) {\n return anyError\n }\n\n if (number < number_chosen) {\n return error.num\n }\n\n return FACT(number) / (FACT(number_chosen) * FACT(number - number_chosen))\n}\n\n/**\n * Returns the number of combinations with repetitions for a given number of items.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Must be greater than or equal to 0, and greater than or equal to Number_chosen. Non-integer values are truncated.\n * @param {*} number_chosen Must be greater than or equal to 0. Non-integer values are truncated.\n * @returns\n */\nexport function COMBINA(number, number_chosen) {\n number = utils.parseNumber(number)\n number_chosen = utils.parseNumber(number_chosen)\n const anyError = utils.anyError(number, number_chosen)\n\n if (anyError) {\n return anyError\n }\n\n if (number < number_chosen) {\n return error.num\n }\n\n return number === 0 && number_chosen === 0 ? 1 : COMBIN(number + number_chosen - 1, number - 1)\n}\n\n/**\n * Returns the cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cosine.\n * @returns\n */\nexport function COS(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number for which you want to find the hyperbolic cosine.\n * @returns\n */\nexport function COSH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) + Math.exp(-number)) / 2\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cotangent.\n * @returns\n */\nexport function COT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 1 / Math.tan(number)\n}\n\n/**\n * Returns the cotangent of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function COTH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n const e2 = Math.exp(2 * number)\n\n return (e2 + 1) / (e2 - 1)\n}\n\n/**\n * Returns the cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function CSC(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 1 / Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nexport function CSCH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.div0\n }\n\n return 2 / (Math.exp(number) - Math.exp(-number))\n}\n\n/**\n * Converts a text representation of a number in a given base into a decimal number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text\n * @param {*} radix Radix must be an integer.\n * @returns\n */\nexport function DECIMAL(text, radix) {\n if (arguments.length < 2) {\n return error.na\n }\n\n text = text || '0'\n radix = utils.parseNumber(radix)\n const anyError = utils.anyError(text, radix)\n\n if (anyError) {\n return anyError\n }\n\n if (radix === 0) {\n return error.num\n }\n\n const result = parseInt(text, radix)\n\n if (isNaN(result)) {\n return error.num\n }\n\n return result\n}\n\n/**\n * Converts radians to degrees.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle The angle in radians that you want to convert.\n * @returns\n */\nexport function DEGREES(angle) {\n angle = utils.parseNumber(angle)\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * 180) / Math.PI\n}\n\n/**\n * Rounds a number up to the nearest even integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @returns\n */\nexport function EVEN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return CEILING.MATH(number, -2, -1)\n}\n\n/**\n * Returns e raised to the power of a given number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The exponent applied to the base e.\n * @returns\n */\nexport function EXP(number) {\n if (arguments.length < 1) {\n return error.na\n }\n\n if (arguments.length > 1) {\n return error.error\n }\n\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n number = Math.exp(number)\n\n return number\n}\n\nconst MEMOIZED_FACT = []\n/**\n * Returns the factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The nonnegative number for which you want the factorial. If number is not an integer, it is truncated.\n * @returns\n */\nexport function FACT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number)\n\n if (n === 0 || n === 1) {\n return 1\n } else if (MEMOIZED_FACT[n] > 0) {\n return MEMOIZED_FACT[n]\n } else {\n MEMOIZED_FACT[n] = FACT(n - 1) * n\n\n return MEMOIZED_FACT[n]\n }\n}\n\n/**\n * Returns the double factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value for which to return the double factorial. If number is not an integer, it is truncated.\n * @returns\n */\nexport function FACTDOUBLE(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number)\n\n return n <= 0 ? 1 : n * FACTDOUBLE(n - 2)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The numeric value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @returns\n */\nexport function FLOOR(number, significance) {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n\n const anyError = utils.anyError(number, significance)\n\n if (anyError) {\n return anyError\n }\n\n if (!significance) {\n return error.div0\n }\n\n if (number > 0 && significance < 0) {\n return error.num\n }\n\n return Math.floor(number / significance) * significance\n}\n\n// TODO: Verify\n\n/**\n * Rounds a number down, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number to be rounded down.\n * @param {*} significance Optional. The multiple to which you want to round.\n * @param {*} mode Optional. The direction (toward or away from 0) to round negative numbers.\n * @returns\n */\nFLOOR.MATH = (number, significance = 1, mode = 0) => {\n number = utils.parseNumber(number)\n significance = utils.parseNumber(significance)\n mode = utils.parseNumber(mode)\n\n const anyError = utils.anyError(number, significance, mode)\n\n if (anyError) {\n return anyError\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance)\n\n if (mode === 0) {\n return Math.floor(number / significance) * significance\n } else {\n return number > 0\n ? Math.floor(number / significance) * significance\n : Math.ceil(number / significance) * significance\n }\n}\n\n// Deprecated\n\n/**\n * Rounds a number the nearest integer or to the nearest multiple of significance. Regardless of the sign of the number, the number is rounded up.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to be rounded.\n * @param {*} significance Optional. The multiple to which number is to be rounded. If significance is omitted, its default value is 1.\n * @returns\n */\nFLOOR.PRECISE = (number, significance) => {\n return FLOOR.MATH(number, significance)\n}\n\n// adapted http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript\n/**\n * Returns the greatest common divisor.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values. If any value is not an integer, it is truncated.\n * @returns\n */\nexport function GCD() {\n const range = utils.parseNumberArray(utils.flatten(arguments))\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length\n const r0 = range[0]\n let x = r0 < 0 ? -r0 : r0\n\n for (let i = 1; i < n; i++) {\n const ri = range[i]\n let y = ri < 0 ? -ri : ri\n\n while (x && y) {\n if (x > y) {\n x %= y\n } else {\n y %= x\n }\n }\n\n x += y\n }\n\n return x\n}\n\n/**\n * Rounds a number down to the nearest integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number you want to round down to an integer.\n * @returns\n */\nexport function INT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.floor(number)\n}\n\n// TODO: verify\nexport const ISO = {\n CEILING: CEILING\n}\n\n/**\n * Returns the least common multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2,... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the least common multiple. If value is not an integer, it is truncated.\n * @returns\n */\nexport function LCM() {\n // Credits: Jonas Raoni Soares Silva\n const o = utils.parseNumberArray(utils.flatten(arguments))\n\n if (o instanceof Error) {\n return o\n }\n\n for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined; ) {\n if (n === 0) {\n return 0\n }\n\n while (n > 1) {\n if (n % 2) {\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\n // empty\n }\n\n d = i <= j ? i : n\n } else {\n d = 2\n }\n\n for (n /= d, r *= d, i = o.length; i; o[--i] % d === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\n // empty\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the natural logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the natural logarithm.\n * @returns\n */\nexport function LN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n return Math.log(number)\n}\n\n/**\n * Returns the logarithm of a number to a specified base.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the logarithm.\n * @param {*} base Optional. The base of the logarithm. If base is omitted, it is assumed to be 10.\n * @returns\n */\nexport function LOG(number, base) {\n number = utils.parseNumber(number)\n base = base ? utils.parseNumber(base) : 10\n const anyError = utils.anyError(number, base)\n if (anyError) {\n return anyError\n }\n\n if (number === 0 || base === 0) {\n return error.num\n }\n\n return Math.log(number) / Math.log(base)\n}\n\n/**\n * Returns the base-10 logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the base-10 logarithm.\n * @returns\n */\nexport function LOG10(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return error.num\n }\n\n return Math.log(number) / Math.log(10)\n}\n\n/**\n * Returns the matrix product of two arrays. The result is an array with the same number of rows as array1 and the same number of columns as array2.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array1 Required. 1st array you want to multiply.\n * @param {*} array2 Required. 2nd array you want to multiply.\n * @returns\n */\nexport function MMULT(array1, array2) {\n if (\n //Arguments are not arrays\n !Array.isArray(array1) ||\n !Array.isArray(array2) ||\n // There are empty arrays\n array1.some((el) => !el.length) ||\n array2.some((el) => !el.length) ||\n // Not all array elements are numbers\n utils.flattenShallow(array1).some((el) => typeof el !== 'number') ||\n utils.flattenShallow(array2).some((el) => typeof el !== 'number') ||\n // Number of columns in array1 is different from the number of rows in array2\n array1[0].length !== array2.length\n ) {\n return error.value\n }\n\n const matrix = Array(array1.length)\n .fill(0)\n .map(() => Array(array2[0].length).fill(0))\n\n return matrix.map((row, i) => row.map((_, j) => array1[i].reduce((sum, el, k) => sum + el * array2[k][j], 0)))\n}\n\n/**\n * Returns the remainder from division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want to find the remainder.\n * @param {*} divisor The number by which you want to divide number.\n * @returns\n */\nexport function MOD(number, divisor) {\n number = utils.parseNumber(number)\n divisor = utils.parseNumber(divisor)\n const anyError = utils.anyError(number, divisor)\n\n if (anyError) {\n return anyError\n }\n\n if (divisor === 0) {\n return error.div0\n }\n\n let modulus = Math.abs(number % divisor)\n modulus = number < 0 ? divisor - modulus : modulus\n\n return divisor > 0 ? modulus : -modulus\n}\n\n/**\n * Returns a number rounded to the desired multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @param {*} multiple The multiple to which you want to round number.\n * @returns\n */\nexport function MROUND(number, multiple) {\n number = utils.parseNumber(number)\n multiple = utils.parseNumber(multiple)\n const anyError = utils.anyError(number, multiple)\n\n if (anyError) {\n return anyError\n }\n\n if (number * multiple === 0) {\n return 0\n }\n\n if (number * multiple < 0) {\n return error.num\n }\n\n return Math.round(number / multiple) * multiple\n}\n\n/**\n * Returns the multinomial of a set of numbers.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the multinomial.\n * @returns\n */\nexport function MULTINOMIAL() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n let sum = 0\n let divisor = 1\n\n for (let i = 0; i < args.length; i++) {\n sum += args[i]\n divisor *= FACT(args[i])\n }\n\n return FACT(sum) / divisor\n}\n\n/**\n * Returns the unit matrix for the specified dimension.\n *\n * Category: Math and trigonometry\n *\n * @param {*} dimension Required. Dimension is an integer specifying the dimension of the unit matrix that you want to return. It returns an array. The dimension has to be greater than zero.\n * @returns\n */\nexport function MUNIT(dimension) {\n if (arguments.length > 1) {\n return error.na\n }\n\n dimension = parseInt(dimension)\n\n if (!dimension || dimension <= 0) {\n return error.value\n }\n\n return Array(dimension)\n .fill(0)\n .map(() => Array(dimension).fill(0))\n .map((el, i) => {\n el[i] = 1\n return el\n })\n}\n\n/**\n * Rounds a number up to the nearest odd integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number: The value to round.\n * @returns\n */\nexport function ODD(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n let temp = Math.ceil(Math.abs(number))\n temp = temp & 1 ? temp : temp + 1\n\n return number >= 0 ? temp : -temp\n}\n\n/**\n * Returns the value of pi.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function PI() {\n return Math.PI\n}\n\n/**\n * Returns the result of a number raised to a power.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The base number. It can be any real number.\n * @param {*} power The exponent to which the base number is raised.\n * @returns\n */\nexport function POWER(number, power) {\n number = utils.parseNumber(number)\n power = utils.parseNumber(power)\n const anyError = utils.anyError(number, power)\n\n if (anyError) {\n return anyError\n }\n\n if (number === 0 && power === 0) {\n return error.num\n }\n\n const result = Math.pow(number, power)\n\n if (isNaN(result)) {\n return error.num\n }\n\n return result\n}\n\n/**\n * Multiplies its arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number1 The first number or range that you want to multiply.\n * @param {*} args number2, ... Optional. Additional numbers or ranges that you want to multiply, up to a maximum of 255 arguments.\n * @returns\n */\nexport function PRODUCT() {\n const flatArguments = utils.flatten(arguments)\n const flatArgumentsDefined = flatArguments.filter((arg) => arg !== undefined && arg !== null)\n\n if (flatArgumentsDefined.length === 0) {\n return 0\n }\n\n const args = utils.parseNumberArray(flatArgumentsDefined)\n\n if (args instanceof Error) {\n return args\n }\n\n let result = 1\n\n for (let i = 0; i < args.length; i++) {\n result *= args[i]\n }\n\n return result\n}\n\n/**\n * Returns the integer portion of a division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} numerator The dividend.\n * @param {*} denominator The divisor.\n * @returns\n */\nexport function QUOTIENT(numerator, denominator) {\n numerator = utils.parseNumber(numerator)\n denominator = utils.parseNumber(denominator)\n const anyError = utils.anyError(numerator, denominator)\n\n if (anyError) {\n return anyError\n }\n\n return parseInt(numerator / denominator, 10)\n}\n\n/**\n * Converts degrees to radians.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle An angle in degrees that you want to convert.\n * @returns\n */\nexport function RADIANS(angle) {\n angle = utils.parseNumber(angle)\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * Math.PI) / 180\n}\n\n/**\n * Returns a random number between 0 and 1.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function RAND() {\n return Math.random()\n}\n\n/**\n * Returns a random number between the numbers you specify.\n *\n * Category: Math and trigonometry\n *\n * @param {*} bottom The smallest integer RANDBETWEEN will return.\n * @param {*} top The largest integer RANDBETWEEN will return.\n * @returns\n */\nexport function RANDBETWEEN(bottom, top) {\n bottom = utils.parseNumber(bottom)\n top = utils.parseNumber(top)\n const anyError = utils.anyError(bottom, top)\n\n if (anyError) {\n return anyError\n }\n // Creative Commons Attribution 3.0 License\n // Copyright (c) 2012 eqcode\n\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1\n}\n\n// TODO\n/**\n * Converts an arabic numeral to roman, as text.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The Arabic numeral you want converted.\n * @returns\n */\nexport function ROMAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // The MIT License\n // Copyright (c) 2008 Steven Levithan\n const digits = String(number).split('')\n const key = [\n '',\n 'C',\n 'CC',\n 'CCC',\n 'CD',\n 'D',\n 'DC',\n 'DCC',\n 'DCCC',\n 'CM',\n '',\n 'X',\n 'XX',\n 'XXX',\n 'XL',\n 'L',\n 'LX',\n 'LXX',\n 'LXXX',\n 'XC',\n '',\n 'I',\n 'II',\n 'III',\n 'IV',\n 'V',\n 'VI',\n 'VII',\n 'VIII',\n 'IX'\n ]\n let roman = ''\n let i = 3\n\n while (i--) {\n roman = (key[+digits.pop() + i * 10] || '') + roman\n }\n\n return new Array(+digits.join('') + 1).join('M') + roman\n}\n\n/**\n * Rounds a number to a specified number of digits.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to round.\n * @param {*} num_digits The number of digits to which you want to round the number argument.\n * @returns\n */\nexport function ROUND(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n return Number(Math.round(Number(number + 'e' + num_digits)) + 'e' + num_digits * -1)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded down.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nexport function ROUNDDOWN(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Rounds a number up, away from zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded up.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nexport function ROUNDUP(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.ceil(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Returns the secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the secant.\n * @returns\n */\nexport function SEC(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return 1 / Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the hyperbolic secant.\n * @returns\n */\nexport function SECH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return 2 / (Math.exp(number) + Math.exp(-number))\n}\n\n/**\n * Returns the sum of a power series based on the formula.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x The input value to the power series.\n * @param {*} n The initial power to which you want to raise x.\n * @param {*} m The step by which to increase n for each term in the series.\n * @param {*} coefficients A set of coefficients by which each successive power of x is multiplied. The number of values in coefficients determines the number of terms in the power series. For example, if there are three values in coefficients, then there will be three terms in the power series.\n * @returns\n */\nexport function SERIESSUM(x, n, m, coefficients) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n m = utils.parseNumber(m)\n coefficients = utils.parseNumberArray(coefficients)\n\n if (utils.anyIsError(x, n, m, coefficients)) {\n return error.value\n }\n\n let result = coefficients[0] * Math.pow(x, n)\n\n for (let i = 1; i < coefficients.length; i++) {\n result += coefficients[i] * Math.pow(x, n + i * m)\n }\n\n return result\n}\n\n/**\n * Returns the sign of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function SIGN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return -1\n } else if (number === 0) {\n return 0\n } else {\n return 1\n }\n}\n\n/**\n * Returns the sine of the given angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the sine.\n * @returns\n */\nexport function SIN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function SINH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) - Math.exp(-number)) / 2\n}\n\n/**\n * Returns a positive square root.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want the square root.\n * @returns\n */\nexport function SQRT(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return error.num\n }\n\n return Math.sqrt(number)\n}\n\n/**\n * Returns the square root of (number * pi).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number by which pi is multiplied.\n * @returns\n */\nexport function SQRTPI(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sqrt(number * Math.PI)\n}\n\n/**\n * Returns a subtotal in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num The number 1-11 or 101-111 that specifies the function to use for the subtotal. 1-11 includes manually-hidden rows, while 101-111 excludes them; filtered-out values are always excluded.\n * @param {*} ref1 The first named range or reference for which you want the subtotal.\n * @returns\n */\nexport function SUBTOTAL(function_num, ref1) {\n function_num = utils.parseNumber(function_num)\n\n if (function_num instanceof Error) {\n return function_num\n }\n\n switch (function_num) {\n case 1:\n return statistical.AVERAGE(ref1)\n case 2:\n return statistical.COUNT(ref1)\n case 3:\n return statistical.COUNTA(ref1)\n case 4:\n return statistical.MAX(ref1)\n case 5:\n return statistical.MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return statistical.STDEV.S(ref1)\n case 8:\n return statistical.STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return statistical.VAR.S(ref1)\n case 11:\n return statistical.VAR.P(ref1)\n // no hidden values for us\n case 101:\n return statistical.AVERAGE(ref1)\n case 102:\n return statistical.COUNT(ref1)\n case 103:\n return statistical.COUNTA(ref1)\n case 104:\n return statistical.MAX(ref1)\n case 105:\n return statistical.MIN(ref1)\n case 106:\n return PRODUCT(ref1)\n case 107:\n return statistical.STDEV.S(ref1)\n case 108:\n return statistical.STDEV.P(ref1)\n case 109:\n return SUM(ref1)\n case 110:\n return statistical.VAR.S(ref1)\n case 111:\n return statistical.VAR.P(ref1)\n }\n}\n\n/**\n * Adds its arguments.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUM() {\n let result = 0\n\n utils.arrayEach(utils.argsToArray(arguments), (value) => {\n if (result instanceof Error) {\n return false\n } else if (value instanceof Error) {\n result = value\n } else if (typeof value === 'number') {\n result += value\n } else if (typeof value === 'string') {\n const parsed = parseFloat(value)\n\n !isNaN(parsed) && (result += parsed)\n } else if (Array.isArray(value)) {\n const inner_result = SUM.apply(null, value)\n\n if (inner_result instanceof Error) {\n result = inner_result\n } else {\n result += inner_result\n }\n }\n })\n\n return result\n}\n\n/**\n * Adds the values specified by a given criteria.\n *\n * Category: Math and trigonometry\n *\n * @param {*} range The range of values that you want evaluated by criteria. Cells in each range must be numbers or names, arrays, or references that contain numbers. Blank and text values are ignored.\n * @param {*} criteria The criteria in the form of a number, expression, a value reference, text, or a function that defines which values will be added.\n * @param {*} sum_range Optional. The actual values to add, if you want to add values other than those specified in the range argument. If the sum_range argument is omitted, Excel adds the values that are specified in the range argument (the same values to which the criteria is applied). Sum_range should be the same size and shape as range. If it isn't, performance may suffer, and the formula will sum a range of values that starts with the first value in sum_range but has the same dimensions as range.\n * @returns\n */\nexport function SUMIF(range, criteria, sum_range) {\n range = utils.flatten(range)\n\n sum_range = sum_range ? utils.flatten(sum_range) : range\n\n if (range instanceof Error) {\n return range\n }\n\n if (criteria === undefined || criteria === null || criteria instanceof Error) {\n return 0\n }\n\n let result = 0\n const isWildcard = criteria === '*'\n const tokenizedCriteria = isWildcard ? null : evalExpression.parse(criteria + '')\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i]\n const sumValue = sum_range[i]\n\n if (isWildcard) {\n result += value\n } else {\n const tokens = [evalExpression.createToken(value, evalExpression.TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria)\n\n result += evalExpression.compute(tokens) ? sumValue : 0\n }\n }\n\n return result\n}\n\n/**\n * Adds the values in a range that meet multiple criteria.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUMIFS() {\n const values = utils.applyCriteria(...arguments)\n return SUM(values)\n}\n\n/**\n * Returns the sum of the products of corresponding array components.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nexport function SUMPRODUCT() {\n if (!arguments || arguments.length === 0) {\n return error.value\n }\n\n const arrays = arguments.length + 1\n let result = 0\n let product\n let k\n let _i\n let _ij\n\n for (let i = 0; i < arguments[0].length; i++) {\n if (!(arguments[0][i] instanceof Array)) {\n product = 1\n\n for (k = 1; k < arrays; k++) {\n const _i_arg = arguments[k - 1][i]\n\n if (_i_arg instanceof Error) {\n return _i_arg\n }\n\n _i = utils.parseNumber(_i_arg)\n\n if (_i instanceof Error) {\n return _i\n }\n\n product *= _i\n }\n\n result += product\n } else {\n for (let j = 0; j < arguments[0][i].length; j++) {\n product = 1\n\n for (k = 1; k < arrays; k++) {\n const _ij_arg = arguments[k - 1][i][j]\n\n if (_ij_arg instanceof Error) {\n return _ij_arg\n }\n\n _ij = utils.parseNumber(_ij_arg)\n\n if (_ij instanceof Error) {\n return _ij\n }\n\n product *= _ij\n }\n\n result += product\n }\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the squares of the arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the sum of the squares. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nexport function SUMSQ() {\n const numbers = utils.parseNumberArray(utils.flatten(arguments))\n\n if (numbers instanceof Error) {\n return numbers\n }\n\n let result = 0\n const length = numbers.length\n\n for (let i = 0; i < length; i++) {\n result += information.ISNUMBER(numbers[i]) ? numbers[i] * numbers[i] : 0\n }\n\n return result\n}\n\n/**\n * Returns the sum of the difference of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMX2MY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i]\n }\n\n return result\n}\n\n/**\n * Returns the sum of the sum of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMX2PY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i]\n }\n\n return result\n}\n\n/**\n * Returns the sum of squares of differences of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nexport function SUMXMY2(array_x, array_y) {\n array_x = utils.parseNumberArray(utils.flatten(array_x))\n array_y = utils.parseNumberArray(utils.flatten(array_y))\n\n if (utils.anyIsError(array_x, array_y)) {\n return error.value\n }\n\n let result = 0\n array_x = utils.flatten(array_x)\n array_y = utils.flatten(array_y)\n\n for (let i = 0; i < array_x.length; i++) {\n result += Math.pow(array_x[i] - array_y[i], 2)\n }\n\n return result\n}\n\n/**\n * Returns the tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the tangent.\n * @returns\n */\nexport function TAN(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.tan(number)\n}\n\n/**\n * Returns the hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nexport function TANH(number) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n const e2 = Math.exp(2 * number)\n\n return (e2 - 1) / (e2 + 1)\n}\n\n/**\n * Truncates a number to an integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number you want to truncate.\n * @param {*} num_digits Optional. A number specifying the precision of the truncation. The default value for num_digits is 0 (zero).\n * @returns\n */\nexport function TRUNC(number, num_digits) {\n number = utils.parseNumber(number)\n num_digits = utils.parseNumber(num_digits)\n const anyError = utils.anyError(number, num_digits)\n\n if (anyError) {\n return anyError\n }\n\n const sign = number > 0 ? 1 : -1\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}","import * as error from './error.js'\nimport * as utils from './common.js'\n\nimport { POWER } from './../math-trig.js'\n\n/**\n * Following functions are part of Formula.js only and not found in Excel.\n * Purpose of these functions is to implement an Excel like behaviour for fundamental math symbols such as +, -, /, *, etc.\n */\n\n/**\n * Formula.js only.\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function ADD(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 + num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} dividend\n * @param {*} divisor\n * @returns\n */\nexport function DIVIDE(dividend, divisor) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n dividend = utils.parseNumber(dividend)\n divisor = utils.parseNumber(divisor)\n const anyError = utils.anyError(dividend, divisor)\n\n if (anyError) {\n return anyError\n }\n\n if (divisor === 0) {\n return error.div0\n }\n\n return dividend / divisor\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nexport function EQ(value1, value2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined\n }\n\n if (value2 === null) {\n value2 = undefined\n }\n\n return value1 === value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function GT(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (num1 instanceof Error) {\n return num1\n }\n\n if (num2 instanceof Error) {\n return num2\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 > num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function GTE(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 >= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function LT(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 < num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function LTE(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (utils.anyIsString(num1, num2)) {\n num1 = utils.parseString(num1)\n num2 = utils.parseString(num2)\n } else {\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n }\n\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 <= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nexport function MINUS(num1, num2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n num1 = utils.parseNumber(num1)\n num2 = utils.parseNumber(num2)\n const anyError = utils.anyError(num1, num2)\n\n if (anyError) {\n return anyError\n }\n\n return num1 - num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} factor1\n * @param {*} factor2\n * @returns\n */\nexport function MULTIPLY(factor1, factor2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n factor1 = utils.parseNumber(factor1)\n factor2 = utils.parseNumber(factor2)\n const anyError = utils.anyError(factor1, factor2)\n\n if (anyError) {\n return anyError\n }\n\n return factor1 * factor2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nexport function NE(value1, value2) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined\n }\n\n if (value2 === null) {\n value2 = undefined\n }\n\n return value1 !== value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} base\n * @param {*} exponent\n * @returns\n */\nexport function POW(base, exponent) {\n if (arguments.length !== 2) {\n return error.na\n }\n\n return POWER(base, exponent)\n}\n","import * as error from './utils/error.js'\nimport * as utils from './utils/common.js'\nimport { dateToSerial, formatDate, returnSerial } from './utils/date.js'\n\nconst WEEK_STARTS = [\n undefined,\n 0,\n 1,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 0\n]\nconst WEEK_TYPES = [\n [],\n [1, 2, 3, 4, 5, 6, 7],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 0, 1, 2, 3, 4, 5],\n [],\n [],\n [],\n [],\n [],\n [],\n [],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 7, 1, 2, 3, 4, 5],\n [5, 6, 7, 1, 2, 3, 4],\n [4, 5, 6, 7, 1, 2, 3],\n [3, 4, 5, 6, 7, 1, 2],\n [2, 3, 4, 5, 6, 7, 1],\n [1, 2, 3, 4, 5, 6, 7]\n]\nconst WEEKEND_TYPES = [\n [],\n [6, 0],\n [0, 1],\n [1, 2],\n [2, 3],\n [3, 4],\n [4, 5],\n [5, 6],\n undefined,\n undefined,\n undefined,\n [0, 0],\n [1, 1],\n [2, 2],\n [3, 3],\n [4, 4],\n [5, 5],\n [6, 6]\n]\n\n/**\n * Returns the serial number of a particular date.\n *\n * Category: Date and time\n *\n * @param {*} year Year\n * @param {*} month Month\n * @param {*} day Day\n * @returns\n */\nexport function DATE(year, month, day) {\n let result\n\n year = utils.parseNumber(year)\n month = utils.parseNumber(month)\n day = utils.parseNumber(day)\n\n if (utils.anyIsError(year, month, day)) {\n result = error.value\n } else {\n result = new Date(year, month - 1, day)\n\n if (result.getFullYear() < 0) {\n result = error.num\n }\n }\n\n return returnSerial ? dateToSerial(result) : result\n}\n\n/**\n * Calculates the number of days, months, or years between two dates. This function is useful in formulas where you need to calculate an age.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the first, or starting date of a given period.\n * @param {*} end_date A date that represents the last, or ending, date of the period.\n * @param {*} unit The type of information that you want returned, where:\n - \"Y\": The number of complete years in the period.\n - \"M\": The number of complete months in the period.\n - \"D\": The number of days in the period.\n - \"MD\": The difference between the days in start_date and end_date. The months and years of the dates are ignored.\n - \"YM\": The difference between the months in start_date and end_date. The days and years of the dates are ignored\n - \"YD\": The difference between the days of start_date and end_date. The years of the dates are ignored.\n * @returns\n */\nexport function DATEDIF(start_date, end_date, unit) {\n unit = unit.toUpperCase()\n start_date = utils.parseDate(start_date)\n end_date = utils.parseDate(end_date)\n\n const start_date_year = start_date.getFullYear()\n const start_date_month = start_date.getMonth()\n const start_date_day = start_date.getDate()\n const end_date_year = end_date.getFullYear()\n const end_date_month = end_date.getMonth()\n const end_date_day = end_date.getDate()\n\n let result\n\n switch (unit) {\n case 'Y':\n result = Math.floor(YEARFRAC(start_date, end_date))\n break\n case 'D':\n result = DAYS(end_date, start_date)\n break\n case 'M':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year)\n\n if (end_date_day < start_date_day) {\n result--\n }\n\n break\n case 'MD':\n if (start_date_day <= end_date_day) {\n result = end_date_day - start_date_day\n } else {\n if (end_date_month === 0) {\n start_date.setFullYear(end_date_year - 1)\n start_date.setMonth(12)\n } else {\n start_date.setFullYear(end_date_year)\n start_date.setMonth(end_date_month - 1)\n }\n\n result = DAYS(end_date, start_date)\n }\n\n break\n case 'YM':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year)\n\n if (end_date_day < start_date_day) {\n result--\n }\n\n result = result % 12\n break\n case 'YD':\n if (end_date_month > start_date_month || (end_date_month === start_date_month && end_date_day < start_date_day)) {\n start_date.setFullYear(end_date_year)\n } else {\n start_date.setFullYear(end_date_year - 1)\n }\n\n result = DAYS(end_date, start_date)\n break\n }\n\n return result\n}\n\n/**\n * Converts a date in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} date_text Text that represents a date in an Excel date format, or a reference to a value that contains text that represents a date in an Excel date format.\n * @returns\n */\nexport function DATEVALUE(date_text) {\n if (typeof date_text !== 'string') {\n return error.value\n }\n\n const date = Date.parse(date_text)\n\n if (isNaN(date)) {\n return error.value\n }\n\n const dateValue = new Date(date_text)\n\n return returnSerial ? dateToSerial(dateValue) : dateValue\n}\n\n/**\n * Converts a serial number to a day of the month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the day you are trying to find.\n * @returns\n */\nexport function DAY(serial_number) {\n const date = utils.parseDate(serial_number)\n\n if (date instanceof Error) {\n return date\n }\n\n return date.getDate()\n}\n\nfunction startOfDay(date) {\n const newDate = new Date(date)\n newDate.setHours(0, 0, 0, 0)\n\n return newDate\n}\n\n/**\n * Returns the number of days between two dates.\n *\n * Category: Date and time\n *\n * @param {*} end_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @param {*} start_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @returns\n */\nexport function DAYS(end_date, start_date) {\n end_date = utils.parseDate(end_date)\n start_date = utils.parseDate(start_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n const diffMs = startOfDay(end_date).getTime() - startOfDay(start_date).getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Calculates the number of days between two dates based on a 360-day year.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date. If start_date occurs after end_date, the DAYS360 function returns a negative number.\n * @param {*} end_date A date that represents the end date.\n * @param {*} method Optional. A logical value that specifies whether to use the U.S. or European method in the calculation.\n * @returns\n */\nexport function DAYS360(start_date, end_date, method) {\n method = utils.parseBool(method || 'false')\n start_date = utils.parseDate(start_date)\n end_date = utils.parseDate(end_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (method instanceof Error) {\n return method\n }\n\n const sm = start_date.getMonth()\n let em = end_date.getMonth()\n let sd, ed\n\n if (method) {\n sd = start_date.getDate() === 31 ? 30 : start_date.getDate()\n ed = end_date.getDate() === 31 ? 30 : end_date.getDate()\n } else {\n const smd = new Date(start_date.getFullYear(), sm + 1, 0).getDate()\n const emd = new Date(end_date.getFullYear(), em + 1, 0).getDate()\n sd = start_date.getDate() === smd ? 30 : start_date.getDate()\n\n if (end_date.getDate() === emd) {\n if (sd < 30) {\n em++\n ed = 1\n } else {\n ed = 30\n }\n } else {\n ed = end_date.getDate()\n }\n }\n\n return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)\n}\n\n/**\n * Returns the serial number of the date that is the indicated number of months before or after the start date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nexport function EDATE(start_date, months) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return error.value\n }\n\n // store the day and temporarily set to 1, which is safe\n let storedDay = start_date.getDate()\n start_date.setDate(1)\n\n months = parseInt(months, 10)\n start_date.setMonth(start_date.getMonth() + months)\n\n let targetMonth = start_date.getMonth()\n\n // if storedDay > 28 then we need to check end-of-month scenarios\n if (storedDay > 28) {\n let daysInTargetMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][targetMonth]\n\n // if target month is February, check for a leap year\n let targetYear = start_date.getFullYear()\n if (targetMonth === 1 && ((targetYear % 4 === 0 && targetYear % 100 !== 0) || targetYear % 400 === 0)) {\n daysInTargetMonth = 29\n }\n storedDay = Math.min(storedDay, daysInTargetMonth)\n }\n\n start_date.setDate(storedDay)\n\n return returnSerial ? dateToSerial(start_date) : start_date\n}\n\n/**\n * Returns the serial number of the last day of the month before or after a specified number of months.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the starting date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nexport function EOMONTH(start_date, months) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return error.value\n }\n\n months = parseInt(months, 10)\n\n const eoMonth = new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0)\n\n return returnSerial ? dateToSerial(eoMonth) : eoMonth\n}\n\n/**\n * Converts a serial number to an hour.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the hour you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function HOUR(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getHours()\n}\n\n/**\n * Returns the number of the ISO week number of the year for a given date.\n *\n * Category: Date and time\n *\n * @param {*} date Date is the date-time code used by Excel for date and time calculation.\n * @returns\n */\nexport function ISOWEEKNUM(date) {\n date = utils.parseDate(date)\n\n if (date instanceof Error) {\n return date\n }\n\n date = startOfDay(date)\n date.setDate(date.getDate() + 4 - (date.getDay() || 7))\n const yearStart = new Date(date.getFullYear(), 0, 1)\n\n return Math.ceil(((date - yearStart) / 86400000 + 1) / 7)\n}\n\n/**\n * Converts a serial number to a minute.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the minute you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function MINUTE(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMinutes()\n}\n\n/**\n * Converts a serial number to a month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the month you are trying to find.\n * @returns\n */\nexport function MONTH(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMonth() + 1\n}\n\n/**\n * Returns the number of whole workdays between two dates.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} holidays Optional. An optional range of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contains the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nexport function NETWORKDAYS(start_date, end_date, holidays) {\n return NETWORKDAYS.INTL(start_date, end_date, 1, holidays)\n}\n\n/**\n * Returns the number of whole workdays between two dates using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The date for from which the difference is to be computed. The start_date can be earlier than, the same as, or later than the end_date.\n * @param {*} end_date The date for to which the difference is to be computed.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not included in the number of whole working days between start_date and end_date. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nNETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = utils.parseDate(end_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n let isMask = false\n const maskDays = []\n const maskIndex = [1, 2, 3, 4, 5, 6, 0]\n const maskRegex = new RegExp('^[0|1]{7}$')\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1]\n } else if (typeof weekend === 'string' && maskRegex.test(weekend)) {\n isMask = true\n weekend = weekend.split('')\n\n for (let i = 0; i < weekend.length; i++) {\n if (weekend[i] === '1') {\n maskDays.push(maskIndex[i])\n }\n }\n } else {\n weekend = WEEKEND_TYPES[weekend]\n }\n\n if (!(weekend instanceof Array)) {\n return error.value\n }\n\n if (holidays === undefined) {\n holidays = []\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays]\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = utils.parseDate(holidays[i])\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h\n }\n\n const days = Math.round((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1\n let total = days\n const day = start_date\n\n for (let i = 0; i < days; i++) {\n const d = new Date().getTimezoneOffset() > 0 ? day.getUTCDay() : day.getDay()\n let dec = isMask ? maskDays.includes(d) : d === weekend[0] || d === weekend[1]\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j]\n\n if (\n holiday.getDate() === day.getDate() &&\n holiday.getMonth() === day.getMonth() &&\n holiday.getFullYear() === day.getFullYear()\n ) {\n dec = true\n break\n }\n }\n\n if (dec) {\n total--\n }\n\n day.setDate(day.getDate() + 1)\n }\n\n return total\n}\n\nexport const NETWORKDAYS_INTL = NETWORKDAYS.INTL\n\n/**\n * Returns the serial number of the current date and time.\n *\n * Category: Date and time\n *\n * @returns\n */\nexport function NOW() {\n return returnSerial ? dateToSerial(new Date()) : new Date()\n}\n\n/**\n * Converts a serial number to a second.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the seconds you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nexport function SECOND(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getSeconds()\n}\n\n/**\n * Returns the serial number of a particular time.\n *\n * Category: Date and time\n *\n * @param {*} hour A number from 0 (zero) to 32767 representing the hour. Any value greater than 23 will be divided by 24 and the remainder will be treated as the hour value. For example, TIME(27,0,0) = TIME(3,0,0) = .125 or 3:00 AM.\n * @param {*} minute A number from 0 to 32767 representing the minute. Any value greater than 59 will be converted to hours and minutes. For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.\n * @param {*} second A number from 0 to 32767 representing the second. Any value greater than 59 will be converted to hours, minutes, and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 or 12:33:20 AM\n * @returns\n */\nexport function TIME(hour, minute, second) {\n hour = utils.parseNumber(hour)\n minute = utils.parseNumber(minute)\n second = utils.parseNumber(second)\n\n if (utils.anyIsError(hour, minute, second)) {\n return error.value\n }\n\n if (hour < 0 || minute < 0 || second < 0) {\n return error.num\n }\n\n const hh = String(hour).padStart(2, '0')\n const mm = String(minute).padStart(2, '0')\n const ss = String(second).padStart(2, '0')\n\n return `${hh}:${mm}:${ss}`\n}\n\n\n/**\n * Converts a time in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} time_text A text string that represents a time in any one of the Microsoft Excel time formats; for example, \"6:45 PM\" and \"18:45\" text strings within quotation marks that represent time.\n * @returns\n */\nexport function TIMEVALUE(time_text) {\n time_text = utils.parseDate(time_text)\n\n if (time_text instanceof Error) {\n return time_text\n }\n\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400\n}\n\n/**\n * Returns the serial number of today's date.\n *\n * Category: Date and time\n *\n * @returns\n */\nexport function TODAY() {\n const today = startOfDay(new Date())\n return formatDate(today)\n}\n\n/**\n * Converts a serial number to a day of the week.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A sequential number that represents the date of the day you are trying to find.\n * @param {*} return_type Optional. A number that determines the type of return value.\n * @returns\n */\nexport function WEEKDAY(serial_number, return_type) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1\n }\n\n const day = serial_number.getDay()\n\n return WEEK_TYPES[return_type][day]\n}\n\n/**\n * Converts a serial number to a number representing where the week falls numerically with a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A date within the week.\n * @param {*} return_type Optional. A number that determines on which day the week begins. The default is 1.\n * @returns\n */\nexport function WEEKNUM(serial_number, return_type) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1\n }\n\n if (return_type === 21) {\n return ISOWEEKNUM(serial_number)\n }\n\n const week_start = WEEK_STARTS[return_type]\n let jan = new Date(serial_number.getFullYear(), 0, 1)\n const inc = jan.getDay() < week_start ? 1 : 0\n jan -= Math.abs(jan.getDay() - week_start) * 24 * 60 * 60 * 1000\n\n return Math.floor((serial_number - jan) / (1000 * 60 * 60 * 24) / 7 + 1) + inc\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} days The number of nonweekend and nonholiday days before or after start_date. A positive value for days yields a future date; a negative value yields a past date.\n * @param {*} holidays Optional. An optional list of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contain the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nexport function WORKDAY(start_date, days, holidays) {\n return WORKDAY.INTL(start_date, days, 1, holidays)\n}\n\nexport function ISDATE(value) {\n const parsed = utils.parseDate(value)\n return !(parsed instanceof Error)\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The start date, truncated to integer.\n * @param {*} days The number of workdays before or after the start_date. A positive value yields a future date; a negative value yields a past date; a zero value yields the start_date. Day-offset is truncated to an integer.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not considered working days. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. Holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nWORKDAY.INTL = (start_date, days, weekend, holidays) => {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n days = utils.parseNumber(days)\n\n if (days instanceof Error) {\n return days\n }\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1]\n } else {\n weekend = WEEKEND_TYPES[weekend]\n }\n\n if (!(weekend instanceof Array)) {\n return error.value\n }\n\n if (holidays === undefined) {\n holidays = []\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays]\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = utils.parseDate(holidays[i])\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h\n }\n\n let d = 0\n\n const sign = Math.sign(days)\n\n while (d < days * sign) {\n start_date.setDate(start_date.getDate() + sign)\n\n const day = start_date.getDay()\n\n if (day === weekend[0] || day === weekend[1]) {\n continue\n }\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j]\n\n if (\n holiday.getDate() === start_date.getDate() &&\n holiday.getMonth() === start_date.getMonth() &&\n holiday.getFullYear() === start_date.getFullYear()\n ) {\n d--\n break\n }\n }\n\n d++\n }\n\n // EXCEL does not recognize dates before 1900.\n if (start_date.getFullYear() < 1900) {\n return error.value\n }\n\n return formatDate(start_date)\n}\n\nexport const WORKDAY_INTL = WORKDAY.INTL\n\n/**\n * Converts a serial number to a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the year you want to find.\n * @returns\n */\nexport function YEAR(serial_number) {\n serial_number = utils.parseDate(serial_number)\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getFullYear()\n}\n\nfunction isLeapYear(year) {\n return new Date(year, 1, 29).getMonth() === 1\n}\n\n// TODO : Use DAYS ?\nfunction daysBetween(start_date, end_date) {\n return Math.ceil((end_date - start_date) / 1000 / 60 / 60 / 24)\n}\n\n/**\n * Returns the year fraction representing the number of whole days between start_date and end_date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function YEARFRAC(start_date, end_date, basis) {\n start_date = utils.parseDate(start_date)\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = utils.parseDate(end_date)\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n basis = basis || 0\n let sd = start_date.getDate()\n const sm = start_date.getMonth() + 1\n const sy = start_date.getFullYear()\n let ed = end_date.getDate()\n const em = end_date.getMonth() + 1\n const ey = end_date.getFullYear()\n\n switch (basis) {\n case 0:\n // US (NASD) 30/360\n if (sd === 31 && ed === 31) {\n sd = 30\n ed = 30\n } else if (sd === 31) {\n sd = 30\n } else if (sd === 30 && ed === 31) {\n ed = 30\n }\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n case 1: {\n // Actual/actual\n const feb29Between = (date1, date2) => {\n const year1 = date1.getFullYear()\n const mar1year1 = new Date(year1, 2, 1)\n\n if (isLeapYear(year1) && date1 < mar1year1 && date2 >= mar1year1) {\n return true\n }\n\n const year2 = date2.getFullYear()\n const mar1year2 = new Date(year2, 2, 1)\n\n return isLeapYear(year2) && date2 >= mar1year2 && date1 < mar1year2\n }\n\n let ylength = 365\n\n if (sy === ey || (sy + 1 === ey && (sm > em || (sm === em && sd >= ed)))) {\n if ((sy === ey && isLeapYear(sy)) || feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\n ylength = 366\n }\n\n return daysBetween(start_date, end_date) / ylength\n }\n\n const years = ey - sy + 1\n const days = (new Date(ey + 1, 0, 1) - new Date(sy, 0, 1)) / 1000 / 60 / 60 / 24\n const average = days / years\n\n return daysBetween(start_date, end_date) / average\n }\n\n case 2:\n // Actual/360\n\n return daysBetween(start_date, end_date) / 360\n case 3:\n // Actual/365\n\n return daysBetween(start_date, end_date) / 365\n case 4:\n // European 30/360\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n }\n}\n","/* bessel.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported BESSEL */\nvar BESSEL;\n(function (factory) {\n /*jshint ignore:start */\n if(typeof DO_NOT_EXPORT_BESSEL === 'undefined') {\n if('object' === typeof exports) {\n factory(exports);\n } else if ('function' === typeof define && define.amd) {\n define(function () {\n var module = {};\n factory(module);\n return module;\n });\n } else {\n factory(BESSEL = {});\n }\n } else {\n factory(BESSEL = {});\n }\n /*jshint ignore:end */\n}(function(BESSEL) {\nBESSEL.version = '1.0.2';\nvar M = Math;\n\nfunction _horner(arr, v) { for(var i = 0, z = 0; i < arr.length; ++i) z = v * z + arr[i]; return z; }\nfunction _bessel_iter(x, n, f0, f1, sign) {\n if(n === 0) return f0;\n if(n === 1) return f1;\n var tdx = 2 / x, f2 = f1;\n for(var o = 1; o < n; ++o) {\n f2 = f1 * o * tdx + sign * f0;\n f0 = f1; f1 = f2;\n }\n return f2;\n}\nfunction _bessel_wrap(bessel0, bessel1, name, nonzero, sign) {\n return function bessel(x,n) {\n if(nonzero) {\n if(x === 0) return (nonzero == 1 ? -Infinity : Infinity);\n else if(x < 0) return NaN;\n }\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n n|=0;\n var b0 = bessel0(x), b1 = bessel1(x);\n return _bessel_iter(x, n, b0, b1, sign);\n };\n}\nvar besselj = (function() {\n var W = 0.636619772; // 2 / Math.PI\n\n var b0_a1a = [57568490574.0, -13362590354.0, 651619640.7, -11214424.18, 77392.33017, -184.9052456].reverse();\n var b0_a2a = [57568490411.0, 1029532985.0, 9494680.718, 59272.64853, 267.8532712, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934935152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1 / a2;\n } else {\n var xx = x - 0.785398164;\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.cos(xx)*a1-M.sin(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [72362614232.0, -7895059235.0, 242396853.1, -2972611.439, 15704.48260, -30.16036606].reverse();\n var b1_a2a = [144725228442.0, 2300535178.0, 18583304.74, 99447.43394, 376.9991397, 1.0].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = M.abs(x) - 2.356194491;\n if(Math.abs(x)< 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1 / a2;\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/M.abs(x))*(M.cos(xx)*a1-M.sin(xx)*a2*8/M.abs(x));\n if(x < 0) a = -a;\n }\n return a;\n }\n\n return function besselj(x, n) {\n n = Math.round(n);\n if(!isFinite(x)) return isNaN(x) ? x : 0;\n if(n < 0) return ((n%2)?-1:1)*besselj(x, -n);\n if(x < 0) return ((n%2)?-1:1)*besselj(-x, n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(x === 0) return 0;\n\n var ret=0.0;\n if(x > n) {\n ret = _bessel_iter(x, n, bessel0(x), bessel1(x),-1);\n } else {\n var m=2*M.floor((n+M.floor(M.sqrt(40*n)))/2);\n var jsum=false;\n var bjp=0.0, sum=0.0;\n var bj=1.0, bjm = 0.0;\n var tox = 2 / x;\n for (var j=m;j>0;j--) {\n bjm=j*tox*bj-bjp;\n bjp=bj;\n bj=bjm;\n if (M.abs(bj) > 1E10) {\n bj *= 1E-10;\n bjp *= 1E-10;\n ret *= 1E-10;\n sum *= 1E-10;\n }\n if (jsum) sum += bj;\n jsum=!jsum;\n if (j == n) ret=bjp;\n }\n sum=2.0*sum-bj;\n ret /= sum;\n }\n return ret;\n };\n})();\nvar bessely = (function() {\n var W = 0.636619772;\n\n var b0_a1a = [-2957821389.0, 7062834065.0, -512359803.6, 10879881.29, -86327.92757, 228.4622733].reverse();\n var b0_a2a = [40076544269.0, 745249964.8, 7189466.438, 47447.26470, 226.1030244, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934945152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x, xx = x - 0.785398164;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1/a2 + W * besselj(x,0) * M.log(x);\n } else {\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [-0.4900604943e13, 0.1275274390e13, -0.5153438139e11, 0.7349264551e9, -0.4237922726e7, 0.8511937935e4].reverse();\n var b1_a2a = [0.2499580570e14, 0.4244419664e12, 0.3733650367e10, 0.2245904002e8, 0.1020426050e6, 0.3549632885e3, 1].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = x - 2.356194491;\n if(x < 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1/a2 + W * (besselj(x,1) * M.log(x) - 1 / x);\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELY', 1, -1);\n})();\nvar besseli = (function() {\n var b0_a = [1.0, 3.5156229, 3.0899424, 1.2067492, 0.2659732, 0.360768e-1, 0.45813e-2].reverse();\n var b0_b = [0.39894228, 0.1328592e-1, 0.225319e-2, -0.157565e-2, 0.916281e-2, -0.2057706e-1, 0.2635537e-1, -0.1647633e-1, 0.392377e-2].reverse();\n\n function bessel0(x) {\n if(x <= 3.75) return _horner(b0_a, x*x/(3.75*3.75));\n return M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b0_b, 3.75/M.abs(x));\n }\n\n var b1_a = [0.5, 0.87890594, 0.51498869, 0.15084934, 0.2658733e-1, 0.301532e-2, 0.32411e-3].reverse();\n var b1_b = [0.39894228, -0.3988024e-1, -0.362018e-2, 0.163801e-2, -0.1031555e-1, 0.2282967e-1, -0.2895312e-1, 0.1787654e-1, -0.420059e-2].reverse();\n\n function bessel1(x) {\n if(x < 3.75) return x * _horner(b1_a, x*x/(3.75*3.75));\n return (x < 0 ? -1 : 1) * M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b1_b, 3.75/M.abs(x));\n }\n\n return function besseli(x, n) {\n n = Math.round(n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n if(M.abs(x) === 0) return 0;\n if(x == Infinity) return Infinity;\n\n var ret = 0.0, j, tox = 2 / M.abs(x), bip = 0.0, bi=1.0, bim=0.0;\n var m=2*M.round((n+M.round(M.sqrt(40*n)))/2);\n for (j=m;j>0;j--) {\n bim=j*tox*bi + bip;\n bip=bi; bi=bim;\n if (M.abs(bi) > 1E10) {\n bi *= 1E-10;\n bip *= 1E-10;\n ret *= 1E-10;\n }\n if(j == n) ret = bip;\n }\n ret *= besseli(x, 0) / bi;\n return x < 0 && (n%2) ? -ret : ret;\n };\n\n})();\n\nvar besselk = (function() {\n var b0_a = [-0.57721566, 0.42278420, 0.23069756, 0.3488590e-1, 0.262698e-2, 0.10750e-3, 0.74e-5].reverse();\n var b0_b = [1.25331414, -0.7832358e-1, 0.2189568e-1, -0.1062446e-1, 0.587872e-2, -0.251540e-2, 0.53208e-3].reverse();\n\n function bessel0(x) {\n if(x <= 2) return -M.log(x/2) * besseli(x,0) + _horner(b0_a, x*x/4);\n return M.exp(-x) / M.sqrt(x) * _horner(b0_b, 2/x);\n }\n\n var b1_a = [1.0, 0.15443144, -0.67278579, -0.18156897, -0.1919402e-1, -0.110404e-2, -0.4686e-4].reverse();\n var b1_b = [1.25331414, 0.23498619, -0.3655620e-1, 0.1504268e-1, -0.780353e-2, 0.325614e-2, -0.68245e-3].reverse();\n\n function bessel1(x) {\n if(x <= 2) return M.log(x/2) * besseli(x,1) + (1/x) * _horner(b1_a, x*x/4);\n return M.exp(-x)/M.sqrt(x)*_horner(b1_b, 2/x);\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELK', 2, 1);\n})();\nBESSEL.besselj = besselj;\nBESSEL.bessely = bessely;\nBESSEL.besseli = besseli;\nBESSEL.besselk = besselk;\n}));\n","import bessel from 'bessel'\nimport jStat from 'jstat'\n\nimport * as error from './utils/error.js'\nimport * as text from './text.js'\nimport * as utils from './utils/common.js'\n\nfunction isValidBinaryNumber(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns the modified Bessel function In(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELI(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besseli(x, n)\n}\n\n/**\n * Returns the Bessel function Jn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELJ(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besselj(x, n)\n}\n\n/**\n * Returns the modified Bessel function Kn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELK(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.besselk(x, n)\n}\n\n/**\n * Returns the Bessel function Yn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nexport function BESSELY(x, n) {\n x = utils.parseNumber(x)\n n = utils.parseNumber(n)\n\n if (utils.anyIsError(x, n)) {\n return error.value\n }\n\n return bessel.bessely(x, n)\n}\n\n/**\n * Converts a binary number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function BIN2DEC(number) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Convert binary number to decimal\n const result = parseInt(number, 2)\n\n // Handle negative numbers\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return parseInt(stringified.substring(1), 2) - 512\n } else {\n return result\n }\n}\n\n/**\n * Converts a binary number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function BIN2HEX(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16)\n }\n\n // Convert binary number to hexadecimal\n const result = parseInt(number, 2).toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a binary number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function BIN2OCT(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n const stringified = number.toString()\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8)\n }\n\n // Convert binary number to octal\n const result = parseInt(number, 2).toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Returns a 'Bitwise And' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nexport function BITAND(number1, number2) {\n // Return error if either number is a non-numeric value\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise AND of two numbers\n return number1 & number2\n}\n\n/**\n * Returns a value number shifted left by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Number must be an integer greater than or equal to 0.\n * @param {*} shift_amount Shift_amount must be an integer.\n * @returns\n */\nexport function BITLSHIFT(number, shift_amount) {\n number = utils.parseNumber(number)\n shift_amount = utils.parseNumber(shift_amount)\n\n if (utils.anyIsError(number, shift_amount)) {\n return error.value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return error.num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return error.num\n }\n\n // Return number shifted by shift bits to the left or to the right if shift is negative\n return shift_amount >= 0 ? number << shift_amount : number >> -shift_amount\n}\n\n/**\n * Returns a bitwise OR of 2 numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nexport function BITOR(number1, number2) {\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise OR of two numbers\n return number1 | number2\n}\n\n/**\n * Returns a value number shifted right by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Must be an integer greater than or equal to 0.\n * @param {*} shift_amount Must be an integer.\n * @returns\n */\nexport function BITRSHIFT(number, shift_amount) {\n number = utils.parseNumber(number)\n shift_amount = utils.parseNumber(shift_amount)\n\n if (utils.anyIsError(number, shift_amount)) {\n return error.value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return error.num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return error.num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return error.num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return error.num\n }\n\n // Return number shifted by shift bits to the right or to the left if shift is negative\n return shift_amount >= 0 ? number >> shift_amount : number << -shift_amount\n}\n\n/**\n * Returns a bitwise 'Exclusive Or' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be greater than or equal to 0.\n * @param {*} number2 Must be greater than or equal to 0.\n * @returns\n */\nexport function BITXOR(number1, number2) {\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return error.num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return error.num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return error.num\n }\n\n // Return bitwise XOR of two numbers\n return number1 ^ number2\n}\n\n/**\n * Converts real and imaginary coefficients into a complex number.\n *\n * Category: Engineering\n *\n * @param {*} real_num The real coefficient of the complex number.\n * @param {*} i_num The imaginary coefficient of the complex number.\n * @param {*} suffix Optional. The suffix for the imaginary component of the complex number. If omitted, suffix is assumed to be \"i\".\n * @returns\n */\nexport function COMPLEX(real_num, i_num, suffix) {\n real_num = utils.parseNumber(real_num)\n i_num = utils.parseNumber(i_num)\n\n if (utils.anyIsError(real_num, i_num)) {\n return real_num\n }\n\n // Set suffix\n suffix = suffix === undefined ? 'i' : suffix\n\n // Return error if suffix is neither \"i\" nor \"j\"\n if (suffix !== 'i' && suffix !== 'j') {\n return error.value\n }\n\n // Return complex number\n if (real_num === 0 && i_num === 0) {\n return 0\n } else if (real_num === 0) {\n return i_num === 1 ? suffix : i_num.toString() + suffix\n } else if (i_num === 0) {\n return real_num.toString()\n } else {\n const sign = i_num > 0 ? '+' : ''\n return real_num.toString() + sign + (i_num === 1 ? suffix : i_num.toString() + suffix)\n }\n}\n\n/**\n * Converts a number from one measurement system to another.\n *\n * Category: Engineering\n *\n * @param {*} number is the value in from_units to convert.\n * @param {*} from_unit is the units for number.\n * @param {*} to_unit is the units for the result. CONVERT accepts the following text values (in quotation marks) for from_unit and to_unit.\n * @returns\n */\nexport function CONVERT(number, from_unit, to_unit) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // List of units supported by CONVERT and units defined by the International System of Units\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion ratio]\n const units = [\n ['a.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['a.u. of charge', 'e', null, 'electric_charge', false, false, 1.60217653141414e-19],\n ['a.u. of energy', 'Eh', null, 'energy', false, false, 4.35974417757576e-18],\n ['a.u. of length', 'a?', null, 'length', false, false, 5.29177210818182e-11],\n ['a.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['a.u. of time', '?/Eh', null, 'time', false, false, 2.41888432650516e-17],\n ['admiralty knot', 'admkn', null, 'speed', false, true, 0.514773333],\n ['ampere', 'A', null, 'electric_current', true, false, 1],\n ['ampere per meter', 'A/m', null, 'magnetic_field_intensity', true, false, 1],\n ['ångström', 'Å', ['ang'], 'length', false, true, 1e-10],\n ['are', 'ar', null, 'area', false, true, 100],\n ['astronomical unit', 'ua', null, 'length', false, false, 1.49597870691667e-11],\n ['bar', 'bar', null, 'pressure', false, false, 100000],\n ['barn', 'b', null, 'area', false, false, 1e-28],\n ['becquerel', 'Bq', null, 'radioactivity', true, false, 1],\n ['bit', 'bit', ['b'], 'information', false, true, 1],\n ['btu', 'BTU', ['btu'], 'energy', false, true, 1055.05585262],\n ['byte', 'byte', null, 'information', false, true, 8],\n ['candela', 'cd', null, 'luminous_intensity', true, false, 1],\n ['candela per square metre', 'cd/m?', null, 'luminance', true, false, 1],\n ['coulomb', 'C', null, 'electric_charge', true, false, 1],\n ['cubic ångström', 'ang3', ['ang^3'], 'volume', false, true, 1e-30],\n ['cubic foot', 'ft3', ['ft^3'], 'volume', false, true, 0.028316846592],\n ['cubic inch', 'in3', ['in^3'], 'volume', false, true, 0.000016387064],\n ['cubic light-year', 'ly3', ['ly^3'], 'volume', false, true, 8.46786664623715e-47],\n ['cubic metre', 'm3', ['m^3'], 'volume', true, true, 1],\n ['cubic mile', 'mi3', ['mi^3'], 'volume', false, true, 4168181825.44058],\n ['cubic nautical mile', 'Nmi3', ['Nmi^3'], 'volume', false, true, 6352182208],\n ['cubic Pica', 'Pica3', ['Picapt3', 'Pica^3', 'Picapt^3'], 'volume', false, true, 7.58660370370369e-8],\n ['cubic yard', 'yd3', ['yd^3'], 'volume', false, true, 0.764554857984],\n ['cup', 'cup', null, 'volume', false, true, 0.0002365882365],\n ['dalton', 'Da', ['u'], 'mass', false, false, 1.66053886282828e-27],\n ['day', 'd', ['day'], 'time', false, true, 86400],\n ['degree', '°', null, 'angle', false, false, 0.0174532925199433],\n ['degrees Rankine', 'Rank', null, 'temperature', false, true, 0.555555555555556],\n ['dyne', 'dyn', ['dy'], 'force', false, true, 0.00001],\n ['electronvolt', 'eV', ['ev'], 'energy', false, true, 1.60217656514141],\n ['ell', 'ell', null, 'length', false, true, 1.143],\n ['erg', 'erg', ['e'], 'energy', false, true, 1e-7],\n ['farad', 'F', null, 'electric_capacitance', true, false, 1],\n ['fluid ounce', 'oz', null, 'volume', false, true, 0.0000295735295625],\n ['foot', 'ft', null, 'length', false, true, 0.3048],\n ['foot-pound', 'flb', null, 'energy', false, true, 1.3558179483314],\n ['gal', 'Gal', null, 'acceleration', false, false, 0.01],\n ['gallon', 'gal', null, 'volume', false, true, 0.003785411784],\n ['gauss', 'G', ['ga'], 'magnetic_flux_density', false, true, 1],\n ['grain', 'grain', null, 'mass', false, true, 0.0000647989],\n ['gram', 'g', null, 'mass', false, true, 0.001],\n ['gray', 'Gy', null, 'absorbed_dose', true, false, 1],\n ['gross registered ton', 'GRT', ['regton'], 'volume', false, true, 2.8316846592],\n ['hectare', 'ha', null, 'area', false, true, 10000],\n ['henry', 'H', null, 'inductance', true, false, 1],\n ['hertz', 'Hz', null, 'frequency', true, false, 1],\n ['horsepower', 'HP', ['h'], 'power', false, true, 745.69987158227],\n ['horsepower-hour', 'HPh', ['hh', 'hph'], 'energy', false, true, 2684519.538],\n ['hour', 'h', ['hr'], 'time', false, true, 3600],\n ['imperial gallon (U.K.)', 'uk_gal', null, 'volume', false, true, 0.00454609],\n ['imperial hundredweight', 'lcwt', ['uk_cwt', 'hweight'], 'mass', false, true, 50.802345],\n ['imperial quart (U.K)', 'uk_qt', null, 'volume', false, true, 0.0011365225],\n ['imperial ton', 'brton', ['uk_ton', 'LTON'], 'mass', false, true, 1016.046909],\n ['inch', 'in', null, 'length', false, true, 0.0254],\n ['international acre', 'uk_acre', null, 'area', false, true, 4046.8564224],\n ['IT calorie', 'cal', null, 'energy', false, true, 4.1868],\n ['joule', 'J', null, 'energy', true, true, 1],\n ['katal', 'kat', null, 'catalytic_activity', true, false, 1],\n ['kelvin', 'K', ['kel'], 'temperature', true, true, 1],\n ['kilogram', 'kg', null, 'mass', true, true, 1],\n ['knot', 'kn', null, 'speed', false, true, 0.514444444444444],\n ['light-year', 'ly', null, 'length', false, true, 9460730472580800],\n ['litre', 'L', ['l', 'lt'], 'volume', false, true, 0.001],\n ['lumen', 'lm', null, 'luminous_flux', true, false, 1],\n ['lux', 'lx', null, 'illuminance', true, false, 1],\n ['maxwell', 'Mx', null, 'magnetic_flux', false, false, 1e-18],\n ['measurement ton', 'MTON', null, 'volume', false, true, 1.13267386368],\n ['meter per hour', 'm/h', ['m/hr'], 'speed', false, true, 0.00027777777777778],\n ['meter per second', 'm/s', ['m/sec'], 'speed', true, true, 1],\n ['meter per second squared', 'm?s??', null, 'acceleration', true, false, 1],\n ['parsec', 'pc', ['parsec'], 'length', false, true, 30856775814671900],\n ['meter squared per second', 'm?/s', null, 'kinematic_viscosity', true, false, 1],\n ['metre', 'm', null, 'length', true, true, 1],\n ['miles per hour', 'mph', null, 'speed', false, true, 0.44704],\n ['millimetre of mercury', 'mmHg', null, 'pressure', false, false, 133.322],\n ['minute', '?', null, 'angle', false, false, 0.000290888208665722],\n ['minute', 'min', ['mn'], 'time', false, true, 60],\n ['modern teaspoon', 'tspm', null, 'volume', false, true, 0.000005],\n ['mole', 'mol', null, 'amount_of_substance', true, false, 1],\n ['morgen', 'Morgen', null, 'area', false, true, 2500],\n ['n.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['n.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['n.u. of speed', 'c?', null, 'speed', false, false, 299792458],\n ['n.u. of time', '?/(me?c??)', null, 'time', false, false, 1.28808866778687e-21],\n ['nautical mile', 'M', ['Nmi'], 'length', false, true, 1852],\n ['newton', 'N', null, 'force', true, true, 1],\n ['œrsted', 'Oe ', null, 'magnetic_field_intensity', false, false, 79.5774715459477],\n ['ohm', 'Ω', null, 'electric_resistance', true, false, 1],\n ['ounce mass', 'ozm', null, 'mass', false, true, 0.028349523125],\n ['pascal', 'Pa', null, 'pressure', true, false, 1],\n ['pascal second', 'Pa?s', null, 'dynamic_viscosity', true, false, 1],\n ['pferdestärke', 'PS', null, 'power', false, true, 735.49875],\n ['phot', 'ph', null, 'illuminance', false, false, 0.0001],\n ['pica (1/6 inch)', 'pica', null, 'length', false, true, 0.00035277777777778],\n ['pica (1/72 inch)', 'Pica', ['Picapt'], 'length', false, true, 0.00423333333333333],\n ['poise', 'P', null, 'dynamic_viscosity', false, false, 0.1],\n ['pond', 'pond', null, 'force', false, true, 0.00980665],\n ['pound force', 'lbf', null, 'force', false, true, 4.4482216152605],\n ['pound mass', 'lbm', null, 'mass', false, true, 0.45359237],\n ['quart', 'qt', null, 'volume', false, true, 0.000946352946],\n ['radian', 'rad', null, 'angle', true, false, 1],\n ['second', '?', null, 'angle', false, false, 0.00000484813681109536],\n ['second', 's', ['sec'], 'time', true, true, 1],\n ['short hundredweight', 'cwt', ['shweight'], 'mass', false, true, 45.359237],\n ['siemens', 'S', null, 'electrical_conductance', true, false, 1],\n ['sievert', 'Sv', null, 'equivalent_dose', true, false, 1],\n ['slug', 'sg', null, 'mass', false, true, 14.59390294],\n ['square ångström', 'ang2', ['ang^2'], 'area', false, true, 1e-20],\n ['square foot', 'ft2', ['ft^2'], 'area', false, true, 0.09290304],\n ['square inch', 'in2', ['in^2'], 'area', false, true, 0.00064516],\n ['square light-year', 'ly2', ['ly^2'], 'area', false, true, 8.95054210748189e31],\n ['square meter', 'm?', null, 'area', true, true, 1],\n ['square mile', 'mi2', ['mi^2'], 'area', false, true, 2589988.110336],\n ['square nautical mile', 'Nmi2', ['Nmi^2'], 'area', false, true, 3429904],\n ['square Pica', 'Pica2', ['Picapt2', 'Pica^2', 'Picapt^2'], 'area', false, true, 0.00001792111111111],\n ['square yard', 'yd2', ['yd^2'], 'area', false, true, 0.83612736],\n ['statute mile', 'mi', null, 'length', false, true, 1609.344],\n ['steradian', 'sr', null, 'solid_angle', true, false, 1],\n ['stilb', 'sb', null, 'luminance', false, false, 0.0001],\n ['stokes', 'St', null, 'kinematic_viscosity', false, false, 0.0001],\n ['stone', 'stone', null, 'mass', false, true, 6.35029318],\n ['tablespoon', 'tbs', null, 'volume', false, true, 0.0000147868],\n ['teaspoon', 'tsp', null, 'volume', false, true, 0.00000492892],\n ['tesla', 'T', null, 'magnetic_flux_density', true, true, 1],\n ['thermodynamic calorie', 'c', null, 'energy', false, true, 4.184],\n ['ton', 'ton', null, 'mass', false, true, 907.18474],\n ['tonne', 't', null, 'mass', false, false, 1000],\n ['U.K. pint', 'uk_pt', null, 'volume', false, true, 0.00056826125],\n ['U.S. bushel', 'bushel', null, 'volume', false, true, 0.03523907],\n ['U.S. oil barrel', 'barrel', null, 'volume', false, true, 0.158987295],\n ['U.S. pint', 'pt', ['us_pt'], 'volume', false, true, 0.000473176473],\n ['U.S. survey mile', 'survey_mi', null, 'length', false, true, 1609.347219],\n ['U.S. survey/statute acre', 'us_acre', null, 'area', false, true, 4046.87261],\n ['volt', 'V', null, 'voltage', true, false, 1],\n ['watt', 'W', null, 'power', true, true, 1],\n ['watt-hour', 'Wh', ['wh'], 'energy', false, true, 3600],\n ['weber', 'Wb', null, 'magnetic_flux', true, false, 1],\n ['yard', 'yd', null, 'length', false, true, 0.9144],\n ['year', 'yr', null, 'time', false, true, 31557600]\n ]\n\n // Binary prefixes\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived from]\n const binary_prefixes = {\n Yi: ['yobi', 80, 1208925819614629174706176, 'Yi', 'yotta'],\n Zi: ['zebi', 70, 1180591620717411303424, 'Zi', 'zetta'],\n Ei: ['exbi', 60, 1152921504606846976, 'Ei', 'exa'],\n Pi: ['pebi', 50, 1125899906842624, 'Pi', 'peta'],\n Ti: ['tebi', 40, 1099511627776, 'Ti', 'tera'],\n Gi: ['gibi', 30, 1073741824, 'Gi', 'giga'],\n Mi: ['mebi', 20, 1048576, 'Mi', 'mega'],\n ki: ['kibi', 10, 1024, 'ki', 'kilo']\n }\n\n // Unit prefixes\n // [Name, Multiplier, Abbreviation]\n const unit_prefixes = {\n Y: ['yotta', 1e24, 'Y'],\n Z: ['zetta', 1e21, 'Z'],\n E: ['exa', 1e18, 'E'],\n P: ['peta', 1e15, 'P'],\n T: ['tera', 1e12, 'T'],\n G: ['giga', 1e9, 'G'],\n M: ['mega', 1e6, 'M'],\n k: ['kilo', 1e3, 'k'],\n h: ['hecto', 1e2, 'h'],\n e: ['dekao', 1e1, 'e'],\n d: ['deci', 1e-1, 'd'],\n c: ['centi', 1e-2, 'c'],\n m: ['milli', 1e-3, 'm'],\n u: ['micro', 1e-6, 'u'],\n n: ['nano', 1e-9, 'n'],\n p: ['pico', 1e-12, 'p'],\n f: ['femto', 1e-15, 'f'],\n a: ['atto', 1e-18, 'a'],\n z: ['zepto', 1e-21, 'z'],\n y: ['yocto', 1e-24, 'y']\n }\n\n // Initialize units and multipliers\n let from = null\n let to = null\n let base_from_unit = from_unit\n let base_to_unit = to_unit\n let from_multiplier = 1\n let to_multiplier = 1\n let alt\n\n // Lookup from and to units\n for (let i = 0; i < units.length; i++) {\n alt = units[i][2] === null ? [] : units[i][2]\n\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[i]\n }\n\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[i]\n }\n }\n\n // Lookup from prefix\n if (from === null) {\n const from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)]\n let from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)]\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (from_unit.substring(0, 2) === 'da') {\n from_unit_prefix = ['dekao', 1e1, 'da']\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (from_binary_prefix) {\n from_multiplier = from_binary_prefix[2]\n base_from_unit = from_unit.substring(2)\n } else if (from_unit_prefix) {\n from_multiplier = from_unit_prefix[1]\n base_from_unit = from_unit.substring(from_unit_prefix[2].length)\n }\n\n // Lookup from unit\n for (let j = 0; j < units.length; j++) {\n alt = units[j][2] === null ? [] : units[j][2]\n\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[j]\n }\n }\n }\n\n // Lookup to prefix\n if (to === null) {\n const to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)]\n let to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)]\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (to_unit.substring(0, 2) === 'da') {\n to_unit_prefix = ['dekao', 1e1, 'da']\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (to_binary_prefix) {\n to_multiplier = to_binary_prefix[2]\n base_to_unit = to_unit.substring(2)\n } else if (to_unit_prefix) {\n to_multiplier = to_unit_prefix[1]\n base_to_unit = to_unit.substring(to_unit_prefix[2].length)\n }\n\n // Lookup to unit\n for (let k = 0; k < units.length; k++) {\n alt = units[k][2] === null ? [] : units[k][2]\n\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[k]\n }\n }\n }\n\n // Return error if a unit does not exist\n if (from === null || to === null) {\n return error.na\n }\n\n // Return error if units represent different quantities\n if (from[3] !== to[3]) {\n return error.na\n }\n\n // Return converted number\n return (number * from[6] * from_multiplier) / (to[6] * to_multiplier)\n}\n\n/**\n * Converts a decimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, valid place values are ignored and DEC2BIN returns a 10-character (10-bit) binary number in which the most significant bit is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2BIN(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -512, or is greater than 511\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (number < 0) {\n return '1' + text.REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2)\n }\n\n // Convert decimal number to binary\n const result = parseInt(number, 10).toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a decimal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2HEX returns a 10-character (40-bit) hexadecimal number in which the most significant bit is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2HEX(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\n return error.num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n if (number < 0) {\n return (1099511627776 + number).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = parseInt(number, 10).toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a decimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2OCT returns a 10-character (30-bit) octal number in which the most significant bit is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function DEC2OCT(number, places) {\n number = utils.parseNumber(number)\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (number < 0) {\n return (1073741824 + number).toString(8)\n }\n\n // Convert decimal number to octal\n const result = parseInt(number, 10).toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Tests whether two values are equal.\n *\n * Category: Engineering\n *\n * @param {*} number1 The first number.\n * @param {*} number2 Optional. The second number. If omitted, number2 is assumed to be zero.\n * @returns\n */\nexport function DELTA(number1, number2) {\n // Set number2 to zero if undefined\n number2 = number2 === undefined ? 0 : number2\n number1 = utils.parseNumber(number1)\n number2 = utils.parseNumber(number2)\n\n if (utils.anyIsError(number1, number2)) {\n return error.value\n }\n\n // Return delta\n return number1 === number2 ? 1 : 0\n}\n\n// TODO: why is upper_bound not used ? The excel documentation has no examples with upper_bound\n/**\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} lower_limit The lower bound for integrating ERF.\n * @param {*} upper_limit Optional. The upper bound for integrating ERF. If omitted, ERF integrates between zero and lower_limit.\n * @returns\n */\nexport function ERF(lower_limit, upper_limit) {\n // Set number2 to zero if undefined\n upper_limit = upper_limit === undefined ? 0 : upper_limit\n\n lower_limit = utils.parseNumber(lower_limit)\n upper_limit = utils.parseNumber(upper_limit)\n\n if (utils.anyIsError(lower_limit, upper_limit)) {\n return error.value\n }\n\n return jStat.erf(lower_limit)\n}\n\n/**\n * Returns the complementary error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.\n * @returns\n */\nexport function ERFC(x) {\n // Return error if x is not a number\n if (isNaN(x)) {\n return error.value\n }\n\n return jStat.erfc(x)\n}\n\n/**\n * Tests whether a number is greater than a threshold value.\n *\n * Category: Engineering\n *\n * @param {*} number The value to test against step.\n * @param {*} step Optional. The threshold value. If you omit a value for step, GESTEP uses zero.\n * @returns\n */\nexport function GESTEP(number, step) {\n step = step || 0\n number = utils.parseNumber(number)\n\n if (utils.anyIsError(step, number)) {\n return number\n }\n\n // Return delta\n return number >= step ? 1 : 0\n}\n\n/**\n * Converts a hexadecimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit (40th bit from the right). The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function HEX2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1).toLowerCase() === 'f')\n\n // Convert hexadecimal number to decimal\n const decimal = negative ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16)\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + text.REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts a hexadecimal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters (40 bits). The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function HEX2DEC(number) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16)\n\n // Return decimal number\n return decimal >= 549755813888 ? decimal - 1099511627776 : decimal\n}\n\n/**\n * Converts a hexadecimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function HEX2OCT(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16)\n\n // Return error if number is positive and greater than 0x1fffffff (536870911)\n if (decimal > 536870911 && decimal < 1098974756864) {\n return error.num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 1098974756864) {\n return (decimal - 1098437885952).toString(8)\n }\n\n // Convert decimal number to octal\n const result = decimal.toString(8)\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Returns the absolute value (modulus) of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the absolute value.\n * @returns\n */\nexport function IMABS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return absolute value of complex number\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n}\n\n/**\n * Returns the imaginary coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the imaginary coefficient.\n * @returns\n */\nexport function IMAGINARY(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', 'j'].indexOf(inumber) >= 0) {\n return 1\n }\n\n // Force string type\n inumber = inumber + ''\n\n // Normalize imaginary coefficient\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j')\n\n // Lookup sign\n let plus = inumber.indexOf('+')\n let minus = inumber.indexOf('-')\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1)\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1)\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length)\n const unit = last === 'i' || last === 'j'\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num\n }\n\n // Return imaginary coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(plus + 1, inumber.length - 1))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? error.num\n : -Number(inumber.substring(minus + 1, inumber.length - 1))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? error.num : inumber.substring(0, inumber.length - 1)\n } else {\n return isNaN(inumber) ? error.num : 0\n }\n }\n}\n\n/**\n * Returns the argument theta, an angle expressed in radians.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the argument .\n * @returns\n */\nexport function IMARGUMENT(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return error if inumber is equal to zero\n if (x === 0 && y === 0) {\n return error.div0\n }\n\n // Return PI/2 if x is equal to zero and y is positive\n if (x === 0 && y > 0) {\n return Math.PI / 2\n }\n\n // Return -PI/2 if x is equal to zero and y is negative\n if (x === 0 && y < 0) {\n return -Math.PI / 2\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x > 0) {\n return 0\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x < 0) {\n return -Math.PI\n }\n\n // Return argument of complex number\n if (x > 0) {\n return Math.atan(y / x)\n } else if (x < 0 && y >= 0) {\n return Math.atan(y / x) + Math.PI\n } else {\n return Math.atan(y / x) - Math.PI\n }\n}\n\n/**\n * Returns the complex conjugate of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the conjugate.\n * @returns\n */\nexport function IMCONJUGATE(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return conjugate of complex number\n return y !== 0 ? COMPLEX(x, -y, unit) : inumber\n}\n\n/**\n * Returns the cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosine.\n * @returns\n */\nexport function IMCOS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return cosine of complex number\n return COMPLEX(\n (Math.cos(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (-Math.sin(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosine.\n * @returns\n */\nexport function IMCOSH(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return hyperbolic cosine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the cotangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cotangent.\n * @returns\n */\nexport function IMCOT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return cotangent of complex number\n return IMDIV(IMCOS(inumber), IMSIN(inumber))\n}\n\n/**\n * Returns the quotient of two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex numerator or dividend.\n * @param {*} inumber2 The complex denominator or divisor.\n * @returns\n */\nexport function IMDIV(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1)\n const b = IMAGINARY(inumber1)\n const c = IMREAL(inumber2)\n const d = IMAGINARY(inumber2)\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1)\n const unit2 = inumber2.substring(inumber2.length - 1)\n let unit = 'i'\n\n if (unit1 === 'j') {\n unit = 'j'\n } else if (unit2 === 'j') {\n unit = 'j'\n }\n\n // Return error if inumber2 is null\n if (c === 0 && d === 0) {\n return error.num\n }\n\n // Return exponential of complex number\n const den = c * c + d * d\n return COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit)\n}\n\n/**\n * Returns the exponential of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the exponential.\n * @returns\n */\nexport function IMEXP(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n const e = Math.exp(x)\n return COMPLEX(e * Math.cos(y), e * Math.sin(y), unit)\n}\n\n/**\n * Returns the natural logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the natural logarithm.\n * @returns\n */\nexport function IMLN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit)\n}\n\n/**\n * Returns the base-10 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the common logarithm.\n * @returns\n */\nexport function IMLOG10(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit)\n}\n\n/**\n * Returns the base-2 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the base-2 logarithm.\n * @returns\n */\nexport function IMLOG2(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit)\n}\n\n/**\n * Returns a complex number raised to an integer power.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number you want to raise to a power.\n * @param {*} number The power to which you want to raise the complex number.\n * @returns\n */\nexport function IMPOWER(inumber, number) {\n number = utils.parseNumber(number)\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(number, x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Calculate power of modulus\n const p = Math.pow(IMABS(inumber), number)\n\n // Calculate argument\n const t = IMARGUMENT(inumber)\n\n // Return exponential of complex number\n return COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit)\n}\n\n/**\n * Returns the product of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], … Inumber1 is required, subsequent inumbers are not. 1 to 255 complex numbers to multiply.\n * @returns\n */\nexport function IMPRODUCT() {\n // Initialize result\n let result = arguments[0]\n\n if (!arguments.length) {\n return error.value\n }\n\n // Loop on all numbers\n for (let i = 1; i < arguments.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result)\n const b = IMAGINARY(result)\n const c = IMREAL(arguments[i])\n const d = IMAGINARY(arguments[i])\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a * c - b * d, a * d + b * c)\n }\n\n // Return product of complex numbers\n return result\n}\n\n/**\n * Returns the real coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the real coefficient.\n * @returns\n */\nexport function IMREAL(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return error.value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\n return 0\n }\n\n // Force String type\n inumber = inumber + ''\n\n // Lookup sign\n let plus = inumber.indexOf('+')\n let minus = inumber.indexOf('-')\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1)\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1)\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length)\n const unit = last === 'i' || last === 'j'\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return error.num\n }\n\n // Return real coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(0, plus))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? error.num\n : Number(inumber.substring(0, minus))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? error.num : 0\n } else {\n return isNaN(inumber) ? error.num : inumber\n }\n }\n}\n\n/**\n * Returns the secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the secant.\n * @returns\n */\nexport function IMSEC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return secant of complex number\n return IMDIV('1', IMCOS(inumber))\n}\n\n/**\n * Returns the hyperbolic secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic secant.\n * @returns\n */\nexport function IMSECH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return hyperbolic secant of complex number\n return IMDIV('1', IMCOSH(inumber))\n}\n\n/**\n * Returns the sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the sine.\n * @returns\n */\nexport function IMSIN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return sine of complex number\n return COMPLEX(\n (Math.sin(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (Math.cos(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic sine.\n * @returns\n */\nexport function IMSINH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Return hyperbolic sine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the square root of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the square root.\n * @returns\n */\nexport function IMSQRT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1)\n unit = unit === 'i' || unit === 'j' ? unit : 'i'\n\n // Calculate power of modulus\n const s = Math.sqrt(IMABS(inumber))\n\n // Calculate argument\n const t = IMARGUMENT(inumber)\n\n // Return exponential of complex number\n return COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit)\n}\n\n/**\n * Returns the cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosecant.\n * @returns\n */\nexport function IMCSC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num\n }\n\n // Return cosecant of complex number\n return IMDIV('1', IMSIN(inumber))\n}\n\n/**\n * Returns the hyperbolic cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosecant.\n * @returns\n */\nexport function IMCSCH(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n // Return error if either coefficient is not a number\n if (utils.anyIsError(x, y)) {\n return error.num\n }\n\n // Return hyperbolic cosecant of complex number\n return IMDIV('1', IMSINH(inumber))\n}\n\n/**\n * Returns the difference between two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex number from which to subtract inumber2.\n * @param {*} inumber2 The complex number to subtract from inumber1.\n * @returns\n */\nexport function IMSUB(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1)\n const b = IMAGINARY(inumber1)\n const c = IMREAL(inumber2)\n const d = IMAGINARY(inumber2)\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1)\n const unit2 = inumber2.substring(inumber2.length - 1)\n let unit = 'i'\n\n if (unit1 === 'j') {\n unit = 'j'\n } else if (unit2 === 'j') {\n unit = 'j'\n }\n\n // Return _ of two complex numbers\n return COMPLEX(a - c, b - d, unit)\n}\n\n/**\n * Returns the sum of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], ... Inumber1 is required, subsequent numbers are not. 1 to 255 complex numbers to add.\n * @returns\n */\nexport function IMSUM() {\n if (!arguments.length) {\n return error.value\n }\n\n const args = utils.flatten(arguments)\n\n // Initialize result\n let result = args[0]\n\n // Loop on all numbers\n for (let i = 1; i < args.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result)\n const b = IMAGINARY(result)\n const c = IMREAL(args[i])\n const d = IMAGINARY(args[i])\n\n if (utils.anyIsError(a, b, c, d)) {\n return error.value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a + c, b + d)\n }\n\n // Return sum of complex numbers\n return result\n}\n\n/**\n * Returns the tangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the tangent.\n * @returns\n */\nexport function IMTAN(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return error.value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber)\n const y = IMAGINARY(inumber)\n\n if (utils.anyIsError(x, y)) {\n return error.value\n }\n\n // Return tangent of complex number\n return IMDIV(IMSIN(inumber), IMCOS(inumber))\n}\n\n/**\n * Converts an octal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function OCT2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1) === '7')\n\n // Convert octal number to decimal\n const decimal = negative ? parseInt(number, 8) - 1073741824 : parseInt(number, 8)\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return error.num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + text.REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2)\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n\n/**\n * Converts an octal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nexport function OCT2DEC(number) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8)\n\n // Return decimal number\n return decimal >= 536870912 ? decimal - 1073741824 : decimal\n}\n\n/**\n * Converts an octal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nexport function OCT2HEX(number, places) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return error.num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8)\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 536870912) {\n return 'ff' + (decimal + 3221225472).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = decimal.toString(16)\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return error.value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return error.num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places)\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? text.REPT('0', places - result.length) + result : error.num\n }\n}\n","import * as dateTime from './date-time.js'\nimport * as engineering from './engineering.js'\nimport * as mathTrig from './math-trig.js'\nimport * as statistical from './statistical.js'\n\nexport const BETADIST = statistical.BETA.DIST\nexport const BETAINV = statistical.BETA.INV\nexport const BINOMDIST = statistical.BINOM.DIST\nexport const CEILINGMATH = mathTrig.CEILING.MATH\nexport const CEILINGPRECISE = mathTrig.CEILING.PRECISE\nexport const CHIDIST = statistical.CHISQ.DIST\nexport const CHIDISTRT = statistical.CHISQ.DIST.RT\nexport const CHIINV = statistical.CHISQ.INV\nexport const CHIINVRT = statistical.CHISQ.INV.RT\nexport const CHITEST = statistical.CHISQ.TEST\nexport const COVAR = statistical.COVARIANCE.P\nexport const COVARIANCEP = statistical.COVARIANCE.P\nexport const COVARIANCES = statistical.COVARIANCE.S\nexport const CRITBINOM = statistical.BINOM.INV\nexport const ERFCPRECISE = engineering.ERFC.PRECISE\nexport const ERFPRECISE = engineering.ERF.PRECISE\nexport const EXPONDIST = statistical.EXPON.DIST\nexport const FDIST = statistical.F.DIST\nexport const FDISTRT = statistical.F.DIST.RT\nexport const FINV = statistical.F.INV\nexport const FINVRT = statistical.F.INV.RT\nexport const FLOORMATH = mathTrig.FLOOR.MATH\nexport const FLOORPRECISE = mathTrig.FLOOR.PRECISE\nexport const FTEST = statistical.F.TEST\nexport const GAMMADIST = statistical.GAMMA.DIST\nexport const GAMMAINV = statistical.GAMMA.INV\nexport const GAMMALNPRECISE = statistical.GAMMALN.PRECISE\nexport const HYPGEOMDIST = statistical.HYPGEOM.DIST\nexport const LOGINV = statistical.LOGNORM.INV\nexport const LOGNORMDIST = statistical.LOGNORM.DIST\nexport const LOGNORMINV = statistical.LOGNORM.INV\nexport const MODEMULT = statistical.MODE.MULT\nexport const MODESNGL = statistical.MODE.SNGL\nexport const NEGBINOMDIST = statistical.NEGBINOM.DIST\nexport const NETWORKDAYSINTL = dateTime.NETWORKDAYS.INTL\nexport const NORMDIST = statistical.NORM.DIST\nexport const NORMINV = statistical.NORM.INV\nexport const NORMSDIST = statistical.NORM.S.DIST\nexport const NORMSINV = statistical.NORM.S.INV\nexport const PERCENTILEEXC = statistical.PERCENTILE.EXC\nexport const PERCENTILEINC = statistical.PERCENTILE.INC\nexport const PERCENTRANKEXC = statistical.PERCENTRANK.EXC\nexport const PERCENTRANKINC = statistical.PERCENTRANK.INC\nexport const POISSONDIST = statistical.POISSON.DIST\nexport const QUARTILEEXC = statistical.QUARTILE.EXC\nexport const QUARTILEINC = statistical.QUARTILE.INC\nexport const RANKAVG = statistical.RANK.AVG\nexport const RANKEQ = statistical.RANK.EQ\nexport const SKEWP = statistical.SKEW.P\nexport const STDEVP = statistical.STDEV.P\nexport const STDEVS = statistical.STDEV.S\nexport const TDIST = statistical.T.DIST\nexport const TDISTRT = statistical.T.DIST.RT\nexport const TINV = statistical.T.INV\nexport const TTEST = statistical.T.TEST\nexport const VARP = statistical.VAR.P\nexport const VARS = statistical.VAR.S\nexport const WEIBULLDIST = statistical.WEIBULL.DIST\nexport const WORKDAYINTL = dateTime.WORKDAY.INTL\nexport const ZTEST = statistical.Z.TEST\n","import * as error from './utils/error.js'\nimport * as evalExpression from './utils/criteria-eval.js'\nimport * as maths from './math-trig.js'\nimport * as stats from './statistical.js'\nimport * as utils from './utils/common.js'\n\nfunction compact(array) {\n const result = []\n\n utils.arrayEach(array, (value) => {\n if (value) {\n result.push(value)\n }\n })\n\n return result\n}\n\nfunction findResultIndex(database, criterias) {\n const matches = {}\n\n for (let i = 1; i < database[0].length; ++i) {\n matches[i] = true\n }\n\n let maxCriteriaLength = criterias[0].length\n\n for (let i = 1; i < criterias.length; ++i) {\n if (criterias[i].length > maxCriteriaLength) {\n maxCriteriaLength = criterias[i].length\n }\n }\n\n for (let k = 1; k < database.length; ++k) {\n for (let l = 1; l < database[k].length; ++l) {\n let currentCriteriaResult = false\n let hasMatchingCriteria = false\n\n for (let j = 0; j < criterias.length; ++j) {\n const criteria = criterias[j]\n\n if (criteria.length < maxCriteriaLength) {\n continue\n }\n\n const criteriaField = criteria[0]\n\n if (database[k][0] !== criteriaField) {\n continue\n }\n\n hasMatchingCriteria = true\n\n for (let p = 1; p < criteria.length; ++p) {\n if (!currentCriteriaResult) {\n const isWildcard = criteria[p] === void 0 || criteria[p] === '*'\n\n if (isWildcard) {\n currentCriteriaResult = true\n } else {\n const tokenizedCriteria = evalExpression.parse(criteria[p] + '')\n const tokens = [evalExpression.createToken(database[k][l], evalExpression.TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n )\n\n currentCriteriaResult = evalExpression.compute(tokens)\n }\n }\n }\n }\n\n if (hasMatchingCriteria) {\n matches[l] = matches[l] && currentCriteriaResult\n }\n }\n }\n\n const result = []\n\n for (let n = 0; n < database[0].length; ++n) {\n if (matches[n]) {\n result.push(n - 1)\n }\n }\n\n return result\n}\n\n// Database functions\n/**\n * Returns the average of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database Range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Range of values that contains the conditions you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DAVERAGE(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let sum = 0\n\n utils.arrayEach(resultIndexes, (value) => {\n sum += targetFields[value]\n })\n\n return resultIndexes.length === 0 ? error.div0 : sum / resultIndexes.length\n}\n\n/**\n * Counts the values that contain numbers in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as the argument includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DCOUNT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.COUNT(targetValues)\n}\n\n/**\n * Counts nonblank values in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Optional. Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DCOUNTA(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.COUNTA(targetValues)\n}\n\n/**\n * Extracts from a database a single record that matches the specified criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DGET(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n // Return error if no record meets the criteria\n if (resultIndexes.length === 0) {\n return error.value\n }\n // Returns the #NUM! error value because more than one record meets the\n // criteria\n if (resultIndexes.length > 1) {\n return error.num\n }\n\n return targetFields[resultIndexes[0]]\n}\n\n/**\n * Returns the maximum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DMAX(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let maxValue = targetFields[resultIndexes[0]]\n\n utils.arrayEach(resultIndexes, (value) => {\n if (maxValue < targetFields[value]) {\n maxValue = targetFields[value]\n }\n })\n\n return maxValue\n}\n\n/**\n * Returns the minimum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DMIN(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let minValue = targetFields[resultIndexes[0]]\n\n utils.arrayEach(resultIndexes, (value) => {\n if (minValue > targetFields[value]) {\n minValue = targetFields[value]\n }\n })\n\n return minValue\n}\n\n/**\n * Multiplies the values in a particular field of records that match the criteria in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DPRODUCT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n targetValues = compact(targetValues)\n\n let result = 1\n\n utils.arrayEach(targetValues, (value) => {\n result *= value\n })\n\n return result\n}\n\n/**\n * Estimates the standard deviation based on a sample of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSTDEV(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n targetValues = compact(targetValues)\n\n return stats.STDEV.S(targetValues)\n}\n\n/**\n * Calculates the standard deviation based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSTDEVP(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n let targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n targetValues = compact(targetValues)\n\n return stats.STDEV.P(targetValues)\n}\n\n/**\n * Adds the numbers in the field column of records in the database that match the criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Is the range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DSUM(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return maths.SUM(targetValues)\n}\n\n/**\n * Estimates variance based on a sample from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DVAR(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.VAR.S(targetValues)\n}\n\n/**\n * Calculates variance based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nexport function DVARP(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return error.value\n }\n\n const resultIndexes = findResultIndex(database, criteria)\n let targetFields = []\n\n if (typeof field === 'string') {\n const index = utils.findField(database, field)\n targetFields = utils.rest(database[index])\n } else {\n targetFields = utils.rest(database[field])\n }\n\n const targetValues = []\n\n utils.arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value])\n })\n\n return stats.VAR.P(targetValues)\n}\n","import * as error from './utils/error.js'\nimport * as dateTime from './date-time.js'\nimport * as utils from './utils/common.js'\n\nfunction validDate(d) {\n return d && d.getTime && !isNaN(d.getTime())\n}\n\nfunction ensureDate(d) {\n return d instanceof Date ? d : new Date(d)\n}\n\n// Calculate last coupon date before settlement\nfunction lastCoupDateBeforeSettlement(settlement, maturity, frequency) {\n let date = utils.parseDate(maturity)\n date.setFullYear(settlement.getFullYear())\n\n if (date < settlement) {\n date.setFullYear(date.getFullYear() + 1)\n }\n\n // Adjust the date based on the coupon frequency until date is later than settlement\n while (date > settlement) {\n date.setMonth(date.getMonth() + -12 / frequency)\n }\n\n return date\n}\n\nfunction validateFrequency(frequency) {\n frequency = utils.parseNumber(frequency)\n\n // Return error if frequency is neither 1, 2, or 4\n if ([1, 2, 4].indexOf(frequency) === -1) {\n return error.num\n }\n\n return frequency\n}\n\nfunction validateBasis(basis) {\n basis = utils.parseNumber(basis)\n\n // Return error if basis is neither 0, 1, 2, 3, or 4\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\n return error.num\n }\n\n return basis\n}\n\n/**\n * Returns the accrued interest for a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} first_interest The security's first interest date.\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINT uses $1,000.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @param {*} calc_method Optional. Not implemented in formulajs. A logical value that specifies the way to calculate the total accrued interest when the date of settlement is later than the date of first_interest. A value of TRUE (1) returns the total accrued interest from issue to settlement. A value of FALSE (0) returns the accrued interest from first_interest to settlement. If you do not enter the argument, it defaults to TRUE.\n * @returns\n */\nexport function ACCRINT(issue, first_interest, settlement, rate, par, frequency, basis) {\n // Return error if either date is invalid\n issue = ensureDate(issue)\n first_interest = ensureDate(first_interest)\n settlement = ensureDate(settlement)\n frequency = validateFrequency(frequency)\n basis = validateBasis(basis)\n\n if (utils.anyError(frequency, basis)) {\n return error.num\n }\n\n if (!validDate(issue) || !validDate(first_interest) || !validDate(settlement)) {\n return error.value\n }\n\n // Return error if either rate or par are lower than or equal to zero\n if (rate <= 0 || par <= 0) {\n return error.num\n }\n\n // Return error if settlement is before or equal to issue\n if (settlement <= issue) {\n return error.num\n }\n\n // Set default values\n par = par || 0\n basis = basis || 0\n\n // Compute accrued interest\n return par * rate * dateTime.YEARFRAC(issue, settlement, basis)\n}\n\n/**\n *\n * Returns the number of days in the coupon period that contains the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function COUPDAYS(settlement, maturity, frequency, basis) {\n basis = validateBasis(basis)\n frequency = validateFrequency(frequency)\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n\n if (utils.anyError(settlement, maturity)) {\n return error.value\n }\n\n if (utils.anyError(frequency, basis) || settlement >= maturity) {\n return error.num\n }\n\n if (basis === 1) {\n let date = lastCoupDateBeforeSettlement(settlement, maturity, frequency)\n let nextDate = utils.parseDate(date)\n\n // Set month of the nextDate to the next coupon month\n nextDate.setMonth(nextDate.getMonth() + 12 / frequency)\n\n return dateTime.DATEDIF(date, nextDate, 'D')\n }\n\n let numOfDays\n\n switch (basis) {\n case 0:\n case 2:\n case 4:\n numOfDays = 360\n break\n case 3:\n numOfDays = 365\n break\n default:\n return error.num\n }\n\n return numOfDays / frequency\n}\n\n/**\n * Returns the cumulative interest paid between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nexport function CUMIPMT(rate, nper, pv, start_period, end_period, type) {\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, nper, pv)) {\n return error.value\n }\n\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return error.num\n }\n\n if (start_period < 1 || end_period < 1 || start_period > end_period) {\n return error.num\n }\n\n if (type !== 0 && type !== 1) {\n return error.num\n }\n\n const payment = PMT(rate, nper, pv, 0, type)\n let interest = 0\n\n if (start_period === 1) {\n if (type === 0) {\n interest = -pv\n }\n\n start_period++\n }\n\n for (let i = start_period; i <= end_period; i++) {\n interest += type === 1 ? FV(rate, i - 2, payment, pv, 1) - payment : FV(rate, i - 1, payment, pv, 0)\n }\n\n interest *= rate\n\n return interest\n}\n\n/**\n * Returns the cumulative principal paid on a loan between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nexport function CUMPRINC(rate, nper, pv, start_period, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and variable names\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, nper, pv)) {\n return error.value\n }\n\n // Return error if either rate, nper, or value are lower than or equal to zero\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return error.num\n }\n\n // Return error if start < 1, end < 1, or start > end\n if (start_period < 1 || end < 1 || start_period > end) {\n return error.num\n }\n\n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return error.num\n }\n\n // Compute cumulative principal\n const payment = PMT(rate, nper, pv, 0, type)\n let principal = 0\n\n if (start_period === 1) {\n principal = type === 0 ? payment + pv * rate : payment\n\n start_period++\n }\n\n for (let i = start_period; i <= end; i++) {\n principal +=\n type > 0\n ? payment - (FV(rate, i - 2, payment, pv, 1) - payment) * rate\n : payment - FV(rate, i - 1, payment, pv, 0) * rate\n }\n\n // Return cumulative principal\n return principal\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the fixed-declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} month Optional. The number of months in the first year. If month is omitted, it is assumed to be 12.\n * @returns\n */\nexport function DB(cost, salvage, life, period, month) {\n // Initialize month\n month = month === undefined ? 12 : month\n\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n period = utils.parseNumber(period)\n month = utils.parseNumber(month)\n\n if (utils.anyIsError(cost, salvage, life, period, month)) {\n return error.value\n }\n\n // Return error if any of the parameters is negative\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\n return error.num\n }\n\n // Return error if month is not an integer between 1 and 12\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\n return error.num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return error.num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Rate is rounded to three decimals places\n const rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3)\n\n // Compute initial depreciation\n const initial = (cost * rate * month) / 12\n\n // Compute total depreciation\n let total = initial\n let current = 0\n const ceiling = period === life ? life - 1 : period\n\n for (let i = 2; i <= ceiling; i++) {\n current = (cost - total) * rate\n total += current\n }\n\n // Depreciation for the first and last periods are special cases\n if (period === 1) {\n // First period\n return initial\n } else if (period === life) {\n // Last period\n\n return (cost - total) * rate\n } else {\n return current\n }\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method).\n * @returns\n */\nexport function DDB(cost, salvage, life, period, factor) {\n // Initialize factor\n factor = factor === undefined ? 2 : factor\n\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n period = utils.parseNumber(period)\n factor = utils.parseNumber(factor)\n\n if (utils.anyIsError(cost, salvage, life, period, factor)) {\n return error.value\n }\n\n // Return error if any of the parameters is negative or if factor is null\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\n return error.num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return error.num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Compute depreciation\n let total = 0\n let current = 0\n\n for (let i = 1; i <= period; i++) {\n current = Math.min((cost - total) * (factor / life), cost - salvage - total)\n total += current\n }\n\n // Return depreciation\n return current\n}\n\n/**\n * Returns the discount rate for a security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function DISC(settlement, maturity, pr, redemption, basis) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n pr = utils.parseNumber(pr)\n redemption = utils.parseNumber(redemption)\n basis = utils.parseNumber(basis)\n\n basis = basis || 0\n\n if (utils.anyIsError(settlement, maturity, pr, redemption, basis)) {\n return error.value\n }\n\n if (pr <= 0 || redemption <= 0) {\n return error.num\n }\n\n if (settlement >= maturity) {\n return error.value\n }\n\n let basisVal, diff\n switch (basis) {\n case 0:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, false)\n break\n case 1:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 2:\n basisVal = 360\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 3:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 4:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, true)\n break\n default:\n return error.num\n }\n\n return (((redemption - pr) / redemption) * basisVal) / diff\n}\n\n/**\n * Converts a dollar price, expressed as a fraction, into a dollar price, expressed as a decimal number.\n *\n * Category: Financial\n *\n * @param {*} fractional_dollar A number expressed as an integer part and a fraction part, separated by a decimal symbol.\n * @param {*} fraction The integer to use in the denominator of the fraction.\n * @returns\n */\nexport function DOLLARDE(fractional_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n fractional_dollar = utils.parseNumber(fractional_dollar)\n fraction = utils.parseNumber(fraction)\n\n if (utils.anyIsError(fractional_dollar, fraction)) {\n return error.value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10)\n\n // Compute integer part\n let result = parseInt(fractional_dollar, 10)\n\n // Add decimal part\n result += ((fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10))) / fraction\n\n // Round result\n const power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1)\n result = Math.round(result * power) / power\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Converts a dollar price, expressed as a decimal number, into a dollar price, expressed as a fraction.\n *\n * Category: Financial\n *\n * @param {*} decimal_dollar A decimal number.\n * @param {*} fraction The integer to use in the denominator of a fraction.\n * @returns\n */\nexport function DOLLARFR(decimal_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n decimal_dollar = utils.parseNumber(decimal_dollar)\n fraction = utils.parseNumber(fraction)\n\n if (utils.anyIsError(decimal_dollar, fraction)) {\n return error.value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return error.num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return error.div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10)\n\n // Compute integer part\n let result = parseInt(decimal_dollar, 10)\n\n // Add decimal part\n result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Returns the effective annual interest rate.\n *\n * Category: Financial\n *\n * @param {*} nominal_rate The nominal interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nexport function EFFECT(nominal_rate, npery) {\n nominal_rate = utils.parseNumber(nominal_rate)\n npery = utils.parseNumber(npery)\n\n if (utils.anyIsError(nominal_rate, npery)) {\n return error.value\n }\n\n // Return error if rate <=0 or periods < 1\n if (nominal_rate <= 0 || npery < 1) {\n return error.num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10)\n\n // Return effective annual interest rate\n return Math.pow(1 + nominal_rate / npery, npery) - 1\n}\n\n/**\n * Returns the future value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes. If pmt is omitted, you must include the pv argument.\n * @param {*} pv Optional. The present value, or the lump-sum amount that a series of future payments is worth right now. If pv is omitted, it is assumed to be 0 (zero), and you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nexport function FV(rate, nper, payment, value, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n value = value || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n payment = utils.parseNumber(payment)\n value = utils.parseNumber(value)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, payment, value, type)) {\n return error.value\n }\n\n // Return future value\n let result\n\n if (rate === 0) {\n result = value + payment * nper\n } else {\n const term = Math.pow(1 + rate, nper)\n\n result =\n type === 1\n ? value * term + (payment * (1 + rate) * (term - 1)) / rate\n : value * term + (payment * (term - 1)) / rate\n }\n\n return -result\n}\n\n/**\n * Returns the future value of an initial principal after applying a series of compound interest rates.\n *\n * Category: Financial\n *\n * @param {*} principal The present value.\n * @param {*} schedule An array of interest rates to apply.\n * @returns\n */\nexport function FVSCHEDULE(principal, schedule) {\n principal = utils.parseNumber(principal)\n schedule = utils.parseNumberArray(utils.flatten(schedule))\n\n if (utils.anyIsError(principal, schedule)) {\n return error.value\n }\n\n const n = schedule.length\n let future = principal\n\n // Apply all interests in schedule\n\n for (let i = 0; i < n; i++) {\n // Apply scheduled interest\n future *= 1 + schedule[i]\n }\n\n // Return future value\n return future\n}\n\n/**\n * Returns the interest payment for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per The period for which you want to find the interest and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nexport function IPMT(rate, per, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, per, nper, pv, fv, type)) {\n return error.value\n }\n\n // Compute payment\n const payment = PMT(rate, nper, pv, fv, type)\n\n // Compute interest\n let interest =\n per === 1\n ? type === 1\n ? 0\n : -pv\n : type === 1\n ? FV(rate, per - 2, payment, pv, 1) - payment\n : FV(rate, per - 1, payment, pv, 0)\n\n // Return interest\n return interest * rate\n}\n\n/**\n * Returns the internal rate of return for a series of cash flows.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers for which you want to calculate the internal rate of return.\n - Values must contain at least one positive value and one negative value to calculate the internal rate of return.\n - IRR uses the order of values to interpret the order of cash flows. Be sure to enter your payment and income values in the sequence you want.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored.\n * @param {*} guess Optional. A number that you guess is close to the result of IRR.\n - Microsoft Excel uses an iterative technique for calculating IRR. Starting with guess, IRR cycles through the calculation until the result is accurate within 0.00001 percent. If IRR can't find a result that works after 20 tries, the #NUM! error value is returned.\n - In most cases you do not need to provide guess for the IRR calculation. If guess is omitted, it is assumed to be 0.1 (10 percent).\n - If IRR gives the #NUM! error value, or if the result is not close to what you expected, try again with a different value for guess.\n * @returns\n */\nexport function IRR(values, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n guess = typeof guess === 'number' ? guess : typeof guess === 'undefined' ? 0.1 : utils.parseNumber(guess)\n\n values = utils.parseNumberArray(utils.flatten(values))\n\n if (utils.anyIsError(values, guess)) {\n return error.value\n }\n\n // Use Float64Array for better performance with numeric operations\n const cashFlows = new Float64Array(values.length)\n\n let positive = false\n let negative = false\n // Single-pass processing of input values\n for (let i = 0; i < values.length; i++) {\n cashFlows[i] = values[i]\n\n if (cashFlows[i] > 0) positive = true\n if (cashFlows[i] < 0) negative = true\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return error.num\n }\n\n // Calculates the npv amount\n const npv = (rate) => {\n if (rate <= -1) rate = -0.999999999\n\n let result = cashFlows[0]\n const r = 1 + rate\n\n // Avoid repeated Math.pow calls by using manual exponentiation\n let factor = 1\n for (let i = 1; i < cashFlows.length; i++) {\n factor *= r\n result += cashFlows[i] / factor\n }\n\n return result\n }\n\n // Memoized NPV to avoid recalculating for the same rates\n const npvCache = new Map()\n const cachedNpv = function (rate) {\n const roundedRate = Math.round(rate * 1e10) / 1e10 // Round to 10 decimal places for caching\n\n if (npvCache.has(roundedRate)) {\n return npvCache.get(roundedRate)\n }\n\n const result = npv(roundedRate)\n npvCache.set(roundedRate, result)\n return result\n }\n // Combined method: Start with Newton-Raphson for speed, then switch to bisection for reliability\n const combinedMethod = function () {\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10\n const maxIterations = 1000\n\n // Phase 1: Newton-Raphson with adaptive step for faster convergence\n let rate = guess\n let prevRate = rate\n let iteration = 0\n\n // Try Newton-Raphson until it shows signs of instability\n while (iteration < maxIterations) {\n // Limit Newton-Raphson attempts\n const currentNpv = cachedNpv(rate)\n\n // Exit early if we're already close enough\n if (Math.abs(currentNpv) < epsMax) {\n return rate\n }\n\n // Check if we're stabilizing\n if (iteration > 0 && Math.abs(rate - prevRate) < epsMax * 10) {\n break\n }\n\n // Calculate approximate derivative using secant method (faster than calculating exact derivative)\n const delta = Math.max(0.0001, Math.abs(rate * 0.0001))\n const derivNpv = (cachedNpv(rate + delta) - currentNpv) / delta\n\n // Exit if derivative is too small (to avoid division by near-zero)\n if (Math.abs(derivNpv) < epsMax) {\n break\n }\n\n // Calculate next rate using Newton step\n prevRate = rate\n const newtonStep = currentNpv / derivNpv\n\n // Limit step size for stability\n const maxStep = Math.max(0.1, Math.abs(rate) * 0.5)\n if (Math.abs(newtonStep) > maxStep) {\n rate -= Math.sign(newtonStep) * maxStep\n } else {\n rate -= newtonStep\n }\n\n // Constrain rate to reasonable values\n if (rate <= -1) rate = -0.99999999\n if (rate > 1000) rate = 1000\n\n iteration++\n }\n\n // Phase 2: Bisection method for reliability\n // Use current Newton result as a starting point\n let npvAtRate = cachedNpv(rate)\n\n // If Newton's method gave a good answer, return it\n if (Math.abs(npvAtRate) < epsMax) {\n return rate\n }\n\n // Otherwise, set up bisection\n let a, b\n\n // Find boundaries where NPV changes sign\n if (npvAtRate > 0) {\n a = rate\n // Find b where npv(b) < 0\n b = rate + 0.1\n while (cachedNpv(b) > 0 && b < 1000) {\n b = b * 2 + 0.1\n }\n if (b >= 1000) return rate // Couldn't find sign change\n } else {\n b = rate\n // Find a where npv(a) > 0\n a = Math.max(-0.99999999, rate - 0.1)\n while (cachedNpv(a) < 0 && a > -0.99999999) {\n a = Math.max(-0.99999999, a - 0.1)\n }\n if (a <= -0.99999999) return rate // Couldn't find sign change\n }\n\n // Perform bisection\n let c\n for (let i = 0; i < maxIterations; i++) {\n c = (a + b) / 2\n const npvC = cachedNpv(c)\n\n if (Math.abs(npvC) < epsMax || Math.abs(b - a) < epsMax) {\n return c\n }\n\n if (npvC * cachedNpv(a) < 0) {\n b = c\n } else {\n a = c\n }\n }\n\n return c\n }\n\n // Execute optimized combined method\n return combinedMethod()\n}\n\n/**\n * Calculates the interest paid during a specific period of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the investment.\n * @param {*} per The period for which you want to find the interest, and must be between 1 and Nper.\n * @param {*} nper The total number of payment periods for the investment.\n * @param {*} pv The present value of the investment. For a loan, Pv is the loan amount.\n *\n * @returns\n */\nexport function ISPMT(rate, per, nper, pv) {\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n\n if (utils.anyIsError(rate, per, nper, pv)) {\n return error.value\n }\n\n // Return interest\n return pv * rate * (per / nper - 1)\n}\n\n/**\n * Returns the internal rate of return where positive and negative cash flows are financed at different rates.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers. These numbers represent a series of payments (negative values) and income (positive values) occurring at regular periods.\n - Values must contain at least one positive value and one negative value to calculate the modified internal rate of return. Otherwise, MIRR returns the #DIV/0! error value.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored; however, values with the value zero are included.\n * @param {*} finance_rate The interest rate you pay on the money used in the cash flows.\n * @param {*} reinvest_rate The interest rate you receive on the cash flows as you reinvest them.\n * @returns\n */\nexport function MIRR(values, finance_rate, reinvest_rate) {\n values = utils.parseNumberArray(utils.flatten(values))\n finance_rate = utils.parseNumber(finance_rate)\n reinvest_rate = utils.parseNumber(reinvest_rate)\n\n if (utils.anyIsError(values, finance_rate, reinvest_rate)) {\n return error.value\n }\n\n // Initialize number of values\n const n = values.length\n\n // Lookup payments (negative values) and incomes (positive values)\n const payments = []\n const incomes = []\n\n for (let i = 0; i < n; i++) {\n if (values[i] < 0) {\n payments.push(values[i])\n } else {\n incomes.push(values[i])\n }\n }\n\n // Return modified internal rate of return\n const num = -NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1)\n const den = NPV(finance_rate, payments) * (1 + finance_rate)\n\n return Math.pow(num / den, 1 / (n - 1)) - 1\n}\n\n/**\n * Returns the annual nominal interest rate.\n *\n * Category: Financial\n *\n * @param {*} effect_rate The effective interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nexport function NOMINAL(effect_rate, npery) {\n effect_rate = utils.parseNumber(effect_rate)\n npery = utils.parseNumber(npery)\n\n if (utils.anyIsError(effect_rate, npery)) {\n return error.value\n }\n\n // Return error if rate <=0 or periods < 1\n if (effect_rate <= 0 || npery < 1) {\n return error.num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10)\n\n // Return nominal annual interest rate\n return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery\n}\n\n/**\n * Returns the number of periods for an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function NPER(rate, pmt, pv, fv, type) {\n type = type === undefined ? 0 : type\n fv = fv === undefined ? 0 : fv\n\n rate = utils.parseNumber(rate)\n pmt = utils.parseNumber(pmt)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, pmt, pv, fv, type)) {\n return error.value\n }\n\n if (rate === 0) {\n return -(pv + fv) / pmt\n } else {\n const num = pmt * (1 + rate * type) - fv * rate\n const den = pv * rate + pmt * (1 + rate * type)\n\n return Math.log(num / den) / Math.log(1 + rate)\n }\n}\n\n/**\n * Returns the net present value of an investment based on a series of periodic cash flows and a discount rate.\n *\n * Category: Financial\n *\n * @param {*} rate The rate of discount over the length of one period.\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 254 arguments representing the payments and income.\n - value1, value2, ... must be equally spaced in time and occur at the end of each period.\n - NPV uses the order of value1, value2, ... to interpret the order of cash flows. Be sure to enter your payment and income values in the correct sequence.\n - Arguments that are empty values, logical values, or text representations of numbers, error values, or text that cannot be translated into numbers are ignored.\n - If an argument is an array or reference, only numbers in that array or reference are counted. Empty values, logical values, text, or error values in the array or reference are ignored.\n * @returns\n */\nexport function NPV() {\n const args = utils.parseNumberArray(utils.flatten(arguments))\n\n if (args instanceof Error) {\n return args\n }\n\n // Lookup rate\n const rate = args[0]\n\n // Initialize net present value\n let value = 0\n\n // Loop on all values\n for (let j = 1; j < args.length; j++) {\n value += args[j] / Math.pow(1 + rate, j)\n }\n\n // Return net present value\n return value\n}\n\n/**\n * Returns the number of periods required by an investment to reach a specified value.\n *\n * Category: Financial\n *\n * @param {*} rate Rate is the interest rate per period.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the desired future value of the investment.\n * @returns\n */\nexport function PDURATION(rate, pv, fv) {\n rate = utils.parseNumber(rate)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n\n if (utils.anyIsError(rate, pv, fv)) {\n return error.value\n }\n\n // Return error if rate <=0\n if (rate <= 0) {\n return error.num\n }\n\n // Return number of periods\n return (Math.log(fv) - Math.log(pv)) / Math.log(1 + rate)\n}\n\n/**\n * Returns the periodic payment for an annuity.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the loan.\n * @param {*} nper The total number of payments for the loan.\n * @param {*} pv The present value, or the total amount that a series of future payments is worth now; also known as the principal.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 (zero) or 1 and indicates when payments are due.\n * @returns\n */\nexport function PMT(rate, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, pv, fv, type)) {\n return error.value\n }\n\n // Return payment\n let result\n\n if (rate === 0) {\n result = (pv + fv) / nper\n } else {\n const term = Math.pow(1 + rate, nper)\n\n result =\n type === 1\n ? ((fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)) / (1 + rate)\n : (fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)\n }\n\n return -result\n}\n\n/**\n * Returns the payment on the principal for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per Specifies the period and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function PPMT(rate, per, nper, pv, fv, type) {\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, nper, pv, fv, type)) {\n return error.value\n }\n\n return PMT(rate, nper, pv, fv, type) - IPMT(rate, per, nper, pv, fv, type)\n}\n\n/**\n * Returns the price per $100 face value of a discounted security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} discount The security's discount rate.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nexport function PRICEDISC(settlement, maturity, discount, redemption, basis) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n redemption = utils.parseNumber(redemption)\n basis = utils.parseNumber(basis)\n\n basis = basis || 0\n\n if (utils.anyIsError(settlement, maturity, discount, redemption, basis)) {\n return error.value\n }\n\n if (discount <= 0 || redemption <= 0) {\n return error.num\n }\n\n if (settlement >= maturity) {\n return error.value\n }\n\n let basisVal, diff\n switch (basis) {\n case 0:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, false)\n break\n case 1:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 2:\n basisVal = 360\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 3:\n basisVal = 365\n diff = dateTime.DATEDIF(settlement, maturity, 'D')\n break\n case 4:\n basisVal = 360\n diff = dateTime.DAYS360(settlement, maturity, true)\n break\n default:\n return error.num\n }\n\n return redemption - (discount * redemption * diff) / basisVal\n}\n\n/**\n * Returns the present value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period. For example, if you obtain an automobile loan at a 10 percent annual interest rate and make monthly payments, your interest rate per month is 10%/12, or 0.83%. You would enter 10%/12, or 0.83%, or 0.0083, into the formula as the rate.\n * @param {*} nper The total number of payment periods in an annuity. For example, if you get a four-year car loan and make monthly payments, your loan has 4*12 (or 48) periods. You would enter 48 into the formula for nper.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. For example, the monthly payments on a $10,000, four-year car loan at 12 percent are $263.33. You would enter -263.33 into the formula as the pmt. If pmt is omitted, you must include the fv argument.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). For example, if you want to save $50,000 to pay for a special project in 18 years, then $50,000 is the future value. You could then make a conservative guess at an interest rate and determine how much you must save each month. If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nexport function PV(rate, per, pmt, fv, type) {\n fv = fv || 0\n type = type || 0\n\n rate = utils.parseNumber(rate)\n per = utils.parseNumber(per)\n pmt = utils.parseNumber(pmt)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n\n if (utils.anyIsError(rate, per, pmt, fv, type)) {\n return error.value\n }\n\n // Return present value\n return rate === 0\n ? -pmt * per - fv\n : (((1 - Math.pow(1 + rate, per)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, per)\n}\n\n/**\n * Returns the interest rate per period of an annuity.\n *\n * Category: Financial\n *\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. If pmt is omitted, you must include the fv argument.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @param {*} guess Optional. Your guess for what the rate will be. If you omit guess, it is assumed to be 10 percent. If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n - If you omit guess, it is assumed to be 10 percent.\n - If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n * @returns\n */\nexport function RATE(nper, pmt, pv, fv, type, guess) {\n guess = guess === undefined ? 0.1 : guess\n fv = fv === undefined ? 0 : fv\n type = type === undefined ? 0 : type\n\n nper = utils.parseNumber(nper)\n pmt = utils.parseNumber(pmt)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n type = utils.parseNumber(type)\n guess = utils.parseNumber(guess)\n\n if (utils.anyIsError(nper, pmt, pv, fv, type, guess)) {\n return error.value\n }\n\n const epsMax = 1e-10\n const iterMax = 100\n let rate = guess\n\n type = type ? 1 : 0\n\n for (let i = 0; i < iterMax; i++) {\n if (rate <= -1) {\n return error.num\n }\n\n let y, f\n\n if (Math.abs(rate) < epsMax) {\n y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv\n } else {\n f = Math.pow(1 + rate, nper)\n y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv\n }\n\n if (Math.abs(y) < epsMax) {\n return rate\n }\n\n let dy\n\n if (Math.abs(rate) < epsMax) {\n dy = pv * nper + pmt * type * nper\n } else {\n f = Math.pow(1 + rate, nper)\n const df = nper * Math.pow(1 + rate, nper - 1)\n dy = pv * df + pmt * (1 / rate + type) * df + pmt * (-1 / (rate * rate)) * (f - 1)\n }\n\n rate -= y / dy\n }\n\n return rate\n}\n\n/**\n * Returns an equivalent interest rate for the growth of an investment.\n *\n * Category: Financial\n *\n * @param {*} nper Nper is the number of periods for the investment.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the future value of the investment.\n * @returns\n */\nexport function RRI(nper, pv, fv) {\n nper = utils.parseNumber(nper)\n pv = utils.parseNumber(pv)\n fv = utils.parseNumber(fv)\n\n if (utils.anyIsError(nper, pv, fv)) {\n return error.value\n }\n\n // Return error if nper or present is equal to 0 (zero)\n if (nper === 0 || pv === 0) {\n return error.num\n }\n\n // Return equivalent interest rate\n return Math.pow(fv / pv, 1 / nper) - 1\n}\n\n/**\n * Returns the straight-line depreciation of an asset for one period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @returns\n */\nexport function SLN(cost, salvage, life) {\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n\n if (utils.anyIsError(cost, salvage, life)) {\n return error.value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num\n }\n\n // Return straight-line depreciation\n return (cost - salvage) / life\n}\n\n/**\n * Returns the sum-of-years' digits depreciation of an asset for a specified period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} per The period and must use the same units as life.\n * @returns\n */\nexport function SYD(cost, salvage, life, per) {\n // Return error if any of the parameters is not a number\n cost = utils.parseNumber(cost)\n salvage = utils.parseNumber(salvage)\n life = utils.parseNumber(life)\n per = utils.parseNumber(per)\n\n if (utils.anyIsError(cost, salvage, life, per)) {\n return error.value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return error.num\n }\n\n // Return error if period is lower than 1 or greater than life\n if (per < 1 || per > life) {\n return error.num\n }\n\n // Truncate period if it is not an integer\n per = parseInt(per, 10)\n\n // Return straight-line depreciation\n return ((cost - salvage) * (life - per + 1) * 2) / (life * (life + 1))\n}\n\n/**\n * Returns the bond-equivalent yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nexport function TBILLEQ(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return (365 * discount) / (360 - discount * dateTime.DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the price per $100 face value for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nexport function TBILLPRICE(settlement, maturity, discount) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n discount = utils.parseNumber(discount)\n\n if (utils.anyIsError(settlement, maturity, discount)) {\n return error.value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return 100 * (1 - (discount * dateTime.DAYS360(settlement, maturity, false)) / 360)\n}\n\n/**\n * Returns the yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} pr The Treasury bill's price per $100 face value.\n * @returns\n */\nexport function TBILLYIELD(settlement, maturity, pr) {\n settlement = utils.parseDate(settlement)\n maturity = utils.parseDate(maturity)\n pr = utils.parseNumber(pr)\n\n if (utils.anyIsError(settlement, maturity, pr)) {\n return error.value\n }\n\n // Return error if price is lower than or equal to zero\n if (pr <= 0) {\n return error.num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return error.num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return error.num\n }\n\n // Return bond-equivalent yield\n return ((100 - pr) * 360) / (pr * dateTime.DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. Dates may occur in any order. Dates should be entered by using the DATE function, or as results of other formulas or functions. For example, use DATE(2008,5,23) for the 23rd day of May, 2008. Problems can occur if dates are entered as text. .\n * @param {*} guess Optional. A number that you guess is close to the result of XIRR.\n * @returns\n */\nexport function XIRR(values, dates, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n values = utils.parseNumberArray(utils.flatten(values))\n dates = utils.parseDateArray(utils.flatten(dates))\n guess = utils.parseNumber(guess)\n\n if (utils.anyIsError(values, dates, guess)) {\n return error.value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1\n let result = values[0]\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, dateTime.DAYS(dates[i], dates[0]) / 365)\n }\n\n return result\n }\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1\n let result = 0\n\n for (let i = 1; i < values.length; i++) {\n const frac = dateTime.DAYS(dates[i], dates[0]) / 365\n result -= (frac * values[i]) / Math.pow(r, frac + 1)\n }\n\n return result\n }\n\n // Check that values contains at least one positive value and one negative value\n let positive = false\n let negative = false\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > 0) {\n positive = true\n }\n\n if (values[i] < 0) {\n negative = true\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return error.num\n }\n\n // Initialize guess and resultRate\n guess = guess || 0.1\n let resultRate = guess\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10\n\n // Implement Newton's method\n let newRate, epsRate, resultValue\n let contLoop = true\n\n do {\n resultValue = irrResult(values, dates, resultRate)\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate)\n epsRate = Math.abs(newRate - resultRate)\n resultRate = newRate\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Returns the net present value for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} rate The discount rate to apply to the cash flows.\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they may occur in any order.\n * @returns\n */\nexport function XNPV(rate, values, dates) {\n rate = utils.parseNumber(rate)\n values = utils.parseNumberArray(utils.flatten(values))\n dates = utils.parseDateArray(utils.flatten(dates))\n\n if (utils.anyIsError(rate, values, dates)) {\n return error.value\n }\n\n let result = 0\n\n for (let i = 0; i < values.length; i++) {\n result += values[i] / Math.pow(1 + rate, dateTime.DAYS(dates[i], dates[0]) / 365)\n }\n\n return result\n}\n"," export const CHAIN_ID_MAP = {\n ethereum: 1,\n gnosis: 100,\n base: 8453,\n };\n\n export const BLOCKSCOUT_CHAINS_MAP = {\n ethereum: 'https://eth.blockscout.com',\n gnosis: 'https://gnosis.blockscout.com',\n arbitrum: 'https://arbitrum.blockscout.com',\n optimism: 'https://optimism.blockscout.com',\n soneium: 'https://soneium.blockscout.com',\n unichain: 'https://unichain.blockscout.com'\n}\n\nexport const SAFE_CHAIN_MAP = {\n ethereum: 'eth',\n gnosis: 'gno',\n};\n\nexport const ERROR_MESSAGES_FLAG = {\n INVALID_API_KEY: '_INVALID_KEY',\n RATE_LIMIT: '_RATE_LIMIT_REACHED',\n DEFAULT: 'FETCH_ERROR',\n MISSING_KEY: '_MISSING',\n INVALID_CHAIN: '_INVALID_CHAIN',\n INVALID_TYPE: '_INVALID_TYPE',\n INVALID_ADDRESS: '_INVALID_ADDRESS',\n INVALID_PARAM: '_INVALID_PARAM'\n}\n\nexport const UTILITY = {\n ALCHEMY_API_KEY: 'ALCHEMY_API_KEY'\n}","export const SERVICE_API_KEY = {\n Etherscan: \"ETHERSCAN_API_KEY\",\n Coingecko: \"COINGECKO_API_KEY\",\n Safe: \"SAFE_API_KEY\",\n Basescan: \"BASESCAN_API_KEY\",\n Gnosisscan: \"GNOSIS_API_KEY\",\n Firefly: \"FIRE_FLY_API_KEY\",\n GnosisPay: 'GNOSIS_API_KEY'\n}\n\nexport const FUNCTION_LOCALE = [\n{\n API_KEY: SERVICE_API_KEY.Firefly,\n LOGO: \"https://firefly.social/android-chrome-192x192.png\",\n BRAND_COLOR: \"#f8f5fc\",\n BRAND_SECONDARY_COLOR: \"#855dcd\",\n n: \"FIREFLY\",\n t: 20,\n d: \"Fetches content from Farcaster or Lens.\",\n a: \"Retrieves posts, replies, or channels from Farcaster and Lens by usernames, IDs, or hashes.\",\n p: [\n {\n name: \"platform\",\n detail: \"The social platform to query. Supports 'farcaster' or 'lens'.\",\n example: `\"farcaster\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"contentType\",\n detail: \"Type of content to fetch. Supports 'posts', 'replies', and 'channels' (channels only for 'farcaster').\",\n example: `\"posts\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"identifier\",\n detail: \"Comma-separated usernames, IDs, or post hashes depending on platform and contentType.\",\n example: `\"toka,miroyato\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"start\",\n detail: \"Pagination start index (default is 0).\",\n example: `0`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"end\",\n detail: \"Pagination end index (default is 10).\",\n example: `10`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n\n {\n API_KEY: SERVICE_API_KEY.Neynar,\n LOGO: \"https://framerusercontent.com/images/OS5YeZ2Y7DmszAxL6Zf06pXtKzc.svg\",\n BRAND_COLOR: \"##e8e6ff\",\n BRAND_SECONDARY_COLOR: \"#28204A\",\n n: \"NEYNAR\",\n t: 20,\n d: \"Fetches followers for a given Farcaster FID using Neynar's API.\",\n a: \"Retrieves followers of a Farcaster user, with support for sorting, pagination, and optional viewer context.\",\n p: [\n {\n name: \"fid\",\n detail: \"The Farcaster FID of the user whose followers should be fetched.\",\n example: `123`,\n require: \"m\",\n type: \"number\"\n },\n {\n name: \"viewerFid\",\n detail: \"FID of the viewer, to include contextual info like mutual follows (optional).\",\n example: `456`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"sortType\",\n detail: \"Sorting type: either 'desc_chron' (default) or 'algorithmic'.\",\n example: `\"desc_chron\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"limit\",\n detail: \"Number of followers to return (max 100).\",\n example: `20`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"cursor\",\n detail: \"Cursor string for paginating the result set.\",\n example: `\"eyJvZmZzZXQiOjIwLCJsYXN0SWQiOjEyMzQ1Nn0=\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Basescan,\n LOGO: \"https://2064089921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FevP3L0cUvP9xmRefuzCm%2Fuploads%2F2K1pvFsE7JAfcI3LAxYl%2Fbase-logo-in-blue.webp?alt=media&token=32c80439-dbdc-432a-b199-220e012efc3c\",\n BRAND_COLOR: \"#f1f5ff\",\n BRAND_SECONDARY_COLOR: \"#2752ff\",\n n: \"BASESCAN\",\n t: 20,\n d: \"Fetches Base network data via Basescan: native txns, ERC-20 transfers, ERC-721 transfers, and gas metrics.\",\n a: \"Pulls on-chain activity for Base (chainid 8453) using Basescan’s API — supports full tx history, token/NFT transfers, gas prices, and pagination.\",\n p: [\n {\n name: \"type\",\n detail: \"Data category: 'all-txns' | 'token-txns' | 'nft-txns' | 'gas'.\",\n example: `\"token-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"Must be 'base'.\",\n example: `\"base\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"Target wallet address (only required for txns, token, and nft queries). Not needed for 'gas'.\",\n example: `\"0x7FD624f3f97A7dd36195E8379F28dB6147C270ff\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Start date (used to resolve block range). Optional, only applies to txns.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"End date (used to resolve block range). Optional, only applies to txns.\",\n example: `\"07/07/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"page\",\n detail: \"Page number for paginated results. Only applies to txns/token/nft queries.\",\n example: `1`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Number of items per page (limit). Only applies to txns/token/nft queries.\",\n example: `2`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n{\n API_KEY: SERVICE_API_KEY.Gnosisscan,\n LOGO: \"https://gnosisscan.io/assets/generic/html/favicon-light.ico\",\n BRAND_COLOR: \"#f6f7f6\",\n BRAND_SECONDARY_COLOR: \"#133629\",\n n: \"GNOSISSCAN\",\n t: 20,\n d: \"Fetches Gnosis Chain data via Gnosisscan: native transactions, ERC-20 token transfers, ERC-721 NFT transfers, and gas metrics.\",\n a: \"Queries Gnosis Chain (chainid 100) through Gnosisscan’s API to return transaction history, token/NFT transfers, or gas price information. Supports pagination and time-based filtering for transaction types.\",\n p: [\n {\n name: \"type\",\n detail: \"Data category to fetch. Options: 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"nft-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"Must be 'gnosis'.\",\n example: `\"gnosis\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"Wallet address to query. Required for all types except 'gas'.\",\n example: `\"0x90830Ed558f12D826370DC52E9D87947A7F18De9\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to resolve starting block for txns.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to resolve ending block for txns.\",\n example: `\"14/06/2025\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"page\",\n detail: \"Page number for paginated transaction results. Applies only to 'txns', 'token-txns', and 'nft-txns'.\",\n example: `\"1\"`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Number of results per page (limit). Applies only to 'txns', 'token-txns', and 'nft-txns'.\",\n example: `\"50\"`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n {\n LOGO: 'https://cdn.prod.website-files.com/65f94dfd53db8b337c808067/68485baa72714ae58f350ce2_bs-logo.png',\n BRAND_COLOR: '#f8f8fd',\n BRAND_SECONDARY_COLOR: '#5353D3',\n n: 'BLOCKSCOUT',\n t: 20,\n d: 'Returns the onchain information about an address on a provided blockchain. By default on Ethereum mainnet.',\n a: 'Returns the onchain information about an address on a provided blockchain. By default on Ethereum mainnet.',\n p: [\n {\n name: 'address',\n detail: 'The address string representing the addresses to check for balance',\n example: `\"vitalik.eth\"`,\n require: 'm',\n type: 'string'\n },\n {\n name: 'type',\n detail: 'The type of data to query.',\n example: `\"txns\"`,\n require: 'm',\n type: 'string'\n },\n {\n name: 'chain',\n detail: 'The blockchain to query. By default on Ethereum mainnet.',\n example: `\"ethereum\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'startTimestamp',\n detail: 'Start date marking the start of the transaction search range. Work with type === \"txns\"',\n example: `\"01/01/2023\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'endTimestamp',\n detail: 'End date marking the end of the transaction search range. Work with type === \"txns\"',\n example: `\"01/05/2024\"`,\n require: 'o',\n type: 'string'\n },\n {\n name: 'page',\n detail: 'The page number to return. Work with type === \"txns\"',\n example: '1',\n require: 'o',\n repeat: 'n',\n type: 'rangenumber'\n },\n {\n name: 'offset',\n detail: 'The number of transactions to return per page. Work with type === \"txns\"',\n example: '2',\n require: 'o',\n repeat: 'n',\n type: 'rangenumber'\n }\n ]\n },\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://etherscan.io/images/favicon3.ico\",\n BRAND_COLOR: \"#F6F7F8\",\n BRAND_SECONDARY_COLOR: \"#21325B\",\n n: \"ETHERSCAN\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://etherscan.io/images/favicon3.ico\",\n BRAND_COLOR: \"#F6F7F8\",\n BRAND_SECONDARY_COLOR: \"#21325B\",\n n: \"EOA\",\n t: 20,\n d: \"Fetches address data like transactions, balances, or portfolio info from multiple supported chains.\",\n a: \"Dynamically queries blockchain data such as transactions and balances by resolving time ranges to block ranges and supporting pagination.\",\n p: [\n {\n name: \"addresses\",\n detail: \"One or more addresses (comma-separated) to query.\",\n example: `\"vitalik.eth\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"categories\",\n detail: `Type of data to fetch. Supported values: \"txns\", \"balance\".`,\n example: `\"txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: `Blockchain network(s) to query. Supported values: \"ethereum\", \"gnosis\", \"base\". Accepts comma-separated values.`,\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"startTime\",\n detail: \"Used to calculate starting block for transaction queries.\",\n example: `\"01/01/2024\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"endTime\",\n detail: \"Used to calculate ending block for transaction queries.\",\n example: `\"01/06/2024\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"page\",\n detail: \"The page number for paginated transaction results. Only used when category is 'txns'. Default is 1\",\n example: \"1\",\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"The number of results to return per page (limit). Only used when category is 'txns'. Default is 10\",\n example: \"10\",\n require: \"o\",\n type: \"number\"\n }\n ],\n}\n,\n{\n LOGO: 'https://files.readme.io/06394e687778e238a6cd43de6e1d7d339043aa50054703f64606369352ef1864-VariantCG-Symbol-Color.png',\n BRAND_COLOR: '#f8fdf8',\n BRAND_SECONDARY_COLOR: '#4bc63d',\n n: 'COINGECKO',\n t: 20,\n API_KEY: SERVICE_API_KEY.Coingecko,\n d: 'Query crypto prices, ecosystem market data, stablecoins, or derivatives from CoinGecko.',\n a: 'Supports querying: \"price\" for specific tokens \"market\" for ecosystem categories (ETH, BASE, SOL, GNOSIS, HYPERLIQUID, BITCOIN, PUMP)\\n- \"stablecoins\" for stablecoin categories like \"crypto-backed-stablecoin\"\\n- \"derivatives\" globally or per exchange.\\nPagination is supported for all except single-exchange derivatives.',\n p: [\n {\n name: 'category',\n detail: 'Query type: \"price\", \"market\", \"stablecoins\", or \"derivatives\".',\n example: `\"stablecoins\"`,\n require: 'm'\n },\n {\n name: 'param1',\n detail: `For \"price\": coin ID(s). \nFor \"market\": one of [\"eth\", \"base\", \"sol\", \"gnosis\", \"hyperliquid\", \"bitcoin\", \"pump\", \"aiagents\", \"meme\"]. \nFor \"stablecoins\": one of [\"all\", \"crypto-backed-stablecoin\", \"yield-bearing-stablecoins\", etc.]. \nFor \"derivatives\": exchange name (e.g., \"binance_futures\").`,\n example: `\"yield-bearing-stablecoins\"`,\n require: 'o'\n },\n {\n name: 'param2',\n detail: `For \"price\": target currency(ies) (e.g. \"usd\"). \nFor \"market\" and \"stablecoins\": comma-separated price trend keys (e.g. 1h,24h,7d).`,\n example: `\"1h,24h,7d\"`,\n require: 'o'\n },\n {\n name: 'page',\n detail: 'Page number for pagination (applies to \"market\", \"stablecoins\", and global \"derivatives\").',\n example: `1`,\n require: 'o'\n },\n {\n name: 'per_page',\n detail: 'Number of items per page (applies to \"market\", \"stablecoins\", and global \"derivatives\").',\n example: `2`,\n require: 'o'\n }\n ]\n},\n\n // {\n // n: \"FLVURL\",\n // t: 20,\n // d: \"Query the prices of one or more coins by using their unique Coin API IDs, symbols, or names.\",\n // a: \"Query the prices of one or more coins by using their unique Coin API IDs, symbols, or names.\",\n // p: [\n // {\n // name: \"token\",\n // detail:\n // \"coins' IDs, comma-separated if querying more than 1 coin.\",\n // example: `\"bitcoin\"`,\n // require: \"m\",\n // },\n // {\n // name: \"vs_currency\",\n // detail: \"target currency of coins, comma-separated if querying more than 1 currency\",\n // example: `\"usd\"`,\n // require: \"m\",\n // },\n // ],\n // },\n {\n API_KEY: SERVICE_API_KEY.Safe,\n LOGO: \"https://safe-transaction-mainnet.safe.global/static/safe/favicon.png\",\n BRAND_COLOR: \"#ebf9f3\",\n BRAND_SECONDARY_COLOR: \"#00B460\",\n n: \"SAFE\",\n t: 20,\n d: \"Query the list of transactions performed by a Safe address, with optional pagination.\",\n a: \"Query the list of transactions performed by a Safe address, with optional pagination.\",\n p: [\n {\n name: \"address\",\n detail: \"The address to query, in hexadecimal format.\",\n example: `\"0xe9A6378d8FD4983C2999DB0735f258397E8C2253\"`,\n require: \"m\",\n },\n {\n name: \"utility\",\n detail: \"The utility to query, supported values: 'txns'.\",\n example: `\"txns\"`,\n require: \"m\",\n },\n {\n name: \"chain\",\n detail: \"The chain to query, supported values: 'ethereum', 'gnosis'.\",\n example: `\"gnosis\"`,\n require: \"m\",\n },\n {\n name: \"limit\",\n detail: \"The number of transactions to return, default is 100.\",\n example: `10`,\n require: \"o\",\n repeat: \"n\",\n },\n {\n name: \"offset\",\n detail: \"The number of transactions to skip, default is 0.\",\n example: `0`,\n require: \"o\",\n repeat: \"n\",\n },\n ],\n },\n {\n n: \"PNL\",\n t: 20,\n d: \"Subtract each element from A column from B column and return the total sum.\",\n a: \"Returns the total of A - B element-wise subtraction across two ranges.\",\n p: [\n {\n name: \"A\",\n detail:\n \"The column or array of values to subtract from B (e.g. cost).\",\n example: \"A1:A10\",\n require: \"m\",\n repeat: \"n\",\n type: \"range\",\n },\n {\n name: \"B\",\n detail:\n \"The column or array of values to subtract A from (e.g. revenue).\",\n example: \"B1:B10\",\n require: \"m\",\n repeat: \"n\",\n type: \"range\",\n },\n ],\n },\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://app.uniswap.org/favicon.png\",\n BRAND_COLOR: \"#fef5fc\",\n BRAND_SECONDARY_COLOR: \"#f50db4\",\n n: \"UNISWAP\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n \n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://avatars.githubusercontent.com/u/47617460?s=200&v=4\",\n BRAND_COLOR: \"#f7f7ff\",\n BRAND_SECONDARY_COLOR: \"#9896ff\",\n n: \"AAVE\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://www.pendle.finance/uploads/wp-content/uploads/2021/12/cropped-Pendle-Logo-quite-small.png\",\n BRAND_COLOR: \"#eafffb\",\n BRAND_SECONDARY_COLOR: \"#47e2c2\",\n n: \"PENDLE\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n\n\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://aerodrome.finance/images/AERO/favicon.ico\",\n BRAND_COLOR: \"#edf3ff\",\n BRAND_SECONDARY_COLOR: \"#2966f0\",\n n: \"AERODROME\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://cdn.prod.website-files.com/6760e87b474d412dfa9a7a68/6760e8ebe8faad5fb985c89a_Frame%201321316795.png\",\n BRAND_COLOR: \"#f6f4ff\",\n BRAND_SECONDARY_COLOR: \"#684ff8\",\n n: \"ARTEMIS\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://aerodrome.finance/images/AERO/favicon.ico\",\n BRAND_COLOR: \"#effdfb\",\n BRAND_SECONDARY_COLOR: \"#5eead4\",\n n: \"KAITO\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n\n{\n API_KEY: SERVICE_API_KEY.GnosisPay,\n LOGO: \"https://gnosisscan.io/assets/generic/html/favicon-light.ico\",\n BRAND_COLOR: \"#f6f7f6\",\n BRAND_SECONDARY_COLOR: \"#133629\",\n n: \"GNOSISPAY\",\n t: 20,\n d: \"Fetches Gnosis Pay card transaction history, including merchant, amount, and currency info.\",\n a: \"Retrieves card transactions from Gnosis Pay’s API for a specific card ID, filtered by date range and paginated via limit/offset.\",\n p: [\n {\n name: \"cardId\",\n detail: \"The Gnosis Pay card ID to fetch transactions for.\",\n example: `\"card_9f8f8b3a56\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Filters transactions created after this date.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Filters transactions created before this date.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"limit\",\n detail: \"Number of transactions to return per page.\",\n example: `\"20\"`,\n require: \"o\",\n type: \"number\"\n },\n {\n name: \"offset\",\n detail: \"Offset for pagination (i.e., how many records to skip).\",\n example: `\"0\"`,\n require: \"o\",\n type: \"number\"\n }\n ]\n}\n,\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://avatars.githubusercontent.com/u/129790008?s=48&v=4\",\n BRAND_COLOR: \"#f1f7fc\",\n BRAND_SECONDARY_COLOR: \"#5098d6\",\n n: \"OTTERSCAN\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n{\n API_KEY: SERVICE_API_KEY.Etherscan,\n LOGO: \"https://www.tally.xyz/favicon.ico\",\n BRAND_COLOR: \"#f9f8ff\",\n BRAND_SECONDARY_COLOR: \"#725bff\",\n n: \"TALLY\",\n t: 20,\n d: \"Fetches data from Etherscan including transactions, token transfers, NFT transfers, and gas tracker info.\",\n a: \"Retrieves blockchain data for a given chain and address from Etherscan, including txns, token/nft transfers, and gas metrics.\",\n p: [\n {\n name: \"type\",\n detail: \"The type of data to retrieve. Can be 'all-txns', 'token-txns', 'nft-txns', or 'gas'.\",\n example: `\"all-txns\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"chain\",\n detail: \"The chain name (e.g. 'ethereum', 'base', 'gnosis').\",\n example: `\"ethereum\"`,\n require: \"m\",\n type: \"string\"\n },\n {\n name: \"address\",\n detail: \"The wallet address to fetch data for (not required for 'gas').\",\n example: `\"0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"startDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/01/2024\"`,\n require: \"o\",\n type: \"string\"\n },\n {\n name: \"endDate\",\n detail: \"Used to filter block range.\",\n example: `\"01/07/2025\"`,\n require: \"o\",\n type: \"string\"\n }\n ]\n},\n \n]\n\nexport * from './utils/constants'","import {CHAIN_ID_MAP} from './constants'\n \n export const fromTimeStampToBlock = async (timestamp, chain, apiKey) => {\nif(!timestamp || !chain || !apiKey) return \n const chainId = CHAIN_ID_MAP[chain];\n const url = `https://api.etherscan.io/v2/api?module=block&action=getblocknobytime&timestamp=${timestamp}&closest=before&apikey=${apiKey}&chainId=${chainId}`;\n const res = await fetch(url);\n const json = await res.json();\n return parseInt(json.result);\n\n };","export function toTimestamp(dateStr) {\n // Expecting format: \"DD/MM/YYYY\"\n const [day, month, year] = dateStr.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n return Math.floor(date.getTime() / 1000); // Unix timestamp in seconds\n}","export const isAddress = (input) => {\n return (/^0x[a-fA-F0-9]{40}$/.test(input)) \n}","import {UTILITY} from './constants'\n\n\nexport async function fromEnsNameToAddress(name) {\n if (typeof ethers === \"undefined\") {\n await new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://cdn.jsdelivr.net/npm/ethers@6.10.0/dist/ethers.umd.min.js\";\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n }\n\n const ALCHEMY_KEY = window.localStorage.getItem(UTILITY.ALCHEMY_API_KEY);\n if(!ALCHEMY_KEY){\n console.error(\"alchemy api key missing\")\n return null\n }\n const provider = new ethers.AlchemyProvider(\"mainnet\", ALCHEMY_KEY);\n\n try {\n const resolved = await provider.resolveName(name); // ENS ➝ address\n return resolved || null;\n } catch (err) {\n console.error(\"ENS resolution failed:\", err.message);\n return null;\n }\n}","import {fromTimeStampToBlock} from './from-timestamp-to-block'\nimport {CHAIN_ID_MAP, ERROR_MESSAGES_FLAG} from './constants'\nimport {SERVICE_API_KEY} from '../crypto-constants'\nimport {toTimestamp} from './toTimestamp'\nimport { isAddress } from './is-address';\nimport { fromEnsNameToAddress } from './from-ens-name-to-address';\n\n\n\nexport async function handleScanRequest({\n scanKey,\n baseUrl,\n type,\n chain,\n address,\n startDate,\n endDate,\n page = 1,\n offset = 10,\n}) {\n const API_KEY = window.localStorage.getItem(scanKey);\n if (!API_KEY) return `${scanKey}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n if (API_KEY === 'xxxx') return `${scanKey}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n\n let chainId = CHAIN_ID_MAP[chain?.toLowerCase()];\n if (!chainId) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_CHAIN}`;\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const ACTION_MAP = {\n 'all-txns': 'txlist',\n 'token-txns': 'tokentx',\n 'nft-txns': 'tokennfttx',\n 'gas': 'gastracker',\n };\n\n const action = ACTION_MAP[type];\n if (!action) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_TYPE}`;\n\n\n if (scanKey === SERVICE_API_KEY.Basescan) chainId = 'base';\nif (scanKey === SERVICE_API_KEY.Gnosisscan) chainId = 'gnosis';\n\n let url = `${baseUrl}?chainid=${chainId}&module=account&action=${action}&apikey=${API_KEY}`;\n\n if (['all-txns', 'token-txns', 'nft-txns'].includes(type)) {\n if (!address) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_ADDRESS}`;\n url += `&address=${address}&startblock=0&endblock=99999999&sort=asc`;\n\n if (!isNaN(startDate) && !isNaN(endDate)) {\n const [startBlock, endBlock] = await Promise.all([\n fromTimeStampToBlock(toTimestamp(startDate), chain, API_KEY),\n fromTimeStampToBlock(toTimestamp(endDate), chain, API_KEY),\n ]);\n url += `&startblock=${startBlock}&endblock=${endBlock}`;\n }\n url += `&page=${page}&offset=${offset}`;\n }\n\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP error: ${res.status}`);\n const json = await res.json();\n\n if (typeof json.result === 'string') {\n if (json.result.includes('Invalid API Key')) return `${scanKey}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n if (json.result.includes('Max rate limit reached')) return `${scanKey}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n }\n\n return json.result;\n } catch (err) {\n console.error(`[${scanKey}]`, err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n","import { SERVICE_API_KEY } from \"./crypto-constants\";\nimport {fromTimeStampToBlock} from './utils/from-timestamp-to-block'\nimport {CHAIN_ID_MAP, BLOCKSCOUT_CHAINS_MAP, SAFE_CHAIN_MAP, ERROR_MESSAGES_FLAG} from './utils/constants'\nimport { handleScanRequest } from \"./utils/handle-explorer-request\";\nimport {toTimestamp} from './utils/toTimestamp'\nimport {isAddress} from './utils/is-address'\nimport { fromEnsNameToAddress } from \"./utils/from-ens-name-to-address\";\n\n\n\n\nexport async function FIREFLY(platform, contentType, identifier, start = 0, end = 10) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Firefly);\n if (!API_KEY) return `${SERVICE_API_KEY.Firefly}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const baseUrl = \"https://openapi.firefly.land/v1/fileverse/fetch\";\n const headers = { \"x-api-key\": API_KEY };\n\n const typeMap = {\n farcaster: {\n posts: \"farcasterid\",\n replies: \"farcasterpostid\",\n channels: \"farcasterchannels\",\n },\n lens: {\n posts: \"lensid\",\n replies: \"lenspostid\",\n }\n };\n\n const platformType = typeMap[platform]?.[contentType];\n if (!platformType) return `${SERVICE_API_KEY.Firefly}${ERROR_MESSAGES_FLAG.INVALID_TYPE}`;\n\n const query = identifier\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n .join(\",\");\n\n const url = new URL(baseUrl);\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"type\", platformType);\n url.searchParams.set(\"start\", String(start));\n url.searchParams.set(\"end\", String(end));\n\n try {\n const res = await fetch(url.toString(), { headers });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const json = await res.json();\n if (!Array.isArray(json?.data)) return [];\n\n return json.data.map(item => {\n const flat = {};\n for (const [key, value] of Object.entries(item)) {\n if (typeof value !== \"object\" || value === null) {\n flat[key] = value;\n }\n }\n flat.platform = platform;\n return flat;\n });\n\n } catch (err) {\n console.error(\"FIREFLY fetch error:\", err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\n\n\nexport async function BLOCKSCOUT(address, type, chain, startTimestamp, endTimestamp, page, offset) {\n if (!chain) {\n chain = 'ethereum'\n }\n\n if (!type) {\n return 'TYPE_MISSING'\n }\n\n if (!startTimestamp) {\n const currentTimestamp = Date.now()\n startTimestamp = currentTimestamp - 30 * 24 * 60 * 60 * 1000\n startTimestamp = Math.floor(startTimestamp / 1000)\n }\n\n if(isNaN(startTimestamp)){\n startTimestamp = toTimestamp(startTimestamp)\n }\n\n\n if(isNaN(endTimestamp) && endTimestamp){\n endTimestamp = toTimestamp(endTimestamp)\n }\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const hostname = BLOCKSCOUT_CHAINS_MAP[chain]\n\n let requestUrl\n\n switch (type) {\n case 'stat':\n requestUrl = `${hostname}/api/v2/addresses/${address}/counters`\n break\n case 'txns':\n requestUrl = `${hostname}/api?module=account&action=txlist&address=${address}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}&page=${page}&offset=${offset}&sort=asc`\n break\n case 'tokens':\n requestUrl = `${hostname}/api?module=account&action=tokenlist&address=${address}`\n break\n default:\n return 'INVALID_TYPE'\n }\n try {\n const response = await fetch(requestUrl)\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`)\n }\n const json = await response.json()\n\n console.log(json)\n if (json?.result?.includes('Invalid parameter(s)')) {\n return `INVALID_REQUEST_PARAMS`\n }\n if (json?.result?.includes('Not found')) {\n return `ADDRESS_NOT_FOUND`\n }\n\n if (type === 'stat') {\n /*\n For type === \"stat\"\n [{transactions_count: \"2940\",token_transfers_count: \"8346015\",gas_usage_count: \"91296738\",validations_count: \"0\"}]\n */\n return [json]\n }\n\n /*\n For type === \"tokens\"\n [{balance: \"287933140055877783279\",contractAddress: \"0x0000019226b5a2e87714daebde6a21e67fa88787\",decimals: \"18\",name: \"Doge King\",symbol: \"DOGEK\",type: \"ERC-20\"}]\n\n For type === \"txns\"\n [{blockNumber: '65204', timeStamp: '1439232889', blockHash: '0x3c3c3c3c', nonce: '0',....}]\n */\n return json.result\n } catch (error) {\n return 'ERROR IN FETCHING'\n }\n}\n\nexport async function BASESCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Basescan,\n baseUrl: 'https://api.basescan.org/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page,\n offset:limit\n });\n}\nexport async function GNOSISSCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Gnosisscan,\n baseUrl: 'https://api.gnosisscan.io/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page, \n offset:limit\n });\n}\n\nexport async function NEYNAR( \n fid, \n viewerFid, \n sortType, \n limit, \n cursor \n) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Neynar);\n if (!API_KEY) return `${SERVICE_API_KEY.Neynar}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n\n const url = new URL('https://api.neynar.com/v2/farcaster/followers');\n url.searchParams.set('fid', fid.toString());\n url.searchParams.set('sort_type', sortType);\n url.searchParams.set('limit', limit.toString());\n if (viewerFid !== null) url.searchParams.set('viewer_fid', viewerFid.toString());\n if (cursor) url.searchParams.set('cursor', cursor);\n\n try {\n const response = await fetch(url.toString(), {\n headers: {\n 'x-api-key': API_KEY,\n 'x-neynar-experimental': 'false'\n }\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const json = await response.json();\n if (!json?.users?.length) return [];\n\n return json.users.map(({ user }) => ({\n username: user.username,\n custody_address: user.custody_address,\n follower_count: user.follower_count,\n country: user.profile?.location?.address?.country || '',\n city: user.profile?.location?.address?.city || ''\n }));\n } catch (err) {\n console.error('NEYNAR_FETCH_FOLLOWERS error:', err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\nexport async function GNOSISPAY({\n cardId,\n startDate,\n endDate,\n limit = 20,\n offset = 0,\n}) {\n const apiKeyKey = SERVICE_API_KEY.GnosisPay\n const API_KEY = window.localStorage.getItem(apiKeyKey);\n if (!API_KEY) return `${apiKeyKey}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n if (!cardId) return `${apiKeyKey}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n\n const url = new URL(`https://api.gnosispay.com/cards/${cardId}/transactions`);\n url.searchParams.set('limit', limit.toString());\n url.searchParams.set('offset', offset.toString());\n\n if (!isNaN(toTimestamp(startDate))) {\n url.searchParams.set('startDate', new Date(startDate * 1000).toISOString());\n }\n\n if (!isNaN(toTimestamp(endDate))) {\n url.searchParams.set('endDate', new Date(endDate * 1000).toISOString());\n }\n\n try {\n const res = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${API_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`);\n\n const json = await res.json();\n\n if (!Array.isArray(json)) return [];\n\n return json.map(tx => ({\n createdAt: tx.createdAt,\n clearedAt: tx.clearedAt,\n country: tx.country,\n merchant: tx.merchant,\n billingAmount: tx.billingAmount,\n billingCurrency: tx.billingCurrency,\n transactionAmount: tx.transactionAmount,\n transactionCurrency: tx.transactionCurrency,\n transactionType: tx.transactionType,\n kind: tx.kind,\n status: tx.status || null,\n mcc: tx.mcc,\n }));\n } catch (err) {\n console.error('GNOSISPAY_CARD_TXNS error:', err);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\nexport async function ETHERSCAN(...args) {\n const [type, chain, address, startDate, endDate, page, limit] = args;\n return handleScanRequest({\n scanKey: SERVICE_API_KEY.Etherscan,\n baseUrl: 'https://api.etherscan.io/v2/api',\n type,\n chain,\n address,\n startDate,\n endDate,\n page, \n offset:limit\n });\n}\n\n\nexport async function COINGECKO(category, param1, param2, page = 1, perPage = 2) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Coingecko);\n if (!API_KEY) return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const headers = {\n accept: 'application/json',\n 'x-cg-demo-api-key': API_KEY,\n };\n\n let url = '';\n const lowerCategory = (category || '').toLowerCase();\n\n switch (lowerCategory) {\n case 'price': {\n const token = param1;\n const vsCurrencies = param2;\n if (!token || !vsCurrencies) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n }\n url = `https://api.coingecko.com/api/v3/simple/price?vs_currencies=${vsCurrencies}&ids=${token}`;\n break;\n }\n\n case 'market': {\n const ecosystemMap = {\n eth: 'ethereum-ecosystem',\n base: 'base-ecosystem',\n sol: 'solana-ecosystem',\n gnosis: 'gnosis-chain',\n hyperliquid: 'hyperliquid',\n bitcoin: 'bitcoin-ecosystem',\n pump: 'pump-ecosystem',\n aiagents: 'ai-agents',\n meme: 'meme-token',\n };\n\n const key = param1?.toLowerCase();\n const categoryVal = ecosystemMap[key] || '';\n const trend = param2 ? `&price_change_percentage=${param2}` : '';\n\n url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&include_tokens=top&page=${page}&per_page=${perPage}`;\n if (key && !categoryVal) return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n if (categoryVal) url += `&category=${categoryVal}`;\n if (trend) url += trend;\n break;\n }\n\n case 'stablecoins': {\n const category = !param1 || param1.toLowerCase() === 'all'\n ? 'stablecoins'\n : param1.toLowerCase();\n\n const trend = param2 ? `&price_change_percentage=${param2}` : '';\n url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&category=${category}&order=market_cap_desc&page=${page}&per_page=${perPage}${trend}`;\n break;\n }\n\n case 'derivatives': {\n const exchange = param1;\n if (exchange) {\n url = `https://api.coingecko.com/api/v3/derivatives/exchanges/${exchange}?include_tickers=all`;\n } else {\n url = `https://api.coingecko.com/api/v3/derivatives?page=${page}&per_page=${perPage}`;\n }\n break;\n }\n\n default:\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_PARAMS}`;\n }\n\n try {\n const response = await fetch(url, { method: 'GET', headers });\n const json = await response.json();\n\n if (!response.ok) {\n const message = json?.status?.error_message || '';\n if (message.includes('API Key Missing')) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n }\n if (response.status === 429) {\n return `${SERVICE_API_KEY.Coingecko}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n }\n }\n\n if (lowerCategory === 'price') {\n const output = {};\n for (const [token, prices] of Object.entries(json)) {\n for (const [currency, value] of Object.entries(prices)) {\n const key = `${token.charAt(0).toUpperCase() + token.slice(1)}_${currency.toUpperCase()}`;\n output[key] = value;\n }\n }\n return [output];\n }\n\n const flatArray = Array.isArray(json) ? json : [json];\n return flatArray.map(item => {\n const flat = {};\n for (const [key, value] of Object.entries(item)) {\n if (typeof value !== 'object' || value === null) {\n flat[key] = value;\n }\n }\n return flat;\n });\n } catch (error) {\n console.error(error);\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n}\n\n\n\n\nexport async function EOA(\n addresses,\n category,\n chains,\n startTime,\n endTime,\n page = 1,\n offset = 10,\n) {\n const API_KEY = window.localStorage.getItem(SERVICE_API_KEY.Etherscan);\n if (!API_KEY) return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.MISSING_KEY}`;\n\n const INPUTS = addresses.split(\",\").map(a => a.trim()).filter(Boolean);\n const CHAINS = chains.split(\",\").map(c => c.trim()).filter(Boolean);\n const out = [];\n\n // Map: finalAddress => ENS name (if applicable)\n const ADDRESS_MAP = {};\n\n for (const input of INPUTS) {\n if (isAddress(input)) {\n ADDRESS_MAP[input.toLowerCase()] = null; // it's a direct address\n } else {\n try {\n const resolved = await fromEnsNameToAddress(input); // ENS -> address\n if (resolved) ADDRESS_MAP[resolved.toLowerCase()] = input;\n } catch {\n return `${input}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`;\n }\n }\n }\n\n const ADDRS = Object.keys(ADDRESS_MAP);\n\n for (const chain of CHAINS) {\n const chainId = CHAIN_ID_MAP[chain];\n if (!chainId) return ERROR_MESSAGES_FLAG.UNSUPPORTED_CHAIN;\n\n if (category === \"balance\") {\n for (let i = 0; i < ADDRS.length; i += 20) {\n const slice = ADDRS.slice(i, i + 20).join(\",\");\n const action = ADDRS.length > 1 ? \"balancemulti\" : \"balance\";\n\n const url =\n `https://api.etherscan.io/v2/api?chainid=${chainId}` +\n `&module=account&action=${action}&address=${slice}` +\n `&tag=latest&apikey=${API_KEY}`;\n\n const data = await fetchJSON(url);\n if (typeof data === \"string\") return data;\n\n (Array.isArray(data) ? data : [data]).forEach(r =>\n out.push({\n chain,\n ...r,\n name: ADDRESS_MAP[(r.account || r.address || \"\").toLowerCase()] || null,\n }),\n );\n }\n continue;\n }\n\n if (category === \"txns\") {\n const startBlock = await fromTimeStampToBlock(toTimestamp(startTime), chain, API_KEY);\n const endBlock = await fromTimeStampToBlock(toTimestamp(endTime), chain, API_KEY);\n\n for (const addr of ADDRS) {\n const url =\n `https://api.etherscan.io/v2/api?chainid=${chainId}` +\n `&module=account&action=txlist&address=${addr}` +\n `&startblock=${startBlock}&endblock=${endBlock}` +\n `&page=${page}&offset=${offset}&sort=asc&apikey=${API_KEY}`;\n\n const data = await fetchJSON(url);\n if (typeof data === \"string\") return data;\n\n data.forEach(tx =>\n out.push({\n chain,\n address: addr,\n name: ADDRESS_MAP[addr],\n ...tx,\n }),\n );\n }\n continue;\n }\n\n return ERROR_MESSAGES_FLAG.INVALID_CATEGORY;\n }\n\n return out;\n\n async function fetchJSON(url) {\n try {\n const res = await fetch(url);\n if (!res.ok) return `HTTP_${res.status}`;\n\n const json = await res.json();\n\n if (json.result?.includes?.(\"Invalid API Key\"))\n return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.INVALID_API_KEY}`;\n\n if (json.result?.includes?.(\"Max rate limit reached\"))\n return `${SERVICE_API_KEY.Etherscan}${ERROR_MESSAGES_FLAG.RATE_LIMIT}`;\n\n if (json.status === \"0\" && json.message !== \"No transactions found\")\n return ERROR_MESSAGES_FLAG.DEFAULT;\n\n return json.result;\n } catch {\n return ERROR_MESSAGES_FLAG.DEFAULT;\n }\n }\n}\n\nexport async function FLVURL(token, vs_currencies) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve([{ \"Yoo\": \"gotcha\" }]);\n }, 10000);\n });\n}\n\nexport async function SAFE(address, utility, chain, limit, offset) {\n\n if (typeof limit !== 'number' || limit < 0) return 'INVALID_LIMIT';\n if (typeof offset !== 'number' || offset < 0) return 'INVALID_OFFSET';\n if (utility !== 'txns') return 'UTILITY IS NOT SUPPORTED';\n\n const apiKey = window.localStorage.getItem(SERVICE_API_KEY.Safe);\n const chainIdentifier = SAFE_CHAIN_MAP[chain];\n\n if (!apiKey) return `${SERVICE_API_KEY.Safe}_MISSING`;\n if (!chainIdentifier) return 'CHAIN IS NOT SUPPORTED';\n\n if(!isAddress(address)){\n address = await fromEnsNameToAddress(address)\n }\n\n if(!address){\n return `${address}${ERROR_MESSAGES_FLAG.INVALID_PARAM}`\n }\n\n const url = `https://api.safe.global/tx-service/${chainIdentifier}/api/v2/safes/${address}/multisig-transactions?limit=${limit}&offset=${offset}`;\n try {\n const response = await fetch(url,\n {\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n },\n }\n );\n if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`);\n const json = await response.json();\n if (!Array.isArray(json.results)) {\n return \"INVALID API RESPONSE\";\n }\n // remove nested structure from the response\n return json.results.map(({ confirmations, dataDecoded, ...rest }) => rest);\n } catch (e) {\n console.log(e);\n return \"ERROR IN FETCHING\";\n }\n}","import * as errors from './utils/error.js'\nimport * as date from './utils/date.js'\nimport * as symbols from './utils/symbol.js'\n\nexport * from './compatibility.js'\nexport * from './database.js'\nexport * from './date-time.js'\nexport * from './engineering.js'\nexport * from './financial.js'\nexport * from './information.js'\nexport * from './logical.js'\nexport * from './lookup-reference.js'\nexport * from './math-trig.js'\nexport * from './statistical.js'\nexport * from './text.js'\nexport * from \"./crypto.js\"\n\nexport const utils = { errors, symbols, date }\n","import * as error from './utils/error.js'\nimport * as information from './information.js'\nimport * as utils from './utils/common.js'\n\n/**\n * Returns TRUE if all of its arguments are TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function AND() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = true\n }\n\n if (!args[i]) {\n result = false\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value FALSE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function FALSE() {\n return false\n}\n\n/**\n * Specifies a logical test to perform.\n *\n * Category: Logical\n *\n * @param {*} logical_test\n * @param {*} value_if_true\n * @param {*} value_if_false\n *\n * @returns\n */\nexport function IF(logical_test, value_if_true, value_if_false) {\n if (logical_test instanceof Error) {\n return logical_test\n }\n\n value_if_true = arguments.length >= 2 ? value_if_true : true\n\n if (value_if_true === undefined || value_if_true === null) {\n value_if_true = 0\n }\n\n value_if_false = arguments.length === 3 ? value_if_false : false\n\n if (value_if_false === undefined || value_if_false === null) {\n value_if_false = 0\n }\n\n return logical_test ? value_if_true : value_if_false\n}\n\n/**\n * Checks whether one or more conditions are met and returns a value that corresponds to the first TRUE condition.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function IFS() {\n for (let i = 0; i < arguments.length / 2; i++) {\n if (arguments[i * 2]) {\n return arguments[i * 2 + 1]\n }\n }\n\n return error.na\n}\n\n/**\n * Returns a value you specify if a formula evaluates to an error; otherwise, returns the result of the formula.\n *\n * Category: Logical\n *\n * @param {*} value The argument that is checked for an error.\n * @param {*} value_if_error The value to return if the formula evaluates to an error. The following error types are evaluated: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, or #NULL!.\n * @returns\n */\nexport function IFERROR(value, value_if_error) {\n if (information.ISERROR(value)) {\n return value_if_error\n }\n\n return value\n}\n\n/**\n * Returns the value you specify if the expression resolves to #N/A, otherwise returns the result of the expression.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function IFNA(value, value_if_na) {\n return value === error.na ? value_if_na : value\n}\n\n/**\n * Reverses the logic of its argument.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function NOT(logical) {\n if (typeof logical === 'string') {\n return error.value\n }\n\n if (logical instanceof Error) {\n return logical\n }\n\n return !logical\n}\n\n/**\n * Returns TRUE if any argument is TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function OR() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = false\n }\n\n if (args[i]) {\n result = true\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function TRUE() {\n return true\n}\n\n/**\n * Returns a logical exclusive OR of all arguments.\n *\n * Category: Logical\n *\n * @param {*} args logical1, logical2,… Logical 1 is required, subsequent logical values are optional. 1 to 254 conditions you want to test that can be either TRUE or FALSE, and can be logical values, arrays, or references.\n * @returns\n */\nexport function XOR() {\n const args = utils.flatten(arguments)\n let result = error.value\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === error.value) {\n result = 0\n }\n\n if (args[i]) {\n result++\n }\n }\n\n if (result === error.value) {\n return result\n }\n\n return !!(Math.floor(Math.abs(result)) & 1)\n}\n\n/**\n * Evaluates an expression against a list of values and returns the result corresponding to the first matching value. If there is no match, an optional default value may be returned.\n *\n * Category: Logical\n *\n * @returns\n */\nexport function SWITCH() {\n let result\n\n if (arguments.length > 0) {\n const targetValue = arguments[0]\n const argc = arguments.length - 1\n const switchCount = Math.floor(argc / 2)\n let switchSatisfied = false\n const hasDefaultClause = argc % 2 !== 0\n const defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1]\n\n if (switchCount) {\n for (let index = 0; index < switchCount; index++) {\n if (targetValue === arguments[index * 2 + 1]) {\n result = arguments[index * 2 + 2]\n switchSatisfied = true\n break\n }\n }\n }\n\n if (!switchSatisfied) {\n result = hasDefaultClause ? defaultClause : error.na\n }\n } else {\n result = error.value\n }\n\n return result\n}\n"],"names":["nil","Error","div0","value","ref","name","num","na","error","data","returnSerial","d1900","Date","UTC","serialToDate","serial","utc_days","Math","floor","date_info","fractional_day","total_seconds","seconds","hours","minutes","days","getUTCDate","month","getUTCMonth","getUTCFullYear","dateToSerial","date","addOn","ceil","formatDate","day","String","getDate","padStart","getMonth","year","getFullYear","concat","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","createToken","type","indexOf","analyzeTokens","tokens","literalValue","analyzedTokens","i","length","token","push","test","parseInt","parseFloat","castValueToCorrectType","unshift","parse","expression","expressionLength","cursorIndex","processedValue","processedSymbol","char","charAt","tokenizeExpression","compute","operator","values","result","evaluate","argsToArray","args","arrayEach","array","iteratee","index","arrayValuesToNumbers","arr","el","n","number","parseNumber","fillMatrix","matrix","fill_value","error.value","every","Array","isArray","_toConsumableArray","map","a","j","longestArrayIndex","reduce","acc","longestArrayLength","fill","flatten","arguments","argument","apply","from","isFlat","flattenShallow","b","aIsArray","bIsArray","rest","idx","slice","transpose","col","row","findField","database","title","anyError","anyIsError","cleanFloat","power","round","numbers","filter","parseBool","bool","up","toUpperCase","isNaN","parseDate","d","error.num","match","exec","_match$map2","_slicedToArray","Number","_date$split$map2","split","h","m","_date$split$map2$","s","now","setHours","ampmMatch","_ampmMatch","hour","minute","meridian","parsed","parseDateArray","len","string","parseNumberArray","parseString","toString","anyIsString","applyCriteria","range","shift","criterias","criteriaLength","isMetCondition","valueToTest","criteria","computedResult","tokenizedCriteria","evalExpression.parse","evalExpression.createToken","evalExpression.TOKEN_TYPE_LITERAL","evalExpression.compute","isDefined","arg","ERROR","ISERR","error.ref","error.div0","error.name","error.nil","isFinite","ISERROR","error.na","ISLOGICAL","ISNUMBER","ISTEXT","TYPE","error_val","error.data","module","exports","jStat","undefined","prototype","Object","calcRdx","val","pow","log","LOG10E","call","isFunction","isNumber","toVector","_init","retZero","retOne","retIdent","fn","this","seq","toArray","constructor","utils","_random_fn","random","setRandom","TypeError","extend","obj","rows","cols","dimensions","rowa","submat","arange","forEach","ind","column","cola","diag","nrow","res","antidiag","objArr","func","toAlter","ncol","cumreduce","alter","create","zeros","ones","rand","identity","symmetric","size","clear","min","max","cnt","hival","step","current","start","end","rl","_slice","list","copy","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","t","jProto","sort","splice","funcs","passfunc","results","self","setTimeout","ascNum","clip","sum","sumsqrd","sumsqerr","tmp","mean","sumrow","product","prod","low","high","unique","hash","_arr","meansqerr","geomean","logs","meanOfLogs","exp","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","count","mode","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","samples","deviation","dev","stdev","sqrt","pooledstdev","meandev","abs","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","p","aleph","k","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","frac","percentileOfScore","score","kind","counter","strict","histogram","binCnt","first","binWidth","bins","covariance","arr1","arr2","u","v","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","x","xx","y","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","z","yi","q","fact","xden","xnum","Infinity","sin","gammap","lowRegGamma","an","aln","ap","del","c","ITMAX","NaN","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","a1","EPS","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","a2","oalph","betinc","eps","c9","a0","b0","m9","laplaceSign","tukeyWprob","rr","cc","nleg","ihalf","C1","C2","C3","bb","wlar","wincr1","wincr2","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","tukeyQinv","p0","q0","p1","q1","p2","q2","p3","q3","p4","q4","c1","c2","c4","c5","vmax","ps","f","_a","_b","_c","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","lognormal","noncentralt","ncp","tol","studentt","min_iterations","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","negbin","r","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","l","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","cos","laplace","tukey","nmeans","df","nlegq","ihalfq","eps1","eps2","dhaf","dquar","deigh","dlarg","ulen1","ulen2","ulen3","ulen4","xlegq","alegq","ulen","f2","f2lf","f21","ff4","ans","otsum","twa1","t1","maxiter","x1","valx0","valx1","iter","isUsable","add","subtract","divide","multiply","nrescols","rescols","outer","dot","left","right","norm","nnorm","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","sign","gauss_elimination","maug","pivot","temp","y2","maxrow","triaUpSolve","parts","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","qr2","lstsq","R_I","I","Aj","cAi","Ij","cIi","qr_solve","array_mode","Q","attrs","Q1","RI","Q2","jacobi","maxim","theta","condition","e","ev","rungekutta","t_j","u_j","order","k1","k2","k3","romberg","h1","g","richardson","X","pos","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","D","temp2","Y","Bt","C","Vt","differenceOfProportions","n1","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","sub_regress","exog","var_count","endog_index","exog_index","ols","endog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","model","subModelList","sigmaHat","seBetaHat","mod","tStatistic","pValue","leftppf","interval95","se","F_test","F_statistic","ols_wrap","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","inner","matrixsubtract","factory","UNIQUE","hasElement","element","VLOOKUP","lookup_value","table_array","col_index_num","range_lookup","exactMatchOnly","isNumberLookup","lookupValue","toLowerCase","rowValue","localeCompare","CHAR","utils.parseNumber","fromCharCode","CODE","text","utils.anyIsError","charCodeAt","CONCATENATE","utils.flatten","someError","utils.anyError","trueFound","falseFound","join","CONCAT","FIXED","decimals","no_commas","toFixed","replace","REPT","number_times","utils.parseString","UNICHAR","UNICODE","AVERAGE","flatArgumentsDefined","utils.isDefined","utils.numbers","AVERAGEA","BETA","cumulative","probability","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","mathTrig.COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","xsqr","Pi","ChiSq","CONFIDENCE","COUNT","COUNTA","flatArguments","COUNTBLANK","blanks","NORM","standard_dev","COVARIANCE","P","array1","array2","utils.parseNumberArray","S","EXPON","lambda","FORECAST","known_ys","known_xs","xmean","ymean","den","GAMMA","GAMMALN","deg_freedom1","deg_freedom2","sumOfSquares","mathTrig.SUM","PRECISE","HYPGEOM","LARGE","LINEST","known_y","known_x","sample_s","number_sample","population_s","number_pop","M","LOGNORM","MAX","MEDIAN","utils.arrayValuesToNumbers","MIN","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","fl","utils.cleanFloat","PERCENTRANK","EXC","significance","uniques","lookup.UNIQUE","INC","POISSON","QUARTILE","quart","RANK","SKEW","SMALL","AVG","EQ","m3","STDEV","VAR","mean_x","mean_y","s_x","s_y","VARA","VARPA","WEIBULL","Z","CEILING","COMBIN","number_chosen","FACT","MATH","MEMOIZED_FACT","FLOOR","ISO","POWER","PRODUCT","ROUND","num_digits","SUM","utils.arrayEach","utils.argsToArray","inner_result","num1","num2","dividend","divisor","value1","value2","utils.anyIsString","factor1","factor2","base","exponent","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","utils.parseDate","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","startOfDay","newDate","getTime","DAYS360","method","utils.parseBool","ed","sm","em","smd","emd","ISOWEEKNUM","setDate","getDay","yearStart","NETWORKDAYS","holidays","INTL","weekend","isMask","maskDays","maskIndex","maskRegex","RegExp","total","getTimezoneOffset","getUTCDay","dec","includes","holiday","NETWORKDAYS_INTL","WORKDAY","WORKDAY_INTL","isLeapYear","daysBetween","basis","sy","ey","ylength","date1","date2","year1","mar1year1","year2","mar1year2","feb29Between","years","average","BESSEL","version","_horner","_bessel_iter","f0","f1","tdx","o","_bessel_wrap","bessel0","bessel1","nonzero","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","besselj","reverse","ret","jsum","bjp","bj","bjm","tox","bessely","besseli","bip","bi","bim","besselk","DO_NOT_EXPORT_BESSEL","isValidBinaryNumber","COMPLEX","real_num","i_num","suffix","ERF","lower_limit","upper_limit","ERFC","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","substring","IMARGUMENT","IMCOS","IMCOSH","IMDIV","inumber1","inumber2","unit1","unit2","IMSIN","IMSINH","BETADIST","statistical.BETA","BETAINV","BINOMDIST","statistical.BINOM","CEILINGMATH","mathTrig.CEILING","CEILINGPRECISE","CHIDIST","statistical.CHISQ","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","statistical.COVARIANCE","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","engineering.ERFC","ERFPRECISE","engineering.ERF","EXPONDIST","statistical.EXPON","FDIST","statistical.F","FDISTRT","FINV","FINVRT","FLOORMATH","mathTrig.FLOOR","FLOORPRECISE","FTEST","GAMMADIST","statistical.GAMMA","GAMMAINV","GAMMALNPRECISE","statistical.GAMMALN","HYPGEOMDIST","statistical.HYPGEOM","LOGINV","statistical.LOGNORM","LOGNORMDIST","LOGNORMINV","MODEMULT","statistical.MODE","MODESNGL","SNGL","NEGBINOMDIST","statistical.NEGBINOM","NETWORKDAYSINTL","dateTime.NETWORKDAYS","NORMDIST","statistical.NORM","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","statistical.PERCENTILE","PERCENTILEINC","PERCENTRANKEXC","statistical.PERCENTRANK","PERCENTRANKINC","POISSONDIST","statistical.POISSON","QUARTILEEXC","statistical.QUARTILE","QUARTILEINC","RANKAVG","statistical.RANK","RANKEQ","SKEWP","statistical.SKEW","STDEVP","statistical.STDEV","STDEVS","TDIST","statistical.T","TDISTRT","TINV","TTEST","VARP","statistical.VAR","VARS","WEIBULLDIST","statistical.WEIBULL","WORKDAYINTL","dateTime.WORKDAY","ZTEST","statistical.Z","compact","findResultIndex","matches","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","validDate","ensureDate","validateFrequency","frequency","validateBasis","FV","nper","payment","term","IPMT","per","pv","fv","PMT","NPV","CHAIN_ID_MAP","ethereum","gnosis","BLOCKSCOUT_CHAINS_MAP","arbitrum","optimism","soneium","unichain","SAFE_CHAIN_MAP","ERROR_MESSAGES_FLAG","INVALID_API_KEY","RATE_LIMIT","DEFAULT","MISSING_KEY","INVALID_CHAIN","INVALID_TYPE","INVALID_ADDRESS","INVALID_PARAM","UTILITY","SERVICE_API_KEY","Etherscan","Coingecko","Safe","Basescan","Gnosisscan","Firefly","GnosisPay","fromTimeStampToBlock","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","timestamp","chain","apiKey","chainId","url","json","wrap","_callee$","_context","prev","abrupt","fetch","sent","stop","_x","_x2","_x3","toTimestamp","dateStr","_dateStr$split$map2","isAddress","input","fromEnsNameToAddress","_x4","_fromEnsNameToAddress","_callee2","ALCHEMY_KEY","provider","resolved","_context2","ethers","Promise","resolve","reject","script","document","createElement","src","onload","onerror","head","appendChild","window","localStorage","getItem","console","AlchemyProvider","resolveName","t0","message","handleScanRequest","_x5","_handleScanRequest","_callee3","_ref2","scanKey","baseUrl","address","startDate","endDate","_ref2$page","page","_ref2$offset","offset","API_KEY","action","_yield$Promise$all","_yield$Promise$all2","startBlock","endBlock","_context3","gas","all","ok","status","_FIREFLY","_callee4","platform","contentType","identifier","_typeMap$platform","headers","platformType","query","_args4","_callee4$","_context4","farcaster","posts","replies","channels","lens","trim","Boolean","URL","searchParams","set","item","flat","_i10","_Object$entries","entries","_Object$entries$_i","key","_typeof","_BLOCKSCOUT","_callee5","startTimestamp","endTimestamp","currentTimestamp","hostname","requestUrl","_json$result","_json$result2","response","_callee5$","_context5","_BASESCAN","_callee6","_len2","_key2","limit","_args6","_context6","_GNOSISSCAN","_callee7","_len3","_key3","_args7","_context7","_NEYNAR","_callee8","fid","viewerFid","sortType","cursor","_json$users","_callee8$","_context8","Neynar","users","_ref4","_user$profile","_user$profile2","user","username","custody_address","follower_count","country","profile","location","city","_GNOSISPAY","_callee9","_ref3","cardId","_ref3$limit","_ref3$offset","apiKeyKey","_context9","toISOString","Authorization","tx","createdAt","clearedAt","merchant","billingAmount","billingCurrency","transactionAmount","transactionCurrency","transactionType","mcc","_ETHERSCAN","_callee0","_len4","_key4","_args0","_callee0$","_context0","_COINGECKO","_callee1","category","param1","param2","perPage","lowerCategory","vsCurrencies","ecosystemMap","categoryVal","trend","_category","_trend","exchange","_json$status","output","_i11","_Object$entries2","_Object$entries2$_i","_token","prices","_i12","_Object$entries3","_Object$entries3$_i","currency","_value6","_key5","flatArray","_args1","_context1","accept","eth","sol","hyperliquid","bitcoin","pump","aiagents","meme","INVALID_PARAMS","error_message","_i13","_Object$entries4","_Object$entries4$_i","_EOA","_callee11","addresses","chains","startTime","endTime","INPUTS","CHAINS","out","ADDRESS_MAP","_iterator","_step","ADDRS","_iterator2","_step2","_loop","_ret","fetchJSON","_fetchJSON","_args13","_callee11$","_context13","_fetchJSON3","_callee10","_json$result3","_json$result3$include","_json$result4","_json$result4$include","_callee10$","_context12","_fetchJSON2","_x35","_createForOfIteratorHelper","done","finish","keys","_data","_loop2","_ret2","_i14","_ADDRS","_loop$","_context11","UNSUPPORTED_CHAIN","_objectSpread","account","addr","_context10","delegateYield","INVALID_CATEGORY","t2","t3","_FLVURL","_callee12","vs_currencies","_context14","Yoo","_SAFE","_callee13","utility","chainIdentifier","_context15","_ref5","confirmations","dataDecoded","_objectWithoutProperties","_excluded","errors","symbols","issue","first_interest","settlement","par","dateTime.YEARFRAC","function_num","options","ref1","ref2","statistical.AVERAGE","statistical.COUNT","statistical.COUNTA","statistical.MAX","statistical.MIN","statistical.MEDIAN","statistical.LARGE","statistical.SMALL","CM","CD","XC","XL","IX","IV","x_num","y_num","atan2","average_range","average_count","isWildcard","utils.applyCriteria","radix","min_length","bessel","stringified","places","text.REPT","number1","number2","shift_amount","_x9","_x0","_x1","_x10","_x11","_x12","_x13","_x20","_x21","_x22","reference","from_unit","to_unit","alt","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","E","G","to","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","e2","maturity","lastCoupDateBeforeSettlement","nextDate","dateTime.DATEDIF","numOfDays","start_period","end_period","interest","principal","date_text","dateValue","field","resultIndexes","targetFields","utils.findField","utils.rest","serial_number","cost","salvage","life","period","initial","ceiling","targetValues","stats.COUNT","stats.COUNTA","pr","redemption","basisVal","dateTime.DAYS360","maxValue","minValue","style","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","fractional_dollar","fraction","LN10","LN2","decimal_dollar","stats.STDEV","maths.SUM","stats.VAR","months","storedDay","targetMonth","daysInTargetMonth","targetYear","nominal_rate","npery","_x23","_x24","_x25","_x26","_x27","eoMonth","text1","text2","error.error","FACTDOUBLE","find_text","within_text","start_num","found_index","_x6","_x7","_x8","e2y","_x28","_x29","data_array","bins_array","schedule","future","r0","ri","_x19","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","negative","decimal","row_index_num","utils.transpose","getHours","logical_test","value_if_true","value_if_false","value_if_error","information.ISERROR","value_if_na","row_num","column_num","isOneDimensionRange","guess","cashFlows","Float64Array","positive","npvCache","Map","cachedNpv","roundedRate","has","get","npv","epsMax","prevRate","iteration","currentNpv","delta","derivNpv","newtonStep","maxStep","npvAtRate","npvC","combinedMethod","pop","num_chars","result_array","lookup_array","match_type","indexValue","lookupValueStr","begin","getMinutes","finance_rate","reinvest_rate","payments","incomes","some","utils.flattenShallow","_","modulus","multiple","dimension","_x14","_x15","_x16","_x17","_x18","effect_rate","logical","pmt","decimal_separator","group_separator","mathTrig.FACT","_argsToArray2","toNumberOrThrow","maxLen","maxRows","rowA","rowB","maxCols","maxX","matA","matB","maxY","maxZ","discount","x_range","prob_range","sorted","txt","substr","numerator","denominator","bottom","top","dy","old_text","new_text","digits","roman","_x30","_x31","_x32","_x33","_x34","foundAt","getSeconds","coefficients","sort_index","sort_order","by_col","sortArray","utils.fillMatrix","lft","instance_num","sum_range","sumValue","_i","_ij","_ij_arg","_i_arg","information.ISNUMBER","array_x","array_y","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","format_text","currencySymbol","startsWith","isPercent","endsWith","delimiter","ignore_empty","_len","_key","flatArgs","textToJoin","chunks","second","hh","mm","ss","time_text","new_xs","linest","percent","return_type","week_start","jan","inc","dates","utils.parseDateArray","irrResult","dateTime.DAYS","irrResultDeriv","newRate","epsRate","resultValue","resultRate","contLoop"],"mappings":"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","x_google_ignoreList":[5,12]}