PSA: API Key will be required starting from April 15th, 2021. Learn More.
Contract Overview
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xd14ecf5d12bef43be9dd6eec192f442bd5ee7e47b1d9503a28e45b5d9c6de908 | 1596899 | 174 days 3 hrs ago | 0x4d55a7d68e2671477b1d112c65f064611aa608eb | Contract Creation | 0 BNB |
[ Download CSV Export ]
Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x4168119765a6f62df0b4f87d21ec533bbbf6c4d6
Contract Name:
BPool
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2020-10-13 */ /** *Submitted for verification at BscScan.com on 2020-09-26 */ // File: contracts/BColor.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.5.12; contract BColor { function getColor() external view returns (bytes32); } contract BBronze is BColor { function getColor() external view returns (bytes32) { return bytes32("BRONZE"); } } // File: contracts/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.5.12; contract BConst is BBronze { 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 EXIT_FEE = 0; 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/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.5.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/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.5.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 private _name = "Equator Pool Token"; string private _symbol = "EPT"; 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 view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external view returns (uint) { return _balance[whom]; } function totalSupply() public view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external 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 returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external 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/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.5.12; contract BMath is BBronze, 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 - eF)) \ / 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); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE)); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); 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 ( 1 - eF ) // // eF = exitFee // **********************************************************************************************/ 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 poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply); // charge exit fee on the pool token side // pAi = pAiAfterExitFee/(1-exitFee) poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE)); return poolAmountIn; } } // File: contracts/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.5.12; contract BPool is BBronze, 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; modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex, "ERR_REENTRY"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "ERR_REENTRY"); _; } bool private _mutex; address private _factory; // BFactory address to push token exitFee to address private _controller; // has CONTROL role bool private _publicSwap; // true if PUBLIC can call SWAP functions // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint private _swapFee; bool private _finalized; address[] private _tokens; mapping(address=>Record) private _records; uint private _totalWeight; constructor() public { _controller = msg.sender; _factory = msg.sender; _swapFee = MIN_FEE; _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, "ERR_NOT_FINALIZED"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getController() external view _viewlock_ returns (address) { return _controller; } function setSwapFee(uint swapFee) external _logs_ _lock_ { require(!_finalized, "ERR_IS_FINALIZED"); require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(swapFee >= MIN_FEE, "ERR_MIN_FEE"); require(swapFee <= MAX_FEE, "ERR_MAX_FEE"); _swapFee = swapFee; } function setController(address manager) external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); _controller = manager; } function setPublicSwap(bool public_) external _logs_ _lock_ { require(!_finalized, "ERR_IS_FINALIZED"); require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); _publicSwap = public_; } function finalize() external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(!_finalized, "ERR_IS_FINALIZED"); require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS"); _finalized = true; _publicSwap = true; _mintPoolShare(INIT_POOL_SUPPLY); _pushPoolShare(msg.sender, INIT_POOL_SUPPLY); } function bind(address token, uint balance, uint denorm) external _logs_ // _lock_ Bind does not lock because it jumps to `rebind`, which does { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(!_records[token].bound, "ERR_IS_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); require(_tokens.length < MAX_BOUND_TOKENS, "ERR_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_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT"); require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT"); require(balance >= MIN_BALANCE, "ERR_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, "ERR_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) { // In this case liquidity is being withdrawn, so charge EXIT_FEE uint tokenBalanceWithdrawn = bsub(oldBalance, balance); uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE); _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } } function unbind(address token) external _logs_ _lock_ { require(msg.sender == _controller, "ERR_NOT_CONTROLLER"); require(_records[token].bound, "ERR_NOT_BOUND"); require(!_finalized, "ERR_IS_FINALIZED"); uint tokenBalance = _records[token].balance; uint tokenExitFee = bmul(tokenBalance, EXIT_FEE); _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, bsub(tokenBalance, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound, "ERR_NOT_BOUND"); _records[token].balance = IERC20(token).balanceOf(address(this)); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_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) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); 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, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "ERR_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, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint exitFee = bmul(poolAmountIn, EXIT_FEE); uint pAiAfterExitFee = bsub(poolAmountIn, exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); _pullPoolShare(msg.sender, poolAmountIn); _pushPoolShare(_factory, exitFee); _burnPoolShare(pAiAfterExitFee); 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, "ERR_MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "ERR_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) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); 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, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _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) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); require(tokenAmountIn <= maxAmountIn, "ERR_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, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _logs_ _lock_ returns (uint poolAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); Record storage inRecord = _records[tokenIn]; poolAmountOut = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, _swapFee ); require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return poolAmountOut; } function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external _logs_ _lock_ returns (uint tokenAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee ); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return tokenAmountIn; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _logs_ _lock_ returns (uint tokenAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return tokenAmountOut; } function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external _logs_ _lock_ returns (uint poolAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); Record storage outRecord = _records[tokenOut]; poolAmountIn = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee ); require(poolAmountIn != 0, "ERR_MATH_APPROX"); require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); 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, "ERR_ERC20_FALSE"); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "ERR_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 { _mint(amount); } function _burnPoolShare(uint amount) internal { _burn(amount); } } // File: contracts/BFactory.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 disstributed 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.5.12; // Builds new BPools, logging their addresses and providing `isBPool(address) -> (bool)` contract BFactory is BBronze { event LOG_NEW_POOL( address indexed caller, address indexed pool ); event LOG_BLABS( address indexed caller, address indexed blabs ); mapping(address=>bool) private _isBPool; function isBPool(address b) external view returns (bool) { return _isBPool[b]; } function newBPool() external returns (BPool) { BPool bpool = new BPool(); _isBPool[address(bpool)] = true; emit LOG_NEW_POOL(msg.sender, address(bpool)); bpool.setController(msg.sender); return bpool; } address private _blabs; constructor() public { _blabs = msg.sender; } function getBLabs() external view returns (address) { return _blabs; } function setBLabs(address b) external { require(msg.sender == _blabs, "ERR_NOT_BLABS"); emit LOG_BLABS(msg.sender, b); _blabs = b; } function collect(BPool pool) external { require(msg.sender == _blabs, "ERR_NOT_BLABS"); uint collected = IERC20(pool).balanceOf(address(this)); bool xfer = pool.transfer(_blabs, collected); require(xfer, "ERR_ERC20_FAILED"); } }
[{"inputs":[],"payable":false,"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":"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"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052601260808190527f45717561746f7220506f6f6c20546f6b656e000000000000000000000000000060a0908152620000409160039190620000f4565b506040805180820190915260038082527f455054000000000000000000000000000000000000000000000000000000000060209092019182526200008791600491620000f4565b506005805460ff19166012179055348015620000a257600080fd5b50600680546005805462010000600160b01b031916336201000081029190911790915564e8d4a510006007556001600160a01b03199091161760ff60a01b191690556008805460ff1916905562000199565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013757805160ff191683800117855562000167565b8280016001018555821562000167579182015b82811115620001675782518255916020019190600101906200014a565b506200017592915062000179565b5090565b6200019691905b8082111562000175576000815560010162000180565b90565b61556680620001a96000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c80638d4e40831161020a578063bc694ea211610125578063d73dd623116100b8578063ec09302111610087578063ec09302114610c6e578063f1b8a9b714610c76578063f8b2cb4f14610c9c578063f8d6aed414610cc2578063fde924f714610cfd576103db565b8063d73dd62314610be2578063dd62ed3e14610c0e578063e4a28a52146104e1578063e4e1e53814610c3c576103db565b8063cc77828d116100f4578063cc77828d14610ba4578063cd2ed8fb14610bac578063cf5e7bd314610bb4578063d4cadf6814610bda576103db565b8063bc694ea214610b3c578063be3bbd2e14610b44578063c36596a614610555578063c6580d1214610b9c576103db565b8063a221ee491161019d578063b7b800a41161016c578063b7b800a414610ae9578063ba019dab14610af1578063ba9530a614610af9578063bc063e1a14610b34576103db565b8063a221ee4914610a09578063a9059cbb14610a3e578063b02f0b7314610a6a578063b0e0d13614610ae1576103db565b8063948d8ce6116101d9578063948d8ce6146109cb57806395d89b41146109f1578063992e2a92146109f95780639a86139b14610a01576103db565b80638d4e40831461098d57806392eefe9b14610995578063936c3477146109bb5780639381cd2b146109c3576103db565b806349b59552116102fa57806376c7a3c71161028d5780638656b6531161025c5780638656b653146108e9578063867378c514610924578063892980121461092c5780638c28cbe814610967576103db565b806376c7a3c71461080d5780637c5e9ea4146108155780638201aa3f1461086e57806382f652ad146108ae576103db565b80635db34277116102c95780635db342771461075757806366188463146107895780636d06dfa0146107b557806370a08231146107e7576103db565b806349b595521461067e5780634bb278f31461069d5780634f69c0d4146106a55780635c1bbaf71461071c576103db565b8063218b538211610372578063313ce56711610341578063313ce567146105dd57806334e19907146105fb5780633fdddaa21461061a57806346ab38f11461064c576103db565b8063218b53821461055557806323b872dd1461055d5780632f37b624146105935780633018205f146105b9576103db565b80631446a7ff116103ae5780631446a7ff146104e957806315e84af91461051757806318160ddd14610545578063189d00ca1461054d576103db565b806302c96748146103e057806306fdde0314610424578063095ea7b3146104a157806309a3bbe4146104e1575b600080fd5b610412600480360360608110156103f657600080fd5b506001600160a01b038135169060208101359060400135610d05565b60408051918252519081900360200190f35b61042c611065565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046657818101518382015260200161044e565b50505050905090810190601f1680156104935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104cd600480360360408110156104b757600080fd5b506001600160a01b0381351690602001356110fb565b604080519115158252519081900360200190f35b610412611150565b610412600480360360408110156104ff57600080fd5b506001600160a01b038135811691602001351661115d565b6104126004803603604081101561052d57600080fd5b506001600160a01b03813581169160200135166112b2565b6104126113fe565b610412611404565b610412611418565b6104cd6004803603606081101561057357600080fd5b506001600160a01b03813581169160208101359091169060400135611424565b6104cd600480360360208110156105a957600080fd5b50356001600160a01b031661157e565b6105c161159c565b604080516001600160a01b039092168252519081900360200190f35b6105e56115fa565b6040805160ff9092168252519081900360200190f35b6106186004803603602081101561061157600080fd5b5035611603565b005b6106186004803603606081101561063057600080fd5b506001600160a01b038135169060208101359060400135611800565b6104126004803603606081101561066257600080fd5b506001600160a01b038135169060208101359060400135611c0d565b6106186004803603602081101561069457600080fd5b50351515611f0c565b61061861208f565b610618600480360360408110156106bb57600080fd5b813591908101906040810160208201356401000000008111156106dd57600080fd5b8201836020820111156106ef57600080fd5b8035906020019184602083028401116401000000008311171561071157600080fd5b509092509050612286565b610412600480360360c081101561073257600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561257f565b6104126004803603606081101561076d57600080fd5b506001600160a01b038135169060208101359060400135612637565b6104cd6004803603604081101561079f57600080fd5b506001600160a01b03813516906020013561291a565b610412600480360360608110156107cb57600080fd5b506001600160a01b0381351690602081013590604001356129f2565b610412600480360360208110156107fd57600080fd5b50356001600160a01b0316612d03565b610412612d1e565b610855600480360360a081101561082b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612d30565b6040805192835260208301919091528051918290030190f35b610855600480360360a081101561088457600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356131f3565b610412600480360360c08110156108c457600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561369d565b610412600480360360c08110156108ff57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561375c565b6104126137fd565b610412600480360360c081101561094257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613811565b6106186004803603602081101561097d57600080fd5b50356001600160a01b03166138c1565b6104cd613a75565b610618600480360360208110156109ab57600080fd5b50356001600160a01b0316613a7e565b610412613bbc565b610412613c11565b610412600480360360208110156109e157600080fd5b50356001600160a01b0316613c1e565b61042c613ce8565b610412613d49565b610412613d55565b610412600480360360a0811015610a1f57600080fd5b5080359060208101359060408101359060608101359060800135613d62565b6104cd60048036036040811015610a5457600080fd5b506001600160a01b038135169060200135613dc7565b61061860048036036040811015610a8057600080fd5b81359190810190604081016020820135640100000000811115610aa257600080fd5b820183602082011115610ab457600080fd5b80359060200191846020830284011164010000000083111715610ad657600080fd5b509092509050613ddd565b610412614124565b610412614129565b61041261412e565b610412600480360360c0811015610b0f57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614133565b6104126141b4565b6104126141c4565b610b4c6141d0565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b88578181015183820152602001610b70565b505050509050019250505060405180910390f35b6104126142c8565b610b4c6142cd565b61041261431b565b61061860048036036020811015610bca57600080fd5b50356001600160a01b0316614321565b6104126146a3565b6104cd60048036036040811015610bf857600080fd5b506001600160a01b0381351690602001356146f8565b61041260048036036040811015610c2457600080fd5b506001600160a01b0381358116916020013516614779565b61061860048036036060811015610c5257600080fd5b506001600160a01b0381351690602081013590604001356147a4565b6104126149fb565b61041260048036036020811015610c8c57600080fd5b50356001600160a01b0316614a0b565b61041260048036036020811015610cb257600080fd5b50356001600160a01b0316614ae7565b610412600480360360c0811015610cd857600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614bb1565b6104cd614c34565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610db3576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610e0d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e6a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600390810154610e9f91670de0b6b3a76400005b04600101614c44565b831115610ee7576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754610f219493929190899061369d565b915081610f67576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115610fab576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b610fb9816003015485614d0d565b60038201556000610fca8382614c44565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110183384614d6f565b61102a6110258483614d0d565b614d7d565b600554611046906201000090046001600160a01b031682614d89565b611051863387614d93565b50506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f15780601f106110c6576101008083540402835291602001916110f1565b820191906000526020600020905b8154815290600101906020018083116110d457829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615512833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111ab576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16611208576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16611265576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a602052604080822092851682528120600380840154600280860154928401549084015493946112a99492939290613d62565b95945050505050565b600554600090610100900460ff1615611300576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661135d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff166113ba576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a60205260408082209285168252902060038083015460028085015492840154908401546007546112a994929190613d62565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b6000336001600160a01b038516148061146057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6114b4848484614e5e565b336001600160a01b038516148015906114f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611574576001600160a01b03841660009081526001602090815260408083203384529091529020546115259083614d0d565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206155128339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b600554600090610100900460ff16156115ea576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156116af576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615611709576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b0316331461175d576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a510008110156117a5576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b67016345785d8a00008111156117f0576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ac576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611911576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661196e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff16156119b9576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611a07576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611a56576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b620f4240821015611aa0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090206002015480821115611b3757611ad9600b54611ad48484614d0d565b614f6e565b600b8190556802b5e3af16b18800001015611b32576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b611b58565b80821015611b5857611b54600b54611b4f8385614d0d565b614d0d565b600b555b6001600160a01b0384166000908152600a602052604090206002810183905560030180549084905580841115611ba157611b9c8533611b978785614d0d565b614fbb565b611bfb565b80841015611bfb576000611bb58286614d0d565b90506000611bc4826000614c44565b9050611bda8733611bd58585614d0d565b614d93565b600554611bf89088906201000090046001600160a01b031683614d93565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611cbb576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611d15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16611d72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754611dac94939291908990613811565b915082821015611df3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a60205260409020600390810154611e2391670de0b6b3a7640000610e96565b821115611e6b576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b611e79816003015483614d0d565b60038201556000611e8a8582614c44565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3611ed83386614d6f565b611ee56110258683614d0d565b600554611f01906201000090046001600160a01b031682614d89565b611051863385614d93565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611fb8576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615612012576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b03163314612066576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561213b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b03909116146121a0576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60085460ff16156121eb576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60095460021115612234576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b6008805460ff191660011790556006805460ff60a01b1916600160a01b17905561226668056bc75e2d63100000615014565b6122793368056bc75e2d63100000614d89565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612332576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661238c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006123966113fe565b905060006123a4858361501d565b9050806123ea576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b60095481101561256b5760006009828154811061240657fe5b60009182526020808320909101546001600160a01b0316808352600a90915260408220600301549092509061243b8583614c44565b905080612481576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061248d57fe5b905060200201358111156124d7576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546124fd9082614f6e565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3612560833383614fbb565b5050506001016123ed565b5061257585615014565b611bfb3386614d89565b60008061258c878661501d565b9050600061259a8786614f6e565b905060006125a8828961501d565b905060006125be670de0b6b3a76400008561501d565b905060006125cc8383615125565b905060006125da828e614c44565b905060006125e8828f614d0d565b90506000612607612601670de0b6b3a76400008a614d0d565b8b614c44565b90506126248261261f670de0b6b3a764000084614d0d565b61501d565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156126e5576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661273f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff1661279c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600301546127ce906002670de0b6b3a76400005b04614c44565b831115612815576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b5460075461284f9493929190899061375c565b915082821015612896576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6128a4816003015485614f6e565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a36128f282615014565b6128fc3383614d89565b612907853386614fbb565b506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561296f573360009081526001602090815260408083206001600160a01b038816845290915281205561299e565b6129798184614d0d565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615512833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612aa0576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612afa576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16612b57576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754612b919493929190899061257f565b915081612bd7576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612c1b576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a6020526040902060030154612c4b906002670de0b6b3a76400006127c8565b821115612c92576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b612ca0816003015483614f6e565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612cee84615014565b612cf83385614d89565b612907853384614fbb565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611414565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612dcd576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16612e39576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16612e96576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612eea576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600a602052604080822092881682529020600380820154612f2391670de0b6b3a7640000610e96565b861115612f6b576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612f8c8360030154846002015484600301548560020154600754613d62565b905085811115612fd9576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612ff983600301548460020154846003015485600201548b600754614bb1565b94508885111561303f576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b61304d836003015486614f6e565b8360030181905550613063826003015488614d0d565b600380840182905584015460028086015490850154600754613086949190613d62565b9350808410156130cf576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613116576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b613120858861501d565b811115613166576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46131ce8a3387614fbb565b6131d9883389614d93565b5050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613290576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff166132fc576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16613359576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff166133ad576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600a60205260408082209288168252902060038201546133e7906002670de0b6b3a76400006127c8565b88111561342e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b600061344f8360030154846002015484600301548560020154600754613d62565b90508581111561349c576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6134bc83600301548460020154846003015485600201548d600754614133565b945086851015613503576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61351183600301548a614f6e565b8360030181905550613527826003015486614d0d565b60038084018290558401546002808601549085015460075461354a949190613d62565b935080841015613593576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b858411156135da576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6135e4898661501d565b81111561362a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136928a338b614fbb565b6131d9883387614d93565b6000806136aa878661501d565b905060006136c0670de0b6b3a764000083614d0d565b905060006136ce8286614c44565b905060006136e88761261f670de0b6b3a764000085614d0d565b905060006136f68c83614d0d565b90506000613704828e61501d565b905060006137128288615125565b90506000613720828e614c44565b9050600061372e8e83614d0d565b90506137478161261f670de0b6b3a76400006000614d0d565b99505050505050505050509695505050505050565b600080613769878661501d565b90506000613788613782670de0b6b3a764000084614d0d565b85614c44565b905060006137a7866137a2670de0b6b3a764000085614d0d565b614c44565b905060006137b58b83614f6e565b905060006137c3828d61501d565b905060006137d18287615125565b905060006137df828d614c44565b90506137eb818d614d0d565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611414565b60008061381e878661501d565b90506000613839856137a2670de0b6b3a76400006000614d0d565b905060006138478883614d0d565b90506000613855828a61501d565b905060006138748261386f670de0b6b3a76400008861501d565b615125565b90506000613882828e614c44565b905060006138908e83614d0d565b905060006138a9612601670de0b6b3a76400008a614d0d565b9050612624826137a2670de0b6b3a764000084614d0d565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561396d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600a602052604090205460ff166139d9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613a1f57600080fd5b505afa158015613a33573d6000803e3d6000fd5b505050506040513d6020811015613a4957600080fd5b50516001600160a01b039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614613b8f576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613c0a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613c6c576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16613cc9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f15780601f106110c6576101008083540402835291602001916110f1565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b600080613d6f878761501d565b90506000613d7d868661501d565b90506000613d8b838361501d565b90506000613dad670de0b6b3a764000061261f670de0b6b3a764000089614d0d565b9050613db98282614c44565b9a9950505050505050505050565b6000613dd4338484614e5e565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e89576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16613ee3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613eed6113fe565b90506000613efc856000614c44565b90506000613f0a8683614d0d565b90506000613f18828561501d565b905080613f5e576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613f683388614d6f565b600554613f84906201000090046001600160a01b031684614d89565b613f8d82614d7d565b60005b60095481101561410f57600060098281548110613fa957fe5b60009182526020808320909101546001600160a01b0316808352600a909152604082206003015490925090613fde8583614c44565b905080614024576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b89898581811061403057fe5b9050602002013581101561407b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546140a19082614d0d565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614104833383614d93565b505050600101613f90565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080614140878661501d565b90506000614156670de0b6b3a764000085614d0d565b90506141628582614c44565b905060006141748a61261f8c85614f6e565b905060006141828285615125565b90506000614198670de0b6b3a764000083614d0d565b90506141a48a82614c44565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611414565b671bc16d674ec7ffff81565b600554606090610100900460ff161561421e576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60085460ff16614269576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60098054806020026020016040519081016040528092919081815260200182805480156110f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116142a1575050505050905090565b600081565b600554606090610100900460ff1615614269576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156143cd576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614614432576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a602052604090205460ff1661448f576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff16156144da576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040812060030154906145018282614c44565b600b546001600160a01b0385166000908152600a602052604090206002015491925061452c91614d0d565b600b556001600160a01b0383166000908152600a602052604090206001015460098054600019810191908290811061456057fe5b600091825260209091200154600980546001600160a01b03909216918490811061458657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600a6000600985815481106145c657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015560098054806145f957fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600a909552929094209051815460ff191690151517815592516001840155516002830155516003909101556146858533611bd58787614d0d565b600554611bfb9086906201000090046001600160a01b031685614d93565b600554600090610100900460ff16156146f1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546147269083614f6e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615512833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b03163314614859576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16156148b6576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b60085460ff1615614901576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600954600811614949576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b6040805160808101825260018082526009805460208085019182526000858701818152606087018281526001600160a01b038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b03191690911790556149f6838383611800565b505050565b6002670de0b6b3a7640000611414565b600554600090610100900460ff1615614a59576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614ab6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a6020526040902060020154600b54614ae090829061501d565b9392505050565b600554600090610100900460ff1615614b35576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614b92576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206003015490565b600080614bbe858861501d565b90506000614bcc8786614d0d565b90506000614bda888361501d565b90506000614be88285615125565b9050614bfc81670de0b6b3a7640000614d0d565b9050614c10670de0b6b3a764000087614d0d565b9450614c25614c1f8c83614c44565b8661501d565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b6000828202831580614c5e575082848281614c5b57fe5b04145b614ca2576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614cf5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614d1c8585615233565b915091508015614d67576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614d798282615258565b5050565b614d8681615263565b50565b614d798282615333565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614de657600080fd5b505af1158015614dfa573d6000803e3d6000fd5b505050506040513d6020811015614e1057600080fd5b5051905080614e58576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614ec2576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614ee59082614d0d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614f149082614f6e565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614ae0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614de657600080fd5b614d868161533e565b600081615060576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806150885750670de0b6b3a764000084828161508557fe5b04145b6150cc576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561511a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614d0257fe5b60006001831015615175576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156151cb576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006151d6836153b3565b905060006151e48483614d0d565b905060006151fa866151f5856153ce565b6153dc565b90508161520b57925061114a915050565b600061521c87846305f5e100615433565b90506152288282614c44565b979650505050505050565b6000808284106152495750508082036000615251565b505081810360015b9250929050565b614d79823083614e5e565b306000908152602081905260409020548111156152be576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152d89082614d0d565b306000908152602081905260409020556002546152f59082614d0d565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b614d79308383614e5e565b306000908152602081905260409020546153589082614f6e565b306000908152602081905260409020556002546153759082614f6e565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a76400006153c7836153ce565b0292915050565b670de0b6b3a7640000900490565b600080600283066153f557670de0b6b3a76400006153f7565b835b90506002830492505b8215614ae0576154108485614c44565b93506002830615615428576154258185614c44565b90505b600283049250615400565b600082818061544a87670de0b6b3a7640000615233565b9092509050670de0b6b3a764000080600060015b888410615502576000670de0b6b3a7640000820290506000806154928a61548d85670de0b6b3a7640000614d0d565b615233565b915091506154a4876137a2848c614c44565b96506154b0878461501d565b9650866154bf57505050615502565b87156154c9579315935b80156154d3579315935b84156154ea576154e38688614d0d565b95506154f7565b6154f48688614f6e565b95505b50505060010161545e565b5090999850505050505050505056fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820febbe73d4127aeb7ee537d2f2af0a6025927436167402edd6b6943b9fc9857bc64736f6c634300050c0032
Deployed ByteCode Sourcemap
27707:23204:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27707:23204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48496:1378;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48496:1378:0;;-1:-1:-1;;;;;48496:1378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10134:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10134:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10744:184;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10744:184:0;;-1:-1:-1;;;;;10744:184:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2233:50;;;:::i;37146:491::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37146:491:0;;;;;;;;;;:::i;36647:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36647:491:0;;;;;;;;;;:::i;10648:88::-;;;:::i;2532:54::-;;;:::i;2124:45::-;;;:::i;11742:491::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11742:491:0;;;;;;;;;;;;;;;;;:::i;29848:123::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29848:123:0;-1:-1:-1;;;;;29848:123:0;;:::i;31496:137::-;;;:::i;:::-;;;;-1:-1:-1;;;;;31496:137:0;;;;;;;;;;;;;;10320:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31641:350;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31641:350:0;;:::i;:::-;;33649:1631;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33649:1631:0;;-1:-1:-1;;;;;33649:1631:0;;;;;;;;;;;:::i;47168:1320::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47168:1320:0;;-1:-1:-1;;;;;47168:1320:0;;;;;;;;;;;:::i;32209:250::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32209:250:0;;;;:::i;32467:432::-;;;:::i;37645:948::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37645:948:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37645:948:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37645:948:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;37645:948:0;;-1:-1:-1;37645:948:0;-1:-1:-1;37645:948:0;:::i;21015:1185::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;21015:1185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44711:1198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44711:1198:0;;-1:-1:-1;;;;;44711:1198:0;;;;;;;;;;;:::i;11196:397::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11196:397:0;;-1:-1:-1;;;;;11196:397:0;;;;;;:::i;45917:1243::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45917:1243:0;;-1:-1:-1;;;;;45917:1243:0;;;;;;;;;;;:::i;10538:102::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10538:102:0;-1:-1:-1;;;;;10538:102:0;;:::i;1956:53::-;;;:::i;42222:2479::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;42222:2479:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39733:2481;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39733:2481:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25694:1283::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;25694:1283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18831:1166::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;18831:1166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2290:54::-;;;:::i;23319:1256::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;23319:1256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36414:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36414:225:0;-1:-1:-1;;;;;36414:225:0;;:::i;29729:111::-;;;:::i;31999:202::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31999:202:0;-1:-1:-1;;;;;31999:202:0;;:::i;30697:148::-;;;:::i;2353:51::-;;;:::i;30463:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30463:226:0;-1:-1:-1;;;;;30463:226:0;;:::i;10225:87::-;;;:::i;2651:59::-;;;:::i;920:121::-;;;:::i;13913:509::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13913:509:0;;;;;;;;;;;;;;;;;;;;;;:::i;11601:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11601:133:0;;-1:-1:-1;;;;;11601:133:0;;;;;;:::i;38601:1122::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38601:1122:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38601:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38601:1122:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;38601:1122:0;;-1:-1:-1;38601:1122:0;-1:-1:-1;38601:1122:0;:::i;1905:42::-;;;:::i;1856:::-;;;:::i;2413:46::-;;;:::i;15440:683::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;15440:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2016:50::-;;;:::i;2466:59::-;;;:::i;30254:201::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30254:201:0;;;;;;;;;;;;;;;;;2073:42;;;:::i;30103:143::-;;;:::i;29979:116::-;;;:::i;35288:1041::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35288:1041:0;-1:-1:-1;;;;;35288:1041:0;;:::i;31360:128::-;;;:::i;10936:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10936:252:0;;-1:-1:-1;;;;;10936:252:0;;;;;;:::i;10410:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10410:120:0;;;;;;;;;;:::i;32909:732::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32909:732:0;;-1:-1:-1;;;;;32909:732:0;;;;;;;;;;;:::i;2595:49::-;;;:::i;30853:275::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30853:275:0;-1:-1:-1;;;;;30853:275:0;;:::i;31136:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31136:216:0;-1:-1:-1;;;;;31136:216:0;;:::i;17141:672::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17141:672:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29608:113::-;;;:::i;48496:1378::-;28596:39;;;;;;;28626:8;28596:39;;;;;;48658:17;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;48658:17;;28626:8;;28596:39;;;;;48658:17;28626:8;;48658:17;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;48701:10;;28734:13;48701:10;48693:40;;;;;-1:-1:-1;;;48693:40:0;;;;;;;;;;;;-1:-1:-1;;;48693:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48752:18:0;;;;;;:8;:18;;;;;:24;;;48744:50;;;;;-1:-1:-1;;;48744:50:0;;;;;;;;;;;;-1:-1:-1;;;48744:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48836:18:0;;;;;;:8;:18;;;;;:26;;;;;48831:47;;1841:6;2693:8;;2705:5;2692:18;48831:4;:47::i;:::-;48813:14;:65;;48805:95;;;;;-1:-1:-1;;;48805:95:0;;;;;;;;;;;;-1:-1:-1;;;48805:95:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48940:18:0;;48913:24;48940:18;;;:8;:18;;;;;49041:17;;;;49089:16;;;;;49136:12;;49179;;49267:8;;48986:316;;49041:17;49089:16;49136:12;49179;49222:14;;48986:24;:316::i;:::-;48971:331;-1:-1:-1;49323:17:0;49315:45;;;;;-1:-1:-1;;;49315:45:0;;;;;;;;;;;;-1:-1:-1;;;49315:45:0;;;;;;;;;;;;;;;49395:15;49379:12;:31;;49371:56;;;;;-1:-1:-1;;;49371:56:0;;;;;;;;;;;;-1:-1:-1;;;49371:56:0;;;;;;;;;;;;;;;49460:39;49465:9;:17;;;49484:14;49460:4;:39::i;:::-;49440:17;;;:59;49512:12;49527:28;49532:12;49512;49527:4;:28::i;:::-;49573:46;;;;;;;;49512:43;;-1:-1:-1;;;;;;49573:46:0;;;49582:10;;49573:46;;;;;;;;;;49632:40;49647:10;49659:12;49632:14;:40::i;:::-;49683:43;49698:27;49703:12;49717:7;49698:4;:27::i;:::-;49683:14;:43::i;:::-;49752:8;;49737:33;;49752:8;;;-1:-1:-1;;;;;49752:8:0;49762:7;49737:14;:33::i;:::-;49781:53;49797:8;49807:10;49819:14;49781:15;:53::i;:::-;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;48496:1378;;-1:-1:-1;;;48496:1378:0:o;10134:83::-;10204:5;10197:12;;;;;;;;;;;;;-1:-1:-1;;10197:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;10171:13;;10197:12;;10204:5;;10197:12;;;10204:5;10197:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10134:83;:::o;10744:184::-;10830:10;10802:4;10819:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10819:27:0;;;;;;;;;;;:33;;;10868:30;;;;;;;-1:-1:-1;;10802:4:0;;10819:27;;10830:10;;10868:30;;10802:4;;10819:22;-1:-1:-1;10802:4:0;-1:-1:-1;;;;;10868:30:0;;;;;;;-1:-1:-1;10916:4:0;10744:184;;;;;:::o;2233:50::-;2274:9;2233:50;:::o;37146:491::-;28842:6;;37271:14;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37311:17:0;;;;;;:8;:17;;;;;:23;;;37303:49;;;;;-1:-1:-1;;;37303:49:0;;;;;;;;;;;;-1:-1:-1;;;37303:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37371:18:0;;;;;;:8;:18;;;;;:24;;;37363:50;;;;;-1:-1:-1;;;37363:50:0;;;;;;;;;;;;-1:-1:-1;;;37363:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37450:17:0;;;37424:23;37450:17;;;:8;:17;;;;;;37505:18;;;;;;;37555:16;;;;;37573:15;;;;;37590:17;;;;37609:16;;;;37505:18;;37541:88;;37555:16;;37573:15;37609:16;37541:13;:88::i;:::-;37534:95;37146:491;-1:-1:-1;;;;;37146:491:0:o;36647:::-;28842:6;;36765:14;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36805:17:0;;;;;;:8;:17;;;;;:23;;;36797:49;;;;;-1:-1:-1;;;36797:49:0;;;;;;;;;;;;-1:-1:-1;;;36797:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36865:18:0;;;;;;:8;:18;;;;;:24;;;36857:50;;;;;-1:-1:-1;;;36857:50:0;;;;;;;;;;;;-1:-1:-1;;;36857:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36944:17:0;;;36918:23;36944:17;;;:8;:17;;;;;;36999:18;;;;;;;37049:16;;;;;37067:15;;;;;37084:17;;;;37103:16;;;;37121:8;;37035:95;;37067:15;37084:17;37103:16;37035:13;:95::i;10648:88::-;10716:12;;10648:88;:::o;2532:54::-;2580:6;1841;2573:13;;2532:54;:::o;2124:45::-;1841:6;2124:45;:::o;11742:491::-;11818:4;-1:-1:-1;;;;;11843:17:0;;:10;:17;;:55;;-1:-1:-1;;;;;;11871:15:0;;;;;;-1:-1:-1;11871:15:0;;;;;;;;11887:10;11871:27;;;;;;;;11864:34;;;11843:55;11835:89;;;;;-1:-1:-1;;;11835:89:0;;;;;;;;;;;;-1:-1:-1;;;11835:89:0;;;;;;;;;;;;;;;11935:20;11941:3;11946;11951;11935:5;:20::i;:::-;-1:-1:-1;;;;;11970:17:0;;:10;:17;;;;:63;;-1:-1:-1;;;;;;11991:15:0;;;;;;-1:-1:-1;11991:15:0;;;;;;;;12007:10;11991:27;;;;;;;;-1:-1:-1;;11991:42:0;;11970:63;11966:238;;;-1:-1:-1;;;;;12085:15:0;;;;;;-1:-1:-1;12085:15:0;;;;;;;;12101:10;12085:27;;;;;;;;12080:38;;12114:3;12080:4;:38::i;:::-;-1:-1:-1;;;;;12050:15:0;;;;;;;-1:-1:-1;12050:15:0;;;;;;;;12066:10;12050:27;;;;;;;;;:68;;;12138:54;;;;;;;-1:-1:-1;;12138:54:0;;;;12066:10;;12138:54;;;;12050:15;-1:-1:-1;12050:15:0;-1:-1:-1;;;;;12138:54:0;;;;;;;;;11966:238;-1:-1:-1;12221:4:0;11742:491;;;;;:::o;29848:123::-;-1:-1:-1;;;;;29946:11:0;29917:4;29946:11;;;:8;:11;;;;;:17;;;;29848:123::o;31496:137::-;28842:6;;31582:7;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;31614:11:0;;-1:-1:-1;;;;;31614:11:0;;31496:137::o;10320:82::-;10385:9;;;;10320:82;:::o;31641:350::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;31750:10;;28734:13;31750:10;31749:11;31741:40;;;;;-1:-1:-1;;;31741:40:0;;;;;;;;;;;;-1:-1:-1;;;31741:40:0;;;;;;;;;;;;;;;31814:11;;-1:-1:-1;;;;;31814:11:0;31800:10;:25;31792:56;;;;;-1:-1:-1;;;31792:56:0;;;;;;;;;;;;-1:-1:-1;;;31792:56:0;;;;;;;;;;;;;;;1997:12;31867:18;;;31859:42;;;;;-1:-1:-1;;;31859:42:0;;;;;;;;;;;;-1:-1:-1;;;31859:42:0;;;;;;;;;;;;;;;2057:9;31920:18;;;31912:42;;;;;-1:-1:-1;;;31912:42:0;;;;;;;;;;;;-1:-1:-1;;;31912:42:0;;;;;;;;;;;;;;;31965:8;:18;28770:6;:14;;-1:-1:-1;;28770:14:0;;;31641:350::o;33649:1631::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;33795:11;;-1:-1:-1;;;;;33795:11:0;33781:10;:25;33773:56;;;;;-1:-1:-1;;;33773:56:0;;;;;;;;;;;;-1:-1:-1;;;33773:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33848:15:0;;;;;;:8;:15;;;;;:21;;;33840:47;;;;;-1:-1:-1;;;33840:47:0;;;;;;;;;;;;-1:-1:-1;;;33840:47:0;;;;;;;;;;;;;;;33907:10;;;;33906:11;33898:40;;;;;-1:-1:-1;;;33898:40:0;;;;;;;;;;;;-1:-1:-1;;;33898:40:0;;;;;;;;;;;;;;;1841:6;33959;:20;;33951:47;;;;;-1:-1:-1;;;33951:47:0;;;;;;;;;;;;-1:-1:-1;;;33951:47:0;;;;;;;;;;;;;;;2217:9;34017:20;;;34009:47;;;;;-1:-1:-1;;;34009:47:0;;;;;;;;;;;;-1:-1:-1;;;34009:47:0;;;;;;;;;;;;;;;2331:13;34075:22;;;34067:50;;;;;-1:-1:-1;;;34067:50:0;;;;;;;;;;;;-1:-1:-1;;;34067:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34193:15:0;;34176:14;34193:15;;;:8;:15;;;;;:22;;;34230:18;;;34226:304;;;34280:43;34285:12;;34299:23;34304:6;34312:9;34299:4;:23::i;:::-;34280:4;:43::i;:::-;34265:12;:58;;;2274:9;-1:-1:-1;34346:32:0;34338:65;;;;;-1:-1:-1;;;34338:65:0;;;;;;;;;;;;-1:-1:-1;;;34338:65:0;;;;;;;;;;;;;;;34226:304;;;34434:9;34425:6;:18;34421:109;;;34475:43;34480:12;;34494:23;34499:9;34510:6;34494:4;:23::i;:::-;34475:4;:43::i;:::-;34460:12;:58;34421:109;-1:-1:-1;;;;;34540:15:0;;;;;;:8;:15;;;;;:22;;;:31;;;34665:23;;;;34699:33;;;;34747:20;;;34743:530;;;34784:61;34800:5;34807:10;34819:25;34824:7;34833:10;34819:4;:25::i;:::-;34784:15;:61::i;:::-;34743:530;;;34877:10;34867:7;:20;34863:410;;;34982:26;35011:25;35016:10;35028:7;35011:4;:25::i;:::-;34982:54;;35051:17;35071:37;35076:21;2114:1;35071:4;:37::i;:::-;35051:57;;35123:77;35139:5;35146:10;35158:41;35163:21;35186:12;35158:4;:41::i;:::-;35123:15;:77::i;:::-;35238:8;;35215:46;;35231:5;;35238:8;;;-1:-1:-1;;;;;35238:8:0;35248:12;35215:15;:46::i;:::-;34863:410;;;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;;;33649:1631:0:o;47168:1320::-;28596:39;;;;;;;28626:8;28596:39;;;;;;47322:19;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;47322:19;;28626:8;;28596:39;;;;;47322:19;28626:8;;47322:19;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;47367:10;;28734:13;47367:10;47359:40;;;;;-1:-1:-1;;;47359:40:0;;;;;;;;;;;;-1:-1:-1;;;47359:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47418:18:0;;;;;;:8;:18;;;;;:24;;;47410:50;;;;;-1:-1:-1;;;47410:50:0;;;;;;;;;;;;-1:-1:-1;;;47410:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47500:18:0;;47473:24;47500:18;;;:8;:18;;;;;47603:17;;;;47651:16;;;;;47698:12;;47741;;47827:8;;47548:314;;47603:17;47651:16;47698:12;47741;47784;;47548:24;:314::i;:::-;47531:331;;47901:12;47883:14;:30;;47875:56;;;;;-1:-1:-1;;;47875:56:0;;;;;;;;;;;;-1:-1:-1;;;47875:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47975:18:0;;;;;;:8;:18;;;;;:26;;;;;47970:47;;1841:6;2693:8;;47970:47;47952:14;:65;;47944:95;;;;;-1:-1:-1;;;47944:95:0;;;;;;;;;;;;-1:-1:-1;;;47944:95:0;;;;;;;;;;;;;;;48072:39;48077:9;:17;;;48096:14;48072:4;:39::i;:::-;48052:17;;;:59;48124:12;48139:28;48144:12;48124;48139:4;:28::i;:::-;48185:46;;;;;;;;48124:43;;-1:-1:-1;;;;;;48185:46:0;;;48194:10;;48185:46;;;;;;;;;;48244:40;48259:10;48271:12;48244:14;:40::i;:::-;48295:43;48310:27;48315:12;48329:7;48310:4;:27::i;48295:43::-;48364:8;;48349:33;;48364:8;;;-1:-1:-1;;;;;48364:8:0;48374:7;48349:14;:33::i;:::-;48393:53;48409:8;48419:10;48431:14;48393:15;:53::i;32209:250::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;32321:10;;28734:13;32321:10;32320:11;32312:40;;;;;-1:-1:-1;;;32312:40:0;;;;;;;;;;;;-1:-1:-1;;;32312:40:0;;;;;;;;;;;;;;;32385:11;;-1:-1:-1;;;;;32385:11:0;32371:10;:25;32363:56;;;;;-1:-1:-1;;;32363:56:0;;;;;;;;;;;;-1:-1:-1;;;32363:56:0;;;;;;;;;;;;;;;32430:11;:21;;;;;-1:-1:-1;;;32430:21:0;-1:-1:-1;;;;32430:21:0;;;;;;;;;28770:6;:14;;-1:-1:-1;;28770:14:0;;;32209:250::o;32467:432::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;32575:11;;-1:-1:-1;;;;;32575:11:0;32561:10;:25;32553:56;;;;;-1:-1:-1;;;32553:56:0;;;;;;;;;;;;-1:-1:-1;;;32553:56:0;;;;;;;;;;;;;;;32629:10;;;;32628:11;32620:40;;;;;-1:-1:-1;;;32620:40:0;;;;;;;;;;;;-1:-1:-1;;;32620:40:0;;;;;;;;;;;;;;;32679:7;:14;1897:1;-1:-1:-1;32679:34:0;32671:61;;;;;-1:-1:-1;;;32671:61:0;;;;;;;;;;;;-1:-1:-1;;;32671:61:0;;;;;;;;;;;;;;;32745:10;:17;;-1:-1:-1;;32745:17:0;32758:4;32745:17;;;32773:11;:18;;-1:-1:-1;;;;32773:18:0;-1:-1:-1;;;32773:18:0;;;32804:32;2394:10;32804:14;:32::i;:::-;32847:44;32862:10;2394;32847:14;:44::i;:::-;28770:6;:14;;-1:-1:-1;;28770:14:0;;;32467:432::o;37645:948::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;37787:10;;28734:13;37787:10;37779:40;;;;;-1:-1:-1;;;37779:40:0;;;;;;;;;;;;-1:-1:-1;;;37779:40:0;;;;;;;;;;;;;;;37832:14;37849:13;:11;:13::i;:::-;37832:30;;37873:10;37886:30;37891:13;37906:9;37886:4;:30::i;:::-;37873:43;-1:-1:-1;37935:10:0;37927:38;;;;;-1:-1:-1;;;37927:38:0;;;;;;;;;;;;-1:-1:-1;;;37927:38:0;;;;;;;;;;;;;;;37983:6;37978:516;37999:7;:14;37995:18;;37978:516;;;38035:9;38047:7;38055:1;38047:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38047:10:0;38083:11;;;:8;:11;;;;;;:19;;;38047:10;;-1:-1:-1;38083:19:0;38138:16;38143:5;38083:19;38138:4;:16::i;:::-;38117:37;-1:-1:-1;38177:18:0;38169:46;;;;;-1:-1:-1;;;38169:46:0;;;;;;;;;;;;-1:-1:-1;;;38169:46:0;;;;;;;;;;;;;;;38255:12;;38268:1;38255:15;;;;;;;;;;;;;38238:13;:32;;38230:57;;;;;-1:-1:-1;;;38230:57:0;;;;;;;;;;;;-1:-1:-1;;;38230:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38329:11:0;;;;;;:8;:11;;;;;:19;;;38324:40;;38350:13;38324:4;:40::i;:::-;-1:-1:-1;;;;;38302:11:0;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;38384:38;;;;;;;38302:11;;38393:10;;38384:38;;;;;;;;;;38437:45;38453:1;38456:10;38468:13;38437:15;:45::i;:::-;-1:-1:-1;;;38015:3:0;;37978:516;;;;38504:29;38519:13;38504:14;:29::i;:::-;38544:41;38559:10;38571:13;38544:14;:41::i;21015:1185::-;21259:18;21295:21;21319:32;21324:13;21339:11;21319:4;:32::i;:::-;21295:56;;21362:18;21383:31;21388:10;21400:13;21383:4;:31::i;:::-;21362:52;;21425:14;21442:31;21447:13;21462:10;21442:4;:31::i;:::-;21425:48;;21545:8;21556:28;1841:6;21567:16;21556:4;:28::i;:::-;21545:39;;21595:17;21615:20;21620:9;21631:3;21615:4;:20::i;:::-;21595:40;;21646:22;21671:34;21676:12;21690:14;21671:4;:34::i;:::-;21646:59;;21716:26;21745:39;21750:17;21769:14;21745:4;:39::i;:::-;21716:68;;22036:8;22047:43;22052:28;1841:6;22063:16;22052:4;:28::i;:::-;22082:7;22047:4;:43::i;:::-;22036:54;;22117:44;22122:21;22145:15;1841:6;22156:3;22145:4;:15::i;:::-;22117:4;:44::i;:::-;22101:60;21015:1185;-1:-1:-1;;;;;;;;;;;;;;;21015:1185:0:o;44711:1198::-;28596:39;;;;;;;28626:8;28596:39;;;;;;44871:18;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;44871:18;;28626:8;;28596:39;;;;;44871:18;28626:8;;44871:18;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;44917:10;;28734:13;44917:10;44909:40;;;;;-1:-1:-1;;;44909:40:0;;;;;;;;;;;;-1:-1:-1;;;44909:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44968:17:0;;;;;;:8;:17;;;;;:23;;;44960:49;;;;;-1:-1:-1;;;44960:49:0;;;;;;;;;;;;-1:-1:-1;;;44960:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45050:17:0;;;;;;:8;:17;;;;;:25;;;45045:45;;2643:1;1841:6;2636:8;;45045:4;:45::i;:::-;45028:13;:62;;45020:91;;;;;-1:-1:-1;;;45020:91:0;;;;;;;;;;;;-1:-1:-1;;;45020:91:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45150:17:0;;45124:23;45150:17;;;:8;:17;;;;;45251:16;;;;45298:15;;;;;45344:12;;45387;;45474:8;;45196:313;;45251:16;45298:15;45344:12;45387;45430:13;;45196:24;:313::i;:::-;45180:329;;45547:16;45530:13;:33;;45522:59;;;;;-1:-1:-1;;;45522:59:0;;;;;;;;;;;;-1:-1:-1;;;45522:59:0;;;;;;;;;;;;;;;45613:37;45618:8;:16;;;45636:13;45613:4;:37::i;:::-;45594:16;;;:56;45668:44;;;;;;;;-1:-1:-1;;;;;45668:44:0;;;45677:10;;45668:44;;;;;;;;;45725:29;45740:13;45725:14;:29::i;:::-;45765:41;45780:10;45792:13;45765:14;:41::i;:::-;45817:51;45833:7;45842:10;45854:13;45817:15;:51::i;:::-;-1:-1:-1;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;44711:1198;;-1:-1:-1;;;44711:1198:0:o;11196:397::-;11307:10;11263:4;11296:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11296:27:0;;;;;;;;;;11338:14;;;11334:160;;;11380:10;11399:1;11369:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11369:27:0;;;;;;;;;:31;11334:160;;;11463:19;11468:8;11478:3;11463:4;:19::i;:::-;11444:10;11433:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11433:27:0;;;;;;;;;:49;11334:160;11518:10;11535:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11509:54:0;;11535:27;;;;;;;;;;11509:54;;;;;;;-1:-1:-1;;11509:54:0;;11518:10;11509:54;;11535:22;-1:-1:-1;11535:22:0;-1:-1:-1;;;;;11509:54:0;;;;;;;;;;-1:-1:-1;11581:4:0;;11196:397;-1:-1:-1;;;11196:397:0:o;45917:1243::-;28596:39;;;;;;;28626:8;28596:39;;;;;;46071:18;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;46071:18;;28626:8;;28596:39;;;;;46071:18;28626:8;;46071:18;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;46115:10;;28734:13;46115:10;46107:40;;;;;-1:-1:-1;;;46107:40:0;;;;;;;;;;;;-1:-1:-1;;;46107:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46166:17:0;;;;;;:8;:17;;;;;:23;;;46158:49;;;;;-1:-1:-1;;;46158:49:0;;;;;;;;;;;;-1:-1:-1;;;46158:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46246:17:0;;46220:23;46246:17;;;:8;:17;;;;;46347:16;;;;46394:15;;;;;46440:12;;46483;;46570:8;;46292:313;;46347:16;46394:15;46440:12;46483;46526:13;;46292:24;:313::i;:::-;46276:329;-1:-1:-1;46626:18:0;46618:46;;;;;-1:-1:-1;;;46618:46:0;;;;;;;;;;;;-1:-1:-1;;;46618:46:0;;;;;;;;;;;;;;;46700:11;46683:13;:28;;46675:53;;;;;-1:-1:-1;;;46675:53:0;;;;;;;;;;;;-1:-1:-1;;;46675:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46771:17:0;;;;;;:8;:17;;;;;:25;;;46766:45;;2643:1;1841:6;2636:8;;46766:45;46749:13;:62;;46741:91;;;;;-1:-1:-1;;;46741:91:0;;;;;;;;;;;;-1:-1:-1;;;46741:91:0;;;;;;;;;;;;;;;46864:37;46869:8;:16;;;46887:13;46864:4;:37::i;:::-;46845:16;;;:56;46919:44;;;;;;;;-1:-1:-1;;;;;46919:44:0;;;46928:10;;46919:44;;;;;;;;;46976:29;46991:13;46976:14;:29::i;:::-;47016:41;47031:10;47043:13;47016:14;:41::i;:::-;47068:51;47084:7;47093:10;47105:13;47068:15;:51::i;10538:102::-;-1:-1:-1;;;;;10618:14:0;10594:4;10618:14;;;;;;;;;;;;10538:102::o;1956:53::-;2004:5;1841:6;1997:12;;42222:2479;28596:39;;;;;;;28626:8;28596:39;;;;;;-1:-1:-1;;;;28614:10:0;;28605:7;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28596:39:0;;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;42524:17:0;;-1:-1:-1;42524:17:0;;;:8;:17;;;;;:23;28734:13;42524:23;42516:49;;;;;-1:-1:-1;;;42516:49:0;;;;;;;;;;;;-1:-1:-1;;;42516:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42584:18:0;;;;;;:8;:18;;;;;:24;;;42576:50;;;;;-1:-1:-1;;;42576:50:0;;;;;;;;;;;;-1:-1:-1;;;42576:50:0;;;;;;;;;;;;;;;42645:11;;-1:-1:-1;;;42645:11:0;;;;42637:43;;;;;-1:-1:-1;;;42637:43:0;;;;;;;;;;;;-1:-1:-1;;;42637:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42719:26:0;;;42693:23;42719:26;;;:8;:26;;;;;;42783:27;;;;;;;42854:17;;;;;42849:38;;1841:6;2693:8;;42849:38;42831:14;:56;;42823:86;;;;;-1:-1:-1;;;42823:86:0;;;;;;;;;;;;-1:-1:-1;;;42823:86:0;;;;;;;;;;;;;;;42922:20;42945:315;42997:8;:16;;;43052:8;:15;;;43106:9;:17;;;43162:9;:16;;;43217:8;;42945:13;:315::i;:::-;42922:338;;43298:8;43279:15;:27;;43271:59;;;;;-1:-1:-1;;;43271:59:0;;;;;;;;;;;;-1:-1:-1;;;43271:59:0;;;;;;;;;;;;;;;43359:313;43404:8;:16;;;43451:8;:15;;;43497:9;:17;;;43545:9;:16;;;43592:14;43637:8;;43359:14;:313::i;:::-;43343:329;;43708:11;43691:13;:28;;43683:53;;;;;-1:-1:-1;;;43683:53:0;;;;;;;;;;;;-1:-1:-1;;;43683:53:0;;;;;;;;;;;;;;;43768:37;43773:8;:16;;;43791:13;43768:4;:37::i;:::-;43749:8;:16;;:56;;;;43836:39;43841:9;:17;;;43860:14;43836:4;:39::i;:::-;43816:17;;;;:59;;;43953:16;;;44004:15;;;;;44106:16;;;;44157:8;;43905:291;;43816:59;44106:16;43905:13;:291::i;:::-;43888:308;;44233:15;44215:14;:33;;44207:61;;;;;-1:-1:-1;;;44207:61:0;;;;;;;;;;;;-1:-1:-1;;;44207:61:0;;;;;;;;;;;;;;;44305:8;44287:14;:26;;44279:54;;;;;-1:-1:-1;;;44279:54:0;;;;;;;;;;;;-1:-1:-1;;;44279:54:0;;;;;;;;;;;;;;;44371:35;44376:13;44391:14;44371:4;:35::i;:::-;44352:15;:54;;44344:82;;;;;-1:-1:-1;;;44344:82:0;;;;;;;;;;;;-1:-1:-1;;;44344:82:0;;;;;;;;;;;;;;;44444:70;;;;;;;;;;;;;;-1:-1:-1;;;;;44444:70:0;;;;;;;;44453:10;;44444:70;;;;;;;;;;;44527:51;44543:7;44552:10;44564:13;44527:15;:51::i;:::-;44589:53;44605:8;44615:10;44627:14;44589:15;:53::i;:::-;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;42222:2479:0;;;;-1:-1:-1;42222:2479:0;-1:-1:-1;;;;42222:2479:0:o;39733:2481::-;28596:39;;;;;;;28626:8;28596:39;;;;;;-1:-1:-1;;;;28614:10:0;;28605:7;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28596:39:0;;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;40037:17:0;;-1:-1:-1;40037:17:0;;;:8;:17;;;;;:23;28734:13;40037:23;40029:49;;;;;-1:-1:-1;;;40029:49:0;;;;;;;;;;;;-1:-1:-1;;;40029:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40097:18:0;;;;;;:8;:18;;;;;:24;;;40089:50;;;;;-1:-1:-1;;;40089:50:0;;;;;;;;;;;;-1:-1:-1;;;40089:50:0;;;;;;;;;;;;;;;40158:11;;-1:-1:-1;;;40158:11:0;;;;40150:43;;;;;-1:-1:-1;;;40150:43:0;;;;;;;;;;;;-1:-1:-1;;;40150:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40232:26:0;;;40206:23;40232:26;;;:8;:26;;;;;;40296:27;;;;;;;40366:16;;;;40361:36;;2643:1;1841:6;2636:8;;40361:36;40344:13;:53;;40336:82;;;;;-1:-1:-1;;;40336:82:0;;;;;;;;;;;;-1:-1:-1;;;40336:82:0;;;;;;;;;;;;;;;40431:20;40454:315;40506:8;:16;;;40561:8;:15;;;40615:9;:17;;;40671:9;:16;;;40726:8;;40454:13;:315::i;:::-;40431:338;;40807:8;40788:15;:27;;40780:59;;;;;-1:-1:-1;;;40780:59:0;;;;;;;;;;;;-1:-1:-1;;;40780:59:0;;;;;;;;;;;;;;;40869:312;40914:8;:16;;;40961:8;:15;;;41007:9;:17;;;41055:9;:16;;;41102:13;41146:8;;40869:14;:312::i;:::-;40852:329;;41218:12;41200:14;:30;;41192:56;;;;;-1:-1:-1;;;41192:56:0;;;;;;;;;;;;-1:-1:-1;;;41192:56:0;;;;;;;;;;;;;;;41280:37;41285:8;:16;;;41303:13;41280:4;:37::i;:::-;41261:8;:16;;:56;;;;41348:39;41353:9;:17;;;41372:14;41348:4;:39::i;:::-;41328:17;;;;:59;;;41465:16;;;41516:15;;;;;41618:16;;;;41669:8;;41417:291;;41328:59;41618:16;41417:13;:291::i;:::-;41400:308;;41745:15;41727:14;:33;;41719:61;;;;;-1:-1:-1;;;41719:61:0;;;;;;;;;;;;-1:-1:-1;;;41719:61:0;;;;;;;;;;;;;;;41817:8;41799:14;:26;;41791:54;;;;;-1:-1:-1;;;41791:54:0;;;;;;;;;;;;-1:-1:-1;;;41791:54:0;;;;;;;;;;;;;;;41883:35;41888:13;41903:14;41883:4;:35::i;:::-;41864:15;:54;;41856:82;;;;;-1:-1:-1;;;41856:82:0;;;;;;;;;;;;-1:-1:-1;;;41856:82:0;;;;;;;;;;;;;;;41956:70;;;;;;;;;;;;;;-1:-1:-1;;;;;41956:70:0;;;;;;;;41965:10;;41956:70;;;;;;;;;;;42039:51;42055:7;42064:10;42076:13;42039:15;:51::i;:::-;42101:53;42117:8;42127:10;42139:14;42101:15;:53::i;25694:1283::-;25941:17;26031:21;26055:33;26060:14;26076:11;26055:4;:33::i;:::-;26031:57;;26171:8;26182:28;1841:6;26193:16;26182:4;:28::i;:::-;26171:39;;26221:8;26232:18;26237:3;26242:7;26232:4;:18::i;:::-;26221:29;;26261:32;26296:37;26301:14;26317:15;1841:6;26328:3;26317:4;:15::i;26296:37::-;26261:72;;26346:23;26372:50;26377:15;26394:27;26372:4;:50::i;:::-;26346:76;;26433:18;26454:41;26459:18;26479:15;26454:4;:41::i;:::-;26433:62;;26575:14;26592:37;26597:13;26612:16;26592:4;:37::i;:::-;26575:54;;26640:18;26661:27;26666:9;26677:10;26661:4;:27::i;:::-;26640:48;;26699:29;26731:31;26736:10;26748:13;26731:4;:31::i;:::-;26699:63;;26887:52;26892:24;26918:20;1841:6;2114:1;26918:4;:20::i;26887:52::-;26872:67;-1:-1:-1;;;;;;;;;;25694:1283:0;;;;;;;;:::o;18831:1166::-;19075:18;19359:21;19383:32;19388:13;19403:11;19383:4;:32::i;:::-;19359:56;;19426:8;19437:43;19442:28;1841:6;19453:16;19442:4;:28::i;:::-;19472:7;19437:4;:43::i;:::-;19426:54;;19491:26;19520:36;19525:13;19540:15;1841:6;19551:3;19540:4;:15::i;:::-;19520:4;:36::i;:::-;19491:65;;19569:22;19594:43;19599:14;19615:21;19594:4;:43::i;:::-;19569:68;;19648:17;19668:39;19673:17;19692:14;19668:4;:39::i;:::-;19648:59;;19788:14;19805:36;19810:12;19824:16;19805:4;:36::i;:::-;19788:53;;19852:18;19873:27;19878:9;19889:10;19873:4;:27::i;:::-;19852:48;;19927:31;19932:13;19947:10;19927:4;:31::i;:::-;19911:47;18831:1166;-1:-1:-1;;;;;;;;;;;;;;18831:1166:0:o;2290:54::-;2338:6;1841;2331:13;;23319:1256;23564:19;23601:21;23625:33;23630:14;23646:11;23625:4;:33::i;:::-;23601:57;;23766:29;23798:40;23803:12;23817:20;1841:6;2114:1;23817:4;:20::i;23798:40::-;23766:72;;23849:18;23870:42;23875:10;23887:24;23870:4;:42::i;:::-;23849:63;;23923:14;23940:31;23945:13;23960:10;23940:4;:31::i;:::-;23923:48;;24039:18;24060:45;24065:9;24076:28;1841:6;24087:16;24076:4;:28::i;:::-;24060:4;:45::i;:::-;24039:66;;24116:23;24142:36;24147:13;24162:15;24142:4;:36::i;:::-;24116:62;;24191:32;24226:41;24231:15;24248:18;24226:4;:41::i;:::-;24191:76;;24403:8;24414:43;24419:28;1841:6;24430:16;24419:4;:28::i;24414:43::-;24403:54;;24485:50;24490:27;24519:15;1841:6;24530:3;24519:4;:15::i;36414:225::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;36517:15:0;;-1:-1:-1;36517:15:0;;;:8;:15;;;;;:21;28734:13;36517:21;36509:47;;;;;-1:-1:-1;;;36509:47:0;;;;;;;;;;;;-1:-1:-1;;;36509:47:0;;;;;;;;;;;;;;;36593:38;;;-1:-1:-1;;;36593:38:0;;36625:4;36593:38;;;;;;-1:-1:-1;;;;;36593:23:0;;;-1:-1:-1;;36593:38:0;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;36593:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36593:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36593:38:0;-1:-1:-1;;;;;36567:15:0;;;;;;;;:8;36593:38;36567:15;;;;:23;;:64;28770:6;:14;;-1:-1:-1;;28770:14:0;;;36414:225::o;29729:111::-;29822:10;;;;29729:111;:::o;31999:202::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;32127:11;;-1:-1:-1;;;;;32127:11:0;32113:10;:25;32105:56;;;;;-1:-1:-1;;;32105:56:0;;;;;;;;;;;;-1:-1:-1;;;32105:56:0;;;;;;;;;;;;;;;32172:11;:21;;-1:-1:-1;;;;;;32172:21:0;-1:-1:-1;;;;;32172:21:0;;;;;;;;;;28770:6;:14;;-1:-1:-1;;28770:14:0;;;31999:202::o;30697:148::-;28842:6;;30796:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;30825:12:0;;30697:148;:::o;2353:51::-;2394:10;2353:51;:::o;30463:226::-;28842:6;;30570:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30602:15:0;;;;;;:8;:15;;;;;:21;;;30594:47;;;;;-1:-1:-1;;;30594:47:0;;;;;;;;;;;;-1:-1:-1;;;30594:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30659:15:0;;;;;:8;:15;;;;;:22;;;;30463:226::o;10225:87::-;10297:7;10290:14;;;;;;;;;;;;;-1:-1:-1;;10290:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;10264:13;;10290:14;;10297:7;;10290:14;;;10297:7;10290:14;;;;;;;;;;;;;;;;;;;;;;;;2651:59;2692:18;2651:59;:::o;920:121::-;-1:-1:-1;;;;920:121:0:o;13913:509::-;14125:14;14157:10;14170:35;14175:14;14191:13;14170:4;:35::i;:::-;14157:48;;14216:10;14229:37;14234:15;14251:14;14229:4;:37::i;:::-;14216:50;;14277:10;14290:18;14295:5;14302;14290:4;:18::i;:::-;14277:31;;14319:10;14332:31;1841:6;14343:19;1841:6;14354:7;14343:4;:19::i;14332:31::-;14319:44;;14395:18;14400:5;14407;14395:4;:18::i;:::-;14383:30;13913:509;-1:-1:-1;;;;;;;;;;13913:509:0:o;11601:133::-;11660:4;11677:27;11683:10;11695:3;11700;11677:5;:27::i;:::-;-1:-1:-1;11722:4:0;11601:133;;;;:::o;38601:1122::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;38743:10;;28734:13;38743:10;38735:40;;;;;-1:-1:-1;;;38735:40:0;;;;;;;;;;;;-1:-1:-1;;;38735:40:0;;;;;;;;;;;;;;;38788:14;38805:13;:11;:13::i;:::-;38788:30;;38829:12;38844:28;38849:12;2114:1;38844:4;:28::i;:::-;38829:43;;38883:20;38906:27;38911:12;38925:7;38906:4;:27::i;:::-;38883:50;;38944:10;38957:32;38962:15;38979:9;38957:4;:32::i;:::-;38944:45;-1:-1:-1;39008:10:0;39000:38;;;;;-1:-1:-1;;;39000:38:0;;;;;;;;;;;;-1:-1:-1;;;39000:38:0;;;;;;;;;;;;;;;39051:40;39066:10;39078:12;39051:14;:40::i;:::-;39117:8;;39102:33;;39117:8;;;-1:-1:-1;;;;;39117:8:0;39127:7;39102:14;:33::i;:::-;39146:31;39161:15;39146:14;:31::i;:::-;39195:6;39190:524;39211:7;:14;39207:18;;39190:524;;;39247:9;39259:7;39267:1;39259:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39259:10:0;39295:11;;;:8;:11;;;;;;:19;;;39259:10;;-1:-1:-1;39295:19:0;39351:16;39356:5;39295:19;39351:4;:16::i;:::-;39329:38;-1:-1:-1;39390:19:0;39382:47;;;;;-1:-1:-1;;;39382:47:0;;;;;;;;;;;;-1:-1:-1;;;39382:47:0;;;;;;;;;;;;;;;39470:13;;39484:1;39470:16;;;;;;;;;;;;;39452:14;:34;;39444:60;;;;;-1:-1:-1;;;39444:60:0;;;;;;;;;;;;-1:-1:-1;;;39444:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39546:11:0;;;;;;:8;:11;;;;;:19;;;39541:41;;39567:14;39541:4;:41::i;:::-;-1:-1:-1;;;;;39519:11:0;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;39602:39;;;;;;;39519:11;;39611:10;;39602:39;;;;;;;;;;39656:46;39672:1;39675:10;39687:14;39656:15;:46::i;:::-;-1:-1:-1;;;39227:3:0;;39190:524;;;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;;;;;;38601:1122:0:o;1905:42::-;1946:1;1905:42;:::o;1856:::-;1897:1;1856:42;:::o;2413:46::-;2454:5;2413:46;:::o;15440:683::-;15682:19;15719:16;15738:35;15743:13;15758:14;15738:4;:35::i;:::-;15719:54;;15784:15;15802:19;1841:6;15813:7;15802:4;:19::i;:::-;15784:37;;15845:31;15850:13;15865:10;15845:4;:31::i;:::-;15832:44;;15887:6;15896:54;15901:14;15917:32;15922:14;15938:10;15917:4;:32::i;15896:54::-;15887:63;;15961:8;15972:20;15977:1;15980:11;15972:4;:20::i;:::-;15961:31;;16003:8;16014:15;1841:6;16025:3;16014:4;:15::i;:::-;16003:26;;16057;16062:15;16079:3;16057:4;:26::i;:::-;16040:43;15440:683;-1:-1:-1;;;;;;;;;;;;15440:683:0:o;2016:50::-;2064:2;1841:6;2057:9;;2466:59;2507:18;2466:59;:::o;30254:201::-;28842:6;;30341:23;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;30390:10;;;;30382:40;;;;;-1:-1:-1;;;30382:40:0;;;;;;;;;;;;-1:-1:-1;;;30382:40:0;;;;;;;;;;;;;;;30440:7;30433:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30433:14:0;;;-1:-1:-1;30433:14:0;;;;;;;;;;;;;;;;;;30254:201;:::o;2073:42::-;2114:1;2073:42;:::o;30103:143::-;28842:6;;30183:23;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;29979:116;30073:7;:14;29979:116;:::o;35288:1041::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;35409:11;;-1:-1:-1;;;;;35409:11:0;35395:10;:25;35387:56;;;;;-1:-1:-1;;;35387:56:0;;;;;;;;;;;;-1:-1:-1;;;35387:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35462:15:0;;;;;;:8;:15;;;;;:21;;;35454:47;;;;;-1:-1:-1;;;35454:47:0;;;;;;;;;;;;-1:-1:-1;;;35454:47:0;;;;;;;;;;;;;;;35521:10;;;;35520:11;35512:40;;;;;-1:-1:-1;;;35512:40:0;;;;;;;;;;;;-1:-1:-1;;;35512:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35585:15:0;;35565:17;35585:15;;;:8;:15;;;;;:23;;;;35639:28;35585:23;35565:17;35639:4;:28::i;:::-;35700:12;;-1:-1:-1;;;;;35714:15:0;;;;;;:8;:15;;;;;:22;;;35619:48;;-1:-1:-1;35695:42:0;;:4;:42::i;:::-;35680:12;:57;-1:-1:-1;;;;;35860:15:0;;35847:10;35860:15;;;:8;:15;;;;;-1:-1:-1;35860:21:0;;35904:7;:14;;-1:-1:-1;;35904:18:0;;;:7;:18;;35950:13;;;;;;;;;;;;;;;;35933:7;:14;;-1:-1:-1;;;;;35950:13:0;;;;35941:5;;35933:14;;;;;;;;;;;;;;:30;;-1:-1:-1;;;;;;35933:30:0;-1:-1:-1;;;;;35933:30:0;;;;;;;;;;;35983:7;:14;;36007:5;;35974:8;;35933:14;;36007:5;;35983:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35983:14:0;35974:24;;;;;;;;;;;;-1:-1:-1;35974:30:0;:38;36023:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;36023:13:0;;;;;;;-1:-1:-1;;;;;;36023:13:0;;;;;;;;;36065:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36047:15:0;;;;:8;:15;;;;;;;:136;;;;-1:-1:-1;;36047:136:0;;;;;;;;;-1:-1:-1;36047:136:0;;;;;;;;;;;;;;36196:68;36047:15;36219:10;36231:32;36236:12;36250;36231:4;:32::i;36196:68::-;36298:8;;36275:46;;36291:5;;36298:8;;;-1:-1:-1;;;;;36298:8:0;36308:12;36275:15;:46::i;31360:128::-;28842:6;;31443:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;31472:8:0;;31360:128;:::o;10936:252::-;11066:10;11003:4;11055:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11055:27:0;;;;;;;;;;11050:38;;11084:3;11050:4;:38::i;:::-;11031:10;11020:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11020:27:0;;;;;;;;;;;:68;;;11104:54;;;;;;;-1:-1:-1;;11020:27:0;;11104:54;;;;11020:22;-1:-1:-1;11020:22:0;-1:-1:-1;;;;;11104:54:0;;;;;;;;;;-1:-1:-1;11176:4:0;10936:252;;;;:::o;10410:120::-;-1:-1:-1;;;;;10502:15:0;;;10478:4;10502:15;;;-1:-1:-1;10502:15:0;;;;;;;;:20;;;;;;;;;;;;;10410:120::o;32909:732::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;33117:11;;-1:-1:-1;;;;;33117:11:0;33103:10;:25;33095:56;;;;;-1:-1:-1;;;33095:56:0;;;;;;;;;;;;-1:-1:-1;;;33095:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33171:15:0;;;;;;:8;:15;;;;;:21;;;33170:22;33162:47;;;;;-1:-1:-1;;;33162:47:0;;;;;;;;;;;;-1:-1:-1;;;33162:47:0;;;;;;;;;;;;;;;33229:10;;;;33228:11;33220:40;;;;;-1:-1:-1;;;33220:40:0;;;;;;;;;;;;-1:-1:-1;;;33220:40:0;;;;;;;;;;;;;;;33281:7;:14;1946:1;-1:-1:-1;33273:60:0;;;;;-1:-1:-1;;;33273:60:0;;;;;;;;;;;;-1:-1:-1;;;33273:60:0;;;;;;;;;;;;;;;33364:198;;;;;;;;33393:4;33364:198;;;33419:7;:14;;33364:198;;;;;;;-1:-1:-1;33364:198:0;;;;;;;;;;;;-1:-1:-1;;;;;33346:15:0;;;;;:8;:15;;;;;;:216;;;;-1:-1:-1;;33346:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;33573:19:0;;;;;;;-1:-1:-1;;;;;;33573:19:0;;;;;;33603:30;33346:15;33617:7;33626:6;33603;:30::i;:::-;32909:732;;;:::o;2595:49::-;2643:1;1841:6;2636:8;;30853:275;28842:6;;30958:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30990:15:0;;;;;;:8;:15;;;;;:21;;;30982:47;;;;;-1:-1:-1;;;30982:47:0;;;;;;;;;;;;-1:-1:-1;;;30982:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31054:15:0;;31040:11;31054:15;;;:8;:15;;;;;:22;;;31107:12;;31094:26;;31054:22;;31094:4;:26::i;:::-;31087:33;30853:275;-1:-1:-1;;;30853:275:0:o;31136:216::-;28842:6;;31232:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31264:15:0;;;;;;:8;:15;;;;;:21;;;31256:47;;;;;-1:-1:-1;;;31256:47:0;;;;;;;;;;;;-1:-1:-1;;;31256:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31321:15:0;;;;;:8;:15;;;;;:23;;;;31136:216::o;17141:672::-;17384:18;17420:16;17439:35;17444:14;17460:13;17439:4;:35::i;:::-;17420:54;;17485:9;17497:37;17502:15;17519:14;17497:4;:37::i;:::-;17485:49;;17545:6;17554:27;17559:15;17576:4;17554;:27::i;:::-;17545:36;;17592:8;17603:20;17608:1;17611:11;17603:4;:20::i;:::-;17592:31;;17640:15;17645:3;1841:6;17640:4;:15::i;:::-;17634:21;;17682:19;1841:6;17693:7;17682:4;:19::i;:::-;17666:35;;17728:46;17733:25;17738:14;17754:3;17733:4;:25::i;:::-;17760:13;17728:4;:46::i;:::-;17712:62;17141:672;-1:-1:-1;;;;;;;;;;;17141:672:0:o;29608:113::-;29702:11;;-1:-1:-1;;;29702:11:0;;;;;29608:113::o;4336:311::-;4407:4;4439:5;;;4463:6;;;:21;;;4483:1;4478;4473:2;:6;;;;;;:11;4463:21;4455:50;;;;;-1:-1:-1;;;4455:50:0;;;;;;;;;;;;-1:-1:-1;;;4455:50:0;;;;;;;;;;;;;;;4532:8;4526:15;;4560:8;;;;4552:37;;;;;-1:-1:-1;;;4552:37:0;;;;;;;;;;;;-1:-1:-1;;;4552:37:0;;;;;;;;;;;;;;;4600:7;1841:6;4610:2;:9;;;4336:311;-1:-1:-1;;;;;;4336:311:0:o;3895:202::-;3966:4;3989:6;3997:9;4010:14;4019:1;4022;4010:8;:14::i;:::-;3988:36;;;;4044:4;4043:5;4035:35;;;;;-1:-1:-1;;;4035:35:0;;;;;;;;;;;;-1:-1:-1;;;4035:35:0;;;;;;;;;;;;;;;-1:-1:-1;4088:1:0;3895:202;-1:-1:-1;;;3895:202:0:o;50478:112::-;50563:19;50569:4;50575:6;50563:5;:19::i;:::-;50478:112;;:::o;50814:92::-;50885:13;50891:6;50885:5;:13::i;:::-;50814:92;:::o;50598:108::-;50681:17;50687:2;50691:6;50681:5;:17::i;50274:196::-;50385:34;;;-1:-1:-1;;;50385:34:0;;-1:-1:-1;;;;;50385:34:0;;;;;;;;;;;;;;;-1:-1:-1;;50385:22:0;;;-1:-1:-1;;50385:34:0;;;;;;;;;;;;;;-1:-1:-1;50385:22:0;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;50385:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50385:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50385:34:0;;-1:-1:-1;50385:34:0;50430:32;;;;;-1:-1:-1;;;50430:32:0;;;;;;;;;;;;-1:-1:-1;;;50430:32:0;;;;;;;;;;;;;;;50274:196;;;;:::o;9465:273::-;-1:-1:-1;;;;;9544:13:0;;:8;:13;;;;;;;;;;;-1:-1:-1;;9544:20:0;9536:53;;;;;-1:-1:-1;;;9536:53:0;;;;;;;;;;;;-1:-1:-1;;;9536:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9621:13:0;;:8;:13;;;;;;;;;;;9616:24;;9636:3;9616:4;:24::i;:::-;-1:-1:-1;;;;;9600:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9672:13;;;;;;;9667:24;;9687:3;9667:4;:24::i;:::-;-1:-1:-1;;;;;9651:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9707:23;;;;;;;9651:13;;9707:23;;;;;;;;;;;;;9465:273;;;:::o;3707:180::-;3778:4;3809:5;;;3833:6;;;;3825:35;;;;;-1:-1:-1;;;3825:35:0;;;;;;;;;;;;-1:-1:-1;;;3825:35:0;;;;;;;;;;;;;;50047:219;50160:55;;;-1:-1:-1;;;50160:55:0;;-1:-1:-1;;;;;50160:55:0;;;;;;;50201:4;50160:55;;;;;;;;;;;;-1:-1:-1;;50160:26:0;;;-1:-1:-1;;50160:55:0;;;;;;;;;;;;;;-1:-1:-1;50160:26:0;:55;;;5:2:-1;;;;30:1;27;20:12;50714:92:0;50785:13;50791:6;50785:5;:13::i;4655:387::-;4726:4;4756:6;4748:31;;;;;-1:-1:-1;;;4748:31:0;;;;;;;;;;;;-1:-1:-1;;;4748:31:0;;;;;;;;;;;;;;;1841:6;4800:8;;4827:6;;;:24;;;1841:6;4842:1;4837:2;:6;;;;;;:14;4827:24;4819:53;;;;;-1:-1:-1;;;4819:53:0;;;;;;;;;;;;-1:-1:-1;;;4819:53:0;;;;;;;;;;;;;;;4920:1;4916:5;;4910:12;;4941:8;;;;4933:37;;;;;-1:-1:-1;;;4933:37:0;;;;;;;;;;;;-1:-1:-1;;;4933:37:0;;;;;;;;;;;;;;;4998:7;5013:1;5008:2;:6;;;;5545:552;5621:4;2454:5;5651:4;:21;;5643:55;;;;;-1:-1:-1;;;5643:55:0;;;;;;;;;;;;-1:-1:-1;;;5643:55:0;;;;;;;;;;;;;;;2507:18;5717:21;;;5709:56;;;;;-1:-1:-1;;;5709:56:0;;;;;;;;;;;;-1:-1:-1;;;5709:56:0;;;;;;;;;;;;;;;5778:10;5792:11;5799:3;5792:6;:11::i;:::-;5778:25;;5814:11;5828:16;5833:3;5838:5;5828:4;:16::i;:::-;5814:30;;5857:13;5873:24;5879:4;5885:11;5890:5;5885:4;:11::i;:::-;5873:5;:24::i;:::-;5857:40;-1:-1:-1;5914:11:0;5910:59;;5949:8;-1:-1:-1;5942:15:0;;-1:-1:-1;;5942:15:0;5910:59;5981:18;6002:40;6013:4;6019:6;2573:13;6002:10;:40::i;:::-;5981:61;;6060:29;6065:8;6075:13;6060:4;:29::i;:::-;6053:36;5545:552;-1:-1:-1;;;;;;;5545:552:0:o;4105:223::-;4180:4;4186;4217:1;4212;:6;4208:113;;-1:-1:-1;;4243:5:0;;;4250;4235:21;;4208:113;-1:-1:-1;;4297:5:0;;;4304:4;4208:113;4105:223;;;;;:::o;9848:98::-;9907:31;9913:4;9927;9934:3;9907:5;:31::i;9165:292::-;9235:4;9218:8;:23;;;;;;;;;;;:30;-1:-1:-1;9218:30:0;9210:63;;;;;-1:-1:-1;;;9210:63:0;;;;;;;;;;;;-1:-1:-1;;;9210:63:0;;;;;;;;;;;;;;;9332:4;9315:8;:23;;;;;;;;;;;9310:34;;9340:3;9310:4;:34::i;:::-;9301:4;9284:8;:23;;;;;;;;;;:60;9375:12;;9370:23;;9389:3;9370:4;:23::i;:::-;9355:12;:38;9409:40;;;;;;;;9441:1;;9426:4;;9409:40;;;;;;;;;9165:292;:::o;9746:94::-;9803:29;9817:4;9824:2;9828:3;9803:5;:29::i;8939:218::-;9032:4;9015:8;:23;;;;;;;;;;;9010:34;;9040:3;9010:4;:34::i;:::-;9001:4;8984:8;:23;;;;;;;;;;:60;9075:12;;9070:23;;9089:3;9070:4;:23::i;:::-;9055:12;:38;9109:40;;;;;;;;9138:4;;9126:1;;9109:40;;;;;;;;;8939:218;:::o;3583:116::-;3648:4;1841:6;3677:7;3682:1;3677:4;:7::i;:::-;:14;;3583:116;-1:-1:-1;;3583:116:0:o;3467:108::-;1841:6;3559:8;;;3467:108::o;5070:314::-;5142:4;;5177:1;5173;:5;:21;;1841:6;5173:21;;;5186:1;5173:21;5164:30;-1:-1:-1;5217:1:0;5212:6;;;;5207:151;5220:6;;5207:151;;5255:10;5260:1;5263;5255:4;:10::i;:::-;5251:14;-1:-1:-1;5290:1:0;5286;:5;:10;5282:65;;5321:10;5326:1;5329;5321:4;:10::i;:::-;5317:14;;5282:65;5233:1;5228:6;;;;5207:151;;6105:1079;6203:4;6258:3;6203:4;;6295:20;6304:4;1841:6;6295:8;:20::i;:::-;6272:43;;-1:-1:-1;6272:43:0;-1:-1:-1;1841:6:0;;6326:9;6659:1;6645:509;6670:9;6662:4;:17;6645:509;;6701:9;1841:6;6713:1;:8;6701:20;;6737:6;6745:9;6758:29;6767:1;6770:16;6775:4;1841:6;6770:4;:16::i;:::-;6758:8;:29::i;:::-;6736:51;;;;6809:22;6814:4;6820:10;6825:1;6828;6820:4;:10::i;6809:22::-;6802:29;;6853:16;6858:4;6864;6853;:16::i;:::-;6846:23;-1:-1:-1;6888:9:0;6884:20;;6899:5;;;;;6884:20;6925:4;6921:30;;;6942:9;;;6921:30;6970:4;6966:30;;;6987:9;;;6966:30;7015:8;7011:132;;;7050:15;7055:3;7060:4;7050;:15::i;:::-;7044:21;;7011:132;;;7112:15;7117:3;7122:4;7112;:15::i;:::-;7106:21;;7011:132;-1:-1:-1;;;6681:3:0;;6645:509;;;-1:-1:-1;7173:3:0;;6105:1079;-1:-1:-1;;;;;;;;;6105:1079:0:o
Swarm Source
bzzr://febbe73d4127aeb7ee537d2f2af0a6025927436167402edd6b6943b9fc9857bc
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.