llll-sdk 0.0.0-experimental-20260116141615 → 0.0.0-experimental-20260116143323
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/marketModules.ts","../src/utils/index.ts","../src/errors/errors.ts","../src/modules/permissionModules.ts","../src/modules/positionModules.ts","../../../node_modules/.pnpm/bignumber.js@9.3.1/node_modules/bignumber.js/bignumber.mjs","../../../node_modules/.pnpm/decimal.js@10.6.0/node_modules/decimal.js/decimal.mjs","../src/modules/suilendModule.ts","../src/utils/suiLend.ts","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/v4.js","../src/modules/swapModules.ts","../src/index.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","// External dependencies - Sui related\nimport { SuiClient } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js'\n\n// External dependencies - Cetus related\nimport type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk'\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk'\n\n// Internal modules\nimport { margin_trading_mainnet } from './config/mainnet'\nimport { MarketModules } from './modules/marketModules'\nimport { PermissionModules } from './modules/permissionModules'\nimport { PositionModules } from './modules/positionModules'\nimport { SuiLendModule } from './modules/suilendModule'\nimport { SwapModules } from './modules/swapModules'\nimport { MarginTradingConfigs, SuiLendConfigs } from './types'\n\nexport interface SdkOptions extends BaseSdkOptions {\n full_rpc_url: string\n env: 'mainnet' | 'testnet'\n aggregator_url: string\n margin_trading: Package<MarginTradingConfigs>\n suilend: Package<SuiLendConfigs>\n}\n\nexport class CetusMarginTradingSDK extends SdkWrapper<SdkOptions> {\n // Modules\n protected _marketModules: MarketModules\n protected _permissionModules: PermissionModules\n protected _positionModules: PositionModules\n protected _suilendModule: SuiLendModule\n protected _swapModules: SwapModules\n\n // Clients and utilities\n protected _aggregatorClient: AggregatorClient\n protected _clmmSDK: CetusClmmSDK\n protected _pythConnection: SuiPriceServiceConnection\n\n // Public properties\n senderAddress: string | undefined\n\n constructor(options: SdkOptions, clmmSDK?: CetusClmmSDK) {\n super(options)\n\n // Initialize modules\n this._suilendModule = new SuiLendModule(this)\n this._permissionModules = new PermissionModules(this)\n this._marketModules = new MarketModules(this)\n this._positionModules = new PositionModules(this)\n this._swapModules = new SwapModules(this)\n\n // Initialize clients\n this._aggregatorClient = new AggregatorClient({\n signer: normalizeSuiAddress('0x0'),\n client: options.sui_client || new SuiClient({ url: options.full_rpc_url! }),\n env: options.env === 'testnet' ? Env.Testnet : Env.Mainnet,\n })\n\n this._clmmSDK = clmmSDK || CetusClmmSDK.createSDK({ env: options.env, full_rpc_url: options.full_rpc_url })\n\n this._pythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 30 * 1000,\n })\n }\n\n // Module getters\n get SuiLendModule(): SuiLendModule {\n return this._suilendModule\n }\n\n get PermissionModules(): PermissionModules {\n return this._permissionModules\n }\n\n get MarketModules(): MarketModules {\n return this._marketModules\n }\n\n get PositionModules(): PositionModules {\n return this._positionModules\n }\n\n get SwapModules(): SwapModules {\n return this._swapModules\n }\n\n // Client getters\n get AggregatorClient(): AggregatorClient {\n return this._aggregatorClient\n }\n\n get ClmmSDK(): CetusClmmSDK {\n return this._clmmSDK\n }\n\n get PythConnection(): SuiPriceServiceConnection {\n return this._pythConnection\n }\n\n // Static factory methods\n static createSDK(options: BaseSdkOptions): CetusMarginTradingSDK {\n return CetusMarginTradingSDK.createCustomSDK({ ...margin_trading_mainnet, ...options })\n }\n\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusMarginTradingSDK {\n return new CetusMarginTradingSDK(options)\n }\n}\n","import { DefaultProviders, FullRpcUrlMainnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '..'\n\nexport const margin_trading_mainnet: SdkOptions = {\n full_rpc_url: FullRpcUrlMainnet,\n env: 'mainnet',\n aggregator_url: 'https://api-sui.cetus.zone/router_v3',\n margin_trading: {\n package_id: '0xa079129c989dacac4f5ccb7b2bb2b8f233b13694c465466a344e2e095e987407',\n published_at: '0xa079129c989dacac4f5ccb7b2bb2b8f233b13694c465466a344e2e095e987407',\n version: 0,\n config: {\n versioned_id: '0x85d30849a1e172e1f90bb42e22ed87457a8110dad7658d51c806baa84f5dcd94',\n admin_cap_id: '0xdae1da9a2bacb4738411365e9719b739b655ce6b737155ff58137b78c944112a',\n global_config_id: '0x267de967e72360eb09837bb595a0c6b54bb98a2a1ae47436ccab4a99e6b84f25',\n markets: '0xe0986f697a300da740d384e64c2ba010aa9caf37a54ed0cc8b4098c4d4e592d0',\n markets_table_id: '0xe9dd2dbc3d68c00f297dd84e57ad28f6a504effbf6b1b869b9e4138ead14c731',\n },\n },\n suilend: {\n package_id: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf',\n published_at: '0xe37cc7bb50fd9b6dbd3873df66fa2c554e973697f50ef97707311dc78bd08444',\n config: {\n lending_market: [\n {\n name: 'Main market',\n slug: 'main',\n id: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n type: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n owner_cap_id: '0xf7a4defe0b6566b6a2674a02a0c61c9f99bd012eed21bc741a069eaa82d35927',\n },\n {\n name: 'STEAMM LM',\n slug: 'steamm-lm',\n id: '0xc1888ec1b81a414e427a44829310508352aec38252ee0daa9f8b181b6947de9f',\n type: '0x0a071f4976abae1a7f722199cf0bfcbe695ef9408a878e7d12a7ca87b7e582a6::lp_rewards::LP_REWARDS',\n owner_cap_id: '0x55a0f33b24e091830302726c8cfbff8cf8abd2ec1f83a4e6f4bf51c7ba3ad5ab',\n is_hidden: true, // Only visible in the admin panel\n },\n ],\n lending_market_id: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n lending_market_type: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n api_url: 'https://d10td5ybgrf39v.cloudfront.net',\n },\n },\n}\n","import { CACHE_TIME_5MIN, d, getPackagerConfigs } from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport {\n CreateMarketParams,\n MarginTradingConfigs,\n Market,\n MarketSuilendInfo,\n UpdateMarketFeeRateParams,\n UpdateMarketMaxLeverageParams,\n} from '../types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { wrapMarketInfo } from '../utils'\nimport { getFilteredRewards, getStakingYieldAprPercent, getTotalAprPercent, Side } from '@suilend/sdk'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class MarketModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n createMarket = async (params: CreateMarketParams) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id, markets, global_config_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const tx = new Transaction()\n tx.moveCall({\n target: `${package_id}::market::create_market`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.object(markets),\n tx.pure.u64(params.open_fee_rate),\n tx.pure.u64(params.close_fee_rate),\n tx.object(versioned_id),\n ],\n typeArguments: [params.base_token, params.quote_token],\n })\n return tx\n }\n\n updateMarketFeeRate = async (params: UpdateMarketFeeRateParams) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { market_id, open_fee_rate, close_fee_rate } = params\n const tx = new Transaction()\n tx.moveCall({\n target: `${package_id}::market::set_fee_rate`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(market_id),\n tx.pure.u64(open_fee_rate),\n tx.pure.u64(close_fee_rate),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n claimMarketFees = async (market_id: string, txb?: Transaction) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const tx = txb || new Transaction()\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n tx.moveCall({\n target: `${package_id}::market::claim_fees`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.object(versioned_id)],\n typeArguments: [base_token, quote_token],\n })\n return tx\n }\n\n claimAllMarketFees = async (market_ids: string[]) => {\n const tx = new Transaction()\n for (let i = 0; i < market_ids.length; i++) {\n const market_id = market_ids[i]\n this.claimMarketFees(market_id, tx)\n }\n return tx\n }\n\n /**\n * Get margin trading contract config information\n */\n getMarginTradingConfig = async (): Promise<MarginTradingConfigs> => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n try {\n const initVersionedEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::versioned::InitEvent` })\n const initAdminCapEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::admin_cap::InitEvent` })\n const initGlobalConfigEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::config::InitEvent` })\n const initMarketEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::market::InitEvent` })\n const markets = initMarketEvent.data[0].parsedJson.markets_id\n const marketsObject: any = await this._sdk.FullClient.getObject({ id: markets, options: { showContent: true } })\n const marketsTableId = marketsObject.data.content.fields.list.fields.id.id\n return {\n versioned_id: initVersionedEvent.data[0].parsedJson.versioned_id,\n admin_cap_id: initAdminCapEvent.data[0].parsedJson.admin_cap_id,\n global_config_id: initGlobalConfigEvent.data[0].parsedJson.global_config_id,\n markets,\n markets_table_id: marketsTableId,\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {\n versioned_id: '',\n admin_cap_id: '',\n global_config_id: '',\n markets_table_id: '',\n markets: '',\n }\n }\n }\n\n /**\n * Get margin trading market list\n */\n getMarketList = async (force_refresh = false): Promise<Market[]> => {\n const cacheKey = 'margin_trading_markets_list'\n\n // Try to get data from cache\n const cachedData = this._sdk.getCache<any[]>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const marketList: Market[] = []\n try {\n const moveEventType = `${package_id}::market::CreateMarketEvent`\n const objects = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType })\n const warpIds = objects.data.map((object) => (object.parsedJson as any).market_id)\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true, showType: true })\n res.forEach((item) => {\n const marketInfo = wrapMarketInfo(item)\n const cacheKey = `margin_trading_market_info_${marketInfo.market_id}`\n this._sdk.updateCache(cacheKey, marketInfo)\n marketList.push(marketInfo)\n })\n return marketList\n } else {\n handleError(MarginTradingErrorCode.MarketNotFound, 'Market not found')\n return []\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return []\n }\n }\n\n /**\n * Get margin trading market information\n */\n getMarketInfo = async (market_id: string, force_refresh = false): Promise<Market> => {\n const cacheKey = `margin_trading_market_info_${market_id}`\n const cachedData = this._sdk.getCache<any>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n try {\n const result = await this._sdk.FullClient.getObject({\n id: market_id,\n options: {\n showContent: true,\n },\n })\n const marketInfo = wrapMarketInfo(result)\n this._sdk.updateCache(cacheKey, marketInfo, CACHE_TIME_5MIN)\n return marketInfo\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {} as Market\n }\n }\n\n /** Get margin trading market Suilend information */\n getMarketSuilendInfo = async (market_id: string): Promise<MarketSuilendInfo> => {\n try {\n const { base_token, quote_token } = await this.getMarketInfo(market_id)\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData(true)\n const { base_reserve_map_info, quote_reserve_map_info } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n allLendingMarketData\n )\n console.log('🚀🚀🚀 ~ marketModules.ts:188 ~ MarketModules ~ base_reserve_map_info:', base_reserve_map_info)\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n\n const baseRewards = obligations[lending_market_id].rewardMap[base_token]\n const quoteRewards = obligations[lending_market_id].rewardMap[quote_token]\n\n const {\n depositedAmountUsd: baseDepositedAmountUsd,\n borrowedAmountUsd: baseBorrowedAmountUsd,\n depositAprPercent: baseDepositAprPercent,\n borrowAprPercent: baseBorrowAprPercent,\n depositedAmount: baseDepositedAmount,\n borrowedAmount: baseBorrowedAmount,\n } = base_reserve_map_info\n const { depositLimit: baseDepositLimit, borrowLimit: baseBorrowLimit } = base_reserve_map_info.config\n const {\n depositedAmountUsd: quoteDepositedAmountUsd,\n borrowedAmountUsd: quoteBorrowedAmountUsd,\n depositAprPercent: quoteDepositAprPercent,\n borrowAprPercent: quoteBorrowAprPercent,\n depositedAmount: quoteDepositedAmount,\n borrowedAmount: quoteBorrowedAmount,\n } = quote_reserve_map_info\n const { depositLimit: quoteDepositLimit, borrowLimit: quoteBorrowLimit } = quote_reserve_map_info.config\n const baseTotalDepositAprPercent = getTotalAprPercent(\n Side.DEPOSIT,\n baseDepositAprPercent,\n getFilteredRewards(baseRewards.deposit),\n getStakingYieldAprPercent(Side.DEPOSIT, base_token, lstAprPercentMap)\n )\n const baseTotalBorrowAprPercent = getTotalAprPercent(Side.BORROW, baseBorrowAprPercent, getFilteredRewards(baseRewards.borrow))\n\n const quoteTotalDepositAprPercent = getTotalAprPercent(\n Side.DEPOSIT,\n quoteDepositAprPercent,\n getFilteredRewards(quoteRewards.deposit),\n getStakingYieldAprPercent(Side.DEPOSIT, base_token, lstAprPercentMap)\n )\n const quoteTotalBorrowAprPercent = getTotalAprPercent(Side.BORROW, quoteBorrowAprPercent, getFilteredRewards(quoteRewards.borrow))\n\n const longLiquidity = d(quoteDepositedAmountUsd.toString()).sub(quoteBorrowedAmountUsd.toString()).toString()\n const shortLiquidity = d(baseDepositedAmountUsd.toString()).sub(baseBorrowedAmountUsd.toString()).toString()\n\n const baseTokenAvailableDepositAmount = d(baseDepositLimit.toString()).sub(d(baseDepositedAmount.toString())).toString()\n const baseTokenAvailableBorrowAmount = d(baseBorrowLimit.toString()).sub(d(baseBorrowedAmount.toString())).toString()\n\n const quoteTokenAvailableDepositAmount = d(quoteDepositLimit.toString()).sub(d(quoteDepositedAmount.toString())).toString()\n const quoteTokenAvailableBorrowAmount = d(quoteBorrowLimit.toString()).sub(d(quoteBorrowedAmount.toString())).toString()\n\n return {\n long_liquidity: longLiquidity,\n short_liquidity: shortLiquidity,\n base_total_deposit_apr_percent: baseTotalDepositAprPercent.toString(),\n base_total_borrow_apr_percent: baseTotalBorrowAprPercent.toString(),\n quote_total_deposit_apr_percent: quoteTotalDepositAprPercent.toString(),\n quote_total_borrow_apr_percent: quoteTotalBorrowAprPercent.toString(),\n base_token_available_deposit_amount: baseTokenAvailableDepositAmount,\n base_token_available_borrow_amount: baseTokenAvailableBorrowAmount,\n quote_token_available_deposit_amount: quoteTokenAvailableDepositAmount,\n quote_token_available_borrow_amount: quoteTokenAvailableBorrowAmount,\n base_deposit_rewards: getFilteredRewards(baseRewards.deposit),\n quote_deposit_rewards: getFilteredRewards(quoteRewards.deposit),\n base_borrow_rewards: getFilteredRewards(baseRewards.borrow),\n quote_borrow_rewards: getFilteredRewards(quoteRewards.borrow),\n base_deposit_apr_percent: baseDepositAprPercent.toString(),\n base_borrow_apr_percent: baseBorrowAprPercent.toString(),\n quote_deposit_apr_percent: quoteDepositAprPercent.toString(),\n quote_borrow_apr_percent: quoteBorrowAprPercent.toString(),\n obligations: obligations[lending_market_id],\n base_reserve_map_info,\n quote_reserve_map_info,\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {} as MarketSuilendInfo\n }\n }\n}\n","import { addHexPrefix, d, getObjectFields } from '@cetusprotocol/common-sdk'\nimport { parseObligation } from '@suilend/sdk/parsers/obligation'\nimport { getNetAprPercent, getTotalAprPercent, Side, getFilteredRewards } from '@suilend/sdk'\n\nexport const wrapMarketInfo = (info: any) => {\n const fields = getObjectFields(info)\n const {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n } = wrapMarketPermissions(fields.permissions.toString(2))\n\n return {\n market_id: fields.id.id,\n base_token: addHexPrefix(fields.base_token.fields.name),\n quote_token: addHexPrefix(fields.quote_token.fields.name),\n max_long_leverage: d(fields.max_long_leverage)\n .div(10 ** 6)\n .toString(),\n max_short_leverage: d(fields.max_short_leverage)\n .div(10 ** 6)\n .toString(),\n open_fee_rate: d(fields.open_fee_rate)\n .div(10 ** 6)\n .toString(),\n close_fee_rate: d(fields.close_fee_rate)\n .div(10 ** 6)\n .toString(),\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n}\n\nexport const wrapPosition = (position: any, position_cap_id: string) => {\n const fields = getObjectFields(position)\n return {\n created_at: fields.created_ts,\n position_id: fields.id.id,\n init_deposit_amount: fields.init_deposit_amount,\n is_long: fields.is_long,\n lending_market_id: fields.lending_market_id,\n obligation_owner_cap: fields.obligation_owner_cap.fields.obligation_id,\n market_id: fields.market_id,\n position_cap_id,\n }\n}\n\nexport const mergePositionData = (position: any, obligation: any, reserve_map: any, lst_apr_percent_map: any, reward_map: any) => {\n const obligationData = parseObligation(obligation, reserve_map)\n const netAprPercent = getNetAprPercent(obligationData, reward_map, lst_apr_percent_map)\n\n // Safety check: ensure deposits array is not empty\n if (!obligationData.deposits || obligationData.deposits.length === 0) {\n throw new Error('No deposits found in obligation data')\n }\n\n const firstDeposit = obligationData.deposits[0]\n const closeLTV = d(firstDeposit.reserve.config.closeLtvPct).div(100).toString()\n const openLTV = d(firstDeposit.reserve.config.openLtvPct).div(100).toString()\n\n // Safety check: ensure depositedAmountUsd is not zero when calculating CR\n // Liquidation Threshold (LTV)\n const cr = obligationData.depositedAmountUsd.gt(0)\n ? obligationData.borrowedAmountUsd.div(obligationData.depositedAmountUsd).toString()\n : '0'\n\n const ltr = d(1).div(closeLTV).toString()\n const liquidationBuffer = d(closeLTV).sub(cr).toString()\n\n // Safety check: handle case where borrows array might be empty\n let totalBorrowAprPercent = '0'\n let totalSuppliedAPR = '0'\n let borrowedAmountUsd = '0'\n let borrowedAmount = '0'\n\n if (obligationData.borrows && obligationData.borrows.length > 0) {\n const firstBorrow = obligationData.borrows[0]\n const borrowRewards = reward_map[firstBorrow?.coinType]\n\n if (borrowRewards) {\n totalBorrowAprPercent = getTotalAprPercent(\n Side.BORROW,\n firstBorrow?.reserve.borrowAprPercent,\n getFilteredRewards(borrowRewards.borrow)\n ).toString()\n }\n\n borrowedAmountUsd = firstBorrow.borrowedAmountUsd.toString()\n borrowedAmount = firstBorrow.borrowedAmount.toString()\n }\n\n if (obligationData.deposits && obligationData.deposits.length > 0) {\n const firstDeposit = obligationData.deposits[0]\n const borrowRewards = reward_map[firstDeposit?.coinType]\n\n if (borrowRewards) {\n totalSuppliedAPR = getTotalAprPercent(\n Side.DEPOSIT,\n firstDeposit?.reserve.depositAprPercent,\n getFilteredRewards(borrowRewards.deposit)\n ).toString()\n }\n }\n\n return {\n ...position,\n ...obligationData,\n origin_obligation: obligation,\n net_apr_percent: netAprPercent.toString(),\n supplied_apr: d(totalSuppliedAPR).toString(),\n borrowed_apr: d(totalBorrowAprPercent).toString(),\n close_ltv: closeLTV,\n open_ltv: openLTV,\n cr,\n ltr,\n liquidation_buffer: liquidationBuffer,\n deposited_amount_usd: firstDeposit.depositedAmountUsd.toString(),\n borrowed_amount_usd: borrowedAmountUsd,\n deposited_amount: firstDeposit.depositedAmount.toString(),\n borrowed_amount: borrowedAmount,\n }\n}\n\nexport const wrapMarketPermissions = (permissions: string) => {\n const permissionsLength = permissions.length\n const open_permissions_pause = permissions.substring(permissionsLength - 1, permissionsLength) === '0'\n const close_permissions_pause = permissions.substring(permissionsLength - 2, permissionsLength - 1) === '0'\n const deposit_permissions_pause = permissions.substring(permissionsLength - 3, permissionsLength - 2) === '0'\n const borrow_permissions_pause = permissions.substring(permissionsLength - 4, permissionsLength - 3) === '0'\n const withdraw_permissions_pause = permissions.substring(permissionsLength - 5, permissionsLength - 4) === '0'\n const repay_permissions_pause = permissions.substring(permissionsLength - 6, permissionsLength - 5) === '0'\n return {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n}\n","import { BaseError } from \"@cetusprotocol/common-sdk\"\n\nexport enum MarginTradingErrorCode {\n MarketNotFound = 'MarketNotFound',\n FetchError = 'FetchError',\n PositionNotFound = 'PositionNotFound',\n FlashLoanPoolNotFound = 'FlashLoanPoolNotFound',\n PriceNotFound = 'PriceNotFound',\n}\n\n\nexport class MarginTradingError extends BaseError {\n constructor(message: string, error_code?: MarginTradingErrorCode, details?: Record<string, any>) {\n super(message, error_code || 'UnknownError', details)\n }\n\n static isCrossSwapErrorCode(e: any, code: MarginTradingErrorCode): boolean {\n return this.isErrorCode<MarginTradingError>(e, code)\n }\n}\n\nexport const handleError = (code: MarginTradingErrorCode, error: Error | string, details?: Record<string, any>) => {\n const errorDetails = {\n ...details,\n stack: error instanceof Error ? error.stack : undefined,\n }\n\n if (error instanceof Error) {\n throw new MarginTradingError(error.message, code, errorDetails)\n } else {\n throw new MarginTradingError(error, code, errorDetails)\n }\n}","import { CLOCK_ADDRESS, getPackagerConfigs } from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { wrapMarketPermissions } from '../utils'\n\nexport class PermissionModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n queryGlobalPermissions = async () => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id } = getPackagerConfigs(config)\n const globalConfig: any = await this._sdk.FullClient.getObject({\n id: global_config_id,\n options: { showContent: true },\n })\n if (globalConfig) {\n // u32Max\n const permissions = globalConfig.data.content.fields.permissions.toString(2)\n const {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n } = wrapMarketPermissions(permissions)\n return {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n }\n }\n\n updateGlobalPermissions = async (pause: boolean) => {\n const tx = new Transaction()\n this.updateGlobalOpenPositionPermissions(pause, tx)\n this.updateGlobalClosePositionPermissions(pause, tx)\n this.updateGlobalDepositPermissions(pause, tx)\n this.updateGlobalBorrowPermissions(pause, tx)\n this.updateGlobalWithdrawPermissions(pause, tx)\n this.updateGlobalRepayPermissions(pause, tx)\n return tx\n }\n\n updateGlobalOpenPositionPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_open_position_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalClosePositionPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_close_position_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalDepositPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_deposit_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalBorrowPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_borrow_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalWithdrawPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_withdraw_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalRepayPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_repay_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketCreatePositionPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_open_position_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketClosePositionPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_close_position_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketDepositPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_deposit_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketWithdrawPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_withdraw_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketBorrowPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_borrow_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketRepayPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_repay_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const tx = txb || new Transaction()\n this.updateMarketCreatePositionPermissions(market_id, pause, tx)\n this.updateMarketClosePositionPermissions(market_id, pause, tx)\n this.updateMarketDepositPermissions(market_id, pause, tx)\n this.updateMarketWithdrawPermissions(market_id, pause, tx)\n this.updateMarketBorrowPermissions(market_id, pause, tx)\n this.updateMarketRepayPermissions(market_id, pause, tx)\n return tx\n }\n}\n","import {\n BaseError,\n CACHE_TIME_24H,\n CLOCK_ADDRESS,\n CoinAssist,\n d,\n getObjectFields,\n getPackagerConfigs,\n removeHexPrefix,\n SUI_SYSTEM_STATE_OBJECT_ID,\n U64_MAX,\n} from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport BigNumber from 'bignumber.js'\nimport {\n BorrowAssetParams,\n CalculatePositionDepositParams,\n CalculatePositionLeverageParams,\n CalculatePositionRepayParams,\n CalculatePositionWithdrawParams,\n CreateLeveragePositionParams,\n CreateMarginTradingContextParams,\n OpenPositionParams,\n Position,\n PositionCloseWithCoinParams,\n PositionDepositParams,\n PositionManageLeverageParams,\n PositionManageSizeDepositParams,\n PositionManageSizeWithdrawParams,\n PositionRepayParams,\n positionTopUpCTokenParams,\n positionWithdrawCTokenParams,\n RepayParams,\n WithdrawAssetParams,\n} from '../types'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { v4 as uuidv4 } from 'uuid'\nimport { mergePositionData, wrapPosition } from '../utils'\nimport Decimal from 'decimal.js'\nimport { compoundDebt } from '@suilend/sdk'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\nimport { is } from 'valibot'\n\nexport class PositionModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n /**\n * Get leverage position list\n */\n getPositionList = async (wallet_address = this._sdk.getSenderAddress(), force_refresh = false): Promise<Position[]> => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n try {\n // Define mapping cache key\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n\n // Try to get mapping relationship from cache\n let capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, force_refresh)\n\n const ownerRes = await this._sdk.FullClient.getOwnedObjectsByPage(wallet_address, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n MatchAny: [\n {\n StructType: `${this._sdk.sdkOptions.margin_trading.package_id}::position::PositionCap`,\n },\n ],\n },\n })\n\n console.log('🚀🚀🚀 ~ positionModules.ts:42 ~ PositionModules ~ ownerRes.data.length:', ownerRes.data.length)\n if (ownerRes.data.length === 0) {\n handleError(MarginTradingErrorCode.PositionNotFound, 'Position not found')\n return []\n }\n\n const suiLendClient = await this._sdk.SuiLendModule.getSuilendClient(lending_market_id, lending_market_type)\n console.log('🚀🚀🚀 ~ positionModules.ts:48 ~ PositionModules ~ suiLendClient:', suiLendClient)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData()\n console.log('🚀🚀🚀 ~ positionModules.ts:50 ~ PositionModules ~ allLendingMarketData:', allLendingMarketData)\n const reserveMap: any = allLendingMarketData[lending_market_id].reserveMap\n\n // Rebuild mapping if cache doesn't exist or needs refresh\n if (!capIdToPositionIdMap) {\n capIdToPositionIdMap = new Map<string, string>()\n }\n\n const positionIdList: string[] = []\n\n for (let i = 0; i < ownerRes.data.length; i++) {\n const fields = getObjectFields(ownerRes.data[i])\n if (fields.position_id) {\n positionIdList.push(fields.position_id)\n }\n if (fields.id.id) {\n // Store the mapping relationship between capId and positionId\n capIdToPositionIdMap.set(fields.id.id, fields.position_id)\n }\n }\n\n // Store mapping relationship in cache with 24h expiration time\n await this._sdk.updateCache(mappingCacheKey, capIdToPositionIdMap as any, CACHE_TIME_24H)\n\n const positionRes = await this._sdk.FullClient.batchGetObjects(positionIdList, { showContent: true })\n console.log('🚀🚀🚀 ~ positionModules.ts:73 ~ PositionModules ~ positionRes:', positionRes)\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n console.log('🚀🚀🚀 ~ positionModules.ts:75 ~ PositionModules ~ obligations:', obligations)\n const positionList = []\n\n for (let i = 0; i < positionRes.length; i++) {\n const positionId = positionIdList[i]\n // Use mapping in memory directly instead of reading from cache\n let positionCapId = ''\n for (const [capId, pid] of capIdToPositionIdMap.entries()) {\n if (pid === positionId) {\n positionCapId = capId\n break\n }\n }\n\n const position = wrapPosition(positionRes[i], positionCapId)\n const rawObligation = await suiLendClient.getObligation(position.obligation_owner_cap)\n const mergeData = mergePositionData(\n position,\n rawObligation,\n reserveMap || {},\n lstAprPercentMap || {},\n obligations[lending_market_id].rewardMap\n )\n const claimableRewards = this.getObligationRewardsInfo(rawObligation, Object.values(reserveMap))\n positionList.push({\n ...mergeData,\n claimable_rewards: claimableRewards,\n })\n }\n return positionList\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return []\n }\n }\n\n /**\n * Get leverage position details\n */\n getPositionInfo = async (position_id: string, wallet_address = this._sdk.getSenderAddress(), force_refresh = true): Promise<Position> => {\n // Define mapping cache key\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n\n // Try to get mapping relationship from cache\n let capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, force_refresh)\n\n // If cache doesn't exist or needs refresh, rebuild mapping\n if (!capIdToPositionIdMap) {\n capIdToPositionIdMap = new Map<string, string>()\n }\n\n // Get capId from mapping by positionId\n let positionCapId = this.getCapIdByPositionId(position_id, wallet_address) || ''\n\n if (!positionCapId) {\n const ownerRes = await this._sdk.FullClient.getOwnedObjectsByPage(wallet_address, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n MatchAny: [\n {\n StructType: `${this._sdk.sdkOptions.margin_trading.package_id}::position::PositionCap`,\n },\n ],\n },\n })\n for (let i = 0; i < ownerRes.data.length; i++) {\n const fields = getObjectFields(ownerRes.data[i])\n if (fields.id.id) {\n capIdToPositionIdMap.set(fields.id.id, fields.position_id)\n }\n if (fields.position_id === position_id) {\n positionCapId = fields.id.id\n }\n }\n }\n const positionRes = await this._sdk.FullClient.batchGetObjects([position_id], { showContent: true })\n const position = wrapPosition(positionRes[0], positionCapId || '')\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const suiLendClient = await this._sdk.SuiLendModule.getSuilendClient(lending_market_id, lending_market_type)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData()\n const reserveMap: any = allLendingMarketData[lending_market_id].reserveMap\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n const rawObligation = await suiLendClient.getObligation(position.obligation_owner_cap)\n const claimableRewards = this.getObligationRewardsInfo(rawObligation, Object.values(reserveMap))\n const mergeData = mergePositionData(\n position,\n rawObligation,\n reserveMap || {},\n lstAprPercentMap || {},\n obligations[lending_market_id].rewardMap\n )\n const result = {\n ...mergeData,\n claimable_rewards: claimableRewards,\n }\n\n return result\n }\n\n private getObligationRewardsInfo(obligationData: any, reserves: any[]) {\n const claimableRewards: any[] = []\n const WAD = new BigNumber(10).pow(18)\n const poolRewardInfoMap: Record<\n string,\n {\n coinType: string\n mintDecimals: number\n isActive: boolean\n reserveType: 'deposit' | 'borrow'\n reserveCoinType: string\n reserveArrayIndex: string\n rewardIndex: string\n globalCumulativePerShare: BigNumber // 全局累积每份奖励\n reserve: any\n }\n > = {}\n\n const nowMs = Date.now()\n\n for (const reserve of reserves) {\n const reserveCoinType = reserve.coinType\n const reserveArrayIndex = reserve.arrayIndex.toString()\n\n // Deposits pool rewards\n const depositsPoolRewards = reserve.depositsPoolRewardManager.poolRewards || []\n for (const pr of depositsPoolRewards) {\n if (!pr) continue\n const id = pr.id\n const coinType = pr.coinType\n const startTimeMs = parseInt(pr.startTimeMs)\n const endTimeMs = parseInt(pr.endTimeMs)\n const isActive = nowMs >= startTimeMs && nowMs < endTimeMs\n const mintDecimals = pr.mintDecimals\n // 获取全局累积每份奖励\n const globalCumulative = BigNumber(pr.cumulativeRewardsPerShare).times(10 ** mintDecimals)\n poolRewardInfoMap[id] = {\n coinType,\n mintDecimals,\n isActive,\n reserveType: 'deposit',\n reserveArrayIndex,\n reserveCoinType,\n globalCumulativePerShare: globalCumulative,\n rewardIndex: pr.rewardIndex,\n reserve,\n }\n }\n\n // Borrows pool rewards\n const borrowsPoolRewards = reserve.borrowsPoolRewardManager.poolRewards || []\n for (const pr of borrowsPoolRewards) {\n if (!pr) continue\n const id = pr.id\n const coinType = pr.coinType\n const startTimeMs = parseInt(pr.startTimeMs)\n const endTimeMs = parseInt(pr.endTimeMs)\n const isActive = nowMs >= startTimeMs && nowMs < endTimeMs\n const mintDecimals = pr.mintDecimals\n // 获取全局累积每份奖励\n const globalCumulative = BigNumber(pr.cumulativeRewardsPerShare).times(10 ** mintDecimals)\n poolRewardInfoMap[id] = {\n coinType,\n mintDecimals,\n isActive,\n reserveType: 'borrow',\n reserveCoinType,\n reserveArrayIndex,\n rewardIndex: pr.rewardIndex,\n globalCumulativePerShare: globalCumulative,\n reserve,\n }\n }\n }\n\n const userRewardManagers = obligationData.userRewardManagers\n for (const urm of userRewardManagers) {\n for (let i = 0; i < urm.rewards.length; i++) {\n const reward = urm.rewards[i]\n if (!reward) continue\n const rewardInfo = poolRewardInfoMap[reward.poolRewardId]\n if (!rewardInfo) continue\n\n // 计算待领取奖励 = share × (global_cumulative - user_cumulative)\n const globalCumulativePerShare = rewardInfo.globalCumulativePerShare\n const userCumulativePerShare = new BigNumber(reward.cumulativeRewardsPerShare.value.toString()).div(WAD)\n const pendingRewards = new BigNumber(urm.share).times(globalCumulativePerShare.minus(userCumulativePerShare))\n\n // 实际可领取 = 已记录奖励 + 待领取奖励\n const earnedRewards = new BigNumber(reward.earnedRewards.value).div(WAD)\n const actualClaimable = new BigNumber(earnedRewards).plus(pendingRewards)\n\n const price = rewardInfo.reserve.price\n const earnedRewardsFormatted = actualClaimable.div(10 ** rewardInfo.mintDecimals)\n\n const earnedRewardsUsd = price ? earnedRewardsFormatted.times(price).toFixed(12) : 0\n\n if (d(earnedRewardsUsd).gt(0)) {\n claimableRewards.push({\n poolRewardId: reward.poolRewardId,\n coinType: rewardInfo.coinType,\n earnedRewards: actualClaimable.toString(),\n earnedRewardsUsd,\n earnedRewardsFormatted: earnedRewardsFormatted.toFixed(12),\n isActive: rewardInfo.isActive,\n reserveType: rewardInfo.reserveType,\n reserveCoinType: rewardInfo.reserveCoinType,\n reserveArrayIndex: rewardInfo.reserveArrayIndex,\n rewardIndex: rewardInfo.rewardIndex,\n rewardInfo,\n })\n }\n }\n }\n\n return claimableRewards\n }\n\n /**\n * Get capId from mapping by positionId\n * @param position_id Position ID\n * @param wallet_address Wallet address\n * @returns capId or undefined\n */\n private getCapIdByPositionId = (position_id: string, wallet_address = this._sdk.getSenderAddress()): string => {\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n const capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, false)\n\n if (!capIdToPositionIdMap) {\n return ''\n }\n\n // Find the corresponding capId through positionId\n for (const [capId, pid] of capIdToPositionIdMap.entries()) {\n if (pid === position_id) {\n return capId\n }\n }\n\n return ''\n }\n\n /**\n * Create leverage position\n */\n private createLeveragePosition(params: CreateLeveragePositionParams) {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const leverageConfig = this._sdk.sdkOptions.margin_trading\n const { leverage, market_id, base_token, quote_token, is_long, init_deposit_amount, tx, init_coin_type } = params\n const [position_cap, margin_trading_context] = tx.moveCall({\n target: `${leverageConfig.published_at}::router::open_position`,\n arguments: [\n tx.object(global_config_id),\n tx.object(market_id),\n tx.object(lending_market_id),\n tx.pure.u64(init_deposit_amount),\n tx.pure.u64(d(leverage).mul(10000).toString()),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [lending_market_type, is_long ? base_token : quote_token, init_coin_type],\n })\n\n return { position_cap, margin_trading_context }\n }\n\n /**\n * Deposit asset to leverage position\n */\n private async depositToLeveragePosition(params: PositionDepositParams, tx: Transaction) {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_type, lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const {\n is_long,\n market_id,\n position_cap_id,\n position_cap,\n deposit_reserve_array_index,\n input_coin,\n margin_trading_context,\n base_token,\n quote_token,\n } = params\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::deposit`,\n typeArguments: [lending_market_type, is_long ? base_token : quote_token],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n position_cap_id ? tx.object(position_cap_id) : position_cap,\n input_coin,\n tx.pure.u64(deposit_reserve_array_index),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n return tx\n }\n\n /**\n * Repay\n */\n public repay = (params: RepayParams) => {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const {\n txb,\n repay_amount,\n repay_coin_type,\n repay_coin,\n repay_reserve_array_index,\n market_id,\n position_cap_id,\n margin_trading_context,\n } = params\n const tx = txb || new Transaction()\n const coin = repay_coin ? repay_coin : CoinAssist.buildCoinWithBalance(BigInt(repay_amount.toString()), repay_coin_type, tx)\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::repay`,\n typeArguments: [lending_market_type, repay_coin_type],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n coin,\n tx.pure.u64(repay_reserve_array_index.toString()),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Withdraw asset (unified handling for SUI and non-SUI)\n */\n public withdrawAsset = (params: WithdrawAssetParams, tx: Transaction) => {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { package_id } = this._sdk.sdkOptions.suilend\n const { market_id, withdraw_amount, withdraw_reserve_array_index, withdraw_coin_type, position_cap_id, margin_trading_context } = params\n\n // Construct RateLimiterExemption\n const [exemption] = tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: [`${package_id}::lending_market::RateLimiterExemption<${lending_market_type}, ${withdraw_coin_type}>`],\n arguments: [],\n })\n\n return tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::withdraw`,\n typeArguments: [lending_market_type, withdraw_coin_type],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.object(exemption),\n tx.pure.u64(withdraw_amount),\n tx.pure.u64(withdraw_reserve_array_index),\n tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Borrow asset (unified handling for SUI and non-SUI)\n */\n public borrowAsset = (params: BorrowAssetParams, tx: Transaction) => {\n const {\n reserve_array_index,\n borrow_amount,\n base_token,\n quote_token,\n lending_market_id,\n is_long,\n market_id,\n position_cap_id,\n position_cap,\n margin_trading_context,\n } = params\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n // Borrow asset\n return tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::borrow`,\n typeArguments: [lending_market_type, is_long ? quote_token : base_token],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n position_cap_id ? tx.object(position_cap_id) : position_cap,\n tx.pure.u64(reserve_array_index),\n tx.pure.u64(borrow_amount.toString()),\n tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Extract other token types from deposits and borrows excluding baseToken and quoteToken\n * @param deposits Deposit list\n * @param borrows Borrow list\n * @param baseToken Base token type\n * @param quoteToken Quote token type\n * @returns Array of other token types\n */\n private extractOtherTokenTypes(\n deposits: { reserve: { coinType: string } }[],\n borrows: { reserve: { coinType: string } }[],\n baseToken: string,\n quoteToken: string\n ): string[] {\n const otherTokens: string[] = []\n\n deposits.forEach((deposit) => {\n if (deposit.reserve.coinType !== baseToken && deposit.reserve.coinType !== quoteToken) {\n otherTokens.push(deposit.reserve.coinType)\n }\n })\n\n borrows.forEach((borrow) => {\n if (borrow.reserve.coinType !== baseToken && borrow.reserve.coinType !== quoteToken) {\n otherTokens.push(borrow.reserve.coinType)\n }\n })\n\n return otherTokens\n }\n\n // Create margin trading context\n createMarginTradingContext = (params: CreateMarginTradingContextParams, tx: Transaction) => {\n const { published_at } = this._sdk.sdkOptions.margin_trading\n const { market_id, position_cap_id, action, coin_type, amount } = params\n const marginTradingContext = tx.moveCall({\n target: `${published_at}::router::create_margin_trading_context`,\n arguments: [tx.object(market_id), tx.object(position_cap_id), tx.pure.string(action), tx.pure.u64(amount)],\n typeArguments: [coin_type],\n })\n return marginTradingContext\n }\n\n marginTradingContextConfirm = (marginTradingContext: TransactionObjectArgument, tx: Transaction) => {\n const { published_at } = this._sdk.sdkOptions.margin_trading\n tx.moveCall({\n target: `${published_at}::router::confirm`,\n arguments: [marginTradingContext],\n typeArguments: [],\n })\n return tx\n }\n\n /**\n * Open position\n */\n openPosition = async (params: OpenPositionParams) => {\n const { is_quote, is_long, amount, swap_clmm_pool = '', slippage, leverage, market_id } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n\n const {\n flash_amount,\n flash_loan_coin,\n is_flash_a,\n borrow_amount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n base_reserve_array_index,\n quote_reserve_array_index,\n reserve,\n has_swap,\n routers,\n } = await this.calculatePositionDeposit({\n is_long,\n is_quote,\n amount,\n swap_clmm_pool,\n leverage,\n slippage,\n market_id,\n base_token,\n quote_token,\n is_submit: true,\n })\n console.log('🚀🚀🚀 ~ positionModules.ts:492 ~ PositionModules ~ routers:', routers)\n\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Initiate flash loan\n const { balance_a, balance_b, receipt } = this._sdk.SwapModules.flashLoan({\n amount: flash_amount,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin,\n tx,\n })\n\n // Flash loan partial conversion\n const debt_from = is_long ? quote_token : base_token\n const debt_to = is_long ? base_token : quote_token\n const init_deposit_coin = CoinAssist.buildCoinWithBalance(BigInt(amount), is_quote ? quote_token : base_token, tx)\n const balance_coin_a = CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n const balance_coin_b = CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n if (has_swap) {\n console.log('🚀🚀🚀 ~ positionModules.ts:515 ~ PositionModules ~ is_flash_a:', is_flash_a)\n tx.mergeCoins(init_deposit_coin, [is_flash_a ? balance_coin_a : balance_coin_b])\n }\n\n console.log(\n '🚀🚀🚀 ~ positionModules.ts:521 ~ PositionModules ~ d(flash_amount).add(amount).toString():',\n d(flash_amount).add(amount).toString(),\n debt_from,\n debt_to\n )\n const debtSwapResult = await this._sdk.SwapModules.handleSwap({\n from: debt_from,\n to: debt_to,\n amount: has_swap ? d(flash_amount).add(amount).toString() : flash_amount,\n input_coin: has_swap ? init_deposit_coin : is_flash_a ? balance_coin_a : balance_coin_b,\n swap_clmm_pool,\n slippage,\n tx,\n })\n\n // Open position\n const { position_cap, margin_trading_context } = this.createLeveragePosition({\n leverage,\n market_id,\n base_token,\n quote_token,\n is_long,\n init_deposit_amount: d(amount).toString(),\n init_coin_type: is_quote ? quote_token : base_token,\n tx,\n })\n\n // Reserve index of collateral asset\n const deposit_reserve_array_index = is_long ? base_reserve_array_index : quote_reserve_array_index\n\n if (debtSwapResult.swap_out_coin && !has_swap) {\n tx.mergeCoins(debtSwapResult.swap_out_coin, [init_deposit_coin])\n }\n // Position deposit\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap,\n deposit_reserve_array_index,\n input_coin: debtSwapResult.swap_out_coin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n console.log('🚀🚀🚀 ~ positionModules.ts:580 ~ PositionModules ~ borrow_amount:', borrow_amount)\n\n // Borrow asset\n const borrowCoin = this.borrowAsset(\n {\n position_cap,\n reserve_array_index: is_long ? quote_reserve_array_index : base_reserve_array_index,\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const zeroBalance = CoinAssist.mintBalanceZero(is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n // Repay flash loan\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_flash_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_flash_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n // Transfer position to user\n tx.transferObjects([position_cap], tx.pure.address(this._sdk.getSenderAddress()))\n // Destroy zero balance asset from flash loan\n CoinAssist.destroyBalanceZero(\n is_flash_a\n ? CoinAssist.intoBalance(balance_coin_b, clmm_pool_coin_type_b, tx)\n : CoinAssist.intoBalance(balance_coin_a, clmm_pool_coin_type_a, tx),\n is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a,\n tx\n )\n\n this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Increase position size\n */\n positionDeposit = async (params: PositionManageSizeDepositParams) => {\n const { position_id, swap_clmm_pool = '', is_quote, amount, slippage, leverage, txb } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n\n // Get position info\n const { is_long, deposits, borrows, position_cap_id, market_id } = await this.getPositionInfo(position_id)\n // Get market info\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const tx = txb || new Transaction()\n\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'increase_size', coin_type: is_quote ? quote_token : base_token, amount: amount.toString() },\n tx\n )\n\n // Get reserveArrayIndex of position collateral token\n const deposit_reserve_array_index = deposits[0].reserveArrayIndex.toString()\n const borrow_reserve_array_index = borrows[0].reserveArrayIndex.toString()\n\n // Calculate flash loan parameters\n const {\n flash_amount,\n flash_loan_coin,\n is_flash_a,\n borrow_amount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n reserve,\n has_swap,\n } = await this.calculatePositionDeposit({\n market_id,\n is_long,\n is_quote,\n amount,\n swap_clmm_pool,\n leverage,\n slippage,\n base_token,\n quote_token,\n position_id,\n is_open: false,\n })\n console.log('🚀🚀🚀 ~ positionModules.ts:603 ~ PositionModules ~ flash_amount:', flash_amount)\n\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Initiate flash loan\n const { balance_a, balance_b, receipt } = this._sdk.SwapModules.flashLoan({\n amount: flash_amount,\n clmm_pool,\n clmm_pool_coin_type_a: clmm_pool_coin_type_a,\n clmm_pool_coin_type_b: clmm_pool_coin_type_b,\n flash_loan_coin,\n tx,\n })\n\n // Flash loan partial conversion\n const debt_from = is_long ? quote_token : base_token\n const debt_to = is_long ? base_token : quote_token\n const init_deposit_coin = CoinAssist.buildCoinWithBalance(BigInt(amount), is_quote ? quote_token : base_token, tx)\n const balance_coin_a = CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n const balance_coin_b = CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n if (has_swap) {\n tx.mergeCoins(init_deposit_coin, [is_flash_a ? balance_coin_a : balance_coin_b])\n }\n\n const debtSwapResult = await this._sdk.SwapModules.handleSwap({\n from: debt_from,\n to: debt_to,\n amount: has_swap ? d(flash_amount).add(amount).toString() : flash_amount,\n input_coin: has_swap ? init_deposit_coin : is_flash_a ? balance_coin_a : balance_coin_b,\n swap_clmm_pool,\n slippage,\n tx,\n })\n\n if (debtSwapResult.swap_out_coin && !has_swap) {\n tx.mergeCoins(debtSwapResult.swap_out_coin, [init_deposit_coin])\n }\n\n // Increase position size\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index,\n input_coin: debtSwapResult.swap_out_coin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n // Borrow asset\n const borrowCoin = await this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: borrow_reserve_array_index,\n borrow_amount: borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n const zeroBalance = CoinAssist.mintBalanceZero(is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n\n // Repay flash loan\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_flash_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_flash_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n // Destroy zero balance asset from flash loan\n CoinAssist.destroyBalanceZero(\n is_flash_a\n ? CoinAssist.intoBalance(balance_coin_b, clmm_pool_coin_type_b, tx)\n : CoinAssist.intoBalance(balance_coin_a, clmm_pool_coin_type_a, tx),\n is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a,\n tx\n )\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Decrease position size\n */\n\n positionWithdraw = async (params: PositionManageSizeWithdrawParams) => {\n const { amount, is_quote, txb, swap_clmm_pool = '', slippage, position_id, leverage } = params\n const tx = txb || new Transaction()\n const {\n withdraw_ctoken_amount,\n repay_amount,\n is_close,\n deposits,\n borrows,\n reserve,\n base_token,\n quote_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n position_cap_id,\n market_id,\n is_long,\n swap_convert_all,\n flash_loan_amount,\n routers,\n repay_flash_loan_amount = '0',\n partial_amount_in,\n withdraw_amount,\n has_flash_loan,\n } = await this.calculatePositionWithdraw({ position_id, is_quote, swap_clmm_pool, amount, leverage, slippage })\n if (is_close) {\n return this.positionClose({\n position_id,\n is_quote,\n leverage,\n slippage,\n swap_clmm_pool,\n })\n }\n const margin_trading_context = this.createMarginTradingContext(\n {\n market_id: market_id,\n position_cap_id: position_cap_id,\n action: 'decrease_size',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n let flashReceipt, isLoanA\n if (has_flash_loan) {\n // Flash loan borrows debt\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount,\n flash_loan_coin: borrows[0].reserve.coinType,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n flashReceipt = receipt\n isLoanA = is_loan_a\n CoinAssist.destroyBalanceZero(isLoanA ? balance_b : balance_a, isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n // Repay debt\n const repayCoin = is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n\n // Withdraw collateral asset\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdraw_ctoken_amount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n for (let i = 1; i < deposits.length; i++) {\n const rewardCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(),\n withdraw_reserve_array_index: deposits[i].reserveArrayIndex.toString(),\n withdraw_coin_type: deposits[i].coinType,\n margin_trading_context,\n },\n tx\n )\n tx.transferObjects([rewardCoin], this._sdk.getSenderAddress())\n }\n\n let swapOutCoin\n // Convert all collateral assets\n console.log('🚀🚀🚀 ~ positionModules.ts:778 ~ PositionModules ~ swap_convert_all:', { swap_convert_all, has_flash_loan })\n if (swap_convert_all) {\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n } else {\n // Partially convert collateral asset to borrow asset\n const inputCoin = tx.splitCoins(withdrawCoin, [tx.pure.u64(partial_amount_in?.toString() || '0')])\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n }\n\n // Repay flash loan\n let repayFlashLoanCoin\n if (swapOutCoin && has_flash_loan) {\n repayFlashLoanCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount.toString())])\n }\n\n if (repayFlashLoanCoin && has_flash_loan) {\n const zeroBalance = CoinAssist.mintBalanceZero(isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: isLoanA ? CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: isLoanA ? zeroBalance : CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_b, tx),\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n receipt: flashReceipt,\n })\n } else {\n if (swapOutCoin) {\n const repayCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount.toString())])\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n }\n\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n if (!swap_convert_all) {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Close position\n */\n positionClose = async (params: PositionCloseWithCoinParams) => {\n const { position_id, is_quote, slippage, leverage, swap_clmm_pool = '' } = params\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { lending_market_type: lendingMarketType, lending_market_id: lendingMarketId } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const {\n deposits,\n borrows,\n base_token,\n quote_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n position_cap_id,\n market_id,\n swap_convert_all,\n routers,\n partial_amount_in,\n is_long,\n flash_loan_amount,\n reserve,\n repay_flash_loan_amount = '0',\n } = await this.calculatePositionWithdraw({ position_id, is_quote, swap_clmm_pool, amount: U64_MAX.toString(), leverage, slippage })\n\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'close_position', coin_type: is_quote ? quote_token : base_token, amount: '0' },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Flash loan borrow\n let flashReceipt, isLoanA\n if (d(flash_loan_amount).gt(0)) {\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount,\n flash_loan_coin: is_long ? quote_token : base_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n flashReceipt = receipt\n isLoanA = is_loan_a\n // Repay debt\n CoinAssist.destroyBalanceZero(isLoanA ? balance_b : balance_a, isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n const repayCoin = isLoanA\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: borrows[0].reserve.coinType,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n\n // Withdraw collateral asset\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(), // u64max will be automatically converted to maxAmount when withdrawing\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n for (let i = 1; i < deposits.length; i++) {\n const rewardCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(),\n withdraw_reserve_array_index: deposits[i].reserveArrayIndex.toString(),\n withdraw_coin_type: deposits[i].coinType,\n margin_trading_context,\n },\n tx\n )\n tx.transferObjects([rewardCoin], this._sdk.getSenderAddress())\n }\n // Asset conversion\n let swapOutCoin\n console.log('🚀🚀🚀 ~ positionModules.ts:895 ~ PositionModules ~ swap_convert_all:', swap_convert_all)\n if (swap_convert_all) {\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n } else {\n if (partial_amount_in && d(partial_amount_in).gt(0)) {\n const inputCoin = tx.splitCoins(withdrawCoin, [tx.pure.u64(partial_amount_in?.toString() || '0')])\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n }\n }\n // Repay flash loan\n if (swapOutCoin && flashReceipt) {\n const zeroBalance = CoinAssist.mintBalanceZero(isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n const repayFlashLoanCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount?.toString() || '0')])\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: isLoanA ? CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: isLoanA ? zeroBalance : CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_b, tx),\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n receipt: flashReceipt,\n })\n }\n\n // Close position\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::close_position`,\n typeArguments: [lendingMarketType],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lendingMarketId),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n if (!swap_convert_all) {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n this.marginTradingContextConfirm(margin_trading_context, tx)\n\n console.log('🚀🚀🚀 ~ positionModules.ts:951 ~ PositionModules ~ tx:', tx)\n return tx\n }\n\n /**\n * Increase position leverage\n */\n positionLeverageIncrease = async (params: PositionManageLeverageParams) => {\n const { current_leverage, target_leverage, swap_clmm_pool = '', slippage, position_id } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const {\n flash_loan_amount,\n quote_token,\n base_token,\n reserve,\n deposits,\n borrow_amount,\n routers,\n position_cap_id,\n is_long,\n market_id,\n is_flash_loan,\n } = await this.calculatePositionLeverage({ position_id, current_leverage, target_leverage, swap_clmm_pool, slippage })\n const flash_loan_coin = is_long ? quote_token : base_token\n\n // Create context\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'increase_leverage', coin_type: is_long ? base_token : quote_token, amount: '0' },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Need flash loan\n if (is_flash_loan) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_pool } = await this._sdk.SwapModules.getFlashLoanPool(\n flash_loan_coin,\n flash_loan_amount?.toString() || ''\n )\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount?.toString() || '0',\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin,\n })\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx),\n slippage: slippage,\n txb: tx,\n })\n\n this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n input_coin: swapOutCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n const borrowCoin = this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: is_long ? reserve[1].arrayIndex.toString() : reserve[0].arrayIndex.toString(),\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const zeroBalance = CoinAssist.mintBalanceZero(is_loan_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_loan_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_loan_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n CoinAssist.destroyBalanceZero(is_loan_a ? balance_b : balance_a, is_loan_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n } else {\n const borrowCoin = this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: is_long ? reserve[1].arrayIndex.toString() : reserve[0].arrayIndex.toString(),\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: borrowCoin,\n slippage: slippage,\n txb: tx,\n })\n\n this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n input_coin: swapOutCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Decrease position leverage\n */\n positionLeverageDecrease = async (params: PositionManageLeverageParams) => {\n const { current_leverage, target_leverage, swap_clmm_pool = '', slippage, position_id } = params\n const { deposits, borrows, position_cap_id, market_id, is_long } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const tx = new Transaction()\n // Decrease position leverage, withdraw collateral asset\n const { withdraw_ctoken_amount, routers, reserve, is_flash_loan } = await this.calculatePositionLeverage({\n position_id,\n current_leverage,\n target_leverage,\n swap_clmm_pool,\n slippage,\n })\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'decrease_leverage', coin_type: is_long ? base_token : quote_token, amount: '0' },\n tx\n )\n // Need to update oracle prices before placing suilend order\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n if (is_flash_loan) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_pool, clmm_fee_tier } = await this._sdk.SwapModules.getFlashLoanPool(\n deposits[0].reserve.coinType,\n withdraw_ctoken_amount.toString()\n )\n\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: withdraw_ctoken_amount,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin: deposits[0].reserve.coinType,\n })\n\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx),\n slippage: slippage,\n txb: tx,\n })\n\n this.repay({\n txb: tx,\n market_id,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: swapOutCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n margin_trading_context,\n })\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n const flashLoanFee = d(withdraw_ctoken_amount).mul(clmm_fee_tier).toString()\n const repayFlashLoanAmount = d(withdraw_ctoken_amount).add(flashLoanFee).toDP(0, Decimal.ROUND_UP)\n\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: repayFlashLoanAmount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n const repayCoin = tx.splitCoins(withdrawCoin, [repayFlashLoanAmount.toString()])\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_loan_a ? CoinAssist.intoBalance(repayCoin, clmm_pool_coin_type_a, tx) : balance_a,\n repay_quote: is_loan_a ? balance_b : CoinAssist.intoBalance(repayCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n } else {\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdraw_ctoken_amount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Leverage position repay\n */\n positionRepay = async (params: PositionRepayParams) => {\n const { position_id, amount, is_quote, slippage } = params\n const { routers, repay_coin_type, base_token, quote_token, borrows, deposits, market_id, position_cap_id } =\n await this.calculatePositionRepay({\n position_id,\n amount,\n is_quote,\n })\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(base_token, quote_token, undefined, otherToken)\n const tx = new Transaction()\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n // Coin to be repaid\n const hasSwap = is_quote ? quote_token !== repay_coin_type : base_token !== repay_coin_type\n let repayCoin: any\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'repay_debt', coin_type: is_quote ? quote_token : base_token, amount: amount.toString() },\n tx\n )\n if (hasSwap) {\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n repayCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n } else {\n repayCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Top up collateral for leverage position\n */\n positionTopUpCToken = async (params: positionTopUpCTokenParams) => {\n const { position_id, amount, is_quote, swap_clmm_pool = '', slippage } = params\n const tx = new Transaction()\n const { is_long, market_id, position_cap_id, deposits, borrows } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'top_up_collateral',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { base_reserve_array_index, quote_reserve_array_index, reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n let depositCoin: any\n if (hasSwap) {\n const routers = await this._sdk.SwapModules.findRouters(\n is_quote ? quote_token : base_token,\n is_quote ? base_token : quote_token,\n amount,\n true,\n [swap_clmm_pool]\n )\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n depositCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n } else {\n depositCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: is_long ? base_reserve_array_index : quote_reserve_array_index,\n input_coin: depositCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Withdraw ctoken for leverage position\n */\n positionWithdrawCToken = async (params: positionWithdrawCTokenParams) => {\n const { position_id, amount, is_quote, swap_clmm_pool = '', slippage } = params\n const tx = new Transaction()\n const { is_long, market_id, position_cap_id, deposits, borrows } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'withdraw_collateral',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { base_reserve_array_index, quote_reserve_array_index, reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n const rate = is_long ? d(quotePrice).div(d(basePrice)).toString() : d(basePrice).div(d(quotePrice)).toString()\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n const withdrawAmount = hasSwap\n ? d(amount)\n .mul(rate)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n : amount.toString()\n\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdrawAmount,\n withdraw_reserve_array_index: is_long ? base_reserve_array_index : quote_reserve_array_index,\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n if (hasSwap) {\n const routers = await this._sdk.SwapModules.findRouters(\n is_long ? base_token : quote_token,\n is_quote ? quote_token : base_token,\n withdrawAmount,\n true,\n [swap_clmm_pool]\n )\n const targetCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n if (targetCoin) {\n tx.transferObjects([targetCoin], this._sdk.getSenderAddress())\n }\n } else {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n positionClaim = async (position_id: string) => {\n const tx = new Transaction()\n const { position_cap_id, obligation_owner_cap, market_id, claimable_rewards } = await this.getPositionInfo(position_id)\n console.log('🚀🚀🚀 ~ positionModules.ts:1650 ~ PositionModules ~ claimable_rewards:', claimable_rewards)\n\n const { suilend, margin_trading } = this._sdk.sdkOptions\n const lending_market_id = getPackagerConfigs(suilend).lending_market_id\n const lending_market_type = getPackagerConfigs(suilend).lending_market_type\n\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n for (let i = 0; i < claimable_rewards.length; i++) {\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'claim_reward',\n coin_type: claimable_rewards[i].coinType,\n amount: d(claimable_rewards[i].earnedRewards).toFixed(0),\n },\n tx\n )\n const coin = tx.moveCall({\n target: `${margin_trading.published_at}::router::claim_rewards`,\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.pure.u64(claimable_rewards[i].reserveArrayIndex.toString()),\n tx.pure.u64(claimable_rewards[i].rewardIndex.toString()),\n tx.pure.bool(claimable_rewards[i].reserveType === 'deposit'),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [lending_market_type, claimable_rewards[i].coinType],\n })\n\n tx.transferObjects([coin], this._sdk.getSenderAddress())\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n }\n return tx\n }\n\n /**\n * Pre-calculate for opening position\n */\n calculatePositionDeposit = async (params: CalculatePositionDepositParams) => {\n const {\n is_quote,\n is_long,\n amount,\n swap_clmm_pool = '',\n leverage,\n by_amount_in = true,\n base_token,\n quote_token,\n is_submit = false,\n is_open = true,\n position_id,\n } = params\n let otherToken: string[] = []\n let deposits: any[] = []\n let borrows: any[] = []\n if (!is_open && position_id) {\n const { deposits: positionDeposits, borrows: positionBorrows } = await this.getPositionInfo(position_id)\n deposits = positionDeposits\n borrows = positionBorrows\n otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n }\n const { reserve, base_reserve_array_index, quote_reserve_array_index } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // User's initial deposit coin\n let initDepositAmount = amount.toString()\n // First check if initial deposit coin needs conversion\n const has_swap = (is_long && is_quote) || (!is_long && !is_quote)\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeedsByCoinTypes([base_token, quote_token])\n const quotePrice = priceUpdateData && priceUpdateData[quote_token]?.price\n const basePrice = priceUpdateData && priceUpdateData[base_token]?.price\n if (!quotePrice || !basePrice) {\n throw handleError(MarginTradingErrorCode.PriceNotFound, 'Price not found')\n }\n if (has_swap && is_submit) {\n const rate = is_long ? d(quotePrice).div(d(basePrice)).toString() : d(basePrice).div(d(quotePrice)).toString()\n initDepositAmount = d(amount)\n .mul(rate)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:492 ~ PositionModules ~ initDepositAmount:', { initDepositAmount, rate })\n } else if (has_swap && !is_submit) {\n const from = is_long ? quote_token : base_token\n const to = is_long ? base_token : quote_token\n const routers = await this._sdk.SwapModules.findRouters(from, to, initDepositAmount, true, [swap_clmm_pool])\n initDepositAmount = routers?.amount_out.toString()\n } else {\n initDepositAmount = amount\n }\n // After conversion, calculate flash loan borrow amount\n const {\n base_price,\n quote_price,\n flash_amount,\n flash_loan_fee,\n flash_loan_coin,\n is_flash_a,\n clmm_pool,\n clmm_fee_tier,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n } = await this._sdk.SwapModules.calculateFlashLoan({\n is_long,\n leverage,\n base_token,\n quote_token,\n deposit_amount: initDepositAmount,\n reserve,\n base_token_decimal: baseTokenDecimal,\n quote_token_decimal: quoteTokenDecimal,\n })\n // Convert flash loan borrow amount to collateral asset\n const debtRouters = await this._sdk.SwapModules.findRouters(\n is_long ? quote_token : base_token,\n is_long ? base_token : quote_token,\n flash_amount.toString(),\n true,\n [swap_clmm_pool]\n )\n const depositAmount = d(initDepositAmount).add(d(debtRouters?.amount_out.toString())).toDP(0, Decimal.ROUND_DOWN).toString()\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? base_price : quote_price)\n .toString()\n const borrowAmount = d(flash_amount).add(flash_loan_fee).toDP(0, Decimal.ROUND_UP).toString()\n const borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quote_price : base_price)\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1575 ~ PositionModules ~ depositAmount:', { depositAmount, borrowAmount })\n\n let leverageDepositAmount = !is_quote\n ? d(amount).mul(leverage).toDP(0, Decimal.ROUND_DOWN).toString()\n : d(amount)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** baseTokenDecimal)\n .mul(leverage)\n .div(base_price)\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1583 ~ PositionModules ~ leverageDepositAmount:', leverageDepositAmount)\n\n let afterBorrowAmount = '0'\n let afterBorrowAmountUSD = '0'\n let afterDepositAmount = '0'\n let afterDepositAmountUSD = '0'\n if (!is_open && position_id) {\n if (borrows && borrows.length > 0) {\n // Remaining borrowed assets\n afterBorrowAmount = d(borrows[0].borrowedAmount.toString())\n .mul(is_long ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal)\n .add(d(borrowAmount))\n .toString()\n afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n }\n // Remaining collateral assets\n afterDepositAmount = d(deposits[0].depositedAmount.toString())\n .mul(is_long ? 10 ** baseTokenDecimal : 10 ** quoteTokenDecimal)\n .add(d(depositAmount))\n .toString()\n afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n }\n\n return {\n routers: debtRouters,\n leverage_deposit_amount: leverageDepositAmount,\n quote_price,\n base_price,\n clmm_fee_tier,\n flash_loan_fee,\n flash_loan_coin,\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n after_borrow_amount: afterBorrowAmount,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n after_deposit_amount: afterDepositAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n flash_amount,\n is_flash_a,\n init_deposit_amount: initDepositAmount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n base_reserve_array_index,\n quote_reserve_array_index,\n reserve,\n has_swap,\n }\n }\n\n calculatePositionWithdraw = async (params: CalculatePositionWithdrawParams) => {\n const { position_id, is_quote, swap_clmm_pool = '', amount, leverage, slippage, withdraw_max } = params\n const { deposits, borrows, origin_obligation, position_cap_id, market_id, is_long } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n\n const otherToken = position_id ? this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token) : []\n\n const { reserve, base_reserve_map_info, quote_reserve_map_info } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // ctoken exchange rate\n const ctokenExchangeRate = is_long ? base_reserve_map_info.cTokenExchangeRate : quote_reserve_map_info.cTokenExchangeRate\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n let withdrawAmountUSD = d(0)\n let withdrawAmount\n if (is_long) {\n withdrawAmountUSD = d(is_quote ? d(amount).mul(quotePrice).toString() : d(amount).mul(basePrice).toString()).div(\n is_quote ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal\n )\n withdrawAmount = is_quote\n ? d(amount)\n .div(basePrice)\n .div(10 ** quoteTokenDecimal)\n .mul(10 ** baseTokenDecimal)\n .toString()\n : d(amount)\n } else {\n withdrawAmountUSD = d(is_quote ? d(amount).mul(quotePrice).toString() : d(amount).mul(basePrice).toString()).div(\n is_quote ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal\n )\n withdrawAmount = is_quote\n ? d(amount)\n : d(amount)\n .mul(basePrice)\n .div(10 ** baseTokenDecimal)\n .mul(10 ** quoteTokenDecimal)\n .toString()\n }\n // User available withdrawal token value (net worth)\n const availableWithdrawAmountUSD = d(deposits[0].depositedAmountUsd.toString())\n .sub(d(borrows && borrows.length > 0 ? borrows[0].borrowedAmountUsd.toString() : '0'))\n .toString()\n // Withdrawal ratio\n const ratio = withdrawAmountUSD.div(d(availableWithdrawAmountUSD))\n let is_close = withdraw_max || d(ratio).gte(1)\n\n // const debtBorrow = compoundDebt(origin_obligation.borrows[0], is_long ? reserve[1] : reserve[0])\n // const borrowAmount = d(debtBorrow.borrowedAmount.value.toString())\n // .div(10 ** 18)\n // .toDP(0, Decimal.ROUND_UP)\n let debtBorrow,\n borrowAmount = new Decimal(0)\n if (origin_obligation && origin_obligation.borrows && origin_obligation.borrows.length > 0) {\n debtBorrow = compoundDebt(origin_obligation.borrows[0], is_long ? reserve[1] : reserve[0])\n borrowAmount = d(debtBorrow.borrowedAmount.value.toString())\n .div(10 ** 18)\n .toDP(0, Decimal.ROUND_UP)\n }\n // Borrowed assets to be repaid\n let repayAmount = borrowAmount\n .mul(is_close ? 1 : ratio)\n .toDP(0, Decimal.ROUND_UP)\n .toString()\n // Flash loan amount equals repayment amount\n let flashLoanAmount = repayAmount.toString()\n let flashLoanFee, repayFlashLoanAmount, clmmFeeTier, clmmPool, clmmPoolCoinTypeA, clmmPoolCoinTypeB\n if (d(repayAmount).gt(0)) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_fee_tier, clmm_pool } = await this._sdk.SwapModules.getFlashLoanPool(\n is_long ? quote_token : base_token,\n flashLoanAmount\n )\n clmmPoolCoinTypeA = clmm_pool_coin_type_a || ''\n clmmPoolCoinTypeB = clmm_pool_coin_type_b || ''\n clmmFeeTier = clmm_fee_tier || 0\n clmmPool = clmm_pool || ''\n // Flash loan fee\n flashLoanFee = d(flashLoanAmount).mul(clmm_fee_tier).toString()\n // Flash loan repayment amount\n repayFlashLoanAmount = d(flashLoanAmount).mul(d(1).add(clmm_fee_tier)).toDP(0, Decimal.ROUND_UP).toString()\n }\n\n // Target coin is quote for long position, base for short position\n const swapConvertAll = (is_long && is_quote) || (!is_long && !is_quote)\n let routers: any\n let partialAmountIn\n if (swapConvertAll) {\n // User's target asset equals borrow asset, convert all collateral assets\n const amountIn = d(deposits[0].depositedAmount.toString())\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .mul(is_close ? 1 : ratio)\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n routers = await this._sdk.SwapModules.findRouters(deposits[0].reserve.coinType, is_long ? quote_token : base_token, amountIn, true, [\n swap_clmm_pool,\n ])\n } else {\n // User's target asset doesn't equal borrow asset, partially convert collateral assets to repay debt\n const buffer_rate =\n '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC' === deposits[0].reserve.coinType ? 0.0045 : 0.0025\n partialAmountIn = d(repayAmount)\n .mul(is_long ? quotePrice : basePrice)\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .div(is_long ? basePrice : quotePrice)\n .mul(d(1).add(buffer_rate))\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n routers = await this._sdk.SwapModules.findRouters(\n deposits[0].reserve.coinType,\n is_long ? quote_token : base_token,\n partialAmountIn.toString(),\n true,\n [swap_clmm_pool]\n )\n // Actual repayment amount\n if (!is_close) {\n repayAmount = d(routers?.amount_out.toString()).mul(d(1).sub(slippage)).toDP(0, Decimal.ROUND_DOWN).toString()\n }\n }\n // Borrowed assets to be repaid, borrows[0].borrowedAmount doesn't handle decimal, need to process decimal\n // Borrowed asset amount\n // Withdrawal amount = User input amount * leverage\n withdrawAmount = d(withdrawAmount).mul(leverage).toDP(0, Decimal.ROUND_DOWN).toString()\n withdrawAmountUSD = d(withdrawAmountUSD).mul(leverage)\n\n // Remaining borrowed assets\n const afterBorrowAmount = borrowAmount.mul(d(1).sub(ratio)).toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n // Remaining collateral assets\n const afterDepositAmount = d(deposits[0].depositedAmount.toString())\n .mul(is_long ? 10 ** baseTokenDecimal : 10 ** quoteTokenDecimal)\n .sub(d(withdrawAmount))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n // Router amount\n const amountIn = d(routers?.amount_in.toString()).toString()\n const amountOut = d(routers?.amount_out.toString()).toString()\n\n const withdrawCtokenAmount = d(withdrawAmount).div(ctokenExchangeRate.toString()).toDP(0, Decimal.ROUND_DOWN).toString()\n const afterBorrowAmountUSDDDecimal = d(afterBorrowAmountUSD).div(d(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal)))\n const afterDepositAmountUSDDecimal = d(afterDepositAmountUSD).div(d(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n let hasFlashLoan = true\n if (borrows.length > 0) {\n const currentBorrowAmountUSD = d(borrows[0].borrowedAmountUsd.toString())\n const afterLTV = currentBorrowAmountUSD.div(afterDepositAmountUSDDecimal).toString()\n const ltv = d(deposits[0].reserve.config.openLtvPct).mul(d(0.95)).div(100).toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1459 ~ PositionModules ~ afterLTV:', {\n afterLTV,\n ltv,\n afterDepositAmount,\n afterDepositAmountUSD: afterDepositAmountUSDDecimal,\n afterBorrowAmount,\n afterBorrowAmountUSD: afterBorrowAmountUSDDDecimal,\n withdrawAmount,\n currentBorrowAmountUSD,\n })\n if (d(afterLTV).lte(ltv)) {\n hasFlashLoan = false\n }\n }\n\n return {\n amount_in: amountIn,\n amount_out: amountOut,\n from: deposits[0].reserve.coinType,\n to: is_long ? base_token : quote_token,\n after_borrow_amount: afterBorrowAmount,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n after_deposit_amount: afterDepositAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n flash_loan_fee: flashLoanFee,\n clmm_fee_tier: clmmFeeTier,\n withdraw_amount: withdrawAmount,\n withdraw_ctoken_amount: withdrawCtokenAmount,\n repay_amount: repayAmount,\n ratio,\n is_close,\n is_long,\n deposits,\n borrows,\n reserve,\n base_token,\n quote_token,\n clmm_pool: clmmPool,\n clmm_pool_coin_type_a: clmmPoolCoinTypeA,\n clmm_pool_coin_type_b: clmmPoolCoinTypeB,\n position_cap_id,\n market_id,\n swap_convert_all: swapConvertAll,\n flash_loan_amount: flashLoanAmount,\n routers,\n repay_flash_loan_amount: repayFlashLoanAmount,\n partial_amount_in: partialAmountIn,\n has_flash_loan: hasFlashLoan,\n }\n }\n\n calculatePositionLeverage = async (params: CalculatePositionLeverageParams) => {\n const { position_id, current_leverage, target_leverage, swap_clmm_pool = '' } = params\n const laverageDiff = d(target_leverage).sub(d(current_leverage))\n const isUpLeverage = laverageDiff.gt(0)\n const { borrows, deposits, is_long, position_cap_id, market_id } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(base_token, quote_token, undefined, otherToken)\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n const hasBorrow = borrows.length > 0\n // Current collateral value\n const currentDepositAmountUSD = deposits[0].depositedAmountUsd.toString()\n // Current collateral value\n const currentDepositAmount = deposits[0].depositedAmount.toString()\n // Current debt amount\n const currentBorrowAmount = hasBorrow\n ? d(borrows[0].borrowedAmount.toString()).mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n : d(0)\n // Current debt value\n const currentBorrowAmountUSD = hasBorrow ? borrows[0].borrowedAmountUsd.toString() : d(0)\n const bw = hasBorrow ? d(borrows[0].reserve.config.borrowWeightBps.toString()).div(10000).toString() : '1'\n const openLTV = d(deposits[0].reserve.config.openLtvPct).mul(d(0.95)).div(100).div(bw).toString()\n\n // Leverage difference\n const remainingOpenUSD = d(currentDepositAmountUSD).sub(d(currentBorrowAmountUSD)).mul(openLTV).toString()\n if (isUpLeverage) {\n const flashLoanCtokenAmountUsd = d(currentDepositAmountUSD).div(current_leverage).mul(laverageDiff)\n const afterLTV = flashLoanCtokenAmountUsd.add(currentBorrowAmountUSD).div(currentDepositAmountUSD).toString()\n\n const flashLoanCtokenAmount = flashLoanCtokenAmountUsd\n .div(is_long ? quotePrice : basePrice)\n .mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toDP(0, Decimal.ROUND_UP)\n // Flash loan is needed when leverage difference exceeds maximum open amount\n const isFlashLoan = d(afterLTV).gt(openLTV)\n const flashLoanAmount = flashLoanCtokenAmount\n // Amount needed for increasing leverage, borrowed from flash loan\n // Convert flash loan borrowed portion to collateral\n const from = is_long ? quote_token : base_token\n const to = is_long ? base_token : quote_token\n const routers = await this._sdk.SwapModules.findRouters(from, to, flashLoanAmount.toString(), true, [swap_clmm_pool])\n // Collateral amount\n const depositAmount = d(routers?.amount_out.toString()).toString()\n // Collateral value\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n let flashLoanFee\n let isLoanA\n let clmm_fee_tier\n let clmm_pool_coin_type_a\n let clmm_pool_coin_type_b\n let borrowAmount = '0'\n let borrowAmountUSD = '0'\n if (isFlashLoan) {\n const {\n clmm_pool_coin_type_a: flashLoanClmmPoolCoinTypeA,\n clmm_pool_coin_type_b: flashLoanClmmPoolCoinTypeB,\n clmm_pool,\n clmm_fee_tier: flashLoanClmmFeeTier,\n } = await this._sdk.SwapModules.getFlashLoanPool(from, flashLoanAmount.toString())\n clmm_fee_tier = flashLoanClmmFeeTier\n clmm_pool_coin_type_a = flashLoanClmmPoolCoinTypeA\n clmm_pool_coin_type_b = flashLoanClmmPoolCoinTypeB\n // Remaining available amount for opening position\n flashLoanFee = flashLoanAmount.mul(clmm_fee_tier).toString()\n isLoanA = is_long ? clmm_pool_coin_type_a == quote_token : clmm_pool_coin_type_b == base_token\n\n // Collateralize\n // Borrow assets to repay flash loan\n const debtAmount = d(flashLoanAmount).add(flashLoanFee).toDP(0, Decimal.ROUND_UP)\n borrowAmount = debtAmount.toString()\n borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n } else {\n borrowAmount = flashLoanCtokenAmount.toString()\n borrowAmountUSD = flashLoanCtokenAmountUsd.toString()\n }\n\n const afterDepositAmount = d(currentDepositAmount)\n .add(d(depositAmount).div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n const afterBorrowAmount = d(currentBorrowAmount)\n .add(d(borrowAmount))\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n\n return {\n amount_in: routers?.amount_in.toString(),\n amount_out: routers?.amount_out.toString(),\n flash_loan_fee: flashLoanFee,\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n flash_loan_amount: flashLoanAmount,\n base_token,\n quote_token,\n reserve,\n deposits,\n borrows,\n clmm_fee_tier,\n is_flash_loan: isFlashLoan,\n is_loan_a: isLoanA,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n after_deposit_amount: afterDepositAmount,\n after_borrow_amount: afterBorrowAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n position_cap_id,\n market_id,\n is_long,\n routers,\n }\n } else {\n // User net worth\n const netValue = d(currentDepositAmountUSD).div(current_leverage)\n // Repayment amount needed for decreasing leverage\n const repayAmount = netValue\n .mul(laverageDiff.abs())\n .div(is_long ? quotePrice : basePrice)\n .mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toDP(0, Decimal.ROUND_UP)\n // Given repayment amount, calculate how much collateral asset needs to be withdrawn\n const routers = await this._sdk.SwapModules.findRouters(\n deposits[0].reserve.coinType,\n borrows[0].reserve.coinType,\n repayAmount.toString(),\n false,\n [swap_clmm_pool]\n )\n // Amount of collateral asset to withdraw\n const withdrawCtokenAmount = routers?.amount_in.toString()\n const withdrawCtokenAmountUsd = d(withdrawCtokenAmount)\n .mul(is_long ? basePrice : quotePrice)\n .div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toString()\n const openLtvAmountUSD = d(currentDepositAmountUSD).mul(openLTV).toString()\n\n const afterLTV = d(currentBorrowAmountUSD)\n .div(d(currentDepositAmountUSD).sub(d(withdrawCtokenAmountUsd)))\n .toString()\n\n // Flash loan is needed when leverage difference exceeds maximum open amount\n const isFlashLoan = d(afterLTV).gt(openLTV)\n const borrowAmount = repayAmount.toString()\n const borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n const depositAmount = withdrawCtokenAmount\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n let clmm_fee_tier\n let clmm_pool_coin_type_a = ''\n let clmm_pool_coin_type_b = ''\n if (isFlashLoan) {\n const {\n clmm_pool_coin_type_a: flashLoanClmmPoolCoinTypeA,\n clmm_pool_coin_type_b: flashLoanClmmPoolCoinTypeB,\n clmm_pool,\n clmm_fee_tier: flashLoanClmmFeeTier,\n } = await this._sdk.SwapModules.getFlashLoanPool(borrows[0].reserve.coinType, borrowAmount.toString())\n clmm_fee_tier = flashLoanClmmFeeTier\n clmm_pool_coin_type_a = flashLoanClmmPoolCoinTypeA\n clmm_pool_coin_type_b = flashLoanClmmPoolCoinTypeB\n }\n\n const afterDepositAmount = d(currentDepositAmount)\n .sub(d(depositAmount).div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n const afterBorrowAmount = d(currentBorrowAmount)\n .sub(d(borrowAmount))\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n\n return {\n amount_in: routers?.amount_in.toString(),\n amount_out: routers?.amount_out.toString(),\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n base_token,\n quote_token,\n reserve,\n deposits,\n borrows,\n clmm_fee_tier,\n withdraw_ctoken_amount: withdrawCtokenAmount,\n is_flash_loan: isFlashLoan,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n after_deposit_amount: afterDepositAmount,\n after_borrow_amount: afterBorrowAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n position_cap_id,\n market_id,\n is_long,\n routers,\n }\n }\n }\n\n calculatePositionRepay = async (params: CalculatePositionRepayParams) => {\n const { position_id, amount, is_quote } = params\n const { borrows, deposits, is_long, market_id, position_cap_id } = await this._sdk.PositionModules.getPositionInfo(position_id)\n const repayCoinType = borrows[0].reserve.coinType\n const baseToken = is_long ? deposits[0].reserve.coinType : borrows[0].reserve.coinType\n const quoteToken = is_long ? borrows[0].reserve.coinType : deposits[0].reserve.coinType\n let routers: any\n\n const hasSwap = is_long ? !is_quote : is_quote\n if (hasSwap) {\n routers = await this._sdk.SwapModules.findRouters(is_quote ? quoteToken : baseToken, repayCoinType, amount, true, [])\n }\n return {\n routers,\n repay_coin_type: repayCoinType,\n base_token: baseToken,\n quote_token: quoteToken,\n is_long,\n borrows,\n deposits,\n market_id,\n position_cap_id,\n has_swap: hasSwap,\n }\n }\n}\n","/*\r\n * bignumber.js v9.3.1\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // The index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne + (id === 2 && e > ne);\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","/*!\r\n * decimal.js v10.6.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|bigint|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Infinity or NaN?\r\n if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n if (t === 'bigint') {\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import type { CetusMarginTradingSDK } from '../sdk'\nimport { SuilendClient } from '@suilend/sdk/client'\nimport {\n initializeSuilend,\n initializeSuilendRewards,\n initializeObligations,\n formatRewards,\n Side,\n getFilteredRewards,\n getStakingYieldAprPercent,\n getDedupedPerDayRewards,\n getDedupedAprRewards,\n getTotalAprPercent,\n getNetAprPercent,\n PerDayRewardSummary,\n AprRewardSummary,\n} from '@suilend/sdk'\nimport { AllAppData, Price } from '../types'\nimport BigNumber from 'bignumber.js'\nimport { calculateBorrowAprPercent, calculateDepositAprPercent, getPriceWithFormattedDecimals } from '../utils/suiLend'\nimport { d, getPackagerConfigs, removeHexPrefix } from '@cetusprotocol/common-sdk'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { Reserve } from '@suilend/sdk/_generated/suilend/reserve/structs'\nimport { toHEX } from '@mysten/sui/utils'\nimport Decimal from 'decimal.js'\nimport { SuiLendCoinAprResult } from '../types'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class SuiLendModule {\n private sdk: CetusMarginTradingSDK\n\n // Cache variables\n lendingMarketCache?: AllAppData\n obligationsCache?: Record<string, any>\n\n // Add suilendClient cache\n private suilendClientCache?: Record<string, SuilendClient>\n\n constructor(sdk: CetusMarginTradingSDK) {\n this.sdk = sdk\n }\n\n /**\n * Get or initialize SuilendClient\n * @param lending_market_id Lending market ID\n * @param lending_market_type Lending market type\n */\n async getSuilendClient(lending_market_id: string, lending_market_type: string): Promise<SuilendClient> {\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n\n if (!this.suilendClientCache) {\n this.suilendClientCache = {}\n }\n\n if (!this.suilendClientCache[cacheKey]) {\n this.suilendClientCache[cacheKey] = await SuilendClient.initialize(lending_market_id, lending_market_type, this.sdk.FullClient, true)\n }\n\n return this.suilendClientCache[cacheKey]\n }\n\n /**\n * Get lending market data (cached)\n * @param force_refresh Whether to force refresh\n */\n async getLendingMarketData(force_refresh = true): Promise<AllAppData> {\n const cacheKey = 'lendingMarketData'\n const cachedData = this.sdk.getCache<AllAppData>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const lendingMarkets = getPackagerConfigs(this.sdk.sdkOptions?.suilend)?.lending_market || []\n console.log('🚀🚀🚀 ~ suilendModule.ts:67 ~ SuiLendModule ~ getLendingMarketData ~ lendingMarkets:', lendingMarkets)\n\n if (!lendingMarkets.length) {\n console.warn('⚠️ No lending markets configured.')\n return {} as AllAppData\n }\n\n try {\n const [allLendingMarketData, lstAprPercentMap] = await Promise.all([\n (async () => {\n const allLendingMarketData: AllAppData['allLendingMarketData'] = Object.fromEntries(\n await Promise.all(\n lendingMarkets.map(async (LENDING_MARKET) => {\n // Use cached SuilendClient\n const suilendClient = await this.getSuilendClient(LENDING_MARKET.id, LENDING_MARKET.type)\n\n const {\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n } = await initializeSuilend(this.sdk.FullClient, suilendClient)\n\n const { rewardPriceMap } = await initializeSuilendRewards(reserveMap, activeRewardCoinTypes)\n\n return [\n LENDING_MARKET.id,\n {\n suilendClient,\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardPriceMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n },\n ]\n })\n )\n )\n return allLendingMarketData\n })(),\n (async () => {\n try {\n const res = await fetch(`${this.sdk.sdkOptions?.suilend?.config?.api_url}/springsui/apy`)\n const json: Record<string, string> = await res.json()\n if ((res as any)?.statusCode === 500) throw new Error('Failed to fetch SpringSui LST APRs')\n\n return Object.fromEntries(Object.entries(json).map(([coinType, aprPercent]) => [coinType, new BigNumber(aprPercent)]))\n } catch (err) {\n console.error(err)\n return {} as AllAppData['lstAprPercentMap']\n }\n })(),\n ])\n\n // Store in cache\n this.sdk.updateCache(cacheKey, { allLendingMarketData, lstAprPercentMap }, 30 * 1000)\n\n return { allLendingMarketData, lstAprPercentMap }\n } catch (error) {\n console.log('🚀 getLendingMarketData error:', error)\n throw error\n }\n }\n\n /**\n * Get obligations data (cached)\n * @param all_app_data Lending market data (optional)\n * @param force_refresh Whether to force refresh\n */\n async getInitializeObligations(all_app_data?: AllAppData, force_refresh = false): Promise<any> {\n if (!force_refresh && this.obligationsCache) {\n return this.obligationsCache\n }\n\n if (!all_app_data) {\n all_app_data = await this.getLendingMarketData(false)\n }\n\n const result: Record<string, any> = {}\n for (const appData of Object.values(all_app_data.allLendingMarketData)) {\n const { obligationOwnerCaps, obligations } = await initializeObligations(\n this.sdk.FullClient,\n appData.suilendClient,\n appData.refreshedRawReserves,\n appData.reserveMap,\n this.sdk.senderAddress\n )\n\n if (obligations.length > 0) {\n console.log(\n '🚀🚀🚀 ~ suilendModule.ts:181 ~ SuiLendModule ~ getInitializeObligations ~ obligations:',\n obligations[0].original.allowedBorrowValueUsd.value.toString()\n )\n }\n\n const rewardMap = formatRewards(\n appData.reserveMap,\n appData.rewardCoinMetadataMap,\n appData.rewardPriceMap as Record<string, BigNumber | undefined>,\n obligations\n )\n\n result[appData.lendingMarket.id] = {\n obligationOwnerCaps,\n obligations,\n rewardMap,\n }\n }\n\n // Store in cache\n this.obligationsCache = result\n\n return this.obligationsCache\n }\n\n getCoinAprByAmount = async (coin_type: string, amount: Decimal, side: Side): Promise<SuiLendCoinAprResult> => {\n const changeAmount = new BigNumber(amount.toString())\n const { allLendingMarketData, lstAprPercentMap } = await this.getLendingMarketData(false)\n await this.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n if (!allLendingMarketData || !lstAprPercentMap) {\n throw new Error('lendingMarketCache is not initialized')\n }\n\n const list: any = Object.values(allLendingMarketData ?? {})[0]\n const reserve = list.lendingMarket.reserves.find((r: any) => r.coinType === coin_type)\n if (!reserve) {\n throw new Error('reserve not found')\n }\n const currentUserData = this.obligationsCache?.[list.lendingMarket.id]\n const rewards = currentUserData.rewardMap[reserve.token.coinType]?.[side] ?? []\n\n const filteredRewards = getFilteredRewards(rewards)\n\n const stakingYieldAprPercent = getStakingYieldAprPercent(side, reserve.coinType, lstAprPercentMap)\n\n const aprPercent = side === Side.DEPOSIT ? reserve.depositAprPercent : reserve.borrowAprPercent\n let newAprPercent: BigNumber | undefined = aprPercent\n\n let rewardsAprMultiplier = new BigNumber(1)\n let isRewardsAprMultiplierValid = true\n\n const showChange = side !== undefined && changeAmount !== undefined && changeAmount.gt(0)\n if (showChange) {\n const newReserve = {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(side === Side.DEPOSIT ? changeAmount : changeAmount.negated()), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(side === Side.BORROW ? changeAmount : changeAmount.negated()), 0)\n : reserve.borrowedAmount,\n }\n newAprPercent = side === Side.DEPOSIT ? calculateDepositAprPercent(newReserve) : calculateBorrowAprPercent(newReserve)\n\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount\n\n // Assumes LM rewards are distributed proportionally to the reserve size\n rewardsAprMultiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount)\n isRewardsAprMultiplierValid = !rewardsAprMultiplier.eq(-1)\n }\n\n // Per day rewards\n const perDayRewards = getDedupedPerDayRewards(filteredRewards)\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isRewardsAprMultiplierValid ? r.stats.perDay.times(rewardsAprMultiplier) : undefined,\n },\n })) as PerDayRewardSummary[]\n\n // APR rewards\n const aprRewards = getDedupedAprRewards(filteredRewards)\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isRewardsAprMultiplierValid ? r.stats.aprPercent.times(rewardsAprMultiplier) : undefined,\n },\n })) as AprRewardSummary[]\n\n // Total APR\n const totalAprPercent = getTotalAprPercent(side, aprPercent, filteredRewards, stakingYieldAprPercent)\n const newTotalAprPercent =\n newAprPercent === undefined || newAprRewards.some((reward) => reward.stats.aprPercent === undefined)\n ? undefined\n : getTotalAprPercent(side, newAprPercent, newAprRewards, stakingYieldAprPercent)\n console.log('🚀🚀🚀 ~ suilendModule.ts:315 ~ SuiLendModule ~ newTotalAprPercent:', newTotalAprPercent?.toString())\n\n return {\n new_total_apr_percent: newTotalAprPercent?.toString(),\n total_apr_percent: totalAprPercent.toString(),\n }\n }\n\n /**\n * Get user lending data\n * @param obligation_id Obligation ID (optional)\n * @param force_refresh Whether to force refresh\n */\n async getSuiLendUserData(obligation_id: string, force_refresh = false) {\n const { allLendingMarketData, lstAprPercentMap } = await this.getLendingMarketData(false)\n const obligations = await this.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, false)\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n const userData = obligations[lending_market_id]\n if (!userData) {\n throw new Error(`No user data found for lending market: ${lending_market_id}`)\n }\n const obligation = userData.obligations.find((o: any) => o.id === obligation_id)\n if (!obligation) {\n throw new Error(`Obligation not found: ${obligation_id}`)\n }\n\n const netAprPercent = getNetAprPercent(obligation, userData.rewardMap, lstAprPercentMap ?? {})\n\n return {\n obligation,\n netAprPercent,\n deposits: obligation.deposits,\n borrowedAmount: obligation.borrowedAmount,\n depositedAmount: obligation.depositedAmount,\n netValueUsd: obligation.netValueUsd,\n rewardMap: userData.rewardMap,\n }\n }\n\n // Update contract oracle price\n refreshReservePrice = async (tx: Transaction, price_object_id: string, reserve_array_index: bigint) => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n if (!this.suilendClientCache) {\n throw new Error('suilendClientCache is not initialized')\n }\n const priceInfoObjectId = await this.suilendClientCache[cacheKey].pythClient.getPriceFeedObjectId(price_object_id)\n\n this.suilendClientCache[cacheKey].refreshReservePrices(tx, priceInfoObjectId as string, reserve_array_index)\n }\n\n // Get oracle price\n getLatestPriceFeeds = async (reserves: Reserve<string>[], force_refresh = false) => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n const priceMap: Record<string, Price> = {}\n const notFindList = []\n reserves.forEach((item) => {\n const data = this.sdk.getCache<Price>(`getLatestPrice_${item.coinType.name}`, force_refresh)\n if (data && this.priceCheck(data, 60)) {\n priceMap[item.coinType.name] = data\n } else {\n notFindList.push(item.coinType.name)\n }\n })\n if (notFindList.length == 0) {\n return priceMap\n }\n\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n if (!this.suilendClientCache) {\n throw new Error('suilendClient is not initialized')\n }\n const priceIdentifiers = Array.from(\n new Set(\n reserves.map((r) =>\n r?.priceIdentifier?.bytes ? toHEX(new Uint8Array(r.priceIdentifier.bytes)) : removeHexPrefix(r.priceIdentifier.toString())\n )\n )\n )\n const priceUpdateData = await this.suilendClientCache[cacheKey].pythConnection.getLatestPriceFeeds(priceIdentifiers as string[])\n\n priceUpdateData?.forEach((priceFeed, index) => {\n const priceObj = priceFeed.getPriceUnchecked()\n const info: any = reserves[index]\n if (priceObj) {\n const { price, expo } = priceObj\n // Adjust the price based on the exponent (decimals)\n const realPrice = d(price)\n .mul(d(10).pow(d(expo)))\n .toString()\n const data: Price = {\n coin_type: info.coinType.name || info.coinType,\n price: realPrice,\n oracle_price: 0n,\n last_update_time: priceObj.publishTime,\n }\n // Calculate the formatted oracle price and update the map\n data.oracle_price = getPriceWithFormattedDecimals(BigInt(price), BigInt(expo))\n priceMap[info.coinType.name || info.coinType] = data\n this.sdk.updateCache(`getLatestPrice_${data.coin_type}`, data)\n }\n })\n return priceMap\n }\n\n getLatestPriceFeedsByCoinTypes = async (coin_types: string[], force_refresh = false) => {\n try {\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n const { allLendingMarketData } = await this.getLendingMarketData(false)\n const reservesInfo: Reserve<string>[] = []\n coin_types.forEach((coinType) => {\n const reserve: any = allLendingMarketData[lending_market_id].reserveMap[coinType]\n reservesInfo.push(reserve)\n })\n const priceMap = await this.getLatestPriceFeeds(reservesInfo, force_refresh)\n return priceMap\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return undefined\n }\n }\n\n priceCheck(price: Price, age = 60) {\n const currentTime = Math.floor(Date.now() / 1000)\n if (Math.abs(currentTime - price.last_update_time) > age) {\n return undefined\n }\n\n return price\n }\n\n // Get suiLend reserve information\n getSuiLendReserveInfo = async (\n base_token: string,\n quote_token: string,\n all_lending_market_data?: AllAppData['allLendingMarketData'],\n other_token?: string[]\n ) => {\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n // If no data is passed, fetch it (using cache)\n if (!all_lending_market_data) {\n const data = await this.getLendingMarketData(false)\n all_lending_market_data = data.allLendingMarketData\n }\n\n const baseReserve = all_lending_market_data[lending_market_id].reserveMap[base_token]\n const quoteReserve = all_lending_market_data[lending_market_id].reserveMap[quote_token]\n const refreshedBaseRawReserves = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(base_token)\n })\n const refreshedQuoteRawReserves = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(quote_token)\n })\n const baseReserveMapInfo = all_lending_market_data[lending_market_id].reserveMap[base_token]\n const quoteReserveMapInfo = all_lending_market_data[lending_market_id].reserveMap[quote_token]\n\n let refreshedOtherRawReserves: Reserve<string>[] = []\n if (other_token) {\n other_token.forEach((token) => {\n const reserve = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(token)\n })\n refreshedOtherRawReserves.push(...reserve)\n })\n }\n\n return {\n base_reserve_array_index: baseReserve.arrayIndex.toString(),\n quote_reserve_array_index: quoteReserve.arrayIndex.toString(),\n reserve: [refreshedBaseRawReserves[0], refreshedQuoteRawReserves[0], ...refreshedOtherRawReserves],\n base_reserve_map_info: baseReserveMapInfo,\n quote_reserve_map_info: quoteReserveMapInfo,\n }\n }\n\n refreshReservePrices = async (tx: Transaction, reserve: Reserve<string>[]) => {\n for (let i = 0; i < reserve.length; i++) {\n const priceObjectId = toHEX(new Uint8Array(reserve[i].priceIdentifier.bytes))\n await this.refreshReservePrice(tx, priceObjectId, BigInt(reserve[i].arrayIndex))\n }\n }\n\n refreshReservePricesV2 = async (tx: Transaction, reserve: Reserve<string>[]) => {\n for (let i = 0; i < reserve.length; i++) {\n const priceObjectId = reserve[i].priceIdentifier.toString()\n await this.refreshReservePrice(tx, priceObjectId, BigInt(reserve[i].arrayIndex))\n }\n }\n}\n","import { AprRewardSummary, linearlyInterpolate, ParsedReserve, PerDayRewardSummary, Side } from \"@suilend/sdk\";\nimport { CetusMarginTradingSDK } from \"../sdk\";\nimport { NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE, NORMALIZED_LBTC_COINTYPE, formatLtvPercent } from '@suilend/sui-fe'\nimport BigNumber from \"bignumber.js\";\nimport { v4 as uuidv4 } from 'uuid'\nimport { getPackagerConfigs } from \"@cetusprotocol/common-sdk\";\nexport const oraclePriceMultiplierDecimal = 10n\n\nexport function calculateUtilizationPercent(reserve: ParsedReserve): BigNumber {\n return reserve.depositedAmount.eq(0)\n ? new BigNumber(0)\n : reserve.borrowedAmount.div(reserve.depositedAmount).times(100);\n}\n\nexport function calculateBorrowAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n if (utilizationPercent.gt(100)) return undefined;\n\n return linearlyInterpolate(\n reserve.config.interestRate,\n \"utilPercent\",\n \"aprPercent\",\n utilizationPercent,\n );\n}\n\nexport function calculateDepositAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n const borrowAprPercent = calculateBorrowAprPercent(reserve);\n\n if (borrowAprPercent === undefined || utilizationPercent.gt(100)) return undefined;\n\n return new BigNumber(utilizationPercent.div(100))\n .times(borrowAprPercent.div(100))\n .times(1 - reserve.config.spreadFeeBps / 10000)\n .times(100);\n}\n\nexport function appendExtraRewards(\n side: Side,\n reserve: ParsedReserve,\n filteredRewards: any[],\n sdk: CetusMarginTradingSDK,\n) {\n const { api_url } = getPackagerConfigs(sdk.sdkOptions.suilend)\n if (side === Side.DEPOSIT) {\n if ([NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE].includes(reserve.coinType)) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LIQ_AG\",\n mintDecimals: 0,\n symbol: \"LiqAg Points\",\n iconUrl: `${api_url}/partners/LiqAg.png`,\n perDay: new BigNumber(0.036),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n\n if (reserve.coinType === NORMALIZED_LBTC_COINTYPE) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LOMBARD\",\n mintDecimals: 0,\n symbol: \"3x Lombard Lux\",\n iconUrl: `${api_url}/partners/Lombard Lux.png`,\n perDay: new BigNumber(0),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n }\n}\n\nexport function getUpdatedReserve(reserve: ParsedReserve, side: Side, changeAmount: BigNumber): ParsedReserve {\n return {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(changeAmount), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(changeAmount), 0)\n : reserve.borrowedAmount,\n };\n}\n\n\nexport function getRewardsAprMultiplier(\n side: Side,\n reserve: ParsedReserve,\n newReserve: ParsedReserve\n): { multiplier: BigNumber; isValid: boolean } {\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount;\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount;\n\n const multiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount);\n return { multiplier, isValid: !multiplier.eq(-1) };\n}\n\n\nexport function updateRewardsWithMultiplier(\n perDayRewards: PerDayRewardSummary[],\n aprRewards: AprRewardSummary[],\n multiplier: BigNumber,\n isValid: boolean\n) {\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isValid ? r.stats.perDay.times(multiplier) : undefined,\n },\n })) as PerDayRewardSummary[];\n\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isValid ? r.stats.aprPercent.times(multiplier) : undefined,\n },\n })) as AprRewardSummary[];\n\n return { newPerDayRewards, newAprRewards };\n}\n\n\n\n\nexport function getPriceWithFormattedDecimals(\n pythPrice: bigint,\n expo: bigint // expo represents the decimal exponent\n): bigint {\n // Check if the required price multiplier is defined\n if (!oraclePriceMultiplierDecimal) {\n throw new Error('oraclePriceMultiplierDecimal is required')\n }\n\n // Price must be greater than 0\n if (pythPrice === 0n) {\n throw new Error('Invalid oracle price')\n }\n\n // If expo is negative, the price needs to be scaled up\n if (expo < 0n) {\n // Calculate the scale factor for negative expo values\n const scaleFactor = 10n ** (oraclePriceMultiplierDecimal - -expo) // Convert expo to a positive number\n return pythPrice * scaleFactor // Scale up the price\n }\n\n // If expo is positive, the price needs to be scaled down\n return pythPrice / 10n ** (expo + oraclePriceMultiplierDecimal)\n}\n\nexport function formatLtvPercentValue(value: string) {\n return formatLtvPercent(new BigNumber(value))\n}","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import Decimal from 'decimal.js'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { FindRouterParams } from '@cetusprotocol/aggregator-sdk'\nimport BN from 'bn.js'\nimport { addHexPrefix, CoinAssist, d, getPackagerConfigs, removeHexPrefix } from '@cetusprotocol/common-sdk'\nimport { CalculateFlashLoanParams, FlashLoanParams, RepayFlashSwapParams, RouterSwapParams } from '../types'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class SwapModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n /**\n * Find router\n */\n public async findRouters(coin_type_a: string, coin_type_b: string, amount: string, by_amount_in: boolean, pools: string[]) {\n try {\n const findRouterParams: FindRouterParams = {\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(d(amount).toFixed(0).toString()),\n byAmountIn: by_amount_in,\n depth: 3,\n }\n const res = await this._sdk.AggregatorClient.findRouters(findRouterParams)\n if (res?.error?.code === 10001) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (res?.insufficientLiquidity) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (!res?.paths || res?.paths?.length === 0) {\n throw Error('Aggregator no router')\n }\n\n return {\n amount_in: res.amountIn.toString(),\n amount_out: res.amountOut.toString(),\n is_exceed: res.insufficientLiquidity,\n route_obj: res,\n by_amount_in: true,\n origin_res: res,\n }\n } catch (error) {\n try {\n if (pools) {\n const res: any = await this._sdk.AggregatorClient.swapInPools({\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(d(amount).toFixed(0).toString()),\n byAmountIn: by_amount_in,\n pools,\n })\n\n if (res) {\n return {\n amount_in: res.routeData.amountIn.toString(),\n amount_out: res.routeData.amountOut.toString(),\n is_exceed: res.isExceed,\n route_obj: res.routeData,\n by_amount_in: true,\n origin_res: res,\n }\n }\n return null\n }\n return null\n } catch (e) {\n return null\n }\n }\n }\n\n /**\n * Execute router swap\n */\n public routerSwap = async (params: RouterSwapParams) => {\n const { slippage, txb, input_coin, router } = params\n const tx = txb || new Transaction()\n if (router) {\n return await this._sdk.AggregatorClient.routerSwap({ router, inputCoin: input_coin, slippage, txb: tx })\n }\n }\n\n /**\n * Check if swap is needed and handle swap logic\n * @param params Parameter object\n * @returns Swap result\n */\n async handleSwapLogic(params: {\n is_long: boolean\n is_quote: boolean\n amount: string\n base_token: string\n quote_token: string\n swap_clmm_pool: string\n slippage: number\n tx: Transaction\n }) {\n const { is_long, is_quote, amount, base_token, quote_token, swap_clmm_pool = '', slippage, tx } = params\n\n // Check if swap is needed\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n\n let depositCoin: any\n let swapOutCoin: any\n let initDepositAmount = amount\n\n if (hasSwap) {\n // Long positions need to convert to base, short positions need to convert to quote\n // Determine swap from and to\n const from = is_long && is_quote ? quote_token : base_token\n const to = is_long && is_quote ? base_token : quote_token\n const routers = await this.findRouters(from, to, amount, true, [swap_clmm_pool])\n initDepositAmount = routers?.amount_out.toString()\n if (routers) {\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount), from, tx)\n swapOutCoin = await this.routerSwap({\n router: routers.route_obj,\n slippage,\n input_coin: inputCoin,\n txb: tx,\n })\n depositCoin = swapOutCoin\n }\n } else {\n depositCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n return {\n has_swap: hasSwap,\n input_coin: depositCoin,\n init_deposit_amount: initDepositAmount,\n }\n }\n\n async handleSwap(params: {\n from: string\n to: string\n amount: string\n input_coin?: TransactionObjectArgument\n swap_clmm_pool: string\n slippage: number\n tx: Transaction\n }) {\n const { swap_clmm_pool = '', slippage, amount, from, to, tx, input_coin } = params\n\n // Find router\n const routers: any = await this.findRouters(from, to, amount, true, [swap_clmm_pool])\n const amountOut = routers.amount_out.toString()\n const swapOutCoin = await this.routerSwap({\n router: routers.route_obj,\n slippage,\n input_coin: input_coin || CoinAssist.buildCoinWithBalance(BigInt(amount), from, tx),\n txb: tx,\n })\n\n return {\n swap_out_coin: swapOutCoin,\n amount_out: amountOut,\n }\n }\n\n /**\n * Execute flash loan\n */\n flashLoan = (params: FlashLoanParams) => {\n console.log('🚀🚀🚀 ~ swapModules.ts:183 ~ SwapModules ~ params:', params)\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { amount, clmm_pool: clmmPool, clmm_pool_coin_type_a, clmm_pool_coin_type_b, flash_loan_coin, tx } = params\n const isLoanA = addHexPrefix(clmm_pool_coin_type_a) === flash_loan_coin\n console.log('🚀🚀🚀 ~ swapModules.ts:188 ~ SwapModules ~ isLoanA:', isLoanA)\n\n const [balanceA, balanceB, receipt] = tx.moveCall({\n target: `${clmm_pool.published_at}::pool::flash_loan`,\n arguments: [tx.object(global_config_id), tx.object(clmmPool), tx.pure.bool(isLoanA), tx.pure.u64(amount.toString())],\n typeArguments: [clmm_pool_coin_type_a, clmm_pool_coin_type_b],\n })\n return {\n balance_a: balanceA,\n balance_b: balanceB,\n receipt,\n is_loan_a: isLoanA,\n loan_coin_type: isLoanA ? clmm_pool_coin_type_a : clmm_pool_coin_type_b,\n }\n }\n\n /** Get flash loan pool */\n getFlashLoanPool = async (flash_loan_coin: string, flash_amount: string) => {\n console.log('🚀🚀🚀 ~ swapModules.ts:201 ~ SwapModules ~ flash_amount:', flash_amount, flash_loan_coin)\n try {\n const res = await fetch(\n `https://api-sui.cetus.zone/v3/sui/margin_trading/pools?coin_type=${flash_loan_coin}&min_amount=${flash_amount}`\n )\n const { data } = await res.json()\n console.log('🚀🚀🚀 ~ swapModules.ts:206 ~ SwapModules ~ data:', data)\n if (data && data.length > 0) {\n return {\n clmm_pool_coin_type_a: data[0].coin_type_a,\n clmm_pool_coin_type_b: data[0].coin_type_b,\n clmm_pool: data[0].pool_id,\n clmm_fee_tier: d(data[0].fee_rate).div(1000000).toString(),\n }\n } else {\n handleError(MarginTradingErrorCode.FlashLoanPoolNotFound, 'FlashLoanPoolNotFound')\n return {\n clmm_pool_coin_type_a: '',\n clmm_pool_coin_type_b: '',\n clmm_pool: '',\n clmm_fee_tier: '',\n }\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {\n clmm_pool_coin_type_a: '',\n clmm_pool_coin_type_b: '',\n clmm_pool: '',\n clmm_fee_tier: '',\n }\n }\n }\n\n /**\n * Repay flash loan\n */\n public repayFlashLoan = (params: RepayFlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { tx, repay_base, repay_quote, receipt, clmm_pool: clmmPool, clmm_pool_coin_type_a, clmm_pool_coin_type_b } = params\n tx.moveCall({\n target: `${clmm_pool.published_at}::pool::repay_flash_loan`,\n arguments: [tx.object(global_config_id), tx.object(clmmPool), repay_base, repay_quote, receipt],\n typeArguments: [clmm_pool_coin_type_a, clmm_pool_coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Calculate flash loan\n */\n async calculateFlashLoan(params: CalculateFlashLoanParams) {\n const { is_long, leverage, base_token, quote_token, deposit_amount, reserve, base_token_decimal, quote_token_decimal } = params\n\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve)\n const quotePrice = priceUpdateData && priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData && priceUpdateData[removeHexPrefix(base_token)]?.price\n\n // For long positions calculate base to quote rate, for short positions calculate quote to base rate\n const rate = is_long ? d(basePrice).div(d(quotePrice)).toString() : d(quotePrice).div(d(basePrice)).toString()\n\n // Flash loan amount = user deposit amount * (leverage - 1) * rate / (baseTokenDecimal / quoteTokenDecimal)\n console.log(\n '🚀🚀🚀 ~ swapModules.ts:267 ~ SwapModules ~ calculateFlashLoan ~ deposit_amount:',\n deposit_amount,\n rate,\n base_token_decimal,\n quote_token_decimal\n )\n const flashAmount = d(deposit_amount)\n .mul(d(leverage).sub(1))\n .mul(rate)\n .div(10 ** (is_long ? base_token_decimal : quote_token_decimal))\n .mul(10 ** (is_long ? quote_token_decimal : base_token_decimal))\n .toDP(0, Decimal.ROUND_UP)\n .toString()\n console.log(\n '🚀🚀🚀 ~ swapModules.ts:274 ~ SwapModules ~ calculateFlashLoan ~ flashAmount:',\n d(deposit_amount)\n .mul(d(leverage).sub(1))\n .mul(rate)\n .div(10 ** (is_long ? base_token_decimal : quote_token_decimal))\n .mul(10 ** (is_long ? quote_token_decimal : base_token_decimal))\n .toString(),\n flashAmount\n )\n\n // Coin to borrow for flash loan\n const flashLoanCoin = is_long ? quote_token : base_token\n const { clmm_pool_coin_type_a, clmm_fee_tier, clmm_pool, clmm_pool_coin_type_b } = await this.getFlashLoanPool(\n flashLoanCoin,\n flashAmount\n )\n // Whether to borrow tokenA from clmm pool\n const isFlashA = clmm_pool_coin_type_a === flashLoanCoin\n // Flash loan fee\n const flashLoanFee = d(flashAmount).mul(clmm_fee_tier).toString()\n\n return {\n flash_amount: flashAmount,\n rate,\n quote_price: quotePrice,\n base_price: basePrice,\n flash_loan_coin: flashLoanCoin,\n is_flash_a: isFlashA,\n flash_loan_fee: flashLoanFee,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_fee_tier,\n }\n }\n}\n","import { CetusMarginTradingSDK, SdkOptions } from \"./sdk\";\n\nexport * from './config'\nexport * from './utils'\nexport * from './utils/suiLend'\nexport * from './types'\nexport { CetusMarginTradingSDK, SdkOptions };\nexport default CetusMarginTradingSDK;\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","SuiClient","normalizeSuiAddress","SuiPriceServiceConnection","SdkWrapper","CetusClmmSDK","AggregatorClient","Env","FullRpcUrlMainnet","margin_trading_mainnet","CACHE_TIME_5MIN","d","getPackagerConfigs","Transaction","addHexPrefix","d","getObjectFields","parseObligation","getNetAprPercent","getTotalAprPercent","Side","getFilteredRewards","wrapMarketInfo","info","fields","open_permissions_pause","close_permissions_pause","deposit_permissions_pause","withdraw_permissions_pause","borrow_permissions_pause","repay_permissions_pause","wrapMarketPermissions","wrapPosition","position","position_cap_id","mergePositionData","obligation","reserve_map","lst_apr_percent_map","reward_map","obligationData","netAprPercent","firstDeposit","closeLTV","openLTV","cr","ltr","liquidationBuffer","totalBorrowAprPercent","totalSuppliedAPR","borrowedAmountUsd","borrowedAmount","firstBorrow","borrowRewards","permissions","permissionsLength","getFilteredRewards","getStakingYieldAprPercent","getTotalAprPercent","Side","BaseError","MarginTradingError","BaseError","message","error_code","details","e","code","handleError","error","errorDetails","MarketModules","sdk","params","package_id","versioned_id","admin_cap_id","markets","global_config_id","getPackagerConfigs","tx","Transaction","market_id","open_fee_rate","close_fee_rate","txb","base_token","quote_token","market_ids","i","initVersionedEvent","initAdminCapEvent","initGlobalConfigEvent","marketsTableId","error","handleError","force_refresh","cachedData","marketList","moveEventType","warpIds","object","item","marketInfo","wrapMarketInfo","cacheKey","result","CACHE_TIME_5MIN","lending_market_id","allLendingMarketData","lstAprPercentMap","base_reserve_map_info","quote_reserve_map_info","obligations","baseRewards","quoteRewards","baseDepositedAmountUsd","baseBorrowedAmountUsd","baseDepositAprPercent","baseBorrowAprPercent","baseDepositedAmount","baseBorrowedAmount","baseDepositLimit","baseBorrowLimit","quoteDepositedAmountUsd","quoteBorrowedAmountUsd","quoteDepositAprPercent","quoteBorrowAprPercent","quoteDepositedAmount","quoteBorrowedAmount","quoteDepositLimit","quoteBorrowLimit","baseTotalDepositAprPercent","getTotalAprPercent","Side","getFilteredRewards","getStakingYieldAprPercent","baseTotalBorrowAprPercent","quoteTotalDepositAprPercent","quoteTotalBorrowAprPercent","longLiquidity","d","shortLiquidity","baseTokenAvailableDepositAmount","baseTokenAvailableBorrowAmount","quoteTokenAvailableDepositAmount","quoteTokenAvailableBorrowAmount","CLOCK_ADDRESS","getPackagerConfigs","Transaction","PermissionModules","sdk","config","global_config_id","getPackagerConfigs","globalConfig","permissions","open_permissions_pause","close_permissions_pause","deposit_permissions_pause","withdraw_permissions_pause","borrow_permissions_pause","repay_permissions_pause","wrapMarketPermissions","pause","tx","Transaction","txb","versioned_id","admin_cap_id","CLOCK_ADDRESS","market_id","CACHE_TIME_24H","CLOCK_ADDRESS","CoinAssist","d","getObjectFields","getPackagerConfigs","removeHexPrefix","SUI_SYSTEM_STATE_OBJECT_ID","U64_MAX","isNumeric","mathceil","mathfloor","bignumberError","tooManyDigits","BASE","LOG_BASE","MAX_SAFE_INTEGER","POWS_TEN","SQRT_BASE","MAX","clone","configObject","div","convertBase","parseNumeric","P","BigNumber","ONE","DECIMAL_PLACES","ROUNDING_MODE","TO_EXP_NEG","TO_EXP_POS","MIN_EXP","MAX_EXP","CRYPTO","MODULO_MODE","POW_PRECISION","FORMAT","ALPHABET","alphabetHasNormalDecimalDigits","v","alphabet","c","caseChanged","e","i","isNum","len","str","x","intCheck","round","obj","p","n","s","out","maxOrMin","pow2_53","random53bitInt","dp","a","b","k","rand","args","sum","decimal","toBaseOut","baseIn","baseOut","j","arr","arrL","sign","callerIsToString","d","r","xc","y","rm","toFixedPoint","coeffToString","multiply","base","m","temp","xlo","xhi","carry","klo","khi","compare","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","yc","bitFloor","format","id","c0","ne","toExponential","normalise","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","p1","p2","sd","ni","rd","pows10","valueOf","half","isModExp","nIsBig","nIsNeg","nIsOdd","isOdd","t","xLTy","xe","ye","xcL","ycL","ylo","yhi","zc","sqrtBase","rep","g1","g2","groupSeparator","intPart","fractionPart","isNeg","intDigits","md","d0","d1","d2","exp","n0","n1","z","l","min","max","name","zs","bignumber_default","Transaction","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","i","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","r","rep","s","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","compoundDebt","PositionModules","sdk","wallet_address","force_refresh","lending_market_id","lending_market_type","getPackagerConfigs","mappingCacheKey","capIdToPositionIdMap","ownerRes","handleError","suiLendClient","allLendingMarketData","lstAprPercentMap","reserveMap","positionIdList","i","fields","getObjectFields","CACHE_TIME_24H","positionRes","obligations","positionList","positionId","positionCapId","capId","pid","position","wrapPosition","rawObligation","mergeData","mergePositionData","claimableRewards","error","position_id","params","marginTradingConfig","global_config_id","versioned_id","txb","repay_amount","repay_coin_type","repay_coin","repay_reserve_array_index","market_id","position_cap_id","margin_trading_context","tx","Transaction","coin","CoinAssist","CLOCK_ADDRESS","package_id","withdraw_amount","withdraw_reserve_array_index","withdraw_coin_type","exemption","SUI_SYSTEM_STATE_OBJECT_ID","reserve_array_index","borrow_amount","base_token","quote_token","is_long","position_cap","published_at","action","coin_type","amount","marginTradingContext","is_quote","swap_clmm_pool","slippage","leverage","flash_amount","flash_loan_coin","is_flash_a","clmm_pool_coin_type_a","clmm_pool_coin_type_b","clmm_pool","base_reserve_array_index","quote_reserve_array_index","reserve","has_swap","routers","balance_a","balance_b","receipt","debt_from","debt_to","init_deposit_coin","balance_coin_a","balance_coin_b","d","debtSwapResult","deposit_reserve_array_index","borrowCoin","zeroBalance","deposits","borrows","borrow_reserve_array_index","withdraw_ctoken_amount","is_close","swap_convert_all","flash_loan_amount","repay_flash_loan_amount","partial_amount_in","has_flash_loan","flashReceipt","isLoanA","is_loan_a","repayCoin","withdrawCoin","rewardCoin","U64_MAX","swapOutCoin","inputCoin","repayFlashLoanCoin","lendingMarketType","lendingMarketId","current_leverage","target_leverage","is_flash_loan","clmm_fee_tier","flashLoanFee","repayFlashLoanAmount","decimal_default","otherToken","hasSwap","depositCoin","priceUpdateData","quotePrice","removeHexPrefix","basePrice","rate","baseTokenDecimal","quoteTokenDecimal","withdrawAmount","targetCoin","obligation_owner_cap","claimable_rewards","suilend","margin_trading","by_amount_in","is_submit","is_open","positionDeposits","positionBorrows","initDepositAmount","from","to","base_price","quote_price","flash_loan_fee","debtRouters","depositAmount","depositAmountUSD","borrowAmount","borrowAmountUSD","leverageDepositAmount","afterBorrowAmount","afterBorrowAmountUSD","afterDepositAmount","afterDepositAmountUSD","withdraw_max","origin_obligation","base_reserve_map_info","quote_reserve_map_info","ctokenExchangeRate","withdrawAmountUSD","availableWithdrawAmountUSD","ratio","debtBorrow","compoundDebt","repayAmount","flashLoanAmount","clmmFeeTier","clmmPool","clmmPoolCoinTypeA","clmmPoolCoinTypeB","swapConvertAll","partialAmountIn","amountIn","buffer_rate","amountOut","withdrawCtokenAmount","afterBorrowAmountUSDDDecimal","afterDepositAmountUSDDecimal","hasFlashLoan","currentBorrowAmountUSD","afterLTV","ltv","laverageDiff","isUpLeverage","hasBorrow","currentDepositAmountUSD","currentDepositAmount","currentBorrowAmount","bw","openLTV","remainingOpenUSD","flashLoanCtokenAmountUsd","flashLoanCtokenAmount","isFlashLoan","flashLoanClmmPoolCoinTypeA","flashLoanClmmPoolCoinTypeB","flashLoanClmmFeeTier","withdrawCtokenAmountUsd","openLtvAmountUSD","repayCoinType","baseToken","quoteToken","obligationData","reserves","WAD","bignumber_default","poolRewardInfoMap","nowMs","reserveCoinType","reserveArrayIndex","depositsPoolRewards","pr","id","coinType","startTimeMs","endTimeMs","isActive","mintDecimals","globalCumulative","borrowsPoolRewards","userRewardManagers","urm","reward","rewardInfo","globalCumulativePerShare","userCumulativePerShare","pendingRewards","earnedRewards","actualClaimable","price","earnedRewardsFormatted","earnedRewardsUsd","leverageConfig","init_deposit_amount","init_coin_type","input_coin","otherTokens","deposit","borrow","SuilendClient","initializeSuilend","initializeSuilendRewards","initializeObligations","formatRewards","Side","getFilteredRewards","getStakingYieldAprPercent","getDedupedPerDayRewards","getDedupedAprRewards","getTotalAprPercent","getNetAprPercent","linearlyInterpolate","Side","NORMALIZED_flSUI_COINTYPE","NORMALIZED_jugSUI_COINTYPE","NORMALIZED_LBTC_COINTYPE","formatLtvPercent","crypto","rnds8Pool","poolPtr","rng","byteToHex","i","unsafeStringify","arr","offset","crypto","native_default","v4","options","buf","offset","native_default","rnds","rng","i","unsafeStringify","v4_default","getPackagerConfigs","oraclePriceMultiplierDecimal","calculateUtilizationPercent","reserve","bignumber_default","calculateBorrowAprPercent","utilizationPercent","linearlyInterpolate","calculateDepositAprPercent","borrowAprPercent","appendExtraRewards","side","filteredRewards","sdk","api_url","Side","NORMALIZED_flSUI_COINTYPE","NORMALIZED_jugSUI_COINTYPE","v4_default","NORMALIZED_LBTC_COINTYPE","getUpdatedReserve","changeAmount","getRewardsAprMultiplier","newReserve","totalAmount","newTotalAmount","multiplier","updateRewardsWithMultiplier","perDayRewards","aprRewards","isValid","newPerDayRewards","r","newAprRewards","getPriceWithFormattedDecimals","pythPrice","expo","scaleFactor","formatLtvPercentValue","value","formatLtvPercent","d","getPackagerConfigs","removeHexPrefix","toHEX","SuiLendModule","sdk","coin_type","amount","side","changeAmount","bignumber_default","allLendingMarketData","lstAprPercentMap","list","reserve","r","rewards","filteredRewards","getFilteredRewards","stakingYieldAprPercent","getStakingYieldAprPercent","aprPercent","Side","newAprPercent","rewardsAprMultiplier","isRewardsAprMultiplierValid","newReserve","calculateDepositAprPercent","calculateBorrowAprPercent","totalAmount","newTotalAmount","newPerDayRewards","getDedupedPerDayRewards","newAprRewards","getDedupedAprRewards","totalAprPercent","getTotalAprPercent","newTotalAprPercent","reward","tx","price_object_id","reserve_array_index","lending_market_id","lending_market_type","getPackagerConfigs","cacheKey","priceInfoObjectId","reserves","force_refresh","priceMap","notFindList","item","data","priceIdentifiers","toHEX","removeHexPrefix","priceFeed","index","priceObj","info","price","expo","realPrice","d","getPriceWithFormattedDecimals","coin_types","reservesInfo","coinType","error","handleError","base_token","quote_token","all_lending_market_data","other_token","baseReserve","quoteReserve","refreshedBaseRawReserves","refreshedQuoteRawReserves","baseReserveMapInfo","quoteReserveMapInfo","refreshedOtherRawReserves","token","i","priceObjectId","SuilendClient","cachedData","lendingMarkets","LENDING_MARKET","suilendClient","lendingMarket","coinMetadataMap","refreshedRawReserves","reserveMap","reserveCoinTypes","reserveCoinMetadataMap","rewardCoinTypes","activeRewardCoinTypes","rewardCoinMetadataMap","initializeSuilend","rewardPriceMap","initializeSuilendRewards","res","json","err","all_app_data","result","appData","obligationOwnerCaps","obligations","initializeObligations","rewardMap","formatRewards","obligation_id","userData","obligation","o","netAprPercent","getNetAprPercent","age","currentTime","import_bn","Transaction","addHexPrefix","CoinAssist","d","getPackagerConfigs","removeHexPrefix","SwapModules","sdk","params","slippage","txb","input_coin","router","tx","Transaction","clmm_pool","global_config_id","getPackagerConfigs","amount","clmmPool","clmm_pool_coin_type_a","clmm_pool_coin_type_b","flash_loan_coin","isLoanA","addHexPrefix","balanceA","balanceB","receipt","flash_amount","res","data","d","handleError","error","repay_base","repay_quote","coin_type_a","coin_type_b","by_amount_in","pools","findRouterParams","BN","is_long","is_quote","base_token","quote_token","swap_clmm_pool","hasSwap","depositCoin","swapOutCoin","initDepositAmount","from","to","routers","inputCoin","CoinAssist","amountOut","leverage","deposit_amount","reserve","base_token_decimal","quote_token_decimal","priceUpdateData","quotePrice","removeHexPrefix","basePrice","rate","flashAmount","decimal_default","flashLoanCoin","clmm_fee_tier","isFlashA","flashLoanFee","CetusMarginTradingSDK","_CetusMarginTradingSDK","SdkWrapper","options","clmmSDK","SuiLendModule","PermissionModules","MarketModules","PositionModules","SwapModules","AggregatorClient","normalizeSuiAddress","SuiClient","Env","CetusClmmSDK","SuiPriceServiceConnection","margin_trading_mainnet","index_default","CetusMarginTradingSDK"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/marketModules.ts","../src/utils/index.ts","../src/errors/errors.ts","../src/modules/permissionModules.ts","../src/modules/positionModules.ts","../../../node_modules/.pnpm/bignumber.js@9.3.1/node_modules/bignumber.js/bignumber.mjs","../../../node_modules/.pnpm/decimal.js@10.6.0/node_modules/decimal.js/decimal.mjs","../src/modules/suilendModule.ts","../src/utils/suiLend.ts","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/v4.js","../src/modules/swapModules.ts","../src/index.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","// External dependencies - Sui related\nimport { SuiClient } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js'\n\n// External dependencies - Cetus related\nimport type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk'\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk'\n\n// Internal modules\nimport { margin_trading_mainnet } from './config/mainnet'\nimport { MarketModules } from './modules/marketModules'\nimport { PermissionModules } from './modules/permissionModules'\nimport { PositionModules } from './modules/positionModules'\nimport { SuiLendModule } from './modules/suilendModule'\nimport { SwapModules } from './modules/swapModules'\nimport { MarginTradingConfigs, SuiLendConfigs } from './types'\n\nexport interface SdkOptions extends BaseSdkOptions {\n full_rpc_url: string\n env: 'mainnet' | 'testnet'\n aggregator_url: string\n margin_trading: Package<MarginTradingConfigs>\n suilend: Package<SuiLendConfigs>\n}\n\nexport class CetusMarginTradingSDK extends SdkWrapper<SdkOptions> {\n // Modules\n protected _marketModules: MarketModules\n protected _permissionModules: PermissionModules\n protected _positionModules: PositionModules\n protected _suilendModule: SuiLendModule\n protected _swapModules: SwapModules\n\n // Clients and utilities\n protected _aggregatorClient: AggregatorClient\n protected _clmmSDK: CetusClmmSDK\n protected _pythConnection: SuiPriceServiceConnection\n\n // Public properties\n senderAddress: string | undefined\n\n constructor(options: SdkOptions, clmmSDK?: CetusClmmSDK) {\n super(options)\n\n // Initialize modules\n this._suilendModule = new SuiLendModule(this)\n this._permissionModules = new PermissionModules(this)\n this._marketModules = new MarketModules(this)\n this._positionModules = new PositionModules(this)\n this._swapModules = new SwapModules(this)\n\n // Initialize clients\n this._aggregatorClient = new AggregatorClient({\n signer: normalizeSuiAddress('0x0'),\n client: options.sui_client || new SuiClient({ url: options.full_rpc_url! }),\n env: options.env === 'testnet' ? Env.Testnet : Env.Mainnet,\n })\n\n this._clmmSDK = clmmSDK || CetusClmmSDK.createSDK({ env: options.env, full_rpc_url: options.full_rpc_url })\n\n this._pythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 30 * 1000,\n })\n }\n\n // Module getters\n get SuiLendModule(): SuiLendModule {\n return this._suilendModule\n }\n\n get PermissionModules(): PermissionModules {\n return this._permissionModules\n }\n\n get MarketModules(): MarketModules {\n return this._marketModules\n }\n\n get PositionModules(): PositionModules {\n return this._positionModules\n }\n\n get SwapModules(): SwapModules {\n return this._swapModules\n }\n\n // Client getters\n get AggregatorClient(): AggregatorClient {\n return this._aggregatorClient\n }\n\n get ClmmSDK(): CetusClmmSDK {\n return this._clmmSDK\n }\n\n get PythConnection(): SuiPriceServiceConnection {\n return this._pythConnection\n }\n\n // Static factory methods\n static createSDK(options: BaseSdkOptions): CetusMarginTradingSDK {\n return CetusMarginTradingSDK.createCustomSDK({ ...margin_trading_mainnet, ...options })\n }\n\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusMarginTradingSDK {\n return new CetusMarginTradingSDK(options)\n }\n}\n","import { DefaultProviders, FullRpcUrlMainnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '..'\n\nexport const margin_trading_mainnet: SdkOptions = {\n full_rpc_url: FullRpcUrlMainnet,\n env: 'mainnet',\n aggregator_url: 'https://api-sui.cetus.zone/router_v3',\n margin_trading: {\n package_id: '0xa079129c989dacac4f5ccb7b2bb2b8f233b13694c465466a344e2e095e987407',\n published_at: '0xa079129c989dacac4f5ccb7b2bb2b8f233b13694c465466a344e2e095e987407',\n version: 0,\n config: {\n versioned_id: '0x85d30849a1e172e1f90bb42e22ed87457a8110dad7658d51c806baa84f5dcd94',\n admin_cap_id: '0xdae1da9a2bacb4738411365e9719b739b655ce6b737155ff58137b78c944112a',\n global_config_id: '0x267de967e72360eb09837bb595a0c6b54bb98a2a1ae47436ccab4a99e6b84f25',\n markets: '0xe0986f697a300da740d384e64c2ba010aa9caf37a54ed0cc8b4098c4d4e592d0',\n markets_table_id: '0xe9dd2dbc3d68c00f297dd84e57ad28f6a504effbf6b1b869b9e4138ead14c731',\n },\n },\n suilend: {\n package_id: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf',\n published_at: '0xe37cc7bb50fd9b6dbd3873df66fa2c554e973697f50ef97707311dc78bd08444',\n config: {\n lending_market: [\n {\n name: 'Main market',\n slug: 'main',\n id: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n type: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n owner_cap_id: '0xf7a4defe0b6566b6a2674a02a0c61c9f99bd012eed21bc741a069eaa82d35927',\n },\n {\n name: 'STEAMM LM',\n slug: 'steamm-lm',\n id: '0xc1888ec1b81a414e427a44829310508352aec38252ee0daa9f8b181b6947de9f',\n type: '0x0a071f4976abae1a7f722199cf0bfcbe695ef9408a878e7d12a7ca87b7e582a6::lp_rewards::LP_REWARDS',\n owner_cap_id: '0x55a0f33b24e091830302726c8cfbff8cf8abd2ec1f83a4e6f4bf51c7ba3ad5ab',\n is_hidden: true, // Only visible in the admin panel\n },\n ],\n lending_market_id: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n lending_market_type: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n api_url: 'https://d10td5ybgrf39v.cloudfront.net',\n },\n },\n}\n","import { CACHE_TIME_5MIN, d, getPackagerConfigs } from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport {\n CreateMarketParams,\n MarginTradingConfigs,\n Market,\n MarketSuilendInfo,\n UpdateMarketFeeRateParams,\n UpdateMarketMaxLeverageParams,\n} from '../types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { wrapMarketInfo } from '../utils'\nimport { getFilteredRewards, getStakingYieldAprPercent, getTotalAprPercent, Side } from '@suilend/sdk'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class MarketModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n createMarket = async (params: CreateMarketParams) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id, markets, global_config_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const tx = new Transaction()\n tx.moveCall({\n target: `${package_id}::market::create_market`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.object(markets),\n tx.pure.u64(params.open_fee_rate),\n tx.pure.u64(params.close_fee_rate),\n tx.object(versioned_id),\n ],\n typeArguments: [params.base_token, params.quote_token],\n })\n return tx\n }\n\n updateMarketFeeRate = async (params: UpdateMarketFeeRateParams) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { market_id, open_fee_rate, close_fee_rate } = params\n const tx = new Transaction()\n tx.moveCall({\n target: `${package_id}::market::set_fee_rate`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(market_id),\n tx.pure.u64(open_fee_rate),\n tx.pure.u64(close_fee_rate),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n claimMarketFees = async (market_id: string, txb?: Transaction) => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const tx = txb || new Transaction()\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n tx.moveCall({\n target: `${package_id}::market::claim_fees`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.object(versioned_id)],\n typeArguments: [base_token, quote_token],\n })\n return tx\n }\n\n claimAllMarketFees = async (market_ids: string[]) => {\n const tx = new Transaction()\n for (let i = 0; i < market_ids.length; i++) {\n const market_id = market_ids[i]\n this.claimMarketFees(market_id, tx)\n }\n return tx\n }\n\n /**\n * Get margin trading contract config information\n */\n getMarginTradingConfig = async (): Promise<MarginTradingConfigs> => {\n const { package_id } = this._sdk.sdkOptions.margin_trading\n try {\n const initVersionedEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::versioned::InitEvent` })\n const initAdminCapEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::admin_cap::InitEvent` })\n const initGlobalConfigEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::config::InitEvent` })\n const initMarketEvent: any = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: `${package_id}::market::InitEvent` })\n const markets = initMarketEvent.data[0].parsedJson.markets_id\n const marketsObject: any = await this._sdk.FullClient.getObject({ id: markets, options: { showContent: true } })\n const marketsTableId = marketsObject.data.content.fields.list.fields.id.id\n return {\n versioned_id: initVersionedEvent.data[0].parsedJson.versioned_id,\n admin_cap_id: initAdminCapEvent.data[0].parsedJson.admin_cap_id,\n global_config_id: initGlobalConfigEvent.data[0].parsedJson.global_config_id,\n markets,\n markets_table_id: marketsTableId,\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {\n versioned_id: '',\n admin_cap_id: '',\n global_config_id: '',\n markets_table_id: '',\n markets: '',\n }\n }\n }\n\n /**\n * Get margin trading market list\n */\n getMarketList = async (force_refresh = false): Promise<Market[]> => {\n const cacheKey = 'margin_trading_markets_list'\n\n // Try to get data from cache\n const cachedData = this._sdk.getCache<any[]>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const { package_id } = this._sdk.sdkOptions.margin_trading\n const marketList: Market[] = []\n try {\n const moveEventType = `${package_id}::market::CreateMarketEvent`\n const objects = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType })\n const warpIds = objects.data.map((object) => (object.parsedJson as any).market_id)\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true, showType: true })\n res.forEach((item) => {\n const marketInfo = wrapMarketInfo(item)\n const cacheKey = `margin_trading_market_info_${marketInfo.market_id}`\n this._sdk.updateCache(cacheKey, marketInfo)\n marketList.push(marketInfo)\n })\n return marketList\n } else {\n handleError(MarginTradingErrorCode.MarketNotFound, 'Market not found')\n return []\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return []\n }\n }\n\n /**\n * Get margin trading market information\n */\n getMarketInfo = async (market_id: string, force_refresh = false): Promise<Market> => {\n const cacheKey = `margin_trading_market_info_${market_id}`\n const cachedData = this._sdk.getCache<any>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n try {\n const result = await this._sdk.FullClient.getObject({\n id: market_id,\n options: {\n showContent: true,\n },\n })\n const marketInfo = wrapMarketInfo(result)\n this._sdk.updateCache(cacheKey, marketInfo, CACHE_TIME_5MIN)\n return marketInfo\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {} as Market\n }\n }\n\n /** Get margin trading market Suilend information */\n getMarketSuilendInfo = async (market_id: string): Promise<MarketSuilendInfo> => {\n try {\n const { base_token, quote_token } = await this.getMarketInfo(market_id)\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData(true)\n const { base_reserve_map_info, quote_reserve_map_info } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n allLendingMarketData\n )\n console.log('🚀🚀🚀 ~ marketModules.ts:188 ~ MarketModules ~ base_reserve_map_info:', base_reserve_map_info)\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n\n const baseRewards = obligations[lending_market_id].rewardMap[base_token]\n const quoteRewards = obligations[lending_market_id].rewardMap[quote_token]\n\n const {\n depositedAmountUsd: baseDepositedAmountUsd,\n borrowedAmountUsd: baseBorrowedAmountUsd,\n depositAprPercent: baseDepositAprPercent,\n borrowAprPercent: baseBorrowAprPercent,\n depositedAmount: baseDepositedAmount,\n borrowedAmount: baseBorrowedAmount,\n } = base_reserve_map_info\n const { depositLimit: baseDepositLimit, borrowLimit: baseBorrowLimit } = base_reserve_map_info.config\n const {\n depositedAmountUsd: quoteDepositedAmountUsd,\n borrowedAmountUsd: quoteBorrowedAmountUsd,\n depositAprPercent: quoteDepositAprPercent,\n borrowAprPercent: quoteBorrowAprPercent,\n depositedAmount: quoteDepositedAmount,\n borrowedAmount: quoteBorrowedAmount,\n } = quote_reserve_map_info\n const { depositLimit: quoteDepositLimit, borrowLimit: quoteBorrowLimit } = quote_reserve_map_info.config\n const baseTotalDepositAprPercent = getTotalAprPercent(\n Side.DEPOSIT,\n baseDepositAprPercent,\n getFilteredRewards(baseRewards.deposit),\n getStakingYieldAprPercent(Side.DEPOSIT, base_token, lstAprPercentMap)\n )\n const baseTotalBorrowAprPercent = getTotalAprPercent(Side.BORROW, baseBorrowAprPercent, getFilteredRewards(baseRewards.borrow))\n\n const quoteTotalDepositAprPercent = getTotalAprPercent(\n Side.DEPOSIT,\n quoteDepositAprPercent,\n getFilteredRewards(quoteRewards.deposit),\n getStakingYieldAprPercent(Side.DEPOSIT, base_token, lstAprPercentMap)\n )\n const quoteTotalBorrowAprPercent = getTotalAprPercent(Side.BORROW, quoteBorrowAprPercent, getFilteredRewards(quoteRewards.borrow))\n\n const longLiquidity = d(quoteDepositedAmountUsd.toString()).sub(quoteBorrowedAmountUsd.toString()).toString()\n const shortLiquidity = d(baseDepositedAmountUsd.toString()).sub(baseBorrowedAmountUsd.toString()).toString()\n\n const baseTokenAvailableDepositAmount = d(baseDepositLimit.toString()).sub(d(baseDepositedAmount.toString())).toString()\n const baseTokenAvailableBorrowAmount = d(baseBorrowLimit.toString()).sub(d(baseBorrowedAmount.toString())).toString()\n\n const quoteTokenAvailableDepositAmount = d(quoteDepositLimit.toString()).sub(d(quoteDepositedAmount.toString())).toString()\n const quoteTokenAvailableBorrowAmount = d(quoteBorrowLimit.toString()).sub(d(quoteBorrowedAmount.toString())).toString()\n\n return {\n long_liquidity: longLiquidity,\n short_liquidity: shortLiquidity,\n base_total_deposit_apr_percent: baseTotalDepositAprPercent.toString(),\n base_total_borrow_apr_percent: baseTotalBorrowAprPercent.toString(),\n quote_total_deposit_apr_percent: quoteTotalDepositAprPercent.toString(),\n quote_total_borrow_apr_percent: quoteTotalBorrowAprPercent.toString(),\n base_token_available_deposit_amount: baseTokenAvailableDepositAmount,\n base_token_available_borrow_amount: baseTokenAvailableBorrowAmount,\n quote_token_available_deposit_amount: quoteTokenAvailableDepositAmount,\n quote_token_available_borrow_amount: quoteTokenAvailableBorrowAmount,\n base_deposit_rewards: getFilteredRewards(baseRewards.deposit),\n quote_deposit_rewards: getFilteredRewards(quoteRewards.deposit),\n base_borrow_rewards: getFilteredRewards(baseRewards.borrow),\n quote_borrow_rewards: getFilteredRewards(quoteRewards.borrow),\n base_deposit_apr_percent: baseDepositAprPercent.toString(),\n base_borrow_apr_percent: baseBorrowAprPercent.toString(),\n quote_deposit_apr_percent: quoteDepositAprPercent.toString(),\n quote_borrow_apr_percent: quoteBorrowAprPercent.toString(),\n obligations: obligations[lending_market_id],\n base_reserve_map_info,\n quote_reserve_map_info,\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {} as MarketSuilendInfo\n }\n }\n}\n","import { addHexPrefix, d, getObjectFields } from '@cetusprotocol/common-sdk'\nimport { parseObligation } from '@suilend/sdk/parsers/obligation'\nimport { getNetAprPercent, getTotalAprPercent, Side, getFilteredRewards } from '@suilend/sdk'\n\nexport const wrapMarketInfo = (info: any) => {\n const fields = getObjectFields(info)\n const {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n } = wrapMarketPermissions(fields.permissions.toString(2))\n\n return {\n market_id: fields.id.id,\n base_token: addHexPrefix(fields.base_token.fields.name),\n quote_token: addHexPrefix(fields.quote_token.fields.name),\n max_long_leverage: d(fields.max_long_leverage)\n .div(10 ** 6)\n .toString(),\n max_short_leverage: d(fields.max_short_leverage)\n .div(10 ** 6)\n .toString(),\n open_fee_rate: d(fields.open_fee_rate)\n .div(10 ** 6)\n .toString(),\n close_fee_rate: d(fields.close_fee_rate)\n .div(10 ** 6)\n .toString(),\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n}\n\nexport const wrapPosition = (position: any, position_cap_id: string) => {\n const fields = getObjectFields(position)\n return {\n created_at: fields.created_ts,\n position_id: fields.id.id,\n init_deposit_amount: fields.init_deposit_amount,\n is_long: fields.is_long,\n lending_market_id: fields.lending_market_id,\n obligation_owner_cap: fields.obligation_owner_cap.fields.obligation_id,\n market_id: fields.market_id,\n position_cap_id,\n }\n}\n\nexport const mergePositionData = (position: any, obligation: any, reserve_map: any, lst_apr_percent_map: any, reward_map: any) => {\n const obligationData = parseObligation(obligation, reserve_map)\n const netAprPercent = getNetAprPercent(obligationData, reward_map, lst_apr_percent_map)\n\n // Safety check: ensure deposits array is not empty\n if (!obligationData.deposits || obligationData.deposits.length === 0) {\n throw new Error('No deposits found in obligation data')\n }\n\n const firstDeposit = obligationData.deposits[0]\n const closeLTV = d(firstDeposit.reserve.config.closeLtvPct).div(100).toString()\n const openLTV = d(firstDeposit.reserve.config.openLtvPct).div(100).toString()\n\n // Safety check: ensure depositedAmountUsd is not zero when calculating CR\n // Liquidation Threshold (LTV)\n const cr = obligationData.depositedAmountUsd.gt(0)\n ? obligationData.borrowedAmountUsd.div(obligationData.depositedAmountUsd).toString()\n : '0'\n\n const ltr = d(1).div(closeLTV).toString()\n const liquidationBuffer = d(closeLTV).sub(cr).toString()\n\n // Safety check: handle case where borrows array might be empty\n let totalBorrowAprPercent = '0'\n let totalSuppliedAPR = '0'\n let borrowedAmountUsd = '0'\n let borrowedAmount = '0'\n\n if (obligationData.borrows && obligationData.borrows.length > 0) {\n const firstBorrow = obligationData.borrows[0]\n const borrowRewards = reward_map[firstBorrow?.coinType]\n\n if (borrowRewards) {\n totalBorrowAprPercent = getTotalAprPercent(\n Side.BORROW,\n firstBorrow?.reserve.borrowAprPercent,\n getFilteredRewards(borrowRewards.borrow)\n ).toString()\n }\n\n borrowedAmountUsd = firstBorrow.borrowedAmountUsd.toString()\n borrowedAmount = firstBorrow.borrowedAmount.toString()\n }\n\n if (obligationData.deposits && obligationData.deposits.length > 0) {\n const firstDeposit = obligationData.deposits[0]\n const borrowRewards = reward_map[firstDeposit?.coinType]\n\n if (borrowRewards) {\n totalSuppliedAPR = getTotalAprPercent(\n Side.DEPOSIT,\n firstDeposit?.reserve.depositAprPercent,\n getFilteredRewards(borrowRewards.deposit)\n ).toString()\n }\n }\n\n return {\n ...position,\n ...obligationData,\n origin_obligation: obligation,\n net_apr_percent: netAprPercent.toString(),\n supplied_apr: d(totalSuppliedAPR).toString(),\n borrowed_apr: d(totalBorrowAprPercent).toString(),\n close_ltv: closeLTV,\n open_ltv: openLTV,\n cr,\n ltr,\n liquidation_buffer: liquidationBuffer,\n deposited_amount_usd: firstDeposit.depositedAmountUsd.toString(),\n borrowed_amount_usd: borrowedAmountUsd,\n deposited_amount: firstDeposit.depositedAmount.toString(),\n borrowed_amount: borrowedAmount,\n }\n}\n\nexport const wrapMarketPermissions = (permissions: string) => {\n const permissionsLength = permissions.length\n const open_permissions_pause = permissions.substring(permissionsLength - 1, permissionsLength) === '0'\n const close_permissions_pause = permissions.substring(permissionsLength - 2, permissionsLength - 1) === '0'\n const deposit_permissions_pause = permissions.substring(permissionsLength - 3, permissionsLength - 2) === '0'\n const borrow_permissions_pause = permissions.substring(permissionsLength - 4, permissionsLength - 3) === '0'\n const withdraw_permissions_pause = permissions.substring(permissionsLength - 5, permissionsLength - 4) === '0'\n const repay_permissions_pause = permissions.substring(permissionsLength - 6, permissionsLength - 5) === '0'\n return {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n}\n","import { BaseError } from \"@cetusprotocol/common-sdk\"\n\nexport enum MarginTradingErrorCode {\n MarketNotFound = 'MarketNotFound',\n FetchError = 'FetchError',\n PositionNotFound = 'PositionNotFound',\n FlashLoanPoolNotFound = 'FlashLoanPoolNotFound',\n PriceNotFound = 'PriceNotFound',\n}\n\n\nexport class MarginTradingError extends BaseError {\n constructor(message: string, error_code?: MarginTradingErrorCode, details?: Record<string, any>) {\n super(message, error_code || 'UnknownError', details)\n }\n\n static isCrossSwapErrorCode(e: any, code: MarginTradingErrorCode): boolean {\n return this.isErrorCode<MarginTradingError>(e, code)\n }\n}\n\nexport const handleError = (code: MarginTradingErrorCode, error: Error | string, details?: Record<string, any>) => {\n const errorDetails = {\n ...details,\n stack: error instanceof Error ? error.stack : undefined,\n }\n\n if (error instanceof Error) {\n throw new MarginTradingError(error.message, code, errorDetails)\n } else {\n throw new MarginTradingError(error, code, errorDetails)\n }\n}","import { CLOCK_ADDRESS, getPackagerConfigs } from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { wrapMarketPermissions } from '../utils'\n\nexport class PermissionModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n queryGlobalPermissions = async () => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id } = getPackagerConfigs(config)\n const globalConfig: any = await this._sdk.FullClient.getObject({\n id: global_config_id,\n options: { showContent: true },\n })\n if (globalConfig) {\n // u32Max\n const permissions = globalConfig.data.content.fields.permissions.toString(2)\n const {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n } = wrapMarketPermissions(permissions)\n return {\n open_permissions_pause,\n close_permissions_pause,\n deposit_permissions_pause,\n withdraw_permissions_pause,\n borrow_permissions_pause,\n repay_permissions_pause,\n }\n }\n }\n\n updateGlobalPermissions = async (pause: boolean) => {\n const tx = new Transaction()\n this.updateGlobalOpenPositionPermissions(pause, tx)\n this.updateGlobalClosePositionPermissions(pause, tx)\n this.updateGlobalDepositPermissions(pause, tx)\n this.updateGlobalBorrowPermissions(pause, tx)\n this.updateGlobalWithdrawPermissions(pause, tx)\n this.updateGlobalRepayPermissions(pause, tx)\n return tx\n }\n\n updateGlobalOpenPositionPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_open_position_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalClosePositionPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_close_position_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalDepositPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_deposit_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalBorrowPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_borrow_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalWithdrawPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_withdraw_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateGlobalRepayPermissions = async (pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { global_config_id, versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::config::update_global_repay_permissions`,\n arguments: [\n tx.object(admin_cap_id),\n tx.object(global_config_id),\n tx.pure.bool(pause),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketCreatePositionPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_open_position_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketClosePositionPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_close_position_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketDepositPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_deposit_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketWithdrawPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_withdraw_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketBorrowPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_borrow_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketRepayPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const config = this._sdk.sdkOptions.margin_trading\n const { versioned_id, admin_cap_id } = getPackagerConfigs(config)\n const tx = txb || new Transaction()\n tx.moveCall({\n target: `${config.published_at}::market::update_market_repay_permission`,\n arguments: [tx.object(admin_cap_id), tx.object(market_id), tx.pure.bool(pause), tx.object(versioned_id)],\n typeArguments: [],\n })\n return tx\n }\n\n updateMarketPermissions = async (market_id: string, pause: boolean, txb?: Transaction) => {\n const tx = txb || new Transaction()\n this.updateMarketCreatePositionPermissions(market_id, pause, tx)\n this.updateMarketClosePositionPermissions(market_id, pause, tx)\n this.updateMarketDepositPermissions(market_id, pause, tx)\n this.updateMarketWithdrawPermissions(market_id, pause, tx)\n this.updateMarketBorrowPermissions(market_id, pause, tx)\n this.updateMarketRepayPermissions(market_id, pause, tx)\n return tx\n }\n}\n","import {\n BaseError,\n CACHE_TIME_24H,\n CLOCK_ADDRESS,\n CoinAssist,\n d,\n getObjectFields,\n getPackagerConfigs,\n removeHexPrefix,\n SUI_SYSTEM_STATE_OBJECT_ID,\n U64_MAX,\n} from '@cetusprotocol/common-sdk'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport BigNumber from 'bignumber.js'\nimport {\n BorrowAssetParams,\n CalculatePositionDepositParams,\n CalculatePositionLeverageParams,\n CalculatePositionRepayParams,\n CalculatePositionWithdrawParams,\n CreateLeveragePositionParams,\n CreateMarginTradingContextParams,\n OpenPositionParams,\n Position,\n PositionCloseWithCoinParams,\n PositionDepositParams,\n PositionManageLeverageParams,\n PositionManageSizeDepositParams,\n PositionManageSizeWithdrawParams,\n PositionRepayParams,\n positionTopUpCTokenParams,\n positionWithdrawCTokenParams,\n RepayParams,\n WithdrawAssetParams,\n} from '../types'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { v4 as uuidv4 } from 'uuid'\nimport { mergePositionData, wrapPosition } from '../utils'\nimport Decimal from 'decimal.js'\nimport { compoundDebt } from '@suilend/sdk'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\nimport { is } from 'valibot'\n\nexport class PositionModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n /**\n * Get leverage position list\n */\n getPositionList = async (wallet_address = this._sdk.getSenderAddress(), force_refresh = false): Promise<Position[]> => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n try {\n // Define mapping cache key\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n\n // Try to get mapping relationship from cache\n let capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, force_refresh)\n\n const ownerRes = await this._sdk.FullClient.getOwnedObjectsByPage(wallet_address, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n MatchAny: [\n {\n StructType: `${this._sdk.sdkOptions.margin_trading.package_id}::position::PositionCap`,\n },\n ],\n },\n })\n\n console.log('🚀🚀🚀 ~ positionModules.ts:42 ~ PositionModules ~ ownerRes.data.length:', ownerRes.data.length)\n if (ownerRes.data.length === 0) {\n handleError(MarginTradingErrorCode.PositionNotFound, 'Position not found')\n return []\n }\n\n const suiLendClient = await this._sdk.SuiLendModule.getSuilendClient(lending_market_id, lending_market_type)\n console.log('🚀🚀🚀 ~ positionModules.ts:48 ~ PositionModules ~ suiLendClient:', suiLendClient)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData()\n console.log('🚀🚀🚀 ~ positionModules.ts:50 ~ PositionModules ~ allLendingMarketData:', allLendingMarketData)\n const reserveMap: any = allLendingMarketData[lending_market_id].reserveMap\n\n // Rebuild mapping if cache doesn't exist or needs refresh\n if (!capIdToPositionIdMap) {\n capIdToPositionIdMap = new Map<string, string>()\n }\n\n const positionIdList: string[] = []\n\n for (let i = 0; i < ownerRes.data.length; i++) {\n const fields = getObjectFields(ownerRes.data[i])\n if (fields.position_id) {\n positionIdList.push(fields.position_id)\n }\n if (fields.id.id) {\n // Store the mapping relationship between capId and positionId\n capIdToPositionIdMap.set(fields.id.id, fields.position_id)\n }\n }\n\n // Store mapping relationship in cache with 24h expiration time\n await this._sdk.updateCache(mappingCacheKey, capIdToPositionIdMap as any, CACHE_TIME_24H)\n\n const positionRes = await this._sdk.FullClient.batchGetObjects(positionIdList, { showContent: true })\n console.log('🚀🚀🚀 ~ positionModules.ts:73 ~ PositionModules ~ positionRes:', positionRes)\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n console.log('🚀🚀🚀 ~ positionModules.ts:75 ~ PositionModules ~ obligations:', obligations)\n const positionList = []\n\n for (let i = 0; i < positionRes.length; i++) {\n const positionId = positionIdList[i]\n // Use mapping in memory directly instead of reading from cache\n let positionCapId = ''\n for (const [capId, pid] of capIdToPositionIdMap.entries()) {\n if (pid === positionId) {\n positionCapId = capId\n break\n }\n }\n\n const position = wrapPosition(positionRes[i], positionCapId)\n const rawObligation = await suiLendClient.getObligation(position.obligation_owner_cap)\n const mergeData = mergePositionData(\n position,\n rawObligation,\n reserveMap || {},\n lstAprPercentMap || {},\n obligations[lending_market_id].rewardMap\n )\n const claimableRewards = this.getObligationRewardsInfo(rawObligation, Object.values(reserveMap))\n positionList.push({\n ...mergeData,\n claimable_rewards: claimableRewards,\n })\n }\n return positionList\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return []\n }\n }\n\n /**\n * Get leverage position details\n */\n getPositionInfo = async (position_id: string, wallet_address = this._sdk.getSenderAddress(), force_refresh = true): Promise<Position> => {\n // Define mapping cache key\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n\n // Try to get mapping relationship from cache\n let capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, force_refresh)\n\n // If cache doesn't exist or needs refresh, rebuild mapping\n if (!capIdToPositionIdMap) {\n capIdToPositionIdMap = new Map<string, string>()\n }\n\n // Get capId from mapping by positionId\n let positionCapId = this.getCapIdByPositionId(position_id, wallet_address) || ''\n\n if (!positionCapId) {\n const ownerRes = await this._sdk.FullClient.getOwnedObjectsByPage(wallet_address, {\n options: { showType: true, showContent: true, showOwner: true },\n filter: {\n MatchAny: [\n {\n StructType: `${this._sdk.sdkOptions.margin_trading.package_id}::position::PositionCap`,\n },\n ],\n },\n })\n for (let i = 0; i < ownerRes.data.length; i++) {\n const fields = getObjectFields(ownerRes.data[i])\n if (fields.id.id) {\n capIdToPositionIdMap.set(fields.id.id, fields.position_id)\n }\n if (fields.position_id === position_id) {\n positionCapId = fields.id.id\n }\n }\n }\n const positionRes = await this._sdk.FullClient.batchGetObjects([position_id], { showContent: true })\n const position = wrapPosition(positionRes[0], positionCapId || '')\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const suiLendClient = await this._sdk.SuiLendModule.getSuilendClient(lending_market_id, lending_market_type)\n const { allLendingMarketData, lstAprPercentMap } = await this._sdk.SuiLendModule.getLendingMarketData()\n const reserveMap: any = allLendingMarketData[lending_market_id].reserveMap\n const obligations = await this._sdk.SuiLendModule.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n const rawObligation = await suiLendClient.getObligation(position.obligation_owner_cap)\n const claimableRewards = this.getObligationRewardsInfo(rawObligation, Object.values(reserveMap))\n const mergeData = mergePositionData(\n position,\n rawObligation,\n reserveMap || {},\n lstAprPercentMap || {},\n obligations[lending_market_id].rewardMap\n )\n const result = {\n ...mergeData,\n claimable_rewards: claimableRewards,\n }\n\n return result\n }\n\n private getObligationRewardsInfo(obligationData: any, reserves: any[]) {\n const claimableRewards: any[] = []\n const WAD = new BigNumber(10).pow(18)\n const poolRewardInfoMap: Record<\n string,\n {\n coinType: string\n mintDecimals: number\n isActive: boolean\n reserveType: 'deposit' | 'borrow'\n reserveCoinType: string\n reserveArrayIndex: string\n rewardIndex: string\n globalCumulativePerShare: BigNumber // 全局累积每份奖励\n reserve: any\n }\n > = {}\n\n const nowMs = Date.now()\n\n for (const reserve of reserves) {\n const reserveCoinType = reserve.coinType\n const reserveArrayIndex = reserve.arrayIndex.toString()\n\n // Deposits pool rewards\n const depositsPoolRewards = reserve.depositsPoolRewardManager.poolRewards || []\n for (const pr of depositsPoolRewards) {\n if (!pr) continue\n const id = pr.id\n const coinType = pr.coinType\n const startTimeMs = parseInt(pr.startTimeMs)\n const endTimeMs = parseInt(pr.endTimeMs)\n const isActive = nowMs >= startTimeMs && nowMs < endTimeMs\n const mintDecimals = pr.mintDecimals\n // 获取全局累积每份奖励\n const globalCumulative = BigNumber(pr.cumulativeRewardsPerShare).times(10 ** mintDecimals)\n poolRewardInfoMap[id] = {\n coinType,\n mintDecimals,\n isActive,\n reserveType: 'deposit',\n reserveArrayIndex,\n reserveCoinType,\n globalCumulativePerShare: globalCumulative,\n rewardIndex: pr.rewardIndex,\n reserve,\n }\n }\n\n // Borrows pool rewards\n const borrowsPoolRewards = reserve.borrowsPoolRewardManager.poolRewards || []\n for (const pr of borrowsPoolRewards) {\n if (!pr) continue\n const id = pr.id\n const coinType = pr.coinType\n const startTimeMs = parseInt(pr.startTimeMs)\n const endTimeMs = parseInt(pr.endTimeMs)\n const isActive = nowMs >= startTimeMs && nowMs < endTimeMs\n const mintDecimals = pr.mintDecimals\n // 获取全局累积每份奖励\n const globalCumulative = BigNumber(pr.cumulativeRewardsPerShare).times(10 ** mintDecimals)\n poolRewardInfoMap[id] = {\n coinType,\n mintDecimals,\n isActive,\n reserveType: 'borrow',\n reserveCoinType,\n reserveArrayIndex,\n rewardIndex: pr.rewardIndex,\n globalCumulativePerShare: globalCumulative,\n reserve,\n }\n }\n }\n\n const userRewardManagers = obligationData.userRewardManagers\n for (const urm of userRewardManagers) {\n for (let i = 0; i < urm.rewards.length; i++) {\n const reward = urm.rewards[i]\n if (!reward) continue\n const rewardInfo = poolRewardInfoMap[reward.poolRewardId]\n if (!rewardInfo) continue\n\n // 计算待领取奖励 = share × (global_cumulative - user_cumulative)\n const globalCumulativePerShare = rewardInfo.globalCumulativePerShare\n const userCumulativePerShare = new BigNumber(reward.cumulativeRewardsPerShare.value.toString()).div(WAD)\n const pendingRewards = new BigNumber(urm.share).times(globalCumulativePerShare.minus(userCumulativePerShare))\n\n // 实际可领取 = 已记录奖励 + 待领取奖励\n const earnedRewards = new BigNumber(reward.earnedRewards.value).div(WAD)\n const actualClaimable = new BigNumber(earnedRewards).plus(pendingRewards)\n\n const price = rewardInfo.reserve.price\n const earnedRewardsFormatted = actualClaimable.div(10 ** rewardInfo.mintDecimals)\n\n const earnedRewardsUsd = price ? earnedRewardsFormatted.times(price).toFixed(12) : 0\n\n if (d(earnedRewardsUsd).gt(0)) {\n claimableRewards.push({\n poolRewardId: reward.poolRewardId,\n coinType: rewardInfo.coinType,\n earnedRewards: actualClaimable.toString(),\n earnedRewardsUsd,\n earnedRewardsFormatted: earnedRewardsFormatted.toFixed(12),\n isActive: rewardInfo.isActive,\n reserveType: rewardInfo.reserveType,\n reserveCoinType: rewardInfo.reserveCoinType,\n reserveArrayIndex: rewardInfo.reserveArrayIndex,\n rewardIndex: rewardInfo.rewardIndex,\n rewardInfo,\n })\n }\n }\n }\n\n return claimableRewards\n }\n\n /**\n * Get capId from mapping by positionId\n * @param position_id Position ID\n * @param wallet_address Wallet address\n * @returns capId or undefined\n */\n private getCapIdByPositionId = (position_id: string, wallet_address = this._sdk.getSenderAddress()): string => {\n const mappingCacheKey = `cap_to_position_mapping_${wallet_address}`\n const capIdToPositionIdMap = this._sdk.getCache<Map<string, string>>(mappingCacheKey, false)\n\n if (!capIdToPositionIdMap) {\n return ''\n }\n\n // Find the corresponding capId through positionId\n for (const [capId, pid] of capIdToPositionIdMap.entries()) {\n if (pid === position_id) {\n return capId\n }\n }\n\n return ''\n }\n\n /**\n * Create leverage position\n */\n private createLeveragePosition(params: CreateLeveragePositionParams) {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const leverageConfig = this._sdk.sdkOptions.margin_trading\n const { leverage, market_id, base_token, quote_token, is_long, init_deposit_amount, tx, init_coin_type } = params\n const [position_cap, margin_trading_context] = tx.moveCall({\n target: `${leverageConfig.published_at}::router::open_position`,\n arguments: [\n tx.object(global_config_id),\n tx.object(market_id),\n tx.object(lending_market_id),\n tx.pure.u64(init_deposit_amount),\n tx.pure.u64(d(leverage).mul(10000).toString()),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [lending_market_type, is_long ? base_token : quote_token, init_coin_type],\n })\n\n return { position_cap, margin_trading_context }\n }\n\n /**\n * Deposit asset to leverage position\n */\n private async depositToLeveragePosition(params: PositionDepositParams, tx: Transaction) {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_type, lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const {\n is_long,\n market_id,\n position_cap_id,\n position_cap,\n deposit_reserve_array_index,\n input_coin,\n margin_trading_context,\n base_token,\n quote_token,\n } = params\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::deposit`,\n typeArguments: [lending_market_type, is_long ? base_token : quote_token],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n position_cap_id ? tx.object(position_cap_id) : position_cap,\n input_coin,\n tx.pure.u64(deposit_reserve_array_index),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n return tx\n }\n\n /**\n * Repay\n */\n public repay = (params: RepayParams) => {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const {\n txb,\n repay_amount,\n repay_coin_type,\n repay_coin,\n repay_reserve_array_index,\n market_id,\n position_cap_id,\n margin_trading_context,\n } = params\n const tx = txb || new Transaction()\n const coin = repay_coin ? repay_coin : CoinAssist.buildCoinWithBalance(BigInt(repay_amount.toString()), repay_coin_type, tx)\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::repay`,\n typeArguments: [lending_market_type, repay_coin_type],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n coin,\n tx.pure.u64(repay_reserve_array_index.toString()),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Withdraw asset (unified handling for SUI and non-SUI)\n */\n public withdrawAsset = (params: WithdrawAssetParams, tx: Transaction) => {\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { package_id } = this._sdk.sdkOptions.suilend\n const { market_id, withdraw_amount, withdraw_reserve_array_index, withdraw_coin_type, position_cap_id, margin_trading_context } = params\n\n // Construct RateLimiterExemption\n const [exemption] = tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: [`${package_id}::lending_market::RateLimiterExemption<${lending_market_type}, ${withdraw_coin_type}>`],\n arguments: [],\n })\n\n return tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::withdraw`,\n typeArguments: [lending_market_type, withdraw_coin_type],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.object(exemption),\n tx.pure.u64(withdraw_amount),\n tx.pure.u64(withdraw_reserve_array_index),\n tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Borrow asset (unified handling for SUI and non-SUI)\n */\n public borrowAsset = (params: BorrowAssetParams, tx: Transaction) => {\n const {\n reserve_array_index,\n borrow_amount,\n base_token,\n quote_token,\n lending_market_id,\n is_long,\n market_id,\n position_cap_id,\n position_cap,\n margin_trading_context,\n } = params\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { lending_market_type } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n // Borrow asset\n return tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::borrow`,\n typeArguments: [lending_market_type, is_long ? quote_token : base_token],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n position_cap_id ? tx.object(position_cap_id) : position_cap,\n tx.pure.u64(reserve_array_index),\n tx.pure.u64(borrow_amount.toString()),\n tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n }\n\n /**\n * Extract other token types from deposits and borrows excluding baseToken and quoteToken\n * @param deposits Deposit list\n * @param borrows Borrow list\n * @param baseToken Base token type\n * @param quoteToken Quote token type\n * @returns Array of other token types\n */\n private extractOtherTokenTypes(\n deposits: { reserve: { coinType: string } }[],\n borrows: { reserve: { coinType: string } }[],\n baseToken: string,\n quoteToken: string\n ): string[] {\n const otherTokens: string[] = []\n\n deposits.forEach((deposit) => {\n if (deposit.reserve.coinType !== baseToken && deposit.reserve.coinType !== quoteToken) {\n otherTokens.push(deposit.reserve.coinType)\n }\n })\n\n borrows.forEach((borrow) => {\n if (borrow.reserve.coinType !== baseToken && borrow.reserve.coinType !== quoteToken) {\n otherTokens.push(borrow.reserve.coinType)\n }\n })\n\n return otherTokens\n }\n\n // Create margin trading context\n createMarginTradingContext = (params: CreateMarginTradingContextParams, tx: Transaction) => {\n const { published_at } = this._sdk.sdkOptions.margin_trading\n const { market_id, position_cap_id, action, coin_type, amount } = params\n const marginTradingContext = tx.moveCall({\n target: `${published_at}::router::create_margin_trading_context`,\n arguments: [tx.object(market_id), tx.object(position_cap_id), tx.pure.string(action), tx.pure.u64(amount)],\n typeArguments: [coin_type],\n })\n return marginTradingContext\n }\n\n marginTradingContextConfirm = (marginTradingContext: TransactionObjectArgument, tx: Transaction) => {\n const { published_at } = this._sdk.sdkOptions.margin_trading\n tx.moveCall({\n target: `${published_at}::router::confirm`,\n arguments: [marginTradingContext],\n typeArguments: [],\n })\n return tx\n }\n\n /**\n * Open position\n */\n openPosition = async (params: OpenPositionParams) => {\n const { is_quote, is_long, amount, swap_clmm_pool = '', slippage, leverage, market_id } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n\n const {\n flash_amount,\n flash_loan_coin,\n is_flash_a,\n borrow_amount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n base_reserve_array_index,\n quote_reserve_array_index,\n reserve,\n has_swap,\n routers,\n } = await this.calculatePositionDeposit({\n is_long,\n is_quote,\n amount,\n swap_clmm_pool,\n leverage,\n slippage,\n market_id,\n base_token,\n quote_token,\n is_submit: true,\n })\n console.log('🚀🚀🚀 ~ positionModules.ts:492 ~ PositionModules ~ routers:', routers)\n\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Initiate flash loan\n const { balance_a, balance_b, receipt } = this._sdk.SwapModules.flashLoan({\n amount: flash_amount,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin,\n tx,\n })\n\n // Flash loan partial conversion\n const debt_from = is_long ? quote_token : base_token\n const debt_to = is_long ? base_token : quote_token\n const init_deposit_coin = CoinAssist.buildCoinWithBalance(BigInt(amount), is_quote ? quote_token : base_token, tx)\n const balance_coin_a = CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n const balance_coin_b = CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n if (has_swap) {\n console.log('🚀🚀🚀 ~ positionModules.ts:515 ~ PositionModules ~ is_flash_a:', is_flash_a)\n tx.mergeCoins(init_deposit_coin, [is_flash_a ? balance_coin_a : balance_coin_b])\n }\n\n console.log(\n '🚀🚀🚀 ~ positionModules.ts:521 ~ PositionModules ~ d(flash_amount).add(amount).toString():',\n d(flash_amount).add(amount).toString(),\n debt_from,\n debt_to\n )\n const debtSwapResult = await this._sdk.SwapModules.handleSwap({\n from: debt_from,\n to: debt_to,\n amount: has_swap ? d(flash_amount).add(amount).toString() : flash_amount,\n input_coin: has_swap ? init_deposit_coin : is_flash_a ? balance_coin_a : balance_coin_b,\n swap_clmm_pool,\n slippage,\n tx,\n })\n\n // Open position\n const { position_cap, margin_trading_context } = this.createLeveragePosition({\n leverage,\n market_id,\n base_token,\n quote_token,\n is_long,\n init_deposit_amount: d(amount).toString(),\n init_coin_type: is_quote ? quote_token : base_token,\n tx,\n })\n\n // Reserve index of collateral asset\n const deposit_reserve_array_index = is_long ? base_reserve_array_index : quote_reserve_array_index\n\n if (debtSwapResult.swap_out_coin && !has_swap) {\n tx.mergeCoins(debtSwapResult.swap_out_coin, [init_deposit_coin])\n }\n // Position deposit\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap,\n deposit_reserve_array_index,\n input_coin: debtSwapResult.swap_out_coin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n console.log('🚀🚀🚀 ~ positionModules.ts:580 ~ PositionModules ~ borrow_amount:', borrow_amount)\n\n // Borrow asset\n const borrowCoin = this.borrowAsset(\n {\n position_cap,\n reserve_array_index: is_long ? quote_reserve_array_index : base_reserve_array_index,\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const zeroBalance = CoinAssist.mintBalanceZero(is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n // Repay flash loan\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_flash_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_flash_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n // Transfer position to user\n tx.transferObjects([position_cap], tx.pure.address(this._sdk.getSenderAddress()))\n // Destroy zero balance asset from flash loan\n CoinAssist.destroyBalanceZero(\n is_flash_a\n ? CoinAssist.intoBalance(balance_coin_b, clmm_pool_coin_type_b, tx)\n : CoinAssist.intoBalance(balance_coin_a, clmm_pool_coin_type_a, tx),\n is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a,\n tx\n )\n\n this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Increase position size\n */\n positionDeposit = async (params: PositionManageSizeDepositParams) => {\n const { position_id, swap_clmm_pool = '', is_quote, amount, slippage, leverage, txb } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n\n // Get position info\n const { is_long, deposits, borrows, position_cap_id, market_id } = await this.getPositionInfo(position_id)\n // Get market info\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const tx = txb || new Transaction()\n\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'increase_size', coin_type: is_quote ? quote_token : base_token, amount: amount.toString() },\n tx\n )\n\n // Get reserveArrayIndex of position collateral token\n const deposit_reserve_array_index = deposits[0].reserveArrayIndex.toString()\n const borrow_reserve_array_index = borrows[0].reserveArrayIndex.toString()\n\n // Calculate flash loan parameters\n const {\n flash_amount,\n flash_loan_coin,\n is_flash_a,\n borrow_amount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n reserve,\n has_swap,\n } = await this.calculatePositionDeposit({\n market_id,\n is_long,\n is_quote,\n amount,\n swap_clmm_pool,\n leverage,\n slippage,\n base_token,\n quote_token,\n position_id,\n is_open: false,\n })\n console.log('🚀🚀🚀 ~ positionModules.ts:603 ~ PositionModules ~ flash_amount:', flash_amount)\n\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Initiate flash loan\n const { balance_a, balance_b, receipt } = this._sdk.SwapModules.flashLoan({\n amount: flash_amount,\n clmm_pool,\n clmm_pool_coin_type_a: clmm_pool_coin_type_a,\n clmm_pool_coin_type_b: clmm_pool_coin_type_b,\n flash_loan_coin,\n tx,\n })\n\n // Flash loan partial conversion\n const debt_from = is_long ? quote_token : base_token\n const debt_to = is_long ? base_token : quote_token\n const init_deposit_coin = CoinAssist.buildCoinWithBalance(BigInt(amount), is_quote ? quote_token : base_token, tx)\n const balance_coin_a = CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n const balance_coin_b = CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n if (has_swap) {\n tx.mergeCoins(init_deposit_coin, [is_flash_a ? balance_coin_a : balance_coin_b])\n }\n\n const debtSwapResult = await this._sdk.SwapModules.handleSwap({\n from: debt_from,\n to: debt_to,\n amount: has_swap ? d(flash_amount).add(amount).toString() : flash_amount,\n input_coin: has_swap ? init_deposit_coin : is_flash_a ? balance_coin_a : balance_coin_b,\n swap_clmm_pool,\n slippage,\n tx,\n })\n\n if (debtSwapResult.swap_out_coin && !has_swap) {\n tx.mergeCoins(debtSwapResult.swap_out_coin, [init_deposit_coin])\n }\n\n // Increase position size\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index,\n input_coin: debtSwapResult.swap_out_coin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n // Borrow asset\n const borrowCoin = await this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: borrow_reserve_array_index,\n borrow_amount: borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n const zeroBalance = CoinAssist.mintBalanceZero(is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n\n // Repay flash loan\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_flash_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_flash_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n // Destroy zero balance asset from flash loan\n CoinAssist.destroyBalanceZero(\n is_flash_a\n ? CoinAssist.intoBalance(balance_coin_b, clmm_pool_coin_type_b, tx)\n : CoinAssist.intoBalance(balance_coin_a, clmm_pool_coin_type_a, tx),\n is_flash_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a,\n tx\n )\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Decrease position size\n */\n\n positionWithdraw = async (params: PositionManageSizeWithdrawParams) => {\n const { amount, is_quote, txb, swap_clmm_pool = '', slippage, position_id, leverage } = params\n const tx = txb || new Transaction()\n const {\n withdraw_ctoken_amount,\n repay_amount,\n is_close,\n deposits,\n borrows,\n reserve,\n base_token,\n quote_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n position_cap_id,\n market_id,\n is_long,\n swap_convert_all,\n flash_loan_amount,\n routers,\n repay_flash_loan_amount = '0',\n partial_amount_in,\n withdraw_amount,\n has_flash_loan,\n } = await this.calculatePositionWithdraw({ position_id, is_quote, swap_clmm_pool, amount, leverage, slippage })\n if (is_close) {\n return this.positionClose({\n position_id,\n is_quote,\n leverage,\n slippage,\n swap_clmm_pool,\n })\n }\n const margin_trading_context = this.createMarginTradingContext(\n {\n market_id: market_id,\n position_cap_id: position_cap_id,\n action: 'decrease_size',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n let flashReceipt, isLoanA\n if (has_flash_loan) {\n // Flash loan borrows debt\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount,\n flash_loan_coin: borrows[0].reserve.coinType,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n flashReceipt = receipt\n isLoanA = is_loan_a\n CoinAssist.destroyBalanceZero(isLoanA ? balance_b : balance_a, isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n // Repay debt\n const repayCoin = is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n\n // Withdraw collateral asset\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdraw_ctoken_amount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n for (let i = 1; i < deposits.length; i++) {\n const rewardCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(),\n withdraw_reserve_array_index: deposits[i].reserveArrayIndex.toString(),\n withdraw_coin_type: deposits[i].coinType,\n margin_trading_context,\n },\n tx\n )\n tx.transferObjects([rewardCoin], this._sdk.getSenderAddress())\n }\n\n let swapOutCoin\n // Convert all collateral assets\n console.log('🚀🚀🚀 ~ positionModules.ts:778 ~ PositionModules ~ swap_convert_all:', { swap_convert_all, has_flash_loan })\n if (swap_convert_all) {\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n } else {\n // Partially convert collateral asset to borrow asset\n const inputCoin = tx.splitCoins(withdrawCoin, [tx.pure.u64(partial_amount_in?.toString() || '0')])\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n }\n\n // Repay flash loan\n let repayFlashLoanCoin\n if (swapOutCoin && has_flash_loan) {\n repayFlashLoanCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount.toString())])\n }\n\n if (repayFlashLoanCoin && has_flash_loan) {\n const zeroBalance = CoinAssist.mintBalanceZero(isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: isLoanA ? CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: isLoanA ? zeroBalance : CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_b, tx),\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n receipt: flashReceipt,\n })\n } else {\n if (swapOutCoin) {\n const repayCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount.toString())])\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n }\n\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n if (!swap_convert_all) {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Close position\n */\n positionClose = async (params: PositionCloseWithCoinParams) => {\n const { position_id, is_quote, slippage, leverage, swap_clmm_pool = '' } = params\n const { margin_trading: marginTradingConfig } = this._sdk.sdkOptions\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n const { lending_market_type: lendingMarketType, lending_market_id: lendingMarketId } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const {\n deposits,\n borrows,\n base_token,\n quote_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n position_cap_id,\n market_id,\n swap_convert_all,\n routers,\n partial_amount_in,\n is_long,\n flash_loan_amount,\n reserve,\n repay_flash_loan_amount = '0',\n } = await this.calculatePositionWithdraw({ position_id, is_quote, swap_clmm_pool, amount: U64_MAX.toString(), leverage, slippage })\n\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'close_position', coin_type: is_quote ? quote_token : base_token, amount: '0' },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Flash loan borrow\n let flashReceipt, isLoanA\n if (d(flash_loan_amount).gt(0)) {\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount,\n flash_loan_coin: is_long ? quote_token : base_token,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n flashReceipt = receipt\n isLoanA = is_loan_a\n // Repay debt\n CoinAssist.destroyBalanceZero(isLoanA ? balance_b : balance_a, isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n const repayCoin = isLoanA\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx)\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type: borrows[0].reserve.coinType,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n }\n\n // Withdraw collateral asset\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(), // u64max will be automatically converted to maxAmount when withdrawing\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n for (let i = 1; i < deposits.length; i++) {\n const rewardCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: U64_MAX.toString(),\n withdraw_reserve_array_index: deposits[i].reserveArrayIndex.toString(),\n withdraw_coin_type: deposits[i].coinType,\n margin_trading_context,\n },\n tx\n )\n tx.transferObjects([rewardCoin], this._sdk.getSenderAddress())\n }\n // Asset conversion\n let swapOutCoin\n console.log('🚀🚀🚀 ~ positionModules.ts:895 ~ PositionModules ~ swap_convert_all:', swap_convert_all)\n if (swap_convert_all) {\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n } else {\n if (partial_amount_in && d(partial_amount_in).gt(0)) {\n const inputCoin = tx.splitCoins(withdrawCoin, [tx.pure.u64(partial_amount_in?.toString() || '0')])\n swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n }\n }\n // Repay flash loan\n if (swapOutCoin && flashReceipt) {\n const zeroBalance = CoinAssist.mintBalanceZero(isLoanA ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n const repayFlashLoanCoin = tx.splitCoins(swapOutCoin, [tx.pure.u64(repay_flash_loan_amount?.toString() || '0')])\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: isLoanA ? CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: isLoanA ? zeroBalance : CoinAssist.intoBalance(repayFlashLoanCoin, clmm_pool_coin_type_b, tx),\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n receipt: flashReceipt,\n })\n }\n\n // Close position\n tx.moveCall({\n target: `${marginTradingConfig.published_at}::router::close_position`,\n typeArguments: [lendingMarketType],\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lendingMarketId),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n })\n\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n if (!swap_convert_all) {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n this.marginTradingContextConfirm(margin_trading_context, tx)\n\n console.log('🚀🚀🚀 ~ positionModules.ts:951 ~ PositionModules ~ tx:', tx)\n return tx\n }\n\n /**\n * Increase position leverage\n */\n positionLeverageIncrease = async (params: PositionManageLeverageParams) => {\n const { current_leverage, target_leverage, swap_clmm_pool = '', slippage, position_id } = params\n const { lending_market_id } = getPackagerConfigs(this._sdk.sdkOptions.suilend)\n const tx = new Transaction()\n const {\n flash_loan_amount,\n quote_token,\n base_token,\n reserve,\n deposits,\n borrow_amount,\n routers,\n position_cap_id,\n is_long,\n market_id,\n is_flash_loan,\n } = await this.calculatePositionLeverage({ position_id, current_leverage, target_leverage, swap_clmm_pool, slippage })\n const flash_loan_coin = is_long ? quote_token : base_token\n\n // Create context\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'increase_leverage', coin_type: is_long ? base_token : quote_token, amount: '0' },\n tx\n )\n // Update oracle prices\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Need flash loan\n if (is_flash_loan) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_pool } = await this._sdk.SwapModules.getFlashLoanPool(\n flash_loan_coin,\n flash_loan_amount?.toString() || ''\n )\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: flash_loan_amount?.toString() || '0',\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin,\n })\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx),\n slippage: slippage,\n txb: tx,\n })\n\n this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n input_coin: swapOutCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n\n const borrowCoin = this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: is_long ? reserve[1].arrayIndex.toString() : reserve[0].arrayIndex.toString(),\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const zeroBalance = CoinAssist.mintBalanceZero(is_loan_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_loan_a ? CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_a, tx) : zeroBalance,\n repay_quote: is_loan_a ? zeroBalance : CoinAssist.intoBalance(borrowCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n CoinAssist.destroyBalanceZero(is_loan_a ? balance_b : balance_a, is_loan_a ? clmm_pool_coin_type_b : clmm_pool_coin_type_a, tx)\n } else {\n const borrowCoin = this.borrowAsset(\n {\n position_cap_id,\n reserve_array_index: is_long ? reserve[1].arrayIndex.toString() : reserve[0].arrayIndex.toString(),\n borrow_amount,\n base_token,\n quote_token,\n is_long,\n lending_market_id,\n market_id,\n margin_trading_context,\n },\n tx\n )\n\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: borrowCoin,\n slippage: slippage,\n txb: tx,\n })\n\n this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n input_coin: swapOutCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Decrease position leverage\n */\n positionLeverageDecrease = async (params: PositionManageLeverageParams) => {\n const { current_leverage, target_leverage, swap_clmm_pool = '', slippage, position_id } = params\n const { deposits, borrows, position_cap_id, market_id, is_long } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const tx = new Transaction()\n // Decrease position leverage, withdraw collateral asset\n const { withdraw_ctoken_amount, routers, reserve, is_flash_loan } = await this.calculatePositionLeverage({\n position_id,\n current_leverage,\n target_leverage,\n swap_clmm_pool,\n slippage,\n })\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'decrease_leverage', coin_type: is_long ? base_token : quote_token, amount: '0' },\n tx\n )\n // Need to update oracle prices before placing suilend order\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n if (is_flash_loan) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_pool, clmm_fee_tier } = await this._sdk.SwapModules.getFlashLoanPool(\n deposits[0].reserve.coinType,\n withdraw_ctoken_amount.toString()\n )\n\n const { balance_a, balance_b, receipt, is_loan_a } = this._sdk.SwapModules.flashLoan({\n tx,\n amount: withdraw_ctoken_amount,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n flash_loan_coin: deposits[0].reserve.coinType,\n })\n\n const swapOutCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: is_loan_a\n ? CoinAssist.fromBalance(balance_a, clmm_pool_coin_type_a, tx)\n : CoinAssist.fromBalance(balance_b, clmm_pool_coin_type_b, tx),\n slippage: slippage,\n txb: tx,\n })\n\n this.repay({\n txb: tx,\n market_id,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: swapOutCoin,\n repay_coin_type: is_long ? quote_token : base_token,\n repay_amount: '0',\n margin_trading_context,\n })\n if (swapOutCoin) {\n tx.transferObjects([swapOutCoin], this._sdk.getSenderAddress())\n }\n const flashLoanFee = d(withdraw_ctoken_amount).mul(clmm_fee_tier).toString()\n const repayFlashLoanAmount = d(withdraw_ctoken_amount).add(flashLoanFee).toDP(0, Decimal.ROUND_UP)\n\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: repayFlashLoanAmount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n const repayCoin = tx.splitCoins(withdrawCoin, [repayFlashLoanAmount.toString()])\n this._sdk.SwapModules.repayFlashLoan({\n tx,\n clmm_pool,\n repay_base: is_loan_a ? CoinAssist.intoBalance(repayCoin, clmm_pool_coin_type_a, tx) : balance_a,\n repay_quote: is_loan_a ? balance_b : CoinAssist.intoBalance(repayCoin, clmm_pool_coin_type_b, tx),\n receipt,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n })\n\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n } else {\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdraw_ctoken_amount.toString(),\n withdraw_reserve_array_index: deposits[0].reserveArrayIndex.toString(),\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Leverage position repay\n */\n positionRepay = async (params: PositionRepayParams) => {\n const { position_id, amount, is_quote, slippage } = params\n const { routers, repay_coin_type, base_token, quote_token, borrows, deposits, market_id, position_cap_id } =\n await this.calculatePositionRepay({\n position_id,\n amount,\n is_quote,\n })\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(base_token, quote_token, undefined, otherToken)\n const tx = new Transaction()\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n // Coin to be repaid\n const hasSwap = is_quote ? quote_token !== repay_coin_type : base_token !== repay_coin_type\n let repayCoin: any\n const margin_trading_context = this.createMarginTradingContext(\n { market_id, position_cap_id, action: 'repay_debt', coin_type: is_quote ? quote_token : base_token, amount: amount.toString() },\n tx\n )\n if (hasSwap) {\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n repayCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n } else {\n repayCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n this.repay({\n txb: tx,\n position_cap_id,\n repay_reserve_array_index: borrows[0].reserveArrayIndex.toString(),\n repay_coin: repayCoin,\n repay_coin_type,\n repay_amount: '0',\n market_id,\n margin_trading_context,\n })\n tx.transferObjects([repayCoin], this._sdk.getSenderAddress())\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Top up collateral for leverage position\n */\n positionTopUpCToken = async (params: positionTopUpCTokenParams) => {\n const { position_id, amount, is_quote, swap_clmm_pool = '', slippage } = params\n const tx = new Transaction()\n const { is_long, market_id, position_cap_id, deposits, borrows } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'top_up_collateral',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { base_reserve_array_index, quote_reserve_array_index, reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n let depositCoin: any\n if (hasSwap) {\n const routers = await this._sdk.SwapModules.findRouters(\n is_quote ? quote_token : base_token,\n is_quote ? base_token : quote_token,\n amount,\n true,\n [swap_clmm_pool]\n )\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n depositCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: inputCoin,\n slippage,\n txb: tx,\n })\n } else {\n depositCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n await this.depositToLeveragePosition(\n {\n is_long,\n market_id,\n position_cap_id,\n deposit_reserve_array_index: is_long ? base_reserve_array_index : quote_reserve_array_index,\n input_coin: depositCoin,\n margin_trading_context,\n base_token,\n quote_token,\n },\n tx\n )\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n /**\n * Withdraw ctoken for leverage position\n */\n positionWithdrawCToken = async (params: positionWithdrawCTokenParams) => {\n const { position_id, amount, is_quote, swap_clmm_pool = '', slippage } = params\n const tx = new Transaction()\n const { is_long, market_id, position_cap_id, deposits, borrows } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'withdraw_collateral',\n coin_type: is_quote ? quote_token : base_token,\n amount: amount.toString(),\n },\n tx\n )\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { base_reserve_array_index, quote_reserve_array_index, reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n await this._sdk.SuiLendModule.refreshReservePrices(tx, reserve)\n\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n const rate = is_long ? d(quotePrice).div(d(basePrice)).toString() : d(basePrice).div(d(quotePrice)).toString()\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n const withdrawAmount = hasSwap\n ? d(amount)\n .mul(rate)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n : amount.toString()\n\n const withdrawCoin = this.withdrawAsset(\n {\n market_id,\n position_cap_id,\n withdraw_amount: withdrawAmount,\n withdraw_reserve_array_index: is_long ? base_reserve_array_index : quote_reserve_array_index,\n withdraw_coin_type: is_long ? base_token : quote_token,\n margin_trading_context,\n },\n tx\n )\n\n if (hasSwap) {\n const routers = await this._sdk.SwapModules.findRouters(\n is_long ? base_token : quote_token,\n is_quote ? quote_token : base_token,\n withdrawAmount,\n true,\n [swap_clmm_pool]\n )\n const targetCoin = await this._sdk.SwapModules.routerSwap({\n router: routers?.route_obj,\n input_coin: withdrawCoin,\n slippage,\n txb: tx,\n })\n if (targetCoin) {\n tx.transferObjects([targetCoin], this._sdk.getSenderAddress())\n }\n } else {\n tx.transferObjects([withdrawCoin], this._sdk.getSenderAddress())\n }\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n\n return tx\n }\n\n positionClaim = async (position_id: string) => {\n const tx = new Transaction()\n const { position_cap_id, obligation_owner_cap, market_id, claimable_rewards } = await this.getPositionInfo(position_id)\n console.log('🚀🚀🚀 ~ positionModules.ts:1650 ~ PositionModules ~ claimable_rewards:', claimable_rewards)\n\n const { suilend, margin_trading } = this._sdk.sdkOptions\n const lending_market_id = getPackagerConfigs(suilend).lending_market_id\n const lending_market_type = getPackagerConfigs(suilend).lending_market_type\n\n const { global_config_id, versioned_id } = getPackagerConfigs(this._sdk.sdkOptions.margin_trading)\n\n for (let i = 0; i < claimable_rewards.length; i++) {\n const margin_trading_context = await this.createMarginTradingContext(\n {\n market_id,\n position_cap_id,\n action: 'claim_reward',\n coin_type: claimable_rewards[i].coinType,\n amount: d(claimable_rewards[i].earnedRewards).toFixed(0),\n },\n tx\n )\n const coin = tx.moveCall({\n target: `${margin_trading.published_at}::router::claim_rewards`,\n arguments: [\n margin_trading_context,\n tx.object(global_config_id),\n tx.object(lending_market_id),\n tx.object(market_id),\n tx.object(position_cap_id),\n tx.pure.u64(claimable_rewards[i].reserveArrayIndex.toString()),\n tx.pure.u64(claimable_rewards[i].rewardIndex.toString()),\n tx.pure.bool(claimable_rewards[i].reserveType === 'deposit'),\n tx.object(CLOCK_ADDRESS),\n tx.object(versioned_id),\n ],\n typeArguments: [lending_market_type, claimable_rewards[i].coinType],\n })\n\n tx.transferObjects([coin], this._sdk.getSenderAddress())\n\n await this.marginTradingContextConfirm(margin_trading_context, tx)\n }\n return tx\n }\n\n /**\n * Pre-calculate for opening position\n */\n calculatePositionDeposit = async (params: CalculatePositionDepositParams) => {\n const {\n is_quote,\n is_long,\n amount,\n swap_clmm_pool = '',\n leverage,\n by_amount_in = true,\n base_token,\n quote_token,\n is_submit = false,\n is_open = true,\n position_id,\n } = params\n let otherToken: string[] = []\n let deposits: any[] = []\n let borrows: any[] = []\n if (!is_open && position_id) {\n const { deposits: positionDeposits, borrows: positionBorrows } = await this.getPositionInfo(position_id)\n deposits = positionDeposits\n borrows = positionBorrows\n otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n }\n const { reserve, base_reserve_array_index, quote_reserve_array_index } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // User's initial deposit coin\n let initDepositAmount = amount.toString()\n // First check if initial deposit coin needs conversion\n const has_swap = (is_long && is_quote) || (!is_long && !is_quote)\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeedsByCoinTypes([base_token, quote_token])\n const quotePrice = priceUpdateData && priceUpdateData[quote_token]?.price\n const basePrice = priceUpdateData && priceUpdateData[base_token]?.price\n if (!quotePrice || !basePrice) {\n throw handleError(MarginTradingErrorCode.PriceNotFound, 'Price not found')\n }\n if (has_swap && is_submit) {\n const rate = is_long ? d(quotePrice).div(d(basePrice)).toString() : d(basePrice).div(d(quotePrice)).toString()\n initDepositAmount = d(amount)\n .mul(rate)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:492 ~ PositionModules ~ initDepositAmount:', { initDepositAmount, rate })\n } else if (has_swap && !is_submit) {\n const from = is_long ? quote_token : base_token\n const to = is_long ? base_token : quote_token\n const routers = await this._sdk.SwapModules.findRouters(from, to, initDepositAmount, true, [swap_clmm_pool])\n initDepositAmount = routers?.amount_out.toString()\n } else {\n initDepositAmount = amount\n }\n // After conversion, calculate flash loan borrow amount\n const {\n base_price,\n quote_price,\n flash_amount,\n flash_loan_fee,\n flash_loan_coin,\n is_flash_a,\n clmm_pool,\n clmm_fee_tier,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n } = await this._sdk.SwapModules.calculateFlashLoan({\n is_long,\n leverage,\n base_token,\n quote_token,\n deposit_amount: initDepositAmount,\n reserve,\n base_token_decimal: baseTokenDecimal,\n quote_token_decimal: quoteTokenDecimal,\n })\n // Convert flash loan borrow amount to collateral asset\n const debtRouters = await this._sdk.SwapModules.findRouters(\n is_long ? quote_token : base_token,\n is_long ? base_token : quote_token,\n flash_amount.toString(),\n true,\n [swap_clmm_pool]\n )\n const depositAmount = d(initDepositAmount).add(d(debtRouters?.amount_out.toString())).toDP(0, Decimal.ROUND_DOWN).toString()\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? base_price : quote_price)\n .toString()\n const borrowAmount = d(flash_amount).add(flash_loan_fee).toDP(0, Decimal.ROUND_UP).toString()\n const borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quote_price : base_price)\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1575 ~ PositionModules ~ depositAmount:', { depositAmount, borrowAmount })\n\n let leverageDepositAmount = !is_quote\n ? d(amount).mul(leverage).toDP(0, Decimal.ROUND_DOWN).toString()\n : d(amount)\n .div(10 ** (is_quote ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** baseTokenDecimal)\n .mul(leverage)\n .div(base_price)\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1583 ~ PositionModules ~ leverageDepositAmount:', leverageDepositAmount)\n\n let afterBorrowAmount = '0'\n let afterBorrowAmountUSD = '0'\n let afterDepositAmount = '0'\n let afterDepositAmountUSD = '0'\n if (!is_open && position_id) {\n if (borrows && borrows.length > 0) {\n // Remaining borrowed assets\n afterBorrowAmount = d(borrows[0].borrowedAmount.toString())\n .mul(is_long ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal)\n .add(d(borrowAmount))\n .toString()\n afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n }\n // Remaining collateral assets\n afterDepositAmount = d(deposits[0].depositedAmount.toString())\n .mul(is_long ? 10 ** baseTokenDecimal : 10 ** quoteTokenDecimal)\n .add(d(depositAmount))\n .toString()\n afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n }\n\n return {\n routers: debtRouters,\n leverage_deposit_amount: leverageDepositAmount,\n quote_price,\n base_price,\n clmm_fee_tier,\n flash_loan_fee,\n flash_loan_coin,\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n after_borrow_amount: afterBorrowAmount,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n after_deposit_amount: afterDepositAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n flash_amount,\n is_flash_a,\n init_deposit_amount: initDepositAmount,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_pool,\n base_reserve_array_index,\n quote_reserve_array_index,\n reserve,\n has_swap,\n }\n }\n\n calculatePositionWithdraw = async (params: CalculatePositionWithdrawParams) => {\n const { position_id, is_quote, swap_clmm_pool = '', amount, leverage, slippage, withdraw_max } = params\n const { deposits, borrows, origin_obligation, position_cap_id, market_id, is_long } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n\n const otherToken = position_id ? this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token) : []\n\n const { reserve, base_reserve_map_info, quote_reserve_map_info } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(\n base_token,\n quote_token,\n undefined,\n otherToken\n )\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // ctoken exchange rate\n const ctokenExchangeRate = is_long ? base_reserve_map_info.cTokenExchangeRate : quote_reserve_map_info.cTokenExchangeRate\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n let withdrawAmountUSD = d(0)\n let withdrawAmount\n if (is_long) {\n withdrawAmountUSD = d(is_quote ? d(amount).mul(quotePrice).toString() : d(amount).mul(basePrice).toString()).div(\n is_quote ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal\n )\n withdrawAmount = is_quote\n ? d(amount)\n .div(basePrice)\n .div(10 ** quoteTokenDecimal)\n .mul(10 ** baseTokenDecimal)\n .toString()\n : d(amount)\n } else {\n withdrawAmountUSD = d(is_quote ? d(amount).mul(quotePrice).toString() : d(amount).mul(basePrice).toString()).div(\n is_quote ? 10 ** quoteTokenDecimal : 10 ** baseTokenDecimal\n )\n withdrawAmount = is_quote\n ? d(amount)\n : d(amount)\n .mul(basePrice)\n .div(10 ** baseTokenDecimal)\n .mul(10 ** quoteTokenDecimal)\n .toString()\n }\n // User available withdrawal token value (net worth)\n const availableWithdrawAmountUSD = d(deposits[0].depositedAmountUsd.toString())\n .sub(d(borrows && borrows.length > 0 ? borrows[0].borrowedAmountUsd.toString() : '0'))\n .toString()\n // Withdrawal ratio\n const ratio = withdrawAmountUSD.div(d(availableWithdrawAmountUSD))\n let is_close = withdraw_max || d(ratio).gte(1)\n\n // const debtBorrow = compoundDebt(origin_obligation.borrows[0], is_long ? reserve[1] : reserve[0])\n // const borrowAmount = d(debtBorrow.borrowedAmount.value.toString())\n // .div(10 ** 18)\n // .toDP(0, Decimal.ROUND_UP)\n let debtBorrow,\n borrowAmount = new Decimal(0)\n if (origin_obligation && origin_obligation.borrows && origin_obligation.borrows.length > 0) {\n debtBorrow = compoundDebt(origin_obligation.borrows[0], is_long ? reserve[1] : reserve[0])\n borrowAmount = d(debtBorrow.borrowedAmount.value.toString())\n .div(10 ** 18)\n .toDP(0, Decimal.ROUND_UP)\n }\n // Borrowed assets to be repaid\n let repayAmount = borrowAmount\n .mul(is_close ? 1 : ratio)\n .toDP(0, Decimal.ROUND_UP)\n .toString()\n // Flash loan amount equals repayment amount\n let flashLoanAmount = repayAmount.toString()\n let flashLoanFee, repayFlashLoanAmount, clmmFeeTier, clmmPool, clmmPoolCoinTypeA, clmmPoolCoinTypeB\n if (d(repayAmount).gt(0)) {\n const { clmm_pool_coin_type_a, clmm_pool_coin_type_b, clmm_fee_tier, clmm_pool } = await this._sdk.SwapModules.getFlashLoanPool(\n is_long ? quote_token : base_token,\n flashLoanAmount\n )\n clmmPoolCoinTypeA = clmm_pool_coin_type_a || ''\n clmmPoolCoinTypeB = clmm_pool_coin_type_b || ''\n clmmFeeTier = clmm_fee_tier || 0\n clmmPool = clmm_pool || ''\n // Flash loan fee\n flashLoanFee = d(flashLoanAmount).mul(clmm_fee_tier).toString()\n // Flash loan repayment amount\n repayFlashLoanAmount = d(flashLoanAmount).mul(d(1).add(clmm_fee_tier)).toDP(0, Decimal.ROUND_UP).toString()\n }\n\n // Target coin is quote for long position, base for short position\n const swapConvertAll = (is_long && is_quote) || (!is_long && !is_quote)\n let routers: any\n let partialAmountIn\n if (swapConvertAll) {\n // User's target asset equals borrow asset, convert all collateral assets\n const amountIn = d(deposits[0].depositedAmount.toString())\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .mul(is_close ? 1 : ratio)\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n routers = await this._sdk.SwapModules.findRouters(deposits[0].reserve.coinType, is_long ? quote_token : base_token, amountIn, true, [\n swap_clmm_pool,\n ])\n } else {\n // User's target asset doesn't equal borrow asset, partially convert collateral assets to repay debt\n const buffer_rate =\n '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC' === deposits[0].reserve.coinType ? 0.01 : 0.0025\n partialAmountIn = d(repayAmount)\n .mul(is_long ? quotePrice : basePrice)\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .mul(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .div(is_long ? basePrice : quotePrice)\n .mul(d(1).add(buffer_rate))\n .toDP(0, Decimal.ROUND_DOWN)\n .toString()\n routers = await this._sdk.SwapModules.findRouters(\n deposits[0].reserve.coinType,\n is_long ? quote_token : base_token,\n partialAmountIn.toString(),\n true,\n [swap_clmm_pool]\n )\n // Actual repayment amount\n if (!is_close) {\n repayAmount = d(routers?.amount_out.toString()).mul(d(1).sub(slippage)).toDP(0, Decimal.ROUND_DOWN).toString()\n }\n }\n // Borrowed assets to be repaid, borrows[0].borrowedAmount doesn't handle decimal, need to process decimal\n // Borrowed asset amount\n // Withdrawal amount = User input amount * leverage\n withdrawAmount = d(withdrawAmount).mul(leverage).toDP(0, Decimal.ROUND_DOWN).toString()\n withdrawAmountUSD = d(withdrawAmountUSD).mul(leverage)\n\n // Remaining borrowed assets\n const afterBorrowAmount = borrowAmount.mul(d(1).sub(ratio)).toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n // Remaining collateral assets\n const afterDepositAmount = d(deposits[0].depositedAmount.toString())\n .mul(is_long ? 10 ** baseTokenDecimal : 10 ** quoteTokenDecimal)\n .sub(d(withdrawAmount))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n // Router amount\n const amountIn = d(routers?.amount_in.toString()).toString()\n const amountOut = d(routers?.amount_out.toString()).toString()\n\n const withdrawCtokenAmount = d(withdrawAmount).div(ctokenExchangeRate.toString()).toDP(0, Decimal.ROUND_DOWN).toString()\n const afterBorrowAmountUSDDDecimal = d(afterBorrowAmountUSD).div(d(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal)))\n const afterDepositAmountUSDDecimal = d(afterDepositAmountUSD).div(d(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n let hasFlashLoan = true\n if (borrows.length > 0) {\n const currentBorrowAmountUSD = d(borrows[0].borrowedAmountUsd.toString())\n const afterLTV = currentBorrowAmountUSD.div(afterDepositAmountUSDDecimal).toString()\n const ltv = d(deposits[0].reserve.config.openLtvPct).mul(d(0.95)).div(100).toString()\n console.log('🚀🚀🚀 ~ positionModules.ts:1459 ~ PositionModules ~ afterLTV:', {\n afterLTV,\n ltv,\n afterDepositAmount,\n afterDepositAmountUSD: afterDepositAmountUSDDecimal,\n afterBorrowAmount,\n afterBorrowAmountUSD: afterBorrowAmountUSDDDecimal,\n withdrawAmount,\n currentBorrowAmountUSD,\n })\n if (d(afterLTV).lte(ltv)) {\n hasFlashLoan = false\n }\n }\n\n return {\n amount_in: amountIn,\n amount_out: amountOut,\n from: deposits[0].reserve.coinType,\n to: is_long ? base_token : quote_token,\n after_borrow_amount: afterBorrowAmount,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n after_deposit_amount: afterDepositAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n flash_loan_fee: flashLoanFee,\n clmm_fee_tier: clmmFeeTier,\n withdraw_amount: withdrawAmount,\n withdraw_ctoken_amount: withdrawCtokenAmount,\n repay_amount: repayAmount,\n ratio,\n is_close,\n is_long,\n deposits,\n borrows,\n reserve,\n base_token,\n quote_token,\n clmm_pool: clmmPool,\n clmm_pool_coin_type_a: clmmPoolCoinTypeA,\n clmm_pool_coin_type_b: clmmPoolCoinTypeB,\n position_cap_id,\n market_id,\n swap_convert_all: swapConvertAll,\n flash_loan_amount: flashLoanAmount,\n routers,\n repay_flash_loan_amount: repayFlashLoanAmount,\n partial_amount_in: partialAmountIn,\n has_flash_loan: hasFlashLoan,\n }\n }\n\n calculatePositionLeverage = async (params: CalculatePositionLeverageParams) => {\n const { position_id, current_leverage, target_leverage, swap_clmm_pool = '' } = params\n const laverageDiff = d(target_leverage).sub(d(current_leverage))\n const isUpLeverage = laverageDiff.gt(0)\n const { borrows, deposits, is_long, position_cap_id, market_id } = await this.getPositionInfo(position_id)\n const { base_token, quote_token } = await this._sdk.MarketModules.getMarketInfo(market_id)\n const otherToken = this.extractOtherTokenTypes(deposits, borrows, base_token, quote_token)\n const { reserve } = await this._sdk.SuiLendModule.getSuiLendReserveInfo(base_token, quote_token, undefined, otherToken)\n const baseTokenDecimal = reserve[0].mintDecimals\n const quoteTokenDecimal = reserve[1].mintDecimals\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve, true)\n const quotePrice = priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData[removeHexPrefix(base_token)]?.price\n const hasBorrow = borrows.length > 0\n // Current collateral value\n const currentDepositAmountUSD = deposits[0].depositedAmountUsd.toString()\n // Current collateral value\n const currentDepositAmount = deposits[0].depositedAmount.toString()\n // Current debt amount\n const currentBorrowAmount = hasBorrow\n ? d(borrows[0].borrowedAmount.toString()).mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n : d(0)\n // Current debt value\n const currentBorrowAmountUSD = hasBorrow ? borrows[0].borrowedAmountUsd.toString() : d(0)\n const bw = hasBorrow ? d(borrows[0].reserve.config.borrowWeightBps.toString()).div(10000).toString() : '1'\n const openLTV = d(deposits[0].reserve.config.openLtvPct).mul(d(0.95)).div(100).div(bw).toString()\n\n // Leverage difference\n const remainingOpenUSD = d(currentDepositAmountUSD).sub(d(currentBorrowAmountUSD)).mul(openLTV).toString()\n if (isUpLeverage) {\n const flashLoanCtokenAmountUsd = d(currentDepositAmountUSD).div(current_leverage).mul(laverageDiff)\n const afterLTV = flashLoanCtokenAmountUsd.add(currentBorrowAmountUSD).div(currentDepositAmountUSD).toString()\n\n const flashLoanCtokenAmount = flashLoanCtokenAmountUsd\n .div(is_long ? quotePrice : basePrice)\n .mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toDP(0, Decimal.ROUND_UP)\n // Flash loan is needed when leverage difference exceeds maximum open amount\n const isFlashLoan = d(afterLTV).gt(openLTV)\n const flashLoanAmount = flashLoanCtokenAmount\n // Amount needed for increasing leverage, borrowed from flash loan\n // Convert flash loan borrowed portion to collateral\n const from = is_long ? quote_token : base_token\n const to = is_long ? base_token : quote_token\n const routers = await this._sdk.SwapModules.findRouters(from, to, flashLoanAmount.toString(), true, [swap_clmm_pool])\n // Collateral amount\n const depositAmount = d(routers?.amount_out.toString()).toString()\n // Collateral value\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n let flashLoanFee\n let isLoanA\n let clmm_fee_tier\n let clmm_pool_coin_type_a\n let clmm_pool_coin_type_b\n let borrowAmount = '0'\n let borrowAmountUSD = '0'\n if (isFlashLoan) {\n const {\n clmm_pool_coin_type_a: flashLoanClmmPoolCoinTypeA,\n clmm_pool_coin_type_b: flashLoanClmmPoolCoinTypeB,\n clmm_pool,\n clmm_fee_tier: flashLoanClmmFeeTier,\n } = await this._sdk.SwapModules.getFlashLoanPool(from, flashLoanAmount.toString())\n clmm_fee_tier = flashLoanClmmFeeTier\n clmm_pool_coin_type_a = flashLoanClmmPoolCoinTypeA\n clmm_pool_coin_type_b = flashLoanClmmPoolCoinTypeB\n // Remaining available amount for opening position\n flashLoanFee = flashLoanAmount.mul(clmm_fee_tier).toString()\n isLoanA = is_long ? clmm_pool_coin_type_a == quote_token : clmm_pool_coin_type_b == base_token\n\n // Collateralize\n // Borrow assets to repay flash loan\n const debtAmount = d(flashLoanAmount).add(flashLoanFee).toDP(0, Decimal.ROUND_UP)\n borrowAmount = debtAmount.toString()\n borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n } else {\n borrowAmount = flashLoanCtokenAmount.toString()\n borrowAmountUSD = flashLoanCtokenAmountUsd.toString()\n }\n\n const afterDepositAmount = d(currentDepositAmount)\n .add(d(depositAmount).div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n const afterBorrowAmount = d(currentBorrowAmount)\n .add(d(borrowAmount))\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n\n return {\n amount_in: routers?.amount_in.toString(),\n amount_out: routers?.amount_out.toString(),\n flash_loan_fee: flashLoanFee,\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n flash_loan_amount: flashLoanAmount,\n base_token,\n quote_token,\n reserve,\n deposits,\n borrows,\n clmm_fee_tier,\n is_flash_loan: isFlashLoan,\n is_loan_a: isLoanA,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n after_deposit_amount: afterDepositAmount,\n after_borrow_amount: afterBorrowAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n position_cap_id,\n market_id,\n is_long,\n routers,\n }\n } else {\n // User net worth\n const netValue = d(currentDepositAmountUSD).div(current_leverage)\n // Repayment amount needed for decreasing leverage\n const repayAmount = netValue\n .mul(laverageDiff.abs())\n .div(is_long ? quotePrice : basePrice)\n .mul(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toDP(0, Decimal.ROUND_UP)\n // Given repayment amount, calculate how much collateral asset needs to be withdrawn\n const routers = await this._sdk.SwapModules.findRouters(\n deposits[0].reserve.coinType,\n borrows[0].reserve.coinType,\n repayAmount.toString(),\n false,\n [swap_clmm_pool]\n )\n // Amount of collateral asset to withdraw\n const withdrawCtokenAmount = routers?.amount_in.toString()\n const withdrawCtokenAmountUsd = d(withdrawCtokenAmount)\n .mul(is_long ? basePrice : quotePrice)\n .div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal))\n .toString()\n const openLtvAmountUSD = d(currentDepositAmountUSD).mul(openLTV).toString()\n\n const afterLTV = d(currentBorrowAmountUSD)\n .div(d(currentDepositAmountUSD).sub(d(withdrawCtokenAmountUsd)))\n .toString()\n\n // Flash loan is needed when leverage difference exceeds maximum open amount\n const isFlashLoan = d(afterLTV).gt(openLTV)\n const borrowAmount = repayAmount.toString()\n const borrowAmountUSD = d(borrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n const depositAmount = withdrawCtokenAmount\n const depositAmountUSD = d(depositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n let clmm_fee_tier\n let clmm_pool_coin_type_a = ''\n let clmm_pool_coin_type_b = ''\n if (isFlashLoan) {\n const {\n clmm_pool_coin_type_a: flashLoanClmmPoolCoinTypeA,\n clmm_pool_coin_type_b: flashLoanClmmPoolCoinTypeB,\n clmm_pool,\n clmm_fee_tier: flashLoanClmmFeeTier,\n } = await this._sdk.SwapModules.getFlashLoanPool(borrows[0].reserve.coinType, borrowAmount.toString())\n clmm_fee_tier = flashLoanClmmFeeTier\n clmm_pool_coin_type_a = flashLoanClmmPoolCoinTypeA\n clmm_pool_coin_type_b = flashLoanClmmPoolCoinTypeB\n }\n\n const afterDepositAmount = d(currentDepositAmount)\n .sub(d(depositAmount).div(10 ** (is_long ? baseTokenDecimal : quoteTokenDecimal)))\n .toString()\n const afterDepositAmountUSD = d(afterDepositAmount)\n .mul(is_long ? basePrice : quotePrice)\n .toString()\n\n const afterBorrowAmount = d(currentBorrowAmount)\n .sub(d(borrowAmount))\n .div(10 ** (is_long ? quoteTokenDecimal : baseTokenDecimal))\n .toString()\n const afterBorrowAmountUSD = d(afterBorrowAmount)\n .mul(is_long ? quotePrice : basePrice)\n .toString()\n\n return {\n amount_in: routers?.amount_in.toString(),\n amount_out: routers?.amount_out.toString(),\n deposit_amount: depositAmount,\n borrow_amount: borrowAmount,\n deposit_amount_usd: depositAmountUSD,\n borrow_amount_usd: borrowAmountUSD,\n base_token,\n quote_token,\n reserve,\n deposits,\n borrows,\n clmm_fee_tier,\n withdraw_ctoken_amount: withdrawCtokenAmount,\n is_flash_loan: isFlashLoan,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n after_deposit_amount: afterDepositAmount,\n after_borrow_amount: afterBorrowAmount,\n after_deposit_amount_usd: afterDepositAmountUSD,\n after_borrow_amount_usd: afterBorrowAmountUSD,\n position_cap_id,\n market_id,\n is_long,\n routers,\n }\n }\n }\n\n calculatePositionRepay = async (params: CalculatePositionRepayParams) => {\n const { position_id, amount, is_quote } = params\n const { borrows, deposits, is_long, market_id, position_cap_id } = await this._sdk.PositionModules.getPositionInfo(position_id)\n const repayCoinType = borrows[0].reserve.coinType\n const baseToken = is_long ? deposits[0].reserve.coinType : borrows[0].reserve.coinType\n const quoteToken = is_long ? borrows[0].reserve.coinType : deposits[0].reserve.coinType\n let routers: any\n\n const hasSwap = is_long ? !is_quote : is_quote\n if (hasSwap) {\n routers = await this._sdk.SwapModules.findRouters(is_quote ? quoteToken : baseToken, repayCoinType, amount, true, [])\n }\n return {\n routers,\n repay_coin_type: repayCoinType,\n base_token: baseToken,\n quote_token: quoteToken,\n is_long,\n borrows,\n deposits,\n market_id,\n position_cap_id,\n has_swap: hasSwap,\n }\n }\n}\n","/*\r\n * bignumber.js v9.3.1\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // The index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne + (id === 2 && e > ne);\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","/*!\r\n * decimal.js v10.6.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|bigint|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Infinity or NaN?\r\n if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n if (t === 'bigint') {\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import type { CetusMarginTradingSDK } from '../sdk'\nimport { SuilendClient } from '@suilend/sdk/client'\nimport {\n initializeSuilend,\n initializeSuilendRewards,\n initializeObligations,\n formatRewards,\n Side,\n getFilteredRewards,\n getStakingYieldAprPercent,\n getDedupedPerDayRewards,\n getDedupedAprRewards,\n getTotalAprPercent,\n getNetAprPercent,\n PerDayRewardSummary,\n AprRewardSummary,\n} from '@suilend/sdk'\nimport { AllAppData, Price } from '../types'\nimport BigNumber from 'bignumber.js'\nimport { calculateBorrowAprPercent, calculateDepositAprPercent, getPriceWithFormattedDecimals } from '../utils/suiLend'\nimport { d, getPackagerConfigs, removeHexPrefix } from '@cetusprotocol/common-sdk'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { Reserve } from '@suilend/sdk/_generated/suilend/reserve/structs'\nimport { toHEX } from '@mysten/sui/utils'\nimport Decimal from 'decimal.js'\nimport { SuiLendCoinAprResult } from '../types'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class SuiLendModule {\n private sdk: CetusMarginTradingSDK\n\n // Cache variables\n lendingMarketCache?: AllAppData\n obligationsCache?: Record<string, any>\n\n // Add suilendClient cache\n private suilendClientCache?: Record<string, SuilendClient>\n\n constructor(sdk: CetusMarginTradingSDK) {\n this.sdk = sdk\n }\n\n /**\n * Get or initialize SuilendClient\n * @param lending_market_id Lending market ID\n * @param lending_market_type Lending market type\n */\n async getSuilendClient(lending_market_id: string, lending_market_type: string): Promise<SuilendClient> {\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n\n if (!this.suilendClientCache) {\n this.suilendClientCache = {}\n }\n\n if (!this.suilendClientCache[cacheKey]) {\n this.suilendClientCache[cacheKey] = await SuilendClient.initialize(lending_market_id, lending_market_type, this.sdk.FullClient, true)\n }\n\n return this.suilendClientCache[cacheKey]\n }\n\n /**\n * Get lending market data (cached)\n * @param force_refresh Whether to force refresh\n */\n async getLendingMarketData(force_refresh = true): Promise<AllAppData> {\n const cacheKey = 'lendingMarketData'\n const cachedData = this.sdk.getCache<AllAppData>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const lendingMarkets = getPackagerConfigs(this.sdk.sdkOptions?.suilend)?.lending_market || []\n console.log('🚀🚀🚀 ~ suilendModule.ts:67 ~ SuiLendModule ~ getLendingMarketData ~ lendingMarkets:', lendingMarkets)\n\n if (!lendingMarkets.length) {\n console.warn('⚠️ No lending markets configured.')\n return {} as AllAppData\n }\n\n try {\n const [allLendingMarketData, lstAprPercentMap] = await Promise.all([\n (async () => {\n const allLendingMarketData: AllAppData['allLendingMarketData'] = Object.fromEntries(\n await Promise.all(\n lendingMarkets.map(async (LENDING_MARKET) => {\n // Use cached SuilendClient\n const suilendClient = await this.getSuilendClient(LENDING_MARKET.id, LENDING_MARKET.type)\n\n const {\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n } = await initializeSuilend(this.sdk.FullClient, suilendClient)\n\n const { rewardPriceMap } = await initializeSuilendRewards(reserveMap, activeRewardCoinTypes)\n\n return [\n LENDING_MARKET.id,\n {\n suilendClient,\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardPriceMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n },\n ]\n })\n )\n )\n return allLendingMarketData\n })(),\n (async () => {\n try {\n const res = await fetch(`${this.sdk.sdkOptions?.suilend?.config?.api_url}/springsui/apy`)\n const json: Record<string, string> = await res.json()\n if ((res as any)?.statusCode === 500) throw new Error('Failed to fetch SpringSui LST APRs')\n\n return Object.fromEntries(Object.entries(json).map(([coinType, aprPercent]) => [coinType, new BigNumber(aprPercent)]))\n } catch (err) {\n console.error(err)\n return {} as AllAppData['lstAprPercentMap']\n }\n })(),\n ])\n\n // Store in cache\n this.sdk.updateCache(cacheKey, { allLendingMarketData, lstAprPercentMap }, 30 * 1000)\n\n return { allLendingMarketData, lstAprPercentMap }\n } catch (error) {\n console.log('🚀 getLendingMarketData error:', error)\n throw error\n }\n }\n\n /**\n * Get obligations data (cached)\n * @param all_app_data Lending market data (optional)\n * @param force_refresh Whether to force refresh\n */\n async getInitializeObligations(all_app_data?: AllAppData, force_refresh = false): Promise<any> {\n if (!force_refresh && this.obligationsCache) {\n return this.obligationsCache\n }\n\n if (!all_app_data) {\n all_app_data = await this.getLendingMarketData(false)\n }\n\n const result: Record<string, any> = {}\n for (const appData of Object.values(all_app_data.allLendingMarketData)) {\n const { obligationOwnerCaps, obligations } = await initializeObligations(\n this.sdk.FullClient,\n appData.suilendClient,\n appData.refreshedRawReserves,\n appData.reserveMap,\n this.sdk.senderAddress\n )\n\n if (obligations.length > 0) {\n console.log(\n '🚀🚀🚀 ~ suilendModule.ts:181 ~ SuiLendModule ~ getInitializeObligations ~ obligations:',\n obligations[0].original.allowedBorrowValueUsd.value.toString()\n )\n }\n\n const rewardMap = formatRewards(\n appData.reserveMap,\n appData.rewardCoinMetadataMap,\n appData.rewardPriceMap as Record<string, BigNumber | undefined>,\n obligations\n )\n\n result[appData.lendingMarket.id] = {\n obligationOwnerCaps,\n obligations,\n rewardMap,\n }\n }\n\n // Store in cache\n this.obligationsCache = result\n\n return this.obligationsCache\n }\n\n getCoinAprByAmount = async (coin_type: string, amount: Decimal, side: Side): Promise<SuiLendCoinAprResult> => {\n const changeAmount = new BigNumber(amount.toString())\n const { allLendingMarketData, lstAprPercentMap } = await this.getLendingMarketData(false)\n await this.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, true)\n if (!allLendingMarketData || !lstAprPercentMap) {\n throw new Error('lendingMarketCache is not initialized')\n }\n\n const list: any = Object.values(allLendingMarketData ?? {})[0]\n const reserve = list.lendingMarket.reserves.find((r: any) => r.coinType === coin_type)\n if (!reserve) {\n throw new Error('reserve not found')\n }\n const currentUserData = this.obligationsCache?.[list.lendingMarket.id]\n const rewards = currentUserData.rewardMap[reserve.token.coinType]?.[side] ?? []\n\n const filteredRewards = getFilteredRewards(rewards)\n\n const stakingYieldAprPercent = getStakingYieldAprPercent(side, reserve.coinType, lstAprPercentMap)\n\n const aprPercent = side === Side.DEPOSIT ? reserve.depositAprPercent : reserve.borrowAprPercent\n let newAprPercent: BigNumber | undefined = aprPercent\n\n let rewardsAprMultiplier = new BigNumber(1)\n let isRewardsAprMultiplierValid = true\n\n const showChange = side !== undefined && changeAmount !== undefined && changeAmount.gt(0)\n if (showChange) {\n const newReserve = {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(side === Side.DEPOSIT ? changeAmount : changeAmount.negated()), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(side === Side.BORROW ? changeAmount : changeAmount.negated()), 0)\n : reserve.borrowedAmount,\n }\n newAprPercent = side === Side.DEPOSIT ? calculateDepositAprPercent(newReserve) : calculateBorrowAprPercent(newReserve)\n\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount\n\n // Assumes LM rewards are distributed proportionally to the reserve size\n rewardsAprMultiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount)\n isRewardsAprMultiplierValid = !rewardsAprMultiplier.eq(-1)\n }\n\n // Per day rewards\n const perDayRewards = getDedupedPerDayRewards(filteredRewards)\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isRewardsAprMultiplierValid ? r.stats.perDay.times(rewardsAprMultiplier) : undefined,\n },\n })) as PerDayRewardSummary[]\n\n // APR rewards\n const aprRewards = getDedupedAprRewards(filteredRewards)\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isRewardsAprMultiplierValid ? r.stats.aprPercent.times(rewardsAprMultiplier) : undefined,\n },\n })) as AprRewardSummary[]\n\n // Total APR\n const totalAprPercent = getTotalAprPercent(side, aprPercent, filteredRewards, stakingYieldAprPercent)\n const newTotalAprPercent =\n newAprPercent === undefined || newAprRewards.some((reward) => reward.stats.aprPercent === undefined)\n ? undefined\n : getTotalAprPercent(side, newAprPercent, newAprRewards, stakingYieldAprPercent)\n console.log('🚀🚀🚀 ~ suilendModule.ts:315 ~ SuiLendModule ~ newTotalAprPercent:', newTotalAprPercent?.toString())\n\n return {\n new_total_apr_percent: newTotalAprPercent?.toString(),\n total_apr_percent: totalAprPercent.toString(),\n }\n }\n\n /**\n * Get user lending data\n * @param obligation_id Obligation ID (optional)\n * @param force_refresh Whether to force refresh\n */\n async getSuiLendUserData(obligation_id: string, force_refresh = false) {\n const { allLendingMarketData, lstAprPercentMap } = await this.getLendingMarketData(false)\n const obligations = await this.getInitializeObligations({ allLendingMarketData, lstAprPercentMap }, false)\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n const userData = obligations[lending_market_id]\n if (!userData) {\n throw new Error(`No user data found for lending market: ${lending_market_id}`)\n }\n const obligation = userData.obligations.find((o: any) => o.id === obligation_id)\n if (!obligation) {\n throw new Error(`Obligation not found: ${obligation_id}`)\n }\n\n const netAprPercent = getNetAprPercent(obligation, userData.rewardMap, lstAprPercentMap ?? {})\n\n return {\n obligation,\n netAprPercent,\n deposits: obligation.deposits,\n borrowedAmount: obligation.borrowedAmount,\n depositedAmount: obligation.depositedAmount,\n netValueUsd: obligation.netValueUsd,\n rewardMap: userData.rewardMap,\n }\n }\n\n // Update contract oracle price\n refreshReservePrice = async (tx: Transaction, price_object_id: string, reserve_array_index: bigint) => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n if (!this.suilendClientCache) {\n throw new Error('suilendClientCache is not initialized')\n }\n const priceInfoObjectId = await this.suilendClientCache[cacheKey].pythClient.getPriceFeedObjectId(price_object_id)\n\n this.suilendClientCache[cacheKey].refreshReservePrices(tx, priceInfoObjectId as string, reserve_array_index)\n }\n\n // Get oracle price\n getLatestPriceFeeds = async (reserves: Reserve<string>[], force_refresh = false) => {\n const { lending_market_id, lending_market_type } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n const priceMap: Record<string, Price> = {}\n const notFindList = []\n reserves.forEach((item) => {\n const data = this.sdk.getCache<Price>(`getLatestPrice_${item.coinType.name}`, force_refresh)\n if (data && this.priceCheck(data, 60)) {\n priceMap[item.coinType.name] = data\n } else {\n notFindList.push(item.coinType.name)\n }\n })\n if (notFindList.length == 0) {\n return priceMap\n }\n\n const cacheKey = `${lending_market_id}_${lending_market_type}`\n if (!this.suilendClientCache) {\n throw new Error('suilendClient is not initialized')\n }\n const priceIdentifiers = Array.from(\n new Set(\n reserves.map((r) =>\n r?.priceIdentifier?.bytes ? toHEX(new Uint8Array(r.priceIdentifier.bytes)) : removeHexPrefix(r.priceIdentifier.toString())\n )\n )\n )\n const priceUpdateData = await this.suilendClientCache[cacheKey].pythConnection.getLatestPriceFeeds(priceIdentifiers as string[])\n\n priceUpdateData?.forEach((priceFeed, index) => {\n const priceObj = priceFeed.getPriceUnchecked()\n const info: any = reserves[index]\n if (priceObj) {\n const { price, expo } = priceObj\n // Adjust the price based on the exponent (decimals)\n const realPrice = d(price)\n .mul(d(10).pow(d(expo)))\n .toString()\n const data: Price = {\n coin_type: info.coinType.name || info.coinType,\n price: realPrice,\n oracle_price: 0n,\n last_update_time: priceObj.publishTime,\n }\n // Calculate the formatted oracle price and update the map\n data.oracle_price = getPriceWithFormattedDecimals(BigInt(price), BigInt(expo))\n priceMap[info.coinType.name || info.coinType] = data\n this.sdk.updateCache(`getLatestPrice_${data.coin_type}`, data)\n }\n })\n return priceMap\n }\n\n getLatestPriceFeedsByCoinTypes = async (coin_types: string[], force_refresh = false) => {\n try {\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n const { allLendingMarketData } = await this.getLendingMarketData(false)\n const reservesInfo: Reserve<string>[] = []\n coin_types.forEach((coinType) => {\n const reserve: any = allLendingMarketData[lending_market_id].reserveMap[coinType]\n reservesInfo.push(reserve)\n })\n const priceMap = await this.getLatestPriceFeeds(reservesInfo, force_refresh)\n return priceMap\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return undefined\n }\n }\n\n priceCheck(price: Price, age = 60) {\n const currentTime = Math.floor(Date.now() / 1000)\n if (Math.abs(currentTime - price.last_update_time) > age) {\n return undefined\n }\n\n return price\n }\n\n // Get suiLend reserve information\n getSuiLendReserveInfo = async (\n base_token: string,\n quote_token: string,\n all_lending_market_data?: AllAppData['allLendingMarketData'],\n other_token?: string[]\n ) => {\n const { lending_market_id } = getPackagerConfigs(this.sdk.sdkOptions?.suilend)\n\n // If no data is passed, fetch it (using cache)\n if (!all_lending_market_data) {\n const data = await this.getLendingMarketData(false)\n all_lending_market_data = data.allLendingMarketData\n }\n\n const baseReserve = all_lending_market_data[lending_market_id].reserveMap[base_token]\n const quoteReserve = all_lending_market_data[lending_market_id].reserveMap[quote_token]\n const refreshedBaseRawReserves = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(base_token)\n })\n const refreshedQuoteRawReserves = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(quote_token)\n })\n const baseReserveMapInfo = all_lending_market_data[lending_market_id].reserveMap[base_token]\n const quoteReserveMapInfo = all_lending_market_data[lending_market_id].reserveMap[quote_token]\n\n let refreshedOtherRawReserves: Reserve<string>[] = []\n if (other_token) {\n other_token.forEach((token) => {\n const reserve = all_lending_market_data[lending_market_id].refreshedRawReserves.filter((r: any) => {\n return r.coinType.name == removeHexPrefix(token)\n })\n refreshedOtherRawReserves.push(...reserve)\n })\n }\n\n return {\n base_reserve_array_index: baseReserve.arrayIndex.toString(),\n quote_reserve_array_index: quoteReserve.arrayIndex.toString(),\n reserve: [refreshedBaseRawReserves[0], refreshedQuoteRawReserves[0], ...refreshedOtherRawReserves],\n base_reserve_map_info: baseReserveMapInfo,\n quote_reserve_map_info: quoteReserveMapInfo,\n }\n }\n\n refreshReservePrices = async (tx: Transaction, reserve: Reserve<string>[]) => {\n for (let i = 0; i < reserve.length; i++) {\n const priceObjectId = toHEX(new Uint8Array(reserve[i].priceIdentifier.bytes))\n await this.refreshReservePrice(tx, priceObjectId, BigInt(reserve[i].arrayIndex))\n }\n }\n\n refreshReservePricesV2 = async (tx: Transaction, reserve: Reserve<string>[]) => {\n for (let i = 0; i < reserve.length; i++) {\n const priceObjectId = reserve[i].priceIdentifier.toString()\n await this.refreshReservePrice(tx, priceObjectId, BigInt(reserve[i].arrayIndex))\n }\n }\n}\n","import { AprRewardSummary, linearlyInterpolate, ParsedReserve, PerDayRewardSummary, Side } from \"@suilend/sdk\";\nimport { CetusMarginTradingSDK } from \"../sdk\";\nimport { NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE, NORMALIZED_LBTC_COINTYPE, formatLtvPercent } from '@suilend/sui-fe'\nimport BigNumber from \"bignumber.js\";\nimport { v4 as uuidv4 } from 'uuid'\nimport { getPackagerConfigs } from \"@cetusprotocol/common-sdk\";\nexport const oraclePriceMultiplierDecimal = 10n\n\nexport function calculateUtilizationPercent(reserve: ParsedReserve): BigNumber {\n return reserve.depositedAmount.eq(0)\n ? new BigNumber(0)\n : reserve.borrowedAmount.div(reserve.depositedAmount).times(100);\n}\n\nexport function calculateBorrowAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n if (utilizationPercent.gt(100)) return undefined;\n\n return linearlyInterpolate(\n reserve.config.interestRate,\n \"utilPercent\",\n \"aprPercent\",\n utilizationPercent,\n );\n}\n\nexport function calculateDepositAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n const borrowAprPercent = calculateBorrowAprPercent(reserve);\n\n if (borrowAprPercent === undefined || utilizationPercent.gt(100)) return undefined;\n\n return new BigNumber(utilizationPercent.div(100))\n .times(borrowAprPercent.div(100))\n .times(1 - reserve.config.spreadFeeBps / 10000)\n .times(100);\n}\n\nexport function appendExtraRewards(\n side: Side,\n reserve: ParsedReserve,\n filteredRewards: any[],\n sdk: CetusMarginTradingSDK,\n) {\n const { api_url } = getPackagerConfigs(sdk.sdkOptions.suilend)\n if (side === Side.DEPOSIT) {\n if ([NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE].includes(reserve.coinType)) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LIQ_AG\",\n mintDecimals: 0,\n symbol: \"LiqAg Points\",\n iconUrl: `${api_url}/partners/LiqAg.png`,\n perDay: new BigNumber(0.036),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n\n if (reserve.coinType === NORMALIZED_LBTC_COINTYPE) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LOMBARD\",\n mintDecimals: 0,\n symbol: \"3x Lombard Lux\",\n iconUrl: `${api_url}/partners/Lombard Lux.png`,\n perDay: new BigNumber(0),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n }\n}\n\nexport function getUpdatedReserve(reserve: ParsedReserve, side: Side, changeAmount: BigNumber): ParsedReserve {\n return {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(changeAmount), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(changeAmount), 0)\n : reserve.borrowedAmount,\n };\n}\n\n\nexport function getRewardsAprMultiplier(\n side: Side,\n reserve: ParsedReserve,\n newReserve: ParsedReserve\n): { multiplier: BigNumber; isValid: boolean } {\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount;\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount;\n\n const multiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount);\n return { multiplier, isValid: !multiplier.eq(-1) };\n}\n\n\nexport function updateRewardsWithMultiplier(\n perDayRewards: PerDayRewardSummary[],\n aprRewards: AprRewardSummary[],\n multiplier: BigNumber,\n isValid: boolean\n) {\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isValid ? r.stats.perDay.times(multiplier) : undefined,\n },\n })) as PerDayRewardSummary[];\n\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isValid ? r.stats.aprPercent.times(multiplier) : undefined,\n },\n })) as AprRewardSummary[];\n\n return { newPerDayRewards, newAprRewards };\n}\n\n\n\n\nexport function getPriceWithFormattedDecimals(\n pythPrice: bigint,\n expo: bigint // expo represents the decimal exponent\n): bigint {\n // Check if the required price multiplier is defined\n if (!oraclePriceMultiplierDecimal) {\n throw new Error('oraclePriceMultiplierDecimal is required')\n }\n\n // Price must be greater than 0\n if (pythPrice === 0n) {\n throw new Error('Invalid oracle price')\n }\n\n // If expo is negative, the price needs to be scaled up\n if (expo < 0n) {\n // Calculate the scale factor for negative expo values\n const scaleFactor = 10n ** (oraclePriceMultiplierDecimal - -expo) // Convert expo to a positive number\n return pythPrice * scaleFactor // Scale up the price\n }\n\n // If expo is positive, the price needs to be scaled down\n return pythPrice / 10n ** (expo + oraclePriceMultiplierDecimal)\n}\n\nexport function formatLtvPercentValue(value: string) {\n return formatLtvPercent(new BigNumber(value))\n}","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import Decimal from 'decimal.js'\nimport { CetusMarginTradingSDK } from '../sdk'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { FindRouterParams } from '@cetusprotocol/aggregator-sdk'\nimport BN from 'bn.js'\nimport { addHexPrefix, CoinAssist, d, getPackagerConfigs, removeHexPrefix } from '@cetusprotocol/common-sdk'\nimport { CalculateFlashLoanParams, FlashLoanParams, RepayFlashSwapParams, RouterSwapParams } from '../types'\nimport { handleError, MarginTradingErrorCode } from '../errors/errors'\n\nexport class SwapModules {\n protected _sdk: CetusMarginTradingSDK\n\n constructor(sdk: CetusMarginTradingSDK) {\n this._sdk = sdk\n }\n\n /**\n * Find router\n */\n public async findRouters(coin_type_a: string, coin_type_b: string, amount: string, by_amount_in: boolean, pools: string[]) {\n try {\n const findRouterParams: FindRouterParams = {\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(d(amount).toFixed(0).toString()),\n byAmountIn: by_amount_in,\n depth: 3,\n }\n const res = await this._sdk.AggregatorClient.findRouters(findRouterParams)\n if (res?.error?.code === 10001) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (res?.insufficientLiquidity) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (!res?.paths || res?.paths?.length === 0) {\n throw Error('Aggregator no router')\n }\n\n return {\n amount_in: res.amountIn.toString(),\n amount_out: res.amountOut.toString(),\n is_exceed: res.insufficientLiquidity,\n route_obj: res,\n by_amount_in: true,\n origin_res: res,\n }\n } catch (error) {\n try {\n if (pools) {\n const res: any = await this._sdk.AggregatorClient.swapInPools({\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(d(amount).toFixed(0).toString()),\n byAmountIn: by_amount_in,\n pools,\n })\n\n if (res) {\n return {\n amount_in: res.routeData.amountIn.toString(),\n amount_out: res.routeData.amountOut.toString(),\n is_exceed: res.isExceed,\n route_obj: res.routeData,\n by_amount_in: true,\n origin_res: res,\n }\n }\n return null\n }\n return null\n } catch (e) {\n return null\n }\n }\n }\n\n /**\n * Execute router swap\n */\n public routerSwap = async (params: RouterSwapParams) => {\n const { slippage, txb, input_coin, router } = params\n const tx = txb || new Transaction()\n if (router) {\n return await this._sdk.AggregatorClient.routerSwap({ router, inputCoin: input_coin, slippage, txb: tx })\n }\n }\n\n /**\n * Check if swap is needed and handle swap logic\n * @param params Parameter object\n * @returns Swap result\n */\n async handleSwapLogic(params: {\n is_long: boolean\n is_quote: boolean\n amount: string\n base_token: string\n quote_token: string\n swap_clmm_pool: string\n slippage: number\n tx: Transaction\n }) {\n const { is_long, is_quote, amount, base_token, quote_token, swap_clmm_pool = '', slippage, tx } = params\n\n // Check if swap is needed\n const hasSwap = (is_long && is_quote) || (!is_long && !is_quote)\n\n let depositCoin: any\n let swapOutCoin: any\n let initDepositAmount = amount\n\n if (hasSwap) {\n // Long positions need to convert to base, short positions need to convert to quote\n // Determine swap from and to\n const from = is_long && is_quote ? quote_token : base_token\n const to = is_long && is_quote ? base_token : quote_token\n const routers = await this.findRouters(from, to, amount, true, [swap_clmm_pool])\n initDepositAmount = routers?.amount_out.toString()\n if (routers) {\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount), from, tx)\n swapOutCoin = await this.routerSwap({\n router: routers.route_obj,\n slippage,\n input_coin: inputCoin,\n txb: tx,\n })\n depositCoin = swapOutCoin\n }\n } else {\n depositCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), is_quote ? quote_token : base_token, tx)\n }\n\n return {\n has_swap: hasSwap,\n input_coin: depositCoin,\n init_deposit_amount: initDepositAmount,\n }\n }\n\n async handleSwap(params: {\n from: string\n to: string\n amount: string\n input_coin?: TransactionObjectArgument\n swap_clmm_pool: string\n slippage: number\n tx: Transaction\n }) {\n const { swap_clmm_pool = '', slippage, amount, from, to, tx, input_coin } = params\n\n // Find router\n const routers: any = await this.findRouters(from, to, amount, true, [swap_clmm_pool])\n const amountOut = routers.amount_out.toString()\n const swapOutCoin = await this.routerSwap({\n router: routers.route_obj,\n slippage,\n input_coin: input_coin || CoinAssist.buildCoinWithBalance(BigInt(amount), from, tx),\n txb: tx,\n })\n\n return {\n swap_out_coin: swapOutCoin,\n amount_out: amountOut,\n }\n }\n\n /**\n * Execute flash loan\n */\n flashLoan = (params: FlashLoanParams) => {\n console.log('🚀🚀🚀 ~ swapModules.ts:183 ~ SwapModules ~ params:', params)\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { amount, clmm_pool: clmmPool, clmm_pool_coin_type_a, clmm_pool_coin_type_b, flash_loan_coin, tx } = params\n const isLoanA = addHexPrefix(clmm_pool_coin_type_a) === flash_loan_coin\n console.log('🚀🚀🚀 ~ swapModules.ts:188 ~ SwapModules ~ isLoanA:', isLoanA)\n\n const [balanceA, balanceB, receipt] = tx.moveCall({\n target: `${clmm_pool.published_at}::pool::flash_loan`,\n arguments: [tx.object(global_config_id), tx.object(clmmPool), tx.pure.bool(isLoanA), tx.pure.u64(amount.toString())],\n typeArguments: [clmm_pool_coin_type_a, clmm_pool_coin_type_b],\n })\n return {\n balance_a: balanceA,\n balance_b: balanceB,\n receipt,\n is_loan_a: isLoanA,\n loan_coin_type: isLoanA ? clmm_pool_coin_type_a : clmm_pool_coin_type_b,\n }\n }\n\n /** Get flash loan pool */\n getFlashLoanPool = async (flash_loan_coin: string, flash_amount: string) => {\n console.log('🚀🚀🚀 ~ swapModules.ts:201 ~ SwapModules ~ flash_amount:', flash_amount, flash_loan_coin)\n try {\n const res = await fetch(\n `https://api-sui.cetus.zone/v3/sui/margin_trading/pools?coin_type=${flash_loan_coin}&min_amount=${flash_amount}`\n )\n const { data } = await res.json()\n console.log('🚀🚀🚀 ~ swapModules.ts:206 ~ SwapModules ~ data:', data)\n if (data && data.length > 0) {\n return {\n clmm_pool_coin_type_a: data[0].coin_type_a,\n clmm_pool_coin_type_b: data[0].coin_type_b,\n clmm_pool: data[0].pool_id,\n clmm_fee_tier: d(data[0].fee_rate).div(1000000).toString(),\n }\n } else {\n handleError(MarginTradingErrorCode.FlashLoanPoolNotFound, 'FlashLoanPoolNotFound')\n return {\n clmm_pool_coin_type_a: '',\n clmm_pool_coin_type_b: '',\n clmm_pool: '',\n clmm_fee_tier: '',\n }\n }\n } catch (error) {\n handleError(MarginTradingErrorCode.FetchError, error as Error)\n return {\n clmm_pool_coin_type_a: '',\n clmm_pool_coin_type_b: '',\n clmm_pool: '',\n clmm_fee_tier: '',\n }\n }\n }\n\n /**\n * Repay flash loan\n */\n public repayFlashLoan = (params: RepayFlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { tx, repay_base, repay_quote, receipt, clmm_pool: clmmPool, clmm_pool_coin_type_a, clmm_pool_coin_type_b } = params\n tx.moveCall({\n target: `${clmm_pool.published_at}::pool::repay_flash_loan`,\n arguments: [tx.object(global_config_id), tx.object(clmmPool), repay_base, repay_quote, receipt],\n typeArguments: [clmm_pool_coin_type_a, clmm_pool_coin_type_b],\n })\n\n return tx\n }\n\n /**\n * Calculate flash loan\n */\n async calculateFlashLoan(params: CalculateFlashLoanParams) {\n const { is_long, leverage, base_token, quote_token, deposit_amount, reserve, base_token_decimal, quote_token_decimal } = params\n\n // Get oracle price\n const priceUpdateData = await this._sdk.SuiLendModule.getLatestPriceFeeds(reserve)\n const quotePrice = priceUpdateData && priceUpdateData[removeHexPrefix(quote_token)]?.price\n const basePrice = priceUpdateData && priceUpdateData[removeHexPrefix(base_token)]?.price\n\n // For long positions calculate base to quote rate, for short positions calculate quote to base rate\n const rate = is_long ? d(basePrice).div(d(quotePrice)).toString() : d(quotePrice).div(d(basePrice)).toString()\n\n // Flash loan amount = user deposit amount * (leverage - 1) * rate / (baseTokenDecimal / quoteTokenDecimal)\n console.log(\n '🚀🚀🚀 ~ swapModules.ts:267 ~ SwapModules ~ calculateFlashLoan ~ deposit_amount:',\n deposit_amount,\n rate,\n base_token_decimal,\n quote_token_decimal\n )\n const flashAmount = d(deposit_amount)\n .mul(d(leverage).sub(1))\n .mul(rate)\n .div(10 ** (is_long ? base_token_decimal : quote_token_decimal))\n .mul(10 ** (is_long ? quote_token_decimal : base_token_decimal))\n .toDP(0, Decimal.ROUND_UP)\n .toString()\n console.log(\n '🚀🚀🚀 ~ swapModules.ts:274 ~ SwapModules ~ calculateFlashLoan ~ flashAmount:',\n d(deposit_amount)\n .mul(d(leverage).sub(1))\n .mul(rate)\n .div(10 ** (is_long ? base_token_decimal : quote_token_decimal))\n .mul(10 ** (is_long ? quote_token_decimal : base_token_decimal))\n .toString(),\n flashAmount\n )\n\n // Coin to borrow for flash loan\n const flashLoanCoin = is_long ? quote_token : base_token\n const { clmm_pool_coin_type_a, clmm_fee_tier, clmm_pool, clmm_pool_coin_type_b } = await this.getFlashLoanPool(\n flashLoanCoin,\n flashAmount\n )\n // Whether to borrow tokenA from clmm pool\n const isFlashA = clmm_pool_coin_type_a === flashLoanCoin\n // Flash loan fee\n const flashLoanFee = d(flashAmount).mul(clmm_fee_tier).toString()\n\n return {\n flash_amount: flashAmount,\n rate,\n quote_price: quotePrice,\n base_price: basePrice,\n flash_loan_coin: flashLoanCoin,\n is_flash_a: isFlashA,\n flash_loan_fee: flashLoanFee,\n clmm_pool,\n clmm_pool_coin_type_a,\n clmm_pool_coin_type_b,\n clmm_fee_tier,\n }\n }\n}\n","import { CetusMarginTradingSDK, SdkOptions } from \"./sdk\";\n\nexport * from './config'\nexport * from './utils'\nexport * from './utils/suiLend'\nexport * from './types'\nexport { CetusMarginTradingSDK, SdkOptions };\nexport default CetusMarginTradingSDK;\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","SuiClient","normalizeSuiAddress","SuiPriceServiceConnection","SdkWrapper","CetusClmmSDK","AggregatorClient","Env","FullRpcUrlMainnet","margin_trading_mainnet","CACHE_TIME_5MIN","d","getPackagerConfigs","Transaction","addHexPrefix","d","getObjectFields","parseObligation","getNetAprPercent","getTotalAprPercent","Side","getFilteredRewards","wrapMarketInfo","info","fields","open_permissions_pause","close_permissions_pause","deposit_permissions_pause","withdraw_permissions_pause","borrow_permissions_pause","repay_permissions_pause","wrapMarketPermissions","wrapPosition","position","position_cap_id","mergePositionData","obligation","reserve_map","lst_apr_percent_map","reward_map","obligationData","netAprPercent","firstDeposit","closeLTV","openLTV","cr","ltr","liquidationBuffer","totalBorrowAprPercent","totalSuppliedAPR","borrowedAmountUsd","borrowedAmount","firstBorrow","borrowRewards","permissions","permissionsLength","getFilteredRewards","getStakingYieldAprPercent","getTotalAprPercent","Side","BaseError","MarginTradingError","BaseError","message","error_code","details","e","code","handleError","error","errorDetails","MarketModules","sdk","params","package_id","versioned_id","admin_cap_id","markets","global_config_id","getPackagerConfigs","tx","Transaction","market_id","open_fee_rate","close_fee_rate","txb","base_token","quote_token","market_ids","i","initVersionedEvent","initAdminCapEvent","initGlobalConfigEvent","marketsTableId","error","handleError","force_refresh","cachedData","marketList","moveEventType","warpIds","object","item","marketInfo","wrapMarketInfo","cacheKey","result","CACHE_TIME_5MIN","lending_market_id","allLendingMarketData","lstAprPercentMap","base_reserve_map_info","quote_reserve_map_info","obligations","baseRewards","quoteRewards","baseDepositedAmountUsd","baseBorrowedAmountUsd","baseDepositAprPercent","baseBorrowAprPercent","baseDepositedAmount","baseBorrowedAmount","baseDepositLimit","baseBorrowLimit","quoteDepositedAmountUsd","quoteBorrowedAmountUsd","quoteDepositAprPercent","quoteBorrowAprPercent","quoteDepositedAmount","quoteBorrowedAmount","quoteDepositLimit","quoteBorrowLimit","baseTotalDepositAprPercent","getTotalAprPercent","Side","getFilteredRewards","getStakingYieldAprPercent","baseTotalBorrowAprPercent","quoteTotalDepositAprPercent","quoteTotalBorrowAprPercent","longLiquidity","d","shortLiquidity","baseTokenAvailableDepositAmount","baseTokenAvailableBorrowAmount","quoteTokenAvailableDepositAmount","quoteTokenAvailableBorrowAmount","CLOCK_ADDRESS","getPackagerConfigs","Transaction","PermissionModules","sdk","config","global_config_id","getPackagerConfigs","globalConfig","permissions","open_permissions_pause","close_permissions_pause","deposit_permissions_pause","withdraw_permissions_pause","borrow_permissions_pause","repay_permissions_pause","wrapMarketPermissions","pause","tx","Transaction","txb","versioned_id","admin_cap_id","CLOCK_ADDRESS","market_id","CACHE_TIME_24H","CLOCK_ADDRESS","CoinAssist","d","getObjectFields","getPackagerConfigs","removeHexPrefix","SUI_SYSTEM_STATE_OBJECT_ID","U64_MAX","isNumeric","mathceil","mathfloor","bignumberError","tooManyDigits","BASE","LOG_BASE","MAX_SAFE_INTEGER","POWS_TEN","SQRT_BASE","MAX","clone","configObject","div","convertBase","parseNumeric","P","BigNumber","ONE","DECIMAL_PLACES","ROUNDING_MODE","TO_EXP_NEG","TO_EXP_POS","MIN_EXP","MAX_EXP","CRYPTO","MODULO_MODE","POW_PRECISION","FORMAT","ALPHABET","alphabetHasNormalDecimalDigits","v","alphabet","c","caseChanged","e","i","isNum","len","str","x","intCheck","round","obj","p","n","s","out","maxOrMin","pow2_53","random53bitInt","dp","a","b","k","rand","args","sum","decimal","toBaseOut","baseIn","baseOut","j","arr","arrL","sign","callerIsToString","d","r","xc","y","rm","toFixedPoint","coeffToString","multiply","base","m","temp","xlo","xhi","carry","klo","khi","compare","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","yc","bitFloor","format","id","c0","ne","toExponential","normalise","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","p1","p2","sd","ni","rd","pows10","valueOf","half","isModExp","nIsBig","nIsNeg","nIsOdd","isOdd","t","xLTy","xe","ye","xcL","ycL","ylo","yhi","zc","sqrtBase","rep","g1","g2","groupSeparator","intPart","fractionPart","isNeg","intDigits","md","d0","d1","d2","exp","n0","n1","z","l","min","max","name","zs","bignumber_default","Transaction","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","i","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","r","rep","s","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","compoundDebt","PositionModules","sdk","wallet_address","force_refresh","lending_market_id","lending_market_type","getPackagerConfigs","mappingCacheKey","capIdToPositionIdMap","ownerRes","handleError","suiLendClient","allLendingMarketData","lstAprPercentMap","reserveMap","positionIdList","i","fields","getObjectFields","CACHE_TIME_24H","positionRes","obligations","positionList","positionId","positionCapId","capId","pid","position","wrapPosition","rawObligation","mergeData","mergePositionData","claimableRewards","error","position_id","params","marginTradingConfig","global_config_id","versioned_id","txb","repay_amount","repay_coin_type","repay_coin","repay_reserve_array_index","market_id","position_cap_id","margin_trading_context","tx","Transaction","coin","CoinAssist","CLOCK_ADDRESS","package_id","withdraw_amount","withdraw_reserve_array_index","withdraw_coin_type","exemption","SUI_SYSTEM_STATE_OBJECT_ID","reserve_array_index","borrow_amount","base_token","quote_token","is_long","position_cap","published_at","action","coin_type","amount","marginTradingContext","is_quote","swap_clmm_pool","slippage","leverage","flash_amount","flash_loan_coin","is_flash_a","clmm_pool_coin_type_a","clmm_pool_coin_type_b","clmm_pool","base_reserve_array_index","quote_reserve_array_index","reserve","has_swap","routers","balance_a","balance_b","receipt","debt_from","debt_to","init_deposit_coin","balance_coin_a","balance_coin_b","d","debtSwapResult","deposit_reserve_array_index","borrowCoin","zeroBalance","deposits","borrows","borrow_reserve_array_index","withdraw_ctoken_amount","is_close","swap_convert_all","flash_loan_amount","repay_flash_loan_amount","partial_amount_in","has_flash_loan","flashReceipt","isLoanA","is_loan_a","repayCoin","withdrawCoin","rewardCoin","U64_MAX","swapOutCoin","inputCoin","repayFlashLoanCoin","lendingMarketType","lendingMarketId","current_leverage","target_leverage","is_flash_loan","clmm_fee_tier","flashLoanFee","repayFlashLoanAmount","decimal_default","otherToken","hasSwap","depositCoin","priceUpdateData","quotePrice","removeHexPrefix","basePrice","rate","baseTokenDecimal","quoteTokenDecimal","withdrawAmount","targetCoin","obligation_owner_cap","claimable_rewards","suilend","margin_trading","by_amount_in","is_submit","is_open","positionDeposits","positionBorrows","initDepositAmount","from","to","base_price","quote_price","flash_loan_fee","debtRouters","depositAmount","depositAmountUSD","borrowAmount","borrowAmountUSD","leverageDepositAmount","afterBorrowAmount","afterBorrowAmountUSD","afterDepositAmount","afterDepositAmountUSD","withdraw_max","origin_obligation","base_reserve_map_info","quote_reserve_map_info","ctokenExchangeRate","withdrawAmountUSD","availableWithdrawAmountUSD","ratio","debtBorrow","compoundDebt","repayAmount","flashLoanAmount","clmmFeeTier","clmmPool","clmmPoolCoinTypeA","clmmPoolCoinTypeB","swapConvertAll","partialAmountIn","amountIn","buffer_rate","amountOut","withdrawCtokenAmount","afterBorrowAmountUSDDDecimal","afterDepositAmountUSDDecimal","hasFlashLoan","currentBorrowAmountUSD","afterLTV","ltv","laverageDiff","isUpLeverage","hasBorrow","currentDepositAmountUSD","currentDepositAmount","currentBorrowAmount","bw","openLTV","remainingOpenUSD","flashLoanCtokenAmountUsd","flashLoanCtokenAmount","isFlashLoan","flashLoanClmmPoolCoinTypeA","flashLoanClmmPoolCoinTypeB","flashLoanClmmFeeTier","withdrawCtokenAmountUsd","openLtvAmountUSD","repayCoinType","baseToken","quoteToken","obligationData","reserves","WAD","bignumber_default","poolRewardInfoMap","nowMs","reserveCoinType","reserveArrayIndex","depositsPoolRewards","pr","id","coinType","startTimeMs","endTimeMs","isActive","mintDecimals","globalCumulative","borrowsPoolRewards","userRewardManagers","urm","reward","rewardInfo","globalCumulativePerShare","userCumulativePerShare","pendingRewards","earnedRewards","actualClaimable","price","earnedRewardsFormatted","earnedRewardsUsd","leverageConfig","init_deposit_amount","init_coin_type","input_coin","otherTokens","deposit","borrow","SuilendClient","initializeSuilend","initializeSuilendRewards","initializeObligations","formatRewards","Side","getFilteredRewards","getStakingYieldAprPercent","getDedupedPerDayRewards","getDedupedAprRewards","getTotalAprPercent","getNetAprPercent","linearlyInterpolate","Side","NORMALIZED_flSUI_COINTYPE","NORMALIZED_jugSUI_COINTYPE","NORMALIZED_LBTC_COINTYPE","formatLtvPercent","crypto","rnds8Pool","poolPtr","rng","byteToHex","i","unsafeStringify","arr","offset","crypto","native_default","v4","options","buf","offset","native_default","rnds","rng","i","unsafeStringify","v4_default","getPackagerConfigs","oraclePriceMultiplierDecimal","calculateUtilizationPercent","reserve","bignumber_default","calculateBorrowAprPercent","utilizationPercent","linearlyInterpolate","calculateDepositAprPercent","borrowAprPercent","appendExtraRewards","side","filteredRewards","sdk","api_url","Side","NORMALIZED_flSUI_COINTYPE","NORMALIZED_jugSUI_COINTYPE","v4_default","NORMALIZED_LBTC_COINTYPE","getUpdatedReserve","changeAmount","getRewardsAprMultiplier","newReserve","totalAmount","newTotalAmount","multiplier","updateRewardsWithMultiplier","perDayRewards","aprRewards","isValid","newPerDayRewards","r","newAprRewards","getPriceWithFormattedDecimals","pythPrice","expo","scaleFactor","formatLtvPercentValue","value","formatLtvPercent","d","getPackagerConfigs","removeHexPrefix","toHEX","SuiLendModule","sdk","coin_type","amount","side","changeAmount","bignumber_default","allLendingMarketData","lstAprPercentMap","list","reserve","r","rewards","filteredRewards","getFilteredRewards","stakingYieldAprPercent","getStakingYieldAprPercent","aprPercent","Side","newAprPercent","rewardsAprMultiplier","isRewardsAprMultiplierValid","newReserve","calculateDepositAprPercent","calculateBorrowAprPercent","totalAmount","newTotalAmount","newPerDayRewards","getDedupedPerDayRewards","newAprRewards","getDedupedAprRewards","totalAprPercent","getTotalAprPercent","newTotalAprPercent","reward","tx","price_object_id","reserve_array_index","lending_market_id","lending_market_type","getPackagerConfigs","cacheKey","priceInfoObjectId","reserves","force_refresh","priceMap","notFindList","item","data","priceIdentifiers","toHEX","removeHexPrefix","priceFeed","index","priceObj","info","price","expo","realPrice","d","getPriceWithFormattedDecimals","coin_types","reservesInfo","coinType","error","handleError","base_token","quote_token","all_lending_market_data","other_token","baseReserve","quoteReserve","refreshedBaseRawReserves","refreshedQuoteRawReserves","baseReserveMapInfo","quoteReserveMapInfo","refreshedOtherRawReserves","token","i","priceObjectId","SuilendClient","cachedData","lendingMarkets","LENDING_MARKET","suilendClient","lendingMarket","coinMetadataMap","refreshedRawReserves","reserveMap","reserveCoinTypes","reserveCoinMetadataMap","rewardCoinTypes","activeRewardCoinTypes","rewardCoinMetadataMap","initializeSuilend","rewardPriceMap","initializeSuilendRewards","res","json","err","all_app_data","result","appData","obligationOwnerCaps","obligations","initializeObligations","rewardMap","formatRewards","obligation_id","userData","obligation","o","netAprPercent","getNetAprPercent","age","currentTime","import_bn","Transaction","addHexPrefix","CoinAssist","d","getPackagerConfigs","removeHexPrefix","SwapModules","sdk","params","slippage","txb","input_coin","router","tx","Transaction","clmm_pool","global_config_id","getPackagerConfigs","amount","clmmPool","clmm_pool_coin_type_a","clmm_pool_coin_type_b","flash_loan_coin","isLoanA","addHexPrefix","balanceA","balanceB","receipt","flash_amount","res","data","d","handleError","error","repay_base","repay_quote","coin_type_a","coin_type_b","by_amount_in","pools","findRouterParams","BN","is_long","is_quote","base_token","quote_token","swap_clmm_pool","hasSwap","depositCoin","swapOutCoin","initDepositAmount","from","to","routers","inputCoin","CoinAssist","amountOut","leverage","deposit_amount","reserve","base_token_decimal","quote_token_decimal","priceUpdateData","quotePrice","removeHexPrefix","basePrice","rate","flashAmount","decimal_default","flashLoanCoin","clmm_fee_tier","isFlashA","flashLoanFee","CetusMarginTradingSDK","_CetusMarginTradingSDK","SdkWrapper","options","clmmSDK","SuiLendModule","PermissionModules","MarketModules","PositionModules","SwapModules","AggregatorClient","normalizeSuiAddress","SuiClient","Env","CetusClmmSDK","SuiPriceServiceConnection","margin_trading_mainnet","index_default","CetusMarginTradingSDK"]}
|