Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Source Code
Overview
Max Total Supply
0 BPT
Holders
0
Transfers
-
0
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
BPool
Compiler Version
v0.5.7+commit.6da8b019
Optimization Enabled:
Yes with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.5.7;
// Copyright BigchainDB GmbH and Ocean Protocol contributors
// SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
// Code is Apache-2.0 and docs are CC-BY-4.0
import './BToken.sol';
import './BMath.sol';
/**
* @title BPool
*
* @dev Used by the (Ocean version) BFactory contract as a bytecode reference to
* deploy new BPools.
*
* This contract is is nearly identical to the BPool.sol contract at [1]
* The only difference is the "Proxy contract functionality" section
* given below. We'd inherit from BPool if we could, for simplicity.
* But we can't, because the proxy section needs to access private
* variables declared in BPool, and Solidity disallows this. Therefore
* the best we can do for now is clearly demarcate the proxy section.
*
* [1] https://github.com/balancer-labs/balancer-core/contracts/.
*/
contract BPool is BToken, BMath {
struct Record {
bool bound; // is token bound to pool
uint index; // private
uint denorm; // denormalized weight
uint balance;
}
event LOG_SWAP(
address indexed caller,
address indexed tokenIn,
address indexed tokenOut,
uint256 tokenAmountIn,
uint256 tokenAmountOut
);
event LOG_JOIN(
address indexed caller,
address indexed tokenIn,
uint256 tokenAmountIn
);
event LOG_EXIT(
address indexed caller,
address indexed tokenOut,
uint256 tokenAmountOut
);
event LOG_CALL(
bytes4 indexed sig,
address indexed caller,
bytes data
) anonymous;
modifier _logs_() {
emit LOG_CALL(msg.sig, msg.sender, msg.data);
_;
}
modifier _lock_() {
require(
!_mutex,
'ERR_REENTRY'
);
_mutex = true;
_;
_mutex = false;
}
modifier _viewlock_() {
require(!_mutex, 'ERR_REENTRY');
_;
}
bool private _mutex;
address private _factory; // BFactory address to push token exitFee to
address private _controller; // has CONTROL role
bool private _publicSwap; // true if PUBLIC can call SWAP functions
// `setSwapFee` and `finalize` require CONTROL
// `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
uint private _swapFee;
bool private _finalized;
address[] private _tokens;
mapping(address=>Record) private _records;
uint private _totalWeight;
//-----------------------------------------------------------------------
//Proxy contract functionality: begin
bool private initialized = false;
modifier onlyNotInitialized() {
require(
!initialized,
'ERR_ALREADY_INITIALIZED'
);
_;
}
function isInitialized() external view returns(bool) {
return initialized;
}
// Called prior to contract deployment
constructor() public {
_initialize(msg.sender, msg.sender, MIN_FEE, false, false);
}
// Called prior to contract initialization (e.g creating new BPool instance)
// Calls private _initialize function. Only if contract is not initialized.
function initialize(
address controller,
address factory,
uint swapFee,
bool publicSwap,
bool finalized
)
external
onlyNotInitialized
returns(bool)
{
require(
controller != address(0),
'ERR_INVALID_CONTROLLER_ADDRESS'
);
require(
factory != address(0),
'ERR_INVALID_FACTORY_ADDRESS'
);
require(swapFee >= MIN_FEE, 'ERR_MIN_FEE');
require(swapFee <= MAX_FEE, 'ERR_MAX_FEE');
return _initialize(controller, factory, swapFee, publicSwap, finalized);
}
// Private function called on contract initialization.
function _initialize(
address controller,
address factory,
uint swapFee,
bool publicSwap,
bool finalized
)
private
returns(bool)
{
_controller = controller;
_factory = factory;
_swapFee = swapFee;
_publicSwap = publicSwap;
_finalized = finalized;
initialized = true;
return initialized;
}
function setup(
address dataTokenAaddress,
uint256 dataTokenAmount,
uint256 dataTokenWeight,
address baseTokenAddress,
uint256 baseTokenAmount,
uint256 baseTokenWeight,
uint256 swapFee
)
external
_logs_
{
require(
dataTokenAaddress != address(0),
'ERR_INVALID_DATATOKEN_ADDRESS'
);
require(
baseTokenAddress != address(0),
'ERR_INVALID_BASETOKEN_ADDRESS'
);
// other inputs will be validated prior
// calling the below functions
// bind data token
bind(
dataTokenAaddress,
dataTokenAmount,
dataTokenWeight
);
emit LOG_JOIN(msg.sender, dataTokenAaddress, dataTokenAmount);
// bind base token
bind(
baseTokenAddress,
baseTokenAmount,
baseTokenWeight
);
emit LOG_JOIN(msg.sender, baseTokenAddress, baseTokenAmount);
setSwapFee(swapFee);
// finalize
finalize();
}
//Proxy contract functionality: end
//-----------------------------------------------------------------------
function isPublicSwap()
external view
returns (bool)
{
return _publicSwap;
}
function isFinalized()
external view
returns (bool)
{
return _finalized;
}
function isBound(address t)
external view
returns (bool)
{
return _records[t].bound;
}
function getNumTokens()
external view
returns (uint)
{
return _tokens.length;
}
function getCurrentTokens()
external view _viewlock_
returns (address[] memory tokens)
{
return _tokens;
}
function getFinalTokens()
external view
_viewlock_
returns (address[] memory tokens)
{
require(_finalized, 'ERR_NOT_FINALIZED');
return _tokens;
}
function getDenormalizedWeight(address token)
external view
_viewlock_
returns (uint)
{
require(_records[token].bound, 'ERR_NOT_BOUND');
return _records[token].denorm;
}
function getTotalDenormalizedWeight()
external view
_viewlock_
returns (uint)
{
return _totalWeight;
}
function getNormalizedWeight(address token)
external view
_viewlock_
returns (uint)
{
require(_records[token].bound, 'ERR_NOT_BOUND');
uint denorm = _records[token].denorm;
return bdiv(denorm, _totalWeight);
}
function getBalance(address token)
external view
_viewlock_
returns (uint)
{
require(_records[token].bound, 'ERR_NOT_BOUND');
return _records[token].balance;
}
function getSwapFee()
external view
_viewlock_
returns (uint)
{
return _swapFee;
}
function getController()
external view
_viewlock_
returns (address)
{
return _controller;
}
function setSwapFee(uint swapFee)
public
_logs_
_lock_
{
require(!_finalized, 'ERR_IS_FINALIZED');
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
require(swapFee >= MIN_FEE, 'ERR_MIN_FEE');
require(swapFee <= MAX_FEE, 'ERR_MAX_FEE');
_swapFee = swapFee;
}
function setController(address manager)
external
_logs_
_lock_
{
require(
manager != address(0),
'ERR_INVALID_MANAGER_ADDRESS'
);
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
_controller = manager;
}
function setPublicSwap(bool public_)
public
_logs_
_lock_
{
require(!_finalized, 'ERR_IS_FINALIZED');
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
_publicSwap = public_;
}
function finalize()
public
_logs_
_lock_
{
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
require(!_finalized, 'ERR_IS_FINALIZED');
require(_tokens.length >= MIN_BOUND_TOKENS, 'ERR_MIN_TOKENS');
_finalized = true;
_publicSwap = true;
_mintPoolShare(INIT_POOL_SUPPLY);
_pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
}
function bind(address token, uint balance, uint denorm)
public
_logs_
// _lock_ Bind does not lock because it jumps to `rebind`, which does
{
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
require(!_records[token].bound, 'ERR_IS_BOUND');
require(!_finalized, 'ERR_IS_FINALIZED');
require(_tokens.length < MAX_BOUND_TOKENS, 'ERR_MAX_TOKENS');
_records[token] = Record({
bound: true,
index: _tokens.length,
denorm: 0,
// balance and denorm will be validated
balance: 0 // and set by `rebind`
});
_tokens.push(token);
rebind(token, balance, denorm);
}
function rebind(address token, uint balance, uint denorm)
public
_logs_
_lock_
{
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
require(_records[token].bound, 'ERR_NOT_BOUND');
require(!_finalized, 'ERR_IS_FINALIZED');
require(denorm >= MIN_WEIGHT, 'ERR_MIN_WEIGHT');
require(denorm <= MAX_WEIGHT, 'ERR_MAX_WEIGHT');
require(balance >= MIN_BALANCE, 'ERR_MIN_BALANCE');
// Adjust the denorm and totalWeight
uint oldWeight = _records[token].denorm;
if (denorm > oldWeight) {
_totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
require(_totalWeight <= MAX_TOTAL_WEIGHT, 'ERR_MAX_TOTAL_WEIGHT');
} else if (denorm < oldWeight) {
_totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
}
_records[token].denorm = denorm;
// Adjust the balance record and actual token balance
uint oldBalance = _records[token].balance;
_records[token].balance = balance;
if (balance > oldBalance) {
_pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
} else if (balance < oldBalance) {
// In this case liquidity is being withdrawn, so charge EXIT_FEE
uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
_pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
_pushUnderlying(token, _factory, tokenExitFee);
}
}
function unbind(address token)
external
_logs_
_lock_
{
require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
require(_records[token].bound, 'ERR_NOT_BOUND');
require(!_finalized, 'ERR_IS_FINALIZED');
uint tokenBalance = _records[token].balance;
uint tokenExitFee = bmul(tokenBalance, EXIT_FEE);
_totalWeight = bsub(_totalWeight, _records[token].denorm);
// Swap the token-to-unbind with the last token,
// then delete the last token
uint index = _records[token].index;
uint last = _tokens.length - 1;
_tokens[index] = _tokens[last];
_records[_tokens[index]].index = index;
_tokens.pop();
_records[token] = Record({
bound: false,
index: 0,
denorm: 0,
balance: 0
});
_pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
_pushUnderlying(token, _factory, tokenExitFee);
}
// Absorb any tokens that have been sent to this contract into the pool
function gulp(address token)
external
_logs_
_lock_
{
require(_records[token].bound, 'ERR_NOT_BOUND');
_records[token].balance = IERC20(token).balanceOf(address(this));
}
function getSpotPrice(address tokenIn, address tokenOut)
external view
_viewlock_
returns (uint spotPrice)
{
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
Record storage inRecord = _records[tokenIn];
Record storage outRecord = _records[tokenOut];
return calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
_swapFee
);
}
function getSpotPriceSansFee(address tokenIn, address tokenOut)
external view
_viewlock_
returns (uint spotPrice)
{
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
Record storage inRecord = _records[tokenIn];
Record storage outRecord = _records[tokenOut];
return calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
0
);
}
function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
external
_logs_
_lock_
{
require(_finalized, 'ERR_NOT_FINALIZED');
uint poolTotal = totalSupply();
uint ratio = bdiv(poolAmountOut, poolTotal);
require(ratio != 0, 'ERR_MATH_APPROX');
for (uint i = 0; i < _tokens.length; i++) {
address t = _tokens[i];
uint bal = _records[t].balance;
uint tokenAmountIn = bmul(ratio, bal);
require(tokenAmountIn != 0, 'ERR_MATH_APPROX');
require(tokenAmountIn <= maxAmountsIn[i], 'ERR_LIMIT_IN');
_records[t].balance = badd(_records[t].balance, tokenAmountIn);
emit LOG_JOIN(msg.sender, t, tokenAmountIn);
_pullUnderlying(t, msg.sender, tokenAmountIn);
}
_mintPoolShare(poolAmountOut);
_pushPoolShare(msg.sender, poolAmountOut);
}
function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
external
_logs_
_lock_
{
require(_finalized, 'ERR_NOT_FINALIZED');
uint poolTotal = totalSupply();
uint exitFee = bmul(poolAmountIn, EXIT_FEE);
uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
uint ratio = bdiv(pAiAfterExitFee, poolTotal);
require(ratio != 0, 'ERR_MATH_APPROX');
_pullPoolShare(msg.sender, poolAmountIn);
_pushPoolShare(_factory, exitFee);
_burnPoolShare(pAiAfterExitFee);
for (uint i = 0; i < _tokens.length; i++) {
address t = _tokens[i];
uint bal = _records[t].balance;
uint tokenAmountOut = bmul(ratio, bal);
require(tokenAmountOut != 0, 'ERR_MATH_APPROX');
require(tokenAmountOut >= minAmountsOut[i], 'ERR_LIMIT_OUT');
_records[t].balance = bsub(_records[t].balance, tokenAmountOut);
emit LOG_EXIT(msg.sender, t, tokenAmountOut);
_pushUnderlying(t, msg.sender, tokenAmountOut);
}
}
function swapExactAmountIn(
address tokenIn,
uint tokenAmountIn,
address tokenOut,
uint minAmountOut,
uint maxPrice
)
external
_logs_
_lock_
returns (uint tokenAmountOut, uint spotPriceAfter)
{
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
require(_publicSwap, 'ERR_SWAP_NOT_PUBLIC');
Record storage inRecord = _records[address(tokenIn)];
Record storage outRecord = _records[address(tokenOut)];
require(
tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO),
'ERR_MAX_IN_RATIO'
);
uint spotPriceBefore = calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
_swapFee
);
require(spotPriceBefore <= maxPrice, 'ERR_BAD_LIMIT_PRICE');
tokenAmountOut = calcOutGivenIn(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
tokenAmountIn,
_swapFee
);
require(tokenAmountOut >= minAmountOut, 'ERR_LIMIT_OUT');
inRecord.balance = badd(inRecord.balance, tokenAmountIn);
outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
spotPriceAfter = calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
_swapFee
);
require(spotPriceAfter >= spotPriceBefore, 'ERR_MATH_APPROX');
require(spotPriceAfter <= maxPrice, 'ERR_LIMIT_PRICE');
require(
spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut),
'ERR_MATH_APPROX'
);
emit LOG_SWAP(
msg.sender,
tokenIn,
tokenOut,
tokenAmountIn,
tokenAmountOut
);
_pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
_pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
return (tokenAmountOut, spotPriceAfter);
}
function swapExactAmountOut(
address tokenIn,
uint maxAmountIn,
address tokenOut,
uint tokenAmountOut,
uint maxPrice
)
external
_logs_
_lock_
returns (uint tokenAmountIn, uint spotPriceAfter)
{
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
require(_publicSwap, 'ERR_SWAP_NOT_PUBLIC');
Record storage inRecord = _records[address(tokenIn)];
Record storage outRecord = _records[address(tokenOut)];
require(
tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO),
'ERR_MAX_OUT_RATIO'
);
uint spotPriceBefore = calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
_swapFee
);
require(spotPriceBefore <= maxPrice, 'ERR_BAD_LIMIT_PRICE');
tokenAmountIn = calcInGivenOut(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
tokenAmountOut,
_swapFee
);
require(tokenAmountIn <= maxAmountIn, 'ERR_LIMIT_IN');
inRecord.balance = badd(inRecord.balance, tokenAmountIn);
outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
spotPriceAfter = calcSpotPrice(
inRecord.balance,
inRecord.denorm,
outRecord.balance,
outRecord.denorm,
_swapFee
);
require(spotPriceAfter >= spotPriceBefore, 'ERR_MATH_APPROX');
require(spotPriceAfter <= maxPrice, 'ERR_LIMIT_PRICE');
require(
spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut),
'ERR_MATH_APPROX'
);
emit LOG_SWAP(
msg.sender,
tokenIn,
tokenOut,
tokenAmountIn,
tokenAmountOut
);
_pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
_pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
return (tokenAmountIn, spotPriceAfter);
}
function joinswapExternAmountIn(
address tokenIn,
uint tokenAmountIn,
uint minPoolAmountOut
)
external
_logs_
_lock_
returns (uint poolAmountOut)
{
require(_finalized, 'ERR_NOT_FINALIZED');
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
require(
tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO),
'ERR_MAX_IN_RATIO'
);
Record storage inRecord = _records[tokenIn];
poolAmountOut = calcPoolOutGivenSingleIn(
inRecord.balance,
inRecord.denorm,
_totalSupply,
_totalWeight,
tokenAmountIn,
_swapFee
);
require(poolAmountOut >= minPoolAmountOut, 'ERR_LIMIT_OUT');
inRecord.balance = badd(inRecord.balance, tokenAmountIn);
emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
_mintPoolShare(poolAmountOut);
_pushPoolShare(msg.sender, poolAmountOut);
_pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
return poolAmountOut;
}
function joinswapPoolAmountOut(
address tokenIn,
uint poolAmountOut,
uint maxAmountIn
)
external
_logs_
_lock_
returns (uint tokenAmountIn)
{
require(_finalized, 'ERR_NOT_FINALIZED');
require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
Record storage inRecord = _records[tokenIn];
tokenAmountIn = calcSingleInGivenPoolOut(
inRecord.balance,
inRecord.denorm,
_totalSupply,
_totalWeight,
poolAmountOut,
_swapFee
);
require(tokenAmountIn != 0, 'ERR_MATH_APPROX');
require(tokenAmountIn <= maxAmountIn, 'ERR_LIMIT_IN');
require(
tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO),
'ERR_MAX_IN_RATIO'
);
inRecord.balance = badd(inRecord.balance, tokenAmountIn);
emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
_mintPoolShare(poolAmountOut);
_pushPoolShare(msg.sender, poolAmountOut);
_pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
return tokenAmountIn;
}
function exitswapPoolAmountIn(
address tokenOut,
uint poolAmountIn,
uint minAmountOut
)
external
_logs_
_lock_
returns (uint tokenAmountOut)
{
require(_finalized, 'ERR_NOT_FINALIZED');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
Record storage outRecord = _records[tokenOut];
tokenAmountOut = calcSingleOutGivenPoolIn(
outRecord.balance,
outRecord.denorm,
_totalSupply,
_totalWeight,
poolAmountIn,
_swapFee
);
require(tokenAmountOut >= minAmountOut, 'ERR_LIMIT_OUT');
require(
tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO),
'ERR_MAX_OUT_RATIO'
);
outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
uint exitFee = bmul(poolAmountIn, EXIT_FEE);
emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
_pullPoolShare(msg.sender, poolAmountIn);
_burnPoolShare(bsub(poolAmountIn, exitFee));
_pushPoolShare(_factory, exitFee);
_pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
return tokenAmountOut;
}
function exitswapExternAmountOut(
address tokenOut,
uint tokenAmountOut,
uint maxPoolAmountIn
)
external
_logs_
_lock_
returns (uint poolAmountIn)
{
require(_finalized, 'ERR_NOT_FINALIZED');
require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
require(
tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO),
'ERR_MAX_OUT_RATIO'
);
Record storage outRecord = _records[tokenOut];
poolAmountIn = calcPoolInGivenSingleOut(
outRecord.balance,
outRecord.denorm,
_totalSupply,
_totalWeight,
tokenAmountOut,
_swapFee
);
require(poolAmountIn != 0, 'ERR_MATH_APPROX');
require(poolAmountIn <= maxPoolAmountIn, 'ERR_LIMIT_IN');
outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
uint exitFee = bmul(poolAmountIn, EXIT_FEE);
emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
_pullPoolShare(msg.sender, poolAmountIn);
_burnPoolShare(bsub(poolAmountIn, exitFee));
_pushPoolShare(_factory, exitFee);
_pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
return poolAmountIn;
}
// ==
// 'Underlying' token-manipulation functions make external calls but are NOT locked
// You must `_lock_` or otherwise ensure reentry-safety
function _pullUnderlying(address erc20, address from, uint amount)
internal
{
bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
require(xfer, 'ERR_ERC20_FALSE');
}
function _pushUnderlying(address erc20, address to, uint amount)
internal
{
bool xfer = IERC20(erc20).transfer(to, amount);
require(xfer, 'ERR_ERC20_FALSE');
}
function _pullPoolShare(address from, uint amount)
internal
{
_pull(from, amount);
}
function _pushPoolShare(address to, uint amount)
internal
{
_push(to, amount);
}
function _mintPoolShare(uint amount)
internal
{
_mint(amount);
}
function _burnPoolShare(uint amount)
internal
{
_burn(amount);
}
}// 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.7;
contract BConst {
uint public constant BONE = 10**18;
uint public constant MIN_BOUND_TOKENS = 2;
uint public constant MAX_BOUND_TOKENS = 8;
uint public constant MIN_FEE = BONE / 10**6;
uint public constant MAX_FEE = BONE / 10;
uint public constant EXIT_FEE = 0;
uint public constant MIN_WEIGHT = BONE;
uint public constant MAX_WEIGHT = BONE * 50;
uint public constant MAX_TOTAL_WEIGHT = BONE * 50;
uint public constant MIN_BALANCE = BONE / 10**12;
uint public constant INIT_POOL_SUPPLY = BONE * 100;
uint public constant MIN_BPOW_BASE = 1 wei;
uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
uint public constant BPOW_PRECISION = BONE / 10**10;
uint public constant MAX_IN_RATIO = BONE / 2;
uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
}// 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.7;
import './BNum.sol';
contract BMath is BConst, BNum {
/**********************************************************************************************
// calcSpotPrice //
// sP = spotPrice //
// bI = tokenBalanceIn ( bI / wI ) 1 //
// bO = tokenBalanceOut sP = ----------- * ---------- //
// wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) //
// wO = tokenWeightOut //
// sF = swapFee //
**********************************************************************************************/
function calcSpotPrice(
uint tokenBalanceIn,
uint tokenWeightIn,
uint tokenBalanceOut,
uint tokenWeightOut,
uint swapFee
)
public pure
returns (uint spotPrice)
{
uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
uint ratio = bdiv(numer, denom);
uint scale = bdiv(BONE, bsub(BONE, swapFee));
return (spotPrice = bmul(ratio, scale));
}
/**********************************************************************************************
// calcOutGivenIn //
// aO = tokenAmountOut //
// bO = tokenBalanceOut //
// bI = tokenBalanceIn / / bI \ (wI / wO) \ //
// aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | //
// wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / //
// wO = tokenWeightOut //
// sF = swapFee //
**********************************************************************************************/
function calcOutGivenIn(
uint tokenBalanceIn,
uint tokenWeightIn,
uint tokenBalanceOut,
uint tokenWeightOut,
uint tokenAmountIn,
uint swapFee
)
public pure
returns (uint tokenAmountOut)
{
uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
uint adjustedIn = bsub(BONE, swapFee);
adjustedIn = bmul(tokenAmountIn, adjustedIn);
uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
uint foo = bpow(y, weightRatio);
uint bar = bsub(BONE, foo);
tokenAmountOut = bmul(tokenBalanceOut, bar);
return tokenAmountOut;
}
/**********************************************************************************************
// calcInGivenOut //
// aI = tokenAmountIn //
// bO = tokenBalanceOut / / bO \ (wO / wI) \ //
// bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | //
// aO = tokenAmountOut aI = \ \ ( bO - aO ) / / //
// wI = tokenWeightIn -------------------------------------------- //
// wO = tokenWeightOut ( 1 - sF ) //
// sF = swapFee //
**********************************************************************************************/
function calcInGivenOut(
uint tokenBalanceIn,
uint tokenWeightIn,
uint tokenBalanceOut,
uint tokenWeightOut,
uint tokenAmountOut,
uint swapFee
)
public pure
returns (uint tokenAmountIn)
{
uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
uint diff = bsub(tokenBalanceOut, tokenAmountOut);
uint y = bdiv(tokenBalanceOut, diff);
uint foo = bpow(y, weightRatio);
foo = bsub(foo, BONE);
tokenAmountIn = bsub(BONE, swapFee);
tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
return tokenAmountIn;
}
/**********************************************************************************************
// calcPoolOutGivenSingleIn //
// pAo = poolAmountOut / \ //
// tAi = tokenAmountIn /// / // wI \ \\ \ wI \ //
// wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ //
// tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS //
// tBi = tokenBalanceIn \\ ------------------------------------- / / //
// pS = poolSupply \\ tBi / / //
// sF = swapFee \ / //
**********************************************************************************************/
function calcPoolOutGivenSingleIn(
uint tokenBalanceIn,
uint tokenWeightIn,
uint poolSupply,
uint totalWeight,
uint tokenAmountIn,
uint swapFee
)
public pure
returns (uint poolAmountOut)
{
// Charge the trading fee for the proportion of tokenAi
/// which is implicitly traded to the other pool tokens.
// That proportion is (1- weightTokenIn)
// tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));
uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);
// uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
uint poolRatio = bpow(tokenInRatio, normalizedWeight);
uint newPoolSupply = bmul(poolRatio, poolSupply);
poolAmountOut = bsub(newPoolSupply, poolSupply);
return poolAmountOut;
}
/**********************************************************************************************
// calcSingleInGivenPoolOut //
// tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ //
// pS = poolSupply || --------- | ^ | --------- || * bI - bI //
// pAo = poolAmountOut \\ pS / \(wI / tW)// //
// bI = balanceIn tAi = -------------------------------------------- //
// wI = weightIn / wI \ //
// tW = totalWeight | 1 - ---- | * sF //
// sF = swapFee \ tW / //
**********************************************************************************************/
function calcSingleInGivenPoolOut(
uint tokenBalanceIn,
uint tokenWeightIn,
uint poolSupply,
uint totalWeight,
uint poolAmountOut,
uint swapFee
)
public pure
returns (uint tokenAmountIn)
{
uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
uint newPoolSupply = badd(poolSupply, poolAmountOut);
uint poolRatio = bdiv(newPoolSupply, poolSupply);
//uint newBalTi = poolRatio^(1/weightTi) * balTi;
uint boo = bdiv(BONE, normalizedWeight);
uint tokenInRatio = bpow(poolRatio, boo);
uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
// Do reverse order of fees charged in joinswap_ExternAmountIn, this way
// ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
//uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
return tokenAmountIn;
}
/**********************************************************************************************
// calcSingleOutGivenPoolIn //
// tAo = tokenAmountOut / / \\ //
// bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ //
// pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || //
// ps = poolSupply \ \\ pS / \(wO / tW)/ // //
// wI = tokenWeightIn tAo = \ \ // //
// tW = totalWeight / / wO \ \ //
// sF = swapFee * | 1 - | 1 - ---- | * sF | //
// eF = exitFee \ \ tW / / //
**********************************************************************************************/
function calcSingleOutGivenPoolIn(
uint tokenBalanceOut,
uint tokenWeightOut,
uint poolSupply,
uint totalWeight,
uint poolAmountIn,
uint swapFee
)
public pure
returns (uint tokenAmountOut)
{
uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
// charge exit fee on the pool token side
// pAiAfterExitFee = pAi*(1-exitFee)
uint poolAmountInAfterExitFee = bmul(
poolAmountIn,
bsub(BONE, EXIT_FEE)
);
uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
uint poolRatio = bdiv(newPoolSupply, poolSupply);
// newBalTo = poolRatio^(1/weightTo) * balTo;
uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);
uint tokenAmountOutBeforeSwapFee = bsub(
tokenBalanceOut,
newTokenBalanceOut
);
// charge swap fee on the output token side
//uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
return tokenAmountOut;
}
/**********************************************************************************************
// calcPoolInGivenSingleOut //
// pAi = poolAmountIn // / tAo \\ / wO \ \ //
// bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ //
// tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | //
// ps = poolSupply \\ -----------------------------------/ / //
// wO = tokenWeightOut pAi = \\ bO / / //
// tW = totalWeight ------------------------------------------------------------- //
// sF = swapFee ( 1 - eF ) //
// eF = exitFee //
**********************************************************************************************/
function calcPoolInGivenSingleOut(
uint tokenBalanceOut,
uint tokenWeightOut,
uint poolSupply,
uint totalWeight,
uint tokenAmountOut,
uint swapFee
)
public pure
returns (uint poolAmountIn)
{
// charge swap fee on the output token side
uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
//uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
uint zoo = bsub(BONE, normalizedWeight);
uint zar = bmul(zoo, swapFee);
uint tokenAmountOutBeforeSwapFee = bdiv(
tokenAmountOut,
bsub(BONE, zar)
);
uint newTokenBalanceOut = bsub(
tokenBalanceOut,
tokenAmountOutBeforeSwapFee
);
uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);
//uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
uint newPoolSupply = bmul(poolRatio, poolSupply);
uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);
// charge exit fee on the pool token side
// pAi = pAiAfterExitFee/(1-exitFee)
poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
return poolAmountIn;
}
}// 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.7;
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, 'ERR_ADD_OVERFLOW');
return c;
}
function bsub(uint a, uint b)
internal pure
returns (uint)
{
(uint c, bool flag) = bsubSign(a, b);
require(!flag, 'ERR_SUB_UNDERFLOW');
return c;
}
function bsubSign(uint a, uint b)
internal pure
returns (uint, bool)
{
if (a >= b) {
return (a - b, false);
} else {
return (b - a, true);
}
}
function bmul(uint a, uint b)
internal pure
returns (uint)
{
uint c0 = a * b;
require(a == 0 || c0 / a == b, 'ERR_MUL_OVERFLOW');
uint c1 = c0 + (BONE / 2);
require(c1 >= c0, 'ERR_MUL_OVERFLOW');
uint c2 = c1 / BONE;
return c2;
}
function bdiv(uint a, uint b)
internal pure
returns (uint)
{
require(b != 0, 'ERR_DIV_ZERO');
uint c0 = a * BONE;
require(a == 0 || c0 / a == BONE, 'ERR_DIV_INTERNAL'); // bmul overflow
uint c1 = c0 + (b / 2);
require(c1 >= c0, 'ERR_DIV_INTERNAL'); // badd require
uint c2 = c1 / b;
return c2;
}
// DSMath.wpow
function bpowi(uint a, uint n)
internal pure
returns (uint)
{
uint b = a;
uint z = n % 2 != 0 ? b : BONE;
for (n /= 2; n != 0; n /= 2) {
b = bmul(b, b);
if (n % 2 != 0) {
z = bmul(z, b);
}
}
return z;
}
// Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
// Use `bpowi` for `b^e` and `bpowK` for k iterations
// of approximation of b^0.w
function bpow(uint base, uint exp)
internal pure
returns (uint)
{
require(base >= MIN_BPOW_BASE, 'ERR_BPOW_BASE_TOO_LOW');
require(base <= MAX_BPOW_BASE, 'ERR_BPOW_BASE_TOO_HIGH');
uint whole = bfloor(exp);
uint remain = bsub(exp, whole);
uint wholePow = bpowi(base, btoi(whole));
if (remain == 0) {
return wholePow;
}
uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
return bmul(wholePow, partialResult);
}
function bpowApprox(uint base, uint exp, uint precision)
internal pure
returns (uint)
{
// term 0:
uint a = exp;
(uint x, bool xneg) = bsubSign(base, BONE);
uint term = BONE;
uint sum = term;
bool negative = false;
// term(k) = numer / denom
// = (product(a - i - 1, i=1-->k) * x^k) / (k!)
// each iteration, multiply previous term by (a-(k-1)) * x / k
// continue until term is less than precision
for (uint i = 1; term >= precision; i++) {
uint bigK = i * BONE;
(uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
term = bmul(term, bmul(c, x));
term = bdiv(term, bigK);
if (term == 0) break;
if (xneg) negative = !negative;
if (cneg) negative = !negative;
if (negative) {
sum = bsub(sum, term);
} else {
sum = badd(sum, term);
}
}
return sum;
}
}// 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.7;
import './BNum.sol';
import 'openzeppelin-solidity/contracts/token/ERC20/IERC20.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,
'ERR_INSUFFICIENT_BAL'
);
_balance[address(this)] = bsub(_balance[address(this)], amt);
_totalSupply = bsub(_totalSupply, amt);
emit Transfer(address(this), address(0), amt);
}
function _move(address src, address dst, uint amt) internal {
require(_balance[src] >= amt, 'ERR_INSUFFICIENT_BAL');
_balance[src] = bsub(_balance[src], amt);
_balance[dst] = badd(_balance[dst], amt);
emit Transfer(src, dst, amt);
}
function _push(address to, uint amt) internal {
_move(address(this), to, amt);
}
function _pull(address from, uint amt) internal {
_move(from, address(this), amt);
}
}
contract BToken is BTokenBase, IERC20 {
string private _name = 'Balancer Pool Token';
string private _symbol = 'BPT';
uint8 private _decimals = 18;
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns(uint8) {
return _decimals;
}
function allowance(address src, address dst) external view returns (uint) {
return _allowance[src][dst];
}
function balanceOf(address whom) external view returns (uint) {
return _balance[whom];
}
function totalSupply() public view returns (uint) {
return _totalSupply;
}
function approve(address dst, uint amt) external returns (bool) {
_allowance[msg.sender][dst] = amt;
emit Approval(msg.sender, dst, amt);
return true;
}
function increaseApproval(address dst, uint amt) external returns (bool) {
_allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
return true;
}
function decreaseApproval(address dst, uint amt) external returns (bool) {
uint oldValue = _allowance[msg.sender][dst];
if (amt > oldValue) {
_allowance[msg.sender][dst] = 0;
} else {
_allowance[msg.sender][dst] = bsub(oldValue, amt);
}
emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
return true;
}
function transfer(address dst, uint amt) external returns (bool) {
_move(msg.sender, dst, amt);
return true;
}
function transferFrom(
address src,
address dst,
uint amt
)
external
returns (bool)
{
require(
msg.sender == src || amt <= _allowance[src][msg.sender],
'ERR_BTOKEN_BAD_CALLER'
);
_move(src, dst, amt);
if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
_allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
}
return true;
}
}pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "byzantium",
"libraries": {
"": {}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"tokenOut","type":"address"},{"name":"tokenAmountOut","type":"uint256"},{"name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"amt","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenIn","type":"address"},{"name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenIn","type":"address"},{"name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"isBound","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"balance","type":"uint256"},{"name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenOut","type":"address"},{"name":"poolAmountIn","type":"uint256"},{"name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"poolAmountOut","type":"uint256"},{"name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"controller","type":"address"},{"name":"factory","type":"address"},{"name":"swapFee","type":"uint256"},{"name":"publicSwap","type":"bool"},{"name":"finalized","type":"bool"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceIn","type":"uint256"},{"name":"tokenWeightIn","type":"uint256"},{"name":"poolSupply","type":"uint256"},{"name":"totalWeight","type":"uint256"},{"name":"poolAmountOut","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"tokenIn","type":"address"},{"name":"tokenAmountIn","type":"uint256"},{"name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenIn","type":"address"},{"name":"poolAmountOut","type":"uint256"},{"name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenIn","type":"address"},{"name":"maxAmountIn","type":"uint256"},{"name":"tokenOut","type":"address"},{"name":"tokenAmountOut","type":"uint256"},{"name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"name":"tokenAmountIn","type":"uint256"},{"name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenIn","type":"address"},{"name":"tokenAmountIn","type":"uint256"},{"name":"tokenOut","type":"address"},{"name":"minAmountOut","type":"uint256"},{"name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"name":"tokenAmountOut","type":"uint256"},{"name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceOut","type":"uint256"},{"name":"tokenWeightOut","type":"uint256"},{"name":"poolSupply","type":"uint256"},{"name":"totalWeight","type":"uint256"},{"name":"tokenAmountOut","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceIn","type":"uint256"},{"name":"tokenWeightIn","type":"uint256"},{"name":"poolSupply","type":"uint256"},{"name":"totalWeight","type":"uint256"},{"name":"tokenAmountIn","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceOut","type":"uint256"},{"name":"tokenWeightOut","type":"uint256"},{"name":"poolSupply","type":"uint256"},{"name":"totalWeight","type":"uint256"},{"name":"poolAmountIn","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceIn","type":"uint256"},{"name":"tokenWeightIn","type":"uint256"},{"name":"tokenBalanceOut","type":"uint256"},{"name":"tokenWeightOut","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"poolAmountIn","type":"uint256"},{"name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceIn","type":"uint256"},{"name":"tokenWeightIn","type":"uint256"},{"name":"tokenBalanceOut","type":"uint256"},{"name":"tokenWeightOut","type":"uint256"},{"name":"tokenAmountIn","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dataTokenAaddress","type":"address"},{"name":"dataTokenAmount","type":"uint256"},{"name":"dataTokenWeight","type":"uint256"},{"name":"baseTokenAddress","type":"address"},{"name":"baseTokenAmount","type":"uint256"},{"name":"baseTokenWeight","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"balance","type":"uint256"},{"name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenBalanceIn","type":"uint256"},{"name":"tokenWeightIn","type":"uint256"},{"name":"tokenBalanceOut","type":"uint256"},{"name":"tokenWeightOut","type":"uint256"},{"name":"tokenAmountOut","type":"uint256"},{"name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"tokenIn","type":"address"},{"indexed":true,"name":"tokenOut","type":"address"},{"indexed":false,"name":"tokenAmountIn","type":"uint256"},{"indexed":false,"name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"tokenIn","type":"address"},{"indexed":false,"name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"tokenOut","type":"address"},{"indexed":false,"name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"caller","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]Contract Creation Code
60c0604052601360808190527f42616c616e63657220506f6f6c20546f6b656e0000000000000000000000000060a090815262000040916003919062000169565b506040805180820190915260038082527f42505400000000000000000000000000000000000000000000000000000000006020909201918252620000879160049162000169565b506005805460ff19908116601217909155600c80549091169055348015620000ae57600080fd5b50620000cd338064e8d4a51000600080640100000000620000d4810204565b506200020e565b6006805460058054600160a060020a0397881662010000026201000060b060020a0319909116179055600794909455911515740100000000000000000000000000000000000000000260a060020a60ff021995909416600160a060020a03199093169290921793909316919091179091556008805491151560ff19928316179055600c80549091166001179081905560ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001ac57805160ff1916838001178555620001dc565b82800160010185558215620001dc579182015b82811115620001dc578251825591602001919060010190620001bf565b50620001ea929150620001ee565b5090565b6200020b91905b80821115620001ea5760008155600101620001f5565b90565b615e7a806200021e6000396000f3fe608060405234801561001057600080fd5b506004361061040e576000357c0100000000000000000000000000000000000000000000000000000000900480638c28cbe811610232578063be3bbd2e11610142578063d73dd623116100d5578063ec093021116100a4578063ec09302114610d35578063f1b8a9b714610d3d578063f8b2cb4f14610d63578063f8d6aed414610d89578063fde924f714610dc45761040e565b8063d73dd62314610ca9578063dd62ed3e14610cd5578063e4a28a5214610514578063e4e1e53814610d035761040e565b8063cd2ed8fb11610111578063cd2ed8fb14610c25578063cf5e7bd314610c2d578063d1d7bc9114610c53578063d4cadf6814610ca15761040e565b8063be3bbd2e14610bbd578063c36596a614610588578063c6580d1214610c15578063cc77828d14610c1d5761040e565b8063a221ee49116101c5578063b7b800a411610194578063b7b800a414610b62578063ba019dab14610b6a578063ba9530a614610b72578063bc063e1a14610bad578063bc694ea214610bb55761040e565b8063a221ee4914610a82578063a9059cbb14610ab7578063b02f0b7314610ae3578063b0e0d13614610b5a5761040e565b80639381cd2b116102015780639381cd2b14610a44578063948d8ce614610a4c57806395d89b4114610a72578063992e2a9214610a7a5761040e565b80638c28cbe8146109e85780638d4e408314610a0e57806392eefe9b14610a16578063936c347714610a3c5761040e565b806346ab38f11161032d5780636d06dfa0116102c05780638201aa3f1161028f5780638201aa3f146108ef57806382f652ad1461092f5780638656b6531461096a578063867378c5146109a557806389298012146109ad5761040e565b80636d06dfa01461083657806370a082311461086857806376c7a3c71461088e5780637c5e9ea4146108965761040e565b8063506de974116102fc578063506de974146107575780635c1bbaf71461079d5780635db34277146107d8578063661884631461080a5761040e565b806346ab38f11461068757806349b59552146106b95780634bb278f3146106d85780634f69c0d4146106e05761040e565b8063218b5382116103a5578063313ce56711610374578063313ce5671461061057806334e199071461062e578063392e53cd1461064d5780633fdddaa2146106555761040e565b8063218b53821461058857806323b872dd146105905780632f37b624146105c65780633018205f146105ec5761040e565b80631446a7ff116103e15780631446a7ff1461051c57806315e84af91461054a57806318160ddd14610578578063189d00ca146105805761040e565b806302c967481461041357806306fdde0314610457578063095ea7b3146104d457806309a3bbe414610514575b600080fd5b6104456004803603606081101561042957600080fd5b50600160a060020a038135169060208101359060400135610dcc565b60408051918252519081900360200190f35b61045f61113d565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610499578181015183820152602001610481565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610500600480360360408110156104ea57600080fd5b50600160a060020a0381351690602001356111d3565b604080519115158252519081900360200190f35b610445611228565b6104456004803603604081101561053257600080fd5b50600160a060020a0381358116916020013516611235565b6104456004803603604081101561056057600080fd5b50600160a060020a038135811691602001351661138f565b6104456114e0565b6104456114e6565b6104456114fa565b610500600480360360608110156105a657600080fd5b50600160a060020a03813581169160208101359091169060400135611506565b610500600480360360208110156105dc57600080fd5b5035600160a060020a031661166b565b6105f4611689565b60408051600160a060020a039092168252519081900360200190f35b6106186116ea565b6040805160ff9092168252519081900360200190f35b61064b6004803603602081101561064457600080fd5b50356116f3565b005b610500611917565b61064b6004803603606081101561066b57600080fd5b50600160a060020a038135169060208101359060400135611920565b6104456004803603606081101561069d57600080fd5b50600160a060020a038135169060208101359060400135611d6c565b61064b600480360360208110156106cf57600080fd5b5035151561207c565b61064b61220d565b61064b600480360360408110156106f657600080fd5b8135919081019060408101602082013564010000000081111561071857600080fd5b82018360208201111561072a57600080fd5b8035906020019184602083028401116401000000008311171561074c57600080fd5b509092509050612424565b610500600480360360a081101561076d57600080fd5b50600160a060020a038135811691602081013590911690604081013590606081013515159060800135151561270b565b610445600480360360c08110156107b357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356128f9565b610445600480360360608110156107ee57600080fd5b50600160a060020a0381351690602081013590604001356129b1565b6105006004803603604081101561082057600080fd5b50600160a060020a038135169060200135612c94565b6104456004803603606081101561084c57600080fd5b50600160a060020a038135169060208101359060400135612d6c565b6104456004803603602081101561087e57600080fd5b5035600160a060020a031661307d565b610445613098565b6108d6600480360360a08110156108ac57600080fd5b50600160a060020a03813581169160208101359160408201351690606081013590608001356130aa565b6040805192835260208301919091528051918290030190f35b6108d6600480360360a081101561090557600080fd5b50600160a060020a03813581169160208101359160408201351690606081013590608001356135ac565b610445600480360360c081101561094557600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613a95565b610445600480360360c081101561098057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613b54565b610445613bf5565b610445600480360360c08110156109c357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c09565b61064b600480360360208110156109fe57600080fd5b5035600160a060020a0316613cb9565b610500613e8a565b61064b60048036036020811015610a2c57600080fd5b5035600160a060020a0316613e93565b610445614039565b610445614091565b61044560048036036020811015610a6257600080fd5b5035600160a060020a031661409e565b61045f61416c565b6104456141cd565b610445600480360360a0811015610a9857600080fd5b50803590602081013590604081013590606081013590608001356141d9565b61050060048036036040811015610acd57600080fd5b50600160a060020a03813516906020013561423e565b61064b60048036036040811015610af957600080fd5b81359190810190604081016020820135640100000000811115610b1b57600080fd5b820183602082011115610b2d57600080fd5b80359060200191846020830284011164010000000083111715610b4f57600080fd5b509092509050614254565b61044561459a565b61044561459f565b6104456145a4565b610445600480360360c0811015610b8857600080fd5b5080359060208101359060408101359060608101359060808101359060a001356145a9565b61044561462a565b61044561463a565b610bc5614646565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c01578181015183820152602001610be9565b505050509050019250505060405180910390f35b61044561473e565b610bc5614743565b610445614794565b61064b60048036036020811015610c4357600080fd5b5035600160a060020a031661479a565b61064b600480360360e0811015610c6957600080fd5b50600160a060020a03813581169160208101359160408201359160608101359091169060808101359060a08101359060c00135614b27565b610445614cd0565b61050060048036036040811015610cbf57600080fd5b50600160a060020a038135169060200135614d28565b61044560048036036040811015610ceb57600080fd5b50600160a060020a0381358116916020013516614da9565b61064b60048036036060811015610d1957600080fd5b50600160a060020a038135169060208101359060400135614dd4565b610445615058565b61044560048036036020811015610d5357600080fd5b5035600160a060020a0316615068565b61044560048036036020811015610d7957600080fd5b5035600160a060020a0316615148565b610445600480360360c0811015610d9f57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135615216565b610500615299565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e7d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610ed4576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16610f32576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a60205260409020600390810154610f6791670de0b6b3a76400005b046001016152a9565b831115610fbe576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754610ff894939291908990613a95565b91508161103d576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b82821115611083576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b611091816003015485615392565b600382015560006110a283826152a9565b604080518781529051919250600160a060020a0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110f03384615403565b6111026110fd8483615392565b615411565b60055461111e90620100009004600160a060020a03168261541d565b611129863387615427565b50506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b5050505050905090565b336000818152600160209081526040808320600160a060020a03871680855290835281842086905581518681529151939490939092600080516020615dcf833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff1615611286576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff166112e4576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff16611342576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a038084166000908152600a6020526040808220928516825281206003808401546002808601549284015490840154939461138694929392906141d9565b95945050505050565b600554600090610100900460ff16156113e0576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff1661143e576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff1661149c576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a038084166000908152600a6020526040808220928516825290206003808301546002808501549284015490840154600754611386949291906141d9565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600033600160a060020a03851614806115425750600160a060020a03841660009081526001602090815260408083203384529091529020548211155b611596576040805160e560020a62461bcd02815260206004820152601560248201527f4552525f42544f4b454e5f4241445f43414c4c45520000000000000000000000604482015290519081900360640190fd5b6115a184848461551c565b33600160a060020a038516148015906115df5750600160a060020a038416600090815260016020908152604080832033845290915290205460001914155b1561166157600160a060020a03841660009081526001602090815260408083203384529091529020546116129083615392565b600160a060020a0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615dcf8339815191529281900390910190a35b5060019392505050565b600160a060020a03166000908152600a602052604090205460ff1690565b600554600090610100900460ff16156116da576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b50600654600160a060020a031690565b60055460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117a2576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16156117fa576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600654600160a060020a0316331461184a576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b64e8d4a510008110156118a7576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a0000811115611907576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007556005805461ff0019169055565b600c5460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119cf576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a0390911614611a30576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff16611a8e576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60085460ff1615611ad7576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811015611b37576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d494e5f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b6802b5e3af16b1880000811115611b98576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d41585f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b620f4240821015611bf3576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4d494e5f42414c414e43450000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090206002015480821115611c9657611c2c600b54611c278484615392565b615638565b600b8190556802b5e3af16b18800001015611c91576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f4d41585f544f54414c5f574549474854000000000000000000000000604482015290519081900360640190fd5b611cb7565b80821015611cb757611cb3600b54611cae8385615392565b615392565b600b555b600160a060020a0384166000908152600a602052604090206002810183905560030180549084905580841115611d0057611cfb8533611cf68785615392565b615695565b611d5a565b80841015611d5a576000611d148286615392565b90506000611d238260006152a9565b9050611d398733611d348585615392565b615427565b600554611d57908890620100009004600160a060020a031683615427565b50505b50506005805461ff0019169055505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e1d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611e74576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16611ed2576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754611f0c94939291908990613c09565b915082821015611f54576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a60205260409020600390810154611f8491670de0b6b3a7640000610f5e565b821115611fdb576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b611fe9816003015483615392565b60038201556000611ffa85826152a9565b604080518581529051919250600160a060020a0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36120483386615403565b6120556110fd8683615392565b60055461207190620100009004600160a060020a03168261541d565b611129863385615427565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561212b576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615612183576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600654600160a060020a031633146121d3576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b6006805491151560a060020a0274ff0000000000000000000000000000000000000000199092169190911790556005805461ff0019169055565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156122bc576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a039091161461231d576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b60085460ff1615612366576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600954600211156123c1576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d494e5f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6008805460ff191660011790556006805474ff0000000000000000000000000000000000000000191660a060020a17905561240468056bc75e2d63100000615707565b6124173368056bc75e2d6310000061541d565b6005805461ff0019169055565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124d3576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661252a576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60006125346114e0565b905060006125428583615710565b905080612587576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b60005b6009548110156126f7576000600982815481106125a357fe5b6000918252602080832090910154600160a060020a0316808352600a9091526040822060030154909250906125d885836152a9565b90508061261d576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87878581811061262957fe5b90506020020135811115612675576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090206003015461269b9082615638565b600160a060020a0384166000818152600a6020908152604091829020600301939093558051848152905191923392600080516020615d6f8339815191529281900390910190a36126ec833383615695565b50505060010161258a565b5061270185615707565b611d5a338661541d565b600c5460009060ff1615612769576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f414c52454144595f494e495449414c495a4544000000000000000000604482015290519081900360640190fd5b600160a060020a0386166127c7576040805160e560020a62461bcd02815260206004820152601e60248201527f4552525f494e56414c49445f434f4e54524f4c4c45525f414444524553530000604482015290519081900360640190fd5b600160a060020a038516612825576040805160e560020a62461bcd02815260206004820152601b60248201527f4552525f494e56414c49445f464143544f52595f414444524553530000000000604482015290519081900360640190fd5b64e8d4a51000841015612882576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a00008411156128e2576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6128ef868686868661584c565b9695505050505050565b6000806129068786615710565b905060006129148786615638565b905060006129228289615710565b90506000612938670de0b6b3a764000085615710565b9050600061294683836158f8565b90506000612954828e6152a9565b90506000612962828f615392565b9050600061298161297b670de0b6b3a76400008a615392565b8b6152a9565b905061299e82612999670de0b6b3a764000084615392565b615710565b9f9e505050505050505050505050505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612a62576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612ab9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16612b17576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060030154612b49906002670de0b6b3a76400005b046152a9565b831115612ba0576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754612bda94939291908990613b54565b915082821015612c22576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b612c30816003015485615638565b6003820155604080518581529051600160a060020a038716913391600080516020615d6f8339815191529181900360200190a3612c6c82615707565b612c76338361541d565b612c81853386615695565b506005805461ff00191690559392505050565b336000908152600160209081526040808320600160a060020a038616845290915281205480831115612ce957336000908152600160209081526040808320600160a060020a0388168452909152812055612d18565b612cf38184615392565b336000908152600160209081526040808320600160a060020a03891684529091529020555b336000818152600160209081526040808320600160a060020a038916808552908352928190205481519081529051929392600080516020615dcf833981519152929181900390910190a35060019392505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612e1d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612e74576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16612ed2576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754612f0c949392919089906128f9565b915081612f51576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b82821115612f97576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a6020526040902060030154612fc7906002670de0b6b3a7640000612b43565b82111561301e576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b61302c816003015483615638565b6003820155604080518381529051600160a060020a038716913391600080516020615d6f8339815191529181900360200190a361306884615707565b613072338561541d565b612c81853384615695565b600160a060020a031660009081526020819052604090205490565b620f4240670de0b6b3a76400006114f6565b6040805160208082523690820181905260009283923392600160e060020a03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561314a576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0387166000908152600a602052604090205460ff166131b7576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a602052604090205460ff16613215576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60065460a060020a900460ff16613276576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b600160a060020a038088166000908152600a6020526040808220928816825290206003808201546132af91670de0b6b3a7640000610f5e565b861115613306576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b600061332783600301548460020154846003015485600201546007546141d9565b905085811115613381576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b6133a183600301548460020154846003015485600201548b600754615216565b9450888511156133e9576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b6133f7836003015486615638565b836003018190555061340d826003015488615392565b6003808401829055840154600280860154908501546007546134309491906141d9565b935080841015613478576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b858411156134d0576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b6134da8588615710565b81111561351f576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87600160a060020a03168a600160a060020a031633600160a060020a03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46135878a3387615695565b613592883389615427565b5050506005805461ff001916905590969095509350505050565b6040805160208082523690820181905260009283923392600160e060020a03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561364c576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0387166000908152600a602052604090205460ff166136b9576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a602052604090205460ff16613717576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60065460a060020a900460ff16613778576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b600160a060020a038088166000908152600a60205260408082209288168252902060038201546137b2906002670de0b6b3a7640000612b43565b881115613809576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b600061382a83600301548460020154846003015485600201546007546141d9565b905085811115613884576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b6138a483600301548460020154846003015485600201548d6007546145a9565b9450868510156138ec576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b6138fa83600301548a615638565b8360030181905550613910826003015486615392565b6003808401829055840154600280860154908501546007546139339491906141d9565b93508084101561397b576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b858411156139d3576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b6139dd8986615710565b811115613a22576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87600160a060020a03168a600160a060020a031633600160a060020a03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a4613a8a8a338b615695565b613592883387615427565b600080613aa28786615710565b90506000613ab8670de0b6b3a764000083615392565b90506000613ac682866152a9565b90506000613ae087612999670de0b6b3a764000085615392565b90506000613aee8c83615392565b90506000613afc828e615710565b90506000613b0a82886158f8565b90506000613b18828e6152a9565b90506000613b268e83615392565b9050613b3f81612999670de0b6b3a76400006000615392565b99505050505050505050509695505050505050565b600080613b618786615710565b90506000613b80613b7a670de0b6b3a764000084615392565b856152a9565b90506000613b9f86613b9a670de0b6b3a764000085615392565b6152a9565b90506000613bad8b83615638565b90506000613bbb828d615710565b90506000613bc982876158f8565b90506000613bd7828d6152a9565b9050613be3818d615392565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a76400006114f6565b600080613c168786615710565b90506000613c3185613b9a670de0b6b3a76400006000615392565b90506000613c3f8883615392565b90506000613c4d828a615710565b90506000613c6c82613c67670de0b6b3a764000088615710565b6158f8565b90506000613c7a828e6152a9565b90506000613c888e83615392565b90506000613ca161297b670de0b6b3a76400008a615392565b905061299e82613b9a670de0b6b3a764000084615392565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d68576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0381166000908152600a602052604090205460ff16613dd5576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038316916370a08231916024808301926020929190829003018186803b158015613e3457600080fd5b505afa158015613e48573d6000803e3d6000fd5b505050506040513d6020811015613e5e57600080fd5b5051600160a060020a039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613f42576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a038116613faf576040805160e560020a62461bcd02815260206004820152601b60248201527f4552525f494e56414c49445f4d414e414745525f414444524553530000000000604482015290519081900360640190fd5b600654600160a060020a03163314613fff576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561408a576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff16156140ef576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff1661414d576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b50600160a060020a03166000908152600a602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111c95780601f1061119e576101008083540402835291602001916111c9565b6704a03ce68d21555681565b6000806141e68787615710565b905060006141f48686615710565b905060006142028383615710565b90506000614224670de0b6b3a7640000612999670de0b6b3a764000089615392565b905061423082826152a9565b9a9950505050505050505050565b600061424b33848461551c565b50600192915050565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614303576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661435a576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60006143646114e0565b905060006143738560006152a9565b905060006143818683615392565b9050600061438f8285615710565b9050806143d4576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b6143de3388615403565b6005546143fa90620100009004600160a060020a03168461541d565b61440382615411565b60005b6009548110156145855760006009828154811061441f57fe5b6000918252602080832090910154600160a060020a0316808352600a90915260408220600301549092509061445485836152a9565b905080614499576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b8989858181106144a557fe5b905060200201358110156144f1576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a60205260409020600301546145179082615392565b600160a060020a0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a361457a833383615427565b505050600101614406565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b6000806145b68786615710565b905060006145cc670de0b6b3a764000085615392565b90506145d885826152a9565b905060006145ea8a6129998c85615638565b905060006145f882856158f8565b9050600061460e670de0b6b3a764000083615392565b905061461a8a826152a9565b9c9b505050505050505050505050565b600a670de0b6b3a76400006114f6565b671bc16d674ec7ffff81565b600554606090610100900460ff1615614697576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b60085460ff166146df576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60098054806020026020016040519081016040528092919081815260200182805480156111c957602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311614717575050505050905090565b600081565b600554606090610100900460ff16156146df576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b60095490565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614849576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a03909116146148aa576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff16614908576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60085460ff1615614951576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600160a060020a0381166000908152600a60205260408120600301549061497882826152a9565b600b54600160a060020a0385166000908152600a60205260409020600201549192506149a391615392565b600b55600160a060020a0383166000908152600a60205260409020600101546009805460001981019190829081106149d757fe5b60009182526020909120015460098054600160a060020a0390921691849081106149fd57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a0316021790555081600a600060098581548110614a3d57fe5b6000918252602080832090910154600160a060020a031683528201929092526040019020600101556009805480614a7057fe5b600082815260208082206000199084018101805473ffffffffffffffffffffffffffffffffffffffff191690559092019092556040805160808101825283815280830184815281830185815260608301868152600160a060020a038c168752600a909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614b098533611d348787615392565b600554611d5a908690620100009004600160a060020a031685615427565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600160a060020a038716614be6576040805160e560020a62461bcd02815260206004820152601d60248201527f4552525f494e56414c49445f44415441544f4b454e5f41444452455353000000604482015290519081900360640190fd5b600160a060020a038416614c44576040805160e560020a62461bcd02815260206004820152601d60248201527f4552525f494e56414c49445f42415345544f4b454e5f41444452455353000000604482015290519081900360640190fd5b614c4f878787614dd4565b604080518781529051600160a060020a038916913391600080516020615d6f8339815191529181900360200190a3614c88848484614dd4565b604080518481529051600160a060020a038616913391600080516020615d6f8339815191529181900360200190a3614cbf816116f3565b614cc761220d565b50505050505050565b600554600090610100900460ff1615614d21576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b5060075490565b336000908152600160209081526040808320600160a060020a0386168452909152812054614d569083615638565b336000818152600160209081526040808320600160a060020a038916808552908352928190208590558051948552519193600080516020615dcf833981519152929081900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600654600160a060020a03163314614e85576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff1615614ef6576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f49535f424f554e440000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff1615614f3f576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600954600811614f99576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d41585f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b604080516080810182526001808252600980546020808501918252600085870181815260608701828152600160a060020a038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805473ffffffffffffffffffffffffffffffffffffffff19169091179055615053838383611920565b505050565b6002670de0b6b3a76400006114f6565b600554600090610100900460ff16156150b9576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff16615117576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a6020526040902060020154600b54615141908290615710565b9392505050565b600554600090610100900460ff1615615199576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff166151f7576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b50600160a060020a03166000908152600a602052604090206003015490565b6000806152238588615710565b905060006152318786615392565b9050600061523f8883615710565b9050600061524d82856158f8565b905061526181670de0b6b3a7640000615392565b9050615275670de0b6b3a764000087615392565b945061528a6152848c836152a9565b86615710565b9b9a5050505050505050505050565b60065460a060020a900460ff1690565b60008282028315806152c35750828482816152c057fe5b04145b615317576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6706f05b59d3b2000081018181101561537a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b60008060006153a18585615a1b565b9150915080156153fb576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f5355425f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509392505050565b61540d8282615a40565b5050565b61541a81615a4b565b50565b61540d8282615b27565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b15801561549357600080fd5b505af11580156154a7573d6000803e3d6000fd5b505050506040513d60208110156154bd57600080fd5b5051905080615516576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f45524332305f46414c53450000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b600160a060020a03831660009081526020819052604090205481111561558c576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b600160a060020a0383166000908152602081905260409020546155af9082615392565b600160a060020a0380851660009081526020819052604080822093909355908416815220546155de9082615638565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015615141576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4144445f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b15801561549357600080fd5b61541a81615b32565b600081615767576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4449565f5a45524f0000000000000000000000000000000000000000604482015290519081900360640190fd5b670de0b6b3a7640000830283158061578f5750670de0b6b3a764000084828161578c57fe5b04145b6157e3576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b60028304810181811015615841576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b600084828161538757fe5b6006805460058054600160a060020a03978816620100000275ffffffffffffffffffffffffffffffffffffffff00001990911617905560079490945591151560a060020a0274ff0000000000000000000000000000000000000000199590941673ffffffffffffffffffffffffffffffffffffffff199093169290921793909316919091179091556008805491151560ff19928316179055600c80549091166001179081905560ff1690565b60006001831015615953576040805160e560020a62461bcd02815260206004820152601560248201527f4552525f42504f575f424153455f544f4f5f4c4f570000000000000000000000604482015290519081900360640190fd5b671bc16d674ec7ffff8311156159b3576040805160e560020a62461bcd02815260206004820152601660248201527f4552525f42504f575f424153455f544f4f5f4849474800000000000000000000604482015290519081900360640190fd5b60006159be83615ba7565b905060006159cc8483615392565b905060006159e2866159dd85615bc2565b615bd0565b9050816159f3579250611222915050565b6000615a0487846305f5e100615c30565b9050615a1082826152a9565b979650505050505050565b600080828410615a315750508082036000615a39565b505081810360015b9250929050565b61540d82308361551c565b30600090815260208190526040902054811115615ab2576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b30600090815260208190526040902054615acc9082615392565b30600090815260208190526040902055600254615ae99082615392565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b61540d30838361551c565b30600090815260208190526040902054615b4c9082615638565b30600090815260208190526040902055600254615b699082615638565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a7640000615bbb83615bc2565b0292915050565b670de0b6b3a7640000900490565b6000828160028406615bea57670de0b6b3a7640000615bec565b815b90506002840493505b8315615c2857615c0582836152a9565b91506002840615615c1d57615c1a81836152a9565b90505b600284049350615bf5565b949350505050565b6000828180615c4787670de0b6b3a7640000615a1b565b9092509050670de0b6b3a764000080600060015b888410615cff576000670de0b6b3a764000082029050600080615c8f8a615c8a85670de0b6b3a7640000615392565b615a1b565b91509150615ca187613b9a848c6152a9565b9650615cad8784615710565b965086615cbc57505050615cff565b8715615cc6579315935b8015615cd0579315935b8415615ce757615ce08688615392565b9550615cf4565b615cf18688615638565b95505b505050600101615c5b565b5090999850505050505050505056fe4552525f4e4f545f46494e414c495a45440000000000000000000000000000004552525f5245454e5452590000000000000000000000000000000000000000004552525f4c494d49545f494e000000000000000000000000000000000000000063982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a4552525f4e4f545f434f4e54524f4c4c455200000000000000000000000000004552525f4e4f545f424f554e44000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254552525f49535f46494e414c495a4544000000000000000000000000000000004552525f4c494d49545f4f5554000000000000000000000000000000000000004552525f4d4154485f415050524f580000000000000000000000000000000000a165627a7a7230582068902cb8432d3fc49bc013872e4c37dba3910763abe6baad739eeb9bc07abdf10029
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061040e576000357c0100000000000000000000000000000000000000000000000000000000900480638c28cbe811610232578063be3bbd2e11610142578063d73dd623116100d5578063ec093021116100a4578063ec09302114610d35578063f1b8a9b714610d3d578063f8b2cb4f14610d63578063f8d6aed414610d89578063fde924f714610dc45761040e565b8063d73dd62314610ca9578063dd62ed3e14610cd5578063e4a28a5214610514578063e4e1e53814610d035761040e565b8063cd2ed8fb11610111578063cd2ed8fb14610c25578063cf5e7bd314610c2d578063d1d7bc9114610c53578063d4cadf6814610ca15761040e565b8063be3bbd2e14610bbd578063c36596a614610588578063c6580d1214610c15578063cc77828d14610c1d5761040e565b8063a221ee49116101c5578063b7b800a411610194578063b7b800a414610b62578063ba019dab14610b6a578063ba9530a614610b72578063bc063e1a14610bad578063bc694ea214610bb55761040e565b8063a221ee4914610a82578063a9059cbb14610ab7578063b02f0b7314610ae3578063b0e0d13614610b5a5761040e565b80639381cd2b116102015780639381cd2b14610a44578063948d8ce614610a4c57806395d89b4114610a72578063992e2a9214610a7a5761040e565b80638c28cbe8146109e85780638d4e408314610a0e57806392eefe9b14610a16578063936c347714610a3c5761040e565b806346ab38f11161032d5780636d06dfa0116102c05780638201aa3f1161028f5780638201aa3f146108ef57806382f652ad1461092f5780638656b6531461096a578063867378c5146109a557806389298012146109ad5761040e565b80636d06dfa01461083657806370a082311461086857806376c7a3c71461088e5780637c5e9ea4146108965761040e565b8063506de974116102fc578063506de974146107575780635c1bbaf71461079d5780635db34277146107d8578063661884631461080a5761040e565b806346ab38f11461068757806349b59552146106b95780634bb278f3146106d85780634f69c0d4146106e05761040e565b8063218b5382116103a5578063313ce56711610374578063313ce5671461061057806334e199071461062e578063392e53cd1461064d5780633fdddaa2146106555761040e565b8063218b53821461058857806323b872dd146105905780632f37b624146105c65780633018205f146105ec5761040e565b80631446a7ff116103e15780631446a7ff1461051c57806315e84af91461054a57806318160ddd14610578578063189d00ca146105805761040e565b806302c967481461041357806306fdde0314610457578063095ea7b3146104d457806309a3bbe414610514575b600080fd5b6104456004803603606081101561042957600080fd5b50600160a060020a038135169060208101359060400135610dcc565b60408051918252519081900360200190f35b61045f61113d565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610499578181015183820152602001610481565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610500600480360360408110156104ea57600080fd5b50600160a060020a0381351690602001356111d3565b604080519115158252519081900360200190f35b610445611228565b6104456004803603604081101561053257600080fd5b50600160a060020a0381358116916020013516611235565b6104456004803603604081101561056057600080fd5b50600160a060020a038135811691602001351661138f565b6104456114e0565b6104456114e6565b6104456114fa565b610500600480360360608110156105a657600080fd5b50600160a060020a03813581169160208101359091169060400135611506565b610500600480360360208110156105dc57600080fd5b5035600160a060020a031661166b565b6105f4611689565b60408051600160a060020a039092168252519081900360200190f35b6106186116ea565b6040805160ff9092168252519081900360200190f35b61064b6004803603602081101561064457600080fd5b50356116f3565b005b610500611917565b61064b6004803603606081101561066b57600080fd5b50600160a060020a038135169060208101359060400135611920565b6104456004803603606081101561069d57600080fd5b50600160a060020a038135169060208101359060400135611d6c565b61064b600480360360208110156106cf57600080fd5b5035151561207c565b61064b61220d565b61064b600480360360408110156106f657600080fd5b8135919081019060408101602082013564010000000081111561071857600080fd5b82018360208201111561072a57600080fd5b8035906020019184602083028401116401000000008311171561074c57600080fd5b509092509050612424565b610500600480360360a081101561076d57600080fd5b50600160a060020a038135811691602081013590911690604081013590606081013515159060800135151561270b565b610445600480360360c08110156107b357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356128f9565b610445600480360360608110156107ee57600080fd5b50600160a060020a0381351690602081013590604001356129b1565b6105006004803603604081101561082057600080fd5b50600160a060020a038135169060200135612c94565b6104456004803603606081101561084c57600080fd5b50600160a060020a038135169060208101359060400135612d6c565b6104456004803603602081101561087e57600080fd5b5035600160a060020a031661307d565b610445613098565b6108d6600480360360a08110156108ac57600080fd5b50600160a060020a03813581169160208101359160408201351690606081013590608001356130aa565b6040805192835260208301919091528051918290030190f35b6108d6600480360360a081101561090557600080fd5b50600160a060020a03813581169160208101359160408201351690606081013590608001356135ac565b610445600480360360c081101561094557600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613a95565b610445600480360360c081101561098057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613b54565b610445613bf5565b610445600480360360c08110156109c357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c09565b61064b600480360360208110156109fe57600080fd5b5035600160a060020a0316613cb9565b610500613e8a565b61064b60048036036020811015610a2c57600080fd5b5035600160a060020a0316613e93565b610445614039565b610445614091565b61044560048036036020811015610a6257600080fd5b5035600160a060020a031661409e565b61045f61416c565b6104456141cd565b610445600480360360a0811015610a9857600080fd5b50803590602081013590604081013590606081013590608001356141d9565b61050060048036036040811015610acd57600080fd5b50600160a060020a03813516906020013561423e565b61064b60048036036040811015610af957600080fd5b81359190810190604081016020820135640100000000811115610b1b57600080fd5b820183602082011115610b2d57600080fd5b80359060200191846020830284011164010000000083111715610b4f57600080fd5b509092509050614254565b61044561459a565b61044561459f565b6104456145a4565b610445600480360360c0811015610b8857600080fd5b5080359060208101359060408101359060608101359060808101359060a001356145a9565b61044561462a565b61044561463a565b610bc5614646565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c01578181015183820152602001610be9565b505050509050019250505060405180910390f35b61044561473e565b610bc5614743565b610445614794565b61064b60048036036020811015610c4357600080fd5b5035600160a060020a031661479a565b61064b600480360360e0811015610c6957600080fd5b50600160a060020a03813581169160208101359160408201359160608101359091169060808101359060a08101359060c00135614b27565b610445614cd0565b61050060048036036040811015610cbf57600080fd5b50600160a060020a038135169060200135614d28565b61044560048036036040811015610ceb57600080fd5b50600160a060020a0381358116916020013516614da9565b61064b60048036036060811015610d1957600080fd5b50600160a060020a038135169060208101359060400135614dd4565b610445615058565b61044560048036036020811015610d5357600080fd5b5035600160a060020a0316615068565b61044560048036036020811015610d7957600080fd5b5035600160a060020a0316615148565b610445600480360360c0811015610d9f57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135615216565b610500615299565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e7d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610ed4576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16610f32576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a60205260409020600390810154610f6791670de0b6b3a76400005b046001016152a9565b831115610fbe576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754610ff894939291908990613a95565b91508161103d576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b82821115611083576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b611091816003015485615392565b600382015560006110a283826152a9565b604080518781529051919250600160a060020a0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110f03384615403565b6111026110fd8483615392565b615411565b60055461111e90620100009004600160a060020a03168261541d565b611129863387615427565b50506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b5050505050905090565b336000818152600160209081526040808320600160a060020a03871680855290835281842086905581518681529151939490939092600080516020615dcf833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff1615611286576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff166112e4576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff16611342576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a038084166000908152600a6020526040808220928516825281206003808401546002808601549284015490840154939461138694929392906141d9565b95945050505050565b600554600090610100900460ff16156113e0576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff1661143e576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff1661149c576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a038084166000908152600a6020526040808220928516825290206003808301546002808501549284015490840154600754611386949291906141d9565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600033600160a060020a03851614806115425750600160a060020a03841660009081526001602090815260408083203384529091529020548211155b611596576040805160e560020a62461bcd02815260206004820152601560248201527f4552525f42544f4b454e5f4241445f43414c4c45520000000000000000000000604482015290519081900360640190fd5b6115a184848461551c565b33600160a060020a038516148015906115df5750600160a060020a038416600090815260016020908152604080832033845290915290205460001914155b1561166157600160a060020a03841660009081526001602090815260408083203384529091529020546116129083615392565b600160a060020a0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615dcf8339815191529281900390910190a35b5060019392505050565b600160a060020a03166000908152600a602052604090205460ff1690565b600554600090610100900460ff16156116da576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b50600654600160a060020a031690565b60055460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117a2576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16156117fa576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600654600160a060020a0316331461184a576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b64e8d4a510008110156118a7576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a0000811115611907576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007556005805461ff0019169055565b600c5460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119cf576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a0390911614611a30576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff16611a8e576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60085460ff1615611ad7576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811015611b37576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d494e5f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b6802b5e3af16b1880000811115611b98576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d41585f574549474854000000000000000000000000000000000000604482015290519081900360640190fd5b620f4240821015611bf3576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4d494e5f42414c414e43450000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090206002015480821115611c9657611c2c600b54611c278484615392565b615638565b600b8190556802b5e3af16b18800001015611c91576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f4d41585f544f54414c5f574549474854000000000000000000000000604482015290519081900360640190fd5b611cb7565b80821015611cb757611cb3600b54611cae8385615392565b615392565b600b555b600160a060020a0384166000908152600a602052604090206002810183905560030180549084905580841115611d0057611cfb8533611cf68785615392565b615695565b611d5a565b80841015611d5a576000611d148286615392565b90506000611d238260006152a9565b9050611d398733611d348585615392565b615427565b600554611d57908890620100009004600160a060020a031683615427565b50505b50506005805461ff0019169055505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e1d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611e74576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16611ed2576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754611f0c94939291908990613c09565b915082821015611f54576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a60205260409020600390810154611f8491670de0b6b3a7640000610f5e565b821115611fdb576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b611fe9816003015483615392565b60038201556000611ffa85826152a9565b604080518581529051919250600160a060020a0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36120483386615403565b6120556110fd8683615392565b60055461207190620100009004600160a060020a03168261541d565b611129863385615427565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561212b576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615612183576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600654600160a060020a031633146121d3576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b6006805491151560a060020a0274ff0000000000000000000000000000000000000000199092169190911790556005805461ff0019169055565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156122bc576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a039091161461231d576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b60085460ff1615612366576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600954600211156123c1576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d494e5f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b6008805460ff191660011790556006805474ff0000000000000000000000000000000000000000191660a060020a17905561240468056bc75e2d63100000615707565b6124173368056bc75e2d6310000061541d565b6005805461ff0019169055565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124d3576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661252a576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60006125346114e0565b905060006125428583615710565b905080612587576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b60005b6009548110156126f7576000600982815481106125a357fe5b6000918252602080832090910154600160a060020a0316808352600a9091526040822060030154909250906125d885836152a9565b90508061261d576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87878581811061262957fe5b90506020020135811115612675576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090206003015461269b9082615638565b600160a060020a0384166000818152600a6020908152604091829020600301939093558051848152905191923392600080516020615d6f8339815191529281900390910190a36126ec833383615695565b50505060010161258a565b5061270185615707565b611d5a338661541d565b600c5460009060ff1615612769576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f414c52454144595f494e495449414c495a4544000000000000000000604482015290519081900360640190fd5b600160a060020a0386166127c7576040805160e560020a62461bcd02815260206004820152601e60248201527f4552525f494e56414c49445f434f4e54524f4c4c45525f414444524553530000604482015290519081900360640190fd5b600160a060020a038516612825576040805160e560020a62461bcd02815260206004820152601b60248201527f4552525f494e56414c49445f464143544f52595f414444524553530000000000604482015290519081900360640190fd5b64e8d4a51000841015612882576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d494e5f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b67016345785d8a00008411156128e2576040805160e560020a62461bcd02815260206004820152600b60248201527f4552525f4d41585f464545000000000000000000000000000000000000000000604482015290519081900360640190fd5b6128ef868686868661584c565b9695505050505050565b6000806129068786615710565b905060006129148786615638565b905060006129228289615710565b90506000612938670de0b6b3a764000085615710565b9050600061294683836158f8565b90506000612954828e6152a9565b90506000612962828f615392565b9050600061298161297b670de0b6b3a76400008a615392565b8b6152a9565b905061299e82612999670de0b6b3a764000084615392565b615710565b9f9e505050505050505050505050505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612a62576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612ab9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16612b17576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060030154612b49906002670de0b6b3a76400005b046152a9565b831115612ba0576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754612bda94939291908990613b54565b915082821015612c22576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b612c30816003015485615638565b6003820155604080518581529051600160a060020a038716913391600080516020615d6f8339815191529181900360200190a3612c6c82615707565b612c76338361541d565b612c81853386615695565b506005805461ff00191690559392505050565b336000908152600160209081526040808320600160a060020a038616845290915281205480831115612ce957336000908152600160209081526040808320600160a060020a0388168452909152812055612d18565b612cf38184615392565b336000908152600160209081526040808320600160a060020a03891684529091529020555b336000818152600160209081526040808320600160a060020a038916808552908352928190205481519081529051929392600080516020615dcf833981519152929181900390910190a35060019392505050565b600033600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612e1d576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612e74576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a602052604090205460ff16612ed2576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0384166000908152600a6020526040902060038101546002808301549054600b54600754612f0c949392919089906128f9565b915081612f51576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b82821115612f97576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a6020526040902060030154612fc7906002670de0b6b3a7640000612b43565b82111561301e576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b61302c816003015483615638565b6003820155604080518381529051600160a060020a038716913391600080516020615d6f8339815191529181900360200190a361306884615707565b613072338561541d565b612c81853384615695565b600160a060020a031660009081526020819052604090205490565b620f4240670de0b6b3a76400006114f6565b6040805160208082523690820181905260009283923392600160e060020a03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561314a576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0387166000908152600a602052604090205460ff166131b7576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a602052604090205460ff16613215576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60065460a060020a900460ff16613276576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b600160a060020a038088166000908152600a6020526040808220928816825290206003808201546132af91670de0b6b3a7640000610f5e565b861115613306576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4d41585f4f55545f524154494f000000000000000000000000000000604482015290519081900360640190fd5b600061332783600301548460020154846003015485600201546007546141d9565b905085811115613381576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b6133a183600301548460020154846003015485600201548b600754615216565b9450888511156133e9576040805160e560020a62461bcd02815260206004820152600c6024820152600080516020615d4f833981519152604482015290519081900360640190fd5b6133f7836003015486615638565b836003018190555061340d826003015488615392565b6003808401829055840154600280860154908501546007546134309491906141d9565b935080841015613478576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b858411156134d0576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b6134da8588615710565b81111561351f576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87600160a060020a03168a600160a060020a031633600160a060020a03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46135878a3387615695565b613592883389615427565b5050506005805461ff001916905590969095509350505050565b6040805160208082523690820181905260009283923392600160e060020a03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561364c576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0387166000908152600a602052604090205460ff166136b9576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600a602052604090205460ff16613717576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60065460a060020a900460ff16613778576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f535741505f4e4f545f5055424c494300000000000000000000000000604482015290519081900360640190fd5b600160a060020a038088166000908152600a60205260408082209288168252902060038201546137b2906002670de0b6b3a7640000612b43565b881115613809576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d41585f494e5f524154494f00000000000000000000000000000000604482015290519081900360640190fd5b600061382a83600301548460020154846003015485600201546007546141d9565b905085811115613884576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f4241445f4c494d49545f505249434500000000000000000000000000604482015290519081900360640190fd5b6138a483600301548460020154846003015485600201548d6007546145a9565b9450868510156138ec576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b6138fa83600301548a615638565b8360030181905550613910826003015486615392565b6003808401829055840154600280860154908501546007546139339491906141d9565b93508084101561397b576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b858411156139d3576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f4c494d49545f50524943450000000000000000000000000000000000604482015290519081900360640190fd5b6139dd8986615710565b811115613a22576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b87600160a060020a03168a600160a060020a031633600160a060020a03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a4613a8a8a338b615695565b613592883387615427565b600080613aa28786615710565b90506000613ab8670de0b6b3a764000083615392565b90506000613ac682866152a9565b90506000613ae087612999670de0b6b3a764000085615392565b90506000613aee8c83615392565b90506000613afc828e615710565b90506000613b0a82886158f8565b90506000613b18828e6152a9565b90506000613b268e83615392565b9050613b3f81612999670de0b6b3a76400006000615392565b99505050505050505050509695505050505050565b600080613b618786615710565b90506000613b80613b7a670de0b6b3a764000084615392565b856152a9565b90506000613b9f86613b9a670de0b6b3a764000085615392565b6152a9565b90506000613bad8b83615638565b90506000613bbb828d615710565b90506000613bc982876158f8565b90506000613bd7828d6152a9565b9050613be3818d615392565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a76400006114f6565b600080613c168786615710565b90506000613c3185613b9a670de0b6b3a76400006000615392565b90506000613c3f8883615392565b90506000613c4d828a615710565b90506000613c6c82613c67670de0b6b3a764000088615710565b6158f8565b90506000613c7a828e6152a9565b90506000613c888e83615392565b90506000613ca161297b670de0b6b3a76400008a615392565b905061299e82613b9a670de0b6b3a764000084615392565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d68576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a0381166000908152600a602052604090205460ff16613dd5576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038316916370a08231916024808301926020929190829003018186803b158015613e3457600080fd5b505afa158015613e48573d6000803e3d6000fd5b505050506040513d6020811015613e5e57600080fd5b5051600160a060020a039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613f42576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff001916610100179055600160a060020a038116613faf576040805160e560020a62461bcd02815260206004820152601b60248201527f4552525f494e56414c49445f4d414e414745525f414444524553530000000000604482015290519081900360640190fd5b600654600160a060020a03163314613fff576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561408a576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff16156140ef576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff1661414d576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b50600160a060020a03166000908152600a602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111c95780601f1061119e576101008083540402835291602001916111c9565b6704a03ce68d21555681565b6000806141e68787615710565b905060006141f48686615710565b905060006142028383615710565b90506000614224670de0b6b3a7640000612999670de0b6b3a764000089615392565b905061423082826152a9565b9a9950505050505050505050565b600061424b33848461551c565b50600192915050565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614303576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661435a576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60006143646114e0565b905060006143738560006152a9565b905060006143818683615392565b9050600061438f8285615710565b9050806143d4576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b6143de3388615403565b6005546143fa90620100009004600160a060020a03168461541d565b61440382615411565b60005b6009548110156145855760006009828154811061441f57fe5b6000918252602080832090910154600160a060020a0316808352600a90915260408220600301549092509061445485836152a9565b905080614499576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020615e2f833981519152604482015290519081900360640190fd5b8989858181106144a557fe5b905060200201358110156144f1576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615e0f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a60205260409020600301546145179082615392565b600160a060020a0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a361457a833383615427565b505050600101614406565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b6000806145b68786615710565b905060006145cc670de0b6b3a764000085615392565b90506145d885826152a9565b905060006145ea8a6129998c85615638565b905060006145f882856158f8565b9050600061460e670de0b6b3a764000083615392565b905061461a8a826152a9565b9c9b505050505050505050505050565b600a670de0b6b3a76400006114f6565b671bc16d674ec7ffff81565b600554606090610100900460ff1615614697576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b60085460ff166146df576040805160e560020a62461bcd0281526020600482015260116024820152600080516020615d0f833981519152604482015290519081900360640190fd5b60098054806020026020016040519081016040528092919081815260200182805480156111c957602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311614717575050505050905090565b600081565b600554606090610100900460ff16156146df576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b60095490565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614849576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b6005805461ff00191661010017905560065433600160a060020a03909116146148aa576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff16614908576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b60085460ff1615614951576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600160a060020a0381166000908152600a60205260408120600301549061497882826152a9565b600b54600160a060020a0385166000908152600a60205260409020600201549192506149a391615392565b600b55600160a060020a0383166000908152600a60205260409020600101546009805460001981019190829081106149d757fe5b60009182526020909120015460098054600160a060020a0390921691849081106149fd57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a0316021790555081600a600060098581548110614a3d57fe5b6000918252602080832090910154600160a060020a031683528201929092526040019020600101556009805480614a7057fe5b600082815260208082206000199084018101805473ffffffffffffffffffffffffffffffffffffffff191690559092019092556040805160808101825283815280830184815281830185815260608301868152600160a060020a038c168752600a909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614b098533611d348787615392565b600554611d5a908690620100009004600160a060020a031685615427565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600160a060020a038716614be6576040805160e560020a62461bcd02815260206004820152601d60248201527f4552525f494e56414c49445f44415441544f4b454e5f41444452455353000000604482015290519081900360640190fd5b600160a060020a038416614c44576040805160e560020a62461bcd02815260206004820152601d60248201527f4552525f494e56414c49445f42415345544f4b454e5f41444452455353000000604482015290519081900360640190fd5b614c4f878787614dd4565b604080518781529051600160a060020a038916913391600080516020615d6f8339815191529181900360200190a3614c88848484614dd4565b604080518481529051600160a060020a038616913391600080516020615d6f8339815191529181900360200190a3614cbf816116f3565b614cc761220d565b50505050505050565b600554600090610100900460ff1615614d21576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b5060075490565b336000908152600160209081526040808320600160a060020a0386168452909152812054614d569083615638565b336000818152600160209081526040808320600160a060020a038916808552908352928190208590558051948552519193600080516020615dcf833981519152929081900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b33600160a060020a0316600035600160e060020a031916600160e060020a03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600654600160a060020a03163314614e85576040805160e560020a62461bcd0281526020600482015260126024820152600080516020615d8f833981519152604482015290519081900360640190fd5b600160a060020a0383166000908152600a602052604090205460ff1615614ef6576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f49535f424f554e440000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff1615614f3f576040805160e560020a62461bcd0281526020600482015260106024820152600080516020615def833981519152604482015290519081900360640190fd5b600954600811614f99576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f4d41585f544f4b454e53000000000000000000000000000000000000604482015290519081900360640190fd5b604080516080810182526001808252600980546020808501918252600085870181815260608701828152600160a060020a038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01805473ffffffffffffffffffffffffffffffffffffffff19169091179055615053838383611920565b505050565b6002670de0b6b3a76400006114f6565b600554600090610100900460ff16156150b9576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff16615117576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a6020526040902060020154600b54615141908290615710565b9392505050565b600554600090610100900460ff1615615199576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615d2f833981519152604482015290519081900360640190fd5b600160a060020a0382166000908152600a602052604090205460ff166151f7576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615daf833981519152604482015290519081900360640190fd5b50600160a060020a03166000908152600a602052604090206003015490565b6000806152238588615710565b905060006152318786615392565b9050600061523f8883615710565b9050600061524d82856158f8565b905061526181670de0b6b3a7640000615392565b9050615275670de0b6b3a764000087615392565b945061528a6152848c836152a9565b86615710565b9b9a5050505050505050505050565b60065460a060020a900460ff1690565b60008282028315806152c35750828482816152c057fe5b04145b615317576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6706f05b59d3b2000081018181101561537a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4d554c5f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b60008060006153a18585615a1b565b9150915080156153fb576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f5355425f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509392505050565b61540d8282615a40565b5050565b61541a81615a4b565b50565b61540d8282615b27565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b15801561549357600080fd5b505af11580156154a7573d6000803e3d6000fd5b505050506040513d60208110156154bd57600080fd5b5051905080615516576040805160e560020a62461bcd02815260206004820152600f60248201527f4552525f45524332305f46414c53450000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b600160a060020a03831660009081526020819052604090205481111561558c576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b600160a060020a0383166000908152602081905260409020546155af9082615392565b600160a060020a0380851660009081526020819052604080822093909355908416815220546155de9082615638565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015615141576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4144445f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b15801561549357600080fd5b61541a81615b32565b600081615767576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4449565f5a45524f0000000000000000000000000000000000000000604482015290519081900360640190fd5b670de0b6b3a7640000830283158061578f5750670de0b6b3a764000084828161578c57fe5b04145b6157e3576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b60028304810181811015615841576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f4449565f494e5445524e414c00000000000000000000000000000000604482015290519081900360640190fd5b600084828161538757fe5b6006805460058054600160a060020a03978816620100000275ffffffffffffffffffffffffffffffffffffffff00001990911617905560079490945591151560a060020a0274ff0000000000000000000000000000000000000000199590941673ffffffffffffffffffffffffffffffffffffffff199093169290921793909316919091179091556008805491151560ff19928316179055600c80549091166001179081905560ff1690565b60006001831015615953576040805160e560020a62461bcd02815260206004820152601560248201527f4552525f42504f575f424153455f544f4f5f4c4f570000000000000000000000604482015290519081900360640190fd5b671bc16d674ec7ffff8311156159b3576040805160e560020a62461bcd02815260206004820152601660248201527f4552525f42504f575f424153455f544f4f5f4849474800000000000000000000604482015290519081900360640190fd5b60006159be83615ba7565b905060006159cc8483615392565b905060006159e2866159dd85615bc2565b615bd0565b9050816159f3579250611222915050565b6000615a0487846305f5e100615c30565b9050615a1082826152a9565b979650505050505050565b600080828410615a315750508082036000615a39565b505081810360015b9250929050565b61540d82308361551c565b30600090815260208190526040902054811115615ab2576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e53554646494349454e545f42414c000000000000000000000000604482015290519081900360640190fd5b30600090815260208190526040902054615acc9082615392565b30600090815260208190526040902055600254615ae99082615392565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b61540d30838361551c565b30600090815260208190526040902054615b4c9082615638565b30600090815260208190526040902055600254615b699082615638565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a7640000615bbb83615bc2565b0292915050565b670de0b6b3a7640000900490565b6000828160028406615bea57670de0b6b3a7640000615bec565b815b90506002840493505b8315615c2857615c0582836152a9565b91506002840615615c1d57615c1a81836152a9565b90505b600284049350615bf5565b949350505050565b6000828180615c4787670de0b6b3a7640000615a1b565b9092509050670de0b6b3a764000080600060015b888410615cff576000670de0b6b3a764000082029050600080615c8f8a615c8a85670de0b6b3a7640000615392565b615a1b565b91509150615ca187613b9a848c6152a9565b9650615cad8784615710565b965086615cbc57505050615cff565b8715615cc6579315935b8015615cd0579315935b8415615ce757615ce08688615392565b9550615cf4565b615cf18688615638565b95505b505050600101615c5b565b5090999850505050505050505056fe4552525f4e4f545f46494e414c495a45440000000000000000000000000000004552525f5245454e5452590000000000000000000000000000000000000000004552525f4c494d49545f494e000000000000000000000000000000000000000063982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a4552525f4e4f545f434f4e54524f4c4c455200000000000000000000000000004552525f4e4f545f424f554e44000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254552525f49535f46494e414c495a4544000000000000000000000000000000004552525f4c494d49545f4f5554000000000000000000000000000000000000004552525f4d4154485f415050524f580000000000000000000000000000000000a165627a7a7230582068902cb8432d3fc49bc013872e4c37dba3910763abe6baad739eeb9bc07abdf10029
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)