ERC-20
Overview
Max Total Supply
1,000,000,000 VBlock
Holders
83
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.802776817934621341 VBlockValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VBlock
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//www.vitablock.ai //twitter: @VitaBlock // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; error ERC20_OnlyVB(); error ERC20_OnlyOwner(); error ERC20_PleaseOnboard(); error ERC20_PreEquinox(); error ERC20_PostEquinox(); error ERC20_UniswapV2PairAddress(); error ERC20_InvalidTransfer(); error ERC20_TradingNotOpen(); error ERC20_ExceedsBuyLimit(); error ERC20_ExceedsWalletLimit(); error ERC20_ExceedsSellLimit(); error ERC20_RecipientWillExceedLimit(); error ERC20_Invalid(); error ERC20_InsufficientTokens(); error ERC20_SwapInProgress(); interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } library HashGetter { function _getHash(bytes32 _lastHash, address _address) internal view returns (bytes32) { string memory _str = string.concat( Strings.toString(uint256(_lastHash)), Strings.toString(block.timestamp), Strings.toHexString(_address) ); return keccak256(abi.encodePacked(_str)); } } library AddressArrays { function _selectWinner( address[] memory _addresses, bytes32 _hash ) internal pure returns (address) { uint256 _length = _addresses.length; if (_length == 0) return address(0xdead); return _addresses[_getPseudorandomNumber(_hash, _length)]; } function _getPseudorandomNumber( bytes32 _hash, uint256 _length ) internal pure returns (uint256) { return uint256(_hash) % _length; } } contract VBlock is ERC20, Ownable { using HashGetter for bytes32; using AddressArrays for address[]; address private constant VB = address(0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B); //Vitalik Buterin's public address (Vb) uint256 private constant AUTUMN_EQUINOX_2023_TIMESTAMP = 1695427200; // Sat Sep 23 2023 00:00:00 UTC uint256 private constant MIN_HODL_BLOCKS = 400000; //must hold for four hundred thousand ethereum block confirmations (~55.5 days @ ~12 seconds per block) to be a HODLER IUniswapV2Router02 private immutable uniswapV2Router; address private immutable uniswapV2Pair; uint256 private immutable txMax; uint256 private immutable sellMax; uint256 private immutable walletMax; bool private isEthRaffleDone; bool private isVbShareFilled; bool private isTradingOpen; bool private isVbOnboard; bool private isSwapping; uint256 private buyTotalFees; uint256 private buyTrustFee; uint256 private buyRaffleFee; uint256 private sellTotalFees; uint256 private sellTrustFee; uint256 private sellRaffleFee; uint256 private trustTokens; uint256 private raffleTokens; uint256 private trustTokensTreasury; uint256 private swapTrustTokensAt; uint256 private swapRaffleTokensAt; bytes32 private lastHash; uint256 private minEligibility; address[] private contestants; address[] private hodlers; mapping(address => bool) private isExcludedFromFees; mapping(address => bool) private isExcludedFromMaxTx; mapping(address => bool) private isAMM; mapping(address => bool) private isConfirmedHodler; mapping(address => bool) private isHodling; mapping(address => bool) private isHodlEthRaffleWinner; mapping(address => uint256) private contestantsIndexes; mapping(address => uint256) private buyBlocks; mapping(address => uint256) private addressToRaffleCount; uint256 private currentRaffleCount; event Attaboy(address indexed _vb); event TransferedVbShare(address indexed _address); event SetAsAMM(address indexed _pair, bool _value); event UpdatedBuyFees(uint256 _trust, uint256 _raffle); event UpdatedSellFees(uint256 _trust, uint256 _raffle); event UpdatedSwapRaffleAt(uint256 _swapAt); event UpdatedSwapTrustAt(uint256 _swapAt); event TransferedToDeadAddress(address indexed _from, uint256 _amount); event SwappedForEth(uint256 _tokens, uint256 _eth); event TokenContestantsWinner(address indexed _winner, uint256 _tokens, uint256 _timestamp); event EthContestantsWinner(address indexed _winner, uint256 _eth); event EthHodlersWinner(address _winner, uint256 _eth); event WithdrewEth(address indexed _address, uint256 _amount, uint256 _timestamp); event AddedToContestants(address indexed _address); event AddedToHodlers(address indexed _address, uint256 _buyBlock, uint256 _blocksHodled); constructor() ERC20("VitaBlock AI", "VBlock") { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair( address(this), _uniswapV2Router.WETH() ); _setAsAMM(address(uniswapV2Pair), true); uint256 _totalSupply = 1_000_000_000 * 10 ** decimals(); //one billion uint256 _twoPercentOfTotal = _totalSupply / 50; txMax = _twoPercentOfTotal; // 2% of supply transaction limit sellMax = _totalSupply / 100; // 1% of supply sell limit walletMax = _twoPercentOfTotal; // 2% of supply max wallet size uint256 _swapAt = _totalSupply / 1000; // 0.1% of total supply swapTrustTokensAt = _swapAt; swapRaffleTokensAt = _swapAt; minEligibility = _totalSupply / 10000; // 0.01% // The 5+5=10% early fees will be used to fill VB's 2% share, after which the fees will be automatically reduced to 2+2=4% _updateBuyFees(5, 5); _updateSellFees(5, 5); isExcludedFromFees[owner()] = true; isExcludedFromFees[address(this)] = true; isExcludedFromMaxTx[owner()] = true; isExcludedFromMaxTx[address(this)] = true; isExcludedFromMaxTx[address(_uniswapV2Router)] = true; isExcludedFromMaxTx[address(uniswapV2Pair)] = true; _mint(msg.sender, _totalSupply); currentRaffleCount = 1; lastHash = lastHash._getHash(msg.sender); } receive() external payable {} /** * * @notice This function would need to be invoked by VB before AUTUMN_EQUINOX_2023_TIMESTAMP * for full access to contract's onlyOwner functions. Please read "ETHICAL PLEDGE" prior to invoking. */ function vbOnboard() external { /** * ETHICAL PLEDGE: * By executing this function, I, Vitalik Buterin, hereby proclaim my approval of this project * and pledge to ensure that the ETH and tokens collected in the treasuries of this contract will * be used only for purposes meant for the development of technologies, AI or otherwise, that will * help create a more secure crypto ecosystem. * * Furtheremore, I promise to swap the VBlock tokens collected in trustTokensTreasury in a manner that * would not jeapordise the overall health of this project. * * Where applicable, I shall ensure that privileged access will be granted to holders of VBlock tokens * to technologies/projects that receive funding through this contract. * * I understand that this is an ethical pledge between the VitaBlock community and I and, hence, not a legally binding contract. * */ if (msg.sender != VB) revert ERC20_OnlyVB(); if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP) revert ERC20_PostEquinox(); isVbOnboard = true; emit Attaboy(msg.sender); } function openTrading() external onlyOwner { isTradingOpen = true; isSwapping = false; } function updateBuyFees(uint256 _trust, uint256 _raffle) external onlyOwner { _updateBuyFees(_trust, _raffle); } function updateSellFees(uint256 _trust, uint256 _raffle) external onlyOwner { _updateSellFees(_trust, _raffle); } function getUintVars() external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256 ) { return ( swapTrustTokensAt, swapRaffleTokensAt, minEligibility, raffleTokens, trustTokens, trustTokensTreasury, buyTrustFee, buyRaffleFee, sellTrustFee, sellRaffleFee ); } function setAsAMM(address _address, bool _value) external onlyOwner { _setAsAMM(_address, _value); } function getBuyBlockAndBlocksCount(address _address) external view returns (uint256, uint256) { if (!isHodling[_address]) { return (0, 0); } return (buyBlocks[_address], block.number - buyBlocks[_address]); } function getRaffleEntrantsCounts() external view returns (uint256, uint256) { return (contestants.length, hodlers.length); } function getRaffleInfo(address _address) external view returns (uint256, bool, bool, bool) { return ( currentRaffleCount, addressToRaffleCount[_address] == currentRaffleCount, isConfirmedHodler[_address], isHodling[_address] ); } function checkBools() external view returns (bool, bool) { return (isSwapping, isVbOnboard); } function _setAsAMM(address _address, bool _value) internal { isAMM[_address] = _value; emit SetAsAMM(_address, _value); } function _updateBuyFees(uint256 _trust, uint256 _raffle) internal { if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid(); buyTrustFee = _trust; buyRaffleFee = _raffle; buyTotalFees = _trust + _raffle; emit UpdatedBuyFees(_trust, _raffle); } function _updateSellFees(uint256 _trust, uint256 _raffle) internal { if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid(); sellTrustFee = _trust; sellRaffleFee = _raffle; sellTotalFees = _trust + _raffle; emit UpdatedSellFees(_trust, _raffle); } function _transferToDeadAddress(address _from, uint256 _amount) internal { super._transfer(_from, address(0xdead), _amount); emit TransferedToDeadAddress(_from, _amount); } function _burn(address _account, uint256 _amount) internal override { if (msg.sender != owner()) revert ERC20_OnlyOwner(); if (_account == address(this)) { if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens(); super._burn(_account, _amount); trustTokensTreasury -= _amount; } } function _transfer(address _from, address _to, uint256 _amount) internal override { if (_from == address(0) || _to == address(0) || _amount == 0) revert ERC20_InvalidTransfer(); if (_from == VB && !isVbOnboard) revert ERC20_PleaseOnboard(); if (_to == address(0xdead)) { _transferToDeadAddress(_from, _amount); return; } bool _ranTrust; bool _ranRaffle; bool _isFromAMM = isAMM[_from]; bool _isToAMM = isAMM[_to]; if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP && !_isFromAMM && !isEthRaffleDone) { _removeFromContestants(_from, false); if (!isVbOnboard) { //eliminate trust fees and double raffle fees _updateBuyFees(0, 2); _updateSellFees(0, 2); } isSwapping = true; _runEthRaffle(); isSwapping = false; isEthRaffleDone = true; _ranTrust = true; _ranRaffle = true; } uint256 _initialBalanceOfTo = balanceOf(_to); uint256 _fees; uint256 _buyTotalFees; uint256 _walletMax = walletMax; bool _shouldReduceFees; uint256 _finalBalance; if (!isExcludedFromFees[_from] && !isExcludedFromFees[_to]) { if (!isTradingOpen || isSwapping) revert ERC20_TradingNotOpen(); //buy if (_isFromAMM && !isExcludedFromMaxTx[_to]) { if (_amount > txMax) revert ERC20_ExceedsBuyLimit(); _buyTotalFees = buyTotalFees; _fees = (_amount * _buyTotalFees) / 100; unchecked { _finalBalance = _initialBalanceOfTo + _amount - _fees; } if (_finalBalance > _walletMax) revert ERC20_ExceedsWalletLimit(); } //sell else if (!isExcludedFromMaxTx[_from] && _isToAMM && _amount > sellMax) revert ERC20_ExceedsSellLimit(); //transfer else if (!_isFromAMM && !_isToAMM && _amount + _initialBalanceOfTo > _walletMax) revert ERC20_RecipientWillExceedLimit(); } if ( ((trustTokens >= swapTrustTokensAt) || (raffleTokens >= swapRaffleTokensAt)) && !_isFromAMM && !isExcludedFromFees[_from] && !isExcludedFromFees[_to] && isVbShareFilled ) { _removeFromContestants(_from, false); isSwapping = true; (_ranTrust, _ranRaffle) = _swapBack(); isSwapping = false; } bool _hasFees = !isSwapping; if (isExcludedFromFees[_from] || isExcludedFromFees[_to]) _hasFees = false; //Only buys/sell fees. No fees for transfers between wallets if (_hasFees) { uint256 _trustTokens; // on sell if (_isToAMM && sellTotalFees > 0) { uint256 _sellTotalFees = sellTotalFees; unchecked { _fees = (_amount * _sellTotalFees) / 100; _trustTokens = (_fees * sellTrustFee) / _sellTotalFees; raffleTokens += _fees - _trustTokens; } } // on buy else if (_isFromAMM && _buyTotalFees > 0) { unchecked { _trustTokens = (_fees * buyTrustFee) / _buyTotalFees; raffleTokens += _fees - _trustTokens; } } if (_trustTokens > 0) { uint256 _half; unchecked { _half = _trustTokens / 2; trustTokensTreasury += _half; trustTokens += _trustTokens - _half; } } if (_fees > 0) { super._transfer(_from, address(this), _fees); if (!isVbShareFilled) { _resetTokenCounters(); if (balanceOf(address(this)) >= _walletMax) { uint256 _burnTokens = balanceOf(address(this)) - _walletMax; if (balanceOf(VB) > 0) { unchecked { _walletMax = _walletMax - balanceOf(VB); _burnTokens += balanceOf(VB); } } super._transfer(address(this), VB, _walletMax); emit TransferedVbShare(VB); _transferToDeadAddress(address(this), _burnTokens); isVbShareFilled = true; _shouldReduceFees = true; } } unchecked { _amount -= _fees; } } } super._transfer(_from, _to, _amount); //buy if (_isFromAMM && !isExcludedFromMaxTx[_to] && _amount >= minEligibility) _addToContestants(_to); //sell or transfer else if ((!isExcludedFromMaxTx[_from] && _isToAMM) || (!_isFromAMM && !_isToAMM)) _removeFromContestants(_from, true); //if transfering to contract if (_to == address(this)) { unchecked { trustTokensTreasury += _amount; } } if (_ranRaffle || _ranTrust) { uint256 _tokensInUniswap = balanceOf(address(uniswapV2Pair)); uint _swapAt = _tokensInUniswap / 1000; if (_ranRaffle) { swapRaffleTokensAt = _swapAt; minEligibility = _tokensInUniswap / 10000; emit UpdatedSwapRaffleAt(_swapAt); } if (_ranTrust) { swapTrustTokensAt = _swapAt; emit UpdatedSwapTrustAt(_swapAt); } } //reduce buy/sell fees down to 4% if (_shouldReduceFees) { _updateBuyFees(2, 2); _updateSellFees(2, 2); } } function _addToContestants(address _address) internal { if (addressToRaffleCount[_address] == currentRaffleCount) return; uint256 _length = contestants.length; contestants.push(_address); contestantsIndexes[_address] = _length; addressToRaffleCount[_address] = currentRaffleCount; emit AddedToContestants(_address); if (!isEthRaffleDone && !isHodling[_address] && !isConfirmedHodler[_address]) { isHodling[_address] = true; if (buyBlocks[_address] == 0) { buyBlocks[_address] = block.number; } } } function _removeFromContestants(address _address, bool _shouldGetHash) internal { if (_shouldGetHash) { bool _isZero; unchecked { _isZero = block.timestamp % 2 == 0; } if (_isZero) { lastHash = lastHash._getHash(msg.sender); } } if (addressToRaffleCount[_address] == currentRaffleCount) { address[] memory _contestants = contestants; address _last = _contestants[_contestants.length - 1]; uint256 _updateIndex = contestantsIndexes[_address]; contestants[_updateIndex] = _last; contestantsIndexes[_last] = _updateIndex; contestants.pop(); addressToRaffleCount[_address] = 0; } if (!isEthRaffleDone && isHodling[_address] && !isConfirmedHodler[_address]) { uint256 _blocksHodled; unchecked { _blocksHodled = block.number - buyBlocks[_address]; } if (_blocksHodled >= MIN_HODL_BLOCKS) { hodlers.push(_address); isConfirmedHodler[_address] = true; emit AddedToHodlers(_address, block.number, _blocksHodled); } isHodling[_address] = false; buyBlocks[_address] = 0; } } function _resetContestants() internal { contestants = new address[](0); unchecked { currentRaffleCount++; } } function _resetTokenCounters() internal { trustTokens = 0; raffleTokens = 0; trustTokensTreasury = 0; } function _swapForEth(uint256 _tokens) internal { address[] memory _path = new address[](2); _path[0] = address(this); _path[1] = uniswapV2Router.WETH(); uint256 _initialEth = address(this).balance; _approve(address(this), address(uniswapV2Router), _tokens); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( _tokens, 0, _path, address(this), block.timestamp ); uint256 _currentEth = address(this).balance; uint256 _ethGained; if (_currentEth > _initialEth) { unchecked { _ethGained = _currentEth - _initialEth; } } emit SwappedForEth(_tokens, _ethGained); } function _swapBack() internal returns (bool _ranTrust, bool _ranRaffle) { uint256 _burnTokens; uint256 _trustTokens = trustTokens; uint256 _raffleTokens = raffleTokens; uint256 _swapTrustTokensAt = swapTrustTokensAt; uint256 _swapRaffleTokensAt = swapRaffleTokensAt; if ( balanceOf(address(this)) == 0 || (_trustTokens < _swapTrustTokensAt && _raffleTokens < _swapRaffleTokensAt) ) return (false, false); if (_trustTokens >= _swapTrustTokensAt) { //swap for ETH treasury unchecked { _burnTokens += _trustTokens - _swapTrustTokensAt; } _swapForEth(_swapTrustTokensAt); trustTokens = 0; _ranTrust = true; } if (_raffleTokens >= _swapRaffleTokensAt) { //run raffle unchecked { _burnTokens += _raffleTokens - _swapRaffleTokensAt; } lastHash = lastHash._getHash(msg.sender); address _winner = contestants._selectWinner(lastHash); uint256 _transferAmount = _swapRaffleTokensAt; if (_winner != address(0xdead)) { uint256 _winnerBalance = balanceOf(_winner); uint256 _walletMax = walletMax; if (_winnerBalance + _transferAmount > _walletMax) { unchecked { _transferAmount = _walletMax - _winnerBalance; _burnTokens += _swapRaffleTokensAt - _transferAmount; } } super._transfer(address(this), _winner, _transferAmount); } else { unchecked { _burnTokens += _transferAmount; } } _resetContestants(); emit TokenContestantsWinner(_winner, _transferAmount, block.timestamp); raffleTokens = 0; _ranRaffle = true; } if (_burnTokens > 0) _transferToDeadAddress(address(this), _burnTokens); return (_ranTrust, _ranRaffle); } function _runEthRaffle() internal { if (address(this).balance > 0) { address[] memory _hodlers = hodlers; address[] memory _contestants = contestants; bool _success; bool _noContestants; uint256 _hodlersCount = _hodlers.length; uint256 _contestantsCount = _contestants.length; uint256 _rewardsCount = 5; uint256 _participantsCount; unchecked { _participantsCount = _hodlersCount + _contestantsCount; } uint256 _equinoxRafflePercentage = 25; // If Vitalik is onboard, 25% of contract ETH balance will be up for the raffle if (!isVbOnboard) _equinoxRafflePercentage = 100; //If Vitalik is not onboard, 100% of contract ETH balance will be up for the raffle uint256 _ethRewardTotal = (address(this).balance * _equinoxRafflePercentage) / 100; if (_participantsCount < _rewardsCount) { if (_participantsCount != 0) _rewardsCount = _participantsCount; else { _noContestants = true; if (!isVbOnboard) { //In the highly unlikely event that there are zero contestants and hodlers and isVbOnboard == false, VB will reap all the rewards. (_success, ) = payable(VB).call{value: _ethRewardTotal}(""); emit EthContestantsWinner(msg.sender, _ethRewardTotal / 2); emit EthHodlersWinner(msg.sender, _ethRewardTotal / 2); } } } if (!_noContestants) { address _winner; uint256 _ethRewardPerWinner = _ethRewardTotal / _rewardsCount; if (_contestantsCount != 0) { lastHash = lastHash._getHash(msg.sender); _winner = _contestants._selectWinner(lastHash); (_success, ) = payable(_winner).call{value: _ethRewardPerWinner}(""); emit EthContestantsWinner(_winner, _ethRewardPerWinner); unchecked { _rewardsCount--; } } if (_hodlersCount != 0) { for (uint256 _i = 1; _i <= _rewardsCount; ) { lastHash = lastHash._getHash(msg.sender); _winner = _hodlers._selectWinner(lastHash); if (!isHodlEthRaffleWinner[_winner]) { isHodlEthRaffleWinner[_winner] = true; if (_i == _rewardsCount && !isVbOnboard) _ethRewardPerWinner = address(this).balance; (_success, ) = payable(_winner).call{value: _ethRewardPerWinner}(""); emit EthHodlersWinner(_winner, _ethRewardPerWinner); unchecked { _i++; } } } } } _transferToDeadAddress( address(this), (balanceOf(address(this)) * _equinoxRafflePercentage) / 100 ); _resetContestants(); if (isVbOnboard) { trustTokensTreasury = balanceOf(address(this)); trustTokens = 0; raffleTokens = 0; } else { _resetTokenCounters(); } } } function withdrawContractEth(address _to, uint256 _eth) external onlyOwner { if (!isVbOnboard) revert ERC20_PleaseOnboard(); if (!isEthRaffleDone) revert ERC20_PreEquinox(); if (_eth == 0) _eth = address(this).balance; bool _success; (_success, ) = payable(_to).call{value: _eth}(""); emit WithdrewEth(_to, _eth, block.timestamp); } function withdrawOrBurnTreasuryTokens(address _to, uint256 _amount) external onlyOwner { if (!isVbOnboard) revert ERC20_PleaseOnboard(); if (!isEthRaffleDone) revert ERC20_PreEquinox(); if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens(); if (isSwapping) revert ERC20_SwapInProgress(); if (_amount == 0) _amount = trustTokensTreasury; if (_to == address(0xdead) || _to == address(0)) { _transferToDeadAddress(address(this), _amount); } else { super._transfer(address(this), _to, _amount); } unchecked { trustTokensTreasury -= _amount; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { 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); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20_ExceedsBuyLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsSellLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsWalletLimit","type":"error"},{"inputs":[],"name":"ERC20_InsufficientTokens","type":"error"},{"inputs":[],"name":"ERC20_Invalid","type":"error"},{"inputs":[],"name":"ERC20_InvalidTransfer","type":"error"},{"inputs":[],"name":"ERC20_OnlyVB","type":"error"},{"inputs":[],"name":"ERC20_PleaseOnboard","type":"error"},{"inputs":[],"name":"ERC20_PostEquinox","type":"error"},{"inputs":[],"name":"ERC20_PreEquinox","type":"error"},{"inputs":[],"name":"ERC20_RecipientWillExceedLimit","type":"error"},{"inputs":[],"name":"ERC20_SwapInProgress","type":"error"},{"inputs":[],"name":"ERC20_TradingNotOpen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddedToContestants","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_buyBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blocksHodled","type":"uint256"}],"name":"AddedToHodlers","type":"event"},{"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":true,"internalType":"address","name":"_vb","type":"address"}],"name":"Attaboy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthContestantsWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthHodlersWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pair","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetAsAMM","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"SwappedForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"TokenContestantsWinner","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferedToDeadAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"TransferedVbShare","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapRaffleAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapTrustAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"WithdrewEth","type":"event"},{"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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBools","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"getBuyBlockAndBlocksCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleEntrantsCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRaffleInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUintVars","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAsAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vbOnboard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"withdrawContractEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawOrBurnTreasuryTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040518060400160405280600c81526020017f56697461426c6f636b20414900000000000000000000000000000000000000008152506040518060400160405280600681526020017f56426c6f636b00000000000000000000000000000000000000000000000000008152508160039081620000909190620011bc565b508060049081620000a29190620011bc565b505050620000c5620000b96200060060201b60201c565b6200060860201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200015e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018491906200130d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021291906200130d565b6040518363ffffffff1660e01b81526004016200023192919062001350565b6020604051808303816000875af115801562000251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027791906200130d565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620002bf60a0516001620006ce60201b60201c565b6000620002d16200077960201b60201c565b600a620002df91906200150d565b633b9aca00620002f091906200155e565b90506000603282620003039190620015d8565b90508060c081815250506064826200031c9190620015d8565b60e0818152505080610100818152505060006103e8836200033e9190620015d8565b905080600f8190555080601081905550612710836200035e9190620015d8565b601281905550620003776005806200078260201b60201c565b6200038a6005806200083860201b60201c565b600160156000620003a0620008ee60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660006200045f620008ee60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016016600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005cc33846200091860201b60201c565b6001601e81905550620005f03360115462000a9060201b620011791790919060201c565b60118190555050505050620019b0565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516200076d91906200162d565b60405180910390a25050565b60006012905090565b600a81836200079291906200164a565b11806200079f5750600181105b15620007d7576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082620007f391906200164a565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff282826040516200082c92919062001696565b60405180910390a15050565b600a81836200084891906200164a565b1180620008555750600181105b156200088d576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082620008a991906200164a565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c68282604051620008e292919062001696565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009819062001724565b60405180910390fd5b6200099e6000838362000b2f60201b60201c565b8060026000828254620009b291906200164a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a0991906200164a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a70919062001746565b60405180910390a362000a8c6000838362000b3460201b60201c565b5050565b60008062000aac8460001c62000b3960201b620011ed1760201c565b62000ac24262000b3960201b620011ed1760201c565b62000ad88562000cb260201b6200134d1760201c565b60405160200162000aec93929190620017d1565b60405160208183030381529060405290508060405160200162000b10919062001808565b6040516020818303038152906040528051906020012091505092915050565b505050565b505050565b60606000820362000b82576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905062000cad565b600082905060005b6000821462000bba57808062000ba09062001821565b915050600a8262000bb29190620015d8565b915062000b8a565b60008167ffffffffffffffff81111562000bd95762000bd862000f4d565b5b6040519080825280601f01601f19166020018201604052801562000c0c5781602001600182028036833780820191505090505b5090505b6000851462000ca65760018262000c2891906200186e565b9150600a8562000c399190620018a9565b603062000c4791906200164a565b60f81b81838151811062000c605762000c5f620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8562000c9e9190620015d8565b945062000c10565b8093505050505b919050565b606062000ce08273ffffffffffffffffffffffffffffffffffffffff16601460ff1662000ce760201b60201c565b9050919050565b60606000600283600262000cfc91906200155e565b62000d0891906200164a565b67ffffffffffffffff81111562000d245762000d2362000f4d565b5b6040519080825280601f01601f19166020018201604052801562000d575781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000d925762000d91620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000df95762000df8620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600262000e3b91906200155e565b62000e4791906200164a565b90505b600181111562000ef1577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062000e8d5762000e8c620018e1565b5b1a60f81b82828151811062000ea75762000ea6620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508062000ee99062001910565b905062000e4a565b506000841462000f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f2f906200198e565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000fc457607f821691505b60208210810362000fda5762000fd962000f7c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620010447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001005565b62001050868362001005565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200109d62001097620010918462001068565b62001072565b62001068565b9050919050565b6000819050919050565b620010b9836200107c565b620010d1620010c882620010a4565b84845462001012565b825550505050565b600090565b620010e8620010d9565b620010f5818484620010ae565b505050565b5b818110156200111d5762001111600082620010de565b600181019050620010fb565b5050565b601f8211156200116c57620011368162000fe0565b620011418462000ff5565b8101602085101562001151578190505b62001169620011608562000ff5565b830182620010fa565b50505b505050565b600082821c905092915050565b6000620011916000198460080262001171565b1980831691505092915050565b6000620011ac83836200117e565b9150826002028217905092915050565b620011c78262000f42565b67ffffffffffffffff811115620011e357620011e262000f4d565b5b620011ef825462000fab565b620011fc82828562001121565b600060209050601f8311600181146200123457600084156200121f578287015190505b6200122b85826200119e565b8655506200129b565b601f198416620012448662000fe0565b60005b828110156200126e5784890151825560018201915060208501945060208101905062001247565b868310156200128e57848901516200128a601f8916826200117e565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012d582620012a8565b9050919050565b620012e781620012c8565b8114620012f357600080fd5b50565b6000815190506200130781620012dc565b92915050565b600060208284031215620013265762001325620012a3565b5b60006200133684828501620012f6565b91505092915050565b6200134a81620012c8565b82525050565b60006040820190506200136760008301856200133f565b6200137660208301846200133f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200140b57808604811115620013e357620013e26200137d565b5b6001851615620013f35780820291505b80810290506200140385620013ac565b9450620013c3565b94509492505050565b600082620014265760019050620014f9565b81620014365760009050620014f9565b81600181146200144f57600281146200145a5762001490565b6001915050620014f9565b60ff8411156200146f576200146e6200137d565b5b8360020a9150848211156200148957620014886200137d565b5b50620014f9565b5060208310610133831016604e8410600b8410161715620014ca5782820a905083811115620014c457620014c36200137d565b5b620014f9565b620014d98484846001620013b9565b92509050818404811115620014f357620014f26200137d565b5b81810290505b9392505050565b600060ff82169050919050565b60006200151a8262001068565b9150620015278362001500565b9250620015567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001414565b905092915050565b60006200156b8262001068565b9150620015788362001068565b9250828202620015888162001068565b91508282048414831517620015a257620015a16200137d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620015e58262001068565b9150620015f28362001068565b925082620016055762001604620015a9565b5b828204905092915050565b60008115159050919050565b620016278162001610565b82525050565b60006020820190506200164460008301846200161c565b92915050565b6000620016578262001068565b9150620016648362001068565b92508282019050808211156200167f576200167e6200137d565b5b92915050565b620016908162001068565b82525050565b6000604082019050620016ad600083018562001685565b620016bc602083018462001685565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200170c601f83620016c3565b91506200171982620016d4565b602082019050919050565b600060208201905081810360008301526200173f81620016fd565b9050919050565b60006020820190506200175d600083018462001685565b92915050565b600081905092915050565b60005b838110156200178e57808201518184015260208101905062001771565b60008484015250505050565b6000620017a78262000f42565b620017b3818562001763565b9350620017c58185602086016200176e565b80840191505092915050565b6000620017df82866200179a565b9150620017ed82856200179a565b9150620017fb82846200179a565b9150819050949350505050565b60006200181682846200179a565b915081905092915050565b60006200182e8262001068565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200186357620018626200137d565b5b600182019050919050565b60006200187b8262001068565b9150620018888362001068565b9250828203905081811115620018a357620018a26200137d565b5b92915050565b6000620018b68262001068565b9150620018c38362001068565b925082620018d657620018d5620015a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200191d8262001068565b9150600082036200193357620019326200137d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062001976602083620016c3565b915062001983826200193e565b602082019050919050565b60006020820190508181036000830152620019a98162001967565b9050919050565b60805160a05160c05160e0516101005161506e62001a0a60003960008181611a05015261387101526000611cac01526000611b8f01526000612305015260008181613dfd01528181613ee30152613f0a015261506e6000f3fe6080604052600436106101855760003560e01c806382c2d179116100d1578063c9567bf91161008a578063e61ff9f111610064578063e61ff9f1146105b1578063f2fde38b146105dd578063fc2ab0dc14610606578063ff287be11461062f5761018c565b8063c9567bf914610531578063cf45fbe014610548578063dd62ed3e146105745761018c565b806382c2d179146103ef5780638da5cb5b1461042357806395d89b411461044e578063a3331b0414610479578063a457c2d7146104b7578063a9059cbb146104f45761018c565b8063395093511161013e57806370a082311161011857806370a0823114610344578063715018a614610381578063715efe1e14610398578063792f1e3c146103af5761018c565b806339509351146102b55780633dbc40fe146102f257806366ca9b831461031b5761018c565b806302dbd8f81461019157806306fdde03146101ba578063095ea7b3146101e557806318160ddd1461022257806323b872dd1461024d578063313ce5671461028a5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b391906140ec565b610658565b005b3480156101c657600080fd5b506101cf61066e565b6040516101dc91906141bc565b60405180910390f35b3480156101f157600080fd5b5061020c6004803603810190610207919061423c565b610700565b6040516102199190614297565b60405180910390f35b34801561022e57600080fd5b50610237610723565b60405161024491906142c1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906142dc565b61072d565b6040516102819190614297565b60405180910390f35b34801561029657600080fd5b5061029f61075c565b6040516102ac919061434b565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061423c565b610765565b6040516102e99190614297565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614392565b61079c565b005b34801561032757600080fd5b50610342600480360381019061033d91906140ec565b6107b2565b005b34801561035057600080fd5b5061036b600480360381019061036691906143d2565b6107c8565b60405161037891906142c1565b60405180910390f35b34801561038d57600080fd5b50610396610810565b005b3480156103a457600080fd5b506103ad610824565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906143d2565b61093b565b6040516103e694939291906143ff565b60405180910390f35b3480156103fb57600080fd5b50610404610a31565b60405161041a9a99989796959493929190614444565b60405180910390f35b34801561042f57600080fd5b50610438610a7e565b60405161044591906144ef565b60405180910390f35b34801561045a57600080fd5b50610463610aa8565b60405161047091906141bc565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906143d2565b610b3a565b6040516104ae92919061450a565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061423c565b610c2f565b6040516104eb9190614297565b60405180910390f35b34801561050057600080fd5b5061051b6004803603810190610516919061423c565b610ca6565b6040516105289190614297565b60405180910390f35b34801561053d57600080fd5b50610546610cc9565b005b34801561055457600080fd5b5061055d610d09565b60405161056b92919061450a565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614533565b610d20565b6040516105a891906142c1565b60405180910390f35b3480156105bd57600080fd5b506105c6610da7565b6040516105d4929190614573565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906143d2565b610dd2565b005b34801561061257600080fd5b5061062d6004803603810190610628919061423c565b610e55565b005b34801561063b57600080fd5b506106566004803603810190610651919061423c565b610fb8565b005b61066061137a565b61066a82826113f8565b5050565b60606003805461067d906145cb565b80601f01602080910402602001604051908101604052809291908181526020018280546106a9906145cb565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b5050505050905090565b60008061070b6114a6565b90506107188185856114ae565b600191505092915050565b6000600254905090565b6000806107386114a6565b9050610745858285611677565b610750858585611703565b60019150509392505050565b60006012905090565b6000806107706114a6565b90506107918185856107828589610d20565b61078c919061462b565b6114ae565b600191505092915050565b6107a461137a565b6107ae828261240c565b5050565b6107ba61137a565b6107c482826124b5565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61081861137a565b6108226000612563565b565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461089d576040517fcd2c267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63650e2a804211156108db576040517f134cce3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600560176101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fd64a705952230327eefca8ce14138f52c6ee581f30d6b4e3b1f3726b82e9f47060405160405180910390a2565b600080600080601e54601e54601d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1693509350935093509193509193565b600080600080600080600080600080600f54601054601254600d54600c54600e54600754600854600a54600b54995099509950995099509950995099509950995090919293949596979899565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ab7906145cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae3906145cb565b8015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b5050505050905090565b600080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b9a5760008091509150610c2a565b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205443610c25919061465f565b915091505b915091565b600080610c3a6114a6565b90506000610c488286610d20565b905083811015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490614705565b60405180910390fd5b610c9a82868684036114ae565b60019250505092915050565b600080610cb16114a6565b9050610cbe818585611703565b600191505092915050565b610cd161137a565b6001600560166101000a81548160ff0219169083151502179055506000600560186101000a81548160ff021916908315150217905550565b600080601380549050601480549050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600560189054906101000a900460ff16600560179054906101000a900460ff16915091509091565b610dda61137a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614797565b60405180910390fd5b610e5281612563565b50565b610e5d61137a565b600560179054906101000a900460ff16610ea3576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff16610ee9576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008103610ef5574790505b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610f1b906147e8565b60006040518083038185875af1925050503d8060008114610f58576040519150601f19603f3d011682016040523d82523d6000602084013e610f5d565b606091505b5050809150508273ffffffffffffffffffffffffffffffffffffffff167f0a4cb027e693fb13f4c43cc4bf82b4cd2cc38c1cca60d0180e3de60e1113717b8342604051610fab92919061450a565b60405180910390a2505050565b610fc061137a565b600560179054906101000a900460ff16611006576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff1661104c576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611088576040517f190e059100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560189054906101000a900460ff16156110cf576040517fbb941a1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081036110dd57600e5490505b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806111455750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611159576111543082612629565b611165565b611164308383612688565b5b80600e600082825403925050819055505050565b6000806111888460001c6111ed565b611191426111ed565b61119a8561134d565b6040516020016111ac93929190614839565b6040516020818303038152906040529050806040516020016111ce919061486a565b6040516020818303038152906040528051906020012091505092915050565b606060008203611234576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611348565b600082905060005b6000821461126657808061124f90614881565b915050600a8261125f91906148f8565b915061123c565b60008167ffffffffffffffff81111561128257611281614929565b5b6040519080825280601f01601f1916602001820160405280156112b45781602001600182028036833780820191505090505b5090505b60008514611341576001826112cd919061465f565b9150600a856112dc9190614958565b60306112e8919061462b565b60f81b8183815181106112fe576112fd614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561133a91906148f8565b94506112b8565b8093505050505b919050565b60606113738273ffffffffffffffffffffffffffffffffffffffff16601460ff16612907565b9050919050565b6113826114a6565b73ffffffffffffffffffffffffffffffffffffffff166113a0610a7e565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90614a04565b60405180910390fd5b565b600a8183611406919061462b565b11806114125750600181105b15611449576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082611463919061462b565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c6828260405161149a92919061450a565b60405180910390a15050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614b28565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161166a91906142c1565b60405180910390a3505050565b60006116838484610d20565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116fd57818110156116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690614b94565b60405180910390fd5b6116fc84848484036114ae565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061176a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806117755750600081145b156117ac576040517f4c7d442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156118085750600560179054906101000a900460ff16155b1561183f576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118835761187e8382612629565b612407565b6000806000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905063650e2a8042118015611939575081155b80156119525750600560149054906101000a900460ff16155b156119f157611962876000612b43565b600560179054906101000a900460ff1661198f57611982600060026124b5565b61198e600060026113f8565b5b6001600560186101000a81548160ff0219169083151502179055506119b26130b9565b6000600560186101000a81548160ff0219169083151502179055506001600560146101000a81548160ff02191690831515021790555060019350600192505b60006119fc876107c8565b905060008060007f00000000000000000000000000000000000000000000000000000000000000009050600080601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611acd5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d6057600560169054906101000a900460ff161580611afa5750600560189054906101000a900460ff165b15611b31576040517f850336b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878015611b885750601660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c4c577f00000000000000000000000000000000000000000000000000000000000000008b1115611be7576040517f71caed7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065493506064848c611bfa9190614bb4565b611c0491906148f8565b9450848b870103905082811115611c47576040517f9acd091700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d5f565b601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ca35750865b8015611cce57507f00000000000000000000000000000000000000000000000000000000000000008b115b15611d05576040517f43190ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87158015611d11575086155b8015611d27575082868c611d25919061462b565b115b15611d5e576040517f74052fc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b600f54600c54101580611d775750601054600d5410155b8015611d81575087155b8015611dd75750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e2d5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e455750600560159054906101000a900460ff165b15611e9c57611e558d6000612b43565b6001600560186101000a81548160ff021916908315150217905550611e786136e3565b809a50819b5050506000600560186101000a81548160ff0219169083151502179055505b6000600560189054906101000a900460ff16159050601560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f525750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5c57600090505b80156121ad576000888015611f7357506000600954115b15611fc457600060095490506064818f0281611f9257611f916148c9565b5b04975080600a54890281611fa957611fa86148c9565b5b049150818803600d6000828254019250508190555050612001565b898015611fd15750600086115b156120005785600754880281611fea57611fe96148c9565b5b049050808703600d600082825401925050819055505b5b60008111156120445760006002828161201d5761201c6148c9565b5b04905080600e60008282540192505081905550808203600c60008282540192505081905550505b60008711156121ab576120588f3089612688565b600560159054906101000a900460ff166121a55761207461394f565b8461207e306107c8565b106121a45760008561208f306107c8565b612099919061465f565b905060006120ba73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b1115612103576120dd73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b860395506120fe73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b810190505b6121223073ab5801a7d398351b8be11c439e05c5b3259aec9b88612688565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff167fbd930dfdee75cecc873288bcf7176fea15ad28535d3285813018822193a2baa060405160405180910390a26121833082612629565b6001600560156101000a81548160ff02191690831515021790555060019450505b5b868d039c505b505b6121b88e8e8e612688565b88801561220f5750601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561221d57506012548c10155b156122305761222b8d613969565b6122ac565b601660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122875750875b8061229a575088158015612299575087155b5b156122ab576122aa8e6001612b43565b5b5b3073ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16036122f0578b600e600082825401925050819055505b89806122f957508a5b156123de5760006123297f00000000000000000000000000000000000000000000000000000000000000006107c8565b905060006103e88261233b91906148f8565b90508b1561239657806010819055506127108261235891906148f8565b6012819055507f14ac008fba1637f469366af4d14cf89db3a663c422612977c3f50bc4f3b491a18160405161238d91906142c1565b60405180910390a15b8c156123db5780600f819055507f2f7c7becc8a060dce66180a39d01d0ffebf04de28aba59ecea90ad84692bf234816040516123d291906142c1565b60405180910390a15b50505b82156123fb576123ef6002806124b5565b6123fa6002806113f8565b5b50505050505050505050505b505050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516124a99190614297565b60405180910390a25050565b600a81836124c3919061462b565b11806124cf5750600181105b15612506576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082612520919061462b565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff2828260405161255792919061450a565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126368261dead83612688565b8173ffffffffffffffffffffffffffffffffffffffff167f72ee4eacc5e161ffbdcaeba5dd5e8d6d27ae46f9dddf2997a4e91935a6518b7b8260405161267c91906142c1565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614cfa565b60405180910390fd5b612771838383613c98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614d8c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a919061462b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128ee91906142c1565b60405180910390a3612901848484613c9d565b50505050565b60606000600283600261291a9190614bb4565b612924919061462b565b67ffffffffffffffff81111561293d5761293c614929565b5b6040519080825280601f01601f19166020018201604052801561296f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129a7576129a6614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a0b57612a0a614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a4b9190614bb4565b612a55919061462b565b90505b6001811115612af5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a9757612a96614989565b5b1a60f81b828281518110612aae57612aad614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612aee90614dac565b9050612a58565b5060008414612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3090614e21565b60405180910390fd5b8091505092915050565b8015612b855760008060024281612b5d57612b5c6148c9565b5b061490508015612b8357612b7c3360115461117990919063ffffffff16565b6011819055505b505b601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612df95760006013805480602002602001604051908101604052809291908181526020018280548015612c5157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c07575b5050505050905060008160018351612c69919061465f565b81518110612c7a57612c79614989565b5b602002602001015190506000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508160138281548110612cdd57612cdc614989565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506013805480612d7b57612d7a614e41565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b600560149054906101000a900460ff16158015612e5f5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612eb55750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b5576000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544303905062061a808110613016576014839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa166ab0d399fb2afd24c2174e0ec2e8eb37a2687ac4e9546097ae6d2892edba8438360405161300d92919061450a565b60405180910390a25b6000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5050565b60004711156136e1576000601480548060200260200160405190810160405280929190818152602001828054801561314657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130fc575b50505050509050600060138054806020026020016040519081016040528092919081815260200182805480156131d157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613187575b5050505050905060008060008451905060008451905060006005905060008284019050600060199050600560179054906101000a900460ff1661321357606490505b6000606482476132239190614bb4565b61322d91906148f8565b905083831015613381576000831461324757829350613380565b60019650600560179054906101000a900460ff1661337f5773ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff1681604051613297906147e8565b60006040518083038185875af1925050503d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5050809850503373ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f60028361332491906148f8565b60405161333191906142c1565b60405180910390a27fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d3360028361336891906148f8565b604051613376929190614e70565b60405180910390a15b5b5b8661366357600080858361339591906148f8565b905060008714613495576133b43360115461117990919063ffffffff16565b6011819055506133cf6011548c613ca290919063ffffffff16565b91508173ffffffffffffffffffffffffffffffffffffffff16816040516133f5906147e8565b60006040518083038185875af1925050503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b5050809a50508173ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f8260405161348391906142c1565b60405180910390a28580600190039650505b60008814613660576000600190505b86811161365e576134c03360115461117990919063ffffffff16565b6011819055506134db6011548e613ca290919063ffffffff16565b9250601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613659576001601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086811480156135a25750600560179054906101000a900460ff16155b156135ab574791505b8273ffffffffffffffffffffffffffffffffffffffff16826040516135cf906147e8565b60006040518083038185875af1925050503d806000811461360c576040519150601f19603f3d011682016040523d82523d6000602084013e613611565b606091505b5050809b50507fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d8383604051613648929190614e70565b60405180910390a180806001019150505b6134a4565b505b50505b61368c30606484613673306107c8565b61367d9190614bb4565b61368791906148f8565b612629565b613694613cea565b600560179054906101000a900460ff16156136cd576136b2306107c8565b600e819055506000600c819055506000600d819055506136d6565b6136d561394f565b5b505050505050505050505b565b600080600080600c5490506000600d5490506000600f54905060006010549050600061370e306107c8565b14806137245750818410801561372357508083105b5b1561373a5760008096509650505050505061394b565b81841061375e578184038501945061375182613d5e565b6000600c81905550600196505b80831061393157808303850194506137813360115461117990919063ffffffff16565b6011819055506000613824601154601380548060200260200160405190810160405280929190818152602001828054801561381157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116137c7575b5050505050613ca290919063ffffffff16565b9050600082905061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138c457600061386b836107c8565b905060007f0000000000000000000000000000000000000000000000000000000000000000905080838361389f919061462b565b11156138b2578181039250828503890198505b6138bd308585612688565b50506138ca565b80870196505b6138d2613cea565b8173ffffffffffffffffffffffffffffffffffffffff167ff39ca55b233425232beaa10cf8eab4bb36b0cfc1681dab52a121786f06f47d12824260405161391a92919061450a565b60405180910390a26000600d819055506001975050505b6000851115613945576139443086612629565b5b50505050505b9091565b6000600c819055506000600d819055506000600e81905550565b601e54601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540315613c9557600060138054905090506013829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f199b6f101a1a99898ef5c07ebd4bbcd9b068c09176b624ec06f0b1d0a3acf20f60405160405180910390a2600560149054906101000a900460ff16158015613b535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015613ba95750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613c93576001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403613c925743601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b505b50565b505050565b505050565b6000808351905060008103613cbc5761dead915050613ce4565b83613cc78483613ff1565b81518110613cd857613cd7614989565b5b60200260200101519150505b92915050565b600067ffffffffffffffff811115613d0557613d04614929565b5b604051908082528060200260200182016040528015613d335781602001602082028036833780820191505090505b5060139080519060200190613d4992919061400a565b50601e60008154809291906001019190505550565b6000600267ffffffffffffffff811115613d7b57613d7a614929565b5b604051908082528060200260200182016040528015613da95781602001602082028036833780820191505090505b5090503081600081518110613dc157613dc0614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614eae565b81600181518110613e9e57613e9d614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050613f08307f0000000000000000000000000000000000000000000000000000000000000000856114ae565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613f6a959493929190614fde565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506000479050600082821115613fb15782820390505b7fe845924c07c89c17ac04375b80b3ffdf7507a0d469f31b68a9a63b3abbb05e948582604051613fe292919061450a565b60405180910390a15050505050565b6000818360001c6140029190614958565b905092915050565b828054828255906000526020600020908101928215614083579160200282015b828111156140825782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061402a565b5b5090506140909190614094565b5090565b5b808211156140ad576000816000905550600101614095565b5090565b600080fd5b6000819050919050565b6140c9816140b6565b81146140d457600080fd5b50565b6000813590506140e6816140c0565b92915050565b60008060408385031215614103576141026140b1565b5b6000614111858286016140d7565b9250506020614122858286016140d7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561416657808201518184015260208101905061414b565b60008484015250505050565b6000601f19601f8301169050919050565b600061418e8261412c565b6141988185614137565b93506141a8818560208601614148565b6141b181614172565b840191505092915050565b600060208201905081810360008301526141d68184614183565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614209826141de565b9050919050565b614219816141fe565b811461422457600080fd5b50565b60008135905061423681614210565b92915050565b60008060408385031215614253576142526140b1565b5b600061426185828601614227565b9250506020614272858286016140d7565b9150509250929050565b60008115159050919050565b6142918161427c565b82525050565b60006020820190506142ac6000830184614288565b92915050565b6142bb816140b6565b82525050565b60006020820190506142d660008301846142b2565b92915050565b6000806000606084860312156142f5576142f46140b1565b5b600061430386828701614227565b935050602061431486828701614227565b9250506040614325868287016140d7565b9150509250925092565b600060ff82169050919050565b6143458161432f565b82525050565b6000602082019050614360600083018461433c565b92915050565b61436f8161427c565b811461437a57600080fd5b50565b60008135905061438c81614366565b92915050565b600080604083850312156143a9576143a86140b1565b5b60006143b785828601614227565b92505060206143c88582860161437d565b9150509250929050565b6000602082840312156143e8576143e76140b1565b5b60006143f684828501614227565b91505092915050565b600060808201905061441460008301876142b2565b6144216020830186614288565b61442e6040830185614288565b61443b6060830184614288565b95945050505050565b60006101408201905061445a600083018d6142b2565b614467602083018c6142b2565b614474604083018b6142b2565b614481606083018a6142b2565b61448e60808301896142b2565b61449b60a08301886142b2565b6144a860c08301876142b2565b6144b560e08301866142b2565b6144c36101008301856142b2565b6144d16101208301846142b2565b9b9a5050505050505050505050565b6144e9816141fe565b82525050565b600060208201905061450460008301846144e0565b92915050565b600060408201905061451f60008301856142b2565b61452c60208301846142b2565b9392505050565b6000806040838503121561454a576145496140b1565b5b600061455885828601614227565b925050602061456985828601614227565b9150509250929050565b60006040820190506145886000830185614288565b6145956020830184614288565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145e357607f821691505b6020821081036145f6576145f561459c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614636826140b6565b9150614641836140b6565b9250828201905080821115614659576146586145fc565b5b92915050565b600061466a826140b6565b9150614675836140b6565b925082820390508181111561468d5761468c6145fc565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006146ef602583614137565b91506146fa82614693565b604082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614781602683614137565b915061478c82614725565b604082019050919050565b600060208201905081810360008301526147b081614774565b9050919050565b600081905092915050565b50565b60006147d26000836147b7565b91506147dd826147c2565b600082019050919050565b60006147f3826147c5565b9150819050919050565b600081905092915050565b60006148138261412c565b61481d81856147fd565b935061482d818560208601614148565b80840191505092915050565b60006148458286614808565b91506148518285614808565b915061485d8284614808565b9150819050949350505050565b60006148768284614808565b915081905092915050565b600061488c826140b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148be576148bd6145fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614903826140b6565b915061490e836140b6565b92508261491e5761491d6148c9565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614963826140b6565b915061496e836140b6565b92508261497e5761497d6148c9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ee602083614137565b91506149f9826149b8565b602082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483614137565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602283614137565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614b7e601d83614137565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000614bbf826140b6565b9150614bca836140b6565b9250828202614bd8816140b6565b91508282048414831517614bef57614bee6145fc565b5b5092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c52602583614137565b9150614c5d82614bf6565b604082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce4602383614137565b9150614cef82614c88565b604082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d76602683614137565b9150614d8182614d1a565b604082019050919050565b60006020820190508181036000830152614da581614d69565b9050919050565b6000614db7826140b6565b915060008203614dca57614dc96145fc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614e0b602083614137565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000604082019050614e8560008301856144e0565b614e9260208301846142b2565b9392505050565b600081519050614ea881614210565b92915050565b600060208284031215614ec457614ec36140b1565b5b6000614ed284828501614e99565b91505092915050565b6000819050919050565b6000819050919050565b6000614f0a614f05614f0084614edb565b614ee5565b6140b6565b9050919050565b614f1a81614eef565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f55816141fe565b82525050565b6000614f678383614f4c565b60208301905092915050565b6000602082019050919050565b6000614f8b82614f20565b614f958185614f2b565b9350614fa083614f3c565b8060005b83811015614fd1578151614fb88882614f5b565b9750614fc383614f73565b925050600181019050614fa4565b5085935050505092915050565b600060a082019050614ff360008301886142b2565b6150006020830187614f11565b81810360408301526150128186614f80565b905061502160608301856144e0565b61502e60808301846142b2565b969550505050505056fea2646970667358221220d2705d9525aa1c1842aee8b28d086d1d2654fb3ab3e98e6a1b5651865b22a7c364736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101855760003560e01c806382c2d179116100d1578063c9567bf91161008a578063e61ff9f111610064578063e61ff9f1146105b1578063f2fde38b146105dd578063fc2ab0dc14610606578063ff287be11461062f5761018c565b8063c9567bf914610531578063cf45fbe014610548578063dd62ed3e146105745761018c565b806382c2d179146103ef5780638da5cb5b1461042357806395d89b411461044e578063a3331b0414610479578063a457c2d7146104b7578063a9059cbb146104f45761018c565b8063395093511161013e57806370a082311161011857806370a0823114610344578063715018a614610381578063715efe1e14610398578063792f1e3c146103af5761018c565b806339509351146102b55780633dbc40fe146102f257806366ca9b831461031b5761018c565b806302dbd8f81461019157806306fdde03146101ba578063095ea7b3146101e557806318160ddd1461022257806323b872dd1461024d578063313ce5671461028a5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b391906140ec565b610658565b005b3480156101c657600080fd5b506101cf61066e565b6040516101dc91906141bc565b60405180910390f35b3480156101f157600080fd5b5061020c6004803603810190610207919061423c565b610700565b6040516102199190614297565b60405180910390f35b34801561022e57600080fd5b50610237610723565b60405161024491906142c1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906142dc565b61072d565b6040516102819190614297565b60405180910390f35b34801561029657600080fd5b5061029f61075c565b6040516102ac919061434b565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061423c565b610765565b6040516102e99190614297565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614392565b61079c565b005b34801561032757600080fd5b50610342600480360381019061033d91906140ec565b6107b2565b005b34801561035057600080fd5b5061036b600480360381019061036691906143d2565b6107c8565b60405161037891906142c1565b60405180910390f35b34801561038d57600080fd5b50610396610810565b005b3480156103a457600080fd5b506103ad610824565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906143d2565b61093b565b6040516103e694939291906143ff565b60405180910390f35b3480156103fb57600080fd5b50610404610a31565b60405161041a9a99989796959493929190614444565b60405180910390f35b34801561042f57600080fd5b50610438610a7e565b60405161044591906144ef565b60405180910390f35b34801561045a57600080fd5b50610463610aa8565b60405161047091906141bc565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906143d2565b610b3a565b6040516104ae92919061450a565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061423c565b610c2f565b6040516104eb9190614297565b60405180910390f35b34801561050057600080fd5b5061051b6004803603810190610516919061423c565b610ca6565b6040516105289190614297565b60405180910390f35b34801561053d57600080fd5b50610546610cc9565b005b34801561055457600080fd5b5061055d610d09565b60405161056b92919061450a565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614533565b610d20565b6040516105a891906142c1565b60405180910390f35b3480156105bd57600080fd5b506105c6610da7565b6040516105d4929190614573565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906143d2565b610dd2565b005b34801561061257600080fd5b5061062d6004803603810190610628919061423c565b610e55565b005b34801561063b57600080fd5b506106566004803603810190610651919061423c565b610fb8565b005b61066061137a565b61066a82826113f8565b5050565b60606003805461067d906145cb565b80601f01602080910402602001604051908101604052809291908181526020018280546106a9906145cb565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b5050505050905090565b60008061070b6114a6565b90506107188185856114ae565b600191505092915050565b6000600254905090565b6000806107386114a6565b9050610745858285611677565b610750858585611703565b60019150509392505050565b60006012905090565b6000806107706114a6565b90506107918185856107828589610d20565b61078c919061462b565b6114ae565b600191505092915050565b6107a461137a565b6107ae828261240c565b5050565b6107ba61137a565b6107c482826124b5565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61081861137a565b6108226000612563565b565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461089d576040517fcd2c267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63650e2a804211156108db576040517f134cce3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600560176101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fd64a705952230327eefca8ce14138f52c6ee581f30d6b4e3b1f3726b82e9f47060405160405180910390a2565b600080600080601e54601e54601d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1693509350935093509193509193565b600080600080600080600080600080600f54601054601254600d54600c54600e54600754600854600a54600b54995099509950995099509950995099509950995090919293949596979899565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ab7906145cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae3906145cb565b8015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b5050505050905090565b600080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b9a5760008091509150610c2a565b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205443610c25919061465f565b915091505b915091565b600080610c3a6114a6565b90506000610c488286610d20565b905083811015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490614705565b60405180910390fd5b610c9a82868684036114ae565b60019250505092915050565b600080610cb16114a6565b9050610cbe818585611703565b600191505092915050565b610cd161137a565b6001600560166101000a81548160ff0219169083151502179055506000600560186101000a81548160ff021916908315150217905550565b600080601380549050601480549050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600560189054906101000a900460ff16600560179054906101000a900460ff16915091509091565b610dda61137a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614797565b60405180910390fd5b610e5281612563565b50565b610e5d61137a565b600560179054906101000a900460ff16610ea3576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff16610ee9576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008103610ef5574790505b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610f1b906147e8565b60006040518083038185875af1925050503d8060008114610f58576040519150601f19603f3d011682016040523d82523d6000602084013e610f5d565b606091505b5050809150508273ffffffffffffffffffffffffffffffffffffffff167f0a4cb027e693fb13f4c43cc4bf82b4cd2cc38c1cca60d0180e3de60e1113717b8342604051610fab92919061450a565b60405180910390a2505050565b610fc061137a565b600560179054906101000a900460ff16611006576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff1661104c576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611088576040517f190e059100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560189054906101000a900460ff16156110cf576040517fbb941a1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081036110dd57600e5490505b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806111455750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611159576111543082612629565b611165565b611164308383612688565b5b80600e600082825403925050819055505050565b6000806111888460001c6111ed565b611191426111ed565b61119a8561134d565b6040516020016111ac93929190614839565b6040516020818303038152906040529050806040516020016111ce919061486a565b6040516020818303038152906040528051906020012091505092915050565b606060008203611234576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611348565b600082905060005b6000821461126657808061124f90614881565b915050600a8261125f91906148f8565b915061123c565b60008167ffffffffffffffff81111561128257611281614929565b5b6040519080825280601f01601f1916602001820160405280156112b45781602001600182028036833780820191505090505b5090505b60008514611341576001826112cd919061465f565b9150600a856112dc9190614958565b60306112e8919061462b565b60f81b8183815181106112fe576112fd614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561133a91906148f8565b94506112b8565b8093505050505b919050565b60606113738273ffffffffffffffffffffffffffffffffffffffff16601460ff16612907565b9050919050565b6113826114a6565b73ffffffffffffffffffffffffffffffffffffffff166113a0610a7e565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90614a04565b60405180910390fd5b565b600a8183611406919061462b565b11806114125750600181105b15611449576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082611463919061462b565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c6828260405161149a92919061450a565b60405180910390a15050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614b28565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161166a91906142c1565b60405180910390a3505050565b60006116838484610d20565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116fd57818110156116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690614b94565b60405180910390fd5b6116fc84848484036114ae565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061176a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806117755750600081145b156117ac576040517f4c7d442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156118085750600560179054906101000a900460ff16155b1561183f576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118835761187e8382612629565b612407565b6000806000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905063650e2a8042118015611939575081155b80156119525750600560149054906101000a900460ff16155b156119f157611962876000612b43565b600560179054906101000a900460ff1661198f57611982600060026124b5565b61198e600060026113f8565b5b6001600560186101000a81548160ff0219169083151502179055506119b26130b9565b6000600560186101000a81548160ff0219169083151502179055506001600560146101000a81548160ff02191690831515021790555060019350600192505b60006119fc876107c8565b905060008060007f000000000000000000000000000000000000000000108b2a2c280290940000009050600080601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611acd5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d6057600560169054906101000a900460ff161580611afa5750600560189054906101000a900460ff165b15611b31576040517f850336b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878015611b885750601660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c4c577f000000000000000000000000000000000000000000108b2a2c280290940000008b1115611be7576040517f71caed7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065493506064848c611bfa9190614bb4565b611c0491906148f8565b9450848b870103905082811115611c47576040517f9acd091700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d5f565b601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ca35750865b8015611cce57507f000000000000000000000000000000000000000000084595161401484a0000008b115b15611d05576040517f43190ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87158015611d11575086155b8015611d27575082868c611d25919061462b565b115b15611d5e576040517f74052fc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b600f54600c54101580611d775750601054600d5410155b8015611d81575087155b8015611dd75750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e2d5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e455750600560159054906101000a900460ff165b15611e9c57611e558d6000612b43565b6001600560186101000a81548160ff021916908315150217905550611e786136e3565b809a50819b5050506000600560186101000a81548160ff0219169083151502179055505b6000600560189054906101000a900460ff16159050601560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f525750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5c57600090505b80156121ad576000888015611f7357506000600954115b15611fc457600060095490506064818f0281611f9257611f916148c9565b5b04975080600a54890281611fa957611fa86148c9565b5b049150818803600d6000828254019250508190555050612001565b898015611fd15750600086115b156120005785600754880281611fea57611fe96148c9565b5b049050808703600d600082825401925050819055505b5b60008111156120445760006002828161201d5761201c6148c9565b5b04905080600e60008282540192505081905550808203600c60008282540192505081905550505b60008711156121ab576120588f3089612688565b600560159054906101000a900460ff166121a55761207461394f565b8461207e306107c8565b106121a45760008561208f306107c8565b612099919061465f565b905060006120ba73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b1115612103576120dd73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b860395506120fe73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b810190505b6121223073ab5801a7d398351b8be11c439e05c5b3259aec9b88612688565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff167fbd930dfdee75cecc873288bcf7176fea15ad28535d3285813018822193a2baa060405160405180910390a26121833082612629565b6001600560156101000a81548160ff02191690831515021790555060019450505b5b868d039c505b505b6121b88e8e8e612688565b88801561220f5750601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561221d57506012548c10155b156122305761222b8d613969565b6122ac565b601660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122875750875b8061229a575088158015612299575087155b5b156122ab576122aa8e6001612b43565b5b5b3073ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16036122f0578b600e600082825401925050819055505b89806122f957508a5b156123de5760006123297f000000000000000000000000052425e0e4606ce22ad1c611853f0c4315056e326107c8565b905060006103e88261233b91906148f8565b90508b1561239657806010819055506127108261235891906148f8565b6012819055507f14ac008fba1637f469366af4d14cf89db3a663c422612977c3f50bc4f3b491a18160405161238d91906142c1565b60405180910390a15b8c156123db5780600f819055507f2f7c7becc8a060dce66180a39d01d0ffebf04de28aba59ecea90ad84692bf234816040516123d291906142c1565b60405180910390a15b50505b82156123fb576123ef6002806124b5565b6123fa6002806113f8565b5b50505050505050505050505b505050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516124a99190614297565b60405180910390a25050565b600a81836124c3919061462b565b11806124cf5750600181105b15612506576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082612520919061462b565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff2828260405161255792919061450a565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126368261dead83612688565b8173ffffffffffffffffffffffffffffffffffffffff167f72ee4eacc5e161ffbdcaeba5dd5e8d6d27ae46f9dddf2997a4e91935a6518b7b8260405161267c91906142c1565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614cfa565b60405180910390fd5b612771838383613c98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614d8c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a919061462b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128ee91906142c1565b60405180910390a3612901848484613c9d565b50505050565b60606000600283600261291a9190614bb4565b612924919061462b565b67ffffffffffffffff81111561293d5761293c614929565b5b6040519080825280601f01601f19166020018201604052801561296f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129a7576129a6614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a0b57612a0a614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a4b9190614bb4565b612a55919061462b565b90505b6001811115612af5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a9757612a96614989565b5b1a60f81b828281518110612aae57612aad614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612aee90614dac565b9050612a58565b5060008414612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3090614e21565b60405180910390fd5b8091505092915050565b8015612b855760008060024281612b5d57612b5c6148c9565b5b061490508015612b8357612b7c3360115461117990919063ffffffff16565b6011819055505b505b601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612df95760006013805480602002602001604051908101604052809291908181526020018280548015612c5157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c07575b5050505050905060008160018351612c69919061465f565b81518110612c7a57612c79614989565b5b602002602001015190506000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508160138281548110612cdd57612cdc614989565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506013805480612d7b57612d7a614e41565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b600560149054906101000a900460ff16158015612e5f5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612eb55750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b5576000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544303905062061a808110613016576014839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa166ab0d399fb2afd24c2174e0ec2e8eb37a2687ac4e9546097ae6d2892edba8438360405161300d92919061450a565b60405180910390a25b6000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5050565b60004711156136e1576000601480548060200260200160405190810160405280929190818152602001828054801561314657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130fc575b50505050509050600060138054806020026020016040519081016040528092919081815260200182805480156131d157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613187575b5050505050905060008060008451905060008451905060006005905060008284019050600060199050600560179054906101000a900460ff1661321357606490505b6000606482476132239190614bb4565b61322d91906148f8565b905083831015613381576000831461324757829350613380565b60019650600560179054906101000a900460ff1661337f5773ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff1681604051613297906147e8565b60006040518083038185875af1925050503d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5050809850503373ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f60028361332491906148f8565b60405161333191906142c1565b60405180910390a27fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d3360028361336891906148f8565b604051613376929190614e70565b60405180910390a15b5b5b8661366357600080858361339591906148f8565b905060008714613495576133b43360115461117990919063ffffffff16565b6011819055506133cf6011548c613ca290919063ffffffff16565b91508173ffffffffffffffffffffffffffffffffffffffff16816040516133f5906147e8565b60006040518083038185875af1925050503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b5050809a50508173ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f8260405161348391906142c1565b60405180910390a28580600190039650505b60008814613660576000600190505b86811161365e576134c03360115461117990919063ffffffff16565b6011819055506134db6011548e613ca290919063ffffffff16565b9250601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613659576001601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086811480156135a25750600560179054906101000a900460ff16155b156135ab574791505b8273ffffffffffffffffffffffffffffffffffffffff16826040516135cf906147e8565b60006040518083038185875af1925050503d806000811461360c576040519150601f19603f3d011682016040523d82523d6000602084013e613611565b606091505b5050809b50507fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d8383604051613648929190614e70565b60405180910390a180806001019150505b6134a4565b505b50505b61368c30606484613673306107c8565b61367d9190614bb4565b61368791906148f8565b612629565b613694613cea565b600560179054906101000a900460ff16156136cd576136b2306107c8565b600e819055506000600c819055506000600d819055506136d6565b6136d561394f565b5b505050505050505050505b565b600080600080600c5490506000600d5490506000600f54905060006010549050600061370e306107c8565b14806137245750818410801561372357508083105b5b1561373a5760008096509650505050505061394b565b81841061375e578184038501945061375182613d5e565b6000600c81905550600196505b80831061393157808303850194506137813360115461117990919063ffffffff16565b6011819055506000613824601154601380548060200260200160405190810160405280929190818152602001828054801561381157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116137c7575b5050505050613ca290919063ffffffff16565b9050600082905061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138c457600061386b836107c8565b905060007f000000000000000000000000000000000000000000108b2a2c28029094000000905080838361389f919061462b565b11156138b2578181039250828503890198505b6138bd308585612688565b50506138ca565b80870196505b6138d2613cea565b8173ffffffffffffffffffffffffffffffffffffffff167ff39ca55b233425232beaa10cf8eab4bb36b0cfc1681dab52a121786f06f47d12824260405161391a92919061450a565b60405180910390a26000600d819055506001975050505b6000851115613945576139443086612629565b5b50505050505b9091565b6000600c819055506000600d819055506000600e81905550565b601e54601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540315613c9557600060138054905090506013829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f199b6f101a1a99898ef5c07ebd4bbcd9b068c09176b624ec06f0b1d0a3acf20f60405160405180910390a2600560149054906101000a900460ff16158015613b535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015613ba95750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613c93576001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403613c925743601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b505b50565b505050565b505050565b6000808351905060008103613cbc5761dead915050613ce4565b83613cc78483613ff1565b81518110613cd857613cd7614989565b5b60200260200101519150505b92915050565b600067ffffffffffffffff811115613d0557613d04614929565b5b604051908082528060200260200182016040528015613d335781602001602082028036833780820191505090505b5060139080519060200190613d4992919061400a565b50601e60008154809291906001019190505550565b6000600267ffffffffffffffff811115613d7b57613d7a614929565b5b604051908082528060200260200182016040528015613da95781602001602082028036833780820191505090505b5090503081600081518110613dc157613dc0614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614eae565b81600181518110613e9e57613e9d614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050613f08307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d856114ae565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613f6a959493929190614fde565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506000479050600082821115613fb15782820390505b7fe845924c07c89c17ac04375b80b3ffdf7507a0d469f31b68a9a63b3abbb05e948582604051613fe292919061450a565b60405180910390a15050505050565b6000818360001c6140029190614958565b905092915050565b828054828255906000526020600020908101928215614083579160200282015b828111156140825782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061402a565b5b5090506140909190614094565b5090565b5b808211156140ad576000816000905550600101614095565b5090565b600080fd5b6000819050919050565b6140c9816140b6565b81146140d457600080fd5b50565b6000813590506140e6816140c0565b92915050565b60008060408385031215614103576141026140b1565b5b6000614111858286016140d7565b9250506020614122858286016140d7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561416657808201518184015260208101905061414b565b60008484015250505050565b6000601f19601f8301169050919050565b600061418e8261412c565b6141988185614137565b93506141a8818560208601614148565b6141b181614172565b840191505092915050565b600060208201905081810360008301526141d68184614183565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614209826141de565b9050919050565b614219816141fe565b811461422457600080fd5b50565b60008135905061423681614210565b92915050565b60008060408385031215614253576142526140b1565b5b600061426185828601614227565b9250506020614272858286016140d7565b9150509250929050565b60008115159050919050565b6142918161427c565b82525050565b60006020820190506142ac6000830184614288565b92915050565b6142bb816140b6565b82525050565b60006020820190506142d660008301846142b2565b92915050565b6000806000606084860312156142f5576142f46140b1565b5b600061430386828701614227565b935050602061431486828701614227565b9250506040614325868287016140d7565b9150509250925092565b600060ff82169050919050565b6143458161432f565b82525050565b6000602082019050614360600083018461433c565b92915050565b61436f8161427c565b811461437a57600080fd5b50565b60008135905061438c81614366565b92915050565b600080604083850312156143a9576143a86140b1565b5b60006143b785828601614227565b92505060206143c88582860161437d565b9150509250929050565b6000602082840312156143e8576143e76140b1565b5b60006143f684828501614227565b91505092915050565b600060808201905061441460008301876142b2565b6144216020830186614288565b61442e6040830185614288565b61443b6060830184614288565b95945050505050565b60006101408201905061445a600083018d6142b2565b614467602083018c6142b2565b614474604083018b6142b2565b614481606083018a6142b2565b61448e60808301896142b2565b61449b60a08301886142b2565b6144a860c08301876142b2565b6144b560e08301866142b2565b6144c36101008301856142b2565b6144d16101208301846142b2565b9b9a5050505050505050505050565b6144e9816141fe565b82525050565b600060208201905061450460008301846144e0565b92915050565b600060408201905061451f60008301856142b2565b61452c60208301846142b2565b9392505050565b6000806040838503121561454a576145496140b1565b5b600061455885828601614227565b925050602061456985828601614227565b9150509250929050565b60006040820190506145886000830185614288565b6145956020830184614288565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145e357607f821691505b6020821081036145f6576145f561459c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614636826140b6565b9150614641836140b6565b9250828201905080821115614659576146586145fc565b5b92915050565b600061466a826140b6565b9150614675836140b6565b925082820390508181111561468d5761468c6145fc565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006146ef602583614137565b91506146fa82614693565b604082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614781602683614137565b915061478c82614725565b604082019050919050565b600060208201905081810360008301526147b081614774565b9050919050565b600081905092915050565b50565b60006147d26000836147b7565b91506147dd826147c2565b600082019050919050565b60006147f3826147c5565b9150819050919050565b600081905092915050565b60006148138261412c565b61481d81856147fd565b935061482d818560208601614148565b80840191505092915050565b60006148458286614808565b91506148518285614808565b915061485d8284614808565b9150819050949350505050565b60006148768284614808565b915081905092915050565b600061488c826140b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148be576148bd6145fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614903826140b6565b915061490e836140b6565b92508261491e5761491d6148c9565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614963826140b6565b915061496e836140b6565b92508261497e5761497d6148c9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ee602083614137565b91506149f9826149b8565b602082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483614137565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602283614137565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614b7e601d83614137565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000614bbf826140b6565b9150614bca836140b6565b9250828202614bd8816140b6565b91508282048414831517614bef57614bee6145fc565b5b5092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c52602583614137565b9150614c5d82614bf6565b604082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce4602383614137565b9150614cef82614c88565b604082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d76602683614137565b9150614d8182614d1a565b604082019050919050565b60006020820190508181036000830152614da581614d69565b9050919050565b6000614db7826140b6565b915060008203614dca57614dc96145fc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614e0b602083614137565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000604082019050614e8560008301856144e0565b614e9260208301846142b2565b9392505050565b600081519050614ea881614210565b92915050565b600060208284031215614ec457614ec36140b1565b5b6000614ed284828501614e99565b91505092915050565b6000819050919050565b6000819050919050565b6000614f0a614f05614f0084614edb565b614ee5565b6140b6565b9050919050565b614f1a81614eef565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f55816141fe565b82525050565b6000614f678383614f4c565b60208301905092915050565b6000602082019050919050565b6000614f8b82614f20565b614f958185614f2b565b9350614fa083614f3c565b8060005b83811015614fd1578151614fb88882614f5b565b9750614fc383614f73565b925050600181019050614fa4565b5085935050505092915050565b600060a082019050614ff360008301886142b2565b6150006020830187614f11565b81810360408301526150128186614f80565b905061502160608301856144e0565b61502e60808301846142b2565b969550505050505056fea2646970667358221220d2705d9525aa1c1842aee8b28d086d1d2654fb3ab3e98e6a1b5651865b22a7c364736f6c63430008120033
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.