ERC-20
Overview
Max Total Supply
999,926.403223893 MAGX
Holders
383
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
1.25475736 MAGXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Magix
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; import "@openzeppelin/contracts/GSN/Context.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import {IUniswapV2Router02, IUniswapV2Factory} from "./Interfaces.sol"; /** * * ███╗ ███╗ █████╗ ██████╗ ██╗██╗ ██╗ * ████╗ ████║██╔══██╗██╔════╝ ██║╚██╗██╔╝ * ██╔████╔██║███████║██║ ███╗██║ ╚███╔╝ * ██║╚██╔╝██║██╔══██║██║ ██║██║ ██╔██╗ * ██║ ╚═╝ ██║██║ ██║╚██████╔╝██║██╔╝ ██╗ * ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝ * * TRI fork with a sprinkle of magic. * Supports: * - Auto passive yield thanks to RFI mechanics * - Auto liquidity generation from each tx * - Magic re-balancer creating buy pressure by burning tokens and re-balancing liquidity */ contract Magix is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; string private _name = "Magix"; string private _symbol = "MAGX"; uint8 private _decimals = 9; uint256 private constant MAX = ~uint256(0); uint256 internal _tTotal = 1_000_000e9; uint256 internal _rTotal = (MAX - (MAX % _tTotal)); mapping(address => uint256) internal _rOwned; mapping(address => uint256) internal _tOwned; mapping(address => mapping(address => uint256)) internal _allowances; mapping(address => bool) internal _noFee; mapping(address => bool) internal _isExcluded; address[] internal _excluded; // The tax fee contains two decimal places so 250 = 2.5% uint256 public _feeDecimal = 2; uint256 public _taxFee = 200; uint256 public _liquidityFee = 100; uint256 public taxFeeTotal; uint256 public liquidityFeeTotal; uint256 public burnFeeTotal; uint256 public liquidityAddedAt; bool public tradingEnabled = false; bool public swapAndLiquifyEnabled = true; bool private _inSwapAndLiquify; // Swapping fees to LP tokens uint256 public minTokensBeforeSwap = 500e9; uint256 public autoSwapCallerFee = 20e9; // Magic re-balancer to buy-back and burn tokens address public balancer; uint256 public lastRebalance; uint256 public rebalanceInterval = 30 minutes; uint256 public minTokensForMagic = 100e9; uint256 public rebalanceCallerFee = 400; // % uint256 public liquidityRemoveFee = 100; // % address constant uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; event RewardsDistributed(uint256 amount); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapedTokenForEth(uint256 EthAmount, uint256 TokenAmount); event SwapedEthForTokens(uint256 EthAmount, uint256 TokenAmount, uint256 CallerReward, uint256 AmountBurned); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity); event Rebalance(uint256 tokenBurnt); event TradingEnabled(); event TaxFeeUpdated(uint256 taxFee); event LockFeeUpdated(uint256 lockFee); event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event AutoSwapCallerFeeUpdated(uint256 autoSwapCallerFee); event LiquidityRemoveFeeUpdated(uint256 liquidityRemoveFee); event MagicCallerFeeUpdated(uint256 rebalnaceCallerFee); event MinTokenForMagicUpdated(uint256 minRebalanceAmount); event MagicIntervalUpdated(uint256 rebalanceInterval); modifier lockTheSwap { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } constructor() public { uniswapV2Router = IUniswapV2Router02(uniswapRouter); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); balancer = address(new Balancer()); lastRebalance = block.timestamp; _noFee[_msgSender()] = true; _noFee[address(this)] = true; // Exclude uniswapV2Pair from taking rewards _isExcluded[uniswapV2Pair] = true; _excluded.push(uniswapV2Pair); _rOwned[_msgSender()] = _rTotal; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public override view returns (uint256) { return _tTotal; } function balanceOf(address account) public override view returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override virtual returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override virtual returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcluded(address account) public view returns (bool) { return _isExcluded[account]; } function reflectionFromToken(uint256 tokenAmount, bool deductTransferFee) public view returns (uint256) { require(tokenAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { return tokenAmount.mul(_getReflectionRate()); } else { return tokenAmount .sub(tokenAmount.mul(_taxFee).div(10 ** _feeDecimal + 2)) .mul(_getReflectionRate()); } } function tokenFromReflection(uint256 reflectionAmount) public view returns (uint256) { require(reflectionAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getReflectionRate(); return reflectionAmount.div(currentRate); } function excludeAccount(address account) external onlyOwner() { require(account != uniswapRouter, "Magix: Uniswap router cannot be excluded."); require(account != address(this), 'Magix: The contract it self cannot be excluded'); require(!_isExcluded[account], "Magix: Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeAccount(address account) external onlyOwner() { require(_isExcluded[account], "Magix: Account is already included"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(tradingEnabled || sender == owner() || recipient == owner() || _noFee[sender] || _noFee[recipient], "Trading is locked before presale."); // Anti-bot measures require(block.timestamp > liquidityAddedAt + 6 minutes || amount <= 20_000e9, "You cannot transfer more than 20000 tokens."); // Don't auto-swap tokens in any txs related to Uniswap to keep TX fees low and prevent circular calls if (swapAndLiquifyEnabled && !_inSwapAndLiquify && _msgSender() != uniswapV2Pair && _msgSender() != uniswapRouter && sender != uniswapV2Pair && sender != uniswapRouter) { uint256 lockedBalanceForPool = balanceOf(address(this)); bool overMinTokenBalance = lockedBalanceForPool >= minTokensBeforeSwap; if (overMinTokenBalance) { swapAndLiquifyForEth(lockedBalanceForPool); } } // Transfer magic uint256 transferAmount = amount; uint256 rate = _getReflectionRate(); if (!_noFee[sender] && !_noFee[recipient] && !_inSwapAndLiquify) { transferAmount = collectFee(sender, amount, rate); } _rOwned[sender] = _rOwned[sender].sub(amount.mul(rate)); _rOwned[recipient] = _rOwned[recipient].add(transferAmount.mul(rate)); if (_isExcluded[sender]) { _tOwned[sender] = _tOwned[sender].sub(amount); } if (_isExcluded[recipient]) { _tOwned[recipient] = _tOwned[recipient].add(transferAmount); } emit Transfer(sender, recipient, transferAmount); } function collectFee(address account, uint256 amount, uint256 rate) private returns (uint256) { uint256 transferAmount = amount; // Distribute reflection fee if (_taxFee != 0) { uint256 taxFee = amount.mul(_taxFee).div(10 ** (_feeDecimal + 2)); transferAmount = transferAmount.sub(taxFee); _rTotal = _rTotal.sub(taxFee.mul(rate)); taxFeeTotal = taxFeeTotal.add(taxFee); emit RewardsDistributed(taxFee); } // Collect liquidity fee if (_liquidityFee != 0) { uint256 liquidityFee = amount.mul(_liquidityFee).div(10 ** (_feeDecimal + 2)); transferAmount = transferAmount.sub(liquidityFee); _rOwned[address(this)] = _rOwned[address(this)].add(liquidityFee.mul(rate)); liquidityFeeTotal = liquidityFeeTotal.add(liquidityFee); emit Transfer(account, address(this), liquidityFee); } return transferAmount; } function _getReflectionRate() private view returns (uint256) { uint256 reflectionSupply = _rTotal; uint256 tokenSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > reflectionSupply || _tOwned[_excluded[i]] > tokenSupply) { return _rTotal.div(_tTotal); } reflectionSupply = reflectionSupply.sub(_rOwned[_excluded[i]]); tokenSupply = tokenSupply.sub(_tOwned[_excluded[i]]); } if (reflectionSupply < _rTotal.div(_tTotal)) { return _rTotal.div(_tTotal); } return reflectionSupply.div(tokenSupply); } function swapAndLiquifyForEth(uint256 lockedBalanceForPool) private lockTheSwap { uint256 lockedForSwap = lockedBalanceForPool.sub(autoSwapCallerFee); uint256 half = lockedForSwap.div(2); uint256 otherHalf = lockedForSwap.sub(half); uint256 initialBalance = address(this).balance; swapTokensForEth(half); uint256 newBalance = address(this).balance.sub(initialBalance); addLiquidityETH(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); _transfer(address(this), tx.origin, autoSwapCallerFee); } function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function swapEthForTokens(uint256 ethAmount) private { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}( 0, path, address(balancer), block.timestamp ); } function addLiquidityETH(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value : ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(this), block.timestamp ); } function removeLiquidityETH(uint256 lpAmount) private returns (uint ETHAmount) { IERC20(uniswapV2Pair).approve(address(uniswapV2Router), lpAmount); (ETHAmount) = uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens( address(this), lpAmount, 0, 0, address(this), block.timestamp ); } function doTheMagic() public lockTheSwap { require(balanceOf(_msgSender()) >= minTokensForMagic, "Magix: First you have to obtain magic by owning 100 MAGIX"); require(block.timestamp > lastRebalance + rebalanceInterval, 'Magix: Magic does not happen often, please wait'); lastRebalance = block.timestamp; uint256 amountToRemove = IERC20(uniswapV2Pair).balanceOf(address(this)).mul(liquidityRemoveFee).div(10 ** (_feeDecimal + 2)); if (amountToRemove == 0) { return; } uint256 initialBalance = address(this).balance; removeLiquidityETH(amountToRemove); uint256 receivedEth = address(this).balance.sub(initialBalance); swapEthForTokens(receivedEth); uint256 tNewTokenBalance = balanceOf(address(balancer)); uint256 tRewardForCaller = tNewTokenBalance.mul(rebalanceCallerFee).div(10 ** (_feeDecimal + 2)); uint256 tBurn = tNewTokenBalance.sub(tRewardForCaller); uint256 rate = _getReflectionRate(); _rOwned[_msgSender()] = _rOwned[_msgSender()].add(tRewardForCaller.mul(rate)); _rOwned[address(balancer)] = 0; // Just deduct the burn value instead of sending it to the burn address, we want to keep consistent Black Hole inflation rate burnFeeTotal = burnFeeTotal.add(tBurn); _tTotal = _tTotal.sub(tBurn); _rTotal = _rTotal.sub(tBurn.mul(rate)); emit Transfer(address(balancer), _msgSender(), tRewardForCaller); emit Transfer(address(balancer), address(0), tBurn); emit Rebalance(tBurn); } function setExcludedFromFee(address account, bool excluded) public onlyOwner { _noFee[account] = excluded; } function setSwapAndLiquifyEnabled(bool enabled) public onlyOwner { swapAndLiquifyEnabled = enabled; emit SwapAndLiquifyEnabledUpdated(enabled); } function setTaxFee(uint256 taxFee) external onlyOwner { require(taxFee >= 0 && taxFee <= 5 * 10 ** _feeDecimal, 'Magix: taxFee should be in 0 - 5'); _taxFee = taxFee; emit TaxFeeUpdated(taxFee); } function setLiquidityFee(uint256 fee) public onlyOwner { require(fee >= 0 && fee <= 5 * 10 ** _feeDecimal, 'Magix: lockFee should be in 0 - 5'); _liquidityFee = fee; emit LockFeeUpdated(fee); } function setMinTokensBeforeSwap(uint256 amount) external onlyOwner() { require(amount >= 50e9 && amount <= 25000e9, 'Magix: minTokenBeforeSwap should be in 50e9 - 25000e9'); require(amount > autoSwapCallerFee, 'Magix: minTokenBeforeSwap should be greater than autoSwapCallerFee'); minTokensBeforeSwap = amount; emit MinTokensBeforeSwapUpdated(minTokensBeforeSwap); } function setAutoSwapCallerFee(uint256 fee) external onlyOwner() { require(fee >= 1e9, 'Magix: autoSwapCallerFee should be greater than 1e9'); autoSwapCallerFee = fee; emit AutoSwapCallerFeeUpdated(autoSwapCallerFee); } function setLiquidityRemoveFee(uint256 fee) external onlyOwner() { require(fee >= 1 && fee <= 10 * 10 ** _feeDecimal, 'Magix: liquidityRemoveFee should be in 1 - 10'); liquidityRemoveFee = fee; emit LiquidityRemoveFeeUpdated(liquidityRemoveFee); } function setMagicCallerFee(uint256 fee) external onlyOwner() { require(fee >= 1 && fee <= 15 * 10 ** _feeDecimal, 'Magix: magicCallerFee should be in 1 - 15'); rebalanceCallerFee = fee; emit MagicCallerFeeUpdated(rebalanceCallerFee); } function setMagicInterval(uint256 interval) public onlyOwner() { rebalanceInterval = interval; emit MagicIntervalUpdated(rebalanceInterval); } function setMinTokenForAlchemy(uint256 amount) external onlyOwner() { minTokensForMagic = amount; emit MinTokenForMagicUpdated(minTokensForMagic); } function enableTrading() external onlyOwner() { liquidityAddedAt = block.timestamp; tradingEnabled = true; emit TradingEnabled(); } receive() external payable {} } contract Balancer { constructor() public { } }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Pair { function sync() external; } interface IUniswapV2Router02 { 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 removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.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. */ abstract contract Context { 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; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../GSN/Context.sol"; /** * @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. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { 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; } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "libraries": { "": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"autoSwapCallerFee","type":"uint256"}],"name":"AutoSwapCallerFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRemoveFee","type":"uint256"}],"name":"LiquidityRemoveFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockFee","type":"uint256"}],"name":"LockFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebalnaceCallerFee","type":"uint256"}],"name":"MagicCallerFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebalanceInterval","type":"uint256"}],"name":"MagicIntervalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minRebalanceAmount","type":"uint256"}],"name":"MinTokenForMagicUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"CallerReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AmountBurned","type":"uint256"}],"name":"SwapedEthForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenAmount","type":"uint256"}],"name":"SwapedTokenForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"TaxFeeUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_feeDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balancer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doTheMagic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityRemoveFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensForMagic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setAutoSwapCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityRemoveFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMagicCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setMagicInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokenForAlchemy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052600560808190526409ac2ced2f60db1b60a09081526200002891600191906200046c565b506040805180820190915260048082526309a828eb60e31b602090920191825262000056916002916200046c565b506003805460ff1916600917905566038d7ea4c68000600481905560001906196005556002600c5560c8600d556064600e8190556013805461ffff191661010017905564746a5288006014556404a817c80060155561070860185564174876e800601955610190601a55601b55348015620000d057600080fd5b506000620000dd62000468565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601c80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17908190556040805163c45a015560e01b815290516001600160a01b03929092169163c45a015591600480820192602092909190829003018186803b1580156200019357600080fd5b505afa158015620001a8573d6000803e3d6000fd5b505050506040513d6020811015620001bf57600080fd5b5051601c54604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200029157600080fd5b505af1158015620002a6573d6000803e3d6000fd5b505050506040513d6020811015620002bd57600080fd5b5051601d80546001600160a01b0319166001600160a01b03909216919091179055604051620002ec9062000501565b604051809103906000f08015801562000309573d6000803e3d6000fd5b50601680546001600160a01b0319166001600160a01b0392909216919091179055426017556001600960006200033e62000468565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260098452828120805486166001908117909155601d805484168352600a909552928120805490951683179094559154600b8054928301815584527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319169190921617905560055490600690620003f162000468565b6001600160a01b031681526020810191909152604001600020556200041562000468565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004546040518082815260200191505060405180910390a362000525565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620004a45760008555620004ef565b82601f10620004bf57805160ff1916838001178555620004ef565b82800160010185558215620004ef579182015b82811115620004ef578251825591602001919060010190620004d2565b50620004fd9291506200050e565b5090565b605c806200489f83390190565b5b80821115620004fd57600081556001016200050f565b61436a80620005356000396000f3fe60806040526004361061032d5760003560e01c80636ba5b8b8116101a55780639fed80ca116100ec578063cba0e99611610095578063e5d41c6b1161006f578063e5d41c6b14610a87578063f2cc0c1814610a9c578063f2fde38b14610adc578063f84354f114610b1c57610334565b8063cba0e996146109ea578063dd62ed3e14610a2a578063e563037e14610a7257610334565b8063a94917b1116100c6578063a94917b11461096a578063c4081a4c14610994578063c49b9a80146109be57610334565b80639fed80ca146108b4578063a457c2d7146108de578063a9059cbb1461092457610334565b8063887675d51161014e5780638da5cb5b116101285780638da5cb5b1461087557806390f75e561461088a57806395d89b411461089f57610334565b8063887675d51461080c5780638a8c523c146108365780638b4d0ef71461084b57610334565b806370a082311161017f57806370a08231146107a2578063715018a6146107e25780637444483e146107f757610334565b80636ba5b8b8146107635780636bc87c3a146107785780636eea27171461078d57610334565b8063313ce5671161027457806349bd5a5e1161021d5780634ccd8e5a116101f75780634ccd8e5a146106c75780634f080736146106dc5780636612e66f146107065780636a4fce601461074e57610334565b806349bd5a5e146106885780634a74bb021461069d5780634ada218b146106b257610334565b80633b124fe71161024e5780633b124fe7146106175780634549b0391461062c57806348a464731461065e57610334565b8063313ce5671461057a578063357bf15c146105a557806339509351146105d157610334565b806317519dae116102d65780631e6ee830116102b05780631e6ee830146104eb57806323b872dd146105005780632d8381191461055057610334565b806317519dae146104ac57806318160ddd146104c157806319db457d146104d657610334565b8063106b9ca111610307578063106b9ca1146104445780631694505e1461045957806316d1d9161461049757610334565b806304b645271461033957806306fdde0314610360578063095ea7b3146103ea57610334565b3661033457005b600080fd5b34801561034557600080fd5b5061034e610b5c565b60408051918252519081900360200190f35b34801561036c57600080fd5b50610375610b62565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506104306004803603604081101561040d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c16565b604080519115158252519081900360200190f35b34801561045057600080fd5b5061034e610c34565b34801561046557600080fd5b5061046e610c3a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104a357600080fd5b5061034e610c56565b3480156104b857600080fd5b5061034e610c5c565b3480156104cd57600080fd5b5061034e610c62565b3480156104e257600080fd5b5061034e610c68565b3480156104f757600080fd5b5061034e610c6e565b34801561050c57600080fd5b506104306004803603606081101561052357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c74565b34801561055c57600080fd5b5061034e6004803603602081101561057357600080fd5b5035610d15565b34801561058657600080fd5b5061058f610d91565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506105cf600480360360208110156105c857600080fd5b5035610d9a565b005b3480156105dd57600080fd5b50610430600480360360408110156105f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ec7565b34801561062357600080fd5b5061034e610f22565b34801561063857600080fd5b5061034e6004803603604081101561064f57600080fd5b50803590602001351515610f28565b34801561066a57600080fd5b506105cf6004803603602081101561068157600080fd5b5035610ffb565b34801561069457600080fd5b5061046e611191565b3480156106a957600080fd5b506104306111ad565b3480156106be57600080fd5b506104306111bb565b3480156106d357600080fd5b5061034e6111c4565b3480156106e857600080fd5b506105cf600480360360208110156106ff57600080fd5b50356111ca565b34801561071257600080fd5b506105cf6004803603604081101561072957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611304565b34801561075a57600080fd5b5061034e6113eb565b34801561076f57600080fd5b5061034e6113f1565b34801561078457600080fd5b5061034e6113f7565b34801561079957600080fd5b506105cf6113fd565b3480156107ae57600080fd5b5061034e600480360360208110156107c557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611825565b3480156107ee57600080fd5b506105cf6118ae565b34801561080357600080fd5b5061034e6119ae565b34801561081857600080fd5b506105cf6004803603602081101561082f57600080fd5b50356119b4565b34801561084257600080fd5b506105cf611a80565b34801561085757600080fd5b506105cf6004803603602081101561086e57600080fd5b5035611b6b565b34801561088157600080fd5b5061046e611c94565b34801561089657600080fd5b5061034e611cb0565b3480156108ab57600080fd5b50610375611cb6565b3480156108c057600080fd5b506105cf600480360360208110156108d757600080fd5b5035611d32565b3480156108ea57600080fd5b506104306004803603604081101561090157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e6c565b34801561093057600080fd5b506104306004803603604081101561094757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611ee1565b34801561097657600080fd5b506105cf6004803603602081101561098d57600080fd5b5035611ef5565b3480156109a057600080fd5b506105cf600480360360208110156109b757600080fd5b5035611fc1565b3480156109ca57600080fd5b506105cf600480360360208110156109e157600080fd5b50351515612104565b3480156109f657600080fd5b5061043060048036036020811015610a0d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612201565b348015610a3657600080fd5b5061034e60048036036040811015610a4d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661222c565b348015610a7e57600080fd5b5061046e612264565b348015610a9357600080fd5b5061034e612280565b348015610aa857600080fd5b506105cf60048036036020811015610abf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612286565b348015610ae857600080fd5b506105cf60048036036020811015610aff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125b2565b348015610b2857600080fd5b506105cf60048036036020811015610b3f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661273c565b60125481565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505090505b90565b6000610c2a610c23612a05565b8484612a09565b5060015b92915050565b60175481565b601c5473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b601b5481565b60045490565b600c5481565b600f5481565b6000610c81848484612b50565b610d0b84610c8d612a05565b610d068560405180606001604052806028815260200161421f6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812090610cd8612a05565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205491906131fe565b612a09565b5060019392505050565b6000600554821115610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614006602a913960400191505060405180910390fd5b6000610d7c6132af565b9050610d88838261345a565b9150505b919050565b60035460ff1690565b610da2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610e2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a600502811115610e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141a46021913960400191505060405180910390fd5b600e8190556040805182815290517fc9c3eda55e0c1d7fbf155eefd9be0dcbb00e86498e4a8c8efb530e71d390b9ad9181900360200190a150565b6000610c2a610ed4612a05565b84610d068560086000610ee5612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906134a3565b600d5481565b6000600454831115610f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610fb957610fb2610fab6132af565b8490613517565b9050610c2e565b610fb2610fc46132af565b610ff5610fee600c54600a0a600201610fe8600d548961351790919063ffffffff16565b9061345a565b869061358a565b90613517565b611003612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461108c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b640ba43b740081101580156110a757506516bcc41e90008111155b6110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140c76035913960400191505060405180910390fd5b6015548111611156576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613f506042913960600191505060405180910390fd5b60148190556040805182815290517f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009181900360200190a150565b601d5473ffffffffffffffffffffffffffffffffffffffff1681565b601354610100900460ff1681565b60135460ff1681565b60115481565b6111d2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461125b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600181101580156112745750600c54600a0a600f028111155b6112c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061430c6029913960400191505060405180910390fd5b601a8190556040805182815290517f9765f75ab2b13d6c29b74cc52404cbfe9c6485274d6b86a869014f52993ac24e9181900360200190a150565b61130c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461139557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60195481565b60105481565b600e5481565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560195461143d611438612a05565b611825565b1015611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806141e66039913960400191505060405180910390fd5b6018546017540142116114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fd7602f913960400191505060405180910390fd5b42601755600c54601b54601d54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000946115b4946002909101600a0a93610fe893919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d60208110156115ac57600080fd5b505190613517565b9050806115c157506117fb565b476115cb826135cc565b5060006115d8478361358a565b90506115e381613747565b6016546000906116089073ffffffffffffffffffffffffffffffffffffffff16611825565b9050600061162d600c54600201600a0a610fe8601a548561351790919063ffffffff16565b9050600061163b838361358a565b905060006116476132af565b905061168f6116568483613517565b60066000611662612a05565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906134a3565b6006600061169b612a05565b73ffffffffffffffffffffffffffffffffffffffff9081168252602080830193909352604091820160009081209490945560165416835260069091528120556011546116e790836134a3565b6011556004546116f7908361358a565b6004556117106117078383613517565b6005549061358a565b60055561171b612a05565b60165460408051868152905173ffffffffffffffffffffffffffffffffffffffff9384169392909216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360165460408051848152905160009273ffffffffffffffffffffffffffffffffffffffff16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a36040805183815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09181900360200190a1505050505050505b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff169055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604081205460ff161561187f575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902054610d8c565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054610c2e90610d15565b6118b6612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461193f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b601a5481565b6119bc612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611a4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60198190556040805182815290517f8374a3bea33ded453e957fa7e2b11170872937507d72670d3b848ad4bd98f9e19181900360200190a150565b611a88612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b42601255601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b611b73612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611bfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b633b9aca00811015611c59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141256033913960400191505060405180910390fd5b60158190556040805182815290517f74272e6f6c75e19c6f48bb75e2724eb55e3e1726f8b81d97f1db21d22ead93dc9181900360200190a150565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60155481565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b611d3a612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60018110158015611ddc5750600c54600a0a600a028111155b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061409a602d913960400191505060405180910390fd5b601b8190556040805182815290517f5be5e13332f5fe25d72958c9d03ce5cdb01b189670222a86673715d56e43ce2a9181900360200190a150565b6000610c2a611e79612a05565b84610d06856040518060600160405280602581526020016142e76025913960086000611ea3612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d168152925290205491906131fe565b6000610c2a611eee612a05565b8484612b50565b611efd612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611f8657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60188190556040805182815290517f8b06935304277197be5d3ccc7b672a23adfc30c675f1078e336b6204843020239181900360200190a150565b611fc9612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461205257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a6005028111156120c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d616769783a207461784665652073686f756c6420626520696e2030202d2035604482015290519081900360640190fd5b600d8190556040805182815290517faa4b71ac29531fdea0ef1650c76ef91e3771dac25f4a4dd2a561ff3e0b9a5de29181900360200190a150565b61210c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461219557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6013805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205490565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b61228e612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116737a250d5630b4cf539739df2c5dacb4c659f2488d141561239a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140fc6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116301415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806142b9602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1615612488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140786022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260066020526040902054156125095773ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409020546124e290610d15565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6125ba612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461264357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140306026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612744612a05565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146127cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1661284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613fb56022913960400191505060405180910390fd5b60005b600b54811015612a01578173ffffffffffffffffffffffffffffffffffffffff16600b828154811061287c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156129f957600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128d457fe5b600091825260209091200154600b805473ffffffffffffffffffffffffffffffffffffffff909216918390811061290757fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600782526040808220829055600a9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600b80548061299c57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612a01565b60010161284e565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806142956024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140566022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612bbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142706025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613f926023913960400191505060405180910390fd5b60008111612c81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806142476029913960400191505060405180910390fd5b60135460ff1680612cc45750612c95611c94565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612d015750612cd2611c94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d31575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b80612d61575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff165b612db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141836021913960400191505060405180910390fd5b60125461016801421180612dd057506512309ce540008111155b612e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614158602b913960400191505060405180910390fd5b601354610100900460ff168015612e45575060135462010000900460ff16155b8015612e865750601d5473ffffffffffffffffffffffffffffffffffffffff16612e6d612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612ec35750737a250d5630b4cf539739df2c5dacb4c659f2488d612eaa612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612eea5750601d5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612f20575073ffffffffffffffffffffffffffffffffffffffff8316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15612f4b576000612f3030611825565b6014549091508110801590612f4857612f4882613956565b50505b806000612f566132af565b73ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205490915060ff16158015612fb5575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612fca575060135462010000900460ff16155b15612fdd57612fda858483613a52565b91505b613016612fea8483613517565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600660205260409020549061358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600660205260409020556130756130498383613517565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260066020526040902054906134a3565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600660209081526040808320949094559188168152600a909152205460ff161561310d5773ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020546130e6908461358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16156131925773ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205461316b90836134a3565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b600081848411156132a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561326c578181015183820152602001613254565b50505050905090810190601f1680156132995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60055460045460009190825b600b5481101561341a578260066000600b84815481106132d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061335657508160076000600b848154811061332257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156133745760045460055461336a9161345a565b9350505050610c13565b6133c160066000600b848154811061338857fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061358a565b925061341060076000600b84815481106133d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061358a565b91506001016132bb565b5060045460055461342a9161345a565b821015613449576004546005546134409161345a565b92505050610c13565b613453828261345a565b9250505090565b600061349c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bb8565b9392505050565b60008282018381101561349c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261352657506000610c2e565b8282028284828161353357fe5b041461349c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141c56021913960400191505060405180910390fd5b600061349c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131fe565b601d54601c54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561364e57600080fd5b505af1158015613662573d6000803e3d6000fd5b505050506040513d602081101561367857600080fd5b5050601c54604080517faf2979eb0000000000000000000000000000000000000000000000000000000081523060048201819052602482018690526000604483018190526064830181905260848301919091524260a4830152915173ffffffffffffffffffffffffffffffffffffffff9093169263af2979eb9260c480840193602093929083900390910190829087803b15801561371557600080fd5b505af1158015613729573d6000803e3d6000fd5b505050506040513d602081101561373f57600080fd5b505192915050565b6040805160028082526060820183526000926020830190803683375050601c54604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156137d257600080fd5b505afa1580156137e6573d6000803e3d6000fd5b505050506040513d60208110156137fc57600080fd5b50518151829060009061380b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061385357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c546016546040517fb6f9de95000000000000000000000000000000000000000000000000000000008152600060048201818152928616604483018190524260648401819052608060248501908152895160848601528951969098169763b6f9de95978b9794968b9694959394909360a49091019187810191028083838b5b838110156139125781810151838201526020016138fa565b50505050905001955050505050506000604051808303818588803b15801561393957600080fd5b505af115801561394d573d6000803e3d6000fd5b50505050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560155460009061399490839061358a565b905060006139a382600261345a565b905060006139b1838361358a565b9050476139bd83613c37565b60006139c9478361358a565b90506139d58382613e64565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1613a223032601554612b50565b5050601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905550505050565b600d54600090839015613ae5576000613a82600c54600201600a0a610fe8600d548861351790919063ffffffff16565b9050613a8e828261358a565b9150613a9d6117078286613517565b600555600f54613aad90826134a3565b600f556040805182815290517f6d1c76d614228b523baa4dcd9539e2c713b54ff4ab3ff2d1627e7f6cd32be4429181900360200190a1505b600e5415613bb0576000613b10600c54600201600a0a610fe8600e548861351790919063ffffffff16565b9050613b1c828261358a565b9150613b41613b2b8286613517565b30600090815260066020526040902054906134a3565b30600090815260066020526040902055601054613b5e90826134a3565b601055604080518281529051309173ffffffffffffffffffffffffffffffffffffffff8916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505b949350505050565b60008183613c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561326c578181015183820152602001613254565b506000838581613c2d57fe5b0495945050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110613c9357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b5051815182906001908110613d4857fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152601c54613d7b9130911684612a09565b601c546040517f791ac947000000000000000000000000000000000000000000000000000000008152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a4870152875173ffffffffffffffffffffffffffffffffffffffff9097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015613e27578181015183820152602001613e0f565b505050509050019650505050505050600060405180830381600087803b158015613e5057600080fd5b505af1158015613a22573d6000803e3d6000fd5b601c54613e8990309073ffffffffffffffffffffffffffffffffffffffff1684612a09565b601c54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b158015613f1e57600080fd5b505af1158015613f32573d6000803e3d6000fd5b50505050506040513d6060811015613f4957600080fd5b5050505056fe4d616769783a206d696e546f6b656e4265666f7265537761702073686f756c642062652067726561746572207468616e206175746f5377617043616c6c657246656545524332303a207472616e7366657220746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c726561647920696e636c756465644d616769783a204d6167696320646f6573206e6f742068617070656e206f6674656e2c20706c656173652077616974416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c7265616479206578636c756465644d616769783a206c697175696469747952656d6f76654665652073686f756c6420626520696e2031202d2031304d616769783a206d696e546f6b656e4265666f7265537761702073686f756c6420626520696e2035306539202d20323530303065394d616769783a20556e697377617020726f757465722063616e6e6f74206265206578636c756465642e4d616769783a206175746f5377617043616c6c65724665652073686f756c642062652067726561746572207468616e20316539596f752063616e6e6f74207472616e73666572206d6f7265207468616e20323030303020746f6b656e732e54726164696e67206973206c6f636b6564206265666f72652070726573616c652e4d616769783a206c6f636b4665652073686f756c6420626520696e2030202d2035536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d616769783a20466972737420796f75206861766520746f206f627461696e206d61676963206279206f776e696e6720313030204d4147495845524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d616769783a2054686520636f6e74726163742069742073656c662063616e6e6f74206265206578636c7564656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4d616769783a206d6167696343616c6c65724665652073686f756c6420626520696e2031202d203135a264697066735822122040901b1e96f3d70d02ba0896570d55ea7b62de348417763890759b6c7d5cd4f464736f6c634300070600336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212209e3f4c8bfeb5b36140f7ab1ef371186a37c230fc19e47e5a8cb8a3ade91c4a6c64736f6c63430007060033
Deployed Bytecode
0x60806040526004361061032d5760003560e01c80636ba5b8b8116101a55780639fed80ca116100ec578063cba0e99611610095578063e5d41c6b1161006f578063e5d41c6b14610a87578063f2cc0c1814610a9c578063f2fde38b14610adc578063f84354f114610b1c57610334565b8063cba0e996146109ea578063dd62ed3e14610a2a578063e563037e14610a7257610334565b8063a94917b1116100c6578063a94917b11461096a578063c4081a4c14610994578063c49b9a80146109be57610334565b80639fed80ca146108b4578063a457c2d7146108de578063a9059cbb1461092457610334565b8063887675d51161014e5780638da5cb5b116101285780638da5cb5b1461087557806390f75e561461088a57806395d89b411461089f57610334565b8063887675d51461080c5780638a8c523c146108365780638b4d0ef71461084b57610334565b806370a082311161017f57806370a08231146107a2578063715018a6146107e25780637444483e146107f757610334565b80636ba5b8b8146107635780636bc87c3a146107785780636eea27171461078d57610334565b8063313ce5671161027457806349bd5a5e1161021d5780634ccd8e5a116101f75780634ccd8e5a146106c75780634f080736146106dc5780636612e66f146107065780636a4fce601461074e57610334565b806349bd5a5e146106885780634a74bb021461069d5780634ada218b146106b257610334565b80633b124fe71161024e5780633b124fe7146106175780634549b0391461062c57806348a464731461065e57610334565b8063313ce5671461057a578063357bf15c146105a557806339509351146105d157610334565b806317519dae116102d65780631e6ee830116102b05780631e6ee830146104eb57806323b872dd146105005780632d8381191461055057610334565b806317519dae146104ac57806318160ddd146104c157806319db457d146104d657610334565b8063106b9ca111610307578063106b9ca1146104445780631694505e1461045957806316d1d9161461049757610334565b806304b645271461033957806306fdde0314610360578063095ea7b3146103ea57610334565b3661033457005b600080fd5b34801561034557600080fd5b5061034e610b5c565b60408051918252519081900360200190f35b34801561036c57600080fd5b50610375610b62565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506104306004803603604081101561040d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c16565b604080519115158252519081900360200190f35b34801561045057600080fd5b5061034e610c34565b34801561046557600080fd5b5061046e610c3a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104a357600080fd5b5061034e610c56565b3480156104b857600080fd5b5061034e610c5c565b3480156104cd57600080fd5b5061034e610c62565b3480156104e257600080fd5b5061034e610c68565b3480156104f757600080fd5b5061034e610c6e565b34801561050c57600080fd5b506104306004803603606081101561052357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c74565b34801561055c57600080fd5b5061034e6004803603602081101561057357600080fd5b5035610d15565b34801561058657600080fd5b5061058f610d91565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506105cf600480360360208110156105c857600080fd5b5035610d9a565b005b3480156105dd57600080fd5b50610430600480360360408110156105f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ec7565b34801561062357600080fd5b5061034e610f22565b34801561063857600080fd5b5061034e6004803603604081101561064f57600080fd5b50803590602001351515610f28565b34801561066a57600080fd5b506105cf6004803603602081101561068157600080fd5b5035610ffb565b34801561069457600080fd5b5061046e611191565b3480156106a957600080fd5b506104306111ad565b3480156106be57600080fd5b506104306111bb565b3480156106d357600080fd5b5061034e6111c4565b3480156106e857600080fd5b506105cf600480360360208110156106ff57600080fd5b50356111ca565b34801561071257600080fd5b506105cf6004803603604081101561072957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611304565b34801561075a57600080fd5b5061034e6113eb565b34801561076f57600080fd5b5061034e6113f1565b34801561078457600080fd5b5061034e6113f7565b34801561079957600080fd5b506105cf6113fd565b3480156107ae57600080fd5b5061034e600480360360208110156107c557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611825565b3480156107ee57600080fd5b506105cf6118ae565b34801561080357600080fd5b5061034e6119ae565b34801561081857600080fd5b506105cf6004803603602081101561082f57600080fd5b50356119b4565b34801561084257600080fd5b506105cf611a80565b34801561085757600080fd5b506105cf6004803603602081101561086e57600080fd5b5035611b6b565b34801561088157600080fd5b5061046e611c94565b34801561089657600080fd5b5061034e611cb0565b3480156108ab57600080fd5b50610375611cb6565b3480156108c057600080fd5b506105cf600480360360208110156108d757600080fd5b5035611d32565b3480156108ea57600080fd5b506104306004803603604081101561090157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e6c565b34801561093057600080fd5b506104306004803603604081101561094757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611ee1565b34801561097657600080fd5b506105cf6004803603602081101561098d57600080fd5b5035611ef5565b3480156109a057600080fd5b506105cf600480360360208110156109b757600080fd5b5035611fc1565b3480156109ca57600080fd5b506105cf600480360360208110156109e157600080fd5b50351515612104565b3480156109f657600080fd5b5061043060048036036020811015610a0d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612201565b348015610a3657600080fd5b5061034e60048036036040811015610a4d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661222c565b348015610a7e57600080fd5b5061046e612264565b348015610a9357600080fd5b5061034e612280565b348015610aa857600080fd5b506105cf60048036036020811015610abf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612286565b348015610ae857600080fd5b506105cf60048036036020811015610aff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125b2565b348015610b2857600080fd5b506105cf60048036036020811015610b3f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661273c565b60125481565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505090505b90565b6000610c2a610c23612a05565b8484612a09565b5060015b92915050565b60175481565b601c5473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b601b5481565b60045490565b600c5481565b600f5481565b6000610c81848484612b50565b610d0b84610c8d612a05565b610d068560405180606001604052806028815260200161421f6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812090610cd8612a05565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205491906131fe565b612a09565b5060019392505050565b6000600554821115610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614006602a913960400191505060405180910390fd5b6000610d7c6132af565b9050610d88838261345a565b9150505b919050565b60035460ff1690565b610da2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610e2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a600502811115610e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141a46021913960400191505060405180910390fd5b600e8190556040805182815290517fc9c3eda55e0c1d7fbf155eefd9be0dcbb00e86498e4a8c8efb530e71d390b9ad9181900360200190a150565b6000610c2a610ed4612a05565b84610d068560086000610ee5612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906134a3565b600d5481565b6000600454831115610f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610fb957610fb2610fab6132af565b8490613517565b9050610c2e565b610fb2610fc46132af565b610ff5610fee600c54600a0a600201610fe8600d548961351790919063ffffffff16565b9061345a565b869061358a565b90613517565b611003612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461108c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b640ba43b740081101580156110a757506516bcc41e90008111155b6110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140c76035913960400191505060405180910390fd5b6015548111611156576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613f506042913960600191505060405180910390fd5b60148190556040805182815290517f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009181900360200190a150565b601d5473ffffffffffffffffffffffffffffffffffffffff1681565b601354610100900460ff1681565b60135460ff1681565b60115481565b6111d2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461125b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600181101580156112745750600c54600a0a600f028111155b6112c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061430c6029913960400191505060405180910390fd5b601a8190556040805182815290517f9765f75ab2b13d6c29b74cc52404cbfe9c6485274d6b86a869014f52993ac24e9181900360200190a150565b61130c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461139557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60195481565b60105481565b600e5481565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560195461143d611438612a05565b611825565b1015611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806141e66039913960400191505060405180910390fd5b6018546017540142116114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fd7602f913960400191505060405180910390fd5b42601755600c54601b54601d54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000946115b4946002909101600a0a93610fe893919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d60208110156115ac57600080fd5b505190613517565b9050806115c157506117fb565b476115cb826135cc565b5060006115d8478361358a565b90506115e381613747565b6016546000906116089073ffffffffffffffffffffffffffffffffffffffff16611825565b9050600061162d600c54600201600a0a610fe8601a548561351790919063ffffffff16565b9050600061163b838361358a565b905060006116476132af565b905061168f6116568483613517565b60066000611662612a05565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906134a3565b6006600061169b612a05565b73ffffffffffffffffffffffffffffffffffffffff9081168252602080830193909352604091820160009081209490945560165416835260069091528120556011546116e790836134a3565b6011556004546116f7908361358a565b6004556117106117078383613517565b6005549061358a565b60055561171b612a05565b60165460408051868152905173ffffffffffffffffffffffffffffffffffffffff9384169392909216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360165460408051848152905160009273ffffffffffffffffffffffffffffffffffffffff16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a36040805183815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09181900360200190a1505050505050505b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff169055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604081205460ff161561187f575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902054610d8c565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054610c2e90610d15565b6118b6612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461193f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b601a5481565b6119bc612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611a4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60198190556040805182815290517f8374a3bea33ded453e957fa7e2b11170872937507d72670d3b848ad4bd98f9e19181900360200190a150565b611a88612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b42601255601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b611b73612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611bfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b633b9aca00811015611c59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141256033913960400191505060405180910390fd5b60158190556040805182815290517f74272e6f6c75e19c6f48bb75e2724eb55e3e1726f8b81d97f1db21d22ead93dc9181900360200190a150565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60155481565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b611d3a612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60018110158015611ddc5750600c54600a0a600a028111155b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061409a602d913960400191505060405180910390fd5b601b8190556040805182815290517f5be5e13332f5fe25d72958c9d03ce5cdb01b189670222a86673715d56e43ce2a9181900360200190a150565b6000610c2a611e79612a05565b84610d06856040518060600160405280602581526020016142e76025913960086000611ea3612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d168152925290205491906131fe565b6000610c2a611eee612a05565b8484612b50565b611efd612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611f8657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60188190556040805182815290517f8b06935304277197be5d3ccc7b672a23adfc30c675f1078e336b6204843020239181900360200190a150565b611fc9612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461205257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a6005028111156120c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d616769783a207461784665652073686f756c6420626520696e2030202d2035604482015290519081900360640190fd5b600d8190556040805182815290517faa4b71ac29531fdea0ef1650c76ef91e3771dac25f4a4dd2a561ff3e0b9a5de29181900360200190a150565b61210c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461219557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6013805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205490565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b61228e612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116737a250d5630b4cf539739df2c5dacb4c659f2488d141561239a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140fc6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116301415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806142b9602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1615612488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140786022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260066020526040902054156125095773ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409020546124e290610d15565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6125ba612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461264357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140306026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612744612a05565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146127cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1661284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613fb56022913960400191505060405180910390fd5b60005b600b54811015612a01578173ffffffffffffffffffffffffffffffffffffffff16600b828154811061287c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156129f957600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128d457fe5b600091825260209091200154600b805473ffffffffffffffffffffffffffffffffffffffff909216918390811061290757fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600782526040808220829055600a9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600b80548061299c57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612a01565b60010161284e565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806142956024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140566022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612bbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142706025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613f926023913960400191505060405180910390fd5b60008111612c81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806142476029913960400191505060405180910390fd5b60135460ff1680612cc45750612c95611c94565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612d015750612cd2611c94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d31575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b80612d61575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff165b612db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141836021913960400191505060405180910390fd5b60125461016801421180612dd057506512309ce540008111155b612e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614158602b913960400191505060405180910390fd5b601354610100900460ff168015612e45575060135462010000900460ff16155b8015612e865750601d5473ffffffffffffffffffffffffffffffffffffffff16612e6d612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612ec35750737a250d5630b4cf539739df2c5dacb4c659f2488d612eaa612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612eea5750601d5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612f20575073ffffffffffffffffffffffffffffffffffffffff8316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15612f4b576000612f3030611825565b6014549091508110801590612f4857612f4882613956565b50505b806000612f566132af565b73ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205490915060ff16158015612fb5575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612fca575060135462010000900460ff16155b15612fdd57612fda858483613a52565b91505b613016612fea8483613517565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600660205260409020549061358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600660205260409020556130756130498383613517565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260066020526040902054906134a3565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600660209081526040808320949094559188168152600a909152205460ff161561310d5773ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020546130e6908461358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16156131925773ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205461316b90836134a3565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b600081848411156132a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561326c578181015183820152602001613254565b50505050905090810190601f1680156132995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60055460045460009190825b600b5481101561341a578260066000600b84815481106132d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061335657508160076000600b848154811061332257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156133745760045460055461336a9161345a565b9350505050610c13565b6133c160066000600b848154811061338857fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061358a565b925061341060076000600b84815481106133d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061358a565b91506001016132bb565b5060045460055461342a9161345a565b821015613449576004546005546134409161345a565b92505050610c13565b613453828261345a565b9250505090565b600061349c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bb8565b9392505050565b60008282018381101561349c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261352657506000610c2e565b8282028284828161353357fe5b041461349c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141c56021913960400191505060405180910390fd5b600061349c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131fe565b601d54601c54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561364e57600080fd5b505af1158015613662573d6000803e3d6000fd5b505050506040513d602081101561367857600080fd5b5050601c54604080517faf2979eb0000000000000000000000000000000000000000000000000000000081523060048201819052602482018690526000604483018190526064830181905260848301919091524260a4830152915173ffffffffffffffffffffffffffffffffffffffff9093169263af2979eb9260c480840193602093929083900390910190829087803b15801561371557600080fd5b505af1158015613729573d6000803e3d6000fd5b505050506040513d602081101561373f57600080fd5b505192915050565b6040805160028082526060820183526000926020830190803683375050601c54604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156137d257600080fd5b505afa1580156137e6573d6000803e3d6000fd5b505050506040513d60208110156137fc57600080fd5b50518151829060009061380b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061385357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c546016546040517fb6f9de95000000000000000000000000000000000000000000000000000000008152600060048201818152928616604483018190524260648401819052608060248501908152895160848601528951969098169763b6f9de95978b9794968b9694959394909360a49091019187810191028083838b5b838110156139125781810151838201526020016138fa565b50505050905001955050505050506000604051808303818588803b15801561393957600080fd5b505af115801561394d573d6000803e3d6000fd5b50505050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560155460009061399490839061358a565b905060006139a382600261345a565b905060006139b1838361358a565b9050476139bd83613c37565b60006139c9478361358a565b90506139d58382613e64565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1613a223032601554612b50565b5050601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905550505050565b600d54600090839015613ae5576000613a82600c54600201600a0a610fe8600d548861351790919063ffffffff16565b9050613a8e828261358a565b9150613a9d6117078286613517565b600555600f54613aad90826134a3565b600f556040805182815290517f6d1c76d614228b523baa4dcd9539e2c713b54ff4ab3ff2d1627e7f6cd32be4429181900360200190a1505b600e5415613bb0576000613b10600c54600201600a0a610fe8600e548861351790919063ffffffff16565b9050613b1c828261358a565b9150613b41613b2b8286613517565b30600090815260066020526040902054906134a3565b30600090815260066020526040902055601054613b5e90826134a3565b601055604080518281529051309173ffffffffffffffffffffffffffffffffffffffff8916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505b949350505050565b60008183613c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561326c578181015183820152602001613254565b506000838581613c2d57fe5b0495945050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110613c9357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b5051815182906001908110613d4857fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152601c54613d7b9130911684612a09565b601c546040517f791ac947000000000000000000000000000000000000000000000000000000008152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a4870152875173ffffffffffffffffffffffffffffffffffffffff9097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015613e27578181015183820152602001613e0f565b505050509050019650505050505050600060405180830381600087803b158015613e5057600080fd5b505af1158015613a22573d6000803e3d6000fd5b601c54613e8990309073ffffffffffffffffffffffffffffffffffffffff1684612a09565b601c54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b158015613f1e57600080fd5b505af1158015613f32573d6000803e3d6000fd5b50505050506040513d6060811015613f4957600080fd5b5050505056fe4d616769783a206d696e546f6b656e4265666f7265537761702073686f756c642062652067726561746572207468616e206175746f5377617043616c6c657246656545524332303a207472616e7366657220746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c726561647920696e636c756465644d616769783a204d6167696320646f6573206e6f742068617070656e206f6674656e2c20706c656173652077616974416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c7265616479206578636c756465644d616769783a206c697175696469747952656d6f76654665652073686f756c6420626520696e2031202d2031304d616769783a206d696e546f6b656e4265666f7265537761702073686f756c6420626520696e2035306539202d20323530303065394d616769783a20556e697377617020726f757465722063616e6e6f74206265206578636c756465642e4d616769783a206175746f5377617043616c6c65724665652073686f756c642062652067726561746572207468616e20316539596f752063616e6e6f74207472616e73666572206d6f7265207468616e20323030303020746f6b656e732e54726164696e67206973206c6f636b6564206265666f72652070726573616c652e4d616769783a206c6f636b4665652073686f756c6420626520696e2030202d2035536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d616769783a20466972737420796f75206861766520746f206f627461696e206d61676963206279206f776e696e6720313030204d4147495845524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d616769783a2054686520636f6e74726163742069742073656c662063616e6e6f74206265206578636c7564656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4d616769783a206d6167696343616c6c65724665652073686f756c6420626520696e2031202d203135a264697066735822122040901b1e96f3d70d02ba0896570d55ea7b62de348417763890759b6c7d5cd4f464736f6c63430007060033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.