Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Thousands of tokens and competitive prices from multiple aggregators, in one place.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (17)13,593.85922147 CVPConcentrated... (CVP)$1,527.31@0.1124489.51439988 LENDEthLend (LEND)$19.59@0.04400 FNTFalcon (FNT)$0.00@0.00801.7814246 SNXSynthetix Ne... (SNX)$1,483.30@1.85114.14139548 UNIUniswap (UNI)$1,488.40@13.0421.34814088 wNXMWrapped NXM (wNXM)$1,578.91@73.960.01 YlFiYearn Loans ... (YlFi)0.18484281 YFIyearn.financ... (YFI)$1,518.54@8,215.2821.10061757 COMPCompound (COMP)$1,535.28@72.761.00052773 MKRMaker (MKR)$1,490.24@1,489.45131.544924 USDCUSDC (USDC)$131.68@1.0010.1 DPLERC-20: Dolp... (DPL)0.0518 YBETERC-20: YBET... (YBET)1.5 TokenERC-20 TOKEN*[Suspicious]1,500 TokenERC-20 TOKEN*[Suspicious]856,420,144,564 TokenERC-20 TOKEN*[Spam]856,420,144,564 TokenERC-20 TOKEN*[Spam]NFT Tokens (16)Moonbirdpunk OriginMoonbirdpunk OriginERC-1155claim rewards on snxtoken.comsnxtoken.comERC-1155claim rewards on univ3portal.netuniv3portal.netERC-1155claim rewards on univ4labs.orguniv4labs.orgERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
- Info
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 1,319 transactions
Transaction Hash MethodBlockFromToApprove 20577924 2024-08-21 15:34:47 140 days ago 1724254487 IN 0 ETH$0.00 0.00138123 30 Approve 18803706 2023-12-17 5:34:59 388 days ago 1702791299 IN 0 ETH$0.00 0.0006892 28.60595393 Approve 18803706 2023-12-17 5:34:59 388 days ago 1702791299 IN 0 ETH$0.00 0.0006892 28.60595393 Approve 18283292 2023-10-05 9:03:23 461 days ago 1696496603 IN 0 ETH$0.00 0.00016733 6.94553716 Approve 17707253 2023-07-16 17:12:23 542 days ago 1689527543 IN 0 ETH$0.00 0.00041939 17.40715621 Approve 17148996 2023-04-29 3:10:47 621 days ago 1682737847 IN 0 ETH$0.00 0.00175714 37.93745986 Transfer 17038356 2023-04-13 11:46:59 636 days ago 1681386419 IN 0 ETH$0.00 0.00130709 27.26411427 Approve 16888551 2023-03-23 6:45:23 657 days ago 1679553923 IN 0 ETH$0.00 0.00024512 10.17418741 Exit Pool 16013071 2022-11-20 18:39:23 780 days ago 1668969563 IN 0 ETH$0.00 0.00540043 12.984395 Exit Pool 16013065 2022-11-20 18:38:11 780 days ago 1668969491 IN 0 ETH$0.00 0.0067068 12.7483296 Exitswap Pool Am... 16013009 2022-11-20 18:26:59 780 days ago 1668968819 IN 0 ETH$0.00 0.00159816 12.93208609 Exit Pool 16011027 2022-11-20 11:48:11 780 days ago 1668944891 IN 0 ETH$0.00 0.00142724 14.18580418 Approve 16010844 2022-11-20 11:11:23 780 days ago 1668942683 IN 0 ETH$0.00 0.0005693 12.27567325 Approve 15489647 2022-09-07 9:58:20 854 days ago 1662544700 IN 0 ETH$0.00 0.00075877 16.36098686 Approve 15124812 2022-07-12 1:13:38 912 days ago 1657588418 IN 0 ETH$0.00 0.00037631 14.42192527 Approve 15124803 2022-07-12 1:12:01 912 days ago 1657588321 IN 0 ETH$0.00 0.00034895 14.48384792 Approve 15082119 2022-07-05 11:05:58 918 days ago 1657019158 IN 0 ETH$0.00 0.00042762 17.74908547 Approve 14441481 2022-03-23 8:32:26 1022 days ago 1648024346 IN 0 ETH$0.00 0.00062985 24.13888461 Approve 14441388 2022-03-23 8:08:51 1022 days ago 1648022931 IN 0 ETH$0.00 0.00057232 23.7547366 Approve 14105403 2022-01-30 6:02:07 1074 days ago 1643522527 IN 0 ETH$0.00 0.00431306 93 Approve 14105251 2022-01-30 5:27:22 1074 days ago 1643520442 IN 0 ETH$0.00 0.00482921 104.72572561 Approve 13335184 2021-10-01 18:46:25 1195 days ago 1633113985 IN 0 ETH$0.00 0.0037444 80.7384315 Approve 13334955 2021-10-01 17:55:15 1195 days ago 1633110915 IN 0 ETH$0.00 0.00186725 77.50205725 Approve 13334905 2021-10-01 17:42:57 1195 days ago 1633110177 IN 0 ETH$0.00 0.00346818 74.78242873 Approve 13322827 2021-09-29 20:30:06 1197 days ago 1632947406 IN 0 ETH$0.00 0.00303611 65.99524415 Loading...LoadingContract Name:BPool
Compiler Versionv0.6.12+commit.27d51765
Contract Source Code (Solidity)
- contract BConst
- contract BNum is BConst
- - function btoi(uint a)
- - function bfloor(uint a)
- - function badd(uint a, uint b)
- - function bsub(uint a, uint b)
- - function bsubSign(uint a, uint b)
- - function bmul(uint a, uint b)
- - function bdiv(uint a, uint b)
- - function bpowi(uint a, uint n)
- - function bpow(uint base, uint exp)
- - function bpowApprox(uint base, uint e ...
- interface IERC20
- - function totalSupply()
- - function balanceOf(address whom)
- - function allowance(address src, addre ...
- - function approve(address dst, uint am ...
- - function transfer(address dst, uint a ...
- - function transferFrom(
- contract BTokenBase is BNum
- - function _mint(uint amt)
- - function _burn(uint amt)
- - function _move(address src, address d ...
- - function _push(address to, uint amt)
- - function _pull(address from, uint amt ...
- contract BToken is BTokenBase, IER ...
- - function name()
- - function symbol()
- - function decimals()
- - function allowance(address src, addre ...
- - function balanceOf(address whom)
- - function totalSupply()
- - function approve(address dst, uint am ...
- - function increaseApproval(address dst ...
- - function decreaseApproval(address dst ...
- - function transfer(address dst, uint a ...
- - function transferFrom(address src, ad ...
- contract BMath is BConst, BNum
- - function calcSpotPrice(
- - function calcOutGivenIn(
- - function calcInGivenOut(
- - function calcPoolOutGivenSingleIn(
- - function calcSingleInGivenPoolOut(
- - function calcSingleOutGivenPoolIn(
- - function calcPoolInGivenSingleOut(
- interface IPoolRestrictions
- - function getMaxTotalSupply(address _p ...
- - function isVotingSignatureAllowed(add ...
- - function isWithoutFee(address _addr)
- contract BPool is BToken, BMath *
- - function isPublicSwap()
- - function isFinalized()
- - function isBound(address t)
- - function getNumTokens()
- - function getCurrentTokens()
- - function getFinalTokens()
- - function getDenormalizedWeight(addres ...
- - function getTotalDenormalizedWeight()
- - function getNormalizedWeight(address ...
- - function getBalance(address token)
- - function getSwapFee()
- - function getCommunityFee()
- - function getController()
- - function getRestrictions()
- - function setSwapFee(uint swapFee)
- - function setCommunityFeeAndReceiver(
- - function setRestrictions(IPoolRestric ...
- - function setController(address manage ...
- - function setPublicSwap(bool public_)
- - function finalize()
- - function callVoting(address voting, b ...
- - function bind(address token, uint bal ...
- - function rebind(address token, uint b ...
- - function unbind(address token)
- - function gulp(address token)
- - function getSpotPrice(address tokenIn ...
- - function getSpotPriceSansFee(address ...
- - function joinPool(uint poolAmountOut, ...
- - function exitPool(uint poolAmountIn, ...
- - function swapExactAmountIn(
- - function swapExactAmountOut(
- - function joinswapExternAmountIn(addre ...
- - function joinswapPoolAmountOut(addres ...
- - function exitswapPoolAmountIn(address ...
- - function exitswapExternAmountOut(addr ...
- - function _pullUnderlying(address erc2 ...
- - function _pushUnderlying(address erc2 ...
- - function _pullCommunityFeeUnderlying( ...
- - function _pullPoolShare(address from, ...
- - function _pushPoolShare(address to, u ...
- - function _mintPoolShare(uint amount)
- - function _burnPoolShare(uint amount)
- - function _checkBound(address token)
- - function _checkController()
- - function _checkFinalized()
- - function calcAmountWithCommunityFee(
/** *Submitted for verification at Etherscan.io on 2020-10-07 */ /* https://powerpool.finance/ wrrrw r wrr ppwr rrr wppr0 prwwwrp prwwwrp wr0 rr 0rrrwrrprpwp0 pp pr prrrr0 pp 0r prrrr0 0rwrrr pp pr prrrr0 prrrr0 r0 rrp pr wr00rrp prwww0 pp wr pp w00r prwwwpr 0rw prwww0 pp wr pp wr r0 r0rprprwrrrp pr0 pp wr pr pp rwwr wr 0r pp wr pr wr pr r0 prwr wrr0wpwr 00 www0 0w0ww www0 0w 00 www0 www0 0www0 wrr ww0rrrr */ // File: contracts/balancer-core/BConst.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.12; contract BConst { uint public constant BONE = 10**18; uint public constant MIN_BOUND_TOKENS = 2; uint public constant MAX_BOUND_TOKENS = 8; uint public constant MIN_FEE = BONE / 10**6; uint public constant MAX_FEE = BONE / 10; uint public constant MIN_WEIGHT = BONE; uint public constant MAX_WEIGHT = BONE * 50; uint public constant MAX_TOTAL_WEIGHT = BONE * 50; uint public constant MIN_BALANCE = BONE / 10**12; uint public constant INIT_POOL_SUPPLY = BONE * 100; uint public constant MIN_BPOW_BASE = 1 wei; uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint public constant BPOW_PRECISION = BONE / 10**10; uint public constant MAX_IN_RATIO = BONE / 2; uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; } // File: contracts/balancer-core/BNum.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.12; contract BNum is BConst { function btoi(uint a) internal pure returns (uint) { return a / BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint a, uint b) internal pure returns (uint, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint a, uint b) internal pure returns (uint) { uint c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint c2 = c1 / BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "ERR_DIV_ZERO"); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint a, uint n) internal pure returns (uint) { uint z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint base, uint exp) internal pure returns (uint) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint whole = bfloor(exp); uint remain = bsub(exp, whole); uint wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox(uint base, uint exp, uint precision) internal pure returns (uint) { // term 0: uint a = exp; (uint x, bool xneg) = bsubSign(base, BONE); uint term = BONE; uint sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i - 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint i = 1; term >= precision; i++) { uint bigK = i * BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } } // File: contracts/balancer-core/BToken.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.12; // Highly opinionated token implementation interface IERC20 { event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function totalSupply() external view returns (uint); function balanceOf(address whom) external view returns (uint); function allowance(address src, address dst) external view returns (uint); function approve(address dst, uint amt) external returns (bool); function transfer(address dst, uint amt) external returns (bool); function transferFrom( address src, address dst, uint amt ) external returns (bool); } contract BTokenBase is BNum { mapping(address => uint) internal _balance; mapping(address => mapping(address=>uint)) internal _allowance; uint internal _totalSupply; event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function _mint(uint amt) internal { _balance[address(this)] = badd(_balance[address(this)], amt); _totalSupply = badd(_totalSupply, amt); emit Transfer(address(0), address(this), amt); } function _burn(uint amt) internal { require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[address(this)] = bsub(_balance[address(this)], amt); _totalSupply = bsub(_totalSupply, amt); emit Transfer(address(this), address(0), amt); } function _move(address src, address dst, uint amt) internal { require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[src] = bsub(_balance[src], amt); _balance[dst] = badd(_balance[dst], amt); emit Transfer(src, dst, amt); } function _push(address to, uint amt) internal { _move(address(this), to, amt); } function _pull(address from, uint amt) internal { _move(from, address(this), amt); } } contract BToken is BTokenBase, IERC20 { string internal _name; string internal _symbol; uint8 private _decimals = 18; function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns(uint8) { return _decimals; } function allowance(address src, address dst) external override view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external override view returns (uint) { return _balance[whom]; } function totalSupply() public override view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external override returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function increaseApproval(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt); emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function decreaseApproval(address dst, uint amt) external returns (bool) { uint oldValue = _allowance[msg.sender][dst]; if (amt > oldValue) { _allowance[msg.sender][dst] = 0; } else { _allowance[msg.sender][dst] = bsub(oldValue, amt); } emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function transfer(address dst, uint amt) external override returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external override returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER"); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } } // File: contracts/balancer-core/BMath.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.12; contract BMath is BConst, BNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcSpotPrice( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint swapFee ) public pure returns (uint spotPrice) { uint numer = bdiv(tokenBalanceIn, tokenWeightIn); uint denom = bdiv(tokenBalanceOut, tokenWeightOut); uint ratio = bdiv(numer, denom); uint scale = bdiv(BONE, bsub(BONE, swapFee)); return (spotPrice = bmul(ratio, scale)); } /********************************************************************************************** // calcOutGivenIn // // aO = tokenAmountOut // // bO = tokenBalanceOut // // bI = tokenBalanceIn / / bI \ (wI / wO) \ // // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | // // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcOutGivenIn( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut); uint adjustedIn = bsub(BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BONE, foo); tokenAmountOut = bmul(tokenBalanceOut, bar); return tokenAmountOut; } /********************************************************************************************** // calcInGivenOut // // aI = tokenAmountIn // // bO = tokenBalanceOut / / bO \ (wO / wI) \ // // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | // // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / // // wI = tokenWeightIn -------------------------------------------- // // wO = tokenWeightOut ( 1 - sF ) // // sF = swapFee // **********************************************************************************************/ function calcInGivenOut( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn); uint diff = bsub(tokenBalanceOut, tokenAmountOut); uint y = bdiv(tokenBalanceOut, diff); uint foo = bpow(y, weightRatio); foo = bsub(foo, BONE); tokenAmountIn = bsub(BONE, swapFee); tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn); return tokenAmountIn; } /********************************************************************************************** // calcPoolOutGivenSingleIn // // pAo = poolAmountOut / \ // // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ // // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ // // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS // // tBi = tokenBalanceIn \\ ------------------------------------- / / // // pS = poolSupply \\ tBi / / // // sF = swapFee \ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) public pure returns (uint poolAmountOut) { // Charge the trading fee for the proportion of tokenAi /// which is implicitly traded to the other pool tokens. // That proportion is (1- weightTokenIn) // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee); uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz)); uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee); uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn); // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply; uint poolRatio = bpow(tokenInRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); poolAmountOut = bsub(newPoolSupply, poolSupply); return poolAmountOut; } /********************************************************************************************** // calcSingleInGivenPoolOut // // tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ // // pS = poolSupply || --------- | ^ | --------- || * bI - bI // // pAo = poolAmountOut \\ pS / \(wI / tW)// // // bI = balanceIn tAi = -------------------------------------------- // // wI = weightIn / wI \ // // tW = totalWeight | 1 - ---- | * sF // // sF = swapFee \ tW / // **********************************************************************************************/ function calcSingleInGivenPoolOut( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint poolAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint newPoolSupply = badd(poolSupply, poolAmountOut); uint poolRatio = bdiv(newPoolSupply, poolSupply); //uint newBalTi = poolRatio^(1/weightTi) * balTi; uint boo = bdiv(BONE, normalizedWeight); uint tokenInRatio = bpow(poolRatio, boo); uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn); uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn); // Do reverse order of fees charged in joinswap_ExternAmountIn, this way // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ``` //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ; uint zar = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar)); return tokenAmountIn; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - pAi \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); uint newPoolSupply = bsub(poolSupply, poolAmountIn); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight)); uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut); uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz)); return tokenAmountOut; } /********************************************************************************************** // calcPoolInGivenSingleOut // // pAi = poolAmountIn // / tAo \\ / wO \ \ // // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ // // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | // // ps = poolSupply \\ -----------------------------------/ / // // wO = tokenWeightOut pAi = \\ bO / / // // tW = totalWeight // // sF = swapFee // **********************************************************************************************/ function calcPoolInGivenSingleOut( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint tokenAmountOut, uint swapFee ) public pure returns (uint poolAmountIn) { // charge swap fee on the output token side uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ; uint zoo = bsub(BONE, normalizedWeight); uint zar = bmul(zoo, swapFee); uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar)); uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee); uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut); //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply; uint poolRatio = bpow(tokenOutRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); uint poolAmountIn = bsub(poolSupply, newPoolSupply); return poolAmountIn; } } // File: contracts/IPoolRestrictions.sol pragma solidity 0.6.12; interface IPoolRestrictions { function getMaxTotalSupply(address _pool) external virtual view returns(uint256); function isVotingSignatureAllowed(address _votingAddress, bytes4 _signature) external virtual view returns(bool); function isWithoutFee(address _addr) external virtual view returns(bool); } // File: contracts/balancer-core/BPool.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.12; contract BPool is BToken, BMath { struct Record { bool bound; // is token bound to pool uint index; // private uint denorm; // denormalized weight uint balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_CALL( bytes4 indexed sig, address indexed caller, bytes data ) anonymous; event LOG_CALL_VOTING( address indexed voting, bool indexed success, bytes4 indexed inputSig, bytes inputData, bytes outputData ); modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex, "REENTRY"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "REENTRY"); _; } bool private _mutex; address private _controller; // has CONTROL role bool private _publicSwap; // true if PUBLIC can call SWAP functions IPoolRestrictions private _restrictions; // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint private _swapFee; uint private _communitySwapFee; uint private _communityJoinFee; uint private _communityExitFee; address private _communityFeeReceiver; bool private _finalized; address[] private _tokens; mapping(address=>Record) private _records; uint private _totalWeight; constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _controller = msg.sender; _swapFee = MIN_FEE; _communitySwapFee = 0; _communityJoinFee = 0; _communityExitFee = 0; _publicSwap = false; _finalized = false; } function isPublicSwap() external view returns (bool) { return _publicSwap; } function isFinalized() external view returns (bool) { return _finalized; } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint) { return _tokens.length; } function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) { return _tokens; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(_finalized, "NOT_FINALIZED"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { _checkBound(token); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint) { _checkBound(token); return bdiv(_records[token].denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { _checkBound(token); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getCommunityFee() external view _viewlock_ returns (uint communitySwapFee, uint communityJoinFee, uint communityExitFee, address communityFeeReceiver) { return (_communitySwapFee, _communityJoinFee, _communityExitFee, _communityFeeReceiver); } function getController() external view _viewlock_ returns (address) { return _controller; } function getRestrictions() external view _viewlock_ returns (address) { return address(_restrictions); } function setSwapFee(uint swapFee) external _logs_ _lock_ { _checkController(); require(swapFee >= MIN_FEE && swapFee <= MAX_FEE, "FEE_BOUNDS"); _swapFee = swapFee; } function setCommunityFeeAndReceiver( uint communitySwapFee, uint communityJoinFee, uint communityExitFee, address communityFeeReceiver ) external _logs_ _lock_ { _checkController(); require(communitySwapFee >= MIN_FEE && communitySwapFee <= MAX_FEE, "FEE_BOUNDS"); require(communityJoinFee >= MIN_FEE && communityJoinFee <= MAX_FEE, "FEE_BOUNDS"); require(communityExitFee >= MIN_FEE && communityExitFee <= MAX_FEE, "FEE_BOUNDS"); _communitySwapFee = communitySwapFee; _communityJoinFee = communityJoinFee; _communityExitFee = communityExitFee; _communityFeeReceiver = communityFeeReceiver; } function setRestrictions(IPoolRestrictions restrictions) external _logs_ _lock_ { _checkController(); _restrictions = restrictions; } function setController(address manager) external _logs_ _lock_ { _checkController(); _controller = manager; } function setPublicSwap(bool public_) external _logs_ _lock_ { _checkFinalized(); _checkController(); _publicSwap = public_; } function finalize() external _logs_ _lock_ { _checkController(); _checkFinalized(); require(_tokens.length >= MIN_BOUND_TOKENS, "MIN_TOKENS"); _finalized = true; _publicSwap = true; _mintPoolShare(INIT_POOL_SUPPLY); _pushPoolShare(msg.sender, INIT_POOL_SUPPLY); } function callVoting(address voting, bytes4 signature, bytes calldata args, uint value) external _logs_ _lock_ { require(_restrictions.isVotingSignatureAllowed(voting, signature), "NOT_ALLOWED_SIG"); _checkController(); (bool success, bytes memory data) = voting.call{ value: value }(abi.encodePacked(signature, args)); require(success, "NOT_SUCCESS"); emit LOG_CALL_VOTING(voting, success, signature, msg.data, data); } function bind(address token, uint balance, uint denorm) external _logs_ // _lock_ Bind does not lock because it jumps to `rebind`, which does { _checkController(); require(!_records[token].bound, "IS_BOUND"); _checkFinalized(); require(_tokens.length < MAX_BOUND_TOKENS, "MAX_TOKENS"); _records[token] = Record({ bound: true, index: _tokens.length, denorm: 0, // balance and denorm will be validated balance: 0 // and set by `rebind` }); _tokens.push(token); rebind(token, balance, denorm); } function rebind(address token, uint balance, uint denorm) public _logs_ _lock_ { _checkController(); _checkBound(token); _checkFinalized(); require(denorm >= MIN_WEIGHT && denorm <= MAX_WEIGHT, "WEIGHT_BOUNDS"); require(balance >= MIN_BALANCE, "MIN_BALANCE"); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= MAX_TOTAL_WEIGHT, "MAX_TOTAL_WEIGHT"); } else if (denorm < oldWeight) { _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm)); } _records[token].denorm = denorm; // Adjust the balance record and actual token balance uint oldBalance = _records[token].balance; _records[token].balance = balance; if (balance > oldBalance) { _pullUnderlying(token, msg.sender, bsub(balance, oldBalance)); } else if (balance < oldBalance) { uint tokenBalanceWithdrawn = bsub(oldBalance, balance); _pushUnderlying(token, msg.sender, tokenBalanceWithdrawn); } } function unbind(address token) external _logs_ _lock_ { _checkController(); _checkBound(token); _checkFinalized(); uint tokenBalance = _records[token].balance; _totalWeight = bsub(_totalWeight, _records[token].denorm); // Swap the token-to-unbind with the last token, // then delete the last token uint index = _records[token].index; uint last = _tokens.length - 1; _tokens[index] = _tokens[last]; _records[_tokens[index]].index = index; _tokens.pop(); _records[token] = Record({ bound: false, index: 0, denorm: 0, balance: 0 }); _pushUnderlying(token, msg.sender, tokenBalance); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { _checkBound(token); _records[token].balance = IERC20(token).balanceOf(address(this)); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound && _records[tokenOut].bound, "NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee); } function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { _checkBound(tokenIn); _checkBound(tokenOut); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external _logs_ _lock_ { require(_finalized, "NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "MATH_APPROX"); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountIn = bmul(ratio, bal); require(tokenAmountIn != 0, "MATH_APPROX"); require(tokenAmountIn <= maxAmountsIn[i], "LIMIT_IN"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } (uint poolAmountOutAfterFee, uint poolAmountOutFee) = calcAmountWithCommunityFee( poolAmountOut, _communityJoinFee, msg.sender ); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOutAfterFee); _pushPoolShare(_communityFeeReceiver, poolAmountOutFee); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _logs_ _lock_ { require(_finalized, "NOT_FINALIZED"); (uint poolAmountInAfterFee, uint poolAmountInFee) = calcAmountWithCommunityFee( poolAmountIn, _communityExitFee, msg.sender ); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountInAfterFee, poolTotal); require(ratio != 0, "MATH_APPROX"); _pullPoolShare(msg.sender, poolAmountIn); _pushPoolShare(_communityFeeReceiver, poolAmountInFee); _burnPoolShare(poolAmountInAfterFee); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountOut = bmul(ratio, bal); require(tokenAmountOut != 0, "MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "LIMIT_OUT"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountOut, uint spotPriceAfter) { _checkBound(tokenIn); _checkBound(tokenOut); require(_publicSwap, "NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "LIMIT_PRICE"); (uint tokenAmountInAfterFee, uint tokenAmountInFee) = calcAmountWithCommunityFee( tokenAmountIn, _communitySwapFee, msg.sender ); require(tokenAmountInAfterFee <= bmul(inRecord.balance, MAX_IN_RATIO), "MAX_IN_RATIO"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountInAfterFee, _swapFee ); require(tokenAmountOut >= minAmountOut, "LIMIT_OUT"); inRecord.balance = badd(inRecord.balance, tokenAmountInAfterFee); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require( spotPriceAfter >= spotPriceBefore && spotPriceBefore <= bdiv(tokenAmountInAfterFee, tokenAmountOut), "MATH_APPROX" ); require(spotPriceAfter <= maxPrice, "LIMIT_PRICE"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountInAfterFee, tokenAmountOut); _pullCommunityFeeUnderlying(tokenIn, msg.sender, tokenAmountInFee); _pullUnderlying(tokenIn, msg.sender, tokenAmountInAfterFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountIn, uint spotPriceAfter) { _checkBound(tokenIn); _checkBound(tokenOut); require(_publicSwap, "NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "OUT_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "LIMIT_PRICE"); (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee( tokenAmountOut, _communitySwapFee, msg.sender ); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); require(tokenAmountIn <= maxAmountIn, "LIMIT_IN"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require( spotPriceAfter >= spotPriceBefore && spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOutAfterFee), "MATH_APPROX" ); require(spotPriceAfter <= maxPrice, "LIMIT_PRICE"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOutAfterFee); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee); _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _logs_ _lock_ returns (uint poolAmountOut) { require(_finalized, "NOT_FINALIZED"); _checkBound(tokenIn); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "MAX_IN_RATIO"); (uint tokenAmountInAfterFee, uint tokenAmountInFee) = calcAmountWithCommunityFee( tokenAmountIn, _communityJoinFee, msg.sender ); Record storage inRecord = _records[tokenIn]; poolAmountOut = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountInAfterFee, _swapFee ); require(poolAmountOut >= minPoolAmountOut, "LIMIT_OUT"); inRecord.balance = badd(inRecord.balance, tokenAmountInAfterFee); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountInAfterFee); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullCommunityFeeUnderlying(tokenIn, msg.sender, tokenAmountInFee); _pullUnderlying(tokenIn, msg.sender, tokenAmountInAfterFee); return poolAmountOut; } function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external _logs_ _lock_ returns (uint tokenAmountIn) { require(_finalized, "NOT_FINALIZED"); _checkBound(tokenIn); Record storage inRecord = _records[tokenIn]; (uint poolAmountOutAfterFee, uint poolAmountOutFee) = calcAmountWithCommunityFee( poolAmountOut, _communityJoinFee, msg.sender ); tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee ); require(tokenAmountIn != 0, "MATH_APPROX"); require(tokenAmountIn <= maxAmountIn, "LIMIT_IN"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "MAX_IN_RATIO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOutAfterFee); _pushPoolShare(_communityFeeReceiver, poolAmountOutFee); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return tokenAmountIn; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _logs_ _lock_ returns (uint tokenAmountOut) { require(_finalized, "NOT_FINALIZED"); _checkBound(tokenOut); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "LIMIT_OUT"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "OUT_RATIO"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee( tokenAmountOut, _communityExitFee, msg.sender ); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOutAfterFee); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(poolAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee); _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee); return tokenAmountOut; } function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external _logs_ _lock_ returns (uint poolAmountIn) { require(_finalized, "NOT_FINALIZED"); _checkBound(tokenOut); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "OUT_RATIO"); Record storage outRecord = _records[tokenOut]; (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee( tokenAmountOut, _communityExitFee, msg.sender ); poolAmountIn = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee ); require(poolAmountIn != 0, "MATH_APPROX"); require(poolAmountIn <= maxPoolAmountIn, "LIMIT_IN"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOutAfterFee); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(poolAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee); _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee); return poolAmountIn; } // == // 'Underlying' token-manipulation functions make external calls but are NOT locked // You must `_lock_` or otherwise ensure reentry-safety function _pullUnderlying(address erc20, address from, uint amount) internal { bool xfer = IERC20(erc20).transferFrom(from, address(this), amount); require(xfer, "ERC20_FALSE"); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "ERC20_FALSE"); } function _pullCommunityFeeUnderlying(address erc20, address from, uint amount) internal { bool xfer = IERC20(erc20).transferFrom(from, _communityFeeReceiver, amount); require(xfer, "ERC20_FALSE"); } function _pullPoolShare(address from, uint amount) internal { _pull(from, amount); } function _pushPoolShare(address to, uint amount) internal { _push(to, amount); } function _mintPoolShare(uint amount) internal { if(address(_restrictions) != address(0)) { uint maxTotalSupply = _restrictions.getMaxTotalSupply(address(this)); require(badd(_totalSupply, amount) <= maxTotalSupply, "MAX_SUPPLY"); } _mint(amount); } function _burnPoolShare(uint amount) internal { _burn(amount); } function _checkBound(address token) internal view { require(_records[token].bound, "NOT_BOUND"); } function _checkController() internal view { require(msg.sender == _controller, "NOT_CONTROLLER"); } function _checkFinalized() internal view { require(!_finalized, "IS_FINALIZED"); } function calcAmountWithCommunityFee( uint tokenAmountIn, uint communityFee, address operator ) public view returns (uint tokenAmountInAfterFee, uint tokenAmountFee) { if (address(_restrictions) != address(0) && _restrictions.isWithoutFee(operator)) { return (tokenAmountIn, 0); } uint adjustedIn = bsub(BONE, communityFee); tokenAmountInAfterFee = bmul(tokenAmountIn, adjustedIn); uint tokenAmountFee = bsub(tokenAmountIn, tokenAmountInAfterFee); return (tokenAmountInAfterFee, tokenAmountFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voting","type":"address"},{"indexed":true,"internalType":"bool","name":"success","type":"bool"},{"indexed":true,"internalType":"bytes4","name":"inputSig","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"inputData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"outputData","type":"bytes"}],"name":"LOG_CALL_VOTING","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"communityFee","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"calcAmountWithCommunityFee","outputs":[{"internalType":"uint256","name":"tokenAmountInAfterFee","type":"uint256"},{"internalType":"uint256","name":"tokenAmountFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"voting","type":"address"},{"internalType":"bytes4","name":"signature","type":"bytes4"},{"internalType":"bytes","name":"args","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"callVoting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommunityFee","outputs":[{"internalType":"uint256","name":"communitySwapFee","type":"uint256"},{"internalType":"uint256","name":"communityJoinFee","type":"uint256"},{"internalType":"uint256","name":"communityExitFee","type":"uint256"},{"internalType":"address","name":"communityFeeReceiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRestrictions","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"communitySwapFee","type":"uint256"},{"internalType":"uint256","name":"communityJoinFee","type":"uint256"},{"internalType":"uint256","name":"communityExitFee","type":"uint256"},{"internalType":"address","name":"communityFeeReceiver","type":"address"}],"name":"setCommunityFeeAndReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPoolRestrictions","name":"restrictions","type":"address"}],"name":"setRestrictions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526005805460ff191660121790553480156200001e57600080fd5b50604051620057f4380380620057f4833981810160405260408110156200004457600080fd5b81019080805160405193929190846401000000008211156200006557600080fd5b9083019060208201858111156200007b57600080fd5b82516401000000008111828201881017156200009657600080fd5b82525081516020918201929091019080838360005b83811015620000c5578181015183820152602001620000ab565b50505050905090810190601f168015620000f35780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011757600080fd5b9083019060208201858111156200012d57600080fd5b82516401000000008111828201881017156200014857600080fd5b82525081516020918201929091019080838360005b83811015620001775781810151838201526020016200015d565b50505050905090810190601f168015620001a55780820380516001836020036101000a031916815260200191505b5060405250508251620001c19150600390602085019062000225565b508051620001d790600490602084019062000225565b50506005805464e8d4a51000600755600060088190556009819055600a5562010000600160b01b0319163362010000021760ff60b01b1916905550600b805460ff60a01b19169055620002c1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026857805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002985782518255916020019190600101906200027b565b50620002a6929150620002aa565b5090565b5b80821115620002a65760008155600101620002ab565b61552380620002d16000396000f3fe608060405234801561001057600080fd5b50600436106103175760003560e01c806302c967481461031c57806306fdde0314610360578063095ea7b3146103dd57806309a3bbe41461041d5780630f7b1e3e146104255780631446a7ff1461045f57806315e84af91461048d57806318160ddd146104bb578063189d00ca146104c3578063218b5382146104cb5780632245a08e146104d357806323b872dd1461051e5780632f37b624146105545780633018205f1461057a578063313ce5671461059e57806334e19907146105bc5780633fdddaa2146105d9578063442e21521461060b57806346ab38f11461069857806349b59552146106ca5780634bb278f3146106e95780634f69c0d4146106f15780635c1bbaf7146107665780635db34277146107a157806366188463146107d35780636d06dfa0146107ff57806370a082311461083157806376c7a3c7146108575780637c5e9ea41461085f5780638201aa3f1461089f57806382f652ad146108df5780638656b6531461091a578063867378c514610955578063892980121461095d5780638c28cbe8146109985780638d4e4083146109be57806390ad688b146109c657806392eefe9b146109fd578063936c347714610a235780639381cd2b14610a2b578063948d8ce614610a3357806395d89b4114610a59578063992e2a9214610a61578063a221ee4914610a69578063a9059cbb14610a9e578063b02f0b7314610aca578063b0e0d13614610b3f578063b7b800a414610b47578063ba019dab14610b4f578063ba9530a614610b57578063bc063e1a14610b92578063bc694ea214610b9a578063be3bbd2e14610ba2578063c36596a6146104cb578063c4195cb814610bfa578063c61641cd14610c02578063cc77828d14610c28578063cd2ed8fb14610c30578063cf5e7bd314610c38578063d4cadf6814610c5e578063d73dd62314610c66578063dd62ed3e14610c92578063e4a28a521461041d578063e4e1e53814610cc0578063ec09302114610cf2578063f1b8a9b714610cfa578063f8b2cb4f14610d20578063f8d6aed414610d46578063fde924f714610d81575b600080fd5b61034e6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610d89565b60408051918252519081900360200190f35b610368611068565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a257818101518382015260200161038a565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610409600480360360408110156103f357600080fd5b506001600160a01b0381351690602001356110fe565b604080519115158252519081900360200190f35b61034e611153565b61045d6004803603608081101561043b57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611160565b005b61034e6004803603604081101561047557600080fd5b506001600160a01b038135811691602001351661136b565b61034e600480360360408110156104a357600080fd5b506001600160a01b0381358116916020013516611414565b61034e61151f565b61034e611525565b61034e611539565b610505600480360360608110156104e957600080fd5b50803590602081013590604001356001600160a01b0316611545565b6040805192835260208301919091528051918290030190f35b6104096004803603606081101561053457600080fd5b506001600160a01b03813581169160208101359091169060400135611624565b6104096004803603602081101561056a57600080fd5b50356001600160a01b031661177e565b61058261179c565b604080516001600160a01b039092168252519081900360200190f35b6105a66117fc565b6040805160ff9092168252519081900360200190f35b61045d600480360360208110156105d257600080fd5b5035611805565b61045d600480360360608110156105ef57600080fd5b506001600160a01b03813516906020810135906040013561192f565b61045d6004803603608081101561062157600080fd5b6001600160a01b03823516916001600160e01b031960208201351691810190606081016040820135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460018302840111600160201b8311171561068d57600080fd5b919350915035611bd9565b61034e600480360360608110156106ae57600080fd5b506001600160a01b038135169060208101359060400135611f81565b61045d600480360360208110156106e057600080fd5b503515156121f4565b61045d6122de565b61045d6004803603604081101561070757600080fd5b81359190810190604081016020820135600160201b81111561072857600080fd5b82018360208201111561073a57600080fd5b803590602001918460208302840111600160201b8311171561075b57600080fd5b509092509050612442565b61034e600480360360c081101561077c57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561275a565b61034e600480360360608110156107b757600080fd5b506001600160a01b038135169060208101359060400135612812565b610409600480360360408110156107e957600080fd5b506001600160a01b038135169060200135612a9d565b61034e6004803603606081101561081557600080fd5b506001600160a01b038135169060208101359060400135612b75565b61034e6004803603602081101561084757600080fd5b50356001600160a01b0316612e3b565b61034e612e56565b610505600480360360a081101561087557600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e68565b610505600480360360a08110156108b557600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561323b565b61034e600480360360c08110156108f557600080fd5b5080359060208101359060408101359060608101359060808101359060a001356135f0565b61034e600480360360c081101561093057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613696565b61034e613737565b61034e600480360360c081101561097357600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561374b565b61045d600480360360208110156109ae57600080fd5b50356001600160a01b03166137e6565b610409613942565b6109ce613952565b604080519485526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b61045d60048036036020811015610a1357600080fd5b50356001600160a01b03166139c7565b61034e613ab5565b61034e613b06565b61034e60048036036020811015610a4957600080fd5b50356001600160a01b0316613b13565b610368613b85565b61034e613be6565b61034e600480360360a0811015610a7f57600080fd5b5080359060208101359060408101359060608101359060800135613bf2565b61040960048036036040811015610ab457600080fd5b506001600160a01b038135169060200135613c57565b61045d60048036036040811015610ae057600080fd5b81359190810190604081016020820135600160201b811115610b0157600080fd5b820183602082011115610b1357600080fd5b803590602001918460208302840111600160201b83111715610b3457600080fd5b509092509050613c6d565b61034e613f86565b61034e613f8b565b61034e613f90565b61034e600480360360c0811015610b6d57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613f95565b61034e614016565b61034e614026565b610baa614032565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610be6578181015183820152602001610bce565b505050509050019250505060405180910390f35b610582614129565b61045d60048036036020811015610c1857600080fd5b50356001600160a01b0316614183565b610baa61426f565b61034e6142b9565b61045d60048036036020811015610c4e57600080fd5b50356001600160a01b03166142bf565b61034e614526565b61040960048036036040811015610c7c57600080fd5b506001600160a01b038135169060200135614577565b61034e60048036036040811015610ca857600080fd5b506001600160a01b03813581169160200135166145f8565b61045d60048036036060811015610cd657600080fd5b506001600160a01b038135169060208101359060400135614623565b61034e6147e3565b61034e60048036036020811015610d1057600080fd5b50356001600160a01b03166147f3565b61034e60048036036020811015610d3657600080fd5b50356001600160a01b031661486f565b61034e600480360360c0811015610d5c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356148e1565b610409614964565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e33576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16610e90576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b610e9984614974565b6001600160a01b0384166000908152600d60205260409020600390810154610ece91670de0b6b3a76400005b046001016149d0565b831115610f0e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b6001600160a01b0384166000908152600d60205260408120600a549091908190610f3a90879033611545565b91509150610f5a83600301548460020154600254600e548a6007546135f0565b935083610f9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115610fdc576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b610fea836003015487614a99565b60038401556040805183815290516001600160a01b0389169133916000805160206154ae8339815191529181900360200190a36110273385614afb565b61103084614b09565b61103b873384614b12565b600b546110539088906001600160a01b031683614b12565b5050506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206154ce833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611208576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561121f614bdf565b64e8d4a51000841080159061123c575067016345785d8a00008411155b61127a576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a510008310801590611297575067016345785d8a00008311155b6112d5576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a5100082108015906112f2575067016345785d8a00008211155b611330576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b600893909355600991909155600a55600b80546001600160a01b0319166001600160a01b039092169190911790556005805461ff0019169055565b600554600090610100900460ff16156113b5576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6113be83614974565b6113c782614974565b6001600160a01b038084166000908152600d6020526040808220928516825281206003808401546002808601549284015490840154939461140b9492939290613bf2565b95945050505050565b600554600090610100900460ff161561145e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090205460ff16801561149e57506001600160a01b0382166000908152600d602052604090205460ff165b6114db576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d602052604080822092851682529020600380830154600280850154928401549084015460075461140b94929190613bf2565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60065460009081906001600160a01b0316158015906115d9575060065460408051630a499ad360e01b81526001600160a01b03868116600483015291519190921691630a499ad3916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50515b156115e95750839050600061161c565b60006115fd670de0b6b3a764000086614a99565b905061160986826149d0565b925060006116178785614a99565b925050505b935093915050565b6000336001600160a01b038516148061166057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6116a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6116b4848484614c37565b336001600160a01b038516148015906116f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611774576001600160a01b03841660009081526001602090815260408083203384529091529020546117259083614a99565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206154ce8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600d602052604090205460ff1690565b600554600090610100900460ff16156117e6576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506005546201000090046001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ad576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556118c4614bdf565b64e8d4a5100081108015906118e1575067016345785d8a00008111155b61191f576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119d7576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556119ee614bdf565b6119f783614974565b6119ff614d35565b670de0b6b3a76400008110158015611a2057506802b5e3af16b18800008111155b611a61576040805162461bcd60e51b815260206004820152600d60248201526c5745494748545f424f554e445360981b604482015290519081900360640190fd5b620f4240821015611aa7576040805162461bcd60e51b815260206004820152600b60248201526a4d494e5f42414c414e434560a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090206002015480821115611b3a57611ae0600e54611adb8484614a99565b614d83565b600e8190556802b5e3af16b18800001015611b35576040805162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015290519081900360640190fd5b611b5b565b80821015611b5b57611b57600e54611b528385614a99565b614a99565b600e555b6001600160a01b0384166000908152600d602052604090206002810183905560030180549084905580841115611ba457611b9f8533611b9a8785614a99565b614dd7565b611bc7565b80841015611bc7576000611bb88286614a99565b9050611bc5863383614b12565b505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611c81576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556006546040805163ea3457b760e01b81526001600160a01b0388811660048301526001600160e01b0319881660248301529151919092169163ea3457b7916044808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b5051611d5c576040805162461bcd60e51b815260206004820152600f60248201526e4e4f545f414c4c4f5745445f53494760881b604482015290519081900360640190fd5b611d64614bdf565b60006060866001600160a01b03168387878760405160200180846001600160e01b03191681526004018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310611ddd5780518252601f199092019160209182019101611dbe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b509150915081611e89576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f5355434345535360a81b604482015290519081900360640190fd5b856001600160e01b031916821515886001600160a01b03167f32258dd51d74a04508615e0840c1fc905dff28c96b7335e69d9a41023ecd286e6000368660405180806020018060200183810383528686828181526020019250808284376000838201819052601f909101601f191690920185810384528651815286516020918201939188019250908190849084905b83811015611f30578181015183820152602001611f18565b50505050905090810190601f168015611f5d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450506005805461ff00191690555050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561202b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612088576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61209184614974565b6001600160a01b0384166000908152600d6020526040902060038101546002808301549054600e546007546120cb9493929190899061374b565b91508282101561210e576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600d6020526040902060039081015461213e91670de0b6b3a7640000610ec5565b82111561217e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b61218c816003015483614a99565b81600301819055506000806121a484600a5433611545565b91509150866001600160a01b0316336001600160a01b03166000805160206154ae833981519152846040518082815260200191505060405180910390a36121eb3387614afb565b61103086614b09565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561229c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556122b3614d35565b6122bb614bdf565b6005805461ff0019921515600160b01b0260ff60b01b1990911617919091169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612386576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561239d614bdf565b6123a5614d35565b600c54600211156123ea576040805162461bcd60e51b815260206004820152600a6024820152694d494e5f544f4b454e5360b01b604482015290519081900360640190fd5b600b805460ff60a01b1916600160a01b1790556005805460ff60b01b1916600160b01b17905561242268056bc75e2d63100000614e30565b6124353368056bc75e2d63100000614f15565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ea576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612547576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600061255161151f565b9050600061255f8583614f1f565b9050806125a1576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b60005b600c54811015612708576000600c82815481106125bd57fe5b60009182526020808320909101546001600160a01b0316808352600d9091526040822060030154909250906125f285836149d0565b905080612634576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87878581811061264057fe5b90506020020135811115612686576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d60205260409020600301546126ac9082614d83565b6001600160a01b0384166000818152600d602090815260409182902060030193909355805184815290519192339260008051602061544e8339815191529281900390910190a36126fd833383614dd7565b5050506001016125a4565b506000806127198760095433611545565b9150915061272687614e30565b6127303383614f15565b600b54612746906001600160a01b031682614f15565b50506005805461ff00191690555050505050565b6000806127678786614f1f565b905060006127758786614d83565b905060006127838289614f1f565b90506000612799670de0b6b3a764000085614f1f565b905060006127a78383615027565b905060006127b5828e6149d0565b905060006127c3828f614a99565b905060006127e26127dc670de0b6b3a76400008a614a99565b8b6149d0565b90506127ff826127fa670de0b6b3a764000084614a99565b614f1f565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156128bc576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612919576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61292284614974565b6001600160a01b0384166000908152600d6020526040902060030154612954906002670de0b6b3a76400005b046149d0565b831115612997576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b6000806129a78560095433611545565b915091506000600d6000886001600160a01b03166001600160a01b0316815260200190815260200160002090506129f081600301548260020154600254600e5487600754613696565b935084841015612a33576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b612a41816003015484614d83565b60038201556040805184815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612a7d84614e30565b612a873385614f15565b612a92873384615135565b611053873385614dd7565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612af2573360009081526001602090815260408083206001600160a01b0388168452909152812055612b21565b612afc8184614a99565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206154ce833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c1f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612c7c576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b612c8584614974565b6001600160a01b0384166000908152600d602052604081206009549091908190612cb190879033611545565b91509150612cd183600301548460020154600254600e548a60075461275a565b935083612d13576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115612d53576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0387166000908152600d6020526040902060030154612d83906002670de0b6b3a764000061294e565b841115612dc6576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b612dd4836003015485614d83565b60038401556040805185815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612e1086614e30565b612e1a3383614f15565b600b54612e30906001600160a01b031682614f15565b611053873386614dd7565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611535565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612f01576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055612f1987614974565b612f2285614974565b600554600160b01b900460ff16612f6d576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682529020600380820154612fa691670de0b6b3a7640000610ec5565b861115612fe6576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b60006130078360030154846002015484600301548560020154600754613bf2565b90508581111561304c576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b60008061305c8960085433611545565b9150915061308085600301548660020154866003015487600201548d6007546148e1565b96508a8711156130c2576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6130d0856003015488614d83565b85600301819055506130e684600301548a614a99565b600380860182905586015460028088015490870154600754613109949190613bf2565b955082861015801561312457506131208783614f1f565b8311155b613163576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b878611156131a6576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e8339815191528a86604051808381526020018281526020019250505060405180910390a46131fc8c3389614dd7565b6132078a3384614b12565b600b5461321f908b906001600160a01b031683614b12565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156132d4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556132ec87614974565b6132f585614974565b600554600160b01b900460ff16613340576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682528120600380840154600280860154928401549084015460075494959461338794929190613bf2565b9050858111156133cc576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b6000806133dc8b60085433611545565b915091506133fa85600301546002670de0b6b3a76400008161294e57fe5b82111561343d576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b61345d856003015486600201548660030154876002015486600754613f95565b9650888710156134a0576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6134ae856003015483614d83565b85600301819055506134c4846003015488614a99565b6003808601829055860154600280880154908701546007546134e7949190613bf2565b955082861015801561350257506134fe8288614f1f565b8311155b613541576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87861115613584576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e833981519152858b604051808381526020018281526020019250505060405180910390a46135da8c3383615135565b6135e58c3384614dd7565b61321f8a3389614b12565b6000806135fd8786614f1f565b90506000613613670de0b6b3a764000083614a99565b9050600061362182866149d0565b9050600061363b876127fa670de0b6b3a764000085614a99565b905060006136498c83614a99565b90506000613657828e614f1f565b905060006136658288615027565b90506000613673828e6149d0565b905060006136818e83614a99565b99505050505050505050509695505050505050565b6000806136a38786614f1f565b905060006136c26136bc670de0b6b3a764000084614a99565b856149d0565b905060006136e1866136dc670de0b6b3a764000085614a99565b6149d0565b905060006136ef8b83614d83565b905060006136fd828d614f1f565b9050600061370b8287615027565b90506000613719828d6149d0565b9050613725818d614a99565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611535565b6000806137588786614f1f565b905060006137668786614a99565b905060006137748289614f1f565b905060006137938261378e670de0b6b3a764000087614f1f565b615027565b905060006137a1828d6149d0565b905060006137af8d83614a99565b905060006137ce6137c8670de0b6b3a764000089614a99565b8a6149d0565b9050613725826136dc670de0b6b3a764000084614a99565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561388e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556138a681614974565b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156138ec57600080fd5b505afa158015613900573d6000803e3d6000fd5b505050506040513d602081101561391657600080fd5b50516001600160a01b039091166000908152600d60205260409020600301556005805461ff0019169055565b600b54600160a01b900460ff1690565b600080600080600560019054906101000a900460ff16156139a4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5050600854600954600a54600b54929591945092506001600160a01b0390911690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055613a86614bdf565b6005805461ff00196001600160a01b03909316620100000262010000600160b01b031990911617919091169055565b600554600090610100900460ff1615613aff576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b50600e5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613b5d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b613b6682614974565b506001600160a01b03166000908152600d602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b6704a03ce68d21555681565b600080613bff8787614f1f565b90506000613c0d8686614f1f565b90506000613c1b8383614f1f565b90506000613c3d670de0b6b3a76400006127fa670de0b6b3a764000089614a99565b9050613c4982826149d0565b9a9950505050505050505050565b6000613c64338484614c37565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d15576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16613d72576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600080613d8285600a5433611545565b915091506000613d9061151f565b90506000613d9e8483614f1f565b905080613de0576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b613dea3388614afb565b600b54613e00906001600160a01b031684614f15565b613e0984614b09565b60005b600c54811015613f71576000600c8281548110613e2557fe5b60009182526020808320909101546001600160a01b0316808352600d909152604082206003015490925090613e5a85836149d0565b905080613e9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b898985818110613ea857fe5b90506020020135811015613eef576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d6020526040902060030154613f159082614a99565b6001600160a01b0384166000818152600d60209081526040918290206003019390935580518481529051919233926000805160206154ae8339815191529281900390910190a3613f66833383614b12565b505050600101613e0c565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080613fa28786614f1f565b90506000613fb8670de0b6b3a764000085614a99565b9050613fc485826149d0565b90506000613fd68a6127fa8c85614d83565b90506000613fe48285615027565b90506000613ffa670de0b6b3a764000083614a99565b90506140068a826149d0565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611535565b671bc16d674ec7ffff81565b600554606090610100900460ff161561407c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600b54600160a01b900460ff166140ca576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600c8054806020026020016040519081016040528092919081815260200182805480156110f457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614102575050505050905090565b600554600090610100900460ff1615614173576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506006546001600160a01b031690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561422b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055614242614bdf565b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554606090610100900460ff16156140ca576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600c5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614367576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561437e614bdf565b61438781614974565b61438f614d35565b6001600160a01b0381166000908152600d602052604090206003810154600e5460029092015490916143c091614a99565b600e556001600160a01b0382166000908152600d6020526040902060010154600c805460001981019190829081106143f457fe5b600091825260209091200154600c80546001600160a01b03909216918490811061441a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600d6000600c858154811061445a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600c80548061448d57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600d909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614515843385614b12565b50506005805461ff00191690555050565b600554600090610100900460ff1615614570576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546145a59083614d83565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206154ce833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a261468c614bdf565b6001600160a01b0383166000908152600d602052604090205460ff16156146e5576040805162461bcd60e51b81526020600482015260086024820152671254d7d093d5539160c21b604482015290519081900360640190fd5b6146ed614d35565b600c54600811614731576040805162461bcd60e51b815260206004820152600a6024820152694d41585f544f4b454e5360b01b604482015290519081900360640190fd5b604080516080810182526001808252600c805460208085019182526000858701818152606087018281526001600160a01b038c16808452600d9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790556147de83838361192f565b505050565b6002670de0b6b3a7640000611535565b600554600090610100900460ff161561483d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b61484682614974565b6001600160a01b0382166000908152600d6020526040902060020154600e5461114d9190614f1f565b600554600090610100900460ff16156148b9576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6148c282614974565b506001600160a01b03166000908152600d602052604090206003015490565b6000806148ee8588614f1f565b905060006148fc8786614a99565b9050600061490a8883614f1f565b905060006149188285615027565b905061492c81670de0b6b3a7640000614a99565b9050614940670de0b6b3a764000087614a99565b945061495561494f8c836149d0565b86614f1f565b9b9a5050505050505050505050565b600554600160b01b900460ff1690565b6001600160a01b0381166000908152600d602052604090205460ff166149cd576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b50565b60008282028315806149ea5750828482816149e757fe5b04145b614a2e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a81576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614aa88585615193565b915091508015614af3576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614b0582826151b8565b5050565b6149cd816151c3565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b6b57600080fd5b505af1158015614b7f573d6000803e3d6000fd5b505050506040513d6020811015614b9557600080fd5b5051905080614bd9576040805162461bcd60e51b815260206004820152600b60248201526a45524332305f46414c534560a81b604482015290519081900360640190fd5b50505050565b6005546201000090046001600160a01b03163314614c35576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2fa1a7a72a2927a62622a960911b604482015290519081900360640190fd5b565b6001600160a01b038316600090815260208190526040902054811115614c9b576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614cbe9082614a99565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614ced9082614d83565b6001600160a01b0380841660008181526020818152604091829020949094558051858152905191939287169260008051602061548e83398151915292918290030190a3505050565b600b54600160a01b900460ff1615614c35576040805162461bcd60e51b815260206004820152600c60248201526b1254d7d1925390531256915160a21b604482015290519081900360640190fd5b600082820183811015614dd0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6006546001600160a01b031615614f0c576006546040805163afff324960e01b815230600482015290516000926001600160a01b03169163afff3249916024808301926020929190829003018186803b158015614e8c57600080fd5b505afa158015614ea0573d6000803e3d6000fd5b505050506040513d6020811015614eb657600080fd5b50516002549091508190614eca9084614d83565b1115614f0a576040805162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b604482015290519081900360640190fd5b505b6149cd81615281565b614b0582826152e4565b600081614f62576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614f8a5750670de0b6b3a7640000848281614f8757fe5b04145b614fce576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561501c576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614a8e57fe5b60006001831015615077576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156150cd576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006150d8836152ef565b905060006150e68483614a99565b905060006150fc866150f78561530a565b615318565b90508161510d57925061114d915050565b600061511e87846305f5e10061536f565b905061512a82826149d0565b979650505050505050565b600b54604080516323b872dd60e01b81526001600160a01b03858116600483015292831660248201526044810184905290516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6000808284106151a957505080820360006151b1565b505081810360015b9250929050565b614b05823083614c37565b3060009081526020819052604090205481111561521e576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152389082614a99565b306000908152602081905260409020556002546152559082614a99565b600255604080518281529051600091309160008051602061548e8339815191529181900360200190a350565b3060009081526020819052604090205461529b9082614d83565b306000908152602081905260409020556002546152b89082614d83565b600255604080518281529051309160009160008051602061548e8339815191529181900360200190a350565b614b05308383614c37565b6000670de0b6b3a76400006153038361530a565b0292915050565b670de0b6b3a7640000900490565b6000806002830661533157670de0b6b3a7640000615333565b835b90506002830492505b8215614dd05761534c84856149d0565b935060028306156153645761536181856149d0565b90505b60028304925061533c565b600082818061538687670de0b6b3a7640000615193565b9092509050670de0b6b3a764000080600060015b88841061543e576000670de0b6b3a7640000820290506000806153ce8a6153c985670de0b6b3a7640000614a99565b615193565b915091506153e0876136dc848c6149d0565b96506153ec8784614f1f565b9650866153fb5750505061543e565b8715615405579315935b801561540f579315935b84156154265761541f8688614a99565b9550615433565b6154308688614d83565b95505b50505060010161539a565b5090999850505050505050505056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f364736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000016506f77657220496e64657820506f6f6c20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000045049505400000000000000000000000000000000000000000000000000000000Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103175760003560e01c806302c967481461031c57806306fdde0314610360578063095ea7b3146103dd57806309a3bbe41461041d5780630f7b1e3e146104255780631446a7ff1461045f57806315e84af91461048d57806318160ddd146104bb578063189d00ca146104c3578063218b5382146104cb5780632245a08e146104d357806323b872dd1461051e5780632f37b624146105545780633018205f1461057a578063313ce5671461059e57806334e19907146105bc5780633fdddaa2146105d9578063442e21521461060b57806346ab38f11461069857806349b59552146106ca5780634bb278f3146106e95780634f69c0d4146106f15780635c1bbaf7146107665780635db34277146107a157806366188463146107d35780636d06dfa0146107ff57806370a082311461083157806376c7a3c7146108575780637c5e9ea41461085f5780638201aa3f1461089f57806382f652ad146108df5780638656b6531461091a578063867378c514610955578063892980121461095d5780638c28cbe8146109985780638d4e4083146109be57806390ad688b146109c657806392eefe9b146109fd578063936c347714610a235780639381cd2b14610a2b578063948d8ce614610a3357806395d89b4114610a59578063992e2a9214610a61578063a221ee4914610a69578063a9059cbb14610a9e578063b02f0b7314610aca578063b0e0d13614610b3f578063b7b800a414610b47578063ba019dab14610b4f578063ba9530a614610b57578063bc063e1a14610b92578063bc694ea214610b9a578063be3bbd2e14610ba2578063c36596a6146104cb578063c4195cb814610bfa578063c61641cd14610c02578063cc77828d14610c28578063cd2ed8fb14610c30578063cf5e7bd314610c38578063d4cadf6814610c5e578063d73dd62314610c66578063dd62ed3e14610c92578063e4a28a521461041d578063e4e1e53814610cc0578063ec09302114610cf2578063f1b8a9b714610cfa578063f8b2cb4f14610d20578063f8d6aed414610d46578063fde924f714610d81575b600080fd5b61034e6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610d89565b60408051918252519081900360200190f35b610368611068565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a257818101518382015260200161038a565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610409600480360360408110156103f357600080fd5b506001600160a01b0381351690602001356110fe565b604080519115158252519081900360200190f35b61034e611153565b61045d6004803603608081101561043b57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611160565b005b61034e6004803603604081101561047557600080fd5b506001600160a01b038135811691602001351661136b565b61034e600480360360408110156104a357600080fd5b506001600160a01b0381358116916020013516611414565b61034e61151f565b61034e611525565b61034e611539565b610505600480360360608110156104e957600080fd5b50803590602081013590604001356001600160a01b0316611545565b6040805192835260208301919091528051918290030190f35b6104096004803603606081101561053457600080fd5b506001600160a01b03813581169160208101359091169060400135611624565b6104096004803603602081101561056a57600080fd5b50356001600160a01b031661177e565b61058261179c565b604080516001600160a01b039092168252519081900360200190f35b6105a66117fc565b6040805160ff9092168252519081900360200190f35b61045d600480360360208110156105d257600080fd5b5035611805565b61045d600480360360608110156105ef57600080fd5b506001600160a01b03813516906020810135906040013561192f565b61045d6004803603608081101561062157600080fd5b6001600160a01b03823516916001600160e01b031960208201351691810190606081016040820135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460018302840111600160201b8311171561068d57600080fd5b919350915035611bd9565b61034e600480360360608110156106ae57600080fd5b506001600160a01b038135169060208101359060400135611f81565b61045d600480360360208110156106e057600080fd5b503515156121f4565b61045d6122de565b61045d6004803603604081101561070757600080fd5b81359190810190604081016020820135600160201b81111561072857600080fd5b82018360208201111561073a57600080fd5b803590602001918460208302840111600160201b8311171561075b57600080fd5b509092509050612442565b61034e600480360360c081101561077c57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561275a565b61034e600480360360608110156107b757600080fd5b506001600160a01b038135169060208101359060400135612812565b610409600480360360408110156107e957600080fd5b506001600160a01b038135169060200135612a9d565b61034e6004803603606081101561081557600080fd5b506001600160a01b038135169060208101359060400135612b75565b61034e6004803603602081101561084757600080fd5b50356001600160a01b0316612e3b565b61034e612e56565b610505600480360360a081101561087557600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e68565b610505600480360360a08110156108b557600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561323b565b61034e600480360360c08110156108f557600080fd5b5080359060208101359060408101359060608101359060808101359060a001356135f0565b61034e600480360360c081101561093057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613696565b61034e613737565b61034e600480360360c081101561097357600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561374b565b61045d600480360360208110156109ae57600080fd5b50356001600160a01b03166137e6565b610409613942565b6109ce613952565b604080519485526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b61045d60048036036020811015610a1357600080fd5b50356001600160a01b03166139c7565b61034e613ab5565b61034e613b06565b61034e60048036036020811015610a4957600080fd5b50356001600160a01b0316613b13565b610368613b85565b61034e613be6565b61034e600480360360a0811015610a7f57600080fd5b5080359060208101359060408101359060608101359060800135613bf2565b61040960048036036040811015610ab457600080fd5b506001600160a01b038135169060200135613c57565b61045d60048036036040811015610ae057600080fd5b81359190810190604081016020820135600160201b811115610b0157600080fd5b820183602082011115610b1357600080fd5b803590602001918460208302840111600160201b83111715610b3457600080fd5b509092509050613c6d565b61034e613f86565b61034e613f8b565b61034e613f90565b61034e600480360360c0811015610b6d57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613f95565b61034e614016565b61034e614026565b610baa614032565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610be6578181015183820152602001610bce565b505050509050019250505060405180910390f35b610582614129565b61045d60048036036020811015610c1857600080fd5b50356001600160a01b0316614183565b610baa61426f565b61034e6142b9565b61045d60048036036020811015610c4e57600080fd5b50356001600160a01b03166142bf565b61034e614526565b61040960048036036040811015610c7c57600080fd5b506001600160a01b038135169060200135614577565b61034e60048036036040811015610ca857600080fd5b506001600160a01b03813581169160200135166145f8565b61045d60048036036060811015610cd657600080fd5b506001600160a01b038135169060208101359060400135614623565b61034e6147e3565b61034e60048036036020811015610d1057600080fd5b50356001600160a01b03166147f3565b61034e60048036036020811015610d3657600080fd5b50356001600160a01b031661486f565b61034e600480360360c0811015610d5c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356148e1565b610409614964565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e33576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16610e90576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b610e9984614974565b6001600160a01b0384166000908152600d60205260409020600390810154610ece91670de0b6b3a76400005b046001016149d0565b831115610f0e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b6001600160a01b0384166000908152600d60205260408120600a549091908190610f3a90879033611545565b91509150610f5a83600301548460020154600254600e548a6007546135f0565b935083610f9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115610fdc576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b610fea836003015487614a99565b60038401556040805183815290516001600160a01b0389169133916000805160206154ae8339815191529181900360200190a36110273385614afb565b61103084614b09565b61103b873384614b12565b600b546110539088906001600160a01b031683614b12565b5050506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206154ce833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611208576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561121f614bdf565b64e8d4a51000841080159061123c575067016345785d8a00008411155b61127a576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a510008310801590611297575067016345785d8a00008311155b6112d5576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a5100082108015906112f2575067016345785d8a00008211155b611330576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b600893909355600991909155600a55600b80546001600160a01b0319166001600160a01b039092169190911790556005805461ff0019169055565b600554600090610100900460ff16156113b5576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6113be83614974565b6113c782614974565b6001600160a01b038084166000908152600d6020526040808220928516825281206003808401546002808601549284015490840154939461140b9492939290613bf2565b95945050505050565b600554600090610100900460ff161561145e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090205460ff16801561149e57506001600160a01b0382166000908152600d602052604090205460ff165b6114db576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d602052604080822092851682529020600380830154600280850154928401549084015460075461140b94929190613bf2565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60065460009081906001600160a01b0316158015906115d9575060065460408051630a499ad360e01b81526001600160a01b03868116600483015291519190921691630a499ad3916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50515b156115e95750839050600061161c565b60006115fd670de0b6b3a764000086614a99565b905061160986826149d0565b925060006116178785614a99565b925050505b935093915050565b6000336001600160a01b038516148061166057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6116a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6116b4848484614c37565b336001600160a01b038516148015906116f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611774576001600160a01b03841660009081526001602090815260408083203384529091529020546117259083614a99565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206154ce8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600d602052604090205460ff1690565b600554600090610100900460ff16156117e6576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506005546201000090046001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ad576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556118c4614bdf565b64e8d4a5100081108015906118e1575067016345785d8a00008111155b61191f576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119d7576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556119ee614bdf565b6119f783614974565b6119ff614d35565b670de0b6b3a76400008110158015611a2057506802b5e3af16b18800008111155b611a61576040805162461bcd60e51b815260206004820152600d60248201526c5745494748545f424f554e445360981b604482015290519081900360640190fd5b620f4240821015611aa7576040805162461bcd60e51b815260206004820152600b60248201526a4d494e5f42414c414e434560a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090206002015480821115611b3a57611ae0600e54611adb8484614a99565b614d83565b600e8190556802b5e3af16b18800001015611b35576040805162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015290519081900360640190fd5b611b5b565b80821015611b5b57611b57600e54611b528385614a99565b614a99565b600e555b6001600160a01b0384166000908152600d602052604090206002810183905560030180549084905580841115611ba457611b9f8533611b9a8785614a99565b614dd7565b611bc7565b80841015611bc7576000611bb88286614a99565b9050611bc5863383614b12565b505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611c81576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556006546040805163ea3457b760e01b81526001600160a01b0388811660048301526001600160e01b0319881660248301529151919092169163ea3457b7916044808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b5051611d5c576040805162461bcd60e51b815260206004820152600f60248201526e4e4f545f414c4c4f5745445f53494760881b604482015290519081900360640190fd5b611d64614bdf565b60006060866001600160a01b03168387878760405160200180846001600160e01b03191681526004018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310611ddd5780518252601f199092019160209182019101611dbe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b509150915081611e89576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f5355434345535360a81b604482015290519081900360640190fd5b856001600160e01b031916821515886001600160a01b03167f32258dd51d74a04508615e0840c1fc905dff28c96b7335e69d9a41023ecd286e6000368660405180806020018060200183810383528686828181526020019250808284376000838201819052601f909101601f191690920185810384528651815286516020918201939188019250908190849084905b83811015611f30578181015183820152602001611f18565b50505050905090810190601f168015611f5d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450506005805461ff00191690555050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561202b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612088576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61209184614974565b6001600160a01b0384166000908152600d6020526040902060038101546002808301549054600e546007546120cb9493929190899061374b565b91508282101561210e576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600d6020526040902060039081015461213e91670de0b6b3a7640000610ec5565b82111561217e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b61218c816003015483614a99565b81600301819055506000806121a484600a5433611545565b91509150866001600160a01b0316336001600160a01b03166000805160206154ae833981519152846040518082815260200191505060405180910390a36121eb3387614afb565b61103086614b09565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561229c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556122b3614d35565b6122bb614bdf565b6005805461ff0019921515600160b01b0260ff60b01b1990911617919091169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612386576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561239d614bdf565b6123a5614d35565b600c54600211156123ea576040805162461bcd60e51b815260206004820152600a6024820152694d494e5f544f4b454e5360b01b604482015290519081900360640190fd5b600b805460ff60a01b1916600160a01b1790556005805460ff60b01b1916600160b01b17905561242268056bc75e2d63100000614e30565b6124353368056bc75e2d63100000614f15565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ea576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612547576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600061255161151f565b9050600061255f8583614f1f565b9050806125a1576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b60005b600c54811015612708576000600c82815481106125bd57fe5b60009182526020808320909101546001600160a01b0316808352600d9091526040822060030154909250906125f285836149d0565b905080612634576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87878581811061264057fe5b90506020020135811115612686576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d60205260409020600301546126ac9082614d83565b6001600160a01b0384166000818152600d602090815260409182902060030193909355805184815290519192339260008051602061544e8339815191529281900390910190a36126fd833383614dd7565b5050506001016125a4565b506000806127198760095433611545565b9150915061272687614e30565b6127303383614f15565b600b54612746906001600160a01b031682614f15565b50506005805461ff00191690555050505050565b6000806127678786614f1f565b905060006127758786614d83565b905060006127838289614f1f565b90506000612799670de0b6b3a764000085614f1f565b905060006127a78383615027565b905060006127b5828e6149d0565b905060006127c3828f614a99565b905060006127e26127dc670de0b6b3a76400008a614a99565b8b6149d0565b90506127ff826127fa670de0b6b3a764000084614a99565b614f1f565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156128bc576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612919576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61292284614974565b6001600160a01b0384166000908152600d6020526040902060030154612954906002670de0b6b3a76400005b046149d0565b831115612997576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b6000806129a78560095433611545565b915091506000600d6000886001600160a01b03166001600160a01b0316815260200190815260200160002090506129f081600301548260020154600254600e5487600754613696565b935084841015612a33576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b612a41816003015484614d83565b60038201556040805184815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612a7d84614e30565b612a873385614f15565b612a92873384615135565b611053873385614dd7565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612af2573360009081526001602090815260408083206001600160a01b0388168452909152812055612b21565b612afc8184614a99565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206154ce833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c1f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612c7c576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b612c8584614974565b6001600160a01b0384166000908152600d602052604081206009549091908190612cb190879033611545565b91509150612cd183600301548460020154600254600e548a60075461275a565b935083612d13576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115612d53576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0387166000908152600d6020526040902060030154612d83906002670de0b6b3a764000061294e565b841115612dc6576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b612dd4836003015485614d83565b60038401556040805185815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612e1086614e30565b612e1a3383614f15565b600b54612e30906001600160a01b031682614f15565b611053873386614dd7565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611535565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612f01576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055612f1987614974565b612f2285614974565b600554600160b01b900460ff16612f6d576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682529020600380820154612fa691670de0b6b3a7640000610ec5565b861115612fe6576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b60006130078360030154846002015484600301548560020154600754613bf2565b90508581111561304c576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b60008061305c8960085433611545565b9150915061308085600301548660020154866003015487600201548d6007546148e1565b96508a8711156130c2576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6130d0856003015488614d83565b85600301819055506130e684600301548a614a99565b600380860182905586015460028088015490870154600754613109949190613bf2565b955082861015801561312457506131208783614f1f565b8311155b613163576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b878611156131a6576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e8339815191528a86604051808381526020018281526020019250505060405180910390a46131fc8c3389614dd7565b6132078a3384614b12565b600b5461321f908b906001600160a01b031683614b12565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156132d4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556132ec87614974565b6132f585614974565b600554600160b01b900460ff16613340576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682528120600380840154600280860154928401549084015460075494959461338794929190613bf2565b9050858111156133cc576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b6000806133dc8b60085433611545565b915091506133fa85600301546002670de0b6b3a76400008161294e57fe5b82111561343d576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b61345d856003015486600201548660030154876002015486600754613f95565b9650888710156134a0576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6134ae856003015483614d83565b85600301819055506134c4846003015488614a99565b6003808601829055860154600280880154908701546007546134e7949190613bf2565b955082861015801561350257506134fe8288614f1f565b8311155b613541576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87861115613584576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e833981519152858b604051808381526020018281526020019250505060405180910390a46135da8c3383615135565b6135e58c3384614dd7565b61321f8a3389614b12565b6000806135fd8786614f1f565b90506000613613670de0b6b3a764000083614a99565b9050600061362182866149d0565b9050600061363b876127fa670de0b6b3a764000085614a99565b905060006136498c83614a99565b90506000613657828e614f1f565b905060006136658288615027565b90506000613673828e6149d0565b905060006136818e83614a99565b99505050505050505050509695505050505050565b6000806136a38786614f1f565b905060006136c26136bc670de0b6b3a764000084614a99565b856149d0565b905060006136e1866136dc670de0b6b3a764000085614a99565b6149d0565b905060006136ef8b83614d83565b905060006136fd828d614f1f565b9050600061370b8287615027565b90506000613719828d6149d0565b9050613725818d614a99565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611535565b6000806137588786614f1f565b905060006137668786614a99565b905060006137748289614f1f565b905060006137938261378e670de0b6b3a764000087614f1f565b615027565b905060006137a1828d6149d0565b905060006137af8d83614a99565b905060006137ce6137c8670de0b6b3a764000089614a99565b8a6149d0565b9050613725826136dc670de0b6b3a764000084614a99565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561388e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556138a681614974565b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156138ec57600080fd5b505afa158015613900573d6000803e3d6000fd5b505050506040513d602081101561391657600080fd5b50516001600160a01b039091166000908152600d60205260409020600301556005805461ff0019169055565b600b54600160a01b900460ff1690565b600080600080600560019054906101000a900460ff16156139a4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5050600854600954600a54600b54929591945092506001600160a01b0390911690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055613a86614bdf565b6005805461ff00196001600160a01b03909316620100000262010000600160b01b031990911617919091169055565b600554600090610100900460ff1615613aff576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b50600e5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613b5d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b613b6682614974565b506001600160a01b03166000908152600d602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b6704a03ce68d21555681565b600080613bff8787614f1f565b90506000613c0d8686614f1f565b90506000613c1b8383614f1f565b90506000613c3d670de0b6b3a76400006127fa670de0b6b3a764000089614a99565b9050613c4982826149d0565b9a9950505050505050505050565b6000613c64338484614c37565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d15576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16613d72576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600080613d8285600a5433611545565b915091506000613d9061151f565b90506000613d9e8483614f1f565b905080613de0576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b613dea3388614afb565b600b54613e00906001600160a01b031684614f15565b613e0984614b09565b60005b600c54811015613f71576000600c8281548110613e2557fe5b60009182526020808320909101546001600160a01b0316808352600d909152604082206003015490925090613e5a85836149d0565b905080613e9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b898985818110613ea857fe5b90506020020135811015613eef576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d6020526040902060030154613f159082614a99565b6001600160a01b0384166000818152600d60209081526040918290206003019390935580518481529051919233926000805160206154ae8339815191529281900390910190a3613f66833383614b12565b505050600101613e0c565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080613fa28786614f1f565b90506000613fb8670de0b6b3a764000085614a99565b9050613fc485826149d0565b90506000613fd68a6127fa8c85614d83565b90506000613fe48285615027565b90506000613ffa670de0b6b3a764000083614a99565b90506140068a826149d0565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611535565b671bc16d674ec7ffff81565b600554606090610100900460ff161561407c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600b54600160a01b900460ff166140ca576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600c8054806020026020016040519081016040528092919081815260200182805480156110f457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614102575050505050905090565b600554600090610100900460ff1615614173576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506006546001600160a01b031690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561422b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055614242614bdf565b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554606090610100900460ff16156140ca576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600c5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614367576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561437e614bdf565b61438781614974565b61438f614d35565b6001600160a01b0381166000908152600d602052604090206003810154600e5460029092015490916143c091614a99565b600e556001600160a01b0382166000908152600d6020526040902060010154600c805460001981019190829081106143f457fe5b600091825260209091200154600c80546001600160a01b03909216918490811061441a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600d6000600c858154811061445a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600c80548061448d57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600d909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614515843385614b12565b50506005805461ff00191690555050565b600554600090610100900460ff1615614570576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546145a59083614d83565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206154ce833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a261468c614bdf565b6001600160a01b0383166000908152600d602052604090205460ff16156146e5576040805162461bcd60e51b81526020600482015260086024820152671254d7d093d5539160c21b604482015290519081900360640190fd5b6146ed614d35565b600c54600811614731576040805162461bcd60e51b815260206004820152600a6024820152694d41585f544f4b454e5360b01b604482015290519081900360640190fd5b604080516080810182526001808252600c805460208085019182526000858701818152606087018281526001600160a01b038c16808452600d9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790556147de83838361192f565b505050565b6002670de0b6b3a7640000611535565b600554600090610100900460ff161561483d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b61484682614974565b6001600160a01b0382166000908152600d6020526040902060020154600e5461114d9190614f1f565b600554600090610100900460ff16156148b9576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6148c282614974565b506001600160a01b03166000908152600d602052604090206003015490565b6000806148ee8588614f1f565b905060006148fc8786614a99565b9050600061490a8883614f1f565b905060006149188285615027565b905061492c81670de0b6b3a7640000614a99565b9050614940670de0b6b3a764000087614a99565b945061495561494f8c836149d0565b86614f1f565b9b9a5050505050505050505050565b600554600160b01b900460ff1690565b6001600160a01b0381166000908152600d602052604090205460ff166149cd576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b50565b60008282028315806149ea5750828482816149e757fe5b04145b614a2e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a81576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614aa88585615193565b915091508015614af3576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614b0582826151b8565b5050565b6149cd816151c3565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b6b57600080fd5b505af1158015614b7f573d6000803e3d6000fd5b505050506040513d6020811015614b9557600080fd5b5051905080614bd9576040805162461bcd60e51b815260206004820152600b60248201526a45524332305f46414c534560a81b604482015290519081900360640190fd5b50505050565b6005546201000090046001600160a01b03163314614c35576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2fa1a7a72a2927a62622a960911b604482015290519081900360640190fd5b565b6001600160a01b038316600090815260208190526040902054811115614c9b576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614cbe9082614a99565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614ced9082614d83565b6001600160a01b0380841660008181526020818152604091829020949094558051858152905191939287169260008051602061548e83398151915292918290030190a3505050565b600b54600160a01b900460ff1615614c35576040805162461bcd60e51b815260206004820152600c60248201526b1254d7d1925390531256915160a21b604482015290519081900360640190fd5b600082820183811015614dd0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6006546001600160a01b031615614f0c576006546040805163afff324960e01b815230600482015290516000926001600160a01b03169163afff3249916024808301926020929190829003018186803b158015614e8c57600080fd5b505afa158015614ea0573d6000803e3d6000fd5b505050506040513d6020811015614eb657600080fd5b50516002549091508190614eca9084614d83565b1115614f0a576040805162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b604482015290519081900360640190fd5b505b6149cd81615281565b614b0582826152e4565b600081614f62576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614f8a5750670de0b6b3a7640000848281614f8757fe5b04145b614fce576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561501c576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614a8e57fe5b60006001831015615077576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156150cd576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006150d8836152ef565b905060006150e68483614a99565b905060006150fc866150f78561530a565b615318565b90508161510d57925061114d915050565b600061511e87846305f5e10061536f565b905061512a82826149d0565b979650505050505050565b600b54604080516323b872dd60e01b81526001600160a01b03858116600483015292831660248201526044810184905290516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6000808284106151a957505080820360006151b1565b505081810360015b9250929050565b614b05823083614c37565b3060009081526020819052604090205481111561521e576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152389082614a99565b306000908152602081905260409020556002546152559082614a99565b600255604080518281529051600091309160008051602061548e8339815191529181900360200190a350565b3060009081526020819052604090205461529b9082614d83565b306000908152602081905260409020556002546152b89082614d83565b600255604080518281529051309160009160008051602061548e8339815191529181900360200190a350565b614b05308383614c37565b6000670de0b6b3a76400006153038361530a565b0292915050565b670de0b6b3a7640000900490565b6000806002830661533157670de0b6b3a7640000615333565b835b90506002830492505b8215614dd05761534c84856149d0565b935060028306156153645761536181856149d0565b90505b60028304925061533c565b600082818061538687670de0b6b3a7640000615193565b9092509050670de0b6b3a764000080600060015b88841061543e576000670de0b6b3a7640000820290506000806153ce8a6153c985670de0b6b3a7640000614a99565b615193565b915091506153e0876136dc848c6149d0565b96506153ec8784614f1f565b9650866153fb5750505061543e565b8715615405579315935b801561540f579315935b84156154265761541f8688614a99565b9550615433565b6154308688614d83565b95505b50505060010161539a565b5090999850505050505050505056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000016506f77657220496e64657820506f6f6c20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000045049505400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Power Index Pool Token
Arg [1] : symbol (string): PIPT
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [3] : 506f77657220496e64657820506f6f6c20546f6b656e00000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5049505400000000000000000000000000000000000000000000000000000000Deployed Bytecode Sourcemap
27204:27627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50815:1500;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50815:1500:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9630:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10267:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10267:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1731:50;;;:::i;32191:742::-;;;;;;;;;;;;;;;;-1:-1:-1;32191:742:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32191:742:0;;:::i;:::-;;37912:433;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37912:433:0;;;;;;;;;;:::i;37450:454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37450:454:0;;;;;;;;;;:::i;10162:97::-;;;:::i;2030:54::-;;;:::i;1622:45::-;;;:::i;54205:623::-;;;;;;;;;;;;;;;;-1:-1:-1;54205:623:0;;;;;;;;;;;-1:-1:-1;;;;;54205:623:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11283:500;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11283:500:0;;;;;;;;;;;;;;;;;:::i;29818:123::-;;;;;;;;;;;;;;;;-1:-1:-1;29818:123:0;-1:-1:-1;;;;;29818:123:0;;:::i;31651:137::-;;;:::i;:::-;;;;-1:-1:-1;;;;;31651:137:0;;;;;;;;;;;;;;9816:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31954:229;;;;;;;;;;;;;;;;-1:-1:-1;31954:229:0;;:::i;35063:1275::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35063:1275:0;;;;;;;;;;;;;:::i;33881:503::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33881:503:0;;;;-1:-1:-1;;;;;;33881:503:0;;;;;;;;;;;;;;;;-1:-1:-1;;;33881:503:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33881:503:0;;;;;;;;;;;;-1:-1:-1;33881:503:0;-1:-1:-1;33881:503:0;;:::i;49353:1454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49353:1454:0;;;;;;;;;;;;;:::i;33309:189::-;;;;;;;;;;;;;;;;-1:-1:-1;33309:189:0;;;;:::i;33506:367::-;;;:::i;38353:1197::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38353:1197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38353:1197:0;;;;;;;;;;-1:-1:-1;38353:1197:0;;-1:-1:-1;38353:1197:0;-1:-1:-1;38353:1197:0;:::i;20571:1193::-;;;;;;;;;;;;;;;;-1:-1:-1;20571:1193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46413:1463::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46413:1463:0;;;;;;;;;;;;;:::i;10728:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10728:397:0;;;;;;;;:::i;47884:1461::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47884:1461:0;;;;;;;;;;;;;:::i;10043:111::-;;;;;;;;;;;;;;;;-1:-1:-1;10043:111:0;-1:-1:-1;;;;;10043:111:0;;:::i;1503:53::-;;;:::i;43709:2694::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43709:2694:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40776:2925::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40776:2925:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24972:1096::-;;;;;;;;;;;;;;;;-1:-1:-1;24972:1096:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18386:1167::-;;;;;;;;;;;;;;;;-1:-1:-1;18386:1167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1788:54::-;;;:::i;22883:1071::-;;;;;;;;;;;;;;;;-1:-1:-1;22883:1071:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37246:196::-;;;;;;;;;;;;;;;;-1:-1:-1;37246:196:0;-1:-1:-1;;;;;37246:196:0;;:::i;29699:111::-;;;:::i;31345:298::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31345:298:0;;;;;;;;;;;;;;33137:164;;;;;;;;;;;;;;;;-1:-1:-1;33137:164:0;-1:-1:-1;;;;;33137:164:0;;:::i;30635:148::-;;;:::i;1851:51::-;;;:::i;30430:197::-;;;;;;;;;;;;;;;;-1:-1:-1;30430:197:0;-1:-1:-1;;;;;30430:197:0;;:::i;9721:87::-;;;:::i;2149:59::-;;;:::i;13468:509::-;;;;;;;;;;;;;;;;-1:-1:-1;13468:509:0;;;;;;;;;;;;;;;;;;;;;;:::i;11133:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11133:142:0;;;;;;;;:::i;39558:1208::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39558:1208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39558:1208:0;;;;;;;;;;-1:-1:-1;39558:1208:0;;-1:-1:-1;39558:1208:0;-1:-1:-1;39558:1208:0;:::i;1452:42::-;;;:::i;1403:::-;;;:::i;1911:46::-;;;:::i;14995:683::-;;;;;;;;;;;;;;;;-1:-1:-1;14995:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1563:50::-;;;:::i;1964:59::-;;;:::i;30225:197::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31796:150;;;:::i;32941:188::-;;;;;;;;;;;;;;;;-1:-1:-1;32941:188:0;-1:-1:-1;;;;;32941:188:0;;:::i;30074:143::-;;;:::i;29949:117::-;;;:::i;36346:815::-;;;;;;;;;;;;;;;;-1:-1:-1;36346:815:0;-1:-1:-1;;;;;36346:815:0;;:::i;31209:128::-;;;:::i;10468:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10468:252:0;;;;;;;;:::i;9906:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9906:129:0;;;;;;;;;;:::i;34392:663::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34392:663:0;;;;;;;;;;;;;:::i;2093:49::-;;;:::i;30791:215::-;;;;;;;;;;;;;;;;-1:-1:-1;30791:215:0;-1:-1:-1;;;;;30791:215:0;;:::i;31014:187::-;;;;;;;;;;;;;;;;-1:-1:-1;31014:187:0;-1:-1:-1;;;;;31014:187:0;;:::i;16696:672::-;;;;;;;;;;;;;;;;-1:-1:-1;16696:672:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29578:113::-;;;:::i;50815:1500::-;50977:17;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;51020:10:::2;::::0;-1:-1:-1;;;51020:10:0;::::2;28430:13:::1;51020:10:::2;51012:36;;;::::0;;-1:-1:-1;;;51012:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51012:36:0;;;;;;;;;;;;;::::2;;51059:21;51071:8;51059:11;:21::i;:::-;-1:-1:-1::0;;;;;51122:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;51117:47:::2;::::0;1388:6:::2;2191:8;;2203:5;2190:18;51117:4;:47::i;:::-;51099:14;:65;;51091:87;;;::::0;;-1:-1:-1;;;51091:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51091:87:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;51218:18:0;::::2;51191:24;51218:18:::0;;;:8:::2;:18;::::0;;;;51375:17:::2;::::0;51218:18;;51191:24;;;51305:123:::2;::::0;51346:14;;51407:10:::2;51305:26;:123::i;:::-;51249:179;;;;51456:316;51511:9;:17;;;51559:9;:16;;;51606:12;;51649;;51692:14;51737:8;;51456:24;:316::i;:::-;51441:331:::0;-1:-1:-1;51793:17:0;51785:41:::2;;;::::0;;-1:-1:-1;;;51785:41:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51785:41:0;;;;;;;;;;;;;::::2;;51861:15;51845:12;:31;;51837:52;;;::::0;;-1:-1:-1;;;51837:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51837:52:0;;;;;;;;;;;;;::::2;;51922:39;51927:9;:17;;;51946:14;51922:4;:39::i;:::-;51902:17;::::0;::::2;:59:::0;51979:54:::2;::::0;;;;;;;-1:-1:-1;;;;;51979:54:0;::::2;::::0;51988:10:::2;::::0;-1:-1:-1;;;;;;;;;;;51979:54:0;;;;::::2;::::0;;::::2;52046:40;52061:10;52073:12;52046:14;:40::i;:::-;52097:28;52112:12;52097:14;:28::i;:::-;52136:61;52152:8;52162:10;52174:22;52136:15;:61::i;:::-;52234:21;::::0;52208:67:::2;::::0;52224:8;;-1:-1:-1;;;;;52234:21:0::2;52257:17:::0;52208:15:::2;:67::i;:::-;52288:19;;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;50815:1500;;-1:-1:-1;;;50815:1500:0:o;9630:83::-;9700:5;9693:12;;;;;;;;-1:-1:-1;;9693:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9667:13;;9693:12;;9700:5;;9693:12;;9700:5;9693:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9630:83;:::o;10267:193::-;10362:10;10334:4;10351:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10351:27:0;;;;;;;;;;;:33;;;10400:30;;;;;;;10334:4;;10351:27;;10362:10;;-1:-1:-1;;;;;;;;;;;10400:30:0;;;;;;;-1:-1:-1;10448:4:0;10267:193;;;;;:::o;1731:50::-;1772:9;1731:50;:::o;32191:742::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;32435:18:::2;:16;:18::i;:::-;1544:12:::0;32472:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32503:27;::::2;;32472:58;32464:81;;;::::0;;-1:-1:-1;;;32464:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32464:81:0;;;;;;;;;;;;;::::2;;1544:12:::0;32564:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32595:27;::::2;;32564:58;32556:81;;;::::0;;-1:-1:-1;;;32556:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32556:81:0;;;;;;;;;;;;;::::2;;1544:12:::0;32656:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32687:27;::::2;;32656:58;32648:81;;;::::0;;-1:-1:-1;;;32648:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32648:81:0;;;;;;;;;;;;;::::2;;32740:17;:36:::0;;;;32787:17:::2;:36:::0;;;;32834:17:::2;:36:::0;32881:21:::2;:44:::0;;-1:-1:-1;;;;;;32881:44:0::2;-1:-1:-1::0;;;;;32881:44:0;;::::2;::::0;;;::::2;::::0;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;32191:742::o;37912:433::-;28538:6;;38037:14;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;38069:20:::1;38081:7;38069:11;:20::i;:::-;38100:21;38112:8;38100:11;:21::i;:::-;-1:-1:-1::0;;;;;38158:17:0;;::::1;38132:23;38158:17:::0;;;:8:::1;:17;::::0;;;;;38213:18;;::::1;::::0;;;;38263:16:::1;::::0;;::::1;::::0;38281:15:::1;::::0;;::::1;::::0;38298:17;;::::1;::::0;38317:16;;::::1;::::0;38213:18;;38249:88:::1;::::0;38263:16;;38281:15;38317:16;38249:13:::1;:88::i;:::-;38242:95:::0;37912:433;-1:-1:-1;;;;;37912:433:0:o;37450:454::-;28538:6;;37568:14;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37608:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;:51:::0;::::1;;;-1:-1:-1::0;;;;;;37635:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37608:51;37600:73;;;::::0;;-1:-1:-1;;;37600:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37600:73:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37710:17:0;;::::1;37684:23;37710:17:::0;;;:8:::1;:17;::::0;;;;;37765:18;;::::1;::::0;;;;37815:16:::1;::::0;;::::1;::::0;37833:15:::1;::::0;;::::1;::::0;37850:17;;::::1;::::0;37869:16;;::::1;::::0;37887:8:::1;::::0;37801:95:::1;::::0;37833:15;37850:17;37869:16;37801:13:::1;:95::i;10162:97::-:0;10239:12;;10162:97;:::o;2030:54::-;2078:6;1388;2071:13;;2030:54;:::o;1622:45::-;1388:6;1622:45;:::o;54205:623::-;54448:13;;54371:26;;;;-1:-1:-1;;;;;54448:13:0;54440:36;;;;:76;;-1:-1:-1;54480:13:0;;:36;;;-1:-1:-1;;;54480:36:0;;-1:-1:-1;;;;;54480:36:0;;;;;;;;;:13;;;;;:26;;:36;;;;;;;;;;;;;;:13;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54480:36:0;54440:76;54436:134;;;-1:-1:-1;54541:13:0;;-1:-1:-1;54556:1:0;54533:25;;54436:134;54580:15;54598:24;1388:6;54609:12;54598:4;:24::i;:::-;54580:42;;54657:31;54662:13;54677:10;54657:4;:31::i;:::-;54633:55;;54699:19;54721:42;54726:13;54741:21;54721:4;:42::i;:::-;54699:64;-1:-1:-1;;;54205:623:0;;;;;;;:::o;11283:500::-;11368:4;11393:10;-1:-1:-1;;;;;11393:17:0;;;;:55;;-1:-1:-1;;;;;;11421:15:0;;;;;;:10;:15;;;;;;;;11437:10;11421:27;;;;;;;;11414:34;;;11393:55;11385:89;;;;;-1:-1:-1;;;11385:89:0;;;;;;;;;;;;-1:-1:-1;;;11385:89:0;;;;;;;;;;;;;;;11485:20;11491:3;11496;11501;11485:5;:20::i;:::-;11520:10;-1:-1:-1;;;;;11520:17:0;;;;;;:63;;-1:-1:-1;;;;;;11541:15:0;;;;;;:10;:15;;;;;;;;11557:10;11541:27;;;;;;;;-1:-1:-1;;11541:42:0;;11520:63;11516:238;;;-1:-1:-1;;;;;11635:15:0;;;;;;:10;:15;;;;;;;;11651:10;11635:27;;;;;;;;11630:38;;11664:3;11630:4;:38::i;:::-;-1:-1:-1;;;;;11600:15:0;;;;;;;:10;:15;;;;;;;;11616:10;11600:27;;;;;;;;;;:68;;;11688:54;;;;;;;;;;11616:10;;-1:-1:-1;;;;;;;;;;;11688:54:0;;;;;;;;;11516:238;-1:-1:-1;11771:4:0;11283:500;;;;;:::o;29818:123::-;-1:-1:-1;;;;;29916:11:0;29887:4;29916:11;;;:8;:11;;;;;:17;;;;29818:123::o;31651:137::-;28538:6;;31737:7;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31769:11:0::1;::::0;;;::::1;-1:-1:-1::0;;;;;31769:11:0::1;::::0;31651:137::o;9816:82::-;9881:9;;;;9816:82;:::o;31954:229::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;32054:18:::2;:16;:18::i;:::-;1544:12:::0;32091:18;::::2;::::0;::::2;::::0;:40:::2;;-1:-1:-1::0;1604:9:0;32113:18;::::2;;32091:40;32083:63;;;::::0;;-1:-1:-1;;;32083:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32083:63:0;;;;;;;;;;;;;::::2;;32157:8;:18:::0;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;31954:229::o;35063:1275::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;35187:18:::2;:16;:18::i;:::-;35216;35228:5;35216:11;:18::i;:::-;35245:17;:15;:17::i;:::-;1388:6;35283;:20;;:44;;;;-1:-1:-1::0;1715:9:0;35307:20;::::2;;35283:44;35275:70;;;::::0;;-1:-1:-1;;;35275:70:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35275:70:0;;;;;;;;;;;;;::::2;;1829:13:::0;35364:22;::::2;;35356:46;;;::::0;;-1:-1:-1;;;35356:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35356:46:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35478:15:0;::::2;35461:14;35478:15:::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;35515:18;;::::2;35511:300;;;35565:43;35570:12;;35584:23;35589:6;35597:9;35584:4;:23::i;:::-;35565:4;:43::i;:::-;35550:12;:58:::0;;;1772:9;-1:-1:-1;35631:32:0::2;35623:61;;;::::0;;-1:-1:-1;;;35623:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35623:61:0;;;;;;;;;;;;;::::2;;35511:300;;;35715:9;35706:6;:18;35702:109;;;35756:43;35761:12;;35775:23;35780:9;35791:6;35775:4;:23::i;:::-;35756:4;:43::i;:::-;35741:12;:58:::0;35702:109:::2;-1:-1:-1::0;;;;;35829:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;::::0;::::2;:31:::0;;;35954:23:::2;;::::0;;35988:33;;;;36036:20;;::::2;36032:299;;;36073:61;36089:5;36096:10;36108:25;36113:7;36122:10;36108:4;:25::i;:::-;36073:15;:61::i;:::-;36032:299;;;36166:10;36156:7;:20;36152:179;;;36193:26;36222:25;36227:10;36239:7;36222:4;:25::i;:::-;36193:54;;36262:57;36278:5;36285:10;36297:21;36262:15;:57::i;:::-;36152:179;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;35063:1275:0:o;33881:503::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;34042::::2;::::0;:57:::2;::::0;;-1:-1:-1;;;34042:57:0;;-1:-1:-1;;;;;34042:57:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;;;;;34042:57:0;::::2;::::0;;;;;;:13;;;::::2;::::0;:38:::2;::::0;:57;;;;;::::2;::::0;;;;;;;;:13;:57;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34042:57:0;34034:85:::2;;;::::0;;-1:-1:-1;;;34034:85:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34034:85:0;;;;;;;;;;;;;::::2;;34130:18;:16;:18::i;:::-;34162:12;34176:17;34197:6;-1:-1:-1::0;;;;;34197:11:0::2;34217:5;34242:9;34253:4;;34225:33;;;;;;-1:-1:-1::0;;;;;34225:33:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34197:62;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;34197:62:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34161:98;;;;34278:7;34270:31;;;::::0;;-1:-1:-1;;;34270:31:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34270:31:0;;;;;;;;;;;;;::::2;;34350:9;-1:-1:-1::0;;;;;34317:59:0::2;;34341:7;34317:59;;34333:6;-1:-1:-1::0;;;;;34317:59:0::2;;34361:8;;34371:4;34317:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;34317:59:0::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;-1:-1:-1;34317:59:0;;;;;;;::::2;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;33881:503:0:o;49353:1454::-;49507:19;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;49552:10:::2;::::0;-1:-1:-1;;;49552:10:0;::::2;28430:13:::1;49552:10:::2;49544:36;;;::::0;;-1:-1:-1;;;49544:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49544:36:0;;;;;;;;;;;;;::::2;;49591:21;49603:8;49591:11;:21::i;:::-;-1:-1:-1::0;;;;;49652:18:0;::::2;49625:24;49652:18:::0;;;:8:::2;:18;::::0;;;;49755:17:::2;::::0;::::2;::::0;49803:16:::2;::::0;;::::2;::::0;49850:12;;49893::::2;::::0;49979:8:::2;::::0;49700:314:::2;::::0;49755:17;49803:16;49850:12;49893;49936;;49700:24:::2;:314::i;:::-;49683:331;;50053:12;50035:14;:30;;50027:52;;;::::0;;-1:-1:-1;;;50027:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50027:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;50131:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;50126:47:::2;::::0;1388:6:::2;2191:8;::::0;50126:47:::2;50108:14;:65;;50100:87;;;::::0;;-1:-1:-1;;;50100:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50100:87:0;;;;;;;;;;;;;::::2;;50220:39;50225:9;:17;;;50244:14;50220:4;:39::i;:::-;50200:9;:17;;:59;;;;50273:27;50302:22:::0;50328:123:::2;50369:14;50398:17;;50430:10;50328:26;:123::i;:::-;50272:179;;;;50490:8;-1:-1:-1::0;;;;;50469:54:0::2;50478:10;-1:-1:-1::0;;;;;50469:54:0::2;-1:-1:-1::0;;;;;;;;;;;50500:22:0::2;50469:54;;;;;;;;;;;;;;;;;;50536:40;50551:10;50563:12;50536:14;:40::i;:::-;50587:28;50602:12;50587:14;:28::i;33309:189::-:0;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33412:17:::2;:15;:17::i;:::-;33440:18;:16;:18::i;:::-;33469:11;:21:::0;;-1:-1:-1;;33469:21:0;::::2;;-1:-1:-1::0;;;33469:21:0::2;-1:-1:-1::0;;;;33469:21:0;;::::2;;28466:14:::0;;;::::1;::::0;;33309:189::o;33506:367::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33592:18:::2;:16;:18::i;:::-;33621:17;:15;:17::i;:::-;33657:7;:14:::0;1444:1:::2;-1:-1:-1::0;33657:34:0::2;33649:57;;;::::0;;-1:-1:-1;;;33649:57:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33649:57:0;;;;;;;;;;;;;::::2;;33719:10;:17:::0;;-1:-1:-1;;;;33719:17:0::2;-1:-1:-1::0;;;33719:17:0::2;::::0;;33747:11:::2;:18:::0;;-1:-1:-1;;;;33747:18:0::2;-1:-1:-1::0;;;33747:18:0::2;::::0;;33778:32:::2;1892:10:::0;33778:14:::2;:32::i;:::-;33821:44;33836:10;1892::::0;33821:14:::2;:44::i;:::-;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;33506:367::o;38353:1197::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;38495:10:::2;::::0;-1:-1:-1;;;38495:10:0;::::2;28430:13:::1;38495:10:::2;38487:36;;;::::0;;-1:-1:-1;;;38487:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38487:36:0;;;;;;;;;;;;;::::2;;38536:14;38553:13;:11;:13::i;:::-;38536:30;;38577:10;38590:30;38595:13;38610:9;38590:4;:30::i;:::-;38577:43:::0;-1:-1:-1;38639:10:0;38631:34:::2;;;::::0;;-1:-1:-1;;;38631:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38631:34:0;;;;;;;;;;;;;::::2;;38683:6;38678:508;38699:7;:14:::0;38695:18;::::2;38678:508;;;38735:9;38747:7;38755:1;38747:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;38747:10:0::2;38783:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;38747:10;;-1:-1:-1;38783:19:0;38838:16:::2;38843:5:::0;38783:19;38838:4:::2;:16::i;:::-;38817:37:::0;-1:-1:-1;38877:18:0;38869:42:::2;;;::::0;;-1:-1:-1;;;38869:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38869:42:0;;;;;;;;;;;;;::::2;;38951:12;;38964:1;38951:15;;;;;;;;;;;;;38934:13;:32;;38926:53;;;::::0;;-1:-1:-1;;;38926:53:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38926:53:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;39021:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;39016:40:::2;::::0;39042:13;39016:4:::2;:40::i;:::-;-1:-1:-1::0;;;;;38994:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:62:::0;;;;39076:38;;;;;;;38994:11;;39085:10:::2;::::0;-1:-1:-1;;;;;;;;;;;39076:38:0;;;;;;;;::::2;39129:45;39145:1;39148:10;39160:13;39129:15;:45::i;:::-;-1:-1:-1::0;;;38715:3:0::2;;38678:508;;;;39199:26;39227:21:::0;39252:122:::2;39293:13;39321:17;;39353:10;39252:26;:122::i;:::-;39198:176;;;;39387:29;39402:13;39387:14;:29::i;:::-;39427:49;39442:10;39454:21;39427:14;:49::i;:::-;39502:21;::::0;39487:55:::2;::::0;-1:-1:-1;;;;;39502:21:0::2;39525:16:::0;39487:14:::2;:55::i;:::-;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;38353:1197:0:o;20571:1193::-;20815:18;20851:21;20875:32;20880:13;20895:11;20875:4;:32::i;:::-;20851:56;;20918:18;20939:31;20944:10;20956:13;20939:4;:31::i;:::-;20918:52;;20981:14;20998:31;21003:13;21018:10;20998:4;:31::i;:::-;20981:48;;21107:8;21118:28;1388:6;21129:16;21118:4;:28::i;:::-;21107:39;;21158:17;21178:20;21183:9;21194:3;21178:4;:20::i;:::-;21158:40;;21209:22;21234:34;21239:12;21253:14;21234:4;:34::i;:::-;21209:59;;21279:26;21308:39;21313:17;21332:14;21308:4;:39::i;:::-;21279:68;;21600:8;21611:43;21616:28;1388:6;21627:16;21616:4;:28::i;:::-;21646:7;21611:4;:43::i;:::-;21600:54;;21681:44;21686:21;21709:15;1388:6;21720:3;21709:4;:15::i;:::-;21681:4;:44::i;:::-;21665:60;20571:1193;-1:-1:-1;;;;;;;;;;;;;;;20571:1193:0:o;46413:1463::-;46573:18;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;46627:10:::2;::::0;-1:-1:-1;;;46627:10:0;::::2;28430:13:::1;46627:10:::2;46619:36;;;::::0;;-1:-1:-1;;;46619:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46619:36:0;;;;;;;;;;;;;::::2;;46666:20;46678:7;46666:11;:20::i;:::-;-1:-1:-1::0;;;;;46727:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;46722:45:::2;::::0;2141:1:::2;1388:6;2134:8;;46722:4;:45::i;:::-;46705:13;:62;;46697:87;;;::::0;;-1:-1:-1;;;46697:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46697:87:0;;;;;;;;;;;;;::::2;;46798:26;46826:21:::0;46851:122:::2;46892:13;46920:17;;46952:10;46851:26;:122::i;:::-;46797:176;;;;46986:23;47012:8;:17;47021:7;-1:-1:-1::0;;;;;47012:17:0::2;-1:-1:-1::0;;;;;47012:17:0::2;;;;;;;;;;;;46986:43;;47058:321;47113:8;:16;;;47160:8;:15;;;47206:12;;47249;;47292:21;47344:8;;47058:24;:321::i;:::-;47042:337;;47417:16;47400:13;:33;;47392:55;;;::::0;;-1:-1:-1;;;47392:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47392:55:0;;;;;;;;;;;;;::::2;;47479:45;47484:8;:16;;;47502:21;47479:4;:45::i;:::-;47460:16;::::0;::::2;:64:::0;47542:52:::2;::::0;;;;;;;-1:-1:-1;;;;;47542:52:0;::::2;::::0;47551:10:::2;::::0;-1:-1:-1;;;;;;;;;;;47542:52:0;;;;::::2;::::0;;::::2;47607:29;47622:13;47607:14;:29::i;:::-;47647:41;47662:10;47674:13;47647:14;:41::i;:::-;47699:66;47727:7;47736:10;47748:16;47699:27;:66::i;:::-;47776:59;47792:7;47801:10;47813:21;47776:15;:59::i;10728:397::-:0;10839:10;10795:4;10828:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10828:27:0;;;;;;;;;;10870:14;;;10866:160;;;10912:10;10931:1;10901:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10901:27:0;;;;;;;;;:31;10866:160;;;10995:19;11000:8;11010:3;10995:4;:19::i;:::-;10976:10;10965:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10965:27:0;;;;;;;;;:49;10866:160;11050:10;11067:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11041:54:0;;11067:27;;;;;;;;;;;11041:54;;;;;;;;;11050:10;-1:-1:-1;;;;;;;;;;;11041:54:0;;;;;;;;;;-1:-1:-1;11113:4:0;;10728:397;-1:-1:-1;;;10728:397:0:o;47884:1461::-;48038:18;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;48082:10:::2;::::0;-1:-1:-1;;;48082:10:0;::::2;28430:13:::1;48082:10:::2;48074:36;;;::::0;;-1:-1:-1;;;48074:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48074:36:0;;;;;;;;;;;;;::::2;;48121:20;48133:7;48121:11;:20::i;:::-;-1:-1:-1::0;;;;;48180:17:0;::::2;48154:23;48180:17:::0;;;:8:::2;:17;::::0;;;;48333::::2;::::0;48180;;48154:23;;;48264:122:::2;::::0;48305:13;;48365:10:::2;48264:26;:122::i;:::-;48210:176;;;;48415:313;48470:8;:16;;;48517:8;:15;;;48563:12;;48606;;48649:13;48693:8;;48415:24;:313::i;:::-;48399:329:::0;-1:-1:-1;48749:18:0;48741:42:::2;;;::::0;;-1:-1:-1;;;48741:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48741:42:0;;;;;;;;;;;;;::::2;;48819:11;48802:13;:28;;48794:49;;;::::0;;-1:-1:-1;;;48794:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48794:49:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48886:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;48881:45:::2;::::0;2141:1:::2;1388:6;2134:8;::::0;48881:45:::2;48864:13;:62;;48856:87;;;::::0;;-1:-1:-1;;;48856:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48856:87:0;;;;;;;;;;;;;::::2;;48975:37;48980:8;:16;;;48998:13;48975:4;:37::i;:::-;48956:16;::::0;::::2;:56:::0;49030:44:::2;::::0;;;;;;;-1:-1:-1;;;;;49030:44:0;::::2;::::0;49039:10:::2;::::0;-1:-1:-1;;;;;;;;;;;49030:44:0;;;;::::2;::::0;;::::2;49087:29;49102:13;49087:14;:29::i;:::-;49127:49;49142:10;49154:21;49127:14;:49::i;:::-;49202:21;::::0;49187:55:::2;::::0;-1:-1:-1;;;;;49202:21:0::2;49225:16:::0;49187:14:::2;:55::i;:::-;49253:51;49269:7;49278:10;49290:13;49253:15;:51::i;10043:111::-:0;-1:-1:-1;;;;;10132:14:0;10108:4;10132:14;;;;;;;;;;;;10043:111::o;1503:53::-;1551:5;1388:6;1544:12;;43709:2694;28296:39;;;;;;;28326:8;28296:39;;;;;;43947:18;;;;28314:10;;-1:-1:-1;;;;;;28305:7:0;;;;43947:18;;28296:39;;;;;43947:18;28326:8;;43947:18;28296:39;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;44004:20:::2;44016:7:::0;44004:11:::2;:20::i;:::-;44035:21;44047:8;44035:11;:21::i;:::-;44075:11;::::0;-1:-1:-1;;;44075:11:0;::::2;;;44067:34;;;::::0;;-1:-1:-1;;;44067:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44067:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;44140:26:0;;::::2;44114:23;44140:26:::0;;;:8:::2;:26;::::0;;;;;44204:27;;::::2;::::0;;;;44275:17:::2;::::0;;::::2;::::0;44270:38:::2;::::0;1388:6:::2;2191:8;::::0;44270:38:::2;44252:14;:56;;44244:78;;;::::0;;-1:-1:-1;;;44244:78:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44244:78:0;;;;;;;;;;;;;::::2;;44335:20;44358:315;44410:8;:16;;;44465:8;:15;;;44519:9;:17;;;44575:9;:16;;;44630:8;;44358:13;:315::i;:::-;44335:338;;44711:8;44692:15;:27;;44684:51;;;::::0;;-1:-1:-1;;;44684:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44684:51:0;;;;;;;;;;;;;::::2;;44749:27;44778:22:::0;44804:123:::2;44845:14;44874:17;;44906:10;44804:26;:123::i;:::-;44748:179;;;;44956:313;45001:8;:16;;;45048:8;:15;;;45094:9;:17;;;45142:9;:16;;;45189:14;45234:8;;44956:14;:313::i;:::-;44940:329;;45305:11;45288:13;:28;;45280:49;;;::::0;;-1:-1:-1;;;45280:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45280:49:0;;;;;;;;;;;;;::::2;;45361:37;45366:8;:16;;;45384:13;45361:4;:37::i;:::-;45342:8;:16;;:56;;;;45429:39;45434:9;:17;;;45453:14;45429:4;:39::i;:::-;45409:17;::::0;;::::2;:59:::0;;;45546:16;::::2;::::0;45597:15:::2;::::0;;::::2;::::0;45699:16;;::::2;::::0;45750:8:::2;::::0;45498:291:::2;::::0;45409:59;45699:16;45498:13:::2;:291::i;:::-;45481:308;;45840:15;45822:14;:33;;:112;;;;;45891:43;45896:13;45911:22;45891:4;:43::i;:::-;45872:15;:62;;45822:112;45800:173;;;::::0;;-1:-1:-1;;;45800:173:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45800:173:0;;;;;;;;;;;;;::::2;;46010:8;45992:14;:26;;45984:50;;;::::0;;-1:-1:-1;;;45984:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45984:50:0;;;;;;;;;;;;;::::2;;46082:8;-1:-1:-1::0;;;;;46052:78:0::2;46073:7;-1:-1:-1::0;;;;;46052:78:0::2;46061:10;-1:-1:-1::0;;;;;46052:78:0::2;-1:-1:-1::0;;;;;;;;;;;46092:13:0::2;46107:22;46052:78;;;;;;;;;;;;;;;;;;;;;;;;46143:51;46159:7;46168:10;46180:13;46143:15;:51::i;:::-;46205:61;46221:8;46231:10;46243:22;46205:15;:61::i;:::-;46303:21;::::0;46277:67:::2;::::0;46293:8;;-1:-1:-1;;;;;46303:21:0::2;46326:17:::0;46277:15:::2;:67::i;:::-;46357:38;;;;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;43709:2694;;;;-1:-1:-1;43709:2694:0;-1:-1:-1;;;;43709:2694:0:o;40776:2925::-;28296:39;;;;;;;28326:8;28296:39;;;;;;41012:19;;;;28314:10;;-1:-1:-1;;;;;;28305:7:0;;;;41012:19;;28296:39;;;;;41012:19;28326:8;;41012:19;28296:39;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;41070:20:::2;41082:7:::0;41070:11:::2;:20::i;:::-;41101:21;41113:8;41101:11;:21::i;:::-;41141:11;::::0;-1:-1:-1;;;41141:11:0;::::2;;;41133:34;;;::::0;;-1:-1:-1;;;41133:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41133:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;41206:26:0;;::::2;41180:23;41206:26:::0;;;:8:::2;:26;::::0;;;;;41270:27;;::::2;::::0;;;;41385:16:::2;::::0;;::::2;::::0;41440:15:::2;::::0;;::::2;::::0;41494:17;;::::2;::::0;41550:16;;::::2;::::0;41605:8:::2;::::0;41270:27;;41180:23;41333:315:::2;::::0;41440:15;41494:17;41550:16;41333:13:::2;:315::i;:::-;41310:338;;41686:8;41667:15;:27;;41659:51;;;::::0;;-1:-1:-1;;;41659:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41659:51:0;;;;;;;;;;;;;::::2;;41724:26;41752:21:::0;41777:330:::2;41870:13;41950:17;;42034:10;41777:26;:330::i;:::-;41723:384;;;;42153:36;42158:8;:16;;;2141:1;1388:6;2134:8;;;;42153:36;42128:21;:61;;42120:86;;;::::0;;-1:-1:-1;;;42120:86:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42120:86:0;;;;;;;;;;;;;::::2;;42236:320;42281:8;:16;;;42328:8;:15;;;42374:9;:17;;;42422:9;:16;;;42469:21;42521:8;;42236:14;:320::i;:::-;42219:337;;42593:12;42575:14;:30;;42567:52;;;::::0;;-1:-1:-1;;;42567:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42567:52:0;;;;;;;;;;;;;::::2;;42651:45;42656:8;:16;;;42674:21;42651:4;:45::i;:::-;42632:8;:16;;:64;;;;42727:39;42732:9;:17;;;42751:14;42727:4;:39::i;:::-;42707:17;::::0;;::::2;:59:::0;;;42844:16;::::2;::::0;42895:15:::2;::::0;;::::2;::::0;42997:16;;::::2;::::0;43048:8:::2;::::0;42796:291:::2;::::0;42707:59;42997:16;42796:13:::2;:291::i;:::-;42779:308;;43138:15;43120:14;:33;;:112;;;;;43189:43;43194:21;43217:14;43189:4;:43::i;:::-;43170:15;:62;;43120:112;43098:173;;;::::0;;-1:-1:-1;;;43098:173:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43098:173:0;;;;;;;;;;;;;::::2;;43308:8;43290:14;:26;;43282:50;;;::::0;;-1:-1:-1;;;43282:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43282:50:0;;;;;;;;;;;;;::::2;;43380:8;-1:-1:-1::0;;;;;43350:78:0::2;43371:7;-1:-1:-1::0;;;;;43350:78:0::2;43359:10;-1:-1:-1::0;;;;;43350:78:0::2;-1:-1:-1::0;;;;;;;;;;;43390:21:0::2;43413:14;43350:78;;;;;;;;;;;;;;;;;;;;;;;;43441:66;43469:7;43478:10;43490:16;43441:27;:66::i;:::-;43518:59;43534:7;43543:10;43555:21;43518:15;:59::i;:::-;43588:53;43604:8;43614:10;43626:14;43588:15;:53::i;24972:1096::-:0;25219:17;25310:21;25334:33;25339:14;25355:11;25334:4;:33::i;:::-;25310:57;;25450:8;25461:28;1388:6;25472:16;25461:4;:28::i;:::-;25450:39;;25500:8;25511:18;25516:3;25521:7;25511:4;:18::i;:::-;25500:29;;25541:32;25576:37;25581:14;25597:15;1388:6;25608:3;25597:4;:15::i;25576:37::-;25541:72;;25626:23;25652:50;25657:15;25674:27;25652:4;:50::i;:::-;25626:76;;25713:18;25734:41;25739:18;25759:15;25734:4;:41::i;:::-;25713:62;;25855:14;25872:37;25877:13;25892:16;25872:4;:37::i;:::-;25855:54;;25920:18;25941:27;25946:9;25957:10;25941:4;:27::i;:::-;25920:48;;25979:17;25999:31;26004:10;26016:13;25999:4;:31::i;:::-;25979:51;-1:-1:-1;;;;;;;;;;24972:1096:0;;;;;;;;:::o;18386:1167::-;18630:18;18914:21;18938:32;18943:13;18958:11;18938:4;:32::i;:::-;18914:56;;18981:8;18992:43;18997:28;1388:6;19008:16;18997:4;:28::i;:::-;19027:7;18992:4;:43::i;:::-;18981:54;;19047:26;19076:36;19081:13;19096:15;1388:6;19107:3;19096:4;:15::i;:::-;19076:4;:36::i;:::-;19047:65;;19125:22;19150:43;19155:14;19171:21;19150:4;:43::i;:::-;19125:68;;19204:17;19224:39;19229:17;19248:14;19224:4;:39::i;:::-;19204:59;;19344:14;19361:36;19366:12;19380:16;19361:4;:36::i;:::-;19344:53;;19408:18;19429:27;19434:9;19445:10;19429:4;:27::i;:::-;19408:48;;19483:31;19488:13;19503:10;19483:4;:31::i;:::-;19467:47;18386:1167;-1:-1:-1;;;;;;;;;;;;;;18386:1167:0:o;1788:54::-;1836:6;1388;1829:13;;22883:1071;23128:19;23165:21;23189:33;23194:14;23210:11;23189:4;:33::i;:::-;23165:57;;23233:18;23254:30;23259:10;23271:12;23254:4;:30::i;:::-;23233:51;;23295:14;23312:31;23317:13;23332:10;23312:4;:31::i;:::-;23295:48;;23416:18;23437:45;23442:9;23453:28;1388:6;23464:16;23453:4;:28::i;:::-;23437:4;:45::i;:::-;23416:66;;23493:23;23519:36;23524:13;23539:15;23519:4;:36::i;:::-;23493:62;;23568:32;23603:41;23608:15;23625:18;23603:4;:41::i;:::-;23568:76;;23781:8;23792:43;23797:28;1388:6;23808:16;23797:4;:28::i;:::-;23827:7;23792:4;:43::i;:::-;23781:54;;23864:50;23869:27;23898:15;1388:6;23909:3;23898:4;:15::i;37246:196::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;37341:18:::2;37353:5:::0;37341:11:::2;:18::i;:::-;37396:38;::::0;;-1:-1:-1;;;37396:38:0;;37428:4:::2;37396:38;::::0;::::2;::::0;;;-1:-1:-1;;;;;37396:23:0;::::2;::::0;::::2;::::0;:38;;;;;::::2;::::0;;;;;;;;:23;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37396:38:0;-1:-1:-1;;;;;37370:15:0;;::::2;;::::0;;;:8:::2;37396:38;37370:15:::0;;;;:23:::2;;:64:::0;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;37246:196::o;29699:111::-;29792:10;;-1:-1:-1;;;29792:10:0;;;;;29699:111::o;31345:298::-;31433:21;31456;31479;31502:28;28538:6;;;;;;;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;;31556:17:0::1;::::0;31575::::1;::::0;31594::::1;::::0;31613:21:::1;::::0;31556:17;;31575;;-1:-1:-1;31594:17:0;-1:-1:-1;;;;;;31613:21:0;;::::1;::::0;31345:298::o;33137:164::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33243:18:::2;:16;:18::i;:::-;33272:11;:21:::0;;-1:-1:-1;;;;;;;33272:21:0;;::::2;::::0;::::2;-1:-1:-1::0;;;;;;33272:21:0;;::::2;;28466:14:::0;;;::::1;::::0;;33137:164::o;30635:148::-;28538:6;;30734:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;30763:12:0::1;::::0;30635:148;:::o;1851:51::-;1892:10;1851:51;:::o;30430:197::-;28538:6;;30537:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30561:18:::1;30573:5;30561:11;:18::i;:::-;-1:-1:-1::0;;;;;;30597:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;30430:197::o;9721:87::-;9793:7;9786:14;;;;;;;;-1:-1:-1;;9786:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9760:13;;9786:14;;9793:7;;9786:14;;9793:7;9786:14;;;;;;;;;;;;;;;;;;;;;;;;2149:59;2190:18;2149:59;:::o;13468:509::-;13680:14;13712:10;13725:35;13730:14;13746:13;13725:4;:35::i;:::-;13712:48;;13771:10;13784:37;13789:15;13806:14;13784:4;:37::i;:::-;13771:50;;13832:10;13845:18;13850:5;13857;13845:4;:18::i;:::-;13832:31;;13874:10;13887:31;1388:6;13898:19;1388:6;13909:7;13898:4;:19::i;13887:31::-;13874:44;;13950:18;13955:5;13962;13950:4;:18::i;:::-;13938:30;13468:509;-1:-1:-1;;;;;;;;;;13468:509:0:o;11133:142::-;11201:4;11218:27;11224:10;11236:3;11241;11218:5;:27::i;:::-;-1:-1:-1;11263:4:0;11133:142;;;;:::o;39558:1208::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;39700:10:::2;::::0;-1:-1:-1;;;39700:10:0;::::2;28430:13:::1;39700:10:::2;39692:36;;;::::0;;-1:-1:-1;;;39692:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39692:36:0;;;;;;;;;;;;;::::2;;39742:25;39769:20:::0;39793:121:::2;39834:12;39861:17;;39893:10;39793:26;:121::i;:::-;39741:173;;;;39927:14;39944:13;:11;:13::i;:::-;39927:30;;39968:10;39981:37;39986:20;40008:9;39981:4;:37::i;:::-;39968:50:::0;-1:-1:-1;40037:10:0;40029:34:::2;;;::::0;;-1:-1:-1;;;40029:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40029:34:0;;;;;;;;;;;;;::::2;;40076:40;40091:10;40103:12;40076:14;:40::i;:::-;40142:21;::::0;40127:54:::2;::::0;-1:-1:-1;;;;;40142:21:0::2;40165:15:::0;40127:14:::2;:54::i;:::-;40192:36;40207:20;40192:14;:36::i;:::-;40246:6;40241:516;40262:7;:14:::0;40258:18;::::2;40241:516;;;40298:9;40310:7;40318:1;40310:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;40310:10:0::2;40346:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;40310:10;;-1:-1:-1;40346:19:0;40402:16:::2;40407:5:::0;40346:19;40402:4:::2;:16::i;:::-;40380:38:::0;-1:-1:-1;40441:19:0;40433:43:::2;;;::::0;;-1:-1:-1;;;40433:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40433:43:0;;;;;;;;;;;;;::::2;;40517:13;;40531:1;40517:16;;;;;;;;;;;;;40499:14;:34;;40491:56;;;::::0;;-1:-1:-1;;;40491:56:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40491:56:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40589:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;40584:41:::2;::::0;40610:14;40584:4:::2;:41::i;:::-;-1:-1:-1::0;;;;;40562:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:63:::0;;;;40645:39;;;;;;;40562:11;;40654:10:::2;::::0;-1:-1:-1;;;;;;;;;;;40645:39:0;;;;;;;;::::2;40699:46;40715:1;40718:10;40730:14;40699:15;:46::i;:::-;-1:-1:-1::0;;;40278:3:0::2;;40241:516;;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;;39558:1208:0:o;1452:42::-;1493:1;1452:42;:::o;1403:::-;1444:1;1403:42;:::o;1911:46::-;1952:5;1911:46;:::o;14995:683::-;15237:19;15274:16;15293:35;15298:13;15313:14;15293:4;:35::i;:::-;15274:54;;15339:15;15357:19;1388:6;15368:7;15357:4;:19::i;:::-;15339:37;;15400:31;15405:13;15420:10;15400:4;:31::i;:::-;15387:44;;15442:6;15451:54;15456:14;15472:32;15477:14;15493:10;15472:4;:32::i;15451:54::-;15442:63;;15516:8;15527:20;15532:1;15535:11;15527:4;:20::i;:::-;15516:31;;15558:8;15569:15;1388:6;15580:3;15569:4;:15::i;:::-;15558:26;;15612;15617:15;15634:3;15612:4;:26::i;:::-;15595:43;14995:683;-1:-1:-1;;;;;;;;;;;;14995:683:0:o;1563:50::-;1611:2;1388:6;1604:9;;1964:59;2005:18;1964:59;:::o;30225:197::-;28538:6;;30312:23;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30361:10:::1;::::0;-1:-1:-1;;;30361:10:0;::::1;;;30353:36;;;::::0;;-1:-1:-1;;;30353:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30353:36:0;;;;;;;;;;;;;::::1;;30407:7;30400:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30400:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30225:197:::0;:::o;31796:150::-;28538:6;;31884:7;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31924:13:0::1;::::0;-1:-1:-1;;;;;31924:13:0::1;31796:150:::0;:::o;32941:188::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33064:18:::2;:16;:18::i;:::-;33093:13;:28:::0;;-1:-1:-1;;;;;;33093:28:0::2;-1:-1:-1::0;;;;;33093:28:0;;;::::2;::::0;;;::::2;::::0;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;32941:188::o;30074:143::-;28538:6;;30154:23;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;29949:117;30044:7;:14;29949:117;:::o;36346:815::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;36445:18:::2;:16;:18::i;:::-;36474;36486:5;36474:11;:18::i;:::-;36503:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;36553:15:0;::::2;36533:17;36553:15:::0;;;:8:::2;:15;::::0;;;;:23:::2;::::0;::::2;::::0;36609:12:::2;::::0;36623:22:::2;::::0;;::::2;::::0;36553:23;;36604:42:::2;::::0;:4:::2;:42::i;:::-;36589:12;:57:::0;-1:-1:-1;;;;;36769:15:0;::::2;36756:10;36769:15:::0;;;:8:::2;:15;::::0;;;;:21:::2;;::::0;36813:7:::2;:14:::0;;-1:-1:-1;;36813:18:0;;;:7;:18;;36859:13;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;36842:7:::2;:14:::0;;-1:-1:-1;;;;;36859:13:0;;::::2;::::0;36850:5;;36842:14;::::2;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;36842:30:0::2;;;;;-1:-1:-1::0;;;;;36842:30:0::2;;;;;;36916:5;36883:8;:24;36892:7;36900:5;36892:14;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;36892:14:0::2;36883:24:::0;;;::::2;::::0;;;;;;;;36892:14;36883:30:::2;:38:::0;36932:7:::2;:13:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;-1:-1:-1;;36932:13:0;;;;;;;-1:-1:-1;;;;;;36932:13:0::2;::::0;;;;;;;;36974:118:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36956:15:0;::::2;::::0;;:8:::2;:15:::0;;;;;;;:136;;;;-1:-1:-1;;36956:136:0::2;::::0;::::2;;;::::0;;;;-1:-1:-1;36956:136:0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;37105:48:::2;36956:15:::0;37128:10:::2;37140:12:::0;37105:15:::2;:48::i;:::-;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;36346:815:0:o;31209:128::-;28538:6;;31292:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31321:8:0::1;::::0;31209:128;:::o;10468:252::-;10598:10;10535:4;10587:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10587:27:0;;;;;;;;;;10582:38;;10616:3;10582:4;:38::i;:::-;10563:10;10552:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10552:27:0;;;;;;;;;;;;:68;;;10636:54;;;;;;10552:27;;-1:-1:-1;;;;;;;;;;;10636:54:0;;;;;;;;;;-1:-1:-1;10708:4:0;10468:252;;;;:::o;9906:129::-;-1:-1:-1;;;;;10007:15:0;;;9983:4;10007:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;9906:129::o;34392:663::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;34578:18:::1;:16;:18::i;:::-;-1:-1:-1::0;;;;;34616:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;34615:22;34607:43;;;::::0;;-1:-1:-1;;;34607:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34607:43:0;;;;;;;;;;;;;::::1;;34661:17;:15;:17::i;:::-;34699:7;:14:::0;1493:1:::1;-1:-1:-1::0;34691:56:0::1;;;::::0;;-1:-1:-1;;;34691:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34691:56:0;;;;;;;;;;;;;::::1;;34778:198;::::0;;::::1;::::0;::::1;::::0;;34807:4:::1;34778:198:::0;;;34833:7:::1;:14:::0;;34778:198:::1;::::0;;::::1;::::0;;;-1:-1:-1;34778:198:0;;;;;;;;;;;;-1:-1:-1;;;;;34760:15:0;::::1;::::0;;;:8:::1;:15:::0;;;;;;:216;;;;-1:-1:-1;;34760:216:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;34987:19;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;34987:19:0::1;::::0;;::::1;::::0;;35017:30:::1;34760:15:::0;35031:7;35040:6;35017::::1;:30::i;:::-;34392:663:::0;;;:::o;2093:49::-;2141:1;1388:6;2134:8;;30791:215;28538:6;;30896:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30920:18:::1;30932:5;30920:11;:18::i;:::-;-1:-1:-1::0;;;;;30961:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;30985:12:::1;::::0;30956:42:::1;::::0;30961:22;30956:4:::1;:42::i;31014:187::-:0;28538:6;;31110:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;31134:18:::1;31146:5;31134:11;:18::i;:::-;-1:-1:-1::0;;;;;;31170:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31014:187::o;16696:672::-;16939:18;16975:16;16994:35;16999:14;17015:13;16994:4;:35::i;:::-;16975:54;;17040:9;17052:37;17057:15;17074:14;17052:4;:37::i;:::-;17040:49;;17100:6;17109:27;17114:15;17131:4;17109;:27::i;:::-;17100:36;;17147:8;17158:20;17163:1;17166:11;17158:4;:20::i;:::-;17147:31;;17195:15;17200:3;1388:6;17195:4;:15::i;:::-;17189:21;;17237:19;1388:6;17248:7;17237:4;:19::i;:::-;17221:35;;17283:46;17288:25;17293:14;17309:3;17288:4;:25::i;:::-;17315:13;17283:4;:46::i;:::-;17267:62;16696:672;-1:-1:-1;;;;;;;;;;;16696:672:0:o;29578:113::-;29672:11;;-1:-1:-1;;;29672:11:0;;;;;29578:113::o;53818:126::-;-1:-1:-1;;;;;53901:15:0;;;;;;:8;:15;;;;;:21;;;53893:43;;;;;-1:-1:-1;;;53893:43:0;;;;;;;;;;;;-1:-1:-1;;;53893:43:0;;;;;;;;;;;;;;;53818:126;:::o;3849:311::-;3920:4;3952:5;;;3976:6;;;:21;;;3996:1;3991;3986:2;:6;;;;;;:11;3976:21;3968:50;;;;;-1:-1:-1;;;3968:50:0;;;;;;;;;;;;-1:-1:-1;;;3968:50:0;;;;;;;;;;;;;;;4045:8;4039:15;;4073:8;;;;4065:37;;;;;-1:-1:-1;;;4065:37:0;;;;;;;;;;;;-1:-1:-1;;;4065:37:0;;;;;;;;;;;;;;;4113:7;1388:6;4123:2;:9;;;3849:311;-1:-1:-1;;;;;;3849:311:0:o;3408:202::-;3479:4;3502:6;3510:9;3523:14;3532:1;3535;3523:8;:14::i;:::-;3501:36;;;;3557:4;3556:5;3548:35;;;;;-1:-1:-1;;;3548:35:0;;;;;;;;;;;;-1:-1:-1;;;3548:35:0;;;;;;;;;;;;;;;-1:-1:-1;3601:1:0;3408:202;-1:-1:-1;;;3408:202:0:o;53154:112::-;53239:19;53245:4;53251:6;53239:5;:19::i;:::-;53154:112;;:::o;53718:92::-;53789:13;53795:6;53789:5;:13::i;52711:192::-;52810:9;52829:5;-1:-1:-1;;;;;52822:22:0;;52845:2;52849:6;52822:34;;;;;;;;;;;;;-1:-1:-1;;;;;52822:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52822:34:0;;-1:-1:-1;52822:34:0;52867:28;;;;;-1:-1:-1;;;52867:28:0;;;;;;;;;;;;-1:-1:-1;;;52867:28:0;;;;;;;;;;;;;;;52711:192;;;;:::o;53952:127::-;54041:11;;;;;-1:-1:-1;;;;;54041:11:0;54027:10;:25;54019:52;;;;;-1:-1:-1;;;54019:52:0;;;;;;;;;;;;-1:-1:-1;;;54019:52:0;;;;;;;;;;;;;;;53952:127::o;8996:273::-;-1:-1:-1;;;;;9075:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;9075:20:0;9067:53;;;;;-1:-1:-1;;;9067:53:0;;;;;;;;;;;;-1:-1:-1;;;9067:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9152:13:0;;:8;:13;;;;;;;;;;;9147:24;;9167:3;9147:4;:24::i;:::-;-1:-1:-1;;;;;9131:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9203:13;;;;;;;9198:24;;9218:3;9198:4;:24::i;:::-;-1:-1:-1;;;;;9182:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9238:23;;;;;;;9182:13;;9238:23;;;;-1:-1:-1;;;;;;;;;;;9238:23:0;;;;;;;;8996:273;;;:::o;54087:110::-;54162:10;;-1:-1:-1;;;54162:10:0;;;;54161:11;54153:36;;;;;-1:-1:-1;;;54153:36:0;;;;;;;;;;;;-1:-1:-1;;;54153:36:0;;;;;;;;;;;;;;3220:180;3291:4;3322:5;;;3346:6;;;;3338:35;;;;;-1:-1:-1;;;3338:35:0;;;;;;;;;;;;-1:-1:-1;;;3338:35:0;;;;;;;;;;;;;;;3391:1;3220:180;-1:-1:-1;;;3220:180:0:o;52488:215::-;52601:55;;;-1:-1:-1;;;52601:55:0;;-1:-1:-1;;;;;52601:55:0;;;;;;;52642:4;52601:55;;;;;;;;;;;;52589:9;;52601:26;;;;;:55;;;;;;;;;;;;;;52589:9;52601:26;:55;;;;;;;;;;53390:320;53472:13;;-1:-1:-1;;;;;53472:13:0;53464:36;53461:218;;53539:13;;:46;;;-1:-1:-1;;;53539:46:0;;53579:4;53539:46;;;;;;53517:19;;-1:-1:-1;;;;;53539:13:0;;:31;;:46;;;;;;;;;;;;;;:13;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53539:46:0;53613:12;;53539:46;;-1:-1:-1;53539:46:0;;53608:26;;53627:6;53608:4;:26::i;:::-;:44;;53600:67;;;;;-1:-1:-1;;;53600:67:0;;;;;;;;;;;;-1:-1:-1;;;53600:67:0;;;;;;;;;;;;;;;53461:218;;53689:13;53695:6;53689:5;:13::i;53274:108::-;53357:17;53363:2;53367:6;53357:5;:17::i;4168:387::-;4239:4;4269:6;4261:31;;;;;-1:-1:-1;;;4261:31:0;;;;;;;;;;;;-1:-1:-1;;;4261:31:0;;;;;;;;;;;;;;;1388:6;4313:8;;4340:6;;;:24;;;1388:6;4355:1;4350:2;:6;;;;;;:14;4340:24;4332:53;;;;;-1:-1:-1;;;4332:53:0;;;;;;;;;;;;-1:-1:-1;;;4332:53:0;;;;;;;;;;;;;;;4433:1;4429:5;;4423:12;;4454:8;;;;4446:37;;;;;-1:-1:-1;;;4446:37:0;;;;;;;;;;;;-1:-1:-1;;;4446:37:0;;;;;;;;;;;;;;;4511:7;4526:1;4521:2;:6;;;;5058:555;5134:4;1952:5;5164:4;:21;;5156:55;;;;;-1:-1:-1;;;5156:55:0;;;;;;;;;;;;-1:-1:-1;;;5156:55:0;;;;;;;;;;;;;;;2005:18;5230:21;;;5222:56;;;;;-1:-1:-1;;;5222:56:0;;;;;;;;;;;;-1:-1:-1;;;5222:56:0;;;;;;;;;;;;;;;5291:10;5305:11;5312:3;5305:6;:11::i;:::-;5291:25;;5330:11;5344:16;5349:3;5354:5;5344:4;:16::i;:::-;5330:30;;5373:13;5389:24;5395:4;5401:11;5406:5;5401:4;:11::i;:::-;5389:5;:24::i;:::-;5373:40;-1:-1:-1;5430:11:0;5426:59;;5465:8;-1:-1:-1;5458:15:0;;-1:-1:-1;;5458:15:0;5426:59;5497:18;5518:40;5529:4;5535:6;2071:13;5518:10;:40::i;:::-;5497:61;;5576:29;5581:8;5591:13;5576:4;:29::i;:::-;5569:36;5058:555;-1:-1:-1;;;;;;;5058:555:0:o;52911:235::-;53069:21;;53036:63;;;-1:-1:-1;;;53036:63:0;;-1:-1:-1;;;;;53036:63:0;;;;;;;53069:21;;;53036:63;;;;;;;;;;;;53024:9;;53036:26;;;;;:63;;;;;;;;;;;;;;53024:9;53036:26;:63;;;;;;;;;;3618:223;3693:4;3699;3730:1;3725;:6;3721:113;;-1:-1:-1;;3756:5:0;;;3763;3748:21;;3721:113;-1:-1:-1;;3810:5:0;;;3817:4;3721:113;3618:223;;;;;:::o;9379:98::-;9438:31;9444:4;9458;9465:3;9438:5;:31::i;8696:292::-;8766:4;8749:8;:23;;;;;;;;;;;:30;-1:-1:-1;8749:30:0;8741:63;;;;;-1:-1:-1;;;8741:63:0;;;;;;;;;;;;-1:-1:-1;;;8741:63:0;;;;;;;;;;;;;;;8863:4;8846:8;:23;;;;;;;;;;;8841:34;;8871:3;8841:4;:34::i;:::-;8832:4;8815:8;:23;;;;;;;;;;:60;8906:12;;8901:23;;8920:3;8901:4;:23::i;:::-;8886:12;:38;8940:40;;;;;;;;8972:1;;8957:4;;-1:-1:-1;;;;;;;;;;;8940:40:0;;;;;;;;8696:292;:::o;8470:218::-;8563:4;8546:8;:23;;;;;;;;;;;8541:34;;8571:3;8541:4;:34::i;:::-;8532:4;8515:8;:23;;;;;;;;;;:60;8606:12;;8601:23;;8620:3;8601:4;:23::i;:::-;8586:12;:38;8640:40;;;;;;;;8669:4;;8657:1;;-1:-1:-1;;;;;;;;;;;8640:40:0;;;;;;;;8470:218;:::o;9277:94::-;9334:29;9348:4;9355:2;9359:3;9334:5;:29::i;3096:116::-;3161:4;1388:6;3190:7;3195:1;3190:4;:7::i;:::-;:14;;3096:116;-1:-1:-1;;3096:116:0:o;2979:109::-;1388:6;3072:8;;;2979:109::o;4583:314::-;4655:4;;4690:1;4686;:5;:21;;1388:6;4686:21;;;4699:1;4686:21;4677:30;-1:-1:-1;4730:1:0;4725:6;;;;4720:151;4733:6;;4720:151;;4768:10;4773:1;4776;4768:4;:10::i;:::-;4764:14;-1:-1:-1;4803:1:0;4799;:5;:10;4795:65;;4834:10;4839:1;4842;4834:4;:10::i;:::-;4830:14;;4795:65;4746:1;4741:6;;;;4720:151;;5621:1080;5719:4;5774:3;5719:4;;5811:20;5820:4;1388:6;5811:8;:20::i;:::-;5788:43;;-1:-1:-1;5788:43:0;-1:-1:-1;1388:6:0;;5842:9;6176:1;6162:509;6187:9;6179:4;:17;6162:509;;6218:9;1388:6;6230:1;:8;6218:20;;6254:6;6262:9;6275:29;6284:1;6287:16;6292:4;1388:6;6287:4;:16::i;:::-;6275:8;:29::i;:::-;6253:51;;;;6326:22;6331:4;6337:10;6342:1;6345;6337:4;:10::i;6326:22::-;6319:29;;6370:16;6375:4;6381;6370;:16::i;:::-;6363:23;-1:-1:-1;6405:9:0;6401:20;;6416:5;;;;;6401:20;6442:4;6438:30;;;6459:9;;;6438:30;6487:4;6483:30;;;6504:9;;;6483:30;6532:8;6528:132;;;6567:15;6572:3;6577:4;6567;:15::i;:::-;6561:21;;6528:132;;;6629:15;6634:3;6639:4;6629;:15::i;:::-;6623:21;;6528:132;-1:-1:-1;;;6198:3:0;;6162:509;;;-1:-1:-1;6690:3:0;;5621:1080;-1:-1:-1;;;;;;;;;5621:1080:0:o
Swarm Source
ipfs://9b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f3
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingOVERVIEW
The PowerPool is a protocol for pooling governance tokens (GTs), such as COMP, BAL, LEND, YFI, BZRX, AKRO, and many others. It allows the token holders to lend, pool, borrow governance tokens, get income from it, and accumulate governance power in protocols.
Multichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH 14.66% $73.96 21.3481 $1,578.91 ETH 14.25% $72.76 21.1006 $1,535.28 ETH 14.18% $0.112353 13,593.8592 $1,527.31 ETH 14.10% $8,215.28 0.1848 $1,518.54 ETH 13.83% $1,489.45 1.0005 $1,490.24 ETH 13.82% $13.04 114.1414 $1,488.4 ETH 13.77% $1.85 801.7814 $1,483.3 ETH 1.22% $1 131.5449 $131.68 ETH 0.18% $0.040011 489.5144 $19.59 Loading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity), KeccakCaching (medium-severity), EmptyByteArrayCopy (medium-severity), DynamicArrayCleanup (medium-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.