UNPKG

@gooddollar/goodcontracts

Version:
256 lines 3.45 MB
{ "contractName": "BancorFormula", "abi": [ { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "constant": true, "inputs": [], "name": "version", "outputs": [ { "internalType": "uint16", "name": "", "type": "uint16" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_supply", "type": "uint256" }, { "internalType": "uint256", "name": "_reserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_reserveRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_depositAmount", "type": "uint256" } ], "name": "calculatePurchaseReturn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_supply", "type": "uint256" }, { "internalType": "uint256", "name": "_reserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_reserveRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_sellAmount", "type": "uint256" } ], "name": "calculateSaleReturn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_fromReserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_fromReserveRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_toReserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_toReserveRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "calculateCrossReserveReturn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_supply", "type": "uint256" }, { "internalType": "uint256", "name": "_reserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_totalRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "calculateFundCost", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_supply", "type": "uint256" }, { "internalType": "uint256", "name": "_reserveBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_totalRatio", "type": "uint32" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "calculateLiquidateReturn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "_fromConnectorBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_fromConnectorWeight", "type": "uint32" }, { "internalType": "uint256", "name": "_toConnectorBalance", "type": "uint256" }, { "internalType": "uint32", "name": "_toConnectorWeight", "type": "uint32" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "calculateCrossConnectorReturn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fromConnectorBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_fromConnectorWeight\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_toConnectorBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_toConnectorWeight\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"calculateCrossConnectorReturn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fromReserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_fromReserveRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_toReserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_toReserveRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"calculateCrossReserveReturn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_reserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_totalRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"calculateFundCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_reserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_totalRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"calculateLiquidateReturn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_reserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_reserveRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"}],\"name\":\"calculatePurchaseReturn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_reserveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_reserveRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_sellAmount\",\"type\":\"uint256\"}],\"name\":\"calculateSaleReturn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"calculateCrossConnectorReturn(uint256,uint32,uint256,uint32,uint256)\":{\"details\":\"deprecated, backward compatibility\"},\"calculateCrossReserveReturn(uint256,uint32,uint256,uint32,uint256)\":{\"details\":\"given two reserve balances/ratios and a sell amount (in the first reserve token), calculates the return for a conversion from the first reserve token to the second reserve token (in the second reserve token) note that prior to version 4, you should use 'calculateCrossConnectorReturn' instead * Formula: Return = _toReserveBalance * (1 - (_fromReserveBalance / (_fromReserveBalance + _amount)) ^ (_fromReserveRatio / _toReserveRatio))\",\"params\":{\"_amount\":\"input reserve amount\",\"_fromReserveBalance\":\"input reserve balance\",\"_fromReserveRatio\":\"input reserve ratio, represented in ppm, 1-1000000\",\"_toReserveBalance\":\"output reserve balance\",\"_toReserveRatio\":\"output reserve ratio, represented in ppm, 1-1000000\"},\"return\":\"second reserve amount\"},\"calculateFundCost(uint256,uint256,uint32,uint256)\":{\"details\":\"given a smart token supply, reserve balance, total ratio and an amount of requested smart tokens, calculates the amount of reserve tokens required for purchasing the given amount of smart tokens * Formula: Return = _reserveBalance * (((_supply + _amount) / _supply) ^ (MAX_RATIO / _totalRatio) - 1)\",\"params\":{\"_amount\":\"requested amount of smart tokens\",\"_reserveBalance\":\"reserve token balance\",\"_supply\":\"smart token supply\",\"_totalRatio\":\"total ratio, represented in ppm, 2-2000000\"},\"return\":\"amount of reserve tokens\"},\"calculateLiquidateReturn(uint256,uint256,uint32,uint256)\":{\"details\":\"given a smart token supply, reserve balance, total ratio and an amount of smart tokens to liquidate, calculates the amount of reserve tokens received for selling the given amount of smart tokens * Formula: Return = _reserveBalance * (1 - ((_supply - _amount) / _supply) ^ (MAX_RATIO / _totalRatio))\",\"params\":{\"_amount\":\"amount of smart tokens to liquidate\",\"_reserveBalance\":\"reserve token balance\",\"_supply\":\"smart token supply\",\"_totalRatio\":\"total ratio, represented in ppm, 2-2000000\"},\"return\":\"amount of reserve tokens\"},\"calculatePurchaseReturn(uint256,uint256,uint32,uint256)\":{\"details\":\"given a token supply, reserve balance, ratio and a deposit amount (in the reserve token), calculates the return for a given conversion (in the main token) * Formula: Return = _supply * ((1 + _depositAmount / _reserveBalance) ^ (_reserveRatio / 1000000) - 1)\",\"params\":{\"_depositAmount\":\"deposit amount, in reserve token\",\"_reserveBalance\":\"total reserve balance\",\"_reserveRatio\":\"reserve ratio, represented in ppm, 1-1000000\",\"_supply\":\"token total supply\"},\"return\":\"purchase return amount\"},\"calculateSaleReturn(uint256,uint256,uint32,uint256)\":{\"details\":\"given a token supply, reserve balance, ratio and a sell amount (in the main token), calculates the return for a given conversion (in the reserve token) * Formula: Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1000000 / _reserveRatio))\",\"params\":{\"_reserveBalance\":\"total reserve\",\"_reserveRatio\":\"constant reserve Ratio, represented in ppm, 1-1000000\",\"_sellAmount\":\"sell amount, in the token itself\",\"_supply\":\"token total supply\"},\"return\":\"sale return amount\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/BancorFormula.sol\":\"BancorFormula\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/BancorFormula.sol\":{\"keccak256\":\"0xa8b83d6e46b4c2b5cf29c3572df676605ec37b8ef9b51ca6627ee225d9c51a77\",\"urls\":[\"bzz-raw://021c034dffe504492175527a436c00e898dfbf508ffb4e68f3e2a059f8934b61\",\"dweb:/ipfs/QmayhA4XBR7SYRQRRgngDcjRWUfJPmgMTbwskjZaEkznJ1\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x965012d27b4262d7a41f5028cbb30c51ebd9ecd4be8fb30380aaa7a3c64fbc8b\",\"urls\":[\"bzz-raw://1eb493553b27efd46c231a836a83ce50d215639feb97b4aac9f301d0fd034ff5\",\"dweb:/ipfs/QmbMdvSXcqGKxeeYvzF3VrWpoHQyVzMXBhzhAokF2Gdymv\"]}},\"version\":1}", "bytecode": "0x60806040526000805461ffff1916600617905534801561001e57600080fd5b506001641c35fedd1560601b036021556001646c3390ecc9605e1b036022556001640cf801476160611b0360235560016431bdb23e1d605f1b0360245560016502fb1d8fe083605b1b0360255560016505b771955b37605a1b036026556001650af67a93bb5160591b0360275560016515060c256cb360581b036028556001651428a2f98d7360581b036029556001654d515663970960561b03602a55600165944620b0e70f60551b03602b55600166011c592761c66760541b03602c5560016602214d10d014eb60531b03602d55600166020ade36b7dbef60531b03602e5560016603eab73b3bbfe360521b03602f556001660782ee3593f6d760511b036030556001661ccf4b44bb4821604f1b0360315560016606e7f88ad8a77760511b0360325560016669f3d1c921891d604d1b03603355600166cb2ff529eb71e5604c1b03603455600166c2d415c3db974b604c1b0360355560016702eb40f9f620fda7604a1b0360365560016705990681d961a1eb60491b03603755600167055e12902701414760491b0360385560016714962dee9dc9764160471b0360395560016704ef57b9b560fab560491b03603a5560016712ed7b32a58f552b60471b03603b556001679131271922eaa60760441b03603c556001678b380f3558668c4760441b03603d556001680215f77c045fbe885760421b03603e556001600160831b03603f556001670f577eded5773a1160471b036040556001680eb5ec597592befbf5603f1b036041556001681c35fedd14b861eb05603e1b036042556001683619c87664579bc94b603d1b0360435560016867c00a3b07ffc01fd7603c1b03604455600168c6f6c8f8739773a7a5603b1b03604555600168bec763f8209b7a72b1603b1b0360465560016902dbb8caad9b7097b91b60391b03604755600169057b3d49dda84556d6f760381b03604855600169054183095b2c8ececf3160381b036049556001690a14517cc6b9457111ef60371b03604a5560016913545598e5c23276ccf160361b03604b556001692511882c39c3adea96ff60351b03604c55600169471649d87199aa99075760341b03604d557004429a21a029d4c1457cfbffffffffffff604e55700415bc6d6fb7dd71af2cb3ffffffffffff604f557003eab73b3bbfe282243ce1ffffffffffff6050557003c1771ac9fb6b4c18e229ffffffffffff605155700399e96897690418f785257fffffffffff605255700373fc456c53bb779bf0ea9fffffffffff60535570034f9e8e490c48e67e6ab8bfffffffffff60545570032cbfd4a7adc790560b3337ffffffffff60555570030b50570f6e5d2acca94613ffffffffff6056557002eb40f9f620fda6b56c2861ffffffffff6057557002cc8340ecb0d0f520a6af58ffffffffff6058557002af09481380a0a35cf1ba02ffffffffff605955700292c5bdd3b92ec810287b1b3fffffffff605a55700277abdcdab07d5a77ac6d6b9fffffffff605b5570025daf6654b1eaa55fd64df5efffffffff605c55700244c49c648baa98192dce88b7ffffffff605d5570022ce03cd5619a311b2471268bffffffff605e55700215f77c045fbe885654a44a0fffffffff605f556001600160811b036060557001eaefdbdaaee7421fc4d3ede5ffffffff6061557001d6bd8b2eb257df7e8ca57b09bfffffff6062557001c35fedd14b861eb0443f7f133fffffff6063557001b0ce43b322bcde4a56e8ada5afffffff60645570019f0028ec1fff007f5a195a39dfffffff60655570018ded91f0e72ee74f49b15ba527ffffff60665570017d8ec7f04136f4e5615fd41a63ffffff60675570016ddc6556cdb84bdc8d12d22e6fffffff60685570015ecf52776a1155b5bd8395814f7fffff60695570015060c256cb23b3b3cc3754cf40ffffff606a557001428a2f98d728ae223ddab715be3fffff606b5570013545598e5c23276ccf0ede68034fffff606c557001288c4161ce1d6f54b7f61081194fffff606d5570011c592761c666aa641d5a01a40f17ffff606e55700110a688680a7530515f3e6e6cfdcdffff606f557001056f1b5bedf75c6bcb2ce8aed428ffff6070556ffaadceceeff8a0890f3875f008277fff6071556ff05dc6b27edad306388a600f6ba0bfff6072556fe67a5a25da41063de1495d5b18cdbfff6073556fdcff115b14eedde6fc3aa5353f2e4fff6074556fd3e7a3924312399f9aae2e0f868f8fff6075556fcb2ff529eb71e41582cccd5a1ee26fff6076556fc2d415c3db974ab32a51840c0b67edff6077556fbad03e7d883f69ad5b0a186184e06bff6078556fb320d03b2c343d4829abd6075f0cc5ff6079556fabc25204e02828d73c6e80bcdb1a95bf607a556fa4b16f74ee4bb2040a1ec6c15fbbf2df607b556f9deaf736ac1f569deb1b5ae3f36c130f607c556f976bd9952c7aa957f5937d790ef65037607d556f9131271922eaa6064b73a22d0bd4f2bf607e556f8b380f3558668c46c91c49a2f8e967b9607f556f857ddf0117efa215952912839f6473e660805561144c806107576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806354fd4d501161005b57806354fd4d501461013357806365098bb31461015257806379c1b4501461018f578063abfd231d146101cc5761007d565b80631da6bbfb1461008257806329a00e7c146100c957806349f9b0f7146100fe575b600080fd5b6100b76004803603608081101561009857600080fd5b5080359060208101359063ffffffff6040820135169060600135610201565b60408051918252519081900360200190f35b6100b7600480360360808110156100df57600080fd5b5080359060208101359063ffffffff60408201351690606001356102e0565b6100b76004803603608081101561011457600080fd5b5080359060208101359063ffffffff60408201351690606001356103b1565b61013b61048b565b6040805161ffff9092168252519081900360200190f35b6100b7600480360360a081101561016857600080fd5b5080359063ffffffff60208201358116916040810135916060820135169060800135610495565b6100b7600480360360a08110156101a557600080fd5b5080359063ffffffff602082013581169160408101359160608201351690608001356104b0565b6100b7600480360360808110156101e257600080fd5b5080359060208101359063ffffffff60408201351690606001356105b8565b600080851180156102125750600084115b8015610224575060018363ffffffff16115b80156102395750621e848063ffffffff841611155b61024257600080fd5b8161024f575060006102d8565b63ffffffff8316620f4240141561028657846001610273848763ffffffff61064316565b038161027b57fe5b0460010190506102d8565b6000808061029a888663ffffffff61067316565b90506102ab8189620f424089610685565b9093509150600060ff831660016102c88a8763ffffffff61064316565b03901c8890036001019450505050505b949350505050565b600080851180156102f15750600084115b8015610303575060008363ffffffff16115b80156103185750620f424063ffffffff841611155b61032157600080fd5b8161032e575060006102d8565b63ffffffff8316620f4240141561035f5783610350868463ffffffff61064316565b8161035757fe5b0490506102d8565b60008080610373858863ffffffff61067316565b9050610384818888620f4240610685565b9093509150600060ff831661039f8a8663ffffffff61064316565b901c9890980398975050505050505050565b600080851180156103c25750600084115b80156103d4575060008363ffffffff16115b80156103e95750620f424063ffffffff841611155b80156103f55750848211155b6103fe57600080fd5b8161040b575060006102d8565b8482141561041a5750826102d8565b63ffffffff8316620f4240141561043c5784610350858463ffffffff61064316565b6000808387036104518882620f424089610685565b90935091506000610468888563ffffffff61064316565b905060ff831688901b848183038161047c57fe5b049a9950505050505050505050565b60005461ffff1681565b60006104a486868686866104b0565b90505b95945050505050565b600080861180156104c7575060008563ffffffff16115b80156104dc5750620f424063ffffffff861611155b80156104e85750600084115b80156104fa575060008363ffffffff16115b801561050f5750620f424063ffffffff841611155b61051857600080fd5b8263ffffffff168563ffffffff16141561055b5761053c868363ffffffff61067316565b61054c858463ffffffff61064316565b8161055357fe5b0490506104a7565b6000808061056f898663ffffffff61067316565b905061057d818a8a89610685565b90935091506000610594888563ffffffff61064316565b905060ff831688901b84818303816105a857fe5b049b9a5050505050505050505050565b600080851180156105c95750600084115b80156105db575060018363ffffffff16115b80156105f05750621e848063ffffffff841611155b80156105fc5750848211155b61060557600080fd5b81610612575060006102d8565b848214156106215750826102d8565b63ffffffff8316620f4240141561043c5784610350838663ffffffff61064316565b6000826106525750600061066d565b8282028284828161065f57fe5b041461066a57600080fd5b90505b92915050565b60008282018381101561066a57600080fd5b600080600160811b861061069857600080fd5b600080866001607f1b8902816106aa57fe5b04905070015bf0a8b1457695355fb8ac404e7a79e38110156106d6576106cf81610757565b91506106e2565b6106df81610b3b565b91505b60008563ffffffff168763ffffffff168402816106fb57fe5b049050600160831b8110156107215761071381610be5565b607f9450945050505061074e565b600061072c82610f89565b905061074181607f0360ff1683901c82611019565b9550935061074e92505050565b94509492505050565b6000808080806fd3094c70f034de4b96ff7d5b6f99fcd886106107a0576001607e1b840193506fd3094c70f034de4b96ff7d5b6f99fcd86001607f1b87028161079c57fe5b0495505b6fa45af1e1f40c333b3de1db4dd55f29a786106107e3576001607d1b840193506fa45af1e1f40c333b3de1db4dd55f29a76001607f1b8702816107df57fe5b0495505b6f910b022db7ae67ce76b441c27035c6a18610610826576001607c1b840193506f910b022db7ae67ce76b441c27035c6a16001607f1b87028161082257fe5b0495505b6f88415abbe9a76bead8d00cf112e4d4a88610610869576001607b1b840193506f88415abbe9a76bead8d00cf112e4d4a86001607f1b87028161086557fe5b0495505b6f84102b00893f64c705e841d5d4064bd386106108ac576001607a1b840193506f84102b00893f64c705e841d5d4064bd36001607f1b8702816108a857fe5b0495505b6f8204055aaef1c8bd5c3259f4822735a286106108ef57600160791b840193506f8204055aaef1c8bd5c3259f4822735a26001607f1b8702816108eb57fe5b0495505b6f810100ab00222d861931c15e39b44e99861061093257600160781b840193506f810100ab00222d861931c15e39b44e996001607f1b87028161092e57fe5b0495505b6f808040155aabbbe9451521693554f733861061097557600160771b840193506f808040155aabbbe9451521693554f7336001607f1b87028161097157fe5b0495505b6f7fffffffffffffffffffffffffffffff19860192508291506001607f1b828002049050600160801b838103830204840193506001607f1b818302816109b757fe5b049150600160811b836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816109db57fe5b04840193506001607f1b818302816109ef57fe5b049150600360801b836f9999999999999999999999999999999903830281610a1357fe5b04840193506001607f1b81830281610a2757fe5b049150600160821b836f9249249249249249249249249249249203830281610a4b57fe5b04840193506001607f1b81830281610a5f57fe5b049150600560801b836f8e38e38e38e38e38e38e38e38e38e38e03830281610a8357fe5b04840193506001607f1b81830281610a9757fe5b049150600360811b836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b03830281610abb57fe5b04840193506001607f1b81830281610acf57fe5b049150600760801b836f89d89d89d89d89d89d89d89d89d89d8903830281610af357fe5b04840193506001607f1b81830281610b0757fe5b049150600160831b836f8888888888888888888888888888888803830281610b2b57fe5b049390930193505050505b919050565b600080600160801b8310610b6b576000610b5a6001607f1b85046113b6565b60ff1693841c936001607f1b029150505b6001607f1b831115610bb957607f5b60ff811615610bb7576001607f1b848002049350600160801b8410610bae57600193841c9360ff6000198301161b91909101905b60001901610b7a565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f88202049392505050565b6000670168244fdac780006001607f1b6f0fffffffffffffffffffffffffffffff84168080028290048082028390048083028490049485026710e1b3be415a00009092026705a0913f6b1e000091909102010192909181830204905080664807432bc1800002830192506001607f1b82820281610c5e57fe5b04905080660c0135dca0400002830192506001607f1b82820281610c7e57fe5b049050806601b707b1cdc00002830192506001607f1b82820281610c9e57fe5b049050806536e0f639b80002830192506001607f1b82820281610cbd57fe5b04905080650618fee9f80002830192506001607f1b82820281610cdc57fe5b04905080649c197dcc0002830192506001607f1b82820281610cfa57fe5b04905080640e30dce40002830192506001607f1b82820281610d1857fe5b0490508064012ebd130002830192506001607f1b82820281610d3657fe5b049050806317499f0002830192506001607f1b82820281610d5357fe5b049050806301a9d48002830192506001607f1b82820281610d7057fe5b04905080621c638002830192506001607f1b82820281610d8c57fe5b049050806201c63802830192506001607f1b82820281610da857fe5b04905080611ab802830192506001607f1b82820281610dc357fe5b0490508061017c02830192506001607f1b82820281610dde57fe5b04905080601402830192506001607f1b82820281610df857fe5b6721c3677c82b400009190049384010482016001607f1b019290506001607c1b851615610e495770018ebef9eac820ae8682b9793ac6d1e7767001c3d6a24ed82218787d624d3e5eba95f984020492505b6001607d1b851615610e7f577001368b2fc6f9609fe7aceb46aa619baed470018ebef9eac820ae8682b9793ac6d1e77884020492505b6001607e1b851615610eb4576fbc5ab1b16779be3575bd8f0520a9f21f7001368b2fc6f9609fe7aceb46aa619baed584020492505b6001607f1b851615610ee8576f454aaa8efe072e7f6ddbab84b40a55c96fbc5ab1b16779be3575bd8f0520a9f21e84020492505b600160801b851615610f1c576f0960aadc109e7a3bf4578099615711ea6f454aaa8efe072e7f6ddbab84b40a55c584020492505b600160811b851615610f4f576e2bf84208204f5977f9a8cf01fdce3d6f0960aadc109e7a3bf4578099615711d784020492505b600160821b851615610f80576d03c6ab775dd0b95b4cbee7e65d116e2bf84208204f5977f9a8cf01fdc30784020492505b50909392505050565b60006020607f5b8060ff168260010160ff161015610fd8576000600260ff848401160490508460018260ff1660808110610fbf57fe5b015410610fce57809250610fd2565b8091505b50610f90565b8360018260ff1660808110610fe957fe5b015410610ff9579150610b369050565b8360018360ff166080811061100a57fe5b01541061007d57509050610b36565b60008083905060008090508360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee558000000083816113aa57fe5b04010195945050505050565b6000806101008310156113de575b60018311156113d957600192831c92016113c4565b61066d565b60805b60ff81161561141057600160ff82161b84106114055760ff81169390931c92908117905b60011c607f166113e1565b509291505056fea265627a7a723158207991e7a75469abe067cfcc28fffc919472cd123c707afc9089a9ce56f0cbaa5b64736f6c63430005100032", "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806354fd4d501161005b57806354fd4d501461013357806365098bb31461015257806379c1b4501461018f578063abfd231d146101cc5761007d565b80631da6bbfb1461008257806329a00e7c146100c957806349f9b0f7146100fe575b600080fd5b6100b76004803603608081101561009857600080fd5b5080359060208101359063ffffffff6040820135169060600135610201565b60408051918252519081900360200190f35b6100b7600480360360808110156100df57600080fd5b5080359060208101359063ffffffff60408201351690606001356102e0565b6100b76004803603608081101561011457600080fd5b5080359060208101359063ffffffff60408201351690606001356103b1565b61013b61048b565b6040805161ffff9092168252519081900360200190f35b6100b7600480360360a081101561016857600080fd5b5080359063ffffffff60208201358116916040810135916060820135169060800135610495565b6100b7600480360360a08110156101a557600080fd5b5080359063ffffffff602082013581169160408101359160608201351690608001356104b0565b6100b7600480360360808110156101e257600080fd5b5080359060208101359063ffffffff60408201351690606001356105b8565b600080851180156102125750600084115b8015610224575060018363ffffffff16115b80156102395750621e848063ffffffff841611155b61024257600080fd5b8161024f575060006102d8565b63ffffffff8316620f4240141561028657846001610273848763ffffffff61064316565b038161027b57fe5b0460010190506102d8565b6000808061029a888663ffffffff61067316565b90506102ab8189620f424089610685565b9093509150600060ff831660016102c88a8763ffffffff61064316565b03901c8890036001019450505050505b949350505050565b600080851180156102f15750600084115b8015610303575060008363ffffffff16115b80156103185750620f424063ffffffff841611155b61032157600080fd5b8161032e575060006102d8565b63ffffffff8316620f4240141561035f5783610350868463ffffffff61064316565b8161035757fe5b0490506102d8565b60008080610373858863ffffffff61067316565b9050610384818888620f4240610685565b9093509150600060ff831661039f8a8663ffffffff61064316565b901c9890980398975050505050505050565b600080851180156103c25750600084115b80156103d4575060008363ffffffff16115b80156103e95750620f424063ffffffff841611155b80156103f55750848211155b6103fe57600080fd5b8161040b575060006102d8565b8482141561041a5750826102d8565b63ffffffff8316620f4240141561043c5784610350858463ffffffff61064316565b6000808387036104518882620f424089610685565b90935091506000610468888563ffffffff61064316565b905060ff831688901b848183038161047c57fe5b049a9950505050505050505050565b60005461ffff1681565b60006104a486868686866104b0565b90505b95945050505050565b600080861180156104c7575060008563ffffffff16115b80156104dc5750620f424063ffffffff861611155b80156104e85750600084115b80156104fa575060008363ffffffff16115b801561050f5750620f424063ffffffff841611155b61051857600080fd5b8263ffffffff168563ffffffff16141561055b5761053c868363ffffffff61067316565b61054c858463ffffffff61064316565b8161055357fe5b0490506104a7565b6000808061056f898663ffffffff61067316565b905061057d818a8a89610685565b90935091506000610594888563ffffffff61064316565b905060ff831688901b84818303816105a857fe5b049b9a5050505050505050505050565b600080851180156105c95750600084115b80156105db575060018363ffffffff16115b80156105f05750621e848063ffffffff841611155b80156105fc5750848211155b61060557600080fd5b81610612575060006102d8565b848214156106215750826102d8565b63ffffffff8316620f4240141561043c5784610350838663ffffffff61064316565b6000826106525750600061066d565b8282028284828161065f57fe5b041461066a57600080fd5b90505b92915050565b60008282018381101561066a57600080fd5b600080600160811b861061069857600080fd5b600080866001607f1b8902816106aa57fe5b04905070015bf0a8b1457695355fb8ac404e7a79e38110156106d6576106cf81610757565b91506106e2565b6106df81610b3b565b91505b60008563ffffffff168763ffffffff168402816106fb57fe5b049050600160831b8110156107215761071381610be5565b607f9450945050505061074e565b600061072c82610f89565b905061074181607f0360ff1683901c82611019565b9550935061074e92505050565b94509492505050565b6000808080806fd3094c70f034de4b96ff7d5b6f99fcd886106107a0576001607e1b840193506fd3094c70f034de4b96ff7d5b6f99fcd86001607f1b87028161079c57fe5b0495505b6fa45af1e1f40c333b3de1db4dd55f29a786106107e3576001607d1b840193506fa45af1e1f40c333b3de1db4dd55f29a76001607f1b8702816107df57fe5b0495505b6f910b022db7ae67ce76b441c27035c6a18610610826576001607c1b840193506f910b022db7ae67ce76b441c27035c6a16001607f1b87028161082257fe5b0495505b6f88415abbe9a76bead8d00cf112e4d4a88610610869576001607b1b840193506f88415abbe9a76bead8d00cf112e4d4a86001607f1b87028161086557fe5b0495505b6f84102b00893f64c705e841d5d4064bd386106108ac576001607a1b840193506f84102b00893f64c705e841d5d4064bd36001607f1b8702816108a857fe5b0495505b6f8204055aaef1c8bd5c3259f4822735a286106108ef57600160791b840193506f8204055aaef1c8bd5c3259f4822735a26001607f1b8702816108eb57fe5b0495505b6f810100ab00222d861931c15e39b44e99861061093257600160781b840193506f810100ab00222d861931c15e39b44e996001607f1b87028161092e57fe5b0495505b6f808040155aabbbe9451521693554f733861061097557600160771b840193506f808040155aabbbe9451521693554f7336001607f1b87028161097157fe5b0495505b6f7fffffffffffffffffffffffffffffff19860192508291506001607f1b828002049050600160801b838103830204840193506001607f1b818302816109b757fe5b049150600160811b836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816109db57fe5b04840193506001607f1b818302816109ef57fe5b049150600360801b836f9999999999999999999999999999999903830281610a1357fe5b04840193506001607f1b81830281610a2757fe5b049150600160821b836f9249249249249249249249249249249203830281610a4b57fe5b04840193506001607f1b81830281610a5f57fe5b049150600560801b836f8e38e38e38e38e38e38e38e38e38e38e03830281610a8357fe5b04840193506001607f1b81830281610a9757fe5b049150600360811b836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b03830281610abb57fe5b04840193506001607f1b81830281610acf57fe5b049150600760801b836f89d89d89d89d89d89d89d89d89d89d8903830281610af357fe5b04840193506001607f1b81830281610b0757fe5b049150600160831b836f8888888888888888888888888888888803830281610b2b57fe5b049390930193505050505b919050565b600080600160801b8310610b6b576000610b5a6001607f1b85046113b6565b60ff1693841c936001607f1b029150505b6001607f1b831115610bb957607f5b60ff811615610bb7576001607f1b848002049350600160801b8410610bae57600193841c9360ff6000198301161b91909101905b60001901610b7a565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f88202049392505050565b6000670168244fdac780006001607f1b6f0fffffffffffffffffffffffffffffff84168080028290048082028390048083028490049485026710e1b3be415a00009092026705a0913f6b1e000091909102010192909181830204905080664807432bc1800002830192506001607f1b82820281610c5e57fe5b04905080660c0135dca0400002830192506001607f1b82820281610c7e57fe5b049050806601b707b1cdc00002830192506001607f1b82820281610c9e57fe5b049050806536e0f639b80002830192506001607f1b82820281610cbd57fe5b04905080650618fee9f80002830192506001607f1b82820281610cdc57fe5b04905080649c197dcc0002830192506001607f1b82820281610cfa57fe5b04905080640e30dce40002830192506001607f1b82820281610d1857fe5b0490508064012ebd130002830192506001607f1b82820281610d3657fe5b049050806317499f0002830192506001607f1b82820281610d5357fe5b049050806301a9d48002830192506001607f1b82820281610d7057fe5b04905080621c638002830192506001607f1b82820281610d8c57fe5b049050806201c63802830192506001607f1b82820281610da857fe5b04905080611ab802830192506001607f1b82820281610dc357fe5b0490508061017c02830192506001607f1b82820281610dde57fe5b04905080601402830192506001607f1b82820281610df857fe5b6721c3677c82b400009190049384010482016001607f1b019290506001607c1b851615610e495770018ebef9eac820ae8682b9793ac6d1e7767001c3d6a24ed82218787d624d3e5eba95f984020492505b6001607d1b851615610e7f577001368b2fc6f9609fe7aceb46aa619baed470018ebef9eac820ae8682b9793ac6d1e77884020492505b6001607e1b851615610eb4576fbc5ab1b16779be3575bd8f0520a9f21f7001368b2fc6f9609fe7aceb46aa619baed584020492505b6001607f1b851615610ee8576f454aaa8efe072e7f6ddbab84b40a55c96fbc5ab1b16779be3575bd8f0520a9f21e84020492505b600160801b851615610f1c576f0960aadc109e7a3bf4578099615711ea6f454aaa8efe072e7f6ddbab84b40a55c584020492505b600160811b851615610f4f576e2bf84208204f5977f9a8cf01fdce3d6f0960aadc109e7a3bf4578099615711d784020492505b600160821b851615610f80576d03c6ab775dd0b95b4cbee7e65d116e2bf84208204f5977f9a8cf01fdc30784020492505b50909392505050565b60006020607f5b8060ff168260010160ff161015610fd8576000600260ff848401160490508460018260ff1660808110610fbf57fe5b015410610fce57809250610fd2565b8091505b50610f90565b8360018260ff1660808110610fe957fe5b015410610ff9579150610b369050565b8360018360ff166080811061100a57fe5b01541061007d57509050610b36565b60008083905060008090508360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee558000000083816113aa57fe5b04010195945050505050565b6000806101008310156113de575b60018311156113d957600192831c92016113c4565b61066d565b60805b60ff81161561141057600160ff82161b84106114055760ff81169390931c92908117905b60011c607f166113e1565b509291505056fea265627a7a723158207991e7a75469abe067cfcc28fffc919472cd123c707afc9089a9ce56f0cbaa5b64736f6c63430005100032", "sourceMap": "85:36674:21:-;;;147:25;;;-1:-1:-1;;147:25:21;171:1;147:25;;;1278:8408;5:2:-1;;;;30:1;27;20:12;5:2;-1:-1;;;;;;3517:15:21;:54;-1:-1:-1;;;;;3581:15:21;:54;-1:-1:-1;;;;;3645:15:21;:54;-1:-1:-1;;;;;3709:15:21;:54;-1:-1:-1;;;;;3773:15:21;:54;-1:-1:-1;;;;;3837:15:21;:54;-1:-1:-1;;;;;3901:15:21;:54;-1:-1:-1;;;;;3965:15:21;:54;-1:-1:-1;;;;;4029:15:21;:54;-1:-1:-1;;;;;4093:15:21;:54;-1:-1:-1;;;;;4157:15:21;:54;-1:-1:-1;;;;;4221:15:21;:54;-1:-1:-1;;;;;4285:15:21;:54;-1:-1:-1;;;;;4349:15:21;:54;-1:-1:-1;;;;;4413:15:21;:54;-1:-1:-1;;;;;4477:15:21;:54;-1:-1:-1;;;;;4541:15:21;:54;-1:-1:-1;;;;;4605:15:21;:54;-1:-1:-1;;;;;4669:15:21;:54;-1:-1:-1;;;;;4733:15:21;:54;-1:-1:-1;;;;;4797:15:21;:54;-1:-1:-1;;;;;4861:15:21;:54;-1:-1:-1;;;;;4925:15:21;:54;-1:-1:-1;;;;;4989:15:21;:54;-1:-1:-1;;;;;5053:15:21;:54;-1:-1:-1;;;;;5117:15:21;:54;-1:-1:-1;;;;;5181:15:21;:54;-1:-1:-1;;;;;5245:15:21;:54;-1:-1:-1;;;;;5309:15:21;:54;-1:-1:-1;;;;;5373:15:21;:54;-1:-1:-1;;;;;5437:15:21;:54;-1:-1:-1;;;;;5501:15:21;:54;-1:-1:-1;;;;;5565:15:21;:54;-1:-1:-1;;;;;5629:15:21;:54;-1:-1:-1;;;;;5693:15:21;:54;-1:-1:-1;;;;;5757:15:21;:54;-1:-1:-1;;;;;5821:15:21;:54;-1:-1:-1;;;;;5885:15:21;:54;-1:-1:-1;;;;;5949:15:21;:54;-1:-1:-1;;;;;6013:15:21;:54;-1:-1:-1;;;;;6077:15:21;:54;-1:-1:-1;;;;;6141:15:21;:54;-1:-1:-1;;;;;6205:15:21;:54;-1:-1:-1;;;;;6269:15:21;:54;-1:-1:-1;;;;;6333:15:21;:54;6415:36;6397:15;:54;6479:36;6461:15;:54;6543:36;6525:15;:54;6607:36;6589:15;:54;6671:36;6653:15;:54;6735:36;6717:15;:54;6799:36;6781:15;:54;6863:36;6845:15;:54;6927:36;6909:15;:54;6991:36;6973:15;:54;7055:36;7037:15;:54;7119:36;7101:15;:54;7183:36;7165:15;:54;7247:36;7229:15;:54;7311:36;7293:15;:54;7375:36;7357:15;:54;7439:36;7421:15;:54;7503:36;7485:15;:54;-1:-1:-1;;;;;7549:15:21;:54;7631:36;7613:15;:54;7695:36;7677:15;:54;7759:36;7741:15;:54;7823:36;7805:15;:54;7888:36;7869:16;:55;7953:36;7934:16;:55;8018:36;7999:16;:55;8083:36;8064:16;:55;8148:36;8129:16;:55;8213:36;8194:16;:55;8278:36;8259:16;:55;8343:36;8324:16;:55;8408:36;8389:16;:55;8473:36;8454:16;:55;8538:36;8519:16;:55;8603:36;8584:16;:55;8668:36;8649:16;:55;8733:36;8714:16;:55;8798:36;8779:16;:55;8863:36;8844:16;:55;8928:36;8909:16;:55;8993:36;8974:16;:55;9058:36;9039:16;:55;9123:36;9104:16;:55;9188:36;9169:16;:55;9253:36;9234:16;:55;9318:36;9299:16;:55;9383:36;9364:16;:55;9448:36;9429:16;:55;9513:36;9494:16;:55;9578:36;9559:16;:55;9643:36;9624:16;:55;85:36674;;;-1:-1:-1;85:36674:21;;", "deployedSourceMap": "85:36674:21:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85:36674:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15682:902;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;15682:902:21;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10315:922;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;10315:922:21;;;;;;;;;;;;;;;;;;;:::i;11857:1089::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11857:1089:21;;;;;;;;;;;;;;;;;;;:::i;147:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36257:500;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;36257:500:21;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13863:1149::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13863:1149:21;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17257:1069::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17257:1069:21;;;;;;;;;;;;;;;;;;;:::i;15682:902::-;15847:7;15923:1;15913:7;:11;:50;;;;;15962:1;15944:15;:19;15913:50;:85;;;;;15997:1;15983:11;:15;;;15913:85;:133;;;;-1:-1:-1;16033:13:21;16018:28;;;;;15913:133;15892:164;;;;;;16108:12;16104:26;;-1:-1:-1;16129:1:21;16122:8;;16104:26;16195:24;;;253:7;16195:24;16191:97;;;16277:7;16272:1;16241:28;:7;16253:15;16241:28;:11;:28;:::i;:::-;:32;16240:44;;;;;;16287:1;16240:48;16233:55;;;;16191:97;16299:14;;;16364:20;:7;16376;16364:20;:11;:20;:::i;:::-;16348:36;;16416:45;16422:5;16429:7;253;16449:11;16416:5;:45::i;:::-;16394:67;;-1:-1:-1;16394:67:21;-1:-1:-1;16471:12:21;16487:46;;;16518:1;16488:27;:15;16394:67;16488:27;:19;:27;:::i;:::-;:31;16487:46;;16555:22;;;16537:1;16555:22;;-1:-1:-1;;;;;15682:902:21;;;;;;;:::o;10315:922::-;10495:7;10571:1;10561:7;:11;:50;;;;;10610:1;10592:15;:19;10561:50;:87;;;;;10647:1;10631:13;:17;;;10561:87;:133;;;;-1:-1:-1;253:7:21;10668:26;;;;;10561:133;10540:164;;;;;;10764:19;10760:33;;-1:-1:-1;10792:1:21;10785:8;;10760:33;10852:26;;;253:7;10852:26;10848:96;;;10929:15;10899:27;:7;10911:14;10899:27;:11;:27;:::i;:::-;:45;;;;;;10892:52;;;;10848:96;10955:14;;;11020:35;:14;11039:15;11020:35;:18;:35;:::i;:::-;11004:51;;11087:55;11093:5;11100:15;11117:13;253:7;11087:5;:55::i;:::-;11065:77;;-1:-1:-1;11065:77:21;-1:-1:-1;11152:12:21;11167:32;;;:19;:7;11065:77;11167:19;:11;:19;:::i;:::-;:32;;11216:14;;;;;10315:922;-1:-1:-1;;;;;;;;10315:922:21:o;11857:1089::-;12030:7;12106:1;12096:7;:11;:50;;;;;12145:1;12127:15;:19;12096:50;:87;;;;;12182:1;12166:13;:17;;;12096:87;:133;;;;-1:-1:-1;253:7:21;12203:26;;;;;12096:133;:175;;;;;12264:7;12249:11;:22;;12096:175;12075:206;;;;;;12338:16;12334:30;;-1:-1:-1;12363:1:21;12356:8;;12334:30;12448:7;12433:11;:22;12429:50;;;-1:-1:-1;12464:15:21;12457:22;;12429:50;12538:26;;;253:7;12538:26;12534:81;;;12608:7;12573:32;:15;12593:11;12573:32;:19;:32;:::i;12534:81::-;12626:14;;12691:21;;;12744:47;12691:7;:21;253:7;12777:13;12744:5;:47::i;:::-;12722:69;;-1:-1:-1;12722:69:21;-1:-1:-1;12801:13:21;12817:27;:15;12722:69;12817:27;:19;:27;:::i;:::-;12801:43;-1:-1:-1;12870:28:21;;;;;;12933:6;12916:13;;;12933:6;12915:24;;;;;;11857:1089;-1:-1:-1;;;;;;;;;;11857:1089:21:o;147:25::-;;;;;;:::o;36257:500::-;36496:7;36534:216;36579:21;36618:20;36656:19;36693:18;36729:7;36534:27;:216::i;:::-;36515:235;;36257:500;;;;;;;;:::o;13863:1149::-;14090:7;14178:1;14156:19;:23;:64;;;;;14219:1;14199:17;:21;;;14156:64;:114;;;;-1:-1:-1;253:7:21;14240:30;;;;;14156:114;:155;;;;;14310:1;14290:17;:21;14156:155;:194;;;;;14349:1;14331:15;:19;;;14156:194;:242;;;;-1:-1:-1;253:7:21;14370:28;;;;;14156:242;14135:273;;;;;;14485:15;14464:36;;:17;:36;;;14460:126;;;14554:32;:19;14578:7;14554:32;:23;:32;:::i;:::-;14521:30;:17;14543:7;14521:30;:21;:30;:::i;:::-;:65;;;;;;14514:72;;;;14460:126;14597:14;;;14662:32;:19;14686:7;14662:32;:23;:32;:::i;:::-;14646:48;;14726:127;14745:5;14764:19;14797:17;14828:15;14726:5;:127::i;:::-;14704:149;;-1:-1:-1;14704:149:21;-1:-1:-1;14863:13:21;14879:29;:17;14704:149;14879:29;:21;:29;:::i;:::-;14863:45;-1:-1:-1;14934:30:21;;;;;;14999:6;14982:13;;;14999:6;14981:24;;;;;;13863:1149;-1:-1:-1;;;;;;;;;;;13863:1149:21:o;17257:1069::-;17429:7;17505:1;17495:7;:11;:50;;;;;17544:1;17526:15;:19;17495:50;:85;;;;;17579:1;17565:11;:15;;;17495:85;:133;;;;-1:-1:-1;17615:13:21;17600:28;;;;;17495:133;:171;;;;;17659:7;17648;:18;;17495:171;17474:202;;;;;;17728:12;17724:26;;-1:-1:-1;17749:1:21;17742:8;;17724:26;17834:7;17823;:18;17819:46;;;-1:-1:-1;17850:15:21;17843:22;;17819:46;17930:24;;;253:7;17930:24;17926:75;;;17994:7;17963:28;:7;17975:15;17963:28;:11;:28;:::i;229:421:76:-;287:7;527:6;523:45;;-1:-1:-1;556:1:76;549:8;;523:45;590:5;;;594:1;590;:5;:1;613:5;;;;;:10;605:19;;;;;;642:1;-1:-1:-1;229:421:76;;;;;:::o;1431:145::-;1489:7;1520:5;;;1543:6;;;;1535:15;;;;;19881:843:21;20017:7;20026:5;-1:-1:-1;;;20051:6:21;:16;20043:25;;;;;;20079:15;20104:12;20140:6;-1:-1:-1;;;20120:6:21;:16;20119:27;;;;;;20104:42;;1041:35;20160:4;:22;20156:136;;;20208:16;20219:4;20208:10;:16::i;:::-;20198:26;;20156:136;;;20265:16;20276:4;20265:10;:16::i;:::-;20255:26;;20156:136;20302:23;20348:5;20328:25;;20339:5;20329:15;;:7;:15;20328:25;;;;;;20302:51;;-1:-1:-1;;;20367:15:21;:33;20363:355;;;20424:27;20435:15;20424:10;:27::i;:::-;352:3;20416:51;;;;;;;;;20363:355;20498:15;20516:42;20542:15;20516:25;:42::i;:::-;20498:60;;20597:69;20644:9;352:3;20628:25;20608:46;;:15;:46;;20656:9;20597:10;:69::i;:::-;20572:135;-1:-1:-1;20684:9:21;-1:-1:-1;20572:135:21;;-1:-1:-1;;;20572:135:21;19881:843;;;;;;;;:::o;28504:3317::-;28558:7;;;;;28670:34;28665:39;;28661:179;;-1:-1:-1;;;28720:41:21;;;;28795:34;-1:-1:-1;;;28780:1:21;:11;28779:50;;;;;;28775:54;;28661:179;28873:34;28868:1;:39;28864:179;;-1:-1:-1;;;28923:41:21;;;;28998:34;-1:-1:-1;;;28983:1:21;:11;28982:50;;;;;;28978:54;;28864:179;29076:34;29071:1;:39;29067:179;;-1:-1:-1;;;29126:41:21;;;;29201:34;-1:-1:-1;;;29186:1:21;:11;29185:50;;;;;;29181:54;;29067:179;29279:34;29274:1;:39;29270:179;;-1:-1:-1;;;29329:41:21;;;;29404:34;-1:-1:-1;;;29389:1:21;:11;29388:50;;;;;;29384:54;;29270:179;29482:34;29477:1;:39;29473:179;;-1:-1:-1;;;29532:41:21;;;;29607:34;-1:-1:-1;;;29592:1:21;:11;29591:50;;;;;;29587:54;;29473:179;29685:34;29680:1;:39;29676:179;;-1:-1:-1;;;29735:41:21;;;;29810:34;-1:-1:-1;;;29795:1:21;:11;29794:50;;;;;;29790:54;;29676:179;29888:34;29883:1;:39;29879:179;;-1:-1:-1;;;29938:41:21;;;;30013:34;-1:-1:-1;;;29998:1:21;:11;29997:50;;;;;;29993:54;;29879:179;30091:34;30086:1;:39;30082:179;;-1:-1:-1;;;30141:41:21;;;;30216:34;-1:-1:-1;;;30201:1:21;:11;30200:50;;;;;;30196:54;;30082:179;-1:-1:-1;;30294:11:21;;;-1:-1:-1;30294:11:21;;-1:-1:-1;;;;30320:5:21;;;30319:17;;-1:-1:-1;;;;30371:39:21;;;30366:45;;30365:97;30346:116;;;;-1:-1:-1;;;30481:1:21;30477;:5;30476:17;;;;;;30472:21;;-1:-1:-1;;;30595:1:21;30557:35;:39;30552:1;:45;30551:97;;;;;;30532:116;;;;-1:-1:-1;;;30667:1:21;30663;:5;30662:17;;;;;;30658:21;;-1:-1:-1;;;30781:1:21;30743:35;:39;30738:1;:45;30737:97;;;;;;30718:116;;;;-1:-1:-1;;;30853:1:21;30849;:5;30848:17;;;;;;30844:21;;-1:-1:-1;;;30967:1:21;30929:35;:39;30924:1;:45;30923:97;;;;;;30904:116;;;;-1:-1:-1;;;31039:1:21;31035;:5;31034:17;;;;;;31030:21;;-1:-1:-1;;;31153:1:21;31115:35;:39;31110:1;:45;31109:97;;;;;;31090:116;;;;-1:-1:-1;;;31225:1:21;31221;:5;31220:17;;;;;;31216:21;;-1:-1:-1;;;31339:1:21;31301:35;:39;31296:1;:45;31295:97;;;;;;31276:116;;;;-1:-1:-1;;;31411:1:21;31407;:5;31406:17;;;;;;31402:21;;-1:-1:-1;;;31525:1:21;31487:35;:39;31482:1;:45;31481:97;;;;;;31462:116;;;;-1:-1:-1;;;31597:1:21;31593;:5;31592:17;;;;;;31588:21;;-1:-1:-1;;;31711:1:21;31673:35;:39;31668:1;:45;31667:97;;;;;;31648:116;;;;;-1:-1:-1;;;;28504:3317:21;;;;:::o;20894:803::-;20948:7;;-1:-1:-1;;;21088:12:21;;21084:152;;21116:11;21130:22;-1:-1:-1;;;21140:1:21;:11;21130:9;:22::i;:::-;21166:11;;;;;;-1:-1:-1;;;21210:15:21;;-1:-1:-1;;21084:152:21;-1:-1:-1;;;21341:1:21;:11;21337:297;;;352:3;21368:256;21398:5;;;;21368:256;;-1:-1:-1;;;21433:5:21;;;21432:17;21428:21;;-1:-1:-1;;;21488:1:21;:12;21484:126;;21530:1;21524:7;;;;21577:14;-1:-1:-1;;21585:5:21;;21577:14;;21570:21;;;;;21484:126;-1:-1:-1;;21405:3:21;21368:256;;;;21337:297;854:33;772;21652:19;;21651:39;;20894:803;-1:-1:-1;;;20894:803:21:o;32497:3691::-;32551:7;32956:18;-1:-1:-1;;;32643:38:21;;;32727:5;;;32726:17;;;32823:5;;;32822:17;;;32919:5;;;32918:17;;;32952:22;;;32764:18;32760:22;;;32860:18;32856:22;;;;32849:29;32945;;32643:38;;33015:5;;;33014:17;33010:21;;33048:1;33052:18;33048:22;33041:29;;;;-1:-1:-1;;;33115:1:21;33111;:5;33110:17;;;;;;33106:21;;33144:1;33148:18;33144:22;33137:29;;;;-1:-1:-1;;;33211:1:21;33207;:5;33206:17;;;;;;33202:21;;33240:1;33244:18;33240:22;33233:29;;;;-1:-1:-1;;;33307:1:21;33303;:5;33302:17;;;;;;33298:21;;33336:1;33340:18;33336:22;33329:29;;;;-1:-1:-1;;;33403:1:21;33399;:5;33398:17;;;;;;33394:21;;33432:1;33436:18;33432:22;33425:29;;;;-1:-1:-1;;;33499:1:21;33495;:5;33494:17;;;;;;33490:21;;33528:1;33532:18;33528:22;33521:29;;;;-1:-1:-1;;;33595:1:21;33591;:5;33590:17;;;;;;33586:21;;33624:1;33628:18;33624:22;33617:29;;;;-1:-1:-1;;;33691:1:21;33687;:5;33686:17;;;;;;33682:21;;33720:1;33724:18;33720:22;33713:29;;;;-1:-1:-1;;;33787:1:21;33783;:5;33782:17;;;;;;33778:21;;33816:1;33820:18;33816:22;33809:29;;;;-1:-1:-1;;;33883:1:21;33879;:5;33878:17;;;;;;33874:21;;33912:1;33916:18;33912:22;33905:29;;;;-1:-1:-1;;;33979:1:21;33975;:5;33974:17;;;;;;33970:21;;34008:1;34012:18;34008:22;34001:29;;;;-1:-1:-1;;;34075:1:21;34071;:5;34070:17;;;;;;34066:21;;34104:1;34108:18;34104:22;34097:29;;;;-1:-1:-1;;;34171:1:21;34167;:5;34166:17;;;;;;34162:21;;34200