Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 12277432 | 1385 days ago | IN | 0 ETH | 0.05406376 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-18 */ pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library SafeERC20 { function _safeApprove(IERC20 token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!TransferHelper: APPROVE_FAILED'); } function safeApprove(IERC20 token, address to, uint value) internal { if (value > 0) _safeApprove(token, to, 0); return _safeApprove(token, to, value); } function safeTransfer(IERC20 token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(IERC20 token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, '!TransferHelper: ETH_TRANSFER_FAILED'); } } pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** *Submitted for verification at Etherscan.io on 2021-01-14 */ pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IMintERC20 { /** * @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); function mint(address recipient, uint256 amount) external; function burn(uint256 amount) external; function burnFrom(address sender, uint256 amount) external; /** * @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); } pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } pragma solidity 0.6.12; interface IMigratorChef { // Perform LP token migration from legacy UniswapV2 to SushiSwap. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to UniswapV2 LP tokens. // SushiSwap must mint EXACTLY the same amount of SushiSwap LP tokens or // else something bad will happen. Traditional UniswapV2 does not // do that so be careful! function migrate(IERC20 token) external returns (IERC20); } // MasterChef is the master of Sushi. He can make Sushi and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once SUSHI is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChef is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IMintERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of SUSHIs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accSushiPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accSushiPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block. uint256 poolType; // Pool type uint256 amount; // User deposit amount address routerv2; // RouterV2 uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs. uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below. } // Pool type. uint256 public constant POOL_THISLPTOKEN = 0; uint256 public constant POOL_TOKEN = 1; uint256 public constant POOL_LPTOKEN = 2; uint256 public constant POOL_SLPTOKEN = 3; uint256 public constant POOL_SLPLPTOKEN = 4; uint256 public constant POOL_UNSUPPORT = 5; address public constant UNIV2ROUTER2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // mainnet address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant SLPV2ROUTER2 = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // The SUSHI TOKEN! IMintERC20 public sushi; address public pairaddr; // Dev address. address public devaddr; // SUSHI tokens created per block. uint256 public sushiPerBlock; // Halving blocks; uint256 public blocksHalving; // The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when SUSHI mining starts. uint256 public startBlock; // Block number when bonus SUSHI period ends. uint256 public bonusEndBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, uint256 liquidity); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); function initialize( IMintERC20 _sushi, address _devaddr, uint256 _sushiPerBlock, uint256 _startBlock, uint256 _blocksHalving ) public initializer { Ownable.__Ownable_init(); sushi = _sushi; devaddr = _devaddr; sushiPerBlock = _sushiPerBlock; startBlock = _startBlock; bonusEndBlock = _startBlock + _blocksHalving; blocksHalving = _blocksHalving; } receive() external payable { assert(msg.sender == WETH); } function setPair(address _pairaddr) public onlyOwner { pairaddr = _pairaddr; IERC20(pairaddr).safeApprove(UNIV2ROUTER2, uint(-1)); IERC20(WETH).safeApprove(UNIV2ROUTER2, uint(-1)); IERC20(address(sushi)).safeApprove(UNIV2ROUTER2, uint(-1)); IERC20(WETH).safeApprove(SLPV2ROUTER2, uint(-1)); } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate, uint256 _type) public { require(msg.sender == owner() || msg.sender == devaddr, "!dev addr"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; address routerv2 = UNIV2ROUTER2; if (_type == POOL_SLPTOKEN || _type == POOL_SLPLPTOKEN) { routerv2 = SLPV2ROUTER2; } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, poolType: _type, amount: 0, routerv2: routerv2, lastRewardBlock: lastRewardBlock, accSushiPerShare: 0 })); _lpToken.safeApprove(UNIV2ROUTER2, uint(-1)); _lpToken.safeApprove(SLPV2ROUTER2, uint(-1)); if (_type == POOL_LPTOKEN) { address token0 = IUniswapV2Pair(address(_lpToken)).token0(); address token1 = IUniswapV2Pair(address(_lpToken)).token1(); IERC20(token0).safeApprove(UNIV2ROUTER2, uint(-1)); IERC20(token1).safeApprove(UNIV2ROUTER2, uint(-1)); } else if (_type == POOL_SLPLPTOKEN) { address token0 = IUniswapV2Pair(address(_lpToken)).token0(); address token1 = IUniswapV2Pair(address(_lpToken)).token1(); IERC20(token0).safeApprove(SLPV2ROUTER2, uint(-1)); IERC20(token1).safeApprove(SLPV2ROUTER2, uint(-1)); } } // Update the given pool's SUSHI allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public { require(msg.sender == owner() || msg.sender == devaddr, "!dev addr"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // Set the migrator contract. Can only be called by the owner. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "migrate: no migrator"); PoolInfo storage pool = poolInfo[_pid]; IERC20 lpToken = pool.lpToken; uint256 bal = lpToken.balanceOf(address(this)); lpToken.safeApprove(address(migrator), bal); IERC20 newLpToken = migrator.migrate(lpToken); require(bal == newLpToken.balanceOf(address(this)), "migrate: bad"); pool.lpToken = newLpToken; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } // View function to see pending SUSHIs on frontend. function pendingSushi(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSushiPerShare = pool.accSushiPerShare; uint256 lpSupply = pool.amount; if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 sushiReward = multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accSushiPerShare = accSushiPerShare.add(sushiReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accSushiPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } if (block.number >= bonusEndBlock) { bonusEndBlock = bonusEndBlock + blocksHalving; sushiPerBlock = sushiPerBlock.div(2); } uint256 lpSupply = pool.amount; if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 sushiReward = multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(totalAllocPoint); sushi.mint(devaddr, sushiReward.div(100)); sushi.mint(address(this), sushiReward); pool.accSushiPerShare = pool.accSushiPerShare.add(sushiReward.mul(1e12).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for SUSHI allocation. function deposit(uint256 _pid, uint256 _amount) public payable { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 liquidity; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accSushiPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeSushiTransfer(msg.sender, pending); } } if (address(pool.lpToken) == WETH) { if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); } if (msg.value > 0) { IWETH(WETH).deposit{value: msg.value}(); _amount = _amount.add(msg.value); } } else if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); } if(_amount > 0) { if (pool.poolType == POOL_TOKEN || pool.poolType == POOL_SLPTOKEN) { liquidity = tokenToLp(pool.routerv2, pool.lpToken, _amount.sub(_amount.mul(1).div(100))); } else if (pool.poolType == POOL_LPTOKEN || pool.poolType == POOL_SLPLPTOKEN) { liquidity = lptokenToLp(pool.routerv2, pool.lpToken, _amount.sub(_amount.mul(1).div(100))); } pool.amount = pool.amount.add(_amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount, liquidity); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accSushiPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeSushiTransfer(msg.sender, pending); } if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.amount = pool.amount.sub(_amount); _amount = _amount.mul(1).div(100); if (address(pool.lpToken) == WETH) { IWETH(WETH).withdraw(_amount); SafeERC20.safeTransferETH(address(msg.sender), _amount); } else { pool.lpToken.safeTransfer(address(msg.sender), _amount); } } user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Safe sushi transfer function, just in case if rounding error causes pool to not have enough SUSHIs. function safeSushiTransfer(address _to, uint256 _amount) internal { uint256 sushiBal = sushi.balanceOf(address(this)); if (_amount > sushiBal) { sushi.transfer(_to, sushiBal); } else { sushi.transfer(_to, _amount); } } // Update dev address by the previous dev. function dev(address _devaddr) public { require(msg.sender == devaddr, "dev: wut?"); devaddr = _devaddr; } function swapExactTokensForTokens(address _router, address _fromToken, address _toToken, uint256 _amount) internal returns (uint256) { if (_fromToken == _toToken || _amount == 0) return _amount; address[] memory path = new address[](2); path[0] = _fromToken; path[1] = _toToken; uint[] memory amount = IUniswapV2Router02(_router).swapExactTokensForTokens( _amount, 0, path, address(this), now.add(60)); return amount[amount.length - 1]; } function swapExactTokensForTokens(address _fromToken, address _toToken, uint256 _amount) internal returns (uint256) { return swapExactTokensForTokens(UNIV2ROUTER2, _fromToken, _toToken, _amount); } function tokenToLp(address _router, IERC20 _token, uint256 _amount) internal returns (uint256 liq) { if (_amount == 0) return 0; if (address(_token) != WETH) { // IERC20(_token).safeApprove(UNIV2ROUTER2, _amount); _amount = swapExactTokensForTokens(_router, address(_token), WETH, _amount); } uint256 amountBuy = _amount.mul(5025).div(10000); uint256 amountEth = _amount.sub(amountBuy); address[] memory path = new address[](2); path[0] = WETH; path[1] = address(sushi); uint256[] memory amounts = IUniswapV2Router02(UNIV2ROUTER2).swapExactTokensForTokens( amountBuy, 0, path, address(this), now.add(60)); uint256 amountToken = amounts[1]; (,, liq) = IUniswapV2Router02(UNIV2ROUTER2).addLiquidity( WETH, address(sushi), amountEth, amountToken, 0, 0, address(this), now.add(60)); } function lptokenToLp(address _router, IERC20 _lpToken, uint256 _amount) internal returns (uint256 liq) { if (_amount == 0) return 0; address token0 = IUniswapV2Pair(address(_lpToken)).token0(); address token1 = IUniswapV2Pair(address(_lpToken)).token1(); (uint256 amount0, uint256 amount1) = IUniswapV2Router02(_router).removeLiquidity( token0, token1, _amount, 0, 0, address(this), now.add(60)); amount0 = swapExactTokensForTokens(_router, token0, WETH, amount0); amount1 = swapExactTokensForTokens(_router, token1, WETH, amount1); return tokenToLp(_router, IERC20(WETH), amount0.add(amount1)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"POOL_LPTOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_SLPLPTOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_SLPTOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_THISLPTOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_UNSUPPORT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLPV2ROUTER2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIV2ROUTER2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksHalving","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IMintERC20","name":"_sushi","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_sushiPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_blocksHalving","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSushi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"routerv2","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSushiPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairaddr","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushi","outputs":[{"internalType":"contract IMintERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000609f5534801561001557600080fd5b50613256806100256000396000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063a2d151dd116100ab578063d23226e21161006f578063d23226e214610720578063d49e77cd14610735578063e2bbb1581461074a578063e4fb9b111461076d578063f2fde38b146107825761023c565b8063a2d151dd1461067d578063a508389c14610692578063ad5c4648146106a7578063b0bcf42a146106bc578063d13f90b4146106d15761023c565b80638d88a90e116100f25780638d88a90e1461056c5780638da5cb5b1461059f5780638dbb1e3a146105b457806393f1a40b146105e457806396805e54146106365761023c565b8063715018a6146104fa5780637a2c59571461050f5780637cd07e47146105245780638187f516146105395761023c565b8063307b4d13116101a65780634ee6b167116101755780634ee6b1671461045957806351eb05a61461046e578063630b5ba11461049857806364482f79146104ad57806369c2cddb146104e55761023c565b8063307b4d13146103d5578063441a3e70146103ea578063454b06081461041a57806348cd4cb1146104445761023c565b8063195426ec116101ed578063195426ec1461032a5780631aed6553146103635780631e5097be1461037857806320ad65861461038d57806323cf3118146103a25761023c565b8063081e3eda146102415780630a087903146102685780631526fe271461029957806317caf6f1146103155761023c565b3661023c57336000805160206131238339815191521461023a57fe5b005b600080fd5b34801561024d57600080fd5b506102566107b5565b60408051918252519081900360200190f35b34801561027457600080fd5b5061027d6107bb565b604080516001600160a01b039092168252519081900360200190f35b3480156102a557600080fd5b506102c3600480360360208110156102bc57600080fd5b50356107ca565b60405180886001600160a01b03168152602001878152602001868152602001858152602001846001600160a01b0316815260200183815260200182815260200197505050505050505060405180910390f35b34801561032157600080fd5b50610256610822565b34801561033657600080fd5b506102566004803603604081101561034d57600080fd5b50803590602001356001600160a01b0316610828565b34801561036f57600080fd5b50610256610930565b34801561038457600080fd5b50610256610936565b34801561039957600080fd5b5061025661093b565b3480156103ae57600080fd5b5061023a600480360360208110156103c557600080fd5b50356001600160a01b0316610940565b3480156103e157600080fd5b506102566109ba565b3480156103f657600080fd5b5061023a6004803603604081101561040d57600080fd5b50803590602001356109c0565b34801561042657600080fd5b5061023a6004803603602081101561043d57600080fd5b5035610bd5565b34801561045057600080fd5b50610256610e36565b34801561046557600080fd5b5061027d610e3c565b34801561047a57600080fd5b5061023a6004803603602081101561049157600080fd5b5035610e4b565b3480156104a457600080fd5b5061023a611020565b3480156104b957600080fd5b5061023a600480360360608110156104d057600080fd5b50803590602081013590604001351515611043565b3480156104f157600080fd5b5061025661112a565b34801561050657600080fd5b5061023a61112f565b34801561051b57600080fd5b506102566111d1565b34801561053057600080fd5b5061027d6111d6565b34801561054557600080fd5b5061023a6004803603602081101561055c57600080fd5b50356001600160a01b03166111e5565b34801561057857600080fd5b5061023a6004803603602081101561058f57600080fd5b50356001600160a01b031661130b565b3480156105ab57600080fd5b5061027d611378565b3480156105c057600080fd5b50610256600480360360408110156105d757600080fd5b5080359060200135611387565b3480156105f057600080fd5b5061061d6004803603604081101561060757600080fd5b50803590602001356001600160a01b031661139a565b6040805192835260208301919091528051918290030190f35b34801561064257600080fd5b5061023a6004803603608081101561065957600080fd5b508035906001600160a01b03602082013516906040810135151590606001356113be565b34801561068957600080fd5b5061027d6118f0565b34801561069e57600080fd5b50610256611908565b3480156106b357600080fd5b5061027d61190d565b3480156106c857600080fd5b5061025661191f565b3480156106dd57600080fd5b5061023a600480360360a08110156106f457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135611925565b34801561072c57600080fd5b50610256611a18565b34801561074157600080fd5b5061027d611a1d565b61023a6004803603604081101561076057600080fd5b5080359060200135611a2c565b34801561077957600080fd5b5061027d611cca565b34801561078e57600080fd5b5061023a600480360360208110156107a557600080fd5b50356001600160a01b0316611ce2565b609d5490565b6097546001600160a01b031681565b609d81815481106107d757fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b0395861697509395929491939116919087565b609f5481565b600080609d848154811061083857fe5b60009182526020808320878452609e825260408085206001600160a01b0389168652909252922060066007909202909201908101546003820154600583015492945090914311801561088957508015155b156108f557600061089e856005015443611387565b905060006108d1609f546108cb88600101546108c5609a5487611ddb90919063ffffffff16565b90611ddb565b90611e34565b90506108f06108e9846108cb8464e8d4a51000611ddb565b8590611e76565b935050505b610923836001015461091d64e8d4a510006108cb868860000154611ddb90919063ffffffff16565b90611ed0565b9450505050505b92915050565b60a15481565b600081565b600181565b610948611f12565b6065546001600160a01b03908116911614610998576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b609c80546001600160a01b0319166001600160a01b0392909216919091179055565b609b5481565b6000609d83815481106109cf57fe5b60009182526020808320868452609e825260408085203386529092529220805460079092029092019250831115610a42576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610a4b84610e4b565b6000610a79826001015461091d64e8d4a510006108cb87600601548760000154611ddb90919063ffffffff16565b90508015610a8b57610a8b3382611f16565b8315610b77578154610a9d9085611ed0565b82556003830154610aae9085611ed0565b6003840155610ac360646108cb866001611ddb565b83549094506001600160a01b03166000805160206131238339815191521415610b61576000805160206131238339815191526001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b3a57600080fd5b505af1158015610b4e573d6000803e3d6000fd5b50505050610b5c33856120a7565b610b77565b8254610b77906001600160a01b0316338661219a565b60068301548254610b929164e8d4a51000916108cb91611ddb565b6001830155604080518581529051869133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050505050565b609c546001600160a01b0316610c29576040805162461bcd60e51b815260206004820152601460248201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b604482015290519081900360640190fd5b6000609d8281548110610c3857fe5b6000918252602080832060079092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116939284926370a08231926024808201939291829003018186803b158015610c9657600080fd5b505afa158015610caa573d6000803e3d6000fd5b505050506040513d6020811015610cc057600080fd5b5051609c54909150610cdf906001600160a01b038481169116836122fd565b609c546040805163ce5494bb60e01b81526001600160a01b0385811660048301529151600093929092169163ce5494bb9160248082019260209290919082900301818787803b158015610d3157600080fd5b505af1158015610d45573d6000803e3d6000fd5b505050506040513d6020811015610d5b57600080fd5b5051604080516370a0823160e01b815230600482015290519192506001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d6020811015610dd157600080fd5b50518214610e15576040805162461bcd60e51b815260206004820152600c60248201526b1b5a59dc985d194e8818985960a21b604482015290519081900360640190fd5b83546001600160a01b0319166001600160a01b039190911617909255505050565b60a05481565b6098546001600160a01b031681565b6000609d8281548110610e5a57fe5b9060005260206000209060070201905080600501544311610e7b575061101d565b60a1544310610ea257609b5460a180549091019055609a54610e9e906002611e34565b609a555b600381015480610eb957504360059091015561101d565b6000610ec9836005015443611387565b90506000610ef0609f546108cb86600101546108c5609a5487611ddb90919063ffffffff16565b6097546099549192506001600160a01b03908116916340c10f199116610f17846064611e34565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b5050609754604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b0390921693506340c10f19925060448082019260009290919082900301818387803b158015610fc857600080fd5b505af1158015610fdc573d6000803e3d6000fd5b5050505061100a610fff846108cb64e8d4a5100085611ddb90919063ffffffff16565b600686015490611e76565b6006850155505043600590920191909155505b50565b609d5460005b8181101561103f5761103781610e4b565b600101611026565b5050565b61104b611378565b6001600160a01b0316336001600160a01b0316148061107457506099546001600160a01b031633145b6110b1576040805162461bcd60e51b815260206004820152600960248201526810b232bb1030b2323960b91b604482015290519081900360640190fd5b80156110bf576110bf611020565b6110fc826110f6609d86815481106110d357fe5b906000526020600020906007020160010154609f54611ed090919063ffffffff16565b90611e76565b609f8190555081609d848154811061111057fe5b906000526020600020906007020160010181905550505050565b600281565b611137611f12565b6065546001600160a01b03908116911614611187576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600381565b609c546001600160a01b031681565b6111ed611f12565b6065546001600160a01b0390811691161461123d576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b609880546001600160a01b0319166001600160a01b0383811691909117918290556112809116737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6112af600080516020613123833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6097546112dc906001600160a01b0316737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b61101d60008051602061312383398151915273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b6099546001600160a01b03163314611356576040805162461bcd60e51b81526020600482015260096024820152686465763a207775743f60b81b604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031690565b60006113938284611ed0565b9392505050565b609e6020908152600092835260408084209091529082529020805460019091015482565b6113c6611378565b6001600160a01b0316336001600160a01b031614806113ef57506099546001600160a01b031633145b61142c576040805162461bcd60e51b815260206004820152600960248201526810b232bb1030b2323960b91b604482015290519081900360640190fd5b811561143a5761143a611020565b600060a054431161144d5760a05461144f565b435b9050737a250d5630b4cf539739df2c5dacb4c659f2488d60038314806114755750600483145b15611491575073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f5b609f5461149e9087611e76565b609f556040805160e0810182526001600160a01b03808816808352602083018a81529383018781526000606085018181528785166080870190815260a087018a815260c08801848152609d80546001810182559552975160079094027fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b810180549589166001600160a01b031996871617905598517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7c8a015593517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7d89015590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7e880155517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7f870180549190951691161790925590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf8084015590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf819092019190915561164490737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b61166e6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b60028314156117ad576000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0389169163d21220a7916004808301926020929190829003018186803b15801561172457600080fd5b505afa158015611738573d6000803e3d6000fd5b505050506040513d602081101561174e57600080fd5b5051905061177c6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6117a66001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b50506118e8565b60048314156118e8576000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d602081101561181b57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0389169163d21220a7916004808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b505190506118bb6001600160a01b03831673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b6118e56001600160a01b03821673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b50505b505050505050565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b600481565b60008051602061312383398151915281565b609a5481565b600054610100900460ff168061193e575061193e61231a565b8061194c575060005460ff16155b6119875760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156119b2576000805460ff1961ff0019909116610100171660011790555b6119ba612320565b609780546001600160a01b038089166001600160a01b0319928316179092556099805492881692909116919091179055609a84905560a083905581830160a155609b82905580156118e8576000805461ff0019169055505050505050565b600581565b6099546001600160a01b031681565b6000609d8381548110611a3b57fe5b60009182526020808320868452609e82526040808520338652909252908320600790920201925090611a6c85610e4b565b815415611ab5576000611aa1836001015461091d64e8d4a510006108cb88600601548860000154611ddb90919063ffffffff16565b90508015611ab357611ab33382611f16565b505b82546001600160a01b03166000805160206131238339815191521415611b75578315611af2578254611af2906001600160a01b03163330876123d1565b3415611b70576000805160206131238339815191526001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b4157600080fd5b505af1158015611b55573d6000803e3d6000fd5b5050505050611b6d3485611e7690919063ffffffff16565b93505b611b92565b8315611b92578254611b92906001600160a01b03163330876123d1565b8315611c6457600183600201541480611baf575060038360020154145b15611bf25760048301548354611beb916001600160a01b039081169116611be6611bdf60646108cb8a6001611ddb565b8890611ed0565b612526565b9050611c41565b600283600201541480611c09575060048360020154145b15611c415760048301548354611c3e916001600160a01b039081169116611c39611bdf60646108cb8a6001611ddb565b6128c9565b90505b6003830154611c509085611e76565b60038401558154611c619085611e76565b82555b60068301548254611c7f9164e8d4a51000916108cb91611ddb565b600183015560408051858152602081018390528151879233927f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e929081900390910190a35050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b611cea611f12565b6065546001600160a01b03908116911614611d3a576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b6001600160a01b038116611d7f5760405162461bcd60e51b81526004018080602001828103825260268152602001806131436026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b600082611dea5750600061092a565b82820282848281611df757fe5b04146113935760405162461bcd60e51b81526004018080602001828103825260218152602001806131696021913960400191505060405180910390fd5b600061139383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ae9565b600082820183811015611393576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061139383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b8b565b3390565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6020811015611f8b57600080fd5b505190508082111561201f576097546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b506120a29050565b6097546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561207557600080fd5b505af1158015612089573d6000803e3d6000fd5b505050506040513d602081101561209f57600080fd5b50505b505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106120f35780518252601f1990920191602091820191016120d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612155576040519150601f19603f3d011682016040523d82523d6000602084013e61215a565b606091505b50509050806120a25760405162461bcd60e51b815260040180806020018281038252602481526020018061318a6024913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106122175780518252601f1990920191602091820191016121f8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b50915091508180156122ac5750805115806122ac57508080602001905160208110156122a957600080fd5b50515b61209f576040805162461bcd60e51b815260206004820181905260248201527f215472616e7366657248656c7065723a205452414e534645525f4641494c4544604482015290519081900360640190fd5b801561230f5761230f83836000612be5565b6120a2838383612be5565b303b1590565b600054610100900460ff1680612339575061233961231a565b80612347575060005460ff16155b6123825760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156123ad576000805460ff1961ff0019909116610100171660011790555b6123b5612d48565b6123bd612de8565b801561101d576000805461ff001916905550565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106124565780518252601f199092019160209182019101612437565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146124b8576040519150601f19603f3d011682016040523d82523d6000602084013e6124bd565b606091505b50915091508180156124eb5750805115806124eb57508080602001905160208110156124e857600080fd5b50515b6118e85760405162461bcd60e51b81526004018080602001828103825260258152602001806131fc6025913960400191505060405180910390fd5b60008161253557506000611393565b6001600160a01b038316600080516020613123833981519152146125705761256d848460008051602061312383398151915285612ee1565b91505b60006125846127106108cb856113a1611ddb565b905060006125928483611ed0565b604080516002808252606080830184529394509091602083019080368337019050509050600080516020613123833981519152816000815181106125d257fe5b6001600160a01b0392831660209182029290920101526097548251911690829060019081106125fd57fe5b6001600160a01b03909216602092830291909101909101526060737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed1739856000853061264142603c611e76565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156126b1578181015183820152602001612699565b505050509050019650505050505050600060405180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561271757600080fd5b810190808051604051939291908464010000000082111561273757600080fd5b90830190602082018581111561274c57600080fd5b825186602082028301116401000000008211171561276957600080fd5b82525081516020918201928201910280838360005b8381101561279657818101518382015260200161277e565b5050505090500160405250505090506000816001815181106127b457fe5b6020908102919091010151609754909150737a250d5630b4cf539739df2c5dacb4c659f2488d9063e8e3370090600080516020613123833981519152906001600160a01b031687856000803061280b42603c611e76565b6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b0316815260200182815260200198505050505050505050606060405180830381600087803b15801561288d57600080fd5b505af11580156128a1573d6000803e3d6000fd5b505050506040513d60608110156128b757600080fd5b50604001519998505050505050505050565b6000816128d857506000611393565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561291357600080fd5b505afa158015612927573d6000803e3d6000fd5b505050506040513d602081101561293d57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0387169163d21220a7916004808301926020929190829003018186803b15801561298557600080fd5b505afa158015612999573d6000803e3d6000fd5b505050506040513d60208110156129af57600080fd5b505190506000806001600160a01b03881663baa2abde8585898580306129d642603c611e76565b6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001876001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b031681526020018281526020019750505050505050506040805180830381600087803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b505050506040513d6040811015612a7a57600080fd5b5080516020909101519092509050612aa2888560008051602061312383398151915285612ee1565b9150612abe888460008051602061312383398151915284612ee1565b9050612add88600080516020613123833981519152611be68585611e76565b98975050505050505050565b60008183612b755760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b3a578181015183820152602001612b22565b50505050905090810190601f168015612b675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612b8157fe5b0495945050505050565b60008184841115612bdd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b3a578181015183820152602001612b22565b505050900390565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612c625780518252601f199092019160209182019101612c43565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612cc4576040519150601f19603f3d011682016040523d82523d6000602084013e612cc9565b606091505b5091509150818015612cf7575080511580612cf75750808060200190516020811015612cf457600080fd5b50515b61209f576040805162461bcd60e51b815260206004820152601f60248201527f215472616e7366657248656c7065723a20415050524f56455f4641494c454400604482015290519081900360640190fd5b600054610100900460ff1680612d615750612d6161231a565b80612d6f575060005460ff16155b612daa5760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156123bd576000805460ff1961ff001990911661010017166001179055801561101d576000805461ff001916905550565b600054610100900460ff1680612e015750612e0161231a565b80612e0f575060005460ff16155b612e4a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff16158015612e75576000805460ff1961ff0019909116610100171660011790555b6000612e7f611f12565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561101d576000805461ff001916905550565b6000826001600160a01b0316846001600160a01b03161480612f01575081155b15612f0d57508061311a565b60408051600280825260608083018452926020830190803683370190505090508481600081518110612f3b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612f6957fe5b6001600160a01b03928316602091820292909201015260609087166338ed17398560008530612f9942603c611e76565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613009578181015183820152602001612ff1565b505050509050019650505050505050600060405180830381600087803b15801561303257600080fd5b505af1158015613046573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561306f57600080fd5b810190808051604051939291908464010000000082111561308f57600080fd5b9083019060208201858111156130a457600080fd5b82518660208202830111640100000000821117156130c157600080fd5b82525081516020918201928201910280838360005b838110156130ee5781810151838201526020016130d6565b5050505090500160405250505090508060018251038151811061310d57fe5b6020026020010151925050505b94935050505056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc24f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77215472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564215472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220b6b7aa1840fa915a6be5996fff88b93038a4b3a34f1be7d0a689896de2919e6364736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061021e5760003560e01c8063715018a611610123578063a2d151dd116100ab578063d23226e21161006f578063d23226e214610720578063d49e77cd14610735578063e2bbb1581461074a578063e4fb9b111461076d578063f2fde38b146107825761023c565b8063a2d151dd1461067d578063a508389c14610692578063ad5c4648146106a7578063b0bcf42a146106bc578063d13f90b4146106d15761023c565b80638d88a90e116100f25780638d88a90e1461056c5780638da5cb5b1461059f5780638dbb1e3a146105b457806393f1a40b146105e457806396805e54146106365761023c565b8063715018a6146104fa5780637a2c59571461050f5780637cd07e47146105245780638187f516146105395761023c565b8063307b4d13116101a65780634ee6b167116101755780634ee6b1671461045957806351eb05a61461046e578063630b5ba11461049857806364482f79146104ad57806369c2cddb146104e55761023c565b8063307b4d13146103d5578063441a3e70146103ea578063454b06081461041a57806348cd4cb1146104445761023c565b8063195426ec116101ed578063195426ec1461032a5780631aed6553146103635780631e5097be1461037857806320ad65861461038d57806323cf3118146103a25761023c565b8063081e3eda146102415780630a087903146102685780631526fe271461029957806317caf6f1146103155761023c565b3661023c57336000805160206131238339815191521461023a57fe5b005b600080fd5b34801561024d57600080fd5b506102566107b5565b60408051918252519081900360200190f35b34801561027457600080fd5b5061027d6107bb565b604080516001600160a01b039092168252519081900360200190f35b3480156102a557600080fd5b506102c3600480360360208110156102bc57600080fd5b50356107ca565b60405180886001600160a01b03168152602001878152602001868152602001858152602001846001600160a01b0316815260200183815260200182815260200197505050505050505060405180910390f35b34801561032157600080fd5b50610256610822565b34801561033657600080fd5b506102566004803603604081101561034d57600080fd5b50803590602001356001600160a01b0316610828565b34801561036f57600080fd5b50610256610930565b34801561038457600080fd5b50610256610936565b34801561039957600080fd5b5061025661093b565b3480156103ae57600080fd5b5061023a600480360360208110156103c557600080fd5b50356001600160a01b0316610940565b3480156103e157600080fd5b506102566109ba565b3480156103f657600080fd5b5061023a6004803603604081101561040d57600080fd5b50803590602001356109c0565b34801561042657600080fd5b5061023a6004803603602081101561043d57600080fd5b5035610bd5565b34801561045057600080fd5b50610256610e36565b34801561046557600080fd5b5061027d610e3c565b34801561047a57600080fd5b5061023a6004803603602081101561049157600080fd5b5035610e4b565b3480156104a457600080fd5b5061023a611020565b3480156104b957600080fd5b5061023a600480360360608110156104d057600080fd5b50803590602081013590604001351515611043565b3480156104f157600080fd5b5061025661112a565b34801561050657600080fd5b5061023a61112f565b34801561051b57600080fd5b506102566111d1565b34801561053057600080fd5b5061027d6111d6565b34801561054557600080fd5b5061023a6004803603602081101561055c57600080fd5b50356001600160a01b03166111e5565b34801561057857600080fd5b5061023a6004803603602081101561058f57600080fd5b50356001600160a01b031661130b565b3480156105ab57600080fd5b5061027d611378565b3480156105c057600080fd5b50610256600480360360408110156105d757600080fd5b5080359060200135611387565b3480156105f057600080fd5b5061061d6004803603604081101561060757600080fd5b50803590602001356001600160a01b031661139a565b6040805192835260208301919091528051918290030190f35b34801561064257600080fd5b5061023a6004803603608081101561065957600080fd5b508035906001600160a01b03602082013516906040810135151590606001356113be565b34801561068957600080fd5b5061027d6118f0565b34801561069e57600080fd5b50610256611908565b3480156106b357600080fd5b5061027d61190d565b3480156106c857600080fd5b5061025661191f565b3480156106dd57600080fd5b5061023a600480360360a08110156106f457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135611925565b34801561072c57600080fd5b50610256611a18565b34801561074157600080fd5b5061027d611a1d565b61023a6004803603604081101561076057600080fd5b5080359060200135611a2c565b34801561077957600080fd5b5061027d611cca565b34801561078e57600080fd5b5061023a600480360360208110156107a557600080fd5b50356001600160a01b0316611ce2565b609d5490565b6097546001600160a01b031681565b609d81815481106107d757fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b0395861697509395929491939116919087565b609f5481565b600080609d848154811061083857fe5b60009182526020808320878452609e825260408085206001600160a01b0389168652909252922060066007909202909201908101546003820154600583015492945090914311801561088957508015155b156108f557600061089e856005015443611387565b905060006108d1609f546108cb88600101546108c5609a5487611ddb90919063ffffffff16565b90611ddb565b90611e34565b90506108f06108e9846108cb8464e8d4a51000611ddb565b8590611e76565b935050505b610923836001015461091d64e8d4a510006108cb868860000154611ddb90919063ffffffff16565b90611ed0565b9450505050505b92915050565b60a15481565b600081565b600181565b610948611f12565b6065546001600160a01b03908116911614610998576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b609c80546001600160a01b0319166001600160a01b0392909216919091179055565b609b5481565b6000609d83815481106109cf57fe5b60009182526020808320868452609e825260408085203386529092529220805460079092029092019250831115610a42576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610a4b84610e4b565b6000610a79826001015461091d64e8d4a510006108cb87600601548760000154611ddb90919063ffffffff16565b90508015610a8b57610a8b3382611f16565b8315610b77578154610a9d9085611ed0565b82556003830154610aae9085611ed0565b6003840155610ac360646108cb866001611ddb565b83549094506001600160a01b03166000805160206131238339815191521415610b61576000805160206131238339815191526001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b3a57600080fd5b505af1158015610b4e573d6000803e3d6000fd5b50505050610b5c33856120a7565b610b77565b8254610b77906001600160a01b0316338661219a565b60068301548254610b929164e8d4a51000916108cb91611ddb565b6001830155604080518581529051869133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050505050565b609c546001600160a01b0316610c29576040805162461bcd60e51b815260206004820152601460248201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b604482015290519081900360640190fd5b6000609d8281548110610c3857fe5b6000918252602080832060079092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116939284926370a08231926024808201939291829003018186803b158015610c9657600080fd5b505afa158015610caa573d6000803e3d6000fd5b505050506040513d6020811015610cc057600080fd5b5051609c54909150610cdf906001600160a01b038481169116836122fd565b609c546040805163ce5494bb60e01b81526001600160a01b0385811660048301529151600093929092169163ce5494bb9160248082019260209290919082900301818787803b158015610d3157600080fd5b505af1158015610d45573d6000803e3d6000fd5b505050506040513d6020811015610d5b57600080fd5b5051604080516370a0823160e01b815230600482015290519192506001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d6020811015610dd157600080fd5b50518214610e15576040805162461bcd60e51b815260206004820152600c60248201526b1b5a59dc985d194e8818985960a21b604482015290519081900360640190fd5b83546001600160a01b0319166001600160a01b039190911617909255505050565b60a05481565b6098546001600160a01b031681565b6000609d8281548110610e5a57fe5b9060005260206000209060070201905080600501544311610e7b575061101d565b60a1544310610ea257609b5460a180549091019055609a54610e9e906002611e34565b609a555b600381015480610eb957504360059091015561101d565b6000610ec9836005015443611387565b90506000610ef0609f546108cb86600101546108c5609a5487611ddb90919063ffffffff16565b6097546099549192506001600160a01b03908116916340c10f199116610f17846064611e34565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b5050609754604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b0390921693506340c10f19925060448082019260009290919082900301818387803b158015610fc857600080fd5b505af1158015610fdc573d6000803e3d6000fd5b5050505061100a610fff846108cb64e8d4a5100085611ddb90919063ffffffff16565b600686015490611e76565b6006850155505043600590920191909155505b50565b609d5460005b8181101561103f5761103781610e4b565b600101611026565b5050565b61104b611378565b6001600160a01b0316336001600160a01b0316148061107457506099546001600160a01b031633145b6110b1576040805162461bcd60e51b815260206004820152600960248201526810b232bb1030b2323960b91b604482015290519081900360640190fd5b80156110bf576110bf611020565b6110fc826110f6609d86815481106110d357fe5b906000526020600020906007020160010154609f54611ed090919063ffffffff16565b90611e76565b609f8190555081609d848154811061111057fe5b906000526020600020906007020160010181905550505050565b600281565b611137611f12565b6065546001600160a01b03908116911614611187576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600381565b609c546001600160a01b031681565b6111ed611f12565b6065546001600160a01b0390811691161461123d576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b609880546001600160a01b0319166001600160a01b0383811691909117918290556112809116737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6112af600080516020613123833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6097546112dc906001600160a01b0316737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b61101d60008051602061312383398151915273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b6099546001600160a01b03163314611356576040805162461bcd60e51b81526020600482015260096024820152686465763a207775743f60b81b604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031690565b60006113938284611ed0565b9392505050565b609e6020908152600092835260408084209091529082529020805460019091015482565b6113c6611378565b6001600160a01b0316336001600160a01b031614806113ef57506099546001600160a01b031633145b61142c576040805162461bcd60e51b815260206004820152600960248201526810b232bb1030b2323960b91b604482015290519081900360640190fd5b811561143a5761143a611020565b600060a054431161144d5760a05461144f565b435b9050737a250d5630b4cf539739df2c5dacb4c659f2488d60038314806114755750600483145b15611491575073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f5b609f5461149e9087611e76565b609f556040805160e0810182526001600160a01b03808816808352602083018a81529383018781526000606085018181528785166080870190815260a087018a815260c08801848152609d80546001810182559552975160079094027fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7b810180549589166001600160a01b031996871617905598517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7c8a015593517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7d89015590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7e880155517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf7f870180549190951691161790925590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf8084015590517fd26e832454299e9fabb89e0e5fffdc046d4e14431bc1bf607ffb2e8a1ddecf819092019190915561164490737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b61166e6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b60028314156117ad576000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0389169163d21220a7916004808301926020929190829003018186803b15801561172457600080fd5b505afa158015611738573d6000803e3d6000fd5b505050506040513d602081101561174e57600080fd5b5051905061177c6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b6117a66001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d6000196122fd565b50506118e8565b60048314156118e8576000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d602081101561181b57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0389169163d21220a7916004808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b505190506118bb6001600160a01b03831673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b6118e56001600160a01b03821673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000196122fd565b50505b505050505050565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b600481565b60008051602061312383398151915281565b609a5481565b600054610100900460ff168061193e575061193e61231a565b8061194c575060005460ff16155b6119875760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156119b2576000805460ff1961ff0019909116610100171660011790555b6119ba612320565b609780546001600160a01b038089166001600160a01b0319928316179092556099805492881692909116919091179055609a84905560a083905581830160a155609b82905580156118e8576000805461ff0019169055505050505050565b600581565b6099546001600160a01b031681565b6000609d8381548110611a3b57fe5b60009182526020808320868452609e82526040808520338652909252908320600790920201925090611a6c85610e4b565b815415611ab5576000611aa1836001015461091d64e8d4a510006108cb88600601548860000154611ddb90919063ffffffff16565b90508015611ab357611ab33382611f16565b505b82546001600160a01b03166000805160206131238339815191521415611b75578315611af2578254611af2906001600160a01b03163330876123d1565b3415611b70576000805160206131238339815191526001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b4157600080fd5b505af1158015611b55573d6000803e3d6000fd5b5050505050611b6d3485611e7690919063ffffffff16565b93505b611b92565b8315611b92578254611b92906001600160a01b03163330876123d1565b8315611c6457600183600201541480611baf575060038360020154145b15611bf25760048301548354611beb916001600160a01b039081169116611be6611bdf60646108cb8a6001611ddb565b8890611ed0565b612526565b9050611c41565b600283600201541480611c09575060048360020154145b15611c415760048301548354611c3e916001600160a01b039081169116611c39611bdf60646108cb8a6001611ddb565b6128c9565b90505b6003830154611c509085611e76565b60038401558154611c619085611e76565b82555b60068301548254611c7f9164e8d4a51000916108cb91611ddb565b600183015560408051858152602081018390528151879233927f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e929081900390910190a35050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b611cea611f12565b6065546001600160a01b03908116911614611d3a576040805162461bcd60e51b815260206004820181905260248201526000805160206131ae833981519152604482015290519081900360640190fd5b6001600160a01b038116611d7f5760405162461bcd60e51b81526004018080602001828103825260268152602001806131436026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b600082611dea5750600061092a565b82820282848281611df757fe5b04146113935760405162461bcd60e51b81526004018080602001828103825260218152602001806131696021913960400191505060405180910390fd5b600061139383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ae9565b600082820183811015611393576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061139383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b8b565b3390565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6020811015611f8b57600080fd5b505190508082111561201f576097546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b506120a29050565b6097546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561207557600080fd5b505af1158015612089573d6000803e3d6000fd5b505050506040513d602081101561209f57600080fd5b50505b505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106120f35780518252601f1990920191602091820191016120d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612155576040519150601f19603f3d011682016040523d82523d6000602084013e61215a565b606091505b50509050806120a25760405162461bcd60e51b815260040180806020018281038252602481526020018061318a6024913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106122175780518252601f1990920191602091820191016121f8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b50915091508180156122ac5750805115806122ac57508080602001905160208110156122a957600080fd5b50515b61209f576040805162461bcd60e51b815260206004820181905260248201527f215472616e7366657248656c7065723a205452414e534645525f4641494c4544604482015290519081900360640190fd5b801561230f5761230f83836000612be5565b6120a2838383612be5565b303b1590565b600054610100900460ff1680612339575061233961231a565b80612347575060005460ff16155b6123825760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156123ad576000805460ff1961ff0019909116610100171660011790555b6123b5612d48565b6123bd612de8565b801561101d576000805461ff001916905550565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106124565780518252601f199092019160209182019101612437565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146124b8576040519150601f19603f3d011682016040523d82523d6000602084013e6124bd565b606091505b50915091508180156124eb5750805115806124eb57508080602001905160208110156124e857600080fd5b50515b6118e85760405162461bcd60e51b81526004018080602001828103825260258152602001806131fc6025913960400191505060405180910390fd5b60008161253557506000611393565b6001600160a01b038316600080516020613123833981519152146125705761256d848460008051602061312383398151915285612ee1565b91505b60006125846127106108cb856113a1611ddb565b905060006125928483611ed0565b604080516002808252606080830184529394509091602083019080368337019050509050600080516020613123833981519152816000815181106125d257fe5b6001600160a01b0392831660209182029290920101526097548251911690829060019081106125fd57fe5b6001600160a01b03909216602092830291909101909101526060737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed1739856000853061264142603c611e76565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156126b1578181015183820152602001612699565b505050509050019650505050505050600060405180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561271757600080fd5b810190808051604051939291908464010000000082111561273757600080fd5b90830190602082018581111561274c57600080fd5b825186602082028301116401000000008211171561276957600080fd5b82525081516020918201928201910280838360005b8381101561279657818101518382015260200161277e565b5050505090500160405250505090506000816001815181106127b457fe5b6020908102919091010151609754909150737a250d5630b4cf539739df2c5dacb4c659f2488d9063e8e3370090600080516020613123833981519152906001600160a01b031687856000803061280b42603c611e76565b6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b0316815260200182815260200198505050505050505050606060405180830381600087803b15801561288d57600080fd5b505af11580156128a1573d6000803e3d6000fd5b505050506040513d60608110156128b757600080fd5b50604001519998505050505050505050565b6000816128d857506000611393565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561291357600080fd5b505afa158015612927573d6000803e3d6000fd5b505050506040513d602081101561293d57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0387169163d21220a7916004808301926020929190829003018186803b15801561298557600080fd5b505afa158015612999573d6000803e3d6000fd5b505050506040513d60208110156129af57600080fd5b505190506000806001600160a01b03881663baa2abde8585898580306129d642603c611e76565b6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001876001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b031681526020018281526020019750505050505050506040805180830381600087803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b505050506040513d6040811015612a7a57600080fd5b5080516020909101519092509050612aa2888560008051602061312383398151915285612ee1565b9150612abe888460008051602061312383398151915284612ee1565b9050612add88600080516020613123833981519152611be68585611e76565b98975050505050505050565b60008183612b755760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b3a578181015183820152602001612b22565b50505050905090810190601f168015612b675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612b8157fe5b0495945050505050565b60008184841115612bdd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612b3a578181015183820152602001612b22565b505050900390565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612c625780518252601f199092019160209182019101612c43565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612cc4576040519150601f19603f3d011682016040523d82523d6000602084013e612cc9565b606091505b5091509150818015612cf7575080511580612cf75750808060200190516020811015612cf457600080fd5b50515b61209f576040805162461bcd60e51b815260206004820152601f60248201527f215472616e7366657248656c7065723a20415050524f56455f4641494c454400604482015290519081900360640190fd5b600054610100900460ff1680612d615750612d6161231a565b80612d6f575060005460ff16155b612daa5760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff161580156123bd576000805460ff1961ff001990911661010017166001179055801561101d576000805461ff001916905550565b600054610100900460ff1680612e015750612e0161231a565b80612e0f575060005460ff16155b612e4a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806131ce602e913960400191505060405180910390fd5b600054610100900460ff16158015612e75576000805460ff1961ff0019909116610100171660011790555b6000612e7f611f12565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561101d576000805461ff001916905550565b6000826001600160a01b0316846001600160a01b03161480612f01575081155b15612f0d57508061311a565b60408051600280825260608083018452926020830190803683370190505090508481600081518110612f3b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612f6957fe5b6001600160a01b03928316602091820292909201015260609087166338ed17398560008530612f9942603c611e76565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613009578181015183820152602001612ff1565b505050509050019650505050505050600060405180830381600087803b15801561303257600080fd5b505af1158015613046573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561306f57600080fd5b810190808051604051939291908464010000000082111561308f57600080fd5b9083019060208201858111156130a457600080fd5b82518660208202830111640100000000821117156130c157600080fd5b82525081516020918201928201910280838360005b838110156130ee5781810151838201526020016130d6565b5050505090500160405250505090508060018251038151811061310d57fe5b6020026020010151925050505b94935050505056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc24f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77215472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564215472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220b6b7aa1840fa915a6be5996fff88b93038a4b3a34f1be7d0a689896de2919e6364736f6c634300060c0033
Deployed Bytecode Sourcemap
27331:15343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31058:10;-1:-1:-1;;;;;;;;;;;31058:18:0;31051:26;;;;27331:15343;;;;;31447:95;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29497:23;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;29497:23:0;;;;;;;;;;;;;;29904:26;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29904:26:0;;:::i;:::-;;;;;-1:-1:-1;;;;;29904:26:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29904:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30147:34;;;;;;;;;;;;;:::i;34842:742::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34842:742:0;;;;;;-1:-1:-1;;;;;34842:742:0;;:::i;30322:28::-;;;;;;;;;;;;;:::i;28906:44::-;;;;;;;;;;;;;:::i;28957:38::-;;;;;;;;;;;;;:::i;33864:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33864:102:0;-1:-1:-1;;;;;33864:102:0;;:::i;29706:28::-;;;;;;;;;;;;;:::i;38629:1057::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38629:1057:0;;;;;;;:::i;34089:491::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34089:491:0;;:::i;30239:25::-;;;;;;;;;;;;;:::i;29527:23::-;;;;;;;;;;;;;:::i;35923:933::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35923:933:0;;:::i;35667:180::-;;;;;;;;;;;;;:::i;33415:373::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33415:373:0;;;;;;;;;;;;;;:::i;29002:40::-;;;;;;;;;;;;;:::i;15147:148::-;;;;;;;;;;;;;:::i;29049:41::-;;;;;;;;;;;;;:::i;29839:29::-;;;;;;;;;;;;;:::i;31093:346::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31093:346:0;-1:-1:-1;;;;;31093:346:0;;:::i;40143:129::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40143:129:0;-1:-1:-1;;;;;40143:129:0;;:::i;14505:79::-;;;;;;;;;;;;;:::i;34656:121::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34656:121:0;;;;;;;:::i;29986:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29986:66:0;;;;;;-1:-1:-1;;;;;29986:66:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31711:1607;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31711:1607:0;;;-1:-1:-1;;;;;31711:1607:0;;;;;;;;;;;;;;;;;:::i;29382:81::-;;;;;;;;;;;;;:::i;29097:43::-;;;;;;;;;;;;;:::i;29302:73::-;;;;;;;;;;;;;:::i;29647:28::-;;;;;;;;;;;;;:::i;30539:466::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30539:466:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29147:42::-;;;;;;;;;;;;;:::i;29578:22::-;;;;;;;;;;;;;:::i;36926:1651::-;;;;;;;;;;;;;;;;-1:-1:-1;36926:1651:0;;;;;;;:::i;29196:81::-;;;;;;;;;;;;;:::i;15450:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15450:244:0;-1:-1:-1;;;;;15450:244:0;;:::i;31447:95::-;31519:8;:15;31447:95;:::o;29497:23::-;;;-1:-1:-1;;;;;29497:23:0;;:::o;29904:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29904:26:0;;;;-1:-1:-1;29904:26:0;;;;;;;;;;;:::o;30147:34::-;;;;:::o;34842:742::-;34916:7;34936:21;34960:8;34969:4;34960:14;;;;;;;;;;;;;;;;35009;;;:8;:14;;;;;;-1:-1:-1;;;;;35009:21:0;;;;;;;;;35068;34960:14;;;;;;;35068:21;;;;35119:11;;;;35160:20;;;;34960:14;;-1:-1:-1;35068:21:0;;35145:12;:35;:52;;;;-1:-1:-1;35184:13:0;;;35145:52;35141:354;;;35214:18;35235:49;35249:4;:20;;;35271:12;35235:13;:49::i;:::-;35214:70;;35299:19;35321:71;35376:15;;35321:50;35355:4;:15;;;35321:29;35336:13;;35321:10;:14;;:29;;;;:::i;:::-;:33;;:50::i;:::-;:54;;:71::i;:::-;35299:93;-1:-1:-1;35426:57:0;35447:35;35473:8;35447:21;35299:93;35463:4;35447:15;:21::i;:35::-;35426:16;;:20;:57::i;:::-;35407:76;;35141:354;;;35512:64;35560:4;:15;;;35512:43;35550:4;35512:33;35528:16;35512:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:64::i;:::-;35505:71;;;;;;34842:742;;;;;:::o;30322:28::-;;;;:::o;28906:44::-;28949:1;28906:44;:::o;28957:38::-;28994:1;28957:38;:::o;33864:102::-;14727:12;:10;:12::i;:::-;14717:6;;-1:-1:-1;;;;;14717:6:0;;;:22;;;14709:67;;;;;-1:-1:-1;;;14709:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14709:67:0;;;;;;;;;;;;;;;33938:8:::1;:20:::0;;-1:-1:-1;;;;;;33938:20:0::1;-1:-1:-1::0;;;;;33938:20:0;;;::::1;::::0;;;::::1;::::0;;33864:102::o;29706:28::-;;;;:::o;38629:1057::-;38696:21;38720:8;38729:4;38720:14;;;;;;;;;;;;;;;;38769;;;:8;:14;;;;;;38784:10;38769:26;;;;;;;38814:11;;38720:14;;;;;;;;-1:-1:-1;38814:22:0;-1:-1:-1;38814:22:0;38806:53;;;;;-1:-1:-1;;;38806:53:0;;;;;;;;;;;;-1:-1:-1;;;38806:53:0;;;;;;;;;;;;;;;38870:16;38881:4;38870:10;:16::i;:::-;38897:15;38915:69;38968:4;:15;;;38915:48;38958:4;38915:38;38931:4;:21;;;38915:4;:11;;;:15;;:38;;;;:::i;:69::-;38897:87;-1:-1:-1;38998:11:0;;38995:81;;39026:38;39044:10;39056:7;39026:17;:38::i;:::-;39089:11;;39086:465;;39131:11;;:24;;39147:7;39131:15;:24::i;:::-;39117:38;;39184:11;;;;:24;;39200:7;39184:15;:24::i;:::-;39170:11;;;:38;39233:23;39252:3;39233:14;:7;39245:1;39233:11;:14::i;:23::-;39283:12;;39223:33;;-1:-1:-1;;;;;;39283:12:0;-1:-1:-1;;;;;;;;;;;39275:29:0;39271:269;;;-1:-1:-1;;;;;;;;;;;;;;;;39325:20:0;;39346:7;39325:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39373:55;39407:10;39420:7;39373:25;:55::i;:::-;39271:269;;;39469:12;;:55;;-1:-1:-1;;;;;39469:12:0;39503:10;39516:7;39469:25;:55::i;:::-;39595:21;;;;39579:11;;:48;;39622:4;;39579:38;;:15;:38::i;:48::-;39561:15;;;:66;39643:35;;;;;;;;39664:4;;39652:10;;39643:35;;;;;;;;;38629:1057;;;;;:::o;34089:491::-;34154:8;;-1:-1:-1;;;;;34154:8:0;34138:64;;;;;-1:-1:-1;;;34138:64:0;;;;;;;;;;;;-1:-1:-1;;;34138:64:0;;;;;;;;;;;;;;;34213:21;34237:8;34246:4;34237:14;;;;;;;;;;;;;;;;;;;;;;;34279:12;;34316:32;;;-1:-1:-1;;;34316:32:0;;34342:4;34316:32;;;;;;34237:14;;-1:-1:-1;;;;;;34279:12:0;;;;34237:14;34279:12;;34316:17;;:32;;;;;34237:14;34316:32;;;;;;34279:12;34316:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34316:32:0;34387:8;;34316:32;;-1:-1:-1;34359:43:0;;-1:-1:-1;;;;;34359:19:0;;;;34387:8;34316:32;34359:19;:43::i;:::-;34433:8;;:25;;;-1:-1:-1;;;34433:25:0;;-1:-1:-1;;;;;34433:25:0;;;;;;;;;34413:17;;34433:8;;;;;:16;;:25;;;;;;;;;;;;;;;34413:17;34433:8;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34433:25:0;34484:35;;;-1:-1:-1;;;34484:35:0;;34513:4;34484:35;;;;;;34433:25;;-1:-1:-1;;;;;;34484:20:0;;;;;:35;;;;;34433:25;;34484:35;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34484:35:0;34477:42;;34469:67;;;;;-1:-1:-1;;;34469:67:0;;;;;;;;;;;;-1:-1:-1;;;34469:67:0;;;;;;;;;;;;;;;34547:25;;-1:-1:-1;;;;;;34547:25:0;-1:-1:-1;;;;;34547:25:0;;;;;;;;-1:-1:-1;;;34089:491:0:o;30239:25::-;;;;:::o;29527:23::-;;;-1:-1:-1;;;;;29527:23:0;;:::o;35923:933::-;35975:21;35999:8;36008:4;35999:14;;;;;;;;;;;;;;;;;;35975:38;;36044:4;:20;;;36028:12;:36;36024:75;;36081:7;;;36024:75;36129:13;;36113:12;:29;36109:158;;36191:13;;36175;;;:29;;;36159:45;;36235:13;;:20;;36253:1;36235:17;:20::i;:::-;36219:13;:36;36109:158;36296:11;;;;36322:13;36318:102;;-1:-1:-1;36375:12:0;36352:20;;;;:35;36402:7;;36318:102;36430:18;36451:49;36465:4;:20;;;36487:12;36451:13;:49::i;:::-;36430:70;;36511:19;36533:71;36588:15;;36533:50;36567:4;:15;;;36533:29;36548:13;;36533:10;:14;;:29;;;;:::i;:71::-;36615:5;;36626:7;;36511:93;;-1:-1:-1;;;;;;36615:5:0;;;;:10;;36626:7;36635:20;36511:93;36651:3;36635:15;:20::i;:::-;36615:41;;;;;;;;;;;;;-1:-1:-1;;;;;36615:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36667:5:0;;:38;;;-1:-1:-1;;;36667:38:0;;36686:4;36667:38;;;;;;;;;;;;-1:-1:-1;;;;;36667:5:0;;;;-1:-1:-1;36667:10:0;;-1:-1:-1;36667:38:0;;;;;:5;;:38;;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36740:62;36766:35;36792:8;36766:21;36782:4;36766:11;:15;;:21;;;;:::i;:35::-;36740:21;;;;;:25;:62::i;:::-;36716:21;;;:86;-1:-1:-1;;36836:12:0;36813:20;;;;:35;;;;-1:-1:-1;35923:933:0;;:::o;35667:180::-;35729:8;:15;35712:14;35755:85;35783:6;35777:3;:12;35755:85;;;35813:15;35824:3;35813:10;:15::i;:::-;35791:5;;35755:85;;;;35667:180;:::o;33415:373::-;33521:7;:5;:7::i;:::-;-1:-1:-1;;;;;33507:21:0;:10;-1:-1:-1;;;;;33507:21:0;;:46;;;-1:-1:-1;33546:7:0;;-1:-1:-1;;;;;33546:7:0;33532:10;:21;33507:46;33499:68;;;;;-1:-1:-1;;;33499:68:0;;;;;;;;;;;;-1:-1:-1;;;33499:68:0;;;;;;;;;;;;;;;33582:11;33578:61;;;33610:17;:15;:17::i;:::-;33667:63;33718:11;33667:46;33687:8;33696:4;33687:14;;;;;;;;;;;;;;;;;;:25;;;33667:15;;:19;;:46;;;;:::i;:::-;:50;;:63::i;:::-;33649:15;:81;;;;33769:11;33741:8;33750:4;33741:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;33415:373;;;:::o;29002:40::-;29041:1;29002:40;:::o;15147:148::-;14727:12;:10;:12::i;:::-;14717:6;;-1:-1:-1;;;;;14717:6:0;;;:22;;;14709:67;;;;;-1:-1:-1;;;14709:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14709:67:0;;;;;;;;;;;;;;;15238:6:::1;::::0;15217:40:::1;::::0;15254:1:::1;::::0;-1:-1:-1;;;;;15238:6:0::1;::::0;15217:40:::1;::::0;15254:1;;15217:40:::1;15268:6;:19:::0;;-1:-1:-1;;;;;;15268:19:0::1;::::0;;15147:148::o;29049:41::-;29089:1;29049:41;:::o;29839:29::-;;;-1:-1:-1;;;;;29839:29:0;;:::o;31093:346::-;14727:12;:10;:12::i;:::-;14717:6;;-1:-1:-1;;;;;14717:6:0;;;:22;;;14709:67;;;;;-1:-1:-1;;;14709:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14709:67:0;;;;;;;;;;;;;;;31157:8:::1;:20:::0;;-1:-1:-1;;;;;;31157:20:0::1;-1:-1:-1::0;;;;;31157:20:0;;::::1;::::0;;;::::1;::::0;;;;31190:52:::1;::::0;31197:8:::1;29235:42;-1:-1:-1::0;;31190:28:0::1;:52::i;:::-;31253:48;-1:-1:-1::0;;;;;;;;;;;29235:42:0::1;-1:-1:-1::0;;31253:24:0::1;:48::i;:::-;31327:5;::::0;31312:58:::1;::::0;-1:-1:-1;;;;;31327:5:0::1;29235:42;-1:-1:-1::0;;31312:34:0::1;:58::i;:::-;31383:48;-1:-1:-1::0;;;;;;;;;;;29421:42:0::1;-1:-1:-1::0;;31383:24:0::1;:48::i;40143:129::-:0;40214:7;;-1:-1:-1;;;;;40214:7:0;40200:10;:21;40192:43;;;;;-1:-1:-1;;;40192:43:0;;;;;;;;;;;;-1:-1:-1;;;40192:43:0;;;;;;;;;;;;;;;40246:7;:18;;-1:-1:-1;;;;;;40246:18:0;-1:-1:-1;;;;;40246:18:0;;;;;;;;;;40143:129::o;14505:79::-;14570:6;;-1:-1:-1;;;;;14570:6:0;14505:79;:::o;34656:121::-;34728:7;34755:14;:3;34763:5;34755:7;:14::i;:::-;34748:21;34656:121;-1:-1:-1;;;34656:121:0:o;29986:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31711:1607::-;31835:7;:5;:7::i;:::-;-1:-1:-1;;;;;31821:21:0;:10;-1:-1:-1;;;;;31821:21:0;;:46;;;-1:-1:-1;31860:7:0;;-1:-1:-1;;;;;31860:7:0;31846:10;:21;31821:46;31813:68;;;;;-1:-1:-1;;;31813:68:0;;;;;;;;;;;;-1:-1:-1;;;31813:68:0;;;;;;;;;;;;;;;31896:11;31892:61;;;31924:17;:15;:17::i;:::-;31963:23;32004:10;;31989:12;:25;:53;;32032:10;;31989:53;;;32017:12;31989:53;31963:79;-1:-1:-1;29235:42:0;29089:1;32099:22;;;:50;;;29139:1;32125:5;:24;32099:50;32095:106;;;-1:-1:-1;29421:42:0;32095:106;32229:15;;:32;;32249:11;32229:19;:32::i;:::-;32211:15;:50;32286:259;;;;;;;;-1:-1:-1;;;;;32286:259:0;;;;;;;;;;;;;;;;;;-1:-1:-1;32286:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32272:8;:274;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32272:274:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32559:44;;29235:42;-1:-1:-1;;32559:20:0;:44::i;:::-;32614;-1:-1:-1;;;;;32614:20:0;;29421:42;-1:-1:-1;;32614:20:0;:44::i;:::-;29041:1;32673:5;:21;32669:642;;;32711:14;32751:8;-1:-1:-1;;;;;32728:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32728:42:0;32802;;;-1:-1:-1;;;32802:42:0;;;;32728;;-1:-1:-1;32785:14:0;;-1:-1:-1;;;;;32802:40:0;;;;;:42;;;;;32728;;32802;;;;;;;:40;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32802:42:0;;-1:-1:-1;32859:50:0;-1:-1:-1;;;;;32859:26:0;;29235:42;-1:-1:-1;;32859:26:0;:50::i;:::-;32924;-1:-1:-1;;;;;32924:26:0;;29235:42;-1:-1:-1;;32924:26:0;:50::i;:::-;32669:642;;;;;29139:1;32996:5;:24;32992:319;;;33037:14;33077:8;-1:-1:-1;;;;;33054:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33054:42:0;33128;;;-1:-1:-1;;;33128:42:0;;;;33054;;-1:-1:-1;33111:14:0;;-1:-1:-1;;;;;33128:40:0;;;;;:42;;;;;33054;;33128;;;;;;;:40;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33128:42:0;;-1:-1:-1;33185:50:0;-1:-1:-1;;;;;33185:26:0;;29421:42;-1:-1:-1;;33185:26:0;:50::i;:::-;33250;-1:-1:-1;;;;;33250:26:0;;29421:42;-1:-1:-1;;33250:26:0;:50::i;:::-;32992:319;;;31711:1607;;;;;;:::o;29382:81::-;29421:42;29382:81;:::o;29097:43::-;29139:1;29097:43;:::o;29302:73::-;-1:-1:-1;;;;;;;;;;;29302:73:0;:::o;29647:28::-;;;;:::o;30539:466::-;10938:12;;;;;;;;:31;;;10954:15;:13;:15::i;:::-;10938:47;;;-1:-1:-1;10974:11:0;;;;10973:12;10938:47;10930:106;;;;-1:-1:-1;;;10930:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11045:19;11068:12;;;;;;11067:13;11087:83;;;;11116:12;:19;;-1:-1:-1;;;;11116:19:0;;;;;11144:18;11131:4;11144:18;;;11087:83;30747:24:::1;:22;:24::i;:::-;30782:5;:14:::0;;-1:-1:-1;;;;;30782:14:0;;::::1;-1:-1:-1::0;;;;;;30782:14:0;;::::1;;::::0;;;30807:7:::1;:18:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;30836:13:::1;:30:::0;;;30877:10:::1;:24:::0;;;30928:28;;::::1;30912:13;:44:::0;30967:13:::1;:30:::0;;;11188:57;;;;11232:5;11217:20;;-1:-1:-1;;11217:20:0;;;30539:466;;;;;;:::o;29147:42::-;29188:1;29147:42;:::o;29578:22::-;;;-1:-1:-1;;;;;29578:22:0;;:::o;36926:1651::-;37000:21;37024:8;37033:4;37024:14;;;;;;;;;;;;;;;;37073;;;:8;:14;;;;;;37088:10;37073:26;;;;;;;;37024:14;;;;;;-1:-1:-1;37073:26:0;37138:16;37082:4;37138:10;:16::i;:::-;37169:11;;:15;37165:238;;37201:15;37219:69;37272:4;:15;;;37219:48;37262:4;37219:38;37235:4;:21;;;37219:4;:11;;;:15;;:38;;;;:::i;:69::-;37201:87;-1:-1:-1;37306:11:0;;37303:89;;37338:38;37356:10;37368:7;37338:17;:38::i;:::-;37165:238;;37425:12;;-1:-1:-1;;;;;37425:12:0;-1:-1:-1;;;;;;;;;;;37417:29:0;37413:467;;;37466:11;;37463:125;;37498:12;;:74;;-1:-1:-1;;;;;37498:12:0;37536:10;37557:4;37564:7;37498:29;:74::i;:::-;37606:9;:13;37602:144;;-1:-1:-1;;;;;;;;;;;;;;;;37640:19:0;;37667:9;37640:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:22;37720:9;37708:7;:11;;:22;;;;:::i;:::-;37698:32;;37602:144;37413:467;;;37766:11;;37763:117;;37794:12;;:74;;-1:-1:-1;;;;;37794:12:0;37832:10;37853:4;37860:7;37794:29;:74::i;:::-;37895:11;;37892:540;;28994:1;37927:4;:13;;;:27;:61;;;;29089:1;37958:4;:13;;;:30;37927:61;37923:392;;;38031:13;;;;38046:12;;38021:76;;-1:-1:-1;;;;;38031:13:0;;;;38046:12;38060:36;38072:23;38091:3;38072:14;:7;38031:13;38072:11;:14::i;:23::-;38060:7;;:11;:36::i;:::-;38021:9;:76::i;:::-;38009:88;;37923:392;;;29041:1;38123:4;:13;;;:29;:65;;;;29139:1;38156:4;:13;;;:32;38123:65;38119:196;;;38233:13;;;;38248:12;;38221:78;;-1:-1:-1;;;;;38233:13:0;;;;38248:12;38262:36;38274:23;38293:3;38274:14;:7;38233:13;38274:11;:14::i;38262:36::-;38221:11;:78::i;:::-;38209:90;;38119:196;38343:11;;;;:24;;38359:7;38343:15;:24::i;:::-;38329:11;;;:38;38396:11;;:24;;38412:7;38396:15;:24::i;:::-;38382:38;;37892:540;38476:21;;;;38460:11;;:48;;38503:4;;38460:38;;:15;:38::i;:48::-;38442:15;;;:66;38524:45;;;;;;;;;;;;;;38544:4;;38532:10;;38524:45;;;;;;;;;;;36926:1651;;;;;:::o;29196:81::-;29235:42;29196:81;:::o;15450:244::-;14727:12;:10;:12::i;:::-;14717:6;;-1:-1:-1;;;;;14717:6:0;;;:22;;;14709:67;;;;;-1:-1:-1;;;14709:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14709:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15539:22:0;::::1;15531:73;;;;-1:-1:-1::0;;;15531:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15641:6;::::0;15620:38:::1;::::0;-1:-1:-1;;;;;15620:38:0;;::::1;::::0;15641:6:::1;::::0;15620:38:::1;::::0;15641:6:::1;::::0;15620:38:::1;15669:6;:17:::0;;-1:-1:-1;;;;;;15669:17:0::1;-1:-1:-1::0;;;;;15669:17:0;;;::::1;::::0;;;::::1;::::0;;15450:244::o;6704:471::-;6762:7;7007:6;7003:47;;-1:-1:-1;7037:1:0;7030:8;;7003:47;7074:5;;;7078:1;7074;:5;:1;7098:5;;;;;:10;7090:56;;;;-1:-1:-1;;;7090:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7651:132;7709:7;7736:39;7740:1;7743;7736:39;;;;;;;;;;;;;;;;;:3;:39::i;5350:181::-;5408:7;5440:5;;;5464:6;;;;5456:46;;;;;-1:-1:-1;;;5456:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5814:136;5872:7;5899:43;5903:1;5906;5899:43;;;;;;;;;;;;;;;;;:3;:43::i;12881:106::-;12969:10;12881:106;:::o;39802:285::-;39898:5;;:30;;;-1:-1:-1;;;39898:30:0;;39922:4;39898:30;;;;;;39879:16;;-1:-1:-1;;;;;39898:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39898:30:0;;-1:-1:-1;39943:18:0;;;39939:141;;;39978:5;;:29;;;-1:-1:-1;;;39978:29:0;;-1:-1:-1;;;;;39978:29:0;;;;;;;;;;;;;;;:5;;;;;:14;;:29;;;;;;;;;;;;;;:5;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39939:141:0;;-1:-1:-1;39939:141:0;;40040:5;;:28;;;-1:-1:-1;;;40040:28:0;;-1:-1:-1;;;;;40040:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39939:141:0;39802:285;;;:::o;4270:196::-;4378:12;;;4340;4378;;;;;;;;;-1:-1:-1;;;;;4357:7:0;;;4371:5;;4357:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4357:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4339:52;;;4410:7;4402:56;;;;-1:-1:-1;;;4402:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3473:370;3676:45;;;-1:-1:-1;;;;;3676:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3676:45:0;-1:-1:-1;;;3676:45:0;;;3656:66;;;;3621:12;;3635:17;;3656:19;;;;3676:45;3656:66;;;3676:45;3656:66;;3676:45;3656:66;;;;;;;;;;-1:-1:-1;;3656:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3620:102;;;;3741:7;:57;;;;-1:-1:-1;3753:11:0;;:16;;:44;;;3784:4;3773:24;;;;;;;;;;;;;;;-1:-1:-1;3773:24:0;3753:44;3733:102;;;;;-1:-1:-1;;;3733:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3289:176;3372:9;;3368:41;;3383:26;3396:5;3403:2;3407:1;3383:12;:26::i;:::-;3427:30;3440:5;3447:2;3451:5;3427:12;:30::i;11339:508::-;11756:4;11802:17;11834:7;11339:508;:::o;14083:129::-;10938:12;;;;;;;;:31;;;10954:15;:13;:15::i;:::-;10938:47;;;-1:-1:-1;10974:11:0;;;;10973:12;10938:47;10930:106;;;;-1:-1:-1;;;10930:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11045:19;11068:12;;;;;;11067:13;11087:83;;;;11116:12;:19;;-1:-1:-1;;;;11116:19:0;;;;;11144:18;11131:4;11144:18;;;11087:83;14141:26:::1;:24;:26::i;:::-;14178;:24;:26::i;:::-;11192:14:::0;11188:57;;;11232:5;11217:20;;-1:-1:-1;;11217:20:0;;;14083:129;:::o;3851:411::-;4084:51;;;-1:-1:-1;;;;;4084:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4084:51:0;-1:-1:-1;;;4084:51:0;;;4064:72;;;;4029:12;;4043:17;;4064:19;;;;4084:51;4064:72;;;4084:51;4064:72;;4084:51;4064:72;;;;;;;;;;-1:-1:-1;;4064:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4028:108;;;;4155:7;:57;;;;-1:-1:-1;4167:11:0;;:16;;:44;;;4198:4;4187:24;;;;;;;;;;;;;;;-1:-1:-1;4187:24:0;4167:44;4147:107;;;;-1:-1:-1;;;4147:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41029:954;41115:11;41143:12;41139:26;;-1:-1:-1;41164:1:0;41157:8;;41139:26;-1:-1:-1;;;;;41182:23:0;;-1:-1:-1;;;;;;;;;;;41182:23:0;41178:198;;41299:65;41324:7;41341:6;-1:-1:-1;;;;;;;;;;;41356:7:0;41299:24;:65::i;:::-;41289:75;;41178:198;41388:17;41408:28;41430:5;41408:17;:7;41420:4;41408:11;:17::i;:28::-;41388:48;-1:-1:-1;41447:17:0;41467:22;:7;41388:48;41467:11;:22::i;:::-;41526:16;;;41540:1;41526:16;;;41502:21;41526:16;;;;;41447:42;;-1:-1:-1;41526:16:0;;;;;;;;;;;;-1:-1:-1;41526:16:0;41502:40;;-1:-1:-1;;;;;;;;;;;41553:4:0;41558:1;41553:7;;;;;;;;-1:-1:-1;;;;;41553:14:0;;;:7;;;;;;;;;:14;41596:5;;41578:7;;41596:5;;;41578:4;;41596:5;;41578:7;;;;;;-1:-1:-1;;;;;41578:24:0;;;:7;;;;;;;;;;;:24;41613;29235:42;41640:57;41718:9;41729:1;41732:4;41746;41753:11;:3;41761:2;41753:7;:11::i;:::-;41640:125;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41640:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41640:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41640:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41613:152;;41776:19;41798:7;41806:1;41798:10;;;;;;;;;;;;;;;;;;41910:5;;41798:10;;-1:-1:-1;29235:42:0;;41832:45;;-1:-1:-1;;;;;;;;;;;29333:42:0;-1:-1:-1;;;;;41910:5:0;41918:9;41798:10;41910:5;;41956:4;41963:11;:3;41971:2;41963:7;:11::i;:::-;41832:143;;;;;;;;;;;;;-1:-1:-1;;;;;41832:143:0;;;;;;-1:-1:-1;;;;;41832:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41832:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41832:143:0;;;;41029:954;-1:-1:-1;;;;;;;;;41029:954:0:o;41991:680::-;42081:11;42109:12;42105:26;;-1:-1:-1;42130:1:0;42123:8;;42105:26;42142:14;42182:8;-1:-1:-1;;;;;42159:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42159:42:0;42229;;;-1:-1:-1;;;42229:42:0;;;;42159;;-1:-1:-1;42212:14:0;;-1:-1:-1;;;;;42229:40:0;;;;;:42;;;;;42159;;42229;;;;;;;:40;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42229:42:0;;-1:-1:-1;42285:15:0;;-1:-1:-1;;;;;42321:43:0;;;42379:6;42229:42;42395:7;42285:15;;42418:4;42425:11;:3;42433:2;42425:7;:11::i;:::-;42321:116;;;;;;;;;;;;;-1:-1:-1;;;;;42321:116:0;;;;;;-1:-1:-1;;;;;42321:116:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42321:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42321:116:0;;;;;;;;;-1:-1:-1;42321:116:0;-1:-1:-1;42458:56:0;42483:7;42492:6;-1:-1:-1;;;;;;;;;;;42321:116:0;42458:24;:56::i;:::-;42448:66;;42535:56;42560:7;42569:6;-1:-1:-1;;;;;;;;;;;42583:7:0;42535:24;:56::i;:::-;42525:66;-1:-1:-1;42609:54:0;42619:7;-1:-1:-1;;;;;;;;;;;42642:20:0;:7;42525:66;42642:11;:20::i;42609:54::-;42602:61;41991:680;-1:-1:-1;;;;;;;;41991:680:0:o;8279:278::-;8365:7;8400:12;8393:5;8385:28;;;;-1:-1:-1;;;8385:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8424:9;8440:1;8436;:5;;;;;;;8279:278;-1:-1:-1;;;;;8279:278:0:o;6253:192::-;6339:7;6375:12;6367:6;;;;6359:29;;;;-1:-1:-1;;;6359:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6411:5:0;;;6253:192::o;2915:368::-;3117:45;;;-1:-1:-1;;;;;3117:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3117:45:0;-1:-1:-1;;;3117:45:0;;;3097:66;;;;3062:12;;3076:17;;3097:19;;;;3117:45;3097:66;;;3117:45;3097:66;;3117:45;3097:66;;;;;;;;;;-1:-1:-1;;3097:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3061:102;;;;3182:7;:57;;;;-1:-1:-1;3194:11:0;;:16;;:44;;;3225:4;3214:24;;;;;;;;;;;;;;;-1:-1:-1;3214:24:0;3194:44;3174:101;;;;;-1:-1:-1;;;3174:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12802:69;10938:12;;;;;;;;:31;;;10954:15;:13;:15::i;:::-;10938:47;;;-1:-1:-1;10974:11:0;;;;10973:12;10938:47;10930:106;;;;-1:-1:-1;;;10930:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11045:19;11068:12;;;;;;11067:13;11087:83;;;;11116:12;:19;;-1:-1:-1;;;;11116:19:0;;;;;11144:18;11131:4;11144:18;;;11192:14;11188:57;;;11232:5;11217:20;;-1:-1:-1;;11217:20:0;;;12802:69;:::o;14220:202::-;10938:12;;;;;;;;:31;;;10954:15;:13;:15::i;:::-;10938:47;;;-1:-1:-1;10974:11:0;;;;10973:12;10938:47;10930:106;;;;-1:-1:-1;;;10930:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11045:19;11068:12;;;;;;11067:13;11087:83;;;;11116:12;:19;;-1:-1:-1;;;;11116:19:0;;;;;11144:18;11131:4;11144:18;;;11087:83;14292:17:::1;14312:12;:10;:12::i;:::-;14335:6;:18:::0;;-1:-1:-1;;;;;;14335:18:0::1;-1:-1:-1::0;;;;;14335:18:0;::::1;::::0;;::::1;::::0;;;14369:43:::1;::::0;14335:18;;-1:-1:-1;14335:18:0;-1:-1:-1;;14369:43:0::1;::::0;-1:-1:-1;;14369:43:0::1;11178:1;11192:14:::0;11188:57;;;11232:5;11217:20;;-1:-1:-1;;11217:20:0;;;14220:202;:::o;40284:520::-;40408:7;40446:8;-1:-1:-1;;;;;40432:22:0;:10;-1:-1:-1;;;;;40432:22:0;;:38;;;-1:-1:-1;40458:12:0;;40432:38;40428:58;;;-1:-1:-1;40479:7:0;40472:14;;40428:58;40521:16;;;40535:1;40521:16;;;40497:21;40521:16;;;;;40497:21;40521:16;;;;;;;;;;-1:-1:-1;40521:16:0;40497:40;;40558:10;40548:4;40553:1;40548:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;40548:20:0;;;-1:-1:-1;;;;;40548:20:0;;;;;40589:8;40579:4;40584:1;40579:7;;;;;;;;-1:-1:-1;;;;;40579:18:0;;;:7;;;;;;;;;:18;40608:20;;40631:52;;;40708:7;40717:1;40720:4;40734;40741:11;:3;40749:2;40741:7;:11::i;:::-;40631:122;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40631:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40631:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40631:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40608:145;;40771:6;40794:1;40778:6;:13;:17;40771:25;;;;;;;;;;;;;;40764:32;;;;40284:520;;;;;;;:::o
Swarm Source
ipfs://b6b7aa1840fa915a6be5996fff88b93038a4b3a34f1be7d0a689896de2919e63
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.