Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 9,474 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 20721447 | 109 days ago | IN | 0 ETH | 0.00014365 | ||||
Approve | 20500143 | 140 days ago | IN | 0 ETH | 0.00004497 | ||||
Approve | 20141917 | 190 days ago | IN | 0 ETH | 0.00010925 | ||||
Exitswap Pool Am... | 19833572 | 233 days ago | IN | 0 ETH | 0.00120041 | ||||
Transfer | 19831024 | 233 days ago | IN | 0 ETH | 0.00065373 | ||||
Exitswap Pool Am... | 19675347 | 255 days ago | IN | 0 ETH | 0.00479679 | ||||
Approve | 19657312 | 258 days ago | IN | 0 ETH | 0.0001956 | ||||
Approve | 18907828 | 363 days ago | IN | 0 ETH | 0.00027295 | ||||
Approve | 18559941 | 411 days ago | IN | 0 ETH | 0.00070776 | ||||
Exit Pool | 18484296 | 422 days ago | IN | 0 ETH | 0.00501754 | ||||
Approve | 17636918 | 541 days ago | IN | 0 ETH | 0.00069595 | ||||
Approve | 17587446 | 548 days ago | IN | 0 ETH | 0.00125683 | ||||
Approve | 17587445 | 548 days ago | IN | 0 ETH | 0.00116083 | ||||
Approve | 17309599 | 587 days ago | IN | 0 ETH | 0.00113022 | ||||
Approve | 17011542 | 629 days ago | IN | 0 ETH | 0.00053082 | ||||
Approve | 17009666 | 629 days ago | IN | 0 ETH | 0.00046491 | ||||
Approve | 16944879 | 638 days ago | IN | 0 ETH | 0.00060093 | ||||
Approve | 16622816 | 684 days ago | IN | 0 ETH | 0.00049464 | ||||
Exitswap Pool Am... | 16221567 | 740 days ago | IN | 0 ETH | 0.00162216 | ||||
Approve | 15695595 | 813 days ago | IN | 0 ETH | 0.00016187 | ||||
Approve | 15664707 | 817 days ago | IN | 0 ETH | 0.00019294 | ||||
Approve | 15589711 | 828 days ago | IN | 0 ETH | 0.0008754 | ||||
Approve | 15444970 | 850 days ago | IN | 0 ETH | 0.00047042 | ||||
Exit Pool | 15288721 | 875 days ago | IN | 0 ETH | 0.00011315 | ||||
Approve | 15266733 | 878 days ago | IN | 0 ETH | 0.00020458 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
10815298 | 1573 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
BPool
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity Multiple files format)
// 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; import "./BToken.sol"; import "./BMath.sol"; 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_DRAIN_RESERVES( 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); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex); _; } 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; uint private _reservesRatio; bool private _finalized; address[] private _tokens; mapping(address=>Record) private _records; mapping(address=>uint) public totalReserves; uint private _totalWeight; constructor() public { _controller = msg.sender; _factory = msg.sender; _swapFee = MIN_FEE; _reservesRatio = DEFAULT_RESERVES_RATIO; _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); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].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); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getReservesRatio() external view _viewlock_ returns (uint) { return _reservesRatio; } function getController() external view _viewlock_ returns (address) { return _controller; } function setSwapFee(uint swapFee) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); require(swapFee >= MIN_FEE); require(swapFee <= MAX_FEE); _swapFee = swapFee; } function setReservesRatio(uint reservesRatio) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); require(reservesRatio <= BONE); _reservesRatio = reservesRatio; } function setController(address manager) external _logs_ _lock_ { require(msg.sender == _controller); _controller = manager; } function setPublicSwap(bool public_) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); _publicSwap = public_; } function finalize() external _logs_ _lock_ { require(msg.sender == _controller); require(!_finalized); require(_tokens.length >= MIN_BOUND_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); require(!_records[token].bound); require(!_finalized); require(_tokens.length < MAX_BOUND_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); require(_records[token].bound); require(!_finalized); require(denorm >= MIN_WEIGHT); require(denorm <= MAX_WEIGHT); require(balance >= MIN_BALANCE); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= MAX_TOTAL_WEIGHT); } 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); require(_records[token].bound); require(!_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); _records[token].balance = IERC20(token).balanceOf(address(this)); } function seize(address token, uint amount) external _logs_ _lock_ { require(msg.sender == _controller); require(!_records[token].bound); uint bal = IERC20(token).balanceOf(address(this)); require(amount <= bal); _pushUnderlying(token, msg.sender, amount); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound); require(_records[tokenOut].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); require(_records[tokenOut].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); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0); 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); require(tokenAmountIn <= maxAmountsIn[i]); _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); uint poolTotal = totalSupply(); uint exitFee = bmul(poolAmountIn, EXIT_FEE); uint pAiAfterExitFee = bsub(poolAmountIn, exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0); _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); require(tokenAmountOut >= minAmountsOut[i]); _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); require(_records[tokenOut].bound); require(_publicSwap); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO)); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut); uint tokenAmountOutZeroFee = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, 0 ); uint reserves = calcReserves( tokenAmountOutZeroFee, tokenAmountOut, _reservesRatio ); inRecord.balance = badd(inRecord.balance, tokenAmountIn); // Subtract `reserves`. outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore); require(spotPriceAfter <= maxPrice); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut)); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves); _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); require(_records[tokenOut].bound); require(_publicSwap); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO)); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); require(tokenAmountIn <= maxAmountIn); uint tokenAmountInZeroFee = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, 0 ); uint reserves = calcReserves( tokenAmountIn, tokenAmountInZeroFee, _reservesRatio ); // Subtract `reserves` which is reserved for admin. inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore); require(spotPriceAfter <= maxPrice); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut)); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); _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); require(_records[tokenIn].bound); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO)); Record storage inRecord = _records[tokenIn]; uint reserves; (poolAmountOut, reserves) = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, _swapFee, _reservesRatio ); require(poolAmountOut >= minPoolAmountOut); inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); _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); require(_records[tokenIn].bound); Record storage inRecord = _records[tokenIn]; tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee ); require(tokenAmountIn != 0); require(tokenAmountIn <= maxAmountIn); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO)); uint tokenAmountInZeroFee = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, 0 ); uint reserves = calcReserves( tokenAmountIn, tokenAmountInZeroFee, _reservesRatio ); inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); _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); require(_records[tokenOut].bound); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO)); uint tokenAmountOutZeroFee = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, 0 ); uint reserves = calcReserves( tokenAmountOutZeroFee, tokenAmountOut, _reservesRatio ); outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves); _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); require(_records[tokenOut].bound); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO)); Record storage outRecord = _records[tokenOut]; uint reserves; (poolAmountIn, reserves) = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee, _reservesRatio ); require(poolAmountIn != 0); require(poolAmountIn <= maxPoolAmountIn); outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return poolAmountIn; } function drainTotalReserves(address reservesAddress) external _logs_ _lock_ { require(msg.sender == _factory); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint tokenAmountOut = totalReserves[t]; totalReserves[t] = 0; emit LOG_DRAIN_RESERVES(reservesAddress, t, tokenAmountOut); _pushUnderlying(t, reservesAddress, tokenAmountOut); } } // == // '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); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer); } 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); } }
// 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"); } }
// 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; import "./BColor.sol"; 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 DEFAULT_RESERVES_RATIO = BONE / 5; 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; }
// 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; import "./BNum.sol"; 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, uint reservesRatio ) public pure returns (uint poolAmountOut, uint reserves) { // 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); // Exact fee portion of `tokenAmountIn`, i.e. (1- Wt) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz)); reserves = calcReserves(tokenAmountIn, tokenAmountInAfterFee, reservesRatio); 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, reserves); } /********************************************************************************************** // 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, uint reservesRatio ) public pure returns (uint poolAmountIn, uint reserves) { // charge swap fee on the output token side uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); uint zar = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar)); reserves = calcReserves(tokenAmountOutBeforeSwapFee, tokenAmountOut, reservesRatio); 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, reserves); } // `swapFeeAndReserves = amountWithFee - amountWithoutFee` is the swap fee in balancer. // We divide `swapFeeAndReserves` into halves, `actualSwapFee` and `reserves`. // `reserves` goes to the admin and `actualSwapFee` still goes to the liquidity // providers. function calcReserves(uint amountWithFee, uint amountWithoutFee, uint reservesRatio) internal pure returns (uint reserves) { require(amountWithFee >= amountWithoutFee); require(reservesRatio <= BONE); uint swapFeeAndReserves = bsub(amountWithFee, amountWithoutFee); reserves = bmul(swapFeeAndReserves, reservesRatio); require(swapFeeAndReserves >= reserves); } }
// 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; import "./BConst.sol"; 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); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag); 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); uint c1 = c0 + (BONE / 2); require(c1 >= c0); uint c2 = c1 / BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0); // 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); require(base <= MAX_BPOW_BASE); 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; } }
// 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; import "./BNum.sol"; // 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); _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); _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 = "Cream Pool Token"; string private _symbol = "CRPT"; 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]); _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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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_DRAIN_RESERVES","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":"DEFAULT_RESERVES_RATIO","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"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"reserves","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"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"reserves","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":"address","name":"reservesAddress","type":"address"}],"name":"drainTotalReserves","outputs":[],"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":[],"name":"getReservesRatio","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":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seize","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":"reservesRatio","type":"uint256"}],"name":"setReservesRatio","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":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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
60c0604052601060808190527f437265616d20506f6f6c20546f6b656e0000000000000000000000000000000060a0908152620000409160039190620000fe565b506040805180820190915260048082527f43525054000000000000000000000000000000000000000000000000000000006020909201918252620000859181620000fe565b506005805460ff19166012179055348015620000a057600080fd5b50600680546005805462010000600160b01b031916336201000081029190911790915564e8d4a510006007556702c68af0bb1400006008556001600160a01b03199091161760ff60a01b191690556009805460ff19169055620001a3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014157805160ff191683800117855562000171565b8280016001018555821562000171579182015b828111156200017157825182559160200191906001019062000154565b506200017f92915062000183565b5090565b620001a091905b808211156200017f57600081556001016200018a565b90565b61427280620001b36000396000f3fe608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b610448611093565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611129565b604080519115158252519081900360200190f35b61042e61117e565b61042e6004803603604081101561051b57600080fd5b506001600160a01b038135811691602001351661118b565b61042e6004803603604081101561054957600080fd5b506001600160a01b038135811691602001351661123a565b61042e6112e0565b61042e6112e6565b61042e6112fa565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611306565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356113b3565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166114cd565b61061e6114eb565b604080516001600160a01b039092168252519081900360200190f35b610642611513565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b503561151c565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b0381351690602081013590604001356115ff565b61042e600480360360608110156106bf57600080fd5b506001600160a01b03813516906020810135906040013561183b565b610675600480360360208110156106f157600080fd5b50351515611a8f565b610675611b64565b61042e611c74565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611c93565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611e5d565b61042e600480360360608110156107d057600080fd5b506001600160a01b038135169060208101359060400135611f10565b6104e96004803603604081101561080257600080fd5b506001600160a01b038135169060200135612117565b61042e6004803603606081101561082e57600080fd5b506001600160a01b0381351690602081013590604001356121ef565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612407565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612419565b61042e612434565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612446565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561273b565b61042e612a15565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612a29565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316612ad9565b6104e9612c1f565b610675600480360360208110156109a557600080fd5b50356001600160a01b0316612c28565b61042e612cf3565b61042e612d12565b61042e612d1f565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316612d2f565b610448612d8b565b61042e612dec565b61042e612df8565b61042e600480360360a0811015610a2157600080fd5b5080359060208101359060408101359060608101359060800135612e05565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135612e6a565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316612e80565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050612fc6565b61042e6131dd565b61067560048036036020811015610b2557600080fd5b50356131e2565b61042e6132b3565b61042e6132b8565b61042e600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a001356132bd565b61042e61333e565b61042e61334e565b610b8f61335a565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e6133e0565b610b8f6133e5565b61042e6133fd565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b0316613403565b61042e61369f565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356136be565b61042e60048036036040811015610c6757600080fd5b506001600160a01b038135811691602001351661373f565b61067560048036036060811015610c9557600080fd5b506001600160a01b03813516906020810135906040013561376a565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356138d9565b61042e613a3d565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316613a4d565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b0316613abb565b61042e600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613b17565b6104e9613b9a565b6000806000610d838988613baa565b90506000610da2610d9c670de0b6b3a764000084613c10565b87613c36565b90506000610dc188610dbc670de0b6b3a764000085613c10565b613baa565b9050610dce818988613c82565b93506000610ddc8d83613c10565b90506000610dea828f613baa565b90506000610df88287613ccd565b90506000610e06828f613c36565b90506000610e148f83613c10565b9050610e2d81610dbc670de0b6b3a76400006000613c10565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610ed957600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16610efe57600080fd5b6001600160a01b0384166000908152600b60205260409020600390810154610f3391670de0b6b3a76400005b04600101613c36565b831115610f3f57600080fd5b6000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002090506000610f8982600301548360020154600254600d5489600754600854610d74565b909350905082610f9857600080fd5b83831115610fa557600080fd5b610fbc610fb6836003015487613c10565b82613c10565b60038301556000610fcd8482613c36565b6040805188815290519192506001600160a01b0389169133916000805160206141fe833981519152919081900360200190a36001600160a01b0387166000908152600c60205260409020546110229083613d5a565b6001600160a01b0388166000908152600c60205260409020556110453385613d6c565b6110576110528583613c10565b613d7a565b600554611073906201000090046001600160a01b031682613d86565b61107e873388613d90565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b820191906000526020600020905b81548152906001019060200180831161110257829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b0387168085529083528184208690558151868152915193949093909260008051602061421e833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111a357600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166111c857600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166111ed57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946112319492939290612e05565b95945050505050565b600554600090610100900460ff161561125257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661127757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661129c57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682529020600380830154600280850154928401549084015460075461123194929190612e05565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60008060006113158988613baa565b9050600061132e610d9c670de0b6b3a764000084613c10565b9050600061134d88611348670de0b6b3a764000085613c10565b613c36565b905061135a888288613c82565b935060006113688d83613d5a565b90506000611376828f613baa565b905060006113848287613ccd565b90506000611392828f613c36565b905061139e818f613c10565b98505050505050505097509795505050505050565b6000336001600160a01b03851614806113ef57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113f857600080fd5b611403848484613e21565b336001600160a01b0385161480159061144157506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114c3576001600160a01b03841660009081526001602090815260408083203384529091529020546114749083613c10565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905580519485525192871693919260008051602061421e8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561150357600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561159257600080fd5b6005805461ff00191661010017905560095460ff16156115b157600080fd5b6006546001600160a01b031633146115c857600080fd5b64e8d4a510008110156115da57600080fd5b67016345785d8a00008111156115ef57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561167557600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461169d57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166116c257600080fd5b60095460ff16156116d257600080fd5b670de0b6b3a76400008110156116e757600080fd5b6802b5e3af16b18800008111156116fd57600080fd5b620f424082101561170d57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561176557611746600d546117418484613c10565b613d5a565b600d8190556802b5e3af16b1880000101561176057600080fd5b611786565b8082101561178657611782600d5461177d8385613c10565b613c10565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156117cf576117ca85336117c58785613c10565b613ee0565b611829565b808410156118295760006117e38286613c10565b905060006117f2826000613c36565b905061180887336118038585613c10565b613d90565b6005546118269088906201000090046001600160a01b031683613d90565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118b357600080fd5b6005805461ff00191661010017905560095460ff166118d157600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166118f657600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461193094939291908990612a29565b91508282101561193f57600080fd5b6001600160a01b0385166000908152600b6020526040902060039081015461196f91670de0b6b3a7640000610f2a565b82111561197b57600080fd5b600061199882600301548360020154600254600d54896000612a29565b905060006119a98285600854613c82565b90506119bc610fb6846003015486613c10565b600384015560006119cd8782613c36565b6040805187815290519192506001600160a01b038a169133916000805160206141fe833981519152919081900360200190a36001600160a01b0388166000908152600c6020526040902054611a229083613d5a565b6001600160a01b0389166000908152600c6020526040902055611a453388613d6c565b611a526110528883613c10565b600554611a6e906201000090046001600160a01b031682613d86565b611a79883387613d90565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611b0557600080fd5b6005805461ff00191661010017905560095460ff1615611b2457600080fd5b6006546001600160a01b03163314611b3b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611bda57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611c0257600080fd5b60095460ff1615611c1257600080fd5b600a5460021115611c2257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611c5468056bc75e2d63100000613f39565b611c673368056bc75e2d63100000613d86565b6005805461ff0019169055565b600554600090610100900460ff1615611c8c57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611d0957600080fd5b6005805461ff00191661010017905560095460ff16611d2757600080fd5b6000611d316112e0565b90506000611d3f8583613baa565b905080611d4b57600080fd5b60005b600a54811015611e49576000600a8281548110611d6757fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090611d9c8583613c36565b905080611da857600080fd5b878785818110611db457fe5b90506020020135811115611dc757600080fd5b6001600160a01b0383166000908152600b6020526040902060030154611ded9082613d5a565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141be8339815191529281900390910190a3611e3e833383613ee0565b505050600101611d4e565b50611e5385613f39565b6118293386613d86565b600080611e6a8786613baa565b90506000611e788786613d5a565b90506000611e868289613baa565b90506000611e9c670de0b6b3a764000085613baa565b90506000611eaa8383613ccd565b90506000611eb8828e613c36565b90506000611ec6828f613c10565b90506000611ee5611edf670de0b6b3a76400008a613c10565b8b613c36565b9050611efd82610dbc670de0b6b3a764000084613c10565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f8857600080fd5b6005805461ff00191661010017905560095460ff16611fa657600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16611fcb57600080fd5b6001600160a01b0384166000908152600b6020526040902060030154611ffd906002670de0b6b3a76400005b04613c36565b83111561200957600080fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061205382600301548360020154600254600d5489600754600854611306565b90935090508383101561206557600080fd5b612076610fb6836003015487613d5a565b60038301556040805186815290516001600160a01b0388169133916000805160206141be8339815191529181900360200190a36001600160a01b0386166000908152600c60205260409020546120cc9082613d5a565b6001600160a01b0387166000908152600c60205260409020556120ee83613f39565b6120f83384613d86565b612103863387613ee0565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561216c573360009081526001602090815260408083206001600160a01b038816845290915281205561219b565b6121768184613c10565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020548151908152905192939260008051602061421e833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561226757600080fd5b6005805461ff00191661010017905560095460ff1661228557600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166122aa57600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d546007546122e494939291908990611e5d565b9150816122f057600080fd5b828211156122fd57600080fd5b6001600160a01b0385166000908152600b602052604090206003015461232d906002670de0b6b3a7640000611ff7565b82111561233957600080fd5b600061235682600301548360020154600254600d54896000611e5d565b905060006123678483600854613c82565b905061237a610fb6846003015486613d5a565b60038401556040805185815290516001600160a01b0389169133916000805160206141be8339815191529181900360200190a36001600160a01b0387166000908152600c60205260409020546123d09082613d5a565b6001600160a01b0388166000908152600c60205260409020556123f286613f39565b6123fc3387613d86565b61107e873386613ee0565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a76400006112f6565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ad57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166124e157600080fd5b6001600160a01b0385166000908152600b602052604090205460ff1661250657600080fd5b600654600160a01b900460ff1661251c57600080fd5b6001600160a01b038088166000908152600b60205260408082209288168252902060038082015461255591670de0b6b3a7640000610f2a565b86111561256157600080fd5b60006125828360030154846002015484600301548560020154600754612e05565b90508581111561259157600080fd5b6125b183600301548460020154846003015485600201548b600754613b17565b9450888511156125c057600080fd5b60006125e184600301548560020154856003015486600201548c6000613b17565b905060006125f28783600854613c82565b9050612605610fb6866003015489613d5a565b856003018190555061261b84600301548a613c10565b60038086018290558601546002808801549087015460075461263e949190612e05565b95508286101561264d57600080fd5b8786111561265a57600080fd5b612664878a613baa565b83111561267057600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788a8d604051808381526020018281526020019250505060405180910390a46001600160a01b038c166000908152600c60205260409020546126f09082613d5a565b6001600160a01b038d166000908152600c60205260409020556127148c3389613ee0565b61271f8a338b613d90565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127a257600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166127d657600080fd5b6001600160a01b0385166000908152600b602052604090205460ff166127fb57600080fd5b600654600160a01b900460ff1661281157600080fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600382015461284b906002670de0b6b3a7640000611ff7565b88111561285757600080fd5b60006128788360030154846002015484600301548560020154600754612e05565b90508581111561288757600080fd5b6128a783600301548460020154846003015485600201548d6007546132bd565b9450868510156128b657600080fd5b60006128d784600301548560020154856003015486600201548e60006132bd565b905060006128e88288600854613c82565b90506128f885600301548c613d5a565b8560030181905550612911610fb6856003015489613c10565b600380860182905586015460028088015490870154600754612934949190612e05565b95508286101561294357600080fd5b8786111561295057600080fd5b61295a8b88613baa565b83111561296657600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788e8b604051808381526020018281526020019250505060405180910390a46001600160a01b038a166000908152600c60205260409020546129e69082613d5a565b6001600160a01b038b166000908152600c6020526040902055612a0a8c338d613ee0565b61271f8a3389613d90565b64e8d4a51000670de0b6b3a76400006112f6565b600080612a368786613baa565b90506000612a5185611348670de0b6b3a76400006000613c10565b90506000612a5f8883613c10565b90506000612a6d828a613baa565b90506000612a8c82612a87670de0b6b3a764000088613baa565b613ccd565b90506000612a9a828e613c36565b90506000612aa88e83613c10565b90506000612ac1611edf670de0b6b3a76400008a613c10565b9050611efd82611348670de0b6b3a764000084613c10565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b4f57600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff16612b8357600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015612bc957600080fd5b505afa158015612bdd573d6000803e3d6000fd5b505050506040513d6020811015612bf357600080fd5b50516001600160a01b039091166000908152600b60205260409020600301556005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c9e57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614612cc657600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615612d0b57600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a76400006112f6565b600554600090610100900460ff1615612d4757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16612d6c57600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b600080612e128787613baa565b90506000612e208686613baa565b90506000612e2e8383613baa565b90506000612e50670de0b6b3a7640000610dbc670de0b6b3a764000089613c10565b9050612e5c8282613c36565b9a9950505050505050505050565b6000612e77338484613e21565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612ef657600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314612f2357600080fd5b60005b600a54811015612fb7576000600a8281548110612f3f57fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3612fad828583613d90565b5050600101612f26565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303c57600080fd5b6005805461ff00191661010017905560095460ff1661305a57600080fd5b60006130646112e0565b90506000613073856000613c36565b905060006130818683613c10565b9050600061308f8285613baa565b90508061309b57600080fd5b6130a53388613d6c565b6005546130c1906201000090046001600160a01b031684613d86565b6130ca82613d7a565b60005b600a548110156131c8576000600a82815481106130e657fe5b60009182526020808320909101546001600160a01b0316808352600b90915260408220600301549092509061311b8583613c36565b90508061312757600080fd5b89898581811061313357fe5b9050602002013581101561314657600080fd5b6001600160a01b0383166000908152600b602052604090206003015461316c9082613c10565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141fe8339815191529281900390910190a36131bd833383613d90565b5050506001016130cd565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561325857600080fd5b6005805461ff00191661010017905560095460ff161561327757600080fd5b6006546001600160a01b0316331461328e57600080fd5b670de0b6b3a76400008111156132a357600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806132ca8786613baa565b905060006132e0670de0b6b3a764000085613c10565b90506132ec8582613c36565b905060006132fe8a610dbc8c85613d5a565b9050600061330c8285613ccd565b90506000613322670de0b6b3a764000083613c10565b905061332e8a82613c36565b9c9b505050505050505050505050565b600a670de0b6b3a76400006112f6565b671bc16d674ec7ffff81565b600554606090610100900460ff161561337257600080fd5b60095460ff1661338157600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561111f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133b9575050505050905090565b600081565b600554606090610100900460ff161561338157600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561347957600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146134a157600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166134c657600080fd5b60095460ff16156134d657600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906134fd8282613c36565b600d546001600160a01b0385166000908152600b602052604090206002015491925061352891613c10565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061355c57fe5b600091825260209091200154600a80546001600160a01b03909216918490811061358257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106135c257fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a8054806135f557fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561368185336118038787613c10565b6005546118299086906201000090046001600160a01b031685613d90565b600554600090610100900460ff16156136b757600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546136ec9083613d5a565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020859055805194855251919360008051602061421e833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146137e257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561380857600080fd5b60095460ff161561381857600080fd5b600a5460081161382757600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556138d48383836115ff565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561394f57600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461397757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff161561399d57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156139e757600080fd5b505afa1580156139fb573d6000803e3d6000fd5b505050506040513d6020811015613a1157600080fd5b5051905080821115613a2257600080fd5b613a2d833384613d90565b50506005805461ff001916905550565b6002670de0b6b3a76400006112f6565b600554600090610100900460ff1615613a6557600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613a8a57600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d54613ab4908290613baa565b9392505050565b600554600090610100900460ff1615613ad357600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613af857600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080613b248588613baa565b90506000613b328786613c10565b90506000613b408883613baa565b90506000613b4e8285613ccd565b9050613b6281670de0b6b3a7640000613c10565b9050613b76670de0b6b3a764000087613c10565b9450613b8b613b858c83613c36565b86613baa565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b600081613bb657600080fd5b670de0b6b3a76400008302831580613bde5750670de0b6b3a7640000848281613bdb57fe5b04145b613be757600080fd5b60028304810181811015613bfa57600080fd5b6000848281613c0557fe5b049695505050505050565b6000806000613c1f8585613f42565b915091508015613c2e57600080fd5b509392505050565b6000828202831580613c50575082848281613c4d57fe5b04145b613c5957600080fd5b6706f05b59d3b20000810181811015613c7157600080fd5b6000670de0b6b3a764000082613c05565b600082841015613c9157600080fd5b670de0b6b3a7640000821115613ca657600080fd5b6000613cb28585613c10565b9050613cbe8184613c36565b915081811015613c2e57600080fd5b60006001831015613cdd57600080fd5b671bc16d674ec7ffff831115613cf257600080fd5b6000613cfd83613f67565b90506000613d0b8483613c10565b90506000613d2186613d1c85613f82565b613f90565b905081613d32579250611178915050565b6000613d4387846305f5e100613fe7565b9050613d4f8282613c36565b979650505050505050565b600082820183811015613ab457600080fd5b613d7682826140c5565b5050565b613d83816140d0565b50565b613d76828261414f565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015613de357600080fd5b505af1158015613df7573d6000803e3d6000fd5b505050506040513d6020811015613e0d57600080fd5b5051905080613e1b57600080fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115613e4657600080fd5b6001600160a01b038316600090815260208190526040902054613e699082613c10565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613e989082613d5a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206141de83398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015613de357600080fd5b613d838161415a565b600080828410613f585750508082036000613f60565b505081810360015b9250929050565b6000670de0b6b3a7640000613f7b83613f82565b0292915050565b670de0b6b3a7640000900490565b60008060028306613fa957670de0b6b3a7640000613fab565b835b90506002830492505b8215613ab457613fc48485613c36565b93506002830615613fdc57613fd98185613c36565b90505b600283049250613fb4565b6000828180613ffe87670de0b6b3a7640000613f42565b9092509050670de0b6b3a764000080600060015b8884106140b6576000670de0b6b3a7640000820290506000806140468a61404185670de0b6b3a7640000613c10565b613f42565b9150915061405887611348848c613c36565b96506140648784613baa565b965086614073575050506140b6565b871561407d579315935b8015614087579315935b841561409e576140978688613c10565b95506140ab565b6140a88688613d5a565b95505b505050600101614012565b50909998505050505050505050565b613d76823083613e21565b306000908152602081905260409020548111156140ec57600080fd5b306000908152602081905260409020546141069082613c10565b306000908152602081905260409020556002546141239082613c10565b60025560408051828152905160009130916000805160206141de8339815191529181900360200190a350565b613d76308383613e21565b306000908152602081905260409020546141749082613d5a565b306000908152602081905260409020556002546141919082613d5a565b60025560408051828152905130916000916000805160206141de8339815191529181900360200190a35056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820993ab7d9193add493b90f3fbc114d124f2515ee3286bb646c67d794789a25cb064736f6c634300050c0032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b610448611093565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611129565b604080519115158252519081900360200190f35b61042e61117e565b61042e6004803603604081101561051b57600080fd5b506001600160a01b038135811691602001351661118b565b61042e6004803603604081101561054957600080fd5b506001600160a01b038135811691602001351661123a565b61042e6112e0565b61042e6112e6565b61042e6112fa565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611306565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356113b3565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166114cd565b61061e6114eb565b604080516001600160a01b039092168252519081900360200190f35b610642611513565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b503561151c565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b0381351690602081013590604001356115ff565b61042e600480360360608110156106bf57600080fd5b506001600160a01b03813516906020810135906040013561183b565b610675600480360360208110156106f157600080fd5b50351515611a8f565b610675611b64565b61042e611c74565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611c93565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611e5d565b61042e600480360360608110156107d057600080fd5b506001600160a01b038135169060208101359060400135611f10565b6104e96004803603604081101561080257600080fd5b506001600160a01b038135169060200135612117565b61042e6004803603606081101561082e57600080fd5b506001600160a01b0381351690602081013590604001356121ef565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612407565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612419565b61042e612434565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612446565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561273b565b61042e612a15565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612a29565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316612ad9565b6104e9612c1f565b610675600480360360208110156109a557600080fd5b50356001600160a01b0316612c28565b61042e612cf3565b61042e612d12565b61042e612d1f565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316612d2f565b610448612d8b565b61042e612dec565b61042e612df8565b61042e600480360360a0811015610a2157600080fd5b5080359060208101359060408101359060608101359060800135612e05565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135612e6a565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316612e80565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050612fc6565b61042e6131dd565b61067560048036036020811015610b2557600080fd5b50356131e2565b61042e6132b3565b61042e6132b8565b61042e600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a001356132bd565b61042e61333e565b61042e61334e565b610b8f61335a565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e6133e0565b610b8f6133e5565b61042e6133fd565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b0316613403565b61042e61369f565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356136be565b61042e60048036036040811015610c6757600080fd5b506001600160a01b038135811691602001351661373f565b61067560048036036060811015610c9557600080fd5b506001600160a01b03813516906020810135906040013561376a565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356138d9565b61042e613a3d565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316613a4d565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b0316613abb565b61042e600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613b17565b6104e9613b9a565b6000806000610d838988613baa565b90506000610da2610d9c670de0b6b3a764000084613c10565b87613c36565b90506000610dc188610dbc670de0b6b3a764000085613c10565b613baa565b9050610dce818988613c82565b93506000610ddc8d83613c10565b90506000610dea828f613baa565b90506000610df88287613ccd565b90506000610e06828f613c36565b90506000610e148f83613c10565b9050610e2d81610dbc670de0b6b3a76400006000613c10565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610ed957600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16610efe57600080fd5b6001600160a01b0384166000908152600b60205260409020600390810154610f3391670de0b6b3a76400005b04600101613c36565b831115610f3f57600080fd5b6000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002090506000610f8982600301548360020154600254600d5489600754600854610d74565b909350905082610f9857600080fd5b83831115610fa557600080fd5b610fbc610fb6836003015487613c10565b82613c10565b60038301556000610fcd8482613c36565b6040805188815290519192506001600160a01b0389169133916000805160206141fe833981519152919081900360200190a36001600160a01b0387166000908152600c60205260409020546110229083613d5a565b6001600160a01b0388166000908152600c60205260409020556110453385613d6c565b6110576110528583613c10565b613d7a565b600554611073906201000090046001600160a01b031682613d86565b61107e873388613d90565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b820191906000526020600020905b81548152906001019060200180831161110257829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b0387168085529083528184208690558151868152915193949093909260008051602061421e833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111a357600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166111c857600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166111ed57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946112319492939290612e05565b95945050505050565b600554600090610100900460ff161561125257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661127757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661129c57600080fd5b6001600160a01b038084166000908152600b602052604080822092851682529020600380830154600280850154928401549084015460075461123194929190612e05565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60008060006113158988613baa565b9050600061132e610d9c670de0b6b3a764000084613c10565b9050600061134d88611348670de0b6b3a764000085613c10565b613c36565b905061135a888288613c82565b935060006113688d83613d5a565b90506000611376828f613baa565b905060006113848287613ccd565b90506000611392828f613c36565b905061139e818f613c10565b98505050505050505097509795505050505050565b6000336001600160a01b03851614806113ef57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113f857600080fd5b611403848484613e21565b336001600160a01b0385161480159061144157506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114c3576001600160a01b03841660009081526001602090815260408083203384529091529020546114749083613c10565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905580519485525192871693919260008051602061421e8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561150357600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561159257600080fd5b6005805461ff00191661010017905560095460ff16156115b157600080fd5b6006546001600160a01b031633146115c857600080fd5b64e8d4a510008110156115da57600080fd5b67016345785d8a00008111156115ef57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561167557600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461169d57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166116c257600080fd5b60095460ff16156116d257600080fd5b670de0b6b3a76400008110156116e757600080fd5b6802b5e3af16b18800008111156116fd57600080fd5b620f424082101561170d57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561176557611746600d546117418484613c10565b613d5a565b600d8190556802b5e3af16b1880000101561176057600080fd5b611786565b8082101561178657611782600d5461177d8385613c10565b613c10565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156117cf576117ca85336117c58785613c10565b613ee0565b611829565b808410156118295760006117e38286613c10565b905060006117f2826000613c36565b905061180887336118038585613c10565b613d90565b6005546118269088906201000090046001600160a01b031683613d90565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118b357600080fd5b6005805461ff00191661010017905560095460ff166118d157600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166118f657600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461193094939291908990612a29565b91508282101561193f57600080fd5b6001600160a01b0385166000908152600b6020526040902060039081015461196f91670de0b6b3a7640000610f2a565b82111561197b57600080fd5b600061199882600301548360020154600254600d54896000612a29565b905060006119a98285600854613c82565b90506119bc610fb6846003015486613c10565b600384015560006119cd8782613c36565b6040805187815290519192506001600160a01b038a169133916000805160206141fe833981519152919081900360200190a36001600160a01b0388166000908152600c6020526040902054611a229083613d5a565b6001600160a01b0389166000908152600c6020526040902055611a453388613d6c565b611a526110528883613c10565b600554611a6e906201000090046001600160a01b031682613d86565b611a79883387613d90565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611b0557600080fd5b6005805461ff00191661010017905560095460ff1615611b2457600080fd5b6006546001600160a01b03163314611b3b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611bda57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611c0257600080fd5b60095460ff1615611c1257600080fd5b600a5460021115611c2257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611c5468056bc75e2d63100000613f39565b611c673368056bc75e2d63100000613d86565b6005805461ff0019169055565b600554600090610100900460ff1615611c8c57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611d0957600080fd5b6005805461ff00191661010017905560095460ff16611d2757600080fd5b6000611d316112e0565b90506000611d3f8583613baa565b905080611d4b57600080fd5b60005b600a54811015611e49576000600a8281548110611d6757fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090611d9c8583613c36565b905080611da857600080fd5b878785818110611db457fe5b90506020020135811115611dc757600080fd5b6001600160a01b0383166000908152600b6020526040902060030154611ded9082613d5a565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141be8339815191529281900390910190a3611e3e833383613ee0565b505050600101611d4e565b50611e5385613f39565b6118293386613d86565b600080611e6a8786613baa565b90506000611e788786613d5a565b90506000611e868289613baa565b90506000611e9c670de0b6b3a764000085613baa565b90506000611eaa8383613ccd565b90506000611eb8828e613c36565b90506000611ec6828f613c10565b90506000611ee5611edf670de0b6b3a76400008a613c10565b8b613c36565b9050611efd82610dbc670de0b6b3a764000084613c10565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f8857600080fd5b6005805461ff00191661010017905560095460ff16611fa657600080fd5b6001600160a01b0384166000908152600b602052604090205460ff16611fcb57600080fd5b6001600160a01b0384166000908152600b6020526040902060030154611ffd906002670de0b6b3a76400005b04613c36565b83111561200957600080fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061205382600301548360020154600254600d5489600754600854611306565b90935090508383101561206557600080fd5b612076610fb6836003015487613d5a565b60038301556040805186815290516001600160a01b0388169133916000805160206141be8339815191529181900360200190a36001600160a01b0386166000908152600c60205260409020546120cc9082613d5a565b6001600160a01b0387166000908152600c60205260409020556120ee83613f39565b6120f83384613d86565b612103863387613ee0565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561216c573360009081526001602090815260408083206001600160a01b038816845290915281205561219b565b6121768184613c10565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020548151908152905192939260008051602061421e833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561226757600080fd5b6005805461ff00191661010017905560095460ff1661228557600080fd5b6001600160a01b0384166000908152600b602052604090205460ff166122aa57600080fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d546007546122e494939291908990611e5d565b9150816122f057600080fd5b828211156122fd57600080fd5b6001600160a01b0385166000908152600b602052604090206003015461232d906002670de0b6b3a7640000611ff7565b82111561233957600080fd5b600061235682600301548360020154600254600d54896000611e5d565b905060006123678483600854613c82565b905061237a610fb6846003015486613d5a565b60038401556040805185815290516001600160a01b0389169133916000805160206141be8339815191529181900360200190a36001600160a01b0387166000908152600c60205260409020546123d09082613d5a565b6001600160a01b0388166000908152600c60205260409020556123f286613f39565b6123fc3387613d86565b61107e873386613ee0565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a76400006112f6565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ad57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166124e157600080fd5b6001600160a01b0385166000908152600b602052604090205460ff1661250657600080fd5b600654600160a01b900460ff1661251c57600080fd5b6001600160a01b038088166000908152600b60205260408082209288168252902060038082015461255591670de0b6b3a7640000610f2a565b86111561256157600080fd5b60006125828360030154846002015484600301548560020154600754612e05565b90508581111561259157600080fd5b6125b183600301548460020154846003015485600201548b600754613b17565b9450888511156125c057600080fd5b60006125e184600301548560020154856003015486600201548c6000613b17565b905060006125f28783600854613c82565b9050612605610fb6866003015489613d5a565b856003018190555061261b84600301548a613c10565b60038086018290558601546002808801549087015460075461263e949190612e05565b95508286101561264d57600080fd5b8786111561265a57600080fd5b612664878a613baa565b83111561267057600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788a8d604051808381526020018281526020019250505060405180910390a46001600160a01b038c166000908152600c60205260409020546126f09082613d5a565b6001600160a01b038d166000908152600c60205260409020556127148c3389613ee0565b61271f8a338b613d90565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127a257600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166127d657600080fd5b6001600160a01b0385166000908152600b602052604090205460ff166127fb57600080fd5b600654600160a01b900460ff1661281157600080fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600382015461284b906002670de0b6b3a7640000611ff7565b88111561285757600080fd5b60006128788360030154846002015484600301548560020154600754612e05565b90508581111561288757600080fd5b6128a783600301548460020154846003015485600201548d6007546132bd565b9450868510156128b657600080fd5b60006128d784600301548560020154856003015486600201548e60006132bd565b905060006128e88288600854613c82565b90506128f885600301548c613d5a565b8560030181905550612911610fb6856003015489613c10565b600380860182905586015460028088015490870154600754612934949190612e05565b95508286101561294357600080fd5b8786111561295057600080fd5b61295a8b88613baa565b83111561296657600080fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788e8b604051808381526020018281526020019250505060405180910390a46001600160a01b038a166000908152600c60205260409020546129e69082613d5a565b6001600160a01b038b166000908152600c6020526040902055612a0a8c338d613ee0565b61271f8a3389613d90565b64e8d4a51000670de0b6b3a76400006112f6565b600080612a368786613baa565b90506000612a5185611348670de0b6b3a76400006000613c10565b90506000612a5f8883613c10565b90506000612a6d828a613baa565b90506000612a8c82612a87670de0b6b3a764000088613baa565b613ccd565b90506000612a9a828e613c36565b90506000612aa88e83613c10565b90506000612ac1611edf670de0b6b3a76400008a613c10565b9050611efd82611348670de0b6b3a764000084613c10565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b4f57600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff16612b8357600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015612bc957600080fd5b505afa158015612bdd573d6000803e3d6000fd5b505050506040513d6020811015612bf357600080fd5b50516001600160a01b039091166000908152600b60205260409020600301556005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c9e57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614612cc657600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615612d0b57600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a76400006112f6565b600554600090610100900460ff1615612d4757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16612d6c57600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b600080612e128787613baa565b90506000612e208686613baa565b90506000612e2e8383613baa565b90506000612e50670de0b6b3a7640000610dbc670de0b6b3a764000089613c10565b9050612e5c8282613c36565b9a9950505050505050505050565b6000612e77338484613e21565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612ef657600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314612f2357600080fd5b60005b600a54811015612fb7576000600a8281548110612f3f57fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3612fad828583613d90565b5050600101612f26565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303c57600080fd5b6005805461ff00191661010017905560095460ff1661305a57600080fd5b60006130646112e0565b90506000613073856000613c36565b905060006130818683613c10565b9050600061308f8285613baa565b90508061309b57600080fd5b6130a53388613d6c565b6005546130c1906201000090046001600160a01b031684613d86565b6130ca82613d7a565b60005b600a548110156131c8576000600a82815481106130e657fe5b60009182526020808320909101546001600160a01b0316808352600b90915260408220600301549092509061311b8583613c36565b90508061312757600080fd5b89898581811061313357fe5b9050602002013581101561314657600080fd5b6001600160a01b0383166000908152600b602052604090206003015461316c9082613c10565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233926000805160206141fe8339815191529281900390910190a36131bd833383613d90565b5050506001016130cd565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561325857600080fd5b6005805461ff00191661010017905560095460ff161561327757600080fd5b6006546001600160a01b0316331461328e57600080fd5b670de0b6b3a76400008111156132a357600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806132ca8786613baa565b905060006132e0670de0b6b3a764000085613c10565b90506132ec8582613c36565b905060006132fe8a610dbc8c85613d5a565b9050600061330c8285613ccd565b90506000613322670de0b6b3a764000083613c10565b905061332e8a82613c36565b9c9b505050505050505050505050565b600a670de0b6b3a76400006112f6565b671bc16d674ec7ffff81565b600554606090610100900460ff161561337257600080fd5b60095460ff1661338157600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561111f57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133b9575050505050905090565b600081565b600554606090610100900460ff161561338157600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561347957600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146134a157600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166134c657600080fd5b60095460ff16156134d657600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906134fd8282613c36565b600d546001600160a01b0385166000908152600b602052604090206002015491925061352891613c10565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061355c57fe5b600091825260209091200154600a80546001600160a01b03909216918490811061358257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106135c257fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a8054806135f557fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561368185336118038787613c10565b6005546118299086906201000090046001600160a01b031685613d90565b600554600090610100900460ff16156136b757600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546136ec9083613d5a565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020859055805194855251919360008051602061421e833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146137e257600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561380857600080fd5b60095460ff161561381857600080fd5b600a5460081161382757600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556138d48383836115ff565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561394f57600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461397757600080fd5b6001600160a01b0382166000908152600b602052604090205460ff161561399d57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156139e757600080fd5b505afa1580156139fb573d6000803e3d6000fd5b505050506040513d6020811015613a1157600080fd5b5051905080821115613a2257600080fd5b613a2d833384613d90565b50506005805461ff001916905550565b6002670de0b6b3a76400006112f6565b600554600090610100900460ff1615613a6557600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613a8a57600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d54613ab4908290613baa565b9392505050565b600554600090610100900460ff1615613ad357600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16613af857600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080613b248588613baa565b90506000613b328786613c10565b90506000613b408883613baa565b90506000613b4e8285613ccd565b9050613b6281670de0b6b3a7640000613c10565b9050613b76670de0b6b3a764000087613c10565b9450613b8b613b858c83613c36565b86613baa565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b600081613bb657600080fd5b670de0b6b3a76400008302831580613bde5750670de0b6b3a7640000848281613bdb57fe5b04145b613be757600080fd5b60028304810181811015613bfa57600080fd5b6000848281613c0557fe5b049695505050505050565b6000806000613c1f8585613f42565b915091508015613c2e57600080fd5b509392505050565b6000828202831580613c50575082848281613c4d57fe5b04145b613c5957600080fd5b6706f05b59d3b20000810181811015613c7157600080fd5b6000670de0b6b3a764000082613c05565b600082841015613c9157600080fd5b670de0b6b3a7640000821115613ca657600080fd5b6000613cb28585613c10565b9050613cbe8184613c36565b915081811015613c2e57600080fd5b60006001831015613cdd57600080fd5b671bc16d674ec7ffff831115613cf257600080fd5b6000613cfd83613f67565b90506000613d0b8483613c10565b90506000613d2186613d1c85613f82565b613f90565b905081613d32579250611178915050565b6000613d4387846305f5e100613fe7565b9050613d4f8282613c36565b979650505050505050565b600082820183811015613ab457600080fd5b613d7682826140c5565b5050565b613d83816140d0565b50565b613d76828261414f565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015613de357600080fd5b505af1158015613df7573d6000803e3d6000fd5b505050506040513d6020811015613e0d57600080fd5b5051905080613e1b57600080fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115613e4657600080fd5b6001600160a01b038316600090815260208190526040902054613e699082613c10565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613e989082613d5a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206141de83398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015613de357600080fd5b613d838161415a565b600080828410613f585750508082036000613f60565b505081810360015b9250929050565b6000670de0b6b3a7640000613f7b83613f82565b0292915050565b670de0b6b3a7640000900490565b60008060028306613fa957670de0b6b3a7640000613fab565b835b90506002830492505b8215613ab457613fc48485613c36565b93506002830615613fdc57613fd98185613c36565b90505b600283049250613fb4565b6000828180613ffe87670de0b6b3a7640000613f42565b9092509050670de0b6b3a764000080600060015b8884106140b6576000670de0b6b3a7640000820290506000806140468a61404185670de0b6b3a7640000613c10565b613f42565b9150915061405887611348848c613c36565b96506140648784613baa565b965086614073575050506140b6565b871561407d579315935b8015614087579315935b841561409e576140978688613c10565b95506140ab565b6140a88688613d5a565b95505b505050600101614012565b50909998505050505050505050565b613d76823083613e21565b306000908152602081905260409020548111156140ec57600080fd5b306000908152602081905260409020546141069082613c10565b306000908152602081905260409020556002546141239082613c10565b60025560408051828152905160009130916000805160206141de8339815191529181900360200190a350565b613d76308383613e21565b306000908152602081905260409020546141749082613d5a565b306000908152602081905260409020556002546141919082613d5a565b60025560408051828152905130916000916000805160206141de8339815191529181900360200190a35056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820993ab7d9193add493b90f3fbc114d124f2515ee3286bb646c67d794789a25cb064736f6c634300050c0032
Deployed Bytecode Sourcemap
714:25084:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;714:25084:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13426:1305:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13426:1305:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22919:1445:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22919:1445:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2803:81:5;;;:::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;2803:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3389:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3389:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1207:50:1;;;:::i;10222:447:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10222:447:4;;;;;;;;;;:::i;9769:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9769:447:4;;;;;;;;;;:::i;3297:86:5:-;;;:::i;1499:54:1:-;;;:::i;1100:45::-;;;:::i;6465:1342:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6465:1342:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4359:458:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4359:458:5;;;;;;;;;;;;;;;;;:::i;3011:118:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3011:118:4;-1:-1:-1;;;;;3011:118:4;;:::i;4651:131::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4651:131:4;;;;;;;;;;;;;;2981:80:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4788:269:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4788:269:4;;:::i;:::-;;6721:1465;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6721:1465:4;;;;;;;;;;;;;:::i;21220:1693::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21220:1693:4;;;;;;;;;;;;;:::i;5507:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5507:200:4;;;;:::i;5713:358::-;;;:::i;4511:134::-;;;:::i;10675:850::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10675:850:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10675:850:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10675:850:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;10675:850:4;;-1:-1:-1;10675:850:4;-1:-1:-1;10675:850:4;:::i;8813:1167:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;8813:1167:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18328:1285:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18328:1285:4;;;;;;;;;;;;;:::i;3829:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3829:388:5;;;;;;;;:::i;19619:1595:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19619:1595:4;;;;;;;;;;;;;:::i;2470:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2470:43:4;-1:-1:-1;;;;;2470:43:4;;:::i;3191:100:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3191:100:5;-1:-1:-1;;;;;3191:100:5;;:::i;876:53:1:-;;;:::i;15432:2889:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15432:2889:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12556:2870::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12556:2870:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1263:54:1:-;;;:::i;11086:1234:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11086:1234:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9225:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9225:201:4;-1:-1:-1;;;;;9225:201:4;;:::i;2899:106::-;;;:::i;5328:173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5328:173:4;-1:-1:-1;;;;;5328:173:4;;:::i;3783:142::-;;;:::i;1324:51:1:-;;;:::i;1039:54::-;;;:::i;3576:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3576:201:4;-1:-1:-1;;;;;3576:201:4;;:::i;2890:85:5:-;;;:::i;1615:59:1:-;;;:::i;795:117:0:-;;;:::i;1636:494:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:494:2;;;;;;;;;;;;;;;;;;;;;;:::i;4223:130:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4223:130:5;;;;;;;;:::i;24370:475:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24370:475:4;-1:-1:-1;;;;;24370:475:4;;:::i;11531:1018::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11531:1018:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11531:1018:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11531:1018:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11531:1018:4;;-1:-1:-1;11531:1018:4;-1:-1:-1;11531:1018:4;:::i;827:42:1:-;;;:::i;5064:258:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5064:258:4;;:::i;779:42:1:-;;;:::i;1382:46::-;;;:::i;3136:664:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3136:664:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;935:50:1:-;;;:::i;1434:59::-;;;:::i;3397:173:4:-;;;:::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;3397:173:4;;;;;;;;;;;;;;;;;991:42:1;;;:::i;3253:138:4:-;;;:::i;3135:112::-;;;:::i;8192:951::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8192:951:4;-1:-1:-1;;;;;8192:951:4;;:::i;4383:122::-;;;:::i;3575:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3575:248:5;;;;;;;;:::i;3067:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3067:118:5;;;;;;;;;;:::i;6078:637:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6078:637:4;;;;;;;;;;;;;:::i;9432:331::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9432:331:4;;;;;;;;:::i;1560:49:1:-;;;:::i;3931:249:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3931:249:4;-1:-1:-1;;;;;3931:249:4;;:::i;4186:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4186:191:4;-1:-1:-1;;;;;4186:191:4;;:::i;4806:653:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4806:653:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2785:108:4:-;;;:::i;13426:1305:2:-;13692:17;13711:13;13793:21;13817:33;13822:14;13838:11;13817:4;:33::i;:::-;13793:57;;13860:8;13871:43;13876:28;766:6:1;13887:16:2;13876:4;:28::i;:::-;13906:7;13871:4;:43::i;:::-;13860:54;;13924:32;13959:37;13964:14;13980:15;766:6:1;13991:3:2;13980:4;:15::i;:::-;13959:4;:37::i;:::-;13924:72;;14017;14030:27;14059:14;14075:13;14017:12;:72::i;:::-;14006:83;;14100:23;14126:50;14131:15;14148:27;14126:4;:50::i;:::-;14100:76;;14186:18;14207:41;14212:18;14232:15;14207:4;:41::i;:::-;14186:62;;14325:14;14342:37;14347:13;14362:16;14342:4;:37::i;:::-;14325:54;;14389:18;14410:27;14415:9;14426:10;14410:4;:27::i;:::-;14389:48;;14447:29;14479:31;14484:10;14496:13;14479:4;:31::i;:::-;14447:63;;14631:52;14636:24;14662:20;766:6:1;1032:1;14662:4:2;:20::i;14631:52::-;14616:67;-1:-1:-1;;;;;;;;;13426:1305:2;;;;;;;;;;:::o;22919:1445:4:-;23077:17;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;23118:10;;1827:13;23118:10;23110:19;;;;;;-1:-1:-1;;;;;23147:18:4;;;;;;:8;:18;;;;;:24;;;23139:33;;;;;;-1:-1:-1;;;;;23213:18:4;;;;;;:8;:18;;;;;:26;;;;;23208:47;;766:6:1;1657:8;;1669:5;1656:18;23208:4:4;:47::i;:::-;23190:14;:65;;23182:74;;;;;;23267:24;23294:8;:18;23303:8;-1:-1:-1;;;;;23294:18:4;-1:-1:-1;;;;;23294:18:4;;;;;;;;;;;;23267:45;;23323:13;23373:353;23427:9;:17;;;23474:9;:16;;;23520:12;;23562;;23604:14;23648:8;;23686:14;;23373:24;:353::i;:::-;23346:380;;-1:-1:-1;23346:380:4;-1:-1:-1;23745:17:4;23737:26;;;;;;23797:15;23781:12;:31;;23773:40;;;;;;23844:55;23849:39;23854:9;:17;;;23873:14;23849:4;:39::i;:::-;23890:8;23844:4;:55::i;:::-;23824:17;;;:75;23910:12;23925:28;23930:12;23910;23925:4;:28::i;:::-;23969:46;;;;;;;;23910:43;;-1:-1:-1;;;;;;23969:46:4;;;23978:10;;-1:-1:-1;;;;;;;;;;;23969:46:4;;;;;;;;;-1:-1:-1;;;;;24066:32:4;;;;;;:13;:32;;;;;;24061:48;;24100:8;24061:4;:48::i;:::-;-1:-1:-1;;;;;24026:32:4;;;;;;:13;:32;;;;;:83;24120:40;24135:10;24147:12;24120:14;:40::i;:::-;24170:43;24185:27;24190:12;24204:7;24185:4;:27::i;:::-;24170:14;:43::i;:::-;24238:8;;24223:33;;24238:8;;;-1:-1:-1;;;;;24238:8:4;24248:7;24223:14;:33::i;:::-;24266:53;24282:8;24292:10;24304:14;24266:15;:53::i;:::-;-1:-1:-1;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;22919:1445;;-1:-1:-1;;;22919:1445:4:o;2803:81:5:-;2872:5;2865:12;;;;;;;;-1:-1:-1;;2865:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2840:13;;2865:12;;2872:5;;2865:12;;2872:5;2865:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2803:81;:::o;3389:180::-;3474:10;3447:4;3463:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3463:27:5;;;;;;;;;;;:33;;;3511:30;;;;;;;3447:4;;3463:27;;3474:10;;-1:-1:-1;;;;;;;;;;;3511:30:5;;;;;;;-1:-1:-1;3558:4:5;3389:180;;;;;:::o;1207:50:1:-;1248:9;1207:50;:::o;10222:447:4:-;1929:6;;10344:14;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;10382:17:4;;;;;;:8;:17;;;;;:23;;;10374:32;;;;;;-1:-1:-1;;;;;10424:18:4;;;;;;:8;:18;;;;;:24;;;10416:33;;;;;;-1:-1:-1;;;;;10485:17:4;;;10459:23;10485:17;;;:8;:17;;;;;;10539:18;;;;;;;10588:16;;;;;10606:15;;;;;10623:17;;;;10642:16;;;;10539:18;;10574:88;;10588:16;;10606:15;10642:16;10574:13;:88::i;:::-;10567:95;10222:447;-1:-1:-1;;;;;10222:447:4:o;9769:::-;1929:6;;9884:14;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;9922:17:4;;;;;;:8;:17;;;;;:23;;;9914:32;;;;;;-1:-1:-1;;;;;9964:18:4;;;;;;:8;:18;;;;;:24;;;9956:33;;;;;;-1:-1:-1;;;;;10025:17:4;;;9999:23;10025:17;;;:8;:17;;;;;;10079:18;;;;;;;10128:16;;;;;10146:15;;;;;10163:17;;;;10182:16;;;;10200:8;;10114:95;;10146:15;10163:17;10182:16;10114:13;:95::i;3297:86:5:-;3364:12;;3297:86;:::o;1499:54:1:-;1547:6;766;1540:13;;1499:54;:::o;1100:45::-;766:6;1100:45;:::o;6465:1342:2:-;6728:18;6748:13;7021:21;7045:32;7050:13;7065:11;7045:4;:32::i;:::-;7021:56;;7149:8;7160:43;7165:28;766:6:1;7176:16:2;7165:4;:28::i;7160:43::-;7149:54;;7213:26;7242:36;7247:13;7262:15;766:6:1;7273:3:2;7262:4;:15::i;:::-;7242:4;:36::i;:::-;7213:65;;7300;7313:13;7328:21;7351:13;7300:12;:65::i;:::-;7289:76;;7375:22;7400:43;7405:14;7421:21;7400:4;:43::i;:::-;7375:68;;7453:17;7473:39;7478:17;7497:14;7473:4;:39::i;:::-;7453:59;;7590:14;7607:36;7612:12;7626:16;7607:4;:36::i;:::-;7590:53;;7653:18;7674:27;7679:9;7690:10;7674:4;:27::i;:::-;7653:48;;7727:31;7732:13;7747:10;7727:4;:31::i;:::-;7711:47;-1:-1:-1;;;;;;;;6465:1342:2;;;;;;;;;;:::o;4359:458:5:-;4435:4;4459:10;-1:-1:-1;;;;;4459:17:5;;;;:55;;-1:-1:-1;;;;;;4487:15:5;;;;;;:10;:15;;;;;;;;4503:10;4487:27;;;;;;;;4480:34;;;4459:55;4451:64;;;;;;4525:20;4531:3;4536;4541;4525:5;:20::i;:::-;4559:10;-1:-1:-1;;;;;4559:17:5;;;;;;:63;;-1:-1:-1;;;;;;4580:15:5;;;;;;:10;:15;;;;;;;;4596:10;4580:27;;;;;;;;-1:-1:-1;;4580:42:5;;4559:63;4555:235;;;-1:-1:-1;;;;;4673:15:5;;;;;;:10;:15;;;;;;;;4689:10;4673:27;;;;;;;;4668:38;;4702:3;4668:4;:38::i;:::-;-1:-1:-1;;;;;4638:15:5;;;;;;;:10;:15;;;;;;;;4654:10;4638:27;;;;;;;;;;:68;;;4725:54;;;;;;;;;;4654:10;;-1:-1:-1;;;;;;;;;;;4725:54:5;;;;;;;;;4555:235;-1:-1:-1;4806:4:5;4359:458;;;;;:::o;3011:118:4:-;-1:-1:-1;;;;;3105:11:4;3078:4;3105:11;;;:8;:11;;;;;:17;;;;3011:118::o;4651:131::-;1929:6;;4734:7;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4764:11:4;;-1:-1:-1;;;;;4764:11:4;4651:131;:::o;2981:80:5:-;3045:9;;;;2981:80;:::o;4788:269:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;4893:10;;1827:13;4893:10;4892:11;4884:20;;;;;;4936:11;;-1:-1:-1;;;;;4936:11:4;4922:10;:25;4914:34;;;;;;917:12:1;4966:18:4;;;4958:27;;;;;;976:9:1;5003:18:4;;;4995:27;;;;;;5032:8;:18;1861:6;:14;;-1:-1:-1;;1861:14:4;;;4788:269::o;6721:1465::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;6861:11;;6847:10;-1:-1:-1;;;;;6861:11:4;;;6847:25;6839:34;;;;;;-1:-1:-1;;;;;6891:15:4;;;;;;:8;:15;;;;;:21;;;6883:30;;;;;;6932:10;;;;6931:11;6923:20;;;;;;766:6:1;6962::4;:20;;6954:29;;;;;;1192:9:1;7001:20:4;;;6993:29;;;;;;1304:13:1;7040:22:4;;;7032:31;;;;;;-1:-1:-1;;;;;7136:15:4;;7119:14;7136:15;;;:8;:15;;;;;:22;;;7172:18;;;7168:275;;;7221:43;7226:12;;7240:23;7245:6;7253:9;7240:4;:23::i;:::-;7221:4;:43::i;:::-;7206:12;:58;;;1248:9:1;-1:-1:-1;7286:32:4;7278:41;;;;;;7168:275;;;7349:9;7340:6;:18;7336:107;;;7389:43;7394:12;;7408:23;7413:9;7424:6;7408:4;:23::i;:::-;7389:4;:43::i;:::-;7374:12;:58;7336:107;-1:-1:-1;;;;;7460:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7582:23;;;;7615:33;;;;7662:20;;;7658:522;;;7698:61;7714:5;7721:10;7733:25;7738:7;7747:10;7733:4;:25::i;:::-;7698:15;:61::i;:::-;7658:522;;;7790:10;7780:7;:20;7776:404;;;7893:26;7922:25;7927:10;7939:7;7922:4;:25::i;:::-;7893:54;;7961:17;7981:37;7986:21;1032:1:1;7981:4:4;:37::i;:::-;7961:57;;8032:77;8048:5;8055:10;8067:41;8072:21;8095:12;8067:4;:41::i;:::-;8032:15;:77::i;:::-;8146:8;;8123:46;;8139:5;;8146:8;;;-1:-1:-1;;;;;8146:8:4;8156:12;8123:15;:46::i;:::-;7776:404;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;;;6721:1465:4:o;21220:1693::-;21370:19;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;21413:10;;1827:13;21413:10;21405:19;;;;;;-1:-1:-1;;;;;21442:18:4;;;;;;:8;:18;;;;;:24;;;21434:33;;;;;;-1:-1:-1;;;;;21505:18:4;;21478:24;21505:18;;;:8;:18;;;;;21605:17;;;;21652:16;;;;;21698:12;;21740;;21824:8;;21551:307;;21605:17;21652:16;21698:12;21740;21782;;21551:24;:307::i;:::-;21534:324;;21895:12;21877:14;:30;;21869:39;;;;;;-1:-1:-1;;;;;21958:18:4;;;;;;:8;:18;;;;;:26;;;;;21953:47;;766:6:1;1657:8;;21953:47:4;21935:14;:65;;21927:74;;;;;;22012:26;22041:188;22079:9;:17;;;22110:9;:16;;;22140:12;;22166;;22192;22218:1;22041:24;:188::i;:::-;22012:217;;22239:13;22255:113;22281:21;22316:14;22344;;22255:12;:113::i;:::-;22239:129;;22399:55;22404:39;22409:9;:17;;;22428:14;22404:4;:39::i;22399:55::-;22379:17;;;:75;22465:12;22480:28;22485:12;22465;22480:4;:28::i;:::-;22524:46;;;;;;;;22465:43;;-1:-1:-1;;;;;;22524:46:4;;;22533:10;;-1:-1:-1;;;;;;;;;;;22524:46:4;;;;;;;;;-1:-1:-1;;;;;22621:32:4;;;;;;:13;:32;;;;;;22616:48;;22655:8;22616:4;:48::i;:::-;-1:-1:-1;;;;;22581:32:4;;;;;;:13;:32;;;;;:83;22675:40;22690:10;22702:12;22675:14;:40::i;:::-;22725:43;22740:27;22745:12;22759:7;22740:4;:27::i;22725:43::-;22793:8;;22778:33;;22793:8;;;-1:-1:-1;;;;;22793:8:4;22803:7;22778:14;:33::i;:::-;22821:53;22837:8;22847:10;22859:14;22821:15;:53::i;:::-;-1:-1:-1;;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;21220:1693;;-1:-1:-1;;;21220:1693:4:o;5507:200::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5614:10;;1827:13;5614:10;5613:11;5605:20;;;;;;5657:11;;-1:-1:-1;;;;;5657:11:4;5643:10;:25;5635:34;;;;;;5679:11;:21;;;;;-1:-1:-1;;;5679:21:4;-1:-1:-1;;;;5679:21:4;;;;;;;;;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5507:200::o;5713:358::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5816:11;;5802:10;-1:-1:-1;;;;;5816:11:4;;;5802:25;5794:34;;;;;;5847:10;;;;5846:11;5838:20;;;;;;5876:7;:14;820:1:1;-1:-1:-1;5876:34:4;5868:43;;;;;;5922:10;:17;;-1:-1:-1;;5922:17:4;5935:4;5922:17;;;5949:11;:18;;-1:-1:-1;;;;5949:18:4;-1:-1:-1;;;5949:18:4;;;5978:32;1365:10:1;5978:14:4;:32::i;:::-;6020:44;6035:10;1365::1;6020:14:4;:44::i;:::-;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5713:358::o;4511:134::-;1929:6;;4597:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4624:14:4;;4511:134;:::o;10675:850::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;10812:10;;1827:13;10812:10;10804:19;;;;;;10834:14;10851:13;:11;:13::i;:::-;10834:30;;10874:10;10887:30;10892:13;10907:9;10887:4;:30::i;:::-;10874:43;-1:-1:-1;10935:10:4;10927:19;;;;;;10962:6;10957:472;10978:7;:14;10974:18;;10957:472;;;11013:9;11025:7;11033:1;11025:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11025:10:4;11060:11;;;:8;:11;;;;;;:19;;;11025:10;;-1:-1:-1;11060:19:4;11114:16;11119:5;11060:19;11114:4;:16::i;:::-;11093:37;-1:-1:-1;11152:18:4;11144:27;;;;;;11210:12;;11223:1;11210:15;;;;;;;;;;;;;11193:13;:32;;11185:41;;;;;;-1:-1:-1;;;;;11267:11:4;;;;;;:8;:11;;;;;:19;;;11262:40;;11288:13;11262:4;:40::i;:::-;-1:-1:-1;;;;;11240:11:4;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;11321:38;;;;;;;11240:11;;11330:10;;-1:-1:-1;;;;;;;;;;;11321:38:4;;;;;;;;;11373:45;11389:1;11392:10;11404:13;11373:15;:45::i;:::-;-1:-1:-1;;;10994:3:4;;10957:472;;;;11438:29;11453:13;11438:14;:29::i;:::-;11477:41;11492:10;11504:13;11477:14;:41::i;8813:1167:2:-;9048:18;9082:21;9106:32;9111:13;9126:11;9106:4;:32::i;:::-;9082:56;;9148:18;9169:31;9174:10;9186:13;9169:4;:31::i;:::-;9148:52;;9210:14;9227:31;9232:13;9247:10;9227:4;:31::i;:::-;9210:48;;9333:8;9344:28;766:6:1;9355:16:2;9344:4;:28::i;:::-;9333:39;;9383:17;9403:20;9408:9;9419:3;9403:4;:20::i;:::-;9383:40;;9433:22;9458:34;9463:12;9477:14;9458:4;:34::i;:::-;9433:59;;9502:26;9531:39;9536:17;9555:14;9531:4;:39::i;:::-;9502:68;;9819:8;9830:43;9835:28;766:6:1;9846:16:2;9835:4;:28::i;:::-;9865:7;9830:4;:43::i;:::-;9819:54;;9899:44;9904:21;9927:15;766:6:1;9938:3:2;9927:4;:15::i;9899:44::-;9883:60;8813:1167;-1:-1:-1;;;;;;;;;;;;;;;8813:1167:2:o;18328:1285:4:-;18484:18;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;18535:10;;1827:13;18535:10;18527:19;;;;;;-1:-1:-1;;;;;18564:17:4;;;;;;:8;:17;;;;;:23;;;18556:32;;;;;;-1:-1:-1;;;;;18628:17:4;;;;;;:8;:17;;;;;:25;;;18623:45;;1608:1:1;766:6;1601:8;;18623:4:4;:45::i;:::-;18606:13;:62;;18598:71;;;;;;18680:23;18706:8;:17;18715:7;-1:-1:-1;;;;;18706:17:4;-1:-1:-1;;;;;18706:17:4;;;;;;;;;;;;18680:43;;18734:13;18785:350;18839:8;:16;;;18885:8;:15;;;18930:12;;18972;;19014:13;19057:8;;19095:14;;18785:24;:350::i;:::-;18757:378;;-1:-1:-1;18757:378:4;-1:-1:-1;19154:33:4;;;;19146:42;;;;;;19218:53;19223:37;19228:8;:16;;;19246:13;19223:4;:37::i;19218:53::-;19199:16;;;:72;19287:44;;;;;;;;-1:-1:-1;;;;;19287:44:4;;;19296:10;;-1:-1:-1;;;;;;;;;;;19287:44:4;;;;;;;;-1:-1:-1;;;;;19381:31:4;;;;;;:13;:31;;;;;;19376:47;;19414:8;19376:4;:47::i;:::-;-1:-1:-1;;;;;19342:31:4;;;;;;:13;:31;;;;;:81;19434:29;19449:13;19434:14;:29::i;:::-;19473:41;19488:10;19500:13;19473:14;:41::i;:::-;19524:51;19540:7;19549:10;19561:13;19524:15;:51::i;:::-;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;18328:1285;;-1:-1:-1;;;18328:1285:4:o;3829:388:5:-;3939:10;3896:4;3928:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3928:27:5;;;;;;;;;;3969:14;;;3965:156;;;4010:10;4029:1;3999:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3999:27:5;;;;;;;;;:31;3965:156;;;4091:19;4096:8;4106:3;4091:4;:19::i;:::-;4072:10;4061:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4061:27:5;;;;;;;;;:49;3965:156;4144:10;4161:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4135:54:5;;4161:27;;;;;;;;;;;4135:54;;;;;;;;;4144:10;-1:-1:-1;;;;;;;;;;;4135:54:5;;;;;;;;;;-1:-1:-1;4206:4:5;;3829:388;-1:-1:-1;;;3829:388:5:o;19619:1595:4:-;19769:18;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;19811:10;;1827:13;19811:10;19803:19;;;;;;-1:-1:-1;;;;;19840:17:4;;;;;;:8;:17;;;;;:23;;;19832:32;;;;;;-1:-1:-1;;;;;19901:17:4;;19875:23;19901:17;;;:8;:17;;;;;19999:16;;;;20045:15;;;;;20090:12;;20132;;20217:8;;19945:306;;19999:16;20045:15;20090:12;20132;20174:13;;19945:24;:306::i;:::-;19929:322;-1:-1:-1;20270:18:4;20262:27;;;;;;20324:11;20307:13;:28;;20299:37;;;;;;-1:-1:-1;;;;;20385:17:4;;;;;;:8;:17;;;;;:25;;;20380:45;;1608:1:1;766:6;1601:8;;20380:45:4;20363:13;:62;;20355:71;;;;;;20437:25;20465:187;20503:8;:16;;;20533:8;:15;;;20562:12;;20588;;20614:13;20641:1;20465:24;:187::i;:::-;20437:215;;20662:13;20678:111;20704:13;20731:20;20765:14;;20678:12;:111::i;:::-;20662:127;;20819:53;20824:37;20829:8;:16;;;20847:13;20824:4;:37::i;20819:53::-;20800:16;;;:72;20888:44;;;;;;;;-1:-1:-1;;;;;20888:44:4;;;20897:10;;-1:-1:-1;;;;;;;;;;;20888:44:4;;;;;;;;-1:-1:-1;;;;;20982:31:4;;;;;;:13;:31;;;;;;20977:47;;21015:8;20977:4;:47::i;:::-;-1:-1:-1;;;;;20943:31:4;;;;;;:13;:31;;;;;:81;21035:29;21050:13;21035:14;:29::i;:::-;21074:41;21089:10;21101:13;21074:14;:41::i;:::-;21125:51;21141:7;21150:10;21162:13;21125:15;:51::i;2470:43::-;;;;;;;;;;;;;:::o;3191:100:5:-;-1:-1:-1;;;;;3270:14:5;3247:4;3270:14;;;;;;;;;;;;3191:100::o;876:53:1:-;924:5;766:6;917:12;;15432:2889:4;1710:39;;;;;;;1740:8;1710:39;;;;;;15660:18;;;;1728:10;;-1:-1:-1;;;;;;1719:7:4;;;;15660:18;;1710:39;;;;;15660:18;1740:8;;15660:18;1710:39;1:33:-1;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;15723:17:4;;1827:13;15723:17;;;:8;:17;;;;;:23;1827:13;15723:23;15715:32;;;;;;-1:-1:-1;;;;;15765:18:4;;;;;;:8;:18;;;;;:24;;;15757:33;;;;;;15808:11;;-1:-1:-1;;;15808:11:4;;;;15800:20;;;;;;-1:-1:-1;;;;;15857:26:4;;;15831:23;15857:26;;;:8;:26;;;;;;15920:27;;;;;;;15989:17;;;;;15984:38;;766:6:1;1657:8;;15984:38:4;15966:14;:56;;15958:65;;;;;;16034:20;16057:309;16108:8;:16;;;16162:8;:15;;;16215:9;:17;;;16270:9;:16;;;16324:8;;16057:13;:309::i;:::-;16034:332;;16403:8;16384:15;:27;;16376:36;;;;;;16439:306;16483:8;:16;;;16529:8;:15;;;16574:9;:17;;;16621:9;:16;;;16667:14;16711:8;;16439:14;:306::i;:::-;16423:322;;16780:11;16763:13;:28;;16755:37;;;;;;16803:25;16831:299;16875:8;:16;;;16921:8;:15;;;16966:9;:17;;;17013:9;:16;;;17059:14;17103:1;16831:14;:299::i;:::-;16803:327;;17140:13;17156:111;17182:13;17209:20;17243:14;;17156:12;:111::i;:::-;17140:127;;17357:53;17362:37;17367:8;:16;;;17385:13;17362:4;:37::i;17357:53::-;17338:8;:16;;:72;;;;17440:39;17445:9;:17;;;17464:14;17440:4;:39::i;:::-;17420:17;;;;:59;;;17554:16;;;17604:15;;;;;17704:16;;;;17754:8;;17507:285;;17420:59;17704:16;17507:13;:285::i;:::-;17490:302;;17828:15;17810:14;:33;;17802:42;;;;;;17880:8;17862:14;:26;;17854:35;;;;;;17926;17931:13;17946:14;17926:4;:35::i;:::-;17907:15;:54;;17899:63;;;;;;18008:8;-1:-1:-1;;;;;17978:70:4;17999:7;-1:-1:-1;;;;;17978:70:4;17987:10;-1:-1:-1;;;;;17978:70:4;;18018:13;18033:14;17978:70;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18098:31:4;;;;;;:13;:31;;;;;;18093:47;;18131:8;18093:4;:47::i;:::-;-1:-1:-1;;;;;18059:31:4;;;;;;:13;:31;;;;;:81;18151:51;18081:7;18176:10;18188:13;18151:15;:51::i;:::-;18212:53;18228:8;18238:10;18250:14;18212:15;:53::i;:::-;-1:-1:-1;;;;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;15432:2889;;;;-1:-1:-1;15432:2889:4;-1:-1:-1;;;;15432:2889:4:o;12556:2870::-;1710:39;;;;;;;1740:8;1710:39;;;;;;12782:19;;;;1728:10;;-1:-1:-1;;;;;;1719:7:4;;;;12782:19;;1710:39;;;;;12782:19;1740:8;;12782:19;1710:39;1:33:-1;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;12847:17:4;;1827:13;12847:17;;;:8;:17;;;;;:23;1827:13;12847:23;12839:32;;;;;;-1:-1:-1;;;;;12889:18:4;;;;;;:8;:18;;;;;:24;;;12881:33;;;;;;12932:11;;-1:-1:-1;;;12932:11:4;;;;12924:20;;;;;;-1:-1:-1;;;;;12981:26:4;;;12955:23;12981:26;;;:8;:26;;;;;;13044:27;;;;;;;13112:16;;;;13107:36;;1608:1:1;766:6;1601:8;;13107:36:4;13090:13;:53;;13082:62;;;;;;13155:20;13178:309;13229:8;:16;;;13283:8;:15;;;13336:9;:17;;;13391:9;:16;;;13445:8;;13178:13;:309::i;:::-;13155:332;;13524:8;13505:15;:27;;13497:36;;;;;;13561:305;13605:8;:16;;;13651:8;:15;;;13696:9;:17;;;13743:9;:16;;;13789:13;13832:8;;13561:14;:305::i;:::-;13544:322;;13902:12;13884:14;:30;;13876:39;;;;;;13926:26;13955:298;13999:8;:16;;;14045:8;:15;;;14090:9;:17;;;14137:9;:16;;;14183:13;14226:1;13955:14;:298::i;:::-;13926:327;;14263:13;14279:113;14305:21;14340:14;14368;;14279:12;:113::i;:::-;14263:129;;14422:37;14427:8;:16;;;14445:13;14422:4;:37::i;:::-;14403:8;:16;;:56;;;;14521:55;14526:39;14531:9;:17;;;14550:14;14526:4;:39::i;14521:55::-;14501:17;;;;:75;;;14651:16;;;14701:15;;;;;14801:16;;;;14851:8;;14604:285;;14501:75;14801:16;14604:13;:285::i;:::-;14587:302;;14925:15;14907:14;:33;;14899:42;;;;;;14982:8;14964:14;:26;;14956:35;;;;;;15028;15033:13;15048:14;15028:4;:35::i;:::-;15009:15;:54;;15001:63;;;;;;15110:8;-1:-1:-1;;;;;15080:70:4;15101:7;-1:-1:-1;;;;;15080:70:4;15089:10;-1:-1:-1;;;;;15080:70:4;;15120:13;15135:14;15080:70;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15201:32:4;;;;;;:13;:32;;;;;;15196:48;;15235:8;15196:4;:48::i;:::-;-1:-1:-1;;;;;15161:32:4;;;;;;:13;:32;;;;;:83;15255:51;15271:7;15280:10;15292:13;15255:15;:51::i;:::-;15316:53;15332:8;15342:10;15354:14;15316:15;:53::i;1263:54:1:-;1311:6;766;1304:13;;11086:1234:2;11322:19;11357:21;11381:33;11386:14;11402:11;11381:4;:33::i;:::-;11357:57;;11519:29;11551:40;11556:12;11570:20;766:6:1;1032:1;11570:4:2;:20::i;11551:40::-;11519:72;;11601:18;11622:42;11627:10;11639:24;11622:4;:42::i;:::-;11601:63;;11674:14;11691:31;11696:13;11711:10;11691:4;:31::i;:::-;11674:48;;11792:18;11813:45;11818:9;11829:28;766:6:1;11840:16:2;11829:4;:28::i;:::-;11813:4;:45::i;:::-;11792:66;;11868:23;11894:36;11899:13;11914:15;11894:4;:36::i;:::-;11868:62;;11941:32;11976:41;11981:15;11998:18;11976:4;:41::i;:::-;11941:76;;12150:8;12161:43;12166:28;766:6:1;12177:16:2;12166:4;:28::i;12161:43::-;12150:54;;12232:50;12237:27;12266:15;766:6:1;12277:3:2;12266:4;:15::i;9225:201:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;-1:-1:-1;;;;;9323:15:4;;1827:13;9323:15;;;:8;:15;;;;;:21;1827:13;9323:21;9315:30;;;;;;9381:38;;;-1:-1:-1;;;9381:38:4;;9413:4;9381:38;;;;;;-1:-1:-1;;;;;9381:23:4;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9381:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9381:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9381:38:4;-1:-1:-1;;;;;9355:15:4;;;;;;;:8;9381:38;9355:15;;;;:23;;:64;1861:6;:14;;-1:-1:-1;;1861:14:4;;;9225:201::o;2899:106::-;2988:10;;;;2899:106;:::o;5328:173::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5451:11;;5437:10;-1:-1:-1;;;;;5451:11:4;;;5437:25;5429:34;;;;;;5473:11;:21;;-1:-1:-1;;;;;;5473:21:4;-1:-1:-1;;;;;5473:21:4;;;;;;;;;;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5328:173::o;3783:142::-;1929:6;;3879:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;3906:12:4;;3783:142;:::o;1324:51:1:-;1365:10;1324:51;:::o;1039:54::-;1092:1;766:6;1085:8;;3576:201:4;1929:6;;3680:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;3709:15:4;;;;;;:8;:15;;;;;:21;;;3701:30;;;;;;-1:-1:-1;;;;;;3748:15:4;;;;;:8;:15;;;;;:22;;;;3576:201::o;2890:85:5:-;2961:7;2954:14;;;;;;;;-1:-1:-1;;2954:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2929:13;;2954:14;;2961:7;;2954:14;;2961:7;2954:14;;;;;;;;;;;;;;;;;;;;;;;;1615:59:1;1656:18;1615:59;:::o;795:117:0:-;-1:-1:-1;;;795:117:0;:::o;1636:494:2:-;1840:14;1870:10;1883:35;1888:14;1904:13;1883:4;:35::i;:::-;1870:48;;1928:10;1941:37;1946:15;1963:14;1941:4;:37::i;:::-;1928:50;;1988:10;2001:18;2006:5;2013;2001:4;:18::i;:::-;1988:31;;2029:10;2042:31;766:6:1;2053:19:2;766:6:1;2064:7:2;2053:4;:19::i;2042:31::-;2029:44;;2104:18;2109:5;2116;2104:4;:18::i;:::-;2092:30;1636:494;-1:-1:-1;;;;;;;;;;1636:494:2:o;4223:130:5:-;4282:4;4298:27;4304:10;4316:3;4321;4298:5;:27::i;:::-;-1:-1:-1;4342:4:5;4223:130;;;;:::o;24370:475:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;;-1:-1:-1;;1827:13:4;;;;;;;;24506:8;;;-1:-1:-1;;;;;24506:8:4;24492:10;:22;24484:31;;;;;;24531:6;24526:313;24547:7;:14;24543:18;;24526:313;;;24582:9;24594:7;24602:1;24594:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24594:10:4;;;24640:16;;;:13;:16;;;;;;;;24670:20;;;24709:54;;;;;;;24594:10;;-1:-1:-1;24594:10:4;;24709:54;;;;;;;;;;;;;24777:51;24793:1;24796:15;24813:14;24777:15;:51::i;:::-;-1:-1:-1;;24563:3:4;;24526:313;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;24370:475::o;11531:1018::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;11668:10;;1827:13;11668:10;11660:19;;;;;;11690:14;11707:13;:11;:13::i;:::-;11690:30;;11730:12;11745:28;11750:12;1032:1:1;11745:4:4;:28::i;:::-;11730:43;;11783:20;11806:27;11811:12;11825:7;11806:4;:27::i;:::-;11783:50;;11843:10;11856:32;11861:15;11878:9;11856:4;:32::i;:::-;11843:45;-1:-1:-1;11906:10:4;11898:19;;;;;;11928:40;11943:10;11955:12;11928:14;:40::i;:::-;11993:8;;11978:33;;11993:8;;;-1:-1:-1;;;;;11993:8:4;12003:7;11978:14;:33::i;:::-;12021:31;12036:15;12021:14;:31::i;:::-;12068:6;12063:479;12084:7;:14;12080:18;;12063:479;;;12119:9;12131:7;12139:1;12131:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12131:10:4;12166:11;;;:8;:11;;;;;;:19;;;12131:10;;-1:-1:-1;12166:19:4;12221:16;12226:5;12166:19;12221:4;:16::i;:::-;12199:38;-1:-1:-1;12259:19:4;12251:28;;;;;;12319:13;;12333:1;12319:16;;;;;;;;;;;;;12301:14;:34;;12293:43;;;;;;-1:-1:-1;;;;;12377:11:4;;;;;;:8;:11;;;;;:19;;;12372:41;;12398:14;12372:4;:41::i;:::-;-1:-1:-1;;;;;12350:11:4;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;12432:39;;;;;;;12350:11;;12441:10;;-1:-1:-1;;;;;;;;;;;12432:39:4;;;;;;;;;12485:46;12501:1;12504:10;12516:14;12485:15;:46::i;:::-;-1:-1:-1;;;12100:3:4;;12063:479;;;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;;;;;;11531:1018:4:o;827:42:1:-;868:1;827:42;:::o;5064:258:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;5180:10;;1827:13;5180:10;5179:11;5171:20;;;;;;5223:11;;-1:-1:-1;;;;;5223:11:4;5209:10;:25;5201:34;;;;;;766:6:1;5253:13:4;:21;;5245:30;;;;;;5285:14;:30;1861:6;:14;;-1:-1:-1;;1861:14:4;;;5064:258::o;779:42:1:-;820:1;779:42;:::o;1382:46::-;1423:5;1382:46;:::o;3136:664:2:-;3369:19;3404:16;3423:35;3428:13;3443:14;3423:4;:35::i;:::-;3404:54;;3468:15;3486:19;766:6:1;3497:7:2;3486:4;:19::i;:::-;3468:37;;3528:31;3533:13;3548:10;3528:4;:31::i;:::-;3515:44;;3569:6;3578:54;3583:14;3599:32;3604:14;3620:10;3599:4;:32::i;3578:54::-;3569:63;;3642:8;3653:20;3658:1;3661:11;3653:4;:20::i;:::-;3642:31;;3683:8;3694:15;766:6:1;3705:3:2;3694:4;:15::i;:::-;3683:26;;3736;3741:15;3758:3;3736:4;:26::i;:::-;3719:43;3136:664;-1:-1:-1;;;;;;;;;;;;3136:664:2:o;935:50:1:-;983:2;766:6;976:9;;1434:59;1475:18;1434:59;:::o;3397:173:4:-;1929:6;;3481:23;;1929:6;;;;;1928:7;1920:16;;;;;;3528:10;;;;3520:19;;;;;;3556:7;3549:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3549:14:4;;;;;;;;;;;;;;;;;;;;;;3397:173;:::o;991:42:1:-;1032:1;991:42;:::o;3253:138:4:-;1929:6;;3331:23;;1929:6;;;;;1928:7;1920:16;;;;;3135:112;3226:7;:14;3135:112;:::o;8192:951::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;8307:11;;8293:10;-1:-1:-1;;;;;8307:11:4;;;8293:25;8285:34;;;;;;-1:-1:-1;;;;;8337:15:4;;;;;;:8;:15;;;;;:21;;;8329:30;;;;;;8378:10;;;;8377:11;8369:20;;;;;;-1:-1:-1;;;;;8420:15:4;;8400:17;8420:15;;;:8;:15;;;;;:23;;;;8473:28;8420:23;8400:17;8473:4;:28::i;:::-;8532:12;;-1:-1:-1;;;;;8546:15:4;;;;;;:8;:15;;;;;:22;;;8453:48;;-1:-1:-1;8527:42:4;;:4;:42::i;:::-;8512:12;:57;-1:-1:-1;;;;;8688:15:4;;8675:10;8688:15;;;:8;:15;;;;;:21;;;8731:7;:14;;-1:-1:-1;;8731:18:4;;;:7;:18;;8776:13;;;;;;;;;;;;;;;;8759:7;:14;;-1:-1:-1;;;;;8776:13:4;;;;8767:5;;8759:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;8759:30:4;;;;;-1:-1:-1;;;;;8759:30:4;;;;;;8832:5;8799:8;:24;8808:7;8816:5;8808:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8808:14:4;8799:24;;;;;;;;;;;;8808:14;8799:30;:38;8847:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;8847:13:4;;;;;;;-1:-1:-1;;;;;;8847:13:4;;;;;;;;;8888:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8870:15:4;;;;:8;:15;;;;;;;:131;;;;-1:-1:-1;;8870:131:4;;;;;;;;;-1:-1:-1;8870:131:4;;;;;;;;;;;;;;9012:68;8870:15;9035:10;9047:32;9052:12;9066;9047:4;:32::i;9012:68::-;9113:8;;9090:46;;9106:5;;9113:8;;;-1:-1:-1;;;;;9113:8:4;9123:12;9090:15;:46::i;4383:122::-;1929:6;;4463:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;4490:8:4;;4383:122;:::o;3575:248:5:-;3704:10;3642:4;3693:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3693:27:5;;;;;;;;;;3688:38;;3722:3;3688:4;:38::i;:::-;3669:10;3658:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3658:27:5;;;;;;;;;;;;:68;;;3741:54;;;;;;3658:27;;-1:-1:-1;;;;;;;;;;;3741:54:5;;;;;;;;;;-1:-1:-1;3812:4:5;3575:248;;;;:::o;3067:118::-;-1:-1:-1;;;;;3158:15:5;;;3135:4;3158:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3067:118::o;6078:637:4:-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;6281:11;;-1:-1:-1;;;;;6281:11:4;6267:10;:25;6259:34;;;;;;-1:-1:-1;;;;;6312:15:4;;;;;;:8;:15;;;;;:21;;;6311:22;6303:31;;;;;;6353:10;;;;6352:11;6344:20;;;;;;6383:7;:14;868:1:1;-1:-1:-1;6375:42:4;;;;;;6446:193;;;;;;;;6474:4;6446:193;;;6499:7;:14;;6446:193;;;;;;;-1:-1:-1;6446:193:4;;;;;;;;;;;;-1:-1:-1;;;;;6428:15:4;;;;;:8;:15;;;;;;:211;;;;-1:-1:-1;;6428:211:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6649:19:4;;;;;;;-1:-1:-1;;;;;;6649:19:4;;;;;;6678:30;6428:15;6692:7;6701:6;6678;:30::i;:::-;6078:637;;;:::o;9432:331::-;1728:10;-1:-1:-1;;;;;1710:39:4;1719:7;;-1:-1:-1;;;;;;1719:7:4;-1:-1:-1;;;;;1710:39:4;;1740:8;;1710:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1710:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1710:39:4;;;;-1:-1:-1;1710:39:4;;-1:-1:-1;;;;1710:39:4;1810:6;;;;;;;1809:7;1801:16;;;;;;1827:6;:13;;-1:-1:-1;;1827:13:4;;;;;9558:11;;9544:10;-1:-1:-1;;;;;9558:11:4;;;9544:25;9536:34;;;;;;-1:-1:-1;;;;;9589:15:4;;;;;;:8;:15;;;;;:21;;;9588:22;9580:31;;;;;;9633:38;;;-1:-1:-1;;;9633:38:4;;9665:4;9633:38;;;;;;9622:8;;-1:-1:-1;;;;;9633:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9633:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9633:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9633:38:4;;-1:-1:-1;9689:13:4;;;;9681:22;;;;;;9714:42;9730:5;9737:10;9749:6;9714:15;:42::i;:::-;-1:-1:-1;;1861:6:4;:14;;-1:-1:-1;;1861:14:4;;;-1:-1:-1;9432:331:4:o;1560:49:1:-;1608:1;766:6;1601:8;;3931:249:4;1929:6;;4033:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;4062:15:4;;;;;;:8;:15;;;;;:21;;;4054:30;;;;;;-1:-1:-1;;;;;4108:15:4;;4094:11;4108:15;;;:8;:15;;;;;:22;;;4160:12;;4147:26;;4108:22;;4147:4;:26::i;:::-;4140:33;3931:249;-1:-1:-1;;;3931:249:4:o;4186:191::-;1929:6;;4279:4;;1929:6;;;;;1928:7;1920:16;;;;;;-1:-1:-1;;;;;4308:15:4;;;;;;:8;:15;;;;;:21;;;4300:30;;;;;;-1:-1:-1;;;;;;4347:15:4;;;;;:8;:15;;;;;:23;;;;4186:191::o;4806:653:2:-;5040:18;5074:16;5093:35;5098:14;5114:13;5093:4;:35::i;:::-;5074:54;;5138:9;5150:37;5155:15;5172:14;5150:4;:37::i;:::-;5138:49;;5197:6;5206:27;5211:15;5228:4;5206;:27::i;:::-;5197:36;;5243:8;5254:20;5259:1;5262:11;5254:4;:20::i;:::-;5243:31;;5290:15;5295:3;766:6:1;5290:4:2;:15::i;:::-;5284:21;;5331:19;766:6:1;5342:7:2;5331:4;:19::i;:::-;5315:35;;5376:46;5381:25;5386:14;5402:3;5381:4;:25::i;:::-;5408:13;5376:4;:46::i;:::-;5360:62;4806:653;-1:-1:-1;;;;;;;;;;;4806:653:2:o;2785:108:4:-;2875:11;;-1:-1:-1;;;2875:11:4;;;;;2785:108::o;1776:320:3:-;1845:4;1873:6;1865:15;;;;;;766:6:1;1900:8:3;;1926:6;;;:24;;;766:6:1;1941:1:3;1936:2;:6;;;;;;:14;1926:24;1918:33;;;;;;1998:1;1994:5;;1988:12;;2018:8;;;;2010:17;;;;;;2054:7;2069:1;2064:2;:6;;;;;;;1776:320;-1:-1:-1;;;;;;1776:320:3:o;1109:174::-;1178:4;1199:6;1207:9;1220:14;1229:1;1232;1220:8;:14::i;:::-;1198:36;;;;1253:4;1252:5;1244:14;;;;;;-1:-1:-1;1275:1:3;1109:174;-1:-1:-1;;;1109:174:3:o;1509:261::-;1578:4;1608:5;;;1631:6;;;:21;;;1651:1;1646;1641:2;:6;;;;;;:11;1631:21;1623:30;;;;;;1679:8;1673:15;;1706:8;;;;1698:17;;;;;;1725:7;766:6:1;1735:2:3;:9;;15014:424:2;15138:13;15192:16;15175:13;:33;;15167:42;;;;;;766:6:1;15227:13:2;:21;;15219:30;;;;;;15259:23;15285:37;15290:13;15305:16;15285:4;:37::i;:::-;15259:63;;15343:39;15348:18;15368:13;15343:4;:39::i;:::-;15332:50;;15422:8;15400:18;:30;;15392:39;;;;;2577:486:3;2651:4;1423:5:1;2679:4:3;:21;;2671:30;;;;;;1475:18:1;2719:21:3;;;2711:30;;;;;;2752:10;2766:11;2773:3;2766:6;:11::i;:::-;2752:25;;2790:11;2804:16;2809:3;2814:5;2804:4;:16::i;:::-;2790:30;;2831:13;2847:24;2853:4;2859:11;2864:5;2859:4;:11::i;:::-;2847:5;:24::i;:::-;2831:40;-1:-1:-1;2886:11:3;2882:57;;2920:8;-1:-1:-1;2913:15:3;;-1:-1:-1;;2913:15:3;2882:57;2949:18;2970:40;2981:4;2987:6;1540:13:1;2970:10:3;:40::i;:::-;2949:61;;3027:29;3032:8;3042:13;3027:4;:29::i;:::-;3020:36;2577:486;-1:-1:-1;;;;;;;2577:486:3:o;950:153::-;1019:4;1048:5;;;1071:6;;;;1063:15;;;;;25389:108:4;25471:19;25477:4;25483:6;25471:5;:19::i;:::-;25389:108;;:::o;25707:88::-;25775:13;25781:6;25775:5;:13::i;:::-;25707:88;:::o;25503:104::-;25583:17;25589:2;25593:6;25583:5;:17::i;25211:172::-;25319:34;;;-1:-1:-1;;;25319:34:4;;-1:-1:-1;;;;;25319:34:4;;;;;;;;;;;;;;;25307:9;;25319:22;;;;;:34;;;;;;;;;;;;;;25307:9;25319:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;25319:34:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25319:34:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25319:34:4;;-1:-1:-1;25319:34:4;25363:13;;;;;;25211:172;;;;:::o;2181:244:5:-;-1:-1:-1;;;;;2259:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2259:20:5;2251:29;;;;;;-1:-1:-1;;;;;2311:13:5;;:8;:13;;;;;;;;;;;2306:24;;2326:3;2306:4;:24::i;:::-;-1:-1:-1;;;;;2290:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2361:13;;;;;;;2356:24;;2376:3;2356:4;:24::i;:::-;-1:-1:-1;;;;;2340:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2395:23;;;;;;;2340:13;;2395:23;;;;-1:-1:-1;;;;;;;;;;;2395:23:5;;;;;;;;2181:244;;;:::o;25010:195:4:-;25120:55;;;-1:-1:-1;;;25120:55:4;;-1:-1:-1;;;;;25120:55:4;;;;;;;25161:4;25120:55;;;;;;;;;;;;25108:9;;25120:26;;;;;:55;;;;;;;;;;;;;;25108:9;25120:26;:55;;;5:2:-1;;;;30:1;27;20:12;25613:88:4;25681:13;25687:6;25681:5;:13::i;1289:214:3:-;1362:4;1368;1397:1;1392;:6;1388:109;;-1:-1:-1;;1422:5:3;;;1429;1414:21;;1388:109;-1:-1:-1;;1474:5:3;;;1481:4;1388:109;1289:214;;;;;:::o;833:111::-;896:4;766:6:1;923:7:3;928:1;923:4;:7::i;:::-;:14;;833:111;-1:-1:-1;;833:111:3:o;723:104::-;766:6:1;812:8:3;;;723:104::o;2121:300::-;2191:4;;2224:1;2220;:5;:21;;766:6:1;2220:21:3;;;2233:1;2220:21;2211:30;-1:-1:-1;2262:1:3;2257:6;;;;2252:145;2265:6;;2252:145;;2299:10;2304:1;2307;2299:4;:10::i;:::-;2295:14;-1:-1:-1;2332:1:3;2328;:5;:10;2324:63;;2362:10;2367:1;2370;2362:4;:10::i;:::-;2358:14;;2324:63;2278:1;2273:6;;;;2252:145;;3069:1047;3165:4;3217:3;3165:4;;3253:20;3262:4;766:6:1;3253:8:3;:20::i;:::-;3230:43;;-1:-1:-1;3230:43:3;-1:-1:-1;766:6:1;;3283:9:3;3608:1;3594:495;3619:9;3611:4;:17;3594:495;;3649:9;766:6:1;3661:1:3;:8;3649:20;;3684:6;3692:9;3705:29;3714:1;3717:16;3722:4;766:6:1;3717:4:3;:16::i;:::-;3705:8;:29::i;:::-;3683:51;;;;3755:22;3760:4;3766:10;3771:1;3774;3766:4;:10::i;3755:22::-;3748:29;;3798:16;3803:4;3809;3798;:16::i;:::-;3791:23;-1:-1:-1;3832:9:3;3828:20;;3843:5;;;;;3828:20;3867:4;3863:30;;;3884:9;;;3863:30;3911:4;3907:30;;;3928:9;;;3907:30;3955:8;3951:128;;;3989:15;3994:3;3999:4;3989;:15::i;:::-;3983:21;;3951:128;;;4049:15;4054:3;4059:4;4049;:15::i;:::-;4043:21;;3951:128;-1:-1:-1;;;3630:3:3;;3594:495;;;-1:-1:-1;4106:3:3;;3069:1047;-1:-1:-1;;;;;;;;;3069:1047:3:o;2529:96:5:-;2587:31;2593:4;2607;2614:3;2587:5;:31::i;1912:263::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:39;;;;;;2053:4;2036:8;:23;;;;;;;;;;;2031:34;;2061:3;2031:4;:34::i;:::-;2022:4;2005:8;:23;;;;;;;;;;:60;2095:12;;2090:23;;2109:3;2090:4;:23::i;:::-;2075:12;:38;2128:40;;;;;;;;2160:1;;2145:4;;-1:-1:-1;;;;;;;;;;;2128:40:5;;;;;;;;1912:263;:::o;2431:92::-;2487:29;2501:4;2508:2;2512:3;2487:5;:29::i;1692:214::-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;-1:-1:-1;;;;;;;;;;;1859:40:5;;;;;;;;1692:214;:::o
Swarm Source
bzzr://993ab7d9193add493b90f3fbc114d124f2515ee3286bb646c67d794789a25cb0
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.